Phase 3 — Research (Iteration 3)

Phase 3 — Research (Iteration 3)

For a pure restyle there are no packages to vet. Research here validated the two things that could actually go wrong: the palette's contrast on white, and the offline font strategy.

Palette validated with WCAG math (not by eye)

A contrast script (tests/contrast.js) checked every text/surface pair and every cell-state pair.

Text/UI — all pass AA:

Cell states vs white field — all perceptible (start 2.22, goal 3.55, wall 16.83, open 1.90, closed 1.28, path 1.51).

Issue found & resolved (the payoff of checking): the original gold path #ffc400 and the cyan frontier #5ac8fa were nearly iso-luminant (1.19:1) — a problem for reduced-colour vision even though the hues differ. Iterating:

#ffd60a sits close to the light-gray closed state in luminance (1.11), but path and closed are resolved by a non-colour cue: the final path is drawn last with a subtle inset ring/weight, so it never depends on fill luminance alone (WCAG 1.4.1 — don't use colour as the only channel). This also matches the intended "payoff" emphasis for the path.

Final validated palette

Token Value
page background #f5f5f7
card surface #ffffff
ink (primary text) #1d1d1f
secondary text #6e6e73
hairline/separator #d2d2d7
accent (interactive) #0071e3
start #34c759
goal #ff3b30
wall #1d1d1f
mud (weight dot) #ff9500
frontier / open #5ac8fa
visited / closed #dfe4ee
final path #ffd60a + inset ring
algorithm dots bfs #0a84ff · dijkstra #ff9f0a · greedy #ff375f · astar #30d158

Offline font strategy (no web fonts)

Technique decisions

Security / offline posture

Unchanged. No new external resources (no web fonts, no CDNs), no new input, no innerHTML/eval. The static security scan (8 checks) remains part of Verify and must stay clean.

Deferred to Plan