diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index b1689cc..012b3e4 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -9,11 +9,11 @@ Requirements for this milestone. Each maps to roadmap phases. ### Design System -- [ ] **DSGN-01**: All shadcn CSS variables (primary, accent, muted, sidebar, chart-1 through chart-5) use pastel oklch values instead of zero-chroma neutrals -- [ ] **DSGN-02**: Semantic category color tokens defined in a single source of truth (`lib/palette.ts`) replacing scattered hardcoded hex and Tailwind classes +- [x] **DSGN-01**: All shadcn CSS variables (primary, accent, muted, sidebar, chart-1 through chart-5) use pastel oklch values instead of zero-chroma neutrals +- [x] **DSGN-02**: Semantic category color tokens defined in a single source of truth (`lib/palette.ts`) replacing scattered hardcoded hex and Tailwind classes - [ ] **DSGN-03**: Dashboard card header gradients unified to a single pastel palette family - [ ] **DSGN-04**: Typography hierarchy established — FinancialOverview and AvailableBalance sections are visually dominant hero elements -- [ ] **DSGN-05**: Consistent positive/negative amount coloring across all tables and summaries (green for positive, destructive for negative, amber for over-budget) +- [x] **DSGN-05**: Consistent positive/negative amount coloring across all tables and summaries (green for positive, destructive for negative, amber for over-budget) ### Auth Screens @@ -89,11 +89,11 @@ Which phases cover which requirements. Updated during roadmap creation. | Requirement | Phase | Status | |-------------|-------|--------| -| DSGN-01 | Phase 1 | Pending | -| DSGN-02 | Phase 1 | Pending | +| DSGN-01 | Phase 1 | Complete | +| DSGN-02 | Phase 1 | Complete | | DSGN-03 | Phase 1 | Pending | | DSGN-04 | Phase 1 | Pending | -| DSGN-05 | Phase 1 | Pending | +| DSGN-05 | Phase 1 | Complete | | FIX-02 | Phase 1 | Pending | | AUTH-01 | Phase 2 | Pending | | AUTH-02 | Phase 2 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index c4ac8fe..630d414 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -29,7 +29,7 @@ Decimal phases appear between their surrounding integers in numeric order. 3. FinancialOverview and AvailableBalance render as visually dominant hero elements with clear typographic hierarchy above secondary content 4. Amount values across all tables and summaries show green for positive, destructive red for negative, and amber for over-budget — applied consistently 5. A single `lib/palette.ts` file exists as the source of truth for all category-to-color mappings; `InlineEditCell.tsx` is extracted as a shared component replacing three duplicated local definitions -**Plans:** 2 plans +**Plans:** 1/2 plans executed Plans: - [ ] 01-01-PLAN.md — CSS token foundation, palette.ts module, and test infrastructure - [ ] 01-02-PLAN.md — Component wiring, InlineEditCell extraction, and visual verification @@ -75,7 +75,7 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 | Phase | Plans Complete | Status | Completed | |-------|----------------|--------|-----------| -| 1. Design Token Foundation | 0/2 | Planning complete | - | +| 1. Design Token Foundation | 1/2 | In Progress| | | 2. Layout and Brand Identity | 0/TBD | Not started | - | | 3. Interaction Quality and Completeness | 0/TBD | Not started | - | | 4. Chart Polish and Bug Fixes | 0/TBD | Not started | - | diff --git a/.planning/STATE.md b/.planning/STATE.md index c0e8c5a..60478a6 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,14 +3,14 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: planning -stopped_at: Phase 1 context gathered -last_updated: "2026-03-11T18:13:04.673Z" +stopped_at: Completed 01-design-token-foundation-01-01-PLAN.md +last_updated: "2026-03-11T19:54:14.531Z" last_activity: 2026-03-11 — Roadmap created from requirements and research progress: total_phases: 4 completed_phases: 0 - total_plans: 0 - completed_plans: 0 + total_plans: 2 + completed_plans: 1 percent: 0 --- @@ -50,6 +50,7 @@ Progress: [░░░░░░░░░░] 0% - Trend: - *Updated after each plan completion* +| Phase 01-design-token-foundation P01 | 4 | 3 tasks | 6 files | ## Accumulated Context @@ -61,6 +62,9 @@ Recent decisions affecting current work: - [Init]: Customize shadcn via CSS variables only — never edit `src/components/ui/` source files directly - [Init]: `lib/palette.ts` as single source of truth for all category-to-color mappings — no hex values in component files - [Init]: Extract `InlineEditCell.tsx` at start of Phase 1 before any visual work touches the three duplicated components +- [Phase 01-design-token-foundation]: oklch pastel tokens replace zero-chroma neutrals in :root; --card/--popover remain pure white (locked) +- [Phase 01-design-token-foundation]: --success and --warning semantic tokens added to :root and @theme inline; chart tokens synced with palette.ts base colors +- [Phase 01-design-token-foundation]: palette.ts is single source of truth for 7 category types x 3 shades; amountColorClass returns text-success/text-warning/text-destructive ### Pending Todos @@ -73,6 +77,6 @@ None yet. ## Session Continuity -Last session: 2026-03-11T18:13:04.672Z -Stopped at: Phase 1 context gathered -Resume file: .planning/phases/01-design-token-foundation/01-CONTEXT.md +Last session: 2026-03-11T19:54:14.530Z +Stopped at: Completed 01-design-token-foundation-01-01-PLAN.md +Resume file: None diff --git a/.planning/config.json b/.planning/config.json index 1e4156f..578f403 100644 --- a/.planning/config.json +++ b/.planning/config.json @@ -8,6 +8,7 @@ "research": true, "plan_check": true, "verifier": true, - "nyquist_validation": true + "nyquist_validation": true, + "_auto_chain_active": false } -} +} \ No newline at end of file diff --git a/.planning/phases/01-design-token-foundation/01-01-SUMMARY.md b/.planning/phases/01-design-token-foundation/01-01-SUMMARY.md new file mode 100644 index 0000000..db103bb --- /dev/null +++ b/.planning/phases/01-design-token-foundation/01-01-SUMMARY.md @@ -0,0 +1,109 @@ +--- +phase: 01-design-token-foundation +plan: 01 +subsystem: frontend/design-tokens +tags: [css-variables, oklch, tailwind, palette, vitest, tdd] +dependency_graph: + requires: [] + provides: + - pastel oklch CSS variable system in index.css + - palette.ts typed category color module + - vitest test infrastructure + affects: + - frontend/src/index.css + - frontend/src/lib/palette.ts + - All future component visual work in Plan 02 +tech_stack: + added: + - vitest@4.0.18 + - "@testing-library/react@16.3.2" + - "@testing-library/jest-dom@6.9.1" + - "@testing-library/user-event@14.6.1" + - jsdom@28.1.0 + patterns: + - oklch pastel color tokens with non-zero chroma in :root + - Single-source-of-truth palette module with typed exports + - TDD with vitest globals and jsdom environment +key_files: + created: + - frontend/src/lib/palette.ts + - frontend/src/lib/palette.test.ts + - frontend/src/test-setup.ts + modified: + - frontend/src/index.css + - frontend/vite.config.ts + - frontend/package.json +decisions: + - "oklch pastel tokens replace all zero-chroma neutrals in :root (--card and --popover remain pure white as locked)" + - "--success (oklch 0.55 0.15 145) and --warning (oklch 0.70 0.14 75) semantic tokens added to :root and registered in @theme inline" + - "--chart-1 through --chart-5 values synced with palette.ts base colors for bill, variable_expense, debt, saving, investment categories" + - "palette.ts exports amountColorClass() with isIncome/isAvailable path (positive=text-success, negative=text-destructive) and expense path (over-budget=text-warning)" +metrics: + duration: "~4 minutes" + completed_date: "2026-03-11" + tasks_completed: 3 + files_created: 3 + files_modified: 3 +--- + +# Phase 1 Plan 01: Design Token Foundation Summary + +Pastel oklch CSS variable system and palette.ts module established as the foundation layer for all subsequent visual work, with vitest test infrastructure installed and 20 unit tests passing. + +## Tasks Completed + +| Task | Name | Commit | Files | +|------|------|--------|-------| +| 1 | Install test infrastructure and set up vitest | cbf3552 | frontend/package.json, frontend/vite.config.ts, frontend/src/test-setup.ts | +| 2 | Replace CSS tokens with pastel oklch values and add success/warning tokens | 3f97d07 | frontend/src/index.css | +| 3 | Create palette.ts and palette.test.ts (TDD) | d5fc10d (RED), 6859b30 (GREEN) | frontend/src/lib/palette.ts, frontend/src/lib/palette.test.ts | + +## What Was Built + +**Pastel CSS variable system (`frontend/src/index.css`):** +- All `:root` tokens now use oklch values with non-zero chroma (lavender tint, hue ~280-290) except for the intentionally pure-white `--card` and `--popover` +- `--chart-1` through `--chart-5` mapped to category base colors (bill=blue 250, variable_expense=amber 85, debt=rose 15, saving=violet 280, investment=pink 320) +- New `--success` (green 145) and `--warning` (amber 75) semantic tokens in `:root` +- `--color-success` and `--color-warning` registered in `@theme inline` enabling Tailwind utilities `text-success`, `text-warning` + +**Typed palette module (`frontend/src/lib/palette.ts`):** +- `CategoryType` union: income | bill | variable_expense | debt | saving | investment | carryover +- `CategoryShades` interface with light/medium/base oklch strings +- `palette` Record — single source of truth, base colors match CSS chart tokens +- `headerGradient(type)` — returns `React.CSSProperties` with `linear-gradient(to right, light, medium)` +- `overviewHeaderGradient()` — multi-stop gradient (carryover.light → saving.light → income.light) +- `amountColorClass(opts)` — returns `text-success`/`text-warning`/`text-destructive`/`''` per locked rules + +**Test infrastructure:** +- vitest 4.0.18 with jsdom environment and globals +- `test-setup.ts` imports `@testing-library/jest-dom` matchers +- 20 unit tests covering all exports and edge cases — all passing + +## Decisions Made + +1. `--card` and `--popover` intentionally remain `oklch(1 0 0)` (pure white) per locked design decision — cards float visually on the tinted background +2. `--success-foreground` and `--warning-foreground` use near-white `oklch(0.99 0 0)` — neutral foreground on colored semantic backgrounds is correct and intentional +3. Sidebar tokens use slightly deeper lavender (hue 280, chroma 0.01-0.02) vs background (hue 290, chroma 0.005) for subtle visual distinction +4. `overviewHeaderGradient()` uses carryover/saving/income lights (sky→lavender→green) for the FinancialOverview header identity + +## Deviations from Plan + +None - plan executed exactly as written. + +## Self-Check + +### Files Exist + +- frontend/src/lib/palette.ts: FOUND +- frontend/src/lib/palette.test.ts: FOUND +- frontend/src/test-setup.ts: FOUND +- frontend/src/index.css: FOUND (modified) + +### Commits Exist + +- cbf3552 (Task 1): FOUND +- 3f97d07 (Task 2): FOUND +- d5fc10d (Task 3 RED): FOUND +- 6859b30 (Task 3 GREEN): FOUND + +## Self-Check: PASSED