- Derives first-run state from cached useCategories + useTemplate queries
- Returns { isFirstRun, loading } with no additional network calls
- isFirstRun true when categories or template items array is empty
- Loading guard prevents spurious redirects during fetch
- ALTER TABLE profiles ADD COLUMN setup_completed boolean NOT NULL DEFAULT false
- Backfill existing users with categories OR template items to true
- UNION covers edge case users with template items but no categories
- Add top-level presets key with presets.{type}.{slug} structure
- 19 English translations covering all 6 category types
- 19 German translations covering all 6 category types
- Both JSON files remain valid after edits
Tailwind v4 does not derive --radius-xs through --radius-3xl from --radius.
The named scale is independent, so Cards (rounded-xl), Buttons (rounded-md),
etc. retained non-zero border-radius despite --radius: 0. Adding all scale
tokens as 0 ensures complete sharp-corner cascade.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DashboardPage: space-y-6->space-y-8, gap-6->gap-8 in chart grid
- BudgetListPage: remove rounded-md from template toggle row
- BudgetDetailPage: remove rounded-sm/md from skeleton and group headings, rounded-md from summary box, rounded-full from category dot
- TemplatePage: remove rounded-sm/full/md from skeleton and group headings and category dot; gap-6->gap-8, space-y-6->space-y-8
- CategoriesPage: remove rounded-sm/full/md from skeleton and group headings; space-y-6->space-y-8
- QuickAddPage: remove rounded-full/md from skeleton items
- SettingsPage: space-y-4->space-y-6 in CardContent (skeleton and live)
- SpendBarChart: set radius={0} on both Bar elements (was radius={4})
- IncomeBarChart: set radius={0} on both Bar elements (was radius={[4,4,0,0]})
- ExpenseDonutChart: remove rounded-full from legend color dot className
- Set --radius: 0 for sharp-cornered design system cascade
- Warm background chroma from 0.005 to 0.01
- Delete --color-chart-1 through --color-chart-5 (redundant with fill vars)
- Raise fill chroma to 0.22+ for vibrant pastel category colors
- Add .recharts-rectangle and [data-sonner-toast] radius overrides
- Replace TierBadge and tier column with cleaner per-category grouping display
- Rewrite DifferenceCell with direction-aware diff logic (spending types: over when actual > budgeted; income/saving/investment: over when actual < budgeted)
- Replace text-green-600/text-red-600 with text-on-budget/text-over-budget semantic tokens
- Replace dot+h2 group headers with left-border accent headers matching dashboard style
- Fix headingLabel to use i18n.language via Intl.DateTimeFormat instead of hardcoded 'en'
- Wrap page in PageShell with locale-aware title and Add Item action button
- Add back-link as first child of PageShell with -mt-4 compensation
- Replace null loading state with PageShell + Skeleton groups
- Update group footer total label to use budgets.total i18n interpolation key
- Replace hardcoded MONTHS array with Intl.DateTimeFormat locale-aware monthItems useMemo
- Update budgetLabel helper to accept locale parameter and use Intl.DateTimeFormat
- Replace null loading state with PageShell + Skeleton rows
- Replace manual header with PageShell title and action prop
- Replace hardcoded 'Month'/'Year' Labels with t('budgets.month')/t('budgets.year')
- Add month/year/total keys to en.json and de.json budgets namespace