fix(website): clear WCAG AA across both themes, and stop the hero shifting

Contrast was measured, not eyeballed: 41 foreground/background pairs across
both themes and the terminal surface, each against the darkest (light) or
lightest (dark) surface it actually sits on. Five failed. Links on manila
read 3.64:1 and the footer's "No telemetry. Ever." — a claim the site goes
out of its way to make — sat at 2.86:1.

The accent needed splitting rather than moving. #c1502e clears 4.5:1 as a
button fill behind white but only 3.99:1 as an 11px eyebrow on vinyl, so
--accent keeps the brand hue for fills and a new --accent-text carries the
readable cut. The terminal gets the same treatment dark emulators give their
palettes: alarm and oxide brighten inside .tui-content so "Failed" is
legible next to its glyph.

Reduced motion no longer nukes everything. A blanket 0.01ms also kills the
transitions that answer a click, which is feedback rather than movement;
looping and travelling animation stops, the rest caps at 80ms. The TUI
already skipped its opening run and still does.

The hero reserves its box with aspect-ratio from the first paint. It was
prerendered at full unscaled height and collapsed once JS measured, moving
everything below it by ~145px. Measured shift is now 0.

Also: the webfont loads non-blocking (display=swap meant the first frame
never waited for it anyway), footer link groups nest under a heading instead
of sitting level with page sections, and eight tokens nothing referenced
stop shipping.
This commit is contained in:
Michel de Graaf
2026-07-25 00:40:13 +02:00
parent 8b8383afdf
commit 74ad230150
13 changed files with 107 additions and 57 deletions
+13 -2
View File
@@ -14,6 +14,15 @@ import { InfoPane, ResultsPane, SearchesPane, TransfersPane } from './panes'
import { useFitScale } from './use-fit-scale'
const DESIGN_WIDTH = 1360
/*
* Natural height of the terminal at DESIGN_WIDTH, measured in the browser.
*
* The layout is fixed — no content-driven heights — so the wrapper can hold
* this ratio in CSS from the very first paint. Without it the prerendered
* hero occupied its full unscaled height, then collapsed to the scaled one
* once JS measured, shifting everything below it by ~145px.
*/
const DESIGN_HEIGHT = 863
const TICK_MS = 480
const MAX_CONCURRENT = 2
/** Where the scripted run leaves the cursor. */
@@ -374,8 +383,10 @@ export const HeroTerminal = () => {
return (
<div
ref={wrapRef}
className="w-full overflow-x-auto overflow-y-hidden"
style={ready ? { height } : undefined}
className="w-full overflow-hidden"
// aspect-ratio reserves the right box before JS runs; once measured the
// explicit height takes over and the two agree, so nothing moves.
style={ready ? { height } : { aspectRatio: `${String(DESIGN_WIDTH)} / ${String(DESIGN_HEIGHT)}` }}
>
<div style={ready ? { width: DESIGN_WIDTH * scale, height } : undefined}>
<div