// Contact — Start a project. Sector-qualified enquiry with file-upload affordance. function Contact({ navigate, prefilledProject }) { const data = window.DS_DATA; const [enquiryType, setEnquiryType] = useState("new-project"); const [sector, setSector] = useState(prefilledProject ? data.projects.find((p) => p.id === prefilledProject)?.sector || "" : ""); const [budget, setBudget] = useState(""); const [files, setFiles] = useState([]); const [submitted, setSubmitted] = useState(false); const [form, setForm] = useState({ name: "", email: "", phone: "", company: "", location: "", timeline: "", message: "", }); const [errors, setErrors] = useState({}); const enquiryTypes = [ { id: "new-project", label: "New project" }, { id: "vendor", label: "Vendor" }, { id: "careers", label: "Careers" }, { id: "media", label: "Press / media" }, { id: "general", label: "General" }, ]; const budgets = [ "Under $250k", "$250k — $1M", "$1M — $5M", "$5M — $20M", "$20M+", "Prefer not to say", ]; const projectTypes = { hospitality: ["Restaurant", "Café", "Hotel public realm", "Bar / lounge"], commercial: ["Office HQ", "Retail / showroom", "Co-working"], residential: ["Villa (ground-up)", "Villa (fit-out)", "Penthouse", "Apartment"], healthcare: ["Clinic", "Specialist medical"], wellness: ["Spa", "Wellness centre"], tower: ["Mixed-use", "Residential tower", "Commercial tower"], }; const onFileDrop = (e) => { e.preventDefault(); const list = Array.from(e.dataTransfer.files); setFiles((f) => [...f, ...list]); }; const onFileChange = (e) => { const list = Array.from(e.target.files); setFiles((f) => [...f, ...list]); }; const submit = (e) => { e.preventDefault(); const errs = {}; if (!form.name) errs.name = "required"; if (!form.email) errs.email = "required"; if (!/.+@.+\..+/.test(form.email) && form.email) errs.email = "format"; if (enquiryType === "new-project" && !sector) errs.sector = "required"; if (enquiryType === "new-project" && !form.message) errs.message = "required"; setErrors(errs); if (Object.keys(errs).length === 0) setSubmitted(true); }; if (submitted) { return (
Submitted

Thanks, {form.name.split(" ")[0] || "there"}.

A sector lead will be in touch within two working days. If your brief is urgent, call us on {data.brand.phone}.


t.id === enquiryType)?.label || ""} /> s.id === sector)?.label || "—"} />
); } return (
Start a project

Send us a brief.

The more detail you share — scope, programme, drawings — the faster a sector lead can come back with a real build approach. We reply within two working days.

{/* Form */}
01 / Enquiry type
{enquiryTypes.map((t) => ( ))}
{enquiryType === "new-project" ? ( <>
02 / Sector{errors.sector ? required : null}
{data.sectors.map((s) => ( ))}
{sector ? (
Project type
{(projectTypes[sector] || []).map((t) => ( {t} ))}
) : null}
03 / Indicative budget
{budgets.map((b) => ( ))}
) : null}
{enquiryType === "new-project" ? "04 / " : "02 / "}Your details
setForm({ ...form, name: v })} error={errors.name} /> setForm({ ...form, email: v })} error={errors.email} /> setForm({ ...form, phone: v })} placeholder="+971" /> setForm({ ...form, company: v })} /> {enquiryType === "new-project" ? ( <> setForm({ ...form, location: v })} placeholder="Dubai, UAE" /> setForm({ ...form, timeline: v })} placeholder="e.g. Mob July, handover Dec" /> ) : null}
{enquiryType === "new-project" ? (
05 / Drawings & supporting files (optional) {files.length > 0 ? (
    {files.map((f, i) => (
  • {f.name}
  • ))}
) : null}
) : null}
We respond within two working days · Mon–Fri 08:30–18:00 GST
{/* Aside */}
); } function Field({ label, value, onChange, type = "text", placeholder = "", error }) { return (
onChange(e.target.value)} />
); } function ConfirmCell({ label, value }) { return (
{label}
{value}
); } Object.assign(window, { Contact });