Commit Graph

18 Commits

Author SHA1 Message Date
234a7d913a feat(06-02): display item_tier badge in tracker table rows
- 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
2026-03-12 13:09:27 +01:00
7dfd04f31b feat(06-02): replace BudgetSetup with template-based month picker
- Rewrite BudgetSetup to use month picker + currency + Generate button
- Remove manual form fields (name, dates, carryover, copy-from select)
- Handle 409 conflict gracefully by calling onCreated() to refresh list
- Remove copyFrom method from budgets API (TMPL-06)
- Update BudgetSetup test to reflect new month-picker UI
- Remove copyFrom from DashboardPage test mock
- Add budget.generate, budget.month, budget.generating i18n keys (EN/DE)
- Remove budget.copyFrom and budget.setup i18n keys
2026-03-12 13:08:46 +01:00
924e01c983 feat(06-01): add TemplatePage, routing, sidebar nav, and i18n translations
- 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
2026-03-12 13:04:52 +01:00
f141c4ff73 feat(04-02): add locale prop and custom currency tooltips to chart components
- 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)
2026-03-12 09:26:13 +01:00
4ef10dae46 feat(03-03): wire row flash feedback into all three tracker components
- 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
2026-03-11 22:36:01 +01:00
4fc63893b8 feat(03-02): add EmptyState component and wire into Dashboard and Categories pages
- 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
2026-03-11 22:32:34 +01:00
30ec2d5780 feat(03-01): add loading spinners to Login, Register, and BudgetSetup submit buttons
- LoginPage: Spinner replaces button text during loading, min-w-[120px] prevents layout shift
- RegisterPage: Spinner replaces button text during loading, min-w-[120px] prevents layout shift
- BudgetSetup: Spinner replaces create button text during saving, min-w-[120px] prevents layout shift
- All buttons remain disabled during loading/saving to prevent double-submit
2026-03-11 22:32:30 +01:00
c95c7f248e test(03-00): add Wave 0 test stub files for 4 components
- 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
2026-03-11 22:32:07 +01:00
d9e60fa90c feat(03-01): enhance InlineEditCell with pencil icon hover affordance and save/error callbacks
- 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
2026-03-11 22:31:20 +01:00
58bb57b1cc test(03-01): add failing tests for pencil icon, onSaveSuccess, and onSaveError callbacks 2026-03-11 22:31:02 +01:00
79a0f9bc3d feat(02-02): brand sidebar with wordmark, active indicator, and collapse trigger
- 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
2026-03-11 21:49:29 +01:00
9b57a1a4be test(02-02): add AppLayout test scaffold for NAV-01 through NAV-04
- Mock ResizeObserver and matchMedia for SidebarProvider compatibility
- NAV-01: verify sidebar data-sidebar element renders
- NAV-02: verify data-testid=sidebar-wordmark gradient element
- NAV-03: verify active nav item has data-active=true
- NAV-04: verify SidebarTrigger Toggle Sidebar button renders
2026-03-11 21:48:15 +01:00
dfd88de03e test(02-01): add failing tests for AUTH-01 through AUTH-04 and install shadcn Alert
- Install shadcn Alert component (alert.tsx)
- LoginPage.test.tsx: 4 test cases for gradient bg, wordmark, Alert error, SVG icon
- RegisterPage.test.tsx: 2 test cases for gradient bg, wordmark
- All tests fail as expected (features not yet implemented)
2026-03-11 21:47:57 +01:00
90a15c20ce fix(01-02): resolve TypeScript build errors for production build
- 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
2026-03-11 21:00:24 +01:00
07041aed34 feat(01-02): wire palette.ts into all 6 dashboard components
- BillsTracker: headerGradient('bill'), InlineEditCell, amountColorClass
- VariableExpenses: headerGradient('variable_expense'), InlineEditCell, amountColorClass, palette bar chart colors
- DebtTracker: headerGradient('debt'), InlineEditCell, amountColorClass
- AvailableBalance: headerGradient('saving'), palette Cell fills, text-3xl center, text-success/text-destructive
- ExpenseBreakdown: headerGradient('variable_expense'), palette Cell fills
- FinancialOverview: overviewHeaderGradient(), hero typography (text-2xl px-6 py-5), palette row tints, amountColorClass
- Remove all PASTEL_COLORS arrays and InlineEditRow private functions
2026-03-11 20:57:53 +01:00
689c88fc3e feat(01-02): implement InlineEditCell shared component
- 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
2026-03-11 20:56:19 +01:00
bb36aeb272 test(01-02): add failing tests for InlineEditCell
- 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
2026-03-11 20:56:04 +01:00
04cbb846d1 Init 2026-03-06 19:42:15 +00:00