UI Phase 1 — Audit and Design System Foundation
Date: 2026-08-19
Scope lock
| Item |
Locked scope |
| Files expected to change |
Global tokens/styles, shared UI primitives, direct tests, this audit |
| Modules affected |
Theme/tokens, buttons, form feedback, shared screen states |
| Behavior expected to change |
Consistent scales, accessible validation descriptions, reusable loading/not-found states |
| Behavior that must remain unchanged |
Routing, API contracts, business logic, backend, page workflows, app-shell layout |
Baseline inventory
| Measure |
Baseline |
| TSX files |
90 |
| CSS files |
24 |
| Files using native buttons |
37 |
Files using shared Button |
31 |
| Files using native form controls |
36 |
Files using FormField |
8 |
Files using ScreenState |
27 |
| CSS files containing raw colors |
12 |
The project already had a sound semantic light/dark palette, Dana/Inter font stacks, visible focus rings, 44px touch targets, reduced-motion handling, modal focus management, and shared primitives. Phase 1 strengthens that existing foundation instead of replacing it.
Product surface audit
| Surface |
Main findings |
Priority |
Routed phase |
| Login and recovery |
Strong two-column hierarchy; raw brand colors and form composition need token adoption checks |
Medium |
UI Phase 8 polish |
| Dashboard |
Useful semantic panels exist; action hierarchy and card density need a dedicated pass |
High |
UI Phase 3 |
| Courses and workspace |
Shared states are used; filter, action, and content-density patterns vary |
High |
UI Phase 6 |
| Builder |
Functional and state-rich; owns several local colors/radii and needs canvas-first UX work |
High |
UI Phase 4 |
| Library and assets |
Good loading/empty coverage; picker overlay and preview surfaces use local styling |
Medium |
UI Phase 6 |
| Templates and question bank |
Dense native controls and local tab/action patterns reduce consistency |
High |
UI Phase 6 |
| Users, teams, assignments |
Similar management workflows use partially different table/filter/action patterns |
High |
UI Phase 6 |
| Monitoring, reports, skills |
Data hierarchy is serviceable; chart/filter and empty/error presentation need alignment |
Medium |
UI Phase 6 |
| Reviews, certificates, subscription, settings |
Shared cards/states exist; destructive actions and long-form settings need pattern review |
Medium |
UI Phase 6 |
| AI Studio |
Core flow exists, but progress, source selection, advanced settings, and review need a single wizard hierarchy |
High |
UI Phase 5 |
| Learner home/player/assessments |
Deliberately distinct learner styling; glass-like surfaces, mobile density, and reading flow need targeted validation |
High |
UI Phase 7 |
Findings by category
| Category |
Status |
Finding |
| Consistency |
Needs improvement |
Shared primitives coexist with many page-local native controls; bulk replacement is deferred to page phases. |
| Hierarchy |
Mixed |
Global page/section typography existed but was not represented as a reusable token scale. |
| Density |
Mixed |
Spacing was mostly tokenized, but the scale skipped 20, 40, and 48 pixels. |
| Typography |
Good foundation |
Dana and Inter are preserved; page, section, card, body, secondary, and caption sizes are now explicit. |
| Forms |
Improved |
Labels, required markers, focus, disabled, and error styles existed; helper text was lost whenever an error was present. |
| Interactive states |
Improved |
Focus and disabled states existed; shared buttons now expose compatible size variants and an async loading contract. |
| Loading/empty/error |
Good foundation |
Skeleton and ScreenState were already reused broadly; loading, success, and not-found semantics are now available. |
| RTL/LTR |
Good foundation |
Logical CSS properties and language font tokens are established. Page-level exceptions remain phase-specific. |
| Dark mode |
Good foundation |
Semantic dark tokens exist; elevated, interactive, and subtle-text layers were added explicitly. |
| Accessibility |
Improved |
Visible focus, reduced motion, modal focus trap, and touch targets exist; form helper/error associations are now complete. |
Foundation contract
- Surfaces: canvas, surface, elevated, interactive, soft, accent, overlay.
- Semantic color: primary, success, warning/attention, danger, info.
- Spacing: 4, 8, 12, 16, 20, 24, 32, 40, 48.
- Radius: 8, 12, 16, 20; the previous 18px value remains available as a compatibility alias.
- Typography: page, section, card, body, secondary, caption with four documented weights.
- Motion: 150–200ms with standard and exit easing; reduced motion remains enforced globally.
- Layering: base, sticky, drawer, popover, tooltip, modal, toast.
- Buttons: primary, secondary, outline, ghost, danger, icon-compatible styling; small, medium, and large sizing; loading semantics.
- Forms: persistent helper text, adjacent validation message, required marker,
aria-describedby, and aria-errormessage.
- States: skeleton plus empty, loading, error, offline, permission, not-found, and success screen states.
Deferred technical debt
| Item |
Severity |
Reason deferred |
| Replace or normalize page-local native controls |
Medium |
Requires page-level visual and behavioral regression checks in Phases 3–7. |
| Remove remaining raw colors and arbitrary radii |
Medium |
Some values are media/certificate/user-configurable colors; each needs contextual review. |
| Standardize table, tabs, select, checkbox, switch, tooltip, drawer, pagination, search, and filter APIs |
High |
No complete shared implementations exist; creating them without their consuming page phase risks unused abstractions. |
| Validate every learner glass/blur surface in dark mode |
Medium |
Belongs to learner and final polish phases. |
| Route-level lazy loading |
Medium |
Performance change is outside the visual foundation scope and needs measurement first. |
Before / after UX summary
Before, the product had a capable but implicit foundation: common colors and controls existed, while typography, spacing, surfaces, layering, async buttons, and validation relationships were only partially codified. After Phase 1, those contracts are explicit and test-covered, existing component APIs remain compatible, and later page phases have a stable base without a broad visual rewrite.