Session 33: Design system Phase A+B — tokens, fonts, glitch CSS, shared components (1792 tests)

VYNDR 2.0 design-system conversion, foundation only (pages/mobile/systems are
Sessions 34+). Frontend-only; zero backend changes.

Phase A: §2 token set + token-wired typography + Inter/JetBrains Mono fonts +
§4 glitch keyframes (ported verbatim from the prototype's vyndr.css) + scanline
texture + §10 a11y data-* layer in globals.css. Legacy alias block kept.

Phase B: web/src/lib/vyndrTokens.js (CommonJS helpers) + 9 shared components
under web/src/components/vyndr/ (Wordmark, GradeBadge, SportBadge, TerminalInput,
SectionHead, VBtn, Card, Sparkline, Ticker).

74 new design-system tests. Backend 1718 -> 1792, 141 suites, zero regressions.
Web build clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-06-15 22:58:57 -04:00
parent f0c8b4f29b
commit a74b5dd1ed
16 changed files with 1234 additions and 10 deletions
+80 -2
View File
@@ -4,8 +4,86 @@
2026-06-15
## Current Phase
SHIP BUILD v32.0 — Close audit gaps: grades pipeline + NFL/NHL wiring +
rate limiting + test-artifact cleanup (Session 32)
SHIP BUILD v33.0 — VYNDR 2.0 design system, Phase A+B: tokens + global CSS +
fonts + glitch keyframes + shared components (Session 33)
## Session 33 (2026-06-15) — SHIPPED
First session of the multi-session VYNDR 2.0 design-system conversion. Fetched
the design handoff bundle (claude.ai/design share → gzipped tar of the
prototype: `vyndr.css` + ~35 `.jsx` + `VYNDR_HANDOFF.md`), read the README +
handoff spec, and implemented **Phase A (foundation)** and **Phase B (shared
components)** only — pages, mobile, and systems are Sessions 34+. Frontend-only;
ZERO backend changes. Backend 1718 → **1792 tests** (+74), 141 suites, zero
regressions. Web build clean (exit 0).
### PHASE A — Tokens + global CSS + fonts + glitch keyframes
- **Tokens (§2, exact):** added the canonical short-name token set to
`web/src/app/globals.css` `:root``--g-ap/--g-a/--g-b/--g-c/--g-d`,
`--s-nba/--s-mlb/--s-wnba/--s-soccer`, `--amber/--amber-glow`,
`--live/--hit/--miss`, `--scan-op: 0.04`, `--grade-hero`, `--sans` (Inter),
`--mono` (JetBrains Mono). Set `--glitch: 1` (§2 baseline, was 0.5). Kept the
full legacy alias block so every existing component still resolves during the
migration — additive, not a rip-out.
- **Typography wired to tokens:** base `body` / `h1h6` / `.mono` / `.num` /
`.lbl` now resolve `var(--sans)` / `var(--mono)` instead of hardcoding
Instrument Sans / IBM Plex Mono → the whole app picks up Inter + JetBrains
Mono from the foundation (the §2 monospace-for-data rule).
- **Fonts (§2):** `layout.tsx` Google Fonts link now loads Inter (400900) +
JetBrains Mono (400800); IBM Plex Mono + Instrument Sans kept loaded so
un-converted pages don't lose their type before Sessions 34+.
- **Glitch system (§4, ported verbatim from `vyndr.css`):** appended a
"VYNDR 2.0 DESIGN SYSTEM" block with every keyframe — `wm-tear`,
`glitch-shift-r/-b`, `wm-caret`, `head-tear`, `crt-sweep`, `crt-sweep-local`,
`phosphor-pulse`, `grade-reveal`, `ticker-scroll`, `live-pulse`,
`flash-up/-down`, `ekg-scroll`, `node-pulse`, `synapse-travel`, `count-tick`,
`factor-ignite`, `signal-in`, `proc-scan`, `data-blink`, `toast-in`,
`sheet-up`, `cmd-in`, `fade-in`, `scan-drift` — plus `.scanlines::after`
texture, `.intel-surface` (Level-3 "VYNDR is speaking" green), `.wm*`
wordmark, `.glitch-hover`, living-layer classes, and the §10 a11y `data-*`
layer (contrast/text/colorblind/readable-font/reduced-motion). Where
keyframe/class names collide with the legacy block, the new (appended)
definitions are authoritative (later-wins). **Entrance keyframes floor at the
visible state** (`fade-in` from opacity .6) per the §4 hard-won note.
### PHASE B — Shared components (§5)
- `web/src/lib/vyndrTokens.js` — plain CommonJS helpers (`GRADE_COLORS`,
`GRADE_HEX`, `SPORT`, `GRADE_BADGE_SIZES`, `gradeColor`, `gradeHex`,
`gradeBadgeSize`). CommonJS on purpose: the `.tsx` components import it
(allowJs) AND the Jest suite requires it directly (no TS/Babel transform in
the plain-JS test config) → the helper LOGIC is genuinely unit-tested, not
just text-asserted.
- `web/src/components/vyndr/``Wordmark`, `GradeBadge`, `SportBadge`,
`TerminalInput`, `SectionHead`, `VBtn`, `Card`, `Sparkline`, `Ticker` +
barrel `index.ts`. Ported faithfully from `vyndr-core.jsx` → TS, token-only
colors. `'use client'` only where needed (`TerminalInput`, `VBtn`).
GradeBadge `hero` size maps to 100px (within the §5 80120px rule).
NOTE: the existing root `components/Wordmark.tsx` (legacy `.wordmark` markup,
used by Nav) is untouched — the new one lives at `@/components/vyndr/Wordmark`
(`.wm` markup) and supersedes it as pages convert in Sessions 34+.
### Files created
- `web/src/lib/vyndrTokens.js`
- `web/src/components/vyndr/{Wordmark,GradeBadge,SportBadge,TerminalInput,
SectionHead,VBtn,Card,Sparkline,Ticker}.tsx`, `web/src/components/vyndr/index.ts`
- `tests/unit/vyndrDesignSystem.test.js` (74 tests via parameterized `it.each`:
token presence, exact §2 hex, font loading, all keyframes, scanline + a11y +
reduced-motion, helper logic, component contracts)
### Files modified
- `web/src/app/globals.css` (§2 tokens, token-wired typography, full §4 glitch
+ §10 a11y block appended)
- `web/src/app/layout.tsx` (Inter + JetBrains Mono font link)
### Deliberately deferred (per the session spec — Sessions 34+)
- A.7 hardcoded-hex sweep across the 40+ existing components is page-conversion
work (Sessions 3437), NOT Phase A. New vyndr components are token-only.
- Phases CH: app shell/routing, core + remaining screens, mobile parity,
living layer / i18n / a11y wiring / PWA / paywall / parlay math, QA vs §13.
- The prompt's RYAN MONTGOMERY note (sessionStorage auth → httpOnly cookies in
prod) is a systems concern for Phase G, not Phase A/B.
---
## Session 32 (2026-06-15) — SHIPPED