/** * Site chrome — header, footer, hero, shared atoms. * Exposes components to window for use in pages.jsx + app.jsx */ const ASSETS = './assets/'; /* ───────── Header ───────── */ function SiteHeader({ route, onNav }) { const [menuOpen, setMenuOpen] = React.useState(false); const items = [ { id: 'home', label: 'Home' }, { id: 'about', label: 'What We Do' }, { id: 'why', label: 'Why' }, { id: 'clients', label: 'Clients' }, { id: 'contact', label: 'Contact' }, ]; const go = (id) => { setMenuOpen(false); onNav(id); }; // Close menu on route change React.useEffect(() => { setMenuOpen(false); }, [route]); return (
go('home')}>
Black Frame Media
Bringing Brands Into Focus
); } /* ───────── Footer ───────── */ function SiteFooter({ onNav }) { return ( ); } /* ───────── Page Banner (used on inner pages) ───────── */ function PageBanner({ eyebrow, title, titleAlt, subtitle }) { return (
{eyebrow}

{title} {titleAlt && {titleAlt}}

{subtitle &&

{subtitle}

}
); } /* ───────── Hero (home only) ───────── */ function HeroBlock({ onNav }) { return (
Bringing Brands Into Focus

We're Live.

We create content and manage social media that helps businesses grow their presence, connect with their audience and achieve results.

Now Booking — Q3
Black Frame Media
Bringing Brands Into Focus
); } /* ───────── CTA Strip ───────── */ function CTAStrip({ onNav, headline = ['Let\'s go', 'live.'], punch = "We're ready when you are.", cta = 'Start Your Project' }) { return (

{headline[0]} {headline[1]}

{punch}
); } /* ───────── Toast ───────── */ function Toast({ message, visible }) { return
{message}
; } /* expose */ Object.assign(window, { SiteHeader, SiteFooter, PageBanner, HeroBlock, CTAStrip, Toast, BFM_ASSETS: ASSETS, });