// Projects index (filterable grid) + Case Study template.
function ProjectsIndex({ setRoute, initialSector }) {
const { PROJECTS, SECTORS } = window.GLI_DATA;
const [sector, setSector] = useState(initialSector || "All");
const filtered = useMemo(() => {
if (sector === "All") return PROJECTS;
return PROJECTS.filter(p => p.sector === sector);
}, [sector]);
const onOpen = (id) => setRoute({ page: "project", id });
return (
All projects
{filtered.length} projects across the GCC and beyond.
A working selection of the thousand-plus interiors we've delivered since 1976. Royal palaces and private residences are anonymised throughout — full case studies available on signed NDA.
FILTER ·
setSector("All")}>
All {PROJECTS.length}
{SECTORS.map(s => (
setSector(s.name)}>
{s.name} {PROJECTS.filter(p => p.sector === s.name).length}
))}
{filtered.length} SHOWN
);
}
function CaseStudy({ id, setRoute }) {
const { PROJECTS } = window.GLI_DATA;
const p = PROJECTS.find(x => x.id === id) || PROJECTS[0];
const idx = PROJECTS.findIndex(x => x.id === p.id);
const next = PROJECTS[(idx + 1) % PROJECTS.length];
const prev = PROJECTS[(idx - 1 + PROJECTS.length) % PROJECTS.length];
const [lightbox, setLightbox] = useState(null);
return (
setLightbox(null)} />
{/* Hero */}
setRoute({ page: "projects" })}>← ALL PROJECTS
/
{p.sector.toUpperCase()}
{p.nda && NDA · Anonymised }
{p.name}
{/* Meta */}
{/* Narrative — Brief → Design → Manufacture → Install → Outcome */}
setLightbox(p.gallery[0])} style={{ cursor: "zoom-in" }} />
Manufacture · in our Dubai factory
{p.manufacture}
BUILT IN-HOUSE
Joinery · Furniture · Metalwork · Soft furnishings
setLightbox(p.gallery[1] || p.gallery[0])} style={{ cursor: "zoom-in" }} />
setLightbox(p.gallery[2] || p.gallery[0])} style={{ cursor: "zoom-in" }} />
{/* Palette */}
{p.palette.map((c, i) => (
{c.toUpperCase()}
{["Primary", "Accent", "Field", "Detail"][i]}
))}
{/* Gallery */}
{p.gallery.map((src, i) => (
setLightbox(src)}>
))}
{p.credit}
{/* CTA + nav */}
Like this one?
Start a similar project.
setRoute({ page: "contact", projectType: p.sector })}>
Request a quote →
setRoute({ page: "project", id: prev.id })} style={{ padding: "32px 0", cursor: "pointer", borderRight: "1px solid rgba(255,255,255,0.12)", paddingRight: 32 }}>
← PREVIOUS
{prev.name}
{prev.sector}
setRoute({ page: "project", id: next.id })} style={{ padding: "32px 0 32px 32px", cursor: "pointer", textAlign: "right" }}>
NEXT →
{next.name}
{next.sector}
);
}
function SectorsHub({ setRoute }) {
const { SECTORS } = window.GLI_DATA;
return (
Sectors
Three sectors. One studio. One factory.
Each sector demands a different rhythm — the pre-opening clock of a hotel; the
confidentiality of a royal residence; the security-cleared sequencing of a federal
chamber or an airline lounge. We are set up for all three.
{SECTORS.map((s, i) => (
0{i+1} · {s.count}+ DELIVERED
{s.name}
{s.blurb}
setRoute({ page: "projects", sector: s.name })}>
View {s.name} projects
))}
);
}
function CapabilitiesPage({ setRoute }) {
const { CAPABILITIES } = window.GLI_DATA;
return (
Capabilities
One signature. Three disciplines.
Design. Manufacturing. Contracting. Engaged together or separately —
most clients take all three, on a single accountable contract.
{CAPABILITIES.map((c, i) => (
Capability
{c.name}
{c.blurb}
{c.items.map(it => (
{it}
))}
{c.id === "manufacturing" && (
setRoute({ page: "manufacturing" })}>
Inside the factory
)}
))}
);
}
Object.assign(window, { ProjectsIndex, CaseStudy, SectorsHub, CapabilitiesPage });