/* shell.jsx — header, footer, demo banner, logo, language switcher */ const { useState, useEffect, useRef, useMemo, useCallback } = React; // ─── Logo wordmark ──────────────────────────────────────────────── // Brief calls for a redrawn SVG; placeholder text mark. function Logo({ size = 18, className = "" }) { return ( F 1 RST MOTORS ); } // ─── Language switcher ──────────────────────────────────────────── const LANGS = [ { code: "en", label: "EN", name: "English" }, { code: "ar", label: "ع", name: "العربية" }, { code: "ru", label: "RU", name: "Русский" }, { code: "zh", label: "中", name: "中文" }, ]; function LangSwitcher({ value, onChange }) { const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { if (!open) return; const f = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; document.addEventListener("mousedown", f); return () => document.removeEventListener("mousedown", f); }, [open]); const cur = LANGS.find((l) => l.code === value) || LANGS[0]; return (
{open && (
{LANGS.map((l) => ( ))}
EN + AR fully wired · RU/ZH demo
)}
); } // ─── Header ─────────────────────────────────────────────────────── function Header({ route, navigate, lang, setLang, onEnquire }) { const [scrolled, setScrolled] = useState(false); useEffect(() => { const f = () => setScrolled(window.scrollY > 12); f(); window.addEventListener("scroll", f, { passive: true }); return () => window.removeEventListener("scroll", f); }, []); const t = I18N[lang] || I18N.en; const navItems = [ { id: "inventory", label: t.nav.inventory }, { id: "sell", label: t.nav.sell }, { id: "about", label: t.nav.about }, { id: "contact", label: t.nav.contact }, ]; return (
+971 4 320 1030
); } // ─── Demo data badge ────────────────────────────────────────────── function DemoBadge({ children = "Demo data — feed-driven in production", style = {} }) { return ( {children} ); } // ─── Section header ─────────────────────────────────────────────── function SectionHead({ eyebrow, title, sub, align = "left", style = {} }) { return (
{eyebrow &&
{eyebrow}
}

{title}

{sub &&

{sub}

}
); } // ─── Footer ─────────────────────────────────────────────────────── function Footer({ navigate, onEnquire }) { return ( ); } // ─── In-page sticky bottom CTA (mobile-style) ───────────────────── function StickyBar({ onEnquire }) { return (
Call
); } Object.assign(window, { Logo, Header, Footer, SectionHead, DemoBadge, StickyBar, LANGS });