// 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.nda && (
NDA · Anonymised
)}
{p.name}
{p.location} · {p.year}
{p.sector}
);
}
function StatBlock({ v, l }) {
return (
);
}
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 });