1 2 const menuToggle=document.querySelector('#menu-toggle'); 3 const navInner=document.querySelector('#nav-inner'); 4 menuToggle.addEventListener('click',()=>{const open=navInner.classList.toggle('menu-open');menuToggle.classList.toggle('open',open);menuToggle.setAttribute('aria-expanded',String(open));menuToggle.setAttribute('aria-label',open?'Close navigation':'Open navigation')}); 5 const navMenus=[...document.querySelectorAll('.nav-menu')]; 6 document.addEventListener('pointerdown',event=>{if(event.pointerType==='mouse'||event.pointerType==='pen')document.body.dataset.navInput='pointer'},true); 7 document.addEventListener('keydown',event=>{if(['Tab','Enter',' ','ArrowDown','ArrowUp','ArrowLeft','ArrowRight'].includes(event.key))document.body.dataset.navInput='keyboard'},true); 8 navMenus.forEach(menu=>menu.querySelector('summary').addEventListener('pointerup',event=>{if(event.pointerType==='mouse'){const summary=event.currentTarget;requestAnimationFrame(()=>summary.blur())}})); 9 const closeNav=()=>{navMenus.forEach(menu=>menu.open=false);navInner.classList.remove('menu-open');menuToggle.classList.remove('open');menuToggle.setAttribute('aria-expanded','false');menuToggle.setAttribute('aria-label','Open navigation')}; 10 navMenus.forEach(menu=>menu.addEventListener('toggle',()=>{if(menu.open)navMenus.forEach(other=>{if(other!==menu)other.open=false})})); 11 const navHoverTimers=new WeakMap(); 12 const clearNavHover=(menu)=>{const timers=navHoverTimers.get(menu);if(timers){clearTimeout(timers.open);clearTimeout(timers.close)}}; 13 navMenus.forEach(menu=>{ 14 menu.addEventListener('pointerenter',event=>{if(event.pointerType!=='mouse'||window.matchMedia('(max-width: 1040px)').matches)return;clearNavHover(menu);navHoverTimers.set(menu,{open:setTimeout(()=>{menu.open=true},100)})}); 15 menu.addEventListener('pointerleave',event=>{if(event.pointerType!=='mouse'||window.matchMedia('(max-width: 1040px)').matches)return;clearNavHover(menu);navHoverTimers.set(menu,{close:setTimeout(()=>{menu.open=false},250)})}); 16 }); 17 document.addEventListener('pointerdown',event=>{if(!navInner.contains(event.target))closeNav()}); 18 document.addEventListener('keydown',event=>{if(event.key==='Escape'){const opener=navMenus.find(menu=>menu.open)?.querySelector('summary');const inside=navInner.contains(document.activeElement);closeNav();if(inside)(window.matchMedia('(max-width: 1040px)').matches?menuToggle:opener)?.focus()}}); 19 navInner.querySelectorAll('.nav-links a').forEach(link=>link.addEventListener('click',closeNav)); 20 window.matchMedia('(min-width: 1041px)').addEventListener('change',closeNav);
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.