Skip to content

Commit 02a5b6c

Browse files
authored
Merge pull request #87 from cloudadoption/issue-nav-issues
fix mobile nav
2 parents 63bb882 + 2401009 commit 02a5b6c

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

blocks/header/header.css

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,23 +296,41 @@ header nav .nav-sections .default-content-wrapper > ul > li.nav-drop > p > a {
296296

297297
/* chevron: mobile only (p::after); desktop uses li::after below */
298298
@media (width <= 899px) {
299-
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop > p::after {
300-
content: '';
299+
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop > p {
300+
padding-right: calc(var(--nav-item-padding) + 26px);
301+
}
302+
303+
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop > p > .nav-submenu-toggle {
301304
position: absolute;
302305
right: var(--nav-item-padding);
303306
top: 50%;
304-
transform: translateY(-50%) rotate(135deg);
307+
width: 24px;
308+
height: 24px;
309+
transform: translateY(-50%);
310+
border: 0;
311+
border-radius: 999px;
312+
background: transparent;
313+
color: inherit;
314+
padding: 0;
315+
cursor: pointer;
316+
}
317+
318+
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop > p > .nav-submenu-toggle::before {
319+
content: '';
320+
display: block;
305321
width: 6px;
306322
height: 6px;
323+
margin: auto;
307324
border: 2px solid currentcolor;
308325
border-radius: 0 1px 0 0;
309326
border-width: 2px 2px 0 0;
310327
opacity: 0.6;
328+
transform: rotate(135deg);
311329
transition: transform 0.2s ease;
312330
}
313331

314-
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop[aria-expanded='true'] > p::after {
315-
transform: translateY(-50%) rotate(-45deg);
332+
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop[aria-expanded='true'] > p > .nav-submenu-toggle::before {
333+
transform: rotate(-45deg);
316334
}
317335
}
318336

@@ -805,6 +823,10 @@ header nav .nav-tools .nav-language-menu a:focus-visible {
805823

806824
/* desktop: 900px */
807825
@media (width >= 900px) {
826+
header nav .nav-sections .default-content-wrapper > ul > li.nav-drop > p > .nav-submenu-toggle {
827+
display: none;
828+
}
829+
808830
header nav {
809831
display: flex;
810832
justify-content: space-between;

blocks/header/header.js

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,48 @@ function decorateMega(li) {
9999
}
100100

101101
function setupDropdown(li) {
102+
const submenu = li.querySelector(':scope > ul');
103+
const heading = li.querySelector(':scope > p');
104+
const parentLink = li.querySelector(':scope > p > a');
105+
let toggleBtn = null;
106+
107+
const syncToggle = () => {
108+
if (!toggleBtn) return;
109+
const expanded = li.getAttribute('aria-expanded') === 'true';
110+
toggleBtn.setAttribute('aria-expanded', String(expanded));
111+
toggleBtn.setAttribute('aria-label', expanded ? 'Collapse submenu' : 'Expand submenu');
112+
};
113+
114+
if (submenu && heading) {
115+
toggleBtn = heading.querySelector('.nav-submenu-toggle');
116+
if (!toggleBtn) {
117+
toggleBtn = document.createElement('button');
118+
toggleBtn.type = 'button';
119+
toggleBtn.className = 'nav-submenu-toggle';
120+
heading.append(toggleBtn);
121+
}
122+
syncToggle();
123+
toggleBtn.addEventListener('click', (e) => {
124+
e.preventDefault();
125+
e.stopPropagation();
126+
if (DESKTOP.matches) return;
127+
const wasOpen = li.getAttribute('aria-expanded') === 'true';
128+
collapseAll(li.closest('nav'));
129+
li.setAttribute('aria-expanded', wasOpen ? 'false' : 'true');
130+
syncToggle();
131+
});
132+
}
133+
102134
const open = () => {
103135
li.megaSync?.();
104136
collapseAll(li.closest('nav'));
105137
li.setAttribute('aria-expanded', 'true');
138+
syncToggle();
139+
};
140+
const close = () => {
141+
li.setAttribute('aria-expanded', 'false');
142+
syncToggle();
106143
};
107-
const close = () => li.setAttribute('aria-expanded', 'false');
108144

109145
li.addEventListener('mouseenter', () => { if (DESKTOP.matches) open(); });
110146
li.addEventListener('mouseleave', (e) => {
@@ -117,16 +153,22 @@ function setupDropdown(li) {
117153

118154
li.addEventListener('click', (e) => {
119155
if (!DESKTOP.matches) {
120-
const submenu = li.querySelector(':scope > ul');
121156
const clickedSubmenuLink = submenu?.contains(e.target) && e.target.closest('a');
157+
const clickedToggle = e.target.closest('.nav-submenu-toggle');
158+
const clickedParentLink = parentLink && (e.target === parentLink || parentLink.contains(e.target));
159+
if (clickedToggle) return;
122160
if (clickedSubmenuLink) {
123161
collapseAll(li.closest('nav'));
124162
close();
163+
} else if (clickedParentLink) {
164+
collapseAll(li.closest('nav'));
165+
close();
125166
} else if (submenu) {
126167
e.preventDefault();
127168
const wasOpen = li.getAttribute('aria-expanded') === 'true';
128169
collapseAll(li.closest('nav'));
129170
li.setAttribute('aria-expanded', wasOpen ? 'false' : 'true');
171+
syncToggle();
130172
}
131173
} else if (li.querySelector('ul')?.contains(e.target) && e.target.closest('a')) {
132174
collapseAll(li.closest('nav'));

0 commit comments

Comments
 (0)