- 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
- Change background from bg-background to bg-muted/60
- Add border-t-4 border-t-primary shadow-lg card accent
- Add favicon.svg logo above CardTitle
- Add auth.loginSubtitle below title
- Add Google SVG icon and GitHub SVG icon to OAuth buttons
- Add gap-2 to OAuth button className for icon/text spacing
- Add auth.loginSubtitle and auth.registerSubtitle to en.json and de.json
- 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
- 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>