- Import useAuth in DashboardPage and derive userLocale with fallback to 'en'
- Pass locale={userLocale} to AvailableBalance and ExpenseBreakdown
- Add useAuth mock to DashboardPage test to avoid i18n initReactI18next import error
- Add locale?: string prop to ExpenseBreakdown and AvailableBalance
- Replace bare <Tooltip /> in ExpenseBreakdown with custom content renderer
- Add Tooltip import and custom content renderer to AvailableBalance
- Pass locale to formatCurrency in AvailableBalance center text
- Tooltip styled with shadcn design tokens (bg-background, border-border/50, shadow-xl)
- Test English default locale uses comma grouping (1,234.56)
- Test explicit 'en' locale formatting
- Test 'de' locale uses period grouping and comma decimal (1.234,56)
- Test USD with dollar sign
- Test zero and negative amounts
- Test empty string locale fallback (no RangeError)
- Test default arg does NOT produce German formatting
- Add flashRowId/errorRowId state and triggerFlash helper to BillsTracker, VariableExpenses, DebtTracker
- Apply inline color-mix style to data rows for green/red 600ms flash on save success/error
- Wire onSaveSuccess/onSaveError callbacks to InlineEditCell in all three components
- Add tinted skeleton placeholder (palette.*.light) when no items exist for the section
- Create 03-02-SUMMARY.md documenting EmptyState component and delete confirmation dialog
- Update STATE.md with progress (88%), decisions, and session info
- Update ROADMAP.md with Phase 3 plan progress (3/4 summaries)
- Create shared EmptyState component with icon, heading, subtext, and optional CTA button
- DashboardPage: show EmptyState when no budgets exist with Create CTA; replace plain Card fallback with EmptyState for no-current-budget case
- CategoriesPage: add loading state to prevent empty-state flash on initial load; show EmptyState when no categories exist
- BudgetSetup.test.tsx: smoke test + 2 it.skip for IXTN-01 spinner/disable
- CategoriesPage.test.tsx: smoke test + 4 it.skip for IXTN-05 and STATE-02
- DashboardPage.test.tsx: smoke test + 2 it.skip for STATE-01 and STATE-03
- BillsTracker.test.tsx: smoke test + 3 it.skip for STATE-03 and IXTN-03
- Add Pencil icon in display mode (opacity-0, group-hover:opacity-100)
- Add onSaveSuccess optional callback fired after successful save
- Add onSaveError optional callback fired + value reverted on save failure
- Wrap onSave in try/catch in handleBlur
- Add SidebarTrigger import (NAV-04)
- Replace plain h2 with gradient span wordmark using oklch 260-300 purple sweep (NAV-02)
- Override SidebarMenuButton active state with sidebar-primary for high contrast (NAV-03)
- Add header bar with SidebarTrigger inside SidebarInset (NAV-04)
- Add p-4 padding to main content area
- NAV-01 satisfied by existing bg-sidebar token on sidebar element
- Fix palette.test.ts: use type-only import for CategoryType (verbatimModuleSyntax)
- Fix vite.config.ts: import defineConfig from vitest/config for test property support
- Fix tsconfig.node.json: add vitest/globals to types array
- Fix AvailableBalance.tsx: split typed array and filter to preserve CategoryType literal
- Shared TableCell with display/edit mode toggle
- Calls onSave(number) on blur or Enter key
- Skips save when value unchanged or NaN
- Accepts className for amount coloring
- renders formatted currency in display mode
- enters edit mode on click
- calls onSave with parsed number on blur/Enter
- does not call onSave when value unchanged
- Add 01-01-SUMMARY.md with full task record and decisions
- Update STATE.md with progress, decisions, and session info (50% phase complete)
- Update ROADMAP.md plan progress (phase 1: 1/2 plans done)
- Mark DSGN-01, DSGN-02, DSGN-05 requirements complete
- Export CategoryType union type with 7 category strings
- Export CategoryShades interface with light/medium/base fields
- Export palette Record with oklch values matching --chart-* CSS tokens
- Export headerGradient() returning CSSProperties with linear-gradient
- Export overviewHeaderGradient() with multi-stop sky/lavender/green gradient
- Export amountColorClass() for text-success/text-warning/text-destructive
- All 20 unit tests pass
- Tests cover all 7 CategoryType values with 3 shades each
- Tests for headerGradient returning valid CSSProperties with linear-gradient
- Tests for overviewHeaderGradient multi-stop gradient
- Tests for amountColorClass: income, available, and expense paths