// 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 ( INTERIOR L△B ); } // ========================================================================= // 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(); }}>
{project.name} setLoaded(true)} className={loaded ? 'is-loaded' : ''} /> {project.sector}
{project.name}
{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 ( ); } Object.assign(window, { ILLogo, Eyebrow, Nav, Footer, Arrow, Plate, ProofMarquee });