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:
2026-03-11 21:20:19 +01:00
parent 90a15c20ce
commit fddd8d1ea8
4 changed files with 167 additions and 15 deletions

View 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*