/* project.jsx — individual project detail page (hash route #/project/:id) */ const { useEffect: pE } = React; function ProjectDetail({ id, lang, onOpen, onBack, onNavigate }) { const T = (v) => window.t(v, lang); const all = window.OLV.projects; const idx = all.findIndex((p) => p.id === id); const p = all[idx]; pE(() => { window.scrollTo({ top: 0, behavior: "auto" }); }, [id]); if (!p) return (

{T({ en: "Project not found", hi: "प्रोजेक्ट नहीं मिला" })}

{T({ en: "Back to portfolio", hi: "पोर्टफ़ोलियो पर वापस" })}
); const cat = window.OLV.categories.find((c) => c.id === p.cat); const status = window.OLV.statuses.find((s) => s.id === p.status); const prev = all[(idx - 1 + all.length) % all.length]; const next = all[(idx + 1) % all.length]; const related = all.filter((r) => r.cat === p.cat && r.id !== p.id).slice(0, 3); const facts = [ { lbl: T({ en: "Category", hi: "श्रेणी" }), val: cat && T(cat) }, { lbl: T({ en: "Type", hi: "प्रकार" }), val: T(p.type) }, { lbl: T({ en: "Location", hi: "स्थान" }), val: T(p.loc) }, { lbl: T({ en: "Scale", hi: "परिमाण" }), val: p.area }, { lbl: T({ en: "Status", hi: "स्थिति" }), val: T(status) }, ]; return (
{/* hero */}
{T(p.title)}
{T(p.loc)}

{T(p.title)}

{T(cat)}{p.area}{T(status)}

{T(p.summary)}

{T(window.OLV.portfolio.highlights)}

    {p.highlights.map((h, i) =>
  • {T(h)}
  • )}

{T(window.OLV.portfolio.services)}

{p.services.map((s, i) => {s})}

{T({ en: "Every project we deliver is a reflection of the client's vision — executed with military precision and IIT-level technical expertise.", hi: "हमारा हर प्रोजेक्ट क्लाइंट की दृष्टि का प्रतिबिंब है — सैन्य परिशुद्धता व आईआईटी-स्तरीय तकनीकी विशेषज्ञता से निष्पादित।" })}

{/* related */} {related.length > 0 && (

{T({ en: "Related projects", hi: "संबंधित प्रोजेक्ट" })}

{related.map((r) => { const rc = window.OLV.categories.find((c) => c.id === r.cat); return ( ); })}
)} {/* prev / next */}
); } Object.assign(window, { ProjectDetail });