- Replace hardcoded current month with useMonthParam (URL search params)
- Add MonthNavigator in PageShell action slot
- Replace old recharts pie + progress bars with ExpenseDonutChart, IncomeBarChart, SpendBarChart
- Add empty-month prompt with create/generate buttons
- Memoize all derived data with useMemo
- Move QuickAddPicker below chart grid per plan
- SUMMARY.md with task commits, deviations, and self-check
- STATE.md updated with phase 2 position and decisions
- ROADMAP.md updated with plan progress
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- IncomeBarChart: vertical grouped bars (budgeted muted, actual vivid)
- SpendBarChart: horizontal bars via layout="vertical" with swapped axes
- Both use per-cell conditional fill for over-budget red accent
- Both use ChartContainer + ChartConfig for CSS variable theming
- Both handle empty data with ChartEmptyState placeholder
- ChartLegend and ChartTooltip with formatted currency values
- Donut chart with innerRadius/outerRadius, center total label via formatCurrency
- Active sector expansion on hover via activeShape + Sector
- Custom legend below chart with color dots and formatted amounts
- CSS variable fills via ChartConfig (no hardcoded hex values)
- Empty state: ChartEmptyState placeholder when no data
- Zero-amount state: neutral muted ring with $0 center label
- ChartEmptyState shared component created (Rule 3: blocking dependency from Plan 01)
- useMonthParam reads/writes month URL search param with YYYY-MM fallback
- navigateMonth handles year rollover via Date constructor
- MonthNavigator renders prev/next arrows with Select dropdown
- Dropdown lists available budget months with locale-aware formatting
- Add 01-01-SUMMARY.md with execution results and self-check
- Update STATE.md with position, decisions, and metrics
- Update ROADMAP.md with plan progress
- Log pre-existing lint errors to deferred-items.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Darken 6 category color tokens for WCAG 4.5:1 text contrast
- Add semantic status tokens: over-budget, on-budget, budget-bar-bg
- Add 6 chart fill variants for lighter non-text fills
- Add 6 new dashboard i18n keys (carryover, vsBudget, overBudget, underBudget, onTrack, loading) to en.json and de.json at parity
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Map all 13 active requirements to a foundation-first delivery
sequence: design primitives, dashboard charts, collapsible
sections, then full-app consistency.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Created QuickAddPicker component using DropdownMenu (no Popover available)
- Picker fetches quick-add library on mount and shows items with icon + name
- On item select: finds or creates matching category, then creates one_off budget item
- Empty state shows link to /quick-add management page
- Loading spinner on selected item while creating
- Wired QuickAddPicker into DashboardPage toolbar next to Create Budget button
- Added QuickAddItem interface and quickAdd namespace to api.ts
- Created useQuickAdd hook with CRUD operations following useTemplate pattern
- Created QuickAddPage with amber/orange gradient header, add form, inline edit, and EmptyState
- Added /quick-add route to App.tsx with QuickAddPage import
- Added Zap nav item to AppLayout sidebar after template
- Added quickAdd i18n keys to en.json and de.json including picker keys
- Add ListQuickAddItems, CreateQuickAddItem, UpdateQuickAddItem, DeleteQuickAddItem handler methods
- Register GET/POST /api/quick-add and PUT/DELETE /api/quick-add/{itemId} in authenticated route group
- Validate name non-empty on create and update; return 404 on update when item not found
- Create 003_quick_add_library.sql with quick_add_items table and user index
- Add QuickAddItem struct to models.go following Category pattern
- Add ListQuickAddItems, CreateQuickAddItem, UpdateQuickAddItem, DeleteQuickAddItem to queries.go
- Add Badge import to BillsTracker, VariableExpenses, DebtTracker
- Render outline Badge after category name showing tier (Fixed/Variable/One-off)
- Use i18n keys template.fixed, template.variable, template.oneOff
- Badge is purely informational with variant="outline" for subtle appearance
- Create TemplatePage with add form (category/tier/amount), items table, and empty state
- Add /template route to App.tsx with TemplatePage component
- Add Template nav item to sidebar (between Categories and Settings)
- Add template and nav.template i18n keys for EN and DE
- Fix unused import in useTemplate hook
- Add ItemTier type and TemplateItem/TemplateDetail interfaces to api.ts
- Add item_tier field to BudgetItem interface
- Add template API object with get/updateName/addItem/updateItem/deleteItem/reorder
- Add generate function to budgets API object
- Create useTemplate hook with CRUD operations and reorder logic
- Add /api/template route group: GET, PUT /, POST/PUT/DELETE items, PUT items/reorder
- Add POST /api/budgets/generate before /{id} routes to avoid chi treating 'generate' as an id param
- /items/reorder registered before /items/{itemId} for correct static-before-param routing