// Shared components: Logo, Nav, Footer, WhatsAppFAB, Lightbox, AccentTicker // Hook destructure happens here ONCE — every other babel file relies on // these globals (declaring them in every file collides at top level). var { useState, useEffect, useRef, useCallback, useMemo } = React; function HortonLogo({ dark = false }) { // The brief says "Vectorise to SVG" — this is the prototype's interim wordmark. // Pairs the serif name with a tracked tagline. return ( Horton. Interiors ); } function ArrowRight({ size = 14 }) { return ( ); } function ArrowDown({ size = 12 }) { return ( ); } function Nav({ route, dark = false }) { const links = [ { id: "projects", label: "Projects", route: "/projects" }, { id: "sectors", label: "Sectors", route: "/projects" }, // sectors flow to filtered grid { id: "services", label: "Services", route: "/services" }, { id: "how", label: "How we work", route: "/how-we-work" }, { id: "about", label: "About", route: "/about" }, { id: "resources", label: "Journal", route: "/journal" } ]; return ( ); } function WhatsAppFAB() { return ( ); } // Footer function Footer() { return ( ); } // Lightbox function Lightbox({ images = [], index, onClose, onPrev, onNext, caption }) { useEffect(() => { if (index === null || index === undefined) return; const onKey = e => { if (e.key === "Escape") onClose(); if (e.key === "ArrowLeft") onPrev(); if (e.key === "ArrowRight") onNext(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [index, onClose, onPrev, onNext]); const open = index !== null && index !== undefined; return (