// shell.jsx — Header, Footer, Page wrapper function Header({ route }) { const [open, setOpen] = useState(false); const [scrolled, setScrolled] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 12); onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); const items = [ { to: "home", label: "Home" }, { to: "services", label: "Services" }, { to: "case-studies", label: "Case Studies" }, { to: "portfolio", label: "Portfolio" }, { to: "testimonials", label: "Feedback" }, { to: "about", label: "About" }, { to: "blog", label: "Blog" }, { to: "contact", label: "Contact" }]; return (
Book a demo
{open &&
{items.map((it) => setOpen(false)}> {it.label} )} setOpen(false)}>Book a demo →
}
); } function Footer() { return ( ); } // Page transition shell function PageFrame({ children, routeKey }) { const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(false); const a = requestAnimationFrame(() => requestAnimationFrame(() => setMounted(true))); return () => cancelAnimationFrame(a); }, [routeKey]); return (
{children}
); } Object.assign(window, { Header, Footer, PageFrame });