// Projects filterable grid + sector hub function PageProjects({ go, initialSector }) { const [filter, setFilter] = useState(initialSector || 'all'); const all = window.ATG.PROJECTS; const list = filter === 'all' ? all : all.filter(p => p.sector === filter); const counts = useMemo(() => { const c = { all: all.length }; window.ATG.SECTORS.forEach(s => { c[s.id] = all.filter(p => p.sector === s.id).length; }); return c; }, [all]); return (
Projects

A selected portfolio of interior fit-out & design-and-build work.

Filter by sector. Each project is a structured case study with metadata, materials and the joinery / MEP process narrated.

{window.ATG.SECTORS.map(s => ( ))} Showing {list.length} of {all.length}
{list.map((p, i) => )}
{list.length === 0 && (

No published projects in this sector yet.

)}
); } function PageSectorHub({ go }) { return (
Sectors

Four practice areas, one delivery model.

Each sector has its own portfolio and its own sector-qualified enquiry route. Underneath, the same in-house design, joinery and MEP team carries the work.

{window.ATG.SECTORS.map((s, i) => { const ct = window.ATG.PROJECTS.filter(p => p.sector === s.id).length; return ( {e.preventDefault(); go('sector:'+s.id);}} style={{ aspectRatio: '16/10' }}> {s.name}
0{i+1} · {ct} published
{s.name}
{s.blurb}
โ†’
); })}
); } function PageSectorDetail({ go, id }) { const sector = window.ATG.SECTORS.find(s => s.id === id); if (!sector) return ; const list = window.ATG.PROJECTS.filter(p => p.sector === id); return (
{e.preventDefault(); go('sectors');}} style={{ borderBottom: '1px solid currentColor' }}>Sectors ยท {sector.name}

{sector.name} fit-out & build

{sector.blurb}

Selected published projects below — full sector workload is larger. Talk to the {sector.name.toLowerCase()} lead via the enquiry form for case studies on request.

{sector.name}

Published projects ({list.length})

{list.map((p, i) => )}
); } Object.assign(window, { PageProjects, PageSectorHub, PageSectorDetail });