[1.137.0] — 2026-08-11
Readability & rendering fixes — dark-mode contrast, chart labels, and the career plan. A user-reported UX pass (no parent-sync).
Fixed
- Dark-mode white-on-white / black-on-black across many screens — fifteen CSS custom properties several views referenced (
--fg,--panel,--panel-2,--surface-elev1,--line,--ok,--go,--err,--error,--danger,--warn,--muted,--ink,--card,--border) were never declared in the palette, sovar(--fg, #111)/var(--panel-2, #eef1f6)/var(--ok, #008a05)silently fell back to hardcoded light/black literals: fine in light mode, unreadable in dark (the#/pipelineoverview chips,#/statsactive tab,#/config"Active / Keys" + "✓ set",#/two-pagersections,#/mock-interviewquestion bubble, error text, and more). They're now aliased to the real theme-aware tokens (--hof/--paper/--slate/--kazan-text/--rausch-text/…) on:root, so they follow the theme automatically. The#/configactive tab (a solid pink pill with white text, ~2.94:1) became the readable tinted-badge pattern. Verified with an automated alpha-composited contrast auditor: 0 WCAG-AA failures across all 29 views in dark mode (was: pipeline chip ~1→12.2, stats tab ~1→15.8). A regression guard (tests/dark-theme-tokens.test.mjs) keeps every alias declared and mapped to a theme-aware token. #/statschart labels were hard-cut mid-word ("Senior Backend Engineer" → "…Enginee") — the SVG bar chart now ellipsizes (…) with the full label kept as a hover<title>, and the label column is wider.#/career-planshowed the generated plan as raw Markdown (##,**, table pipes) — it now auto-renders the plan as formatted, readable text the moment it's generated (the editable Markdown stays in the textarea below; Preview toggles the rendered view).
Notes
#/career-plan,#/two-pager,#/memory,#/stats, and the weekly interview digest are not broken — every endpoint returns 200; they render empty states (no plan generated yet / no interview sessions logged in the selected week). Clearer on-page "what this does / how to use it" guidance and?help hints land in the next release.- The generated career plan renders through
UI.md(), the app's escape-first client XSS boundary (api.jsHTML-escapes every byte before any tag transform) — same pathreports/orientation/cv-studiouse. A newtests/ui-md-xss.test.mjsfeeds<img onerror>/<script>/javascript:payloads through it and asserts no live tag/handler survives. - Repo tidy:
docs/UX-ROADMAP.mdrecords the Phase 2–4 UX plan; the two perennial QA prompts (qa/UX-AUDIT-PROMPT.md,qa/DESIGNER-EXPORT-PROMPT.md) were actualized to the v1.137.0 baseline (32 route modules · 79 sources · 17 locales); and 59 superseded per-release QA prompts moved toqa/archive/superseded-prompts/.