// components.jsx — shared UI: Navbar, Footer, Logo, icons, helpers. const ArrowUR = ({ className = "arrow-icon" }) => ( ); const ArrowR = ({ className = "arrow-icon" }) => ( ); const ArrowL = ({ className = "arrow-icon" }) => ( ); // Logo lockup — mark + wordmark const SnoopyLogo = ({ small = false, onDark = false }) => (
SNOOPY PRODUCTIONS
); const NAV_ITEMS = [ { id: "home", label: "Home" }, { id: "work", label: "Work" }, { id: "services", label: "Services" }, { id: "about", label: "About" }, { id: "clients", label: "Clients" }, { id: "contact", label: "Contact" }, ]; function Navbar({ route, navigate, onDark = false, openEnquire }) { const [scrolled, setScrolled] = React.useState(false); React.useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 12); window.addEventListener("scroll", onScroll); onScroll(); return () => window.removeEventListener("scroll", onScroll); }, []); const navClass = `nav ${onDark ? "on-dark" : ""}`; return (
{ e.preventDefault(); navigate("home"); }} href="#home" aria-label="Snoopy Productions — Home">
EN AR
); } function Footer({ navigate, openEnquire }) { return ( ); } // Mobile sticky enquire bar function MobileBar({ openEnquire }) { return (
Call
); } // Placeholder image slot used for missing hero footage function PlaceholderImage({ label = "rights-cleared hero still", aspect = "16/9" }) { return (
[ {label} ]
); } // Enquire modal (category-qualified brief form) function EnquireModal({ open, onClose, defaultService }) { const [service, setService] = React.useState(defaultService || "event-production"); const [step, setStep] = React.useState(1); const [submitted, setSubmitted] = React.useState(false); const [form, setForm] = React.useState({ name: "", company: "", email: "", phone: "", timeline: "1-3-months", budget: "discuss", message: "" }); React.useEffect(() => { if (defaultService) setService(defaultService); }, [defaultService]); React.useEffect(() => { if (!open) { setStep(1); setSubmitted(false); } }, [open]); if (!open) return null; const services = window.SNOOPY_DATA.SERVICES; return (
e.stopPropagation()} style={{ width: "100%", maxWidth: 720, maxHeight: "calc(100vh - 40px)", overflowY: "auto", background: "#fff", borderRadius: 22, boxShadow: "0 30px 80px -20px rgba(0,0,0,0.4)", }}>
Brief us

Tell us what you're building.

{submitted ? (

Brief received.

We'll get back within one business day. (Prototype only — no email was actually sent.)

) : ( <>
= 1 ? "var(--primary)" : "var(--muted)" }}>1. Service
= 2 ? "var(--primary)" : "var(--muted)" }}>2. About you
= 3 ? "var(--primary)" : "var(--muted)" }}>3. Project
{step === 1 && ( <>

What kind of project is this? (Pick the closest — we'll figure out the rest together.)

{services.map((s) => ( ))}
)} {step === 2 && (
setForm({...form,name:e.target.value})} placeholder="Full name"/>
setForm({...form,company:e.target.value})} placeholder="Company / brand"/>
setForm({...form,email:e.target.value})} placeholder="you@brand.com"/>
setForm({...form,phone:e.target.value})} placeholder="+971…"/>
)} {step === 3 && (