// Generic commercial-project detail page // Sections: hero · thesis · unit-mix · masterplan · location · anchors · close const { useState: useCDState } = React; // Tiny SVG floor-plate diagram const CDPlateSchematic = ({ idx }) => { const sets = [ // Linear strip [[6,40,88,20],[6,30,18,10],[76,30,18,10],[6,60,18,10],[76,60,18,10]], // Mall plate with atrium [[6,6,88,88]], // outer + atrium drawn separately // L-shape [[6,6,40,88],[6,6,88,30]], // Open court [[6,6,88,88]], ]; const variant = idx % 4; return ( {sets[variant].map((b, i) => ( ))} {variant === 1 && ( )} {variant === 3 && ( <> COURT > )} ); }; // Hero const CDHero = ({ data, setPage }) => ( setPage('commercial')} data-track={`${data.id}-back`} className="mb-12 reveal flex items-center gap-2 text-[12px] tracking-[0.18em] uppercase text-bone-50/55 hover:text-bone-50 transition" > Commercial portfolio {data.tags.map((t) => ( {t} ))} {data.title.line1}{data.title.line2} {data.logo && ( )} {data.logo && ( )} {data.oneLiner} { setPage('contact'); window.scrollTo(0,0); }} data-track={`${data.id}-cta-enquire`} className="btn rounded-full bg-bone-50 text-ink-950 px-5 py-3 text-[12px] font-medium tracking-wide hover:bg-accent-soft inline-flex items-center gap-2" > Enquire now {data.social?.facebook && } {data.location?.mapsLink && } {data.slides && data.slides.length > 0 ? : } {data.facts.map((f) => ( {f.k} {f.v} ))} ); // Thesis / story const CDThesis = ({ data }) => ( {data.thesis.eyebrow} {data.thesis.title.a}{data.thesis.title.b} {data.thesis.body[0]} {data.thesis.body[1] && {data.thesis.body[1]}} {data.thesis.body[2] && {data.thesis.body[2]}} {/* KPIs row */} {data.kpis.map((k) => ( {k.v} {k.k} {k.d && {k.d}} ))} ); // Floor plans — tab switcher with real images const CDUnits = ({ data }) => { const [active, setActive] = useCDState(data.units[0].id); const u = data.units.find(x => x.id === active); const idx = data.units.findIndex(x => x.id === active); return ( {data.unitsTitle.a},{data.unitsTitle.b}>}/> {data.units.map((p) => ( setActive(p.id)} data-track={`${data.id}-unit-${p.id}`} className={`px-4 py-2 rounded-full text-[12px] tracking-wide border transition ${active === p.id ? 'border-accent text-accent bg-accent/10' : 'border-bone-50/15 text-bone-50/60 hover:text-bone-50 hover:border-bone-50/30'}`} >{p.label} ))} {u.image ? : } ); }; // Masterplan / floor stack — columned visual const CDMasterplan = ({ data }) => ( {data.masterplanTitle.a},{data.masterplanTitle.b}>}/> {/* Stack diagram */} {data.levels.map((lv, i) => ( {lv.level} {lv.name} {lv.size} ))} {/* Programme description */} {data.programme.map((p, i) => { const Ic = Icon[p.i] || Icon.Sparkles; return ( {p.k} {p.d} ); })} ); // Location & connectivity const CDLocation = ({ data }) => ( {data.location.title.a},{data.location.title.b}>}/> {data.location.mapEmbed ? ( /* ── Real Google Maps iframe (dark-filtered to match theme) ── */ ) : ( /* ── SVG diagram fallback ── */ <> {data.location.pois.map((p, i) => ( {p.label} ))} {data.location.pin} > )} {/* Top fade — adds depth over the map */} {/* Address chip */} {data.location.address} {/* Open in Maps button */} Open in Maps {data.location.distances.map((d, i) => ( {d.k} {d.v} ))} ); // Anchors / brand mix const CDAnchors = ({ data }) => ( {data.anchorsTitle.a}{data.anchorsTitle.b}>}/> {/* Anchor logos / brand placeholders */} {data.anchors.map((a) => ( {a} ))} {/* Mix categories */} {data.categories.map((c, i) => { const Ic = Icon[c.i] || Icon.Sparkles; return ( 0{i+1} {c.k} {c.d} {c.share && ( {c.share}% mix )} ); })} ); // Closing CTA const CDClose = ({ data, setPage }) => ( Begin · A Conversation {data.close.title.a}{data.close.title.b} {data.close.body} { setPage('contact'); window.scrollTo(0,0); }} data-track={`${data.id}-close-enquire`} className="btn rounded-full bg-bone-50 text-ink-950 px-5 py-4 text-[13px] font-medium tracking-wide hover:bg-accent-soft inline-flex items-center justify-between" > Enquire / Lease Chat on WhatsApp ); function CommercialDetail({ data, setPage }) { useReveal(); return ( ); } window.CommercialDetail = CommercialDetail;
{data.oneLiner}
{data.thesis.body[0]}
{data.thesis.body[1]}
{data.thesis.body[2]}
{k.d}
{p.d}
{c.d}
{data.close.body}