// Sections: Nav, Hero, Manifesto, Services, Method, Audience, Contact, Footer const Nav = ({ t, lang, setLang, fonts }) => { const [open, setOpen] = React.useState(false); const ignoreScroll = React.useRef(false); // Lock body scroll when menu open React.useEffect(() => { const prev = document.body.style.overflow; document.body.style.overflow = open ? "hidden" : prev || ""; return () => { document.body.style.overflow = prev; }; }, [open]); // Close on ESC React.useEffect(() => { const onKey = (e) => { if (e.key === "Escape") setOpen(false); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, []); const go = (id) => { setOpen(false); const el = document.getElementById(id); if (el) { ignoreScroll.current = true; const navEl = document.querySelector(".fa-nav"); const offset = (navEl ? navEl.getBoundingClientRect().height : 60) + 8; window.scrollTo({ top: el.offsetTop - offset, behavior: "smooth" }); setTimeout(() => { ignoreScroll.current = false; }, 1200); } }; return ( ); }; const HeroVideo = () => { const ref = React.useRef(null); const [src, setSrc] = React.useState(null); React.useEffect(() => { let url = null; let cancelled = false; fetch("assets/hero-loop.mp4") .then((r) => r.blob()) .then((blob) => { if (cancelled) return; url = URL.createObjectURL(blob); setSrc(url); }) .catch(() => {}); return () => { cancelled = true; if (url) URL.revokeObjectURL(url); }; }, []); return (