// Generic project detail page — driven by a data object.
// Used by Maurya Greens, Palm Garden, Palm City 2.
const { useState: usePDState, useEffect: useSliderEffect } = React;
// ── Image Slider — used on all project detail pages when data.slides is provided
const ImageSlider = ({ slides, alt, className, imgClassName }) => {
const [idx, setIdx] = React.useState(0);
const [paused, setPaused] = React.useState(false);
const n = slides.length;
const prev = () => setIdx(i => (i - 1 + n) % n);
const next = () => setIdx(i => (i + 1) % n);
useSliderEffect(() => {
if (paused || n <= 1) return;
const t = setInterval(() => setIdx(i => (i + 1) % n), 4500);
return () => clearInterval(t);
}, [paused, n]);
return (
setPaused(true)}
onMouseLeave={() => setPaused(false)}
>
{slides.map((src, i) => (

))}
{n > 1 && (
<>
{slides.map((_, i) => (
{idx + 1} / {n}
>
)}
);
};
window.ImageSlider = ImageSlider;
// ── Tiny SVG schematic plan (decorative, varies by index)
const PDPlanSchematic = ({ idx }) => {
const blocks = [
[[10,10,30,40],[42,10,48,30],[10,52,30,38],[42,42,48,48]],
[[10,10,42,32],[54,10,36,32],[10,44,30,46],[42,44,48,46]],
[[10,10,38,28],[50,10,40,40],[10,40,38,50],[50,52,40,38]],
[[8,8,40,40],[52,8,40,40],[8,52,40,40],[52,52,40,40]],
];
const set = blocks[idx % blocks.length];
return (
);
};
// ── Elevation glyphs
const PDElevationGlyph = ({ kind }) => {
const variants = {
contemporary: (
),
classical: (
),
courtyard: (
),
tower: (
),
villa: (
),
lowrise: (
),
};
return (
);
};
// ── Hero
const PDHero = ({ data, setPage }) => (
{data.tag}
{data.title.line1}
{data.title.line2}
{data.logo && (

)}
{data.logo && (

)}
{data.oneLiner}
{data.social?.facebook &&
}
{data.location?.mapsLink &&
}
{data.slides && data.slides.length > 0
?
:
}
{data.facts.map((f) => (
))}
);
// ── Story
const PDStory = ({ data }) => (
{data.story.eyebrow}
{data.story.title.a}
{data.story.title.b}
{data.story.body[0]}
{data.story.body[1] &&
{data.story.body[1]}
}
);
// ── Floor plans
const PDFloorPlans = ({ data }) => {
const images = data.planImages || (data.planImage ? [data.planImage] : []);
const [activeIdx, setActiveIdx] = usePDState(0);
return (
{data.plansTitle.a},
{data.plansTitle.b}>}/>
{images.length > 1 && (
{images.map((_, i) => (
))}
)}
{images[activeIdx]
?

:
}
);
};
// ── Elevations
const PDElevations = ({ data }) => (
{data.elevationsTitle.a},
{data.elevationsTitle.b}>}/>
{data.elevations.map((e, i) => (
0{i+1} / 0{data.elevations.length}
{e.t}
{e.d}
))}
);
// ── Location & Connectivity
const PDLocation = ({ data }) => (
{data.location.title.a},
{data.location.title.b}>}/>
{/* Map */}
{data.location.mapEmbed ? (
/* ── Real Google Maps iframe (dark-filtered to match theme) ── */
) : (
/* ── SVG diagram fallback ── */
<>
>
)}
{/* Top fade */}
{/* Address chip */}
{data.location.address}
{/* Open in Maps */}
Open in Maps
{/* Distance list */}
{data.location.distances.map((d, i) => (
))}
);
// ── Amenities
const PDAmenities = ({ data }) => (
{data.amenitiesTitle.a}
{data.amenitiesTitle.b}>}/>
{data.amenities.map((a, i) => {
const Ic = Icon[a.i] || Icon.Sparkles;
return (
);
})}
);
// ── Closing CTA
const PDClose = ({ data, setPage }) => (
Begin · A Conversation
{data.close.title.a}
{data.close.title.b}
{data.close.body}
Chat on WhatsApp
);
// ── Top-level wrapper
function ProjectDetail({ data, setPage }) {
useReveal();
return (
);
}
window.ProjectDetail = ProjectDetail;