const { Button: JB, Card: JC, Tag: JT, SectionHeader: JSH, ChartFrame: JCF, VisionFrame: JVF, Annotate: JA, FilterChip: JChip, SegmentedControl: JSeg, GlobalDelivery: JMap, PortfolioBreakdown: JBreak, CTABand: JCTA } = window.SoftVerxDesignSystem_6fd95b;
const W = window.SX_DATA;
function ClientMark() { return null; }
/* The client marks we hold are low-resolution rasters at fifteen different crops,
so they are set as type instead: one face, one size, one ink. */
function ClientTicker({ mobile }) {
const names = W.projects.filter((p) => p.logo).map((p) => p.short);
const track = names.concat(names);
return (
{track.map((n, i) => (
{n}
))}
);
}
function ProjectCard({ p, mobile }) {
const href = p.slug === "lesco" ? "/lesco" : (window.SX_STUDIES && window.SX_STUDIES[p.slug] ? "/case?p=" + p.slug : null);
const flagship = p.tier === "flagship";
const body = (
<>
{p.sector.toLowerCase()}{p.country ? " · " + p.country.toLowerCase() : ""}
{p.year || p.era}
{p.client}
{p.title}
{p.summary}
{p.practice.toLowerCase()}
{p.product &&
our own product }
{flagship && p.url &&
{p.url.replace(/^https?:\/\/(www\.)?/, "")} }
{flagship && p.metrics &&
{p.metrics[0].v} {p.metrics[0].l.split(" ").slice(0, 2).join(" ")} }
{href && (
Read the case study
)}
>
);
if (p.tier === "delivery" || (mobile && p.tier === "deployment")) {
const compact = p.tier === "delivery";
return (
{p.image && }
{p.client}
{p.year || p.era}
{p.title}
{!compact &&
{p.summary}
}
{p.sector.toLowerCase()} · {p.practice.toLowerCase()}{p.country ? " · " + p.country.toLowerCase() : ""}
{!compact && href &&
Case study }
);
}
return (
{p.image
?
{/* A photograph fills the frame. A screenshot is shown whole: cropping
a dashboard to 16:9 removes the column worth looking at. */}
:
{p.practice.toLowerCase()}
{p.logo && }
}
{body}
);
}
function TimelineView({ mobile }) {
return (
{W.eras.map((e) => {
const list = W.projects.filter((p) => p.era === e.label.slice(0, 4) || (p.era === "2000s" && +e.label.slice(0, 4) < 2010) || (p.era === "2010s" && +e.label.slice(0, 4) >= 2012));
return (
{e.label}
{e.title}
{e.detail}
{list.length} programmes recorded in this era
);
})}
);
}
function MapView({ mobile }) {
return (
);
}
const VIEWS = [
{ id: "grid", label: "grid" },
{ id: "timeline", label: "spine" },
{ id: "map", label: "map" },
];
/* One selector shape for all three facets: a quiet field that opens a list.
Counts stay visible; the field states the current pick rather than 43 chips. */
function Picker({ label, value, options, onPick, width = 210 }) {
const [open, setOpen] = React.useState(false);
const ref = React.useRef(null);
React.useEffect(() => {
if (!open) return;
const away = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
const key = (e) => { if (e.key === "Escape") setOpen(false); };
document.addEventListener("pointerdown", away); document.addEventListener("keydown", key);
return () => { document.removeEventListener("pointerdown", away); document.removeEventListener("keydown", key); };
}, [open]);
const current = options.find((o) => o.id === value) || options[0];
const set = value !== "all";
return (
setOpen(!open)} aria-expanded={open}
style={{ appearance: "none", fontFamily: "var(--font-body)", cursor: "pointer", width: "100%", textAlign: "left", display: "flex", alignItems: "center", gap: 10, padding: "9px 12px", background: "var(--surface-card)", border: "1px solid " + (open || set ? "var(--border-strong)" : "var(--border-default)"), borderRadius: "var(--r-control)" }}>
{label}
{current.label}
{current.count}
{open && (
{options.map((o) => {
const on = o.id === value;
return (
{ onPick(o.id); setOpen(false); }}
style={{ appearance: "none", fontFamily: "var(--font-body)", cursor: "pointer", width: "100%", display: "flex", alignItems: "baseline", gap: 10, textAlign: "left", background: on ? "var(--bg-well)" : "transparent", border: "none", borderRadius: 6, padding: "7px 9px" }}>
{o.label}
{o.count}
);
})}
)}
);
}
function ViewTabs({ view, setView, mobile }) {
return (
{VIEWS.map((v) => {
const on = view === v.id;
return (
setView(v.id)}
style={{ appearance: "none", fontFamily: "var(--font-body)", cursor: "pointer", border: "none", borderRadius: 999, padding: mobile ? "7px 14px" : "7px 18px", background: on ? "var(--surface-overlay)" : "transparent" }}>
{v.label}
);
})}
);
}
function ProjectsPage({ mobile }) {
const [view, setView] = React.useState(() => ({ "#spine": "timeline", "#map": "map" }[window.location.hash] || "grid"));
const [sector, setSector] = React.useState("all");
const [practice, setPractice] = React.useState("all");
const list = W.projects.filter((p) => (sector === "all" || p.sector === sector) && (practice === "all" || p.practice === practice));
const filtered = sector !== "all" || practice !== "all";
const tiers = ["flagship", "deployment", "delivery"];
const practicesUsed = [...new Set(W.projects.map((p) => p.practice))];
return (
Read the LESCO case study Ask about a similar build >}
meta={[{ l: "documented here", v: W.projects.length }, { l: "sectors", v: W.sectors.length }, { l: "countries", v: W.countries.length }, { l: "earliest", v: 1999 }]} />
Marks shown where we hold the client's logo. The full record is below.
The record, three ways to read it
({ id: s.label, label: s.label.toLowerCase(), count: s.value })))} />
({ id: pr, label: pr.toLowerCase(), count: W.projects.filter((p) => p.practice === pr).length })))} />
{filtered && (
{ setSector("all"); setPractice("all"); }} className="sx-micro"
style={{ appearance: "none", fontFamily: "var(--font-body)", cursor: "pointer", background: "transparent", border: "none", color: "var(--text-accent)", padding: "6px 2px" }}>Clear
)}
{list.length} of {W.projects.length} documented programmes shown
{view === "grid" && (
{tiers.map((t) => {
const rows = list.filter((p) => p.tier === t);
if (!rows.length) return null;
return (
{t}
{t === "flagship" ? "full programmes, documented scope" : t === "deployment" ? "delivered systems in production" : "smaller deliveries, listed plainly"}
{rows.length}
);
})}
)}
{view === "timeline" &&
}
{view === "map" &&
}
);
}
Object.assign(window, { ProjectsPage, ProjectCard, ClientMark, ClientTicker });