// Property Detail page (cinematic PDP template) + Valuation flow function PropertyDetail({ ref, setRoute, locale }) { const listing = window.LISTINGS.find(l => l.ref === ref) || window.LISTINGS[0]; const t = window.STRINGS[locale]; return (
{/* HERO split */}
{t.samplePill} · {listing.ref}
{listing.community} · {listing.status === "sale" ? "For sale" : "To rent"}

{listing.title}

A signature residence on the frond — orientated south for sunset across the water. Full beach frontage, private mooring optional. Architect: client-confirmed before publication.

Bedrooms
{listing.beds}
Bathrooms
{listing.baths}
Built-up area
{listing.sizeSqft.toLocaleString()} sqft
Reference
{listing.ref}
Guide price
{listing.price}
Price held by vendor · share on request
{/* Floating back */}
GalleryFloor plansLocation DocumentsAgent
{/* Gallery */}
{/* About + agent */}
About the residence

Built for the way the
island wakes up.

Full villa specification withheld until vendor approval — typical features for this frond include private beach access, infinity pool, staff quarters, dedicated cinema and a six-vehicle garage.

    {[ "Private beach frontage", "Infinity pool", "Smart-home (KNX)", "Staff quarters", "Cinema room", "6-car garage", "Vaulted majlis", "Lift to all floors", ].map((f, i)=>(
  • {f}
  • ))}
Your contact

Speak to Eleanor.

{listing.agent.name}
Senior Sales · Palm · {listing.agent.brn}
Book a viewing
Routes to {listing.agent.name} · CRM-tracked
); } function ValuationFlow({ setRoute, locale }) { const [step, setStep] = React.useState(1); const [data, setData] = React.useState({ purpose: "sell", type: "Apartment", beds: "2", community: "", size: "", name: "", phone: "", email: "", }); const update = (k, v) => setData(d => ({...d, [k]: v})); return (
Free · No obligation · 24h response

What's your
Dubai home
worth, honestly?

Three quick questions. A real consultant — RERA-registered, sold within the same community last week — gets back to you with a realistic range. We never display computed figures. No bots, no guesswork.

{[ ["24h", "Response time"], ["£0", "Cost / obligation"], ["100+", "Communities covered"], ].map(([n,l],i)=>(
{n}
{l}
))}
=1?" active":"")}> Step {step} of 3 {step === 1 ? "Property" : step === 2 ? "Specifics" : "You"}
{step === 1 && ( <>
{[ ["sell","Sell"], ["lease","Lease out"], ["curious","Just curious"], ].map(([v,l])=>( ))}
{["Apartment","Villa","Townhouse","Penthouse","Commercial"].map(v=>( ))}
)} {step === 2 && ( <>
update("community", e.target.value)} />
{["Studio","1","2","3","4","5+"].map(v=>( ))}
update("size", e.target.value)} />
)} {step === 3 && ( <>
update("name", e.target.value)} />
update("phone", e.target.value)} />
update("email", e.target.value)} />
Lead routes to the brokerage CRM · GDPR-compliant ·
Honeypot + reCAPTCHA on production
)} {step === 4 && (
Thank you, {data.name || "—"}.

A senior consultant will come back to you within 24 hours with a realistic range for your {data.beds}-bed {data.type.toLowerCase()} in {data.community || "your community"}.

)}
); } Object.assign(window, { PropertyDetail, ValuationFlow });