// Case study page — extends Odoo (or any project) with materials/process narrative + divisions used function CaseStudy({ slug, onNav }) { const { PROJECTS } = window.DI; const project = PROJECTS.find((p) => p.slug === slug) || PROJECTS[0]; const [lbIdx, setLbIdx] = useState(null); // Find prev/next in same library const idx = PROJECTS.findIndex((p) => p.slug === project.slug); const prev = PROJECTS[(idx - 1 + PROJECTS.length) % PROJECTS.length]; const next = PROJECTS[(idx + 1) % PROJECTS.length]; // Per-project narrative (the differentiator — materials/process + outcome) const narratives = { odoo: { brief: "Odoo's first regional headquarters needed to set a benchmark for office wellness and Belgian-rooted design culture, while accommodating rapid growth across 90,000 sq ft in Dubai South.", concept: "An interior that reads as one continuous landscape — open studios, quiet pockets, café-as-lobby — rather than a corridor of meeting rooms. Materially honest: timber, glazing, exposed services.", materials: ["European oak veneer (joinery, FSC)", "Microcement underfoot", "Acoustic timber slats", "Powder-coated steel framing", "Brushed brass detailing"], process: "Six of our seven divisions on one PO. Joinery and upholstery shop-fabricated 1,400 linear metres of millwork at DIP; metal & glass produced the partition system in-house; signage and furniture were drawn into the same coordination model from day one.", outcome: "Delivered on programme over a 22-week build, with a 2-year defect liability period and post-occupancy snagging closed within 30 days. Recognised in 2024 with Highly Commended — Office Wellness at the CID Awards.", }, accor: { brief: "A regional HQ for Accor reflecting the group's hospitality DNA — but in a workplace, for staff, not guests.", concept: "Hotel-grade materials and warmth, with the speed and resolution of a corporate fit-out.", materials: ["Travertine reception detailing", "Walnut joinery", "Custom upholstered banquettes", "Architectural lighting"], process: "Turnkey delivery led by our joinery and furniture divisions, with Kristina Zanic Consultants on design.", outcome: "Best Fit-Out Project of the Year. Quoted by Alexandra Woop, Executive Director, Accor.", }, }; const story = narratives[project.slug] || { brief: `A ${project.scope.toLowerCase()} project in ${project.location} for a ${project.sectorLabel.toLowerCase()} client. Delivered as part of our ongoing portfolio.`, concept: "Materially considered, programme-led, delivered turnkey across our in-house divisions.", materials: ["— Materials brief pending client sign-off"], process: "Coordinated by our in-house teams; full division breakdown available on enquiry.", outcome: "Delivered with a 2-year defect liability period.", }; return (
{/* Hero */}
· {project.sectorLabel}

{project.name}

{project.award && (
{project.award}
)}
Sector index
{String(idx + 1).padStart(2, "0")}/{String(PROJECTS.length).padStart(2, "0")}
{/* Hero image */}
setLbIdx(0)}> {project.name}
{/* Metadata bar */}
{[ { label: "Sector", value: project.sectorLabel }, { label: "Location", value: project.location }, { label: "Size", value: project.size && project.size !== "—" ? project.size : "Not disclosed" }, { label: "Scope", value: project.scope }, { label: "Year", value: project.year }, { label: "Divisions", value: `${project.divisions.length} in-house` }, ].map((m) => (
{m.label}
{m.value}
))}
{/* Narrative */}
The brief

{story.brief}

{story.concept}

{/* Image full-bleed */} {project.gallery[1] && (
setLbIdx(1)}> {project.name}
)} {/* Materials + Process */}
Materials
    {story.materials.map((m, i) => (
  • {String(i + 1).padStart(2, "0")} {m}
  • ))}
Made in our factory

{story.process}

{/* Division breakdown */}
Divisions on this project
{project.divisions.map((d) => ( {d} ))}
{/* Gallery grid */} {project.gallery.length > 2 && (

Gallery

{project.gallery.length} images
{project.gallery.slice(2).map((src, i) => (
setLbIdx(i + 2)}>
))}
)} {/* Outcome */}
Outcome

{story.outcome}

Similar brief?

Start a {project.sectorLabel.toLowerCase()} project with the same team.

{/* Photographer credit + rights disclosure */}
Photography · credit pending client sign-off Case study extends existing Size · Location · Sector · Scope metadata with materials/process + divisions used
{/* Prev / Next */}
{ e.preventDefault(); onNav(`project:${prev.slug}`); }} style={{ padding: "3rem var(--pad-page)", borderRight: "1px solid var(--line)", color: "var(--ink)", transition: "background 150ms" }} onMouseEnter={(e) => e.currentTarget.style.background = "var(--mist)"} onMouseLeave={(e) => e.currentTarget.style.background = ""}>
← Previous
{prev.name}
{ e.preventDefault(); onNav(`project:${next.slug}`); }} style={{ padding: "3rem var(--pad-page)", textAlign: "right", color: "var(--ink)", transition: "background 150ms" }} onMouseEnter={(e) => e.currentTarget.style.background = "var(--mist)"} onMouseLeave={(e) => e.currentTarget.style.background = ""}>
Next →
{next.name}
{lbIdx !== null && ( setLbIdx(null)} onIndex={setLbIdx} /> )}
); } Object.assign(window, { CaseStudy });