- Add CATEGORY_TYPES_ALL constant and isOverBudget direction-aware helper
- Derive groupedSections via useMemo (filters empty groups, computes totals)
- Initialize openSections state with smart defaults (over-budget expanded)
- State resets on month navigation via key={budgetId} on DashboardContent
- Insert CollapsibleSections between chart grid and QuickAdd
- Add skeleton placeholders for collapsible sections area in DashboardSkeleton
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add collapsible-open/close keyframes and CSS animation tokens to index.css
- Add dashboard.sections and dashboard.carryoverIncludes keys to en.json and de.json
- Add optional subtitle/subtitleClassName props to StatCard
- Extend SummaryStrip balance prop with carryoverSubtitle/carryoverIsNegative
- Compute and pass carryover subtitle from DashboardContent to SummaryStrip
- 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