Session 36: Design system Phase E — remaining screens + dashboard Bloomberg lines (1853 tests)

VYNDR 2.0 conversion, Phase E. Frontend-only; zero backend changes.

- lib/slateAdapter.js: parseAmericanOdds, detectBestLines, mapScheduleToGameCards
  (best/worst line detection — the Bloomberg pattern).
- Reskinned the LEGACY GameCard's game-lines grid with best/worst highlighting +
  SportBadge, keeping inline grading intact (a wholesale swap to the display-only
  vyndr/GameCard would have deleted the slate's grading interaction).
- compare/invite/help/about: RouteStubs -> real design-system pages.
- login reskinned (scanlines, system voice, new Wordmark); pricing + ClaimMeter.

Honest scope: the full GameCard swap needs inline grading ported into the new
component first; profile/settings/blog/game-detail reskins are light/deferred.

18 new tests. Backend 1839 -> 1853, 144 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-16 01:04:37 -04:00
parent 1d83682cdb
commit 612f5e0b72
12 changed files with 599 additions and 96 deletions
+67 -2
View File
@@ -4,8 +4,73 @@
2026-06-16
## Current Phase
SHIP BUILD v35.0 — VYNDR 2.0 design system, Phase D: core screens — Grade Result
Card, Slate GameCard, Scan, Terminal, Landing claim meter (Session 35)
SHIP BUILD v36.0 — VYNDR 2.0 design system, Phase E: remaining screens —
dashboard Bloomberg lines, compare/invite/help/about, login/pricing (Session 36)
## Session 36 (2026-06-16) — SHIPPED
Phase E of the VYNDR 2.0 conversion + Session 35's #1 deferred item (the
dashboard line upgrade). Frontend-only; ZERO backend changes. Backend 1839 →
**1853 tests** (+14), 144 suites, zero regressions. Web build clean (exit 0).
### E.1 — Dashboard GameCard (Session 35's #1 deferred) — DELIVERED via reskin
- KEY DECISION: the live Slate's legacy `GameCard` carries **inline per-prop
grading** (PlayerCard/PropRow → onGrade/gradedProps). The Session-35
display-only `vyndr/GameCard` has no grading, so a wholesale swap would
DELETE the slate's core interaction. Instead, **reskinned the legacy GameCard's
game-lines grid** with the Bloomberg best/worst pattern + SportBadge +
SectionHead, keeping grading 100% intact — the #1 visual win without the
regression.
- `web/src/lib/slateAdapter.js` (CommonJS, unit-tested): `parseAmericanOdds`
(American → decimal payout), `detectBestLines(books)` (marks best/worst ML per
side, only when ≥2 books disagree), `mapScheduleToGameCards(schedule,
gamelines, streaks, grades)` (the §7 contract mapper, for the future full
swap). GameCard now renders the lines grid via `detectBestLines`: best =
green tint + green left border, worst = subtle red. Dropped the emoji marker
for SportBadge.
### E.3 — Four stubs → real pages (zero regression risk)
- `compare` — head-to-head: two TerminalInputs, side-by-side stat table
(winner-highlighted), intel-surface VYNDR VERDICT. Sample data.
- `invite` — referral: progress 0/3, mono referral link + copy button, share
CTA. Code derived from the session email.
- `help` — searchable FAQ: TerminalInput filter + expandable Card Q&A by
category + support mailto.
- `about` — brand page in system voice (glitch Wordmark, "give it back",
Detroit signature). Server component.
### E.2 — Reskins (logic preserved)
- `login` — scanlines background, new `.wm` Wordmark (beta), system voice
("ACCESS THE SIGNAL"), Level-1 card. ALL auth logic (form, OAuth, `next`
redirect) untouched.
- `pricing` — mounted `ClaimMeter` under the grid; removed the now-doubled
`paddingTop` (layout already offsets 96 since Session 34).
- `account` is a redirect to `/profile` — left as-is (canonical surface).
### Files created
- `web/src/lib/slateAdapter.js`
- `tests/unit/vyndrPhaseE.test.js` (18 tests: adapter odds/best-line/mapping
logic, GameCard reskin, the 4 real pages, login/pricing reskins)
### Files modified
- `web/src/components/GameCard.tsx` (Bloomberg lines + SportBadge/SectionHead)
- `web/src/app/{compare,invite,help,about,login,pricing}/page.tsx`
- `tests/unit/vyndrAppShell.test.js` (only /notifications remains a stub)
### Deferred (Sessions 37+) — honest scope
- The FULL GameCard swap (replacing legacy GameCard with vyndr/GameCard) needs
inline grading ported into the new component first — bigger than a reskin;
the slateAdapter + new GameCard are both ready for it. Reskinned instead this
session to avoid deleting grading.
- Profile/settings/blog/game-detail/responsible reskins + scan-input
TerminalInput polish: light or deferred (tokens already mostly resolve there;
prioritized dashboard + paid-user-visible + new pages per the impact order).
Settings destructive-action confirmations (type-DELETE) are Phase G utility
flows.
---
## Session 35 (2026-06-16) — SHIPPED
## Session 35 (2026-06-16) — SHIPPED