// Shared components — Nav, Footer, Logo, primitives. const { useState, useEffect, useRef, useMemo } = React; function Logo({ onClick, light }) { return (
Greenline
INTERIORS · EST. 1976
); } function Nav({ route, setRoute, lang, setLang }) { const links = [ { id: "projects", label: "Projects" }, { id: "sectors", label: "Sectors" }, { id: "manufacturing", label: "Manufacturing" }, { id: "capabilities", label: "Capabilities" }, { id: "about", label: "About" }, { id: "contact", label: "Contact" }, ]; return ( ); } function Eyebrow({ children, n }) { return (
{n && {n}} {children}
); } function SectionHead({ eyebrow, eyebrowN, title, lede, action, dark }) { return (
{eyebrow}

{title}

{lede &&

{lede}

} {action}
); } function Marquee({ items }) { const doubled = [...items, ...items]; return (
{doubled.map((x, i) => ( {x} ))}
); } function ProjectCard({ p, onOpen, compact }) { return (
onOpen(p.id)}>
{p.name} {p.nda && (
NDA · Anonymised
)}
{p.name}
{p.location} · {p.year}
{p.sector}
); } function StatBlock({ v, l }) { return (
{v}
{l}
); } function Pill({ active, children, onClick }) { return ( ); } function Footer({ setRoute }) { return ( ); } function Lightbox({ src, onClose }) { useEffect(() => { const onKey = (e) => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onClose]); if (!src) return null; return (
e.stopPropagation()} />
); } Object.assign(window, { Logo, Nav, Eyebrow, SectionHead, Marquee, ProjectCard, StatBlock, Pill, Footer, Lightbox });