docs(01-02): complete palette wiring plan — all 6 dashboard components use design tokens
- Created 01-02-SUMMARY.md documenting InlineEditCell extraction and palette integration - Updated STATE.md: progress bar 100%, decisions logged, session recorded - Updated ROADMAP.md: Phase 1 marked Complete (2/2 plans) - Marked requirements DSGN-03, DSGN-04, FIX-02 complete in REQUIREMENTS.md
This commit is contained in:
@@ -11,8 +11,8 @@ Requirements for this milestone. Each maps to roadmap phases.
|
|||||||
|
|
||||||
- [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-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
|
- [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
|
- [x] **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
|
- [x] **DSGN-04**: Typography hierarchy established — FinancialOverview and AvailableBalance sections are visually dominant hero elements
|
||||||
- [x] **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
|
### Auth Screens
|
||||||
@@ -46,7 +46,7 @@ Requirements for this milestone. Each maps to roadmap phases.
|
|||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
- [ ] **FIX-01**: `formatCurrency` uses the user's locale preference instead of hardcoded `de-DE`
|
- [ ] **FIX-01**: `formatCurrency` uses the user's locale preference instead of hardcoded `de-DE`
|
||||||
- [ ] **FIX-02**: `InlineEditRow` extracted into a shared component (currently duplicated in BillsTracker, VariableExpenses, DebtTracker)
|
- [x] **FIX-02**: `InlineEditRow` extracted into a shared component (currently duplicated in BillsTracker, VariableExpenses, DebtTracker)
|
||||||
|
|
||||||
## v2 Requirements
|
## v2 Requirements
|
||||||
|
|
||||||
@@ -91,10 +91,10 @@ Which phases cover which requirements. Updated during roadmap creation.
|
|||||||
|-------------|-------|--------|
|
|-------------|-------|--------|
|
||||||
| DSGN-01 | Phase 1 | Complete |
|
| DSGN-01 | Phase 1 | Complete |
|
||||||
| DSGN-02 | Phase 1 | Complete |
|
| DSGN-02 | Phase 1 | Complete |
|
||||||
| DSGN-03 | Phase 1 | Pending |
|
| DSGN-03 | Phase 1 | Complete |
|
||||||
| DSGN-04 | Phase 1 | Pending |
|
| DSGN-04 | Phase 1 | Complete |
|
||||||
| DSGN-05 | Phase 1 | Complete |
|
| DSGN-05 | Phase 1 | Complete |
|
||||||
| FIX-02 | Phase 1 | Pending |
|
| FIX-02 | Phase 1 | Complete |
|
||||||
| AUTH-01 | Phase 2 | Pending |
|
| AUTH-01 | Phase 2 | Pending |
|
||||||
| AUTH-02 | Phase 2 | Pending |
|
| AUTH-02 | Phase 2 | Pending |
|
||||||
| AUTH-03 | Phase 2 | Pending |
|
| AUTH-03 | Phase 2 | Pending |
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ This milestone transforms a functional but visually generic finance dashboard in
|
|||||||
|
|
||||||
Decimal phases appear between their surrounding integers in numeric order.
|
Decimal phases appear between their surrounding integers in numeric order.
|
||||||
|
|
||||||
- [ ] **Phase 1: Design Token Foundation** - Establish the pastel CSS variable system and semantic color tokens that all subsequent phases depend on
|
- [x] **Phase 1: Design Token Foundation** - Establish the pastel CSS variable system and semantic color tokens that all subsequent phases depend on (completed 2026-03-11)
|
||||||
- [ ] **Phase 2: Layout and Brand Identity** - Polish the surfaces users see on every page load — login, sidebar, card headers, typography
|
- [ ] **Phase 2: Layout and Brand Identity** - Polish the surfaces users see on every page load — login, sidebar, card headers, typography
|
||||||
- [ ] **Phase 3: Interaction Quality and Completeness** - Add loading, empty, and error states plus inline edit affordances to eliminate the "unfinished" feeling
|
- [ ] **Phase 3: Interaction Quality and Completeness** - Add loading, empty, and error states plus inline edit affordances to eliminate the "unfinished" feeling
|
||||||
- [ ] **Phase 4: Chart Polish and Bug Fixes** - Finalize chart styling with semantic colors, formatted tooltips, and fix the currency locale bug
|
- [ ] **Phase 4: Chart Polish and Bug Fixes** - Finalize chart styling with semantic colors, formatted tooltips, and fix the currency locale bug
|
||||||
@@ -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
|
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
|
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
|
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:** 1/2 plans executed
|
**Plans:** 2/2 plans complete
|
||||||
Plans:
|
Plans:
|
||||||
- [ ] 01-01-PLAN.md — CSS token foundation, palette.ts module, and test infrastructure
|
- [ ] 01-01-PLAN.md — CSS token foundation, palette.ts module, and test infrastructure
|
||||||
- [ ] 01-02-PLAN.md — Component wiring, InlineEditCell extraction, and visual verification
|
- [ ] 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 |
|
| Phase | Plans Complete | Status | Completed |
|
||||||
|-------|----------------|--------|-----------|
|
|-------|----------------|--------|-----------|
|
||||||
| 1. Design Token Foundation | 1/2 | In Progress| |
|
| 1. Design Token Foundation | 2/2 | Complete | 2026-03-11 |
|
||||||
| 2. Layout and Brand Identity | 0/TBD | Not started | - |
|
| 2. Layout and Brand Identity | 0/TBD | Not started | - |
|
||||||
| 3. Interaction Quality and Completeness | 0/TBD | Not started | - |
|
| 3. Interaction Quality and Completeness | 0/TBD | Not started | - |
|
||||||
| 4. Chart Polish and Bug Fixes | 0/TBD | Not started | - |
|
| 4. Chart Polish and Bug Fixes | 0/TBD | Not started | - |
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ gsd_state_version: 1.0
|
|||||||
milestone: v1.0
|
milestone: v1.0
|
||||||
milestone_name: milestone
|
milestone_name: milestone
|
||||||
status: planning
|
status: planning
|
||||||
stopped_at: Completed 01-design-token-foundation-01-01-PLAN.md
|
stopped_at: Completed 01-design-token-foundation-01-02-PLAN.md
|
||||||
last_updated: "2026-03-11T19:54:14.531Z"
|
last_updated: "2026-03-11T20:19:46.068Z"
|
||||||
last_activity: 2026-03-11 — Roadmap created from requirements and research
|
last_activity: 2026-03-11 — Roadmap created from requirements and research
|
||||||
progress:
|
progress:
|
||||||
total_phases: 4
|
total_phases: 4
|
||||||
completed_phases: 0
|
completed_phases: 1
|
||||||
total_plans: 2
|
total_plans: 2
|
||||||
completed_plans: 1
|
completed_plans: 2
|
||||||
percent: 0
|
percent: 0
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -51,6 +51,7 @@ Progress: [░░░░░░░░░░] 0%
|
|||||||
|
|
||||||
*Updated after each plan completion*
|
*Updated after each plan completion*
|
||||||
| Phase 01-design-token-foundation P01 | 4 | 3 tasks | 6 files |
|
| Phase 01-design-token-foundation P01 | 4 | 3 tasks | 6 files |
|
||||||
|
| Phase 01-design-token-foundation P02 | 60 | 3 tasks | 8 files |
|
||||||
|
|
||||||
## Accumulated Context
|
## Accumulated Context
|
||||||
|
|
||||||
@@ -65,6 +66,9 @@ Recent decisions affecting current work:
|
|||||||
- [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]: 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]: --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
|
- [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
|
||||||
|
- [Phase 01-design-token-foundation]: InlineEditCell wraps TableCell internally — callers own row structure, component owns display/edit state
|
||||||
|
- [Phase 01-design-token-foundation]: amountColorClass() is the only allowed way to color amount cells — raw text-green/text-red classes banned in dashboard components
|
||||||
|
- [Phase 01-design-token-foundation]: Chart Cell fills use palette[type].base keyed by categoryType — charts and card headers share the same color token
|
||||||
|
|
||||||
### Pending Todos
|
### Pending Todos
|
||||||
|
|
||||||
@@ -77,6 +81,6 @@ None yet.
|
|||||||
|
|
||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-03-11T19:54:14.530Z
|
Last session: 2026-03-11T20:19:46.066Z
|
||||||
Stopped at: Completed 01-design-token-foundation-01-01-PLAN.md
|
Stopped at: Completed 01-design-token-foundation-01-02-PLAN.md
|
||||||
Resume file: None
|
Resume file: None
|
||||||
|
|||||||
148
.planning/phases/01-design-token-foundation/01-02-SUMMARY.md
Normal file
148
.planning/phases/01-design-token-foundation/01-02-SUMMARY.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
---
|
||||||
|
phase: 01-design-token-foundation
|
||||||
|
plan: 02
|
||||||
|
subsystem: ui
|
||||||
|
tags: [react, tailwind, shadcn, palette, design-tokens, oklch, typescript]
|
||||||
|
|
||||||
|
# Dependency graph
|
||||||
|
requires:
|
||||||
|
- phase: 01-design-token-foundation/01-01
|
||||||
|
provides: palette.ts with 7 category types × 3 shades, headerGradient, overviewHeaderGradient, amountColorClass, CSS oklch token variables
|
||||||
|
provides:
|
||||||
|
- InlineEditCell shared component replacing 3 duplicate InlineEditRow functions
|
||||||
|
- All 6 dashboard components wired to palette.ts (no hardcoded Tailwind color classes)
|
||||||
|
- Category-specific pastel gradient card headers (bill, variable_expense, debt, saving)
|
||||||
|
- Hero typography and padding for FinancialOverview and AvailableBalance
|
||||||
|
- Amount coloring via semantic tokens (text-success, text-warning, text-destructive)
|
||||||
|
- Category-tinted rows in FinancialOverview using palette[type].light
|
||||||
|
- Chart fills use palette[type].base instead of hardcoded PASTEL_COLORS array
|
||||||
|
affects:
|
||||||
|
- Phase 2 (any work on BillsTracker, VariableExpenses, DebtTracker, AvailableBalance, ExpenseBreakdown, FinancialOverview)
|
||||||
|
- Phase 3 (category management UI must import from palette.ts for color display)
|
||||||
|
- Any future component that renders category data
|
||||||
|
|
||||||
|
# Tech tracking
|
||||||
|
tech-stack:
|
||||||
|
added: []
|
||||||
|
patterns:
|
||||||
|
- TDD for UI components with @testing-library/react and @testing-library/user-event
|
||||||
|
- Shared TableCell edit component pattern (InlineEditCell) for inline editing
|
||||||
|
- palette.ts as single color import point — no direct color values in component files
|
||||||
|
|
||||||
|
key-files:
|
||||||
|
created:
|
||||||
|
- frontend/src/components/InlineEditCell.tsx
|
||||||
|
- frontend/src/components/InlineEditCell.test.tsx
|
||||||
|
modified:
|
||||||
|
- frontend/src/components/BillsTracker.tsx
|
||||||
|
- frontend/src/components/VariableExpenses.tsx
|
||||||
|
- frontend/src/components/DebtTracker.tsx
|
||||||
|
- frontend/src/components/AvailableBalance.tsx
|
||||||
|
- frontend/src/components/ExpenseBreakdown.tsx
|
||||||
|
- frontend/src/components/FinancialOverview.tsx
|
||||||
|
|
||||||
|
key-decisions:
|
||||||
|
- "InlineEditCell extracted as shared TableCell-wrapping component — callers own the row structure, InlineEditCell owns only the actual-amount cell"
|
||||||
|
- "amountColorClass() is the only allowed way to color amount cells — raw text-green/text-red classes are banned in dashboard components"
|
||||||
|
- "Chart Cell fills use palette[type].base keyed by categoryType — charts and card headers share the same color token"
|
||||||
|
- "Hero sizing locked: FinancialOverview and AvailableBalance use px-6 py-5 + text-2xl; other cards use px-4 py-3 + text-base"
|
||||||
|
|
||||||
|
patterns-established:
|
||||||
|
- "Pattern: All category color decisions flow from palette.ts — components never define colors directly"
|
||||||
|
- "Pattern: InlineEditCell wraps <TableCell> and manages display/edit state internally — callers only provide value, currency, and onSave"
|
||||||
|
- "Pattern: Semantic color tokens (text-success, text-warning, text-destructive) for amount coloring — no raw Tailwind color utilities"
|
||||||
|
|
||||||
|
requirements-completed: [DSGN-03, DSGN-04, DSGN-05, FIX-02]
|
||||||
|
|
||||||
|
# Metrics
|
||||||
|
duration: ~60min (multi-session with checkpoint)
|
||||||
|
completed: 2026-03-11
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 1 Plan 02: Wire Palette into Dashboard Components Summary
|
||||||
|
|
||||||
|
**Pastel design token system wired into all 6 dashboard components — InlineEditCell extracted, category gradients applied, amount coloring via semantic tokens, user-approved visual result**
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
- **Duration:** ~60 min (multi-session including visual verification checkpoint)
|
||||||
|
- **Started:** 2026-03-11
|
||||||
|
- **Completed:** 2026-03-11
|
||||||
|
- **Tasks:** 3 (TDD tasks 1A/1B/1C + build verification + visual checkpoint)
|
||||||
|
- **Files modified:** 8
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
|
||||||
|
- Extracted `InlineEditCell` as a single shared component, eliminating 3 duplicate `InlineEditRow` private functions from BillsTracker, VariableExpenses, and DebtTracker
|
||||||
|
- Wired `palette.ts` into all 6 dashboard components — card headers now use `headerGradient(type)` and `overviewHeaderGradient()` instead of hardcoded Tailwind gradient classes
|
||||||
|
- Amount coloring applied via `amountColorClass()` returning semantic tokens (`text-success`, `text-warning`, `text-destructive`) — no raw color utilities remain
|
||||||
|
- Chart fills (donut and bar) use `palette[type].base` keyed by `categoryType`, so charts and card headers share the same color token
|
||||||
|
- FinancialOverview rows tinted with `palette[type].light` per category
|
||||||
|
- User confirmed visual approval: "the colors are a lot better"
|
||||||
|
|
||||||
|
## Task Commits
|
||||||
|
|
||||||
|
Each task was committed atomically:
|
||||||
|
|
||||||
|
1. **Task 1A (RED) — InlineEditCell failing tests** - `bb36aeb` (test)
|
||||||
|
2. **Task 1B (GREEN) — InlineEditCell implementation** - `689c88f` (feat)
|
||||||
|
3. **Task 1C — Wire palette into all 6 components** - `07041ae` (feat)
|
||||||
|
4. **Task 2 — Build verification + TypeScript fixes** - `90a15c2` (fix)
|
||||||
|
5. **Task 3 — Visual verification checkpoint** - user approved (no code commit required)
|
||||||
|
|
||||||
|
_Note: TDD task split into test commit (RED) then feat commit (GREEN) per TDD protocol_
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
|
||||||
|
- `frontend/src/components/InlineEditCell.tsx` - Shared inline edit TableCell component (display mode + click-to-edit)
|
||||||
|
- `frontend/src/components/InlineEditCell.test.tsx` - Unit tests: display, click-to-edit, onSave on blur/Enter, no-op when unchanged
|
||||||
|
- `frontend/src/components/BillsTracker.tsx` - InlineEditRow removed, InlineEditCell + headerGradient('bill') + amountColorClass
|
||||||
|
- `frontend/src/components/VariableExpenses.tsx` - InlineEditRow removed, InlineEditCell + headerGradient('variable_expense') + amountColorClass
|
||||||
|
- `frontend/src/components/DebtTracker.tsx` - InlineEditRow removed, InlineEditCell + headerGradient('debt') + amountColorClass
|
||||||
|
- `frontend/src/components/AvailableBalance.tsx` - PASTEL_COLORS removed, headerGradient('saving'), palette-keyed Cell fills, hero typography
|
||||||
|
- `frontend/src/components/ExpenseBreakdown.tsx` - PASTEL_COLORS removed, headerGradient('debt'), palette-keyed Cell fills
|
||||||
|
- `frontend/src/components/FinancialOverview.tsx` - overviewHeaderGradient(), hero typography, category-tinted rows, amountColorClass on actual column
|
||||||
|
|
||||||
|
## Decisions Made
|
||||||
|
|
||||||
|
- InlineEditCell wraps `<TableCell>` internally so callers only manage the row structure; the component owns display/edit state
|
||||||
|
- ExpenseBreakdown uses `headerGradient('debt')` (rose/red palette) since it shows expense breakdown — consistent with debt category visual language
|
||||||
|
- Layout concerns (card arrangement, grid sizing) deferred — user noted them but they are out of scope for this phase
|
||||||
|
- TypeScript fixes during Task 2 committed as a `fix` type to separate them from the feature work
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
### Auto-fixed Issues
|
||||||
|
|
||||||
|
**1. [Rule 1 - Bug] TypeScript type errors after palette wiring**
|
||||||
|
- **Found during:** Task 2 (build verification)
|
||||||
|
- **Issue:** TypeScript strict mode flagged type mismatches introduced when palette functions were integrated into components
|
||||||
|
- **Fix:** Corrected type annotations and prop types to satisfy the TypeScript compiler
|
||||||
|
- **Files modified:** Multiple dashboard components
|
||||||
|
- **Verification:** `bun run build` completed with zero errors
|
||||||
|
- **Committed in:** `90a15c2` (Task 2 fix commit)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Total deviations:** 1 auto-fixed (Rule 1 - Bug)
|
||||||
|
**Impact on plan:** Type fix was necessary for production build correctness. No scope creep.
|
||||||
|
|
||||||
|
## Issues Encountered
|
||||||
|
|
||||||
|
- TypeScript strict mode surfaced type mismatches when palette functions (returning `React.CSSProperties` and string unions) were integrated into components that had looser typing — resolved in Task 2.
|
||||||
|
- User mentioned layout concerns during visual review; these are out of scope for this phase and were not acted on.
|
||||||
|
|
||||||
|
## User Setup Required
|
||||||
|
|
||||||
|
None - no external service configuration required.
|
||||||
|
|
||||||
|
## Next Phase Readiness
|
||||||
|
|
||||||
|
- All 6 dashboard components now consume design tokens from `palette.ts` — Phase 2 work can build on this foundation without touching color logic
|
||||||
|
- `InlineEditCell` is available as a shared component for any future table that needs inline editing
|
||||||
|
- The semantic token system (`text-success`, `text-warning`, `text-destructive`) is established and ready for reuse
|
||||||
|
- Phase 3 category management UI should import category colors from `palette.ts` for visual consistency
|
||||||
|
|
||||||
|
---
|
||||||
|
*Phase: 01-design-token-foundation*
|
||||||
|
*Completed: 2026-03-11*
|
||||||
Reference in New Issue
Block a user