// 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) => ( {`${alt} ))} {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 ( {set.map((b, i) => ( ))} ); }; // ── Elevation glyphs const PDElevationGlyph = ({ kind }) => { const variants = { contemporary: ( ), classical: ( ), courtyard: ( ), tower: ( ), villa: ( ), lowrise: ( ), }; return ( {variants[kind] || variants.contemporary} ); }; // ── Hero const PDHero = ({ data, setPage }) => (
{data.tag}

{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}
))}
); // ── 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] ? {`${data.name} :
}
); }; // ── 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) ── */