1document.addEventListener('DOMContentLoaded', () => { 2 if (typeof gsap === 'undefined') return; 3 4 const mobileMenu = document.getElementById('iso-mobile-menu'); 5 const openBtn = document.querySelector('.tw-iso-header-menu-btn-mobile'); 6 const closeBtn = document.getElementById('iso-mobile-menu-close'); 7 const submenuToggles = document.querySelectorAll('.js-mobile-submenu-toggle'); 8 const searchTrigger = document.getElementById('iso-mobile-search-trigger'); 9 const searchPanel = document.getElementById('iso-search-panel'); 10 const mainHeader = document.getElementById('iso-main-header'); 11 const headerNav = document.querySelector('.tw-iso-header-nav'); 12 13 function getAlertH() { 14 const alertWrapper = document.getElementById('iso-alert-wrapper'); 15 return (alertWrapper && alertWrapper.offsetHeight > 0) ? alertWrapper.offsetHeight : 0; 16 } 17 18 function getNavH() { 19 return headerNav ? headerNav.offsetHeight : 0; 20 } 21 22 function syncPositions() { 23 if (mobileMenu) { 24 mobileMenu.style.top = ''; 25 mobileMenu.style.height = ''; 26 27 const menuInner = mobileMenu.querySelector('.tw-iso-header-menu-mobile-inner'); 28 if (menuInner) { 29 menuInner.style.paddingTop = ''; 30 } 31 } 32 33 if (searchPanel) { 34 searchPanel.style.top = ''; 35 } 36 } 37 38 syncPositions(); 39 window.addEventListener('resize', syncPositions, { passive: true }); 40 41 function openMenu() { 42 closeSearch(); 43 syncPositions(); 44 if (mainHeader) { 45 mainHeader.classList.add('is-menu-open'); 46 mainHeader.classList.remove('is-search-open'); 47 } 48 gsap.fromTo(mobileMenu, 49 { opacity: 0, y: -20, autoAlpha: 0, display: 'block' }, 50 { opacity: 1, y: 0, autoAlpha: 1, duration: 0.4, ease: 'power2.out' } 51 ); 52 document.body.style.overflow = 'hidden'; 53 } 54 55 function closeMenu() { 56 if (mainHeader) mainHeader.classList.remove('is-menu-open'); 57 gsap.to(mobileMenu, { 58 opacity: 0, 59 y: -20, 60 autoAlpha: 0, 61 duration: 0.3, 62 ease: 'power2.in', 63 onComplete: () => { 64 gsap.set(mobileMenu, { display: 'none', y: 0 }); 65 } 66 }); 67 document.body.style.overflow = ''; 68 } 69 70 function closeSearch() { 71 if (!searchPanel) return; 72 searchPanel.classList.remove('is-open'); 73 searchPanel.setAttribute('aria-hidden', 'true'); 74 if (mainHeader) mainHeader.classList.remove('is-search-open'); 75 } 76 77 if (openBtn) openBtn.addEventListener('click', openMenu); 78 if (closeBtn) closeBtn.addEventListener('click', closeMenu); 79 80 submenuToggles.forEach(btn => { 81 btn.addEventListener('click', () => { 82 const submenu = btn.nextElementSibling; 83 const isOpened = btn.classList.contains('is-opened'); 84 85 if (!isOpened) { 86 btn.classList.add('is-opened'); 87 if (submenu) submenu.classList.add('is-open'); 88 } else { 89 btn.classList.remove('is-opened'); 90 if (submenu) submenu.classList.remove('is-open'); 91 } 92 }); 93 }); 94 95 if (searchTrigger) { 96 searchTrigger.addEventListener('click', () => { 97 closeMenu(); 98 syncPositions(); 99 const searchBtnDesktop = document.getElementById('iso-header-search-btn'); 100 if (searchBtnDesktop) searchBtnDesktop.click(); 101 if (mainHeader) mainHeader.classList.add('is-search-open'); 102 }); 103 } 104 105 const searchCloseElements = ['iso-search-backdrop', 'iso-search-close-desktop', 'iso-search-close']; 106 searchCloseElements.forEach(id => { 107 const el = document.getElementById(id); 108 if (el) { 109 el.addEventListener('click', () => { 110 closeSearch(); 111 document.body.style.overflow = ''; 112 }); 113 } 114 });
115});
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.