// Enquiry modal — multi-step, sector-qualified per design brief
const { useState: useStateE, useEffect: useEffectE, useRef: useRefE } = React;
function EnquiryModal({ open, onClose, t, initialSector = null }) {
const [step, setStep] = useStateE(0);
const [data, setData] = useStateE({
sector: initialSector,
name: "",
email: "",
phone: "",
date: "",
guests: "",
venue: "",
message: "",
});
const [submitted, setSubmitted] = useStateE(false);
useEffectE(() => {
if (open) {
setStep(initialSector ? 1 : 0);
setData((d) => ({ ...d, sector: initialSector || d.sector }));
setSubmitted(false);
document.body.style.overflow = "hidden";
} else {
document.body.style.overflow = "";
}
return () => { document.body.style.overflow = ""; };
}, [open, initialSector]);
useEffectE(() => {
const onKey = (e) => { if (e.key === "Escape" && open) onClose(); };
window.addEventListener("keydown", onKey);
return () => window.removeEventListener("keydown", onKey);
}, [open, onClose]);
if (!open) return null;
const set = (k, v) => setData((d) => ({ ...d, [k]: v }));
const canStep1 = !!data.sector;
const canStep2 = data.name.trim() && /.+@.+\..+/.test(data.email);
const submit = () => setSubmitted(true);
return (
e.stopPropagation()} style={{
width: "min(560px, 100%)", height: "100%", background: "var(--paper)",
overflowY: "auto", display: "flex", flexDirection: "column",
animation: "slideIn 0.4s cubic-bezier(0.22, 1, 0.36, 1)",
}}>
{submitted ? "Received" : step === 0 ? "Step 1 of 3 · Sector" : step === 1 ? "Step 2 of 3 · Details" : "Step 3 of 3 · Project"}
{submitted ? (
) : (
{step === 0 &&
}
{step === 1 &&
}
{step === 2 &&
}
{step < 2 ? (
) : (
)}
)}
);
}
function StepDots({ step }) {
return (
{[0, 1, 2].map((i) => (
))}
);
}
function SectorStep({ data, set }) {
const sectors = [
{ id: "wedding", title: "Wedding", desc: "Ceremony, reception and the days around them.", img: "media/wedding-1.webp" },
{ id: "corporate", title: "Corporate", desc: "Galas, launches, exhibitions and brand activations.", img: "media/corporate-tile.webp" },
{ id: "social", title: "Social", desc: "Milestones, anniversaries, private celebrations.", img: "media/social-tile.webp" },
];
return (
What are we planning?
So we can route your enquiry to the right designer.
{sectors.map((s) => (
))}
);
}
function DetailsStep({ data, set }) {
return (
How can we reach you?
Personal and discreet — we do not share details with third parties.
);
}
function ProjectStep({ data, set }) {
return (
Tell us about the event.
Approximate is fine. We'll refine in the consultation.
);
}
function SuccessPane({ data, onClose }) {
return (
Thank you, {data.name.split(" ")[0] || "friend"}.
Your {data.sector} enquiry is with our studio. We respond personally within two working days — usually the same day.
In the meantime, you may enjoy our latest case studies, or write directly to info@carousel.ae.
);
}
Object.assign(window, { EnquiryModal });