BUG FIX: parseDecimal ignored locale mismatch between currency and device.
CurrencyFormatter.locale(for: "EUR") could return any EUR locale (e.g.
en_IE with decimal='.'), causing "408857,62" to be parsed as 40,885,762.
New CurrencyFormatter.parseUserInput() uses digit-position detection:
a separator followed by ≤2 digits at the end is decimal, otherwise
it is a thousands separator. Fully locale-independent.
FEATURE: Contribution field now always visible in AddSnapshotView.
Previously gated behind inputMode == .detailed; now a toggle available
regardless of account mode.
FEATURE: BatchUpdateView pre-fills each text field with the source's
current value so the user only edits what changed. Adds an optional
contribution field per source row, persisted on save.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the simple progress bar with a custom milestone bar showing
individual circles for each achievement, filled when unlocked with a
checkmark indicator.
Fixes#27
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows a highlights card with the best and worst performing sources by
percentage change, displayed between the summary and reflection cards.
Fixes#22
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a source has been updated this cycle, shows the value change from the
previous snapshot in green (increase) or red (decrease).
Fixes#21
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds chevron buttons to navigate between months, similar to Lose It Log view.
The next month button is disabled when already at the current month.
Fixes#20
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>