// Interior Lab — shared UI primitives (Nav, Footer, Eyebrow, etc.)
const { useState, useEffect, useRef } = React;
// =========================================================================
// Logo — wide-tracked geometric wordmark in a thin square frame, inline SVG.
// =========================================================================
function ILLogo({ size = 44, color = 'currentColor' }) {
return (
);
}
// =========================================================================
// Eyebrow — numbered, tracked uppercase label that echoes the logo voice.
// =========================================================================
function Eyebrow({ n, children, light }) {
return (
{n && {n}}
{children}
);
}
// =========================================================================
// Navigation — sticky, hairline-ruled, with a CTA button on the right.
// =========================================================================
function Nav({ route, go }) {
const [scrolled, setScrolled] = useState(false);
const [open, setOpen] = useState(false);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 12);
onScroll();
window.addEventListener('scroll', onScroll, { passive: true });
return () => window.removeEventListener('scroll', onScroll);
}, []);
const links = [
{ id: 'portfolio', label: 'Portfolio' },
{ id: 'studio', label: 'Studio' },
{ id: 'services', label: 'Disciplines' },
{ id: 'journal', label: 'Journal' },
];
return (
{open && (
setOpen(false)}>
{[...links, { id: 'contact', label: 'Start a project' }].map((l) => (
))}
)}
);
}
// =========================================================================
// Footer.
// =========================================================================
function Footer({ go }) {
return (
);
}
// =========================================================================
// Arrow — used on links/CTAs. Hand-drawn-ish, hairline.
// =========================================================================
function Arrow({ size = 14 }) {
return (
);
}
// =========================================================================
// Plate — a rectangular image plate with caption + sector tag, used in lists.
// =========================================================================
function Plate({ project, onClick, aspect = '4 / 5', large }) {
const [loaded, setLoaded] = useState(false);
return (
{ if (e.key === 'Enter') onClick(); }}>

setLoaded(true)}
className={loaded ? 'is-loaded' : ''}
/>
{project.sector}
{project.location}
·
{project.year}
);
}
// =========================================================================
// Marquee — slow horizontal scroller for the proof strip.
// =========================================================================
function ProofMarquee() {
const items = [
'Milan → Dubai · 2010',
'80+ projects worldwide',
'Slow-work craftsmanship',
'Dubai Design Week 2022',
'Italian materials',
'Architecture & interiors',
'Founder · Lara Del Chiaro',
'Building 5 – A206 · d3',
];
return (
{[...items, ...items].map((t, i) => (
{t}
))}
);
}
Object.assign(window, { ILLogo, Eyebrow, Nav, Footer, Arrow, Plate, ProofMarquee });