// Projects index — filterable grid by sector function Projects({ onNav }) { const { PROJECTS, SECTORS, SECTOR_COUNTS } = window.DI; const [filter, setFilter] = useState("all"); const [view, setView] = useState("grid"); // grid | list const filtered = useMemo(() => { if (filter === "all") return PROJECTS; return PROJECTS.filter((p) => p.sector === filter); }, [filter, PROJECTS]); return (
{/* Header */}
Projects · 1,200+ delivered · {PROJECTS.length} featured

A portfolio across eight sectors.

Corporate to entertainment, banking to bespoke F&B — filtered by sector below. Each case study extends our existing metadata with which in-house divisions delivered the work.

Showing
{filtered.length} / {PROJECTS.length}
{/* Filter bar */}
Sector
{SECTORS.map((s) => { const count = s.key === "all" ? PROJECTS.length : (SECTOR_COUNTS[s.key] || 0); return ( ); })}
{/* Grid / list */}
{view === "grid" ? (
{filtered.map((p, i) => { // Asymmetric — every 5th tile spans bigger const span = i % 5 === 0 ? 6 : i % 7 === 3 ? 6 : 4; const aspect = span === 6 ? "16/10" : "3/4"; return ( ); })}
) : (
{filtered.map((p) => ( { e.preventDefault(); onNav(`project:${p.slug}`); }} style={{ display: "grid", gridTemplateColumns: "120px 2fr 1.5fr 1.5fr 1fr auto", gap: "1.5rem", alignItems: "center", padding: "1.25rem 0", borderBottom: "1px solid var(--line)", transition: "background 150ms", color: "var(--ink)" }} className="proj-list-row" onMouseEnter={(e) => e.currentTarget.style.background = "var(--mist)"} onMouseLeave={(e) => e.currentTarget.style.background = ""}>
{p.name}

{p.name}

{p.sectorLabel} {p.location} {p.year}
))}
)} {filtered.length === 0 && (

No projects in this sector — yet.

)}
); } function ProjectCard({ project, onNav, span = 4, aspect = "3/4" }) { return (
{ e.preventDefault(); onNav(`project:${project.slug}`); }} style={{ display: "block" }}>
{project.name}
{project.sectorLabel}
{project.award && (
★ Award
)}

{project.name}

{project.location} · {project.scope}{project.size && project.size !== "—" ? ` · ${project.size}` : ""} · {project.year}
); } Object.assign(window, { Projects, ProjectCard });