// 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 }) => (
{data.tags.map((t) => ( {t} ))}

{data.title.line1}
{data.title.line2}

{data.logo && ( {`${data.name} )}
{data.logo && ( {`${data.name} )}

{data.oneLiner}

{data.social?.facebook && } {data.location?.mapsLink && }
{data.slides && data.slides.length > 0 ? : {`${data.name} }
{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) => ( ))}
{u.image ? {u.label :
}
); }; // 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) ── */