1(() => { 2 const nav = document.querySelector('#footer .footer-explore'); 3 if (!nav) return; 4 5 const toggle = nav.querySelector('.footer-menu-toggle'); 6 const links = nav.querySelector('.footer-explore-links'); 7 const mobile = window.matchMedia('(max-width: 991px)'); 8 const hover = window.matchMedia('(hover: hover)'); 9 10 function setOpen(open) { 11 toggle.setAttribute('aria-expanded', String(open)); 12 nav.dataset.menuOpen = String(open); 13 links.inert = !open; 14 links.setAttribute('aria-hidden', String(!open)); 15 } 16 17 function syncLayout() { 18 toggle.hidden = !mobile.matches; 19 setOpen(!mobile.matches); 20 } 21 22 toggle.addEventListener('click', () => { 23 setOpen(toggle.getAttribute('aria-expanded') !== 'true'); 24 }); 25 toggle.addEventListener('pointerenter', (event) => { 26 if (mobile.matches && hover.matches && event.pointerType === 'mouse') setOpen(true); 27 }); 28 nav.addEventListener('pointerleave', (event) => { 29 if (mobile.matches && hover.matches && event.pointerType === 'mouse' && !nav.contains(document.activeElement)) { 30 setOpen(false); 31 } 32 }); 33 nav.addEventListener('focusout', (event) => { 34 if (mobile.matches && !nav.contains(event.relatedTarget)) setOpen(false); 35 }); 36 nav.addEventListener('keydown', (event) => { 37 if (mobile.matches && event.key === 'Escape') { 38 setOpen(false); 39 toggle.focus(); 40 } 41 }); 42 mobile.addEventListener('change', syncLayout); 43 syncLayout(); 44})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.