flashRowId and errorRowId state vars (both string | null)
triggerFlash(id, type) helper that sets the appropriate ID and clears it after 600ms via setTimeout
Inline style on each data <TableRow> using color-mix(in oklch, var(--success/--destructive) 20%, transparent) — avoids relying on Tailwind JIT to generate flash classes at runtime
onSaveSuccess and onSaveError callbacks wired to each <InlineEditCell>, calling triggerFlash with the item's ID
The totals row is untouched. Only data rows get the flash style.
DashboardPage: The loading skeleton block (shown before any budget list loads) now uses palette-tinted Skeleton elements:
palette.saving.light for the main overview skeleton
palette.bill.light / palette.variable_expense.light in a 2-col grid row
palette.debt.light / palette.investment.light in a second 2-col grid row
Tracker empty states: Each tracker now renders a Card with a tinted skeleton placeholder instead of returning null (DebtTracker) or an empty table (BillsTracker, VariableExpenses) when the budget has no items of that category type:
BillsTracker: 3 skeleton rows tinted with palette.bill.light
VariableExpenses: 3 skeleton rows tinted with palette.variable_expense.light
DebtTracker: 3 skeleton rows tinted with palette.debt.light
Deviations from Plan
Auto-combined Changes
Task 2 tracker skeleton was combined with Task 1: The plan listed skeleton addition as part of Task 2, but since Task 1 already touched all three tracker files, the skeleton empty-state logic was added in the same edit pass to avoid double-touching files. Both tasks' tracker changes were committed together in Task 1's commit. This is not a deviation from intent — the plan's own context note states "These skeletons show when a budget exists but has no items of that type."
[Rule 1 - Bug] DebtTracker previously returned null for empty state: The original DebtTracker had if (debts.length === 0) return null which made the debt section completely invisible when there were no debts. Replaced with the tinted skeleton card per plan spec, which is the intended behavior.