export {}; const onReady = (fn: () => void): void => { if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", fn, { once: true }); return; } fn(); }; const isMobileViewport = (): boolean => window.matchMedia("(max-width: 1023px)").matches; const initSidebarTransitions = (): void => { requestAnimationFrame(() => { document.documentElement.classList.add("sidebar-ready"); }); }; const initMobileMenu = (): void => { const menu = document.getElementById("mobile-menu"); const backdrop = document.getElementById("mobile-menu-backdrop"); const toggle = document.querySelector("[data-mobile-menu-toggle]"); if (!(menu instanceof HTMLElement)) return; if (!(backdrop instanceof HTMLElement)) return; if (!(toggle instanceof HTMLElement)) return; const body = document.body; let lastFocused: HTMLElement | null = null; const setOpen = (nextOpen: boolean): void => { menu.dataset.mobileOpen = nextOpen ? "true" : "false"; backdrop.dataset.mobileOpen = nextOpen ? "true" : "false"; backdrop.classList.toggle("hidden", !nextOpen); toggle.setAttribute("aria-expanded", nextOpen ? "true" : "false"); body.classList.toggle("overflow-hidden", nextOpen); }; const openMenu = (): void => { if (!isMobileViewport()) return; if (menu.dataset.mobileOpen === "true") return; lastFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null; setOpen(true); const focusTarget = menu.querySelector( 'a, button, input, [tabindex]:not([tabindex="-1"])', ); focusTarget?.focus(); }; const closeMenu = (): void => { if (menu.dataset.mobileOpen !== "true") return; setOpen(false); lastFocused?.focus(); }; toggle.addEventListener("click", () => { if (menu.dataset.mobileOpen === "true") { closeMenu(); return; } openMenu(); }); backdrop.addEventListener("click", closeMenu); document.addEventListener("keydown", (event) => { if (event.key !== "Escape") return; if (menu.dataset.mobileOpen !== "true") return; event.preventDefault(); closeMenu(); }); menu.querySelectorAll("a, button").forEach((el) => { el.addEventListener("click", () => { if (!isMobileViewport()) return; closeMenu(); }); }); window.addEventListener("resize", () => { if (!isMobileViewport()) { setOpen(false); } }); }; onReady(() => { initSidebarTransitions(); initMobileMenu(); });