(function () { 'use strict'; const panel = document.getElementById('mobileOffcanvas'); const overlay = document.getElementById('mobOverlay'); const btnOpen = document.getElementById('mobMenuOpen'); const btnClose = document.getElementById('mobMenuClose'); if (!panel || !overlay || !btnOpen) return; // not on this page /* ── Open ── */ function openMenu() { overlay.classList.add('is-visible'); // tiny rAF delay so CSS transition triggers after display:block requestAnimationFrame(function () { requestAnimationFrame(function () { overlay.classList.add('is-open'); panel.classList.add('is-open'); btnOpen.classList.add('is-open'); btnOpen.setAttribute('aria-expanded', 'true'); document.body.classList.add('mob-no-scroll'); }); }); } /* ── Close ── */ function closeMenu() { overlay.classList.remove('is-open'); panel.classList.remove('is-open'); btnOpen.classList.remove('is-open'); btnOpen.setAttribute('aria-expanded', 'false'); document.body.classList.remove('mob-no-scroll'); // wait for CSS transition before hiding overlay overlay.addEventListener('transitionend', function handler() { overlay.classList.remove('is-visible'); overlay.removeEventListener('transitionend', handler); }); } btnOpen.addEventListener('click', openMenu); if (btnClose) btnClose.addEventListener('click', closeMenu); overlay.addEventListener('click', closeMenu); /* ── Escape key ── */ document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && panel.classList.contains('is-open')) { closeMenu(); } }); /* ── Sub-menu accordion ── */ var subParents = panel.querySelectorAll('.mob-oc__nav .menu-item-has-children > a'); subParents.forEach(function (link) { link.addEventListener('click', function (e) { e.preventDefault(); var parent = this.parentElement; var isOpen = parent.classList.contains('sub-open'); // close all open sub-menus first panel.querySelectorAll('.menu-item-has-children.sub-open').forEach(function (el) { el.classList.remove('sub-open'); }); if (!isOpen) { parent.classList.add('sub-open'); } }); }); })();