/* ============================================================ Archway — shared site chrome (header, footer, nav, hooks) Loaded on every page; components attach to window.Archway. ============================================================ */ (function () { const { useState, useEffect, useRef } = React; const LOGO = "images/logo-letterhead.png"; const BRAIN = "images/brain-mark.png"; // ── Viewport detector ───────────────────────────────────── function useIsMobile(breakpoint = 900) { const [isMobile, setIsMobile] = useState( typeof window !== "undefined" ? window.innerWidth <= breakpoint : false ); useEffect(() => { const mq = window.matchMedia(`(max-width:${breakpoint}px)`); const onChange = (e) => setIsMobile(e.matches); mq.addEventListener ? mq.addEventListener("change", onChange) : mq.addListener(onChange); return () => { mq.removeEventListener ? mq.removeEventListener("change", onChange) : mq.removeListener(onChange); }; }, [breakpoint]); return isMobile; } // ── Desktop header ──────────────────────────────────────── function ServicesDropdown({ active }) { const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { function handle(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } document.addEventListener("mousedown", handle); return () => document.removeEventListener("mousedown", handle); }, []); return (
); } function SiteHeader({ active }) { const linkStyle = (key) => ({ color: active === key ? "var(--accent)" : "var(--fg-1)" }); return (