Staging audit of the Cohort identity found the whole site rendering in Times.
Root cause: next/font's variable classes were on <body>, while globals.css
declares --font-display/--font-ui/--font-prose on :root as
`var(--font-schibsted), ...`. A custom property's var() references resolve on
the element that declares it, so at :root --font-schibsted was undefined,
--font-display computed to the guaranteed-invalid value, and every
font-family referencing it fell back. Nothing threw and the build was green —
the only symptom was visual.
Verified the mechanism in a browser both ways round: class on <body> gives an
empty token and a Times body font; class on <html> resolves to Schibsted
Grotesk. The classes now sit on <html>.
Two colour escapes from the same audit:
* Form controls don't inherit font or colour from their parent, so the omni
search input and the map's "Open full map" button rendered in the system
font at pure black. Nearly invisible against --text-primary in light mode
and completely invisible on the dark ground. Added a base inherit rule.
* Leaflet ships its own palette — a #ddd tile backdrop, #333 attribution text
and a #0078A8 link blue that was the most saturated colour anywhere on the
site. The map chrome now uses tokens; the tiles stay as OSM renders them.
Three e2e gates added, because the existing suite passed while the site was
entirely in Times:
* the font tokens resolve to a non-empty value and the applied family is
Schibsted, not a serif fallback
* no visible element renders in the browser's default black
* every rendered colour comes from the token palette — the manual audit,
turned into a gate
Also made the og:image check environment-relative: metadataBase pins canonical
URLs to the production host, so the absolute URL pointed off-environment when
the suite ran against staging.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>