`. *Empty states — don't leave users +hanging.* Add a muted icon + CTA "Add your first contribution." + +`app/components/savings/funding_accounts_breakdown_component.html.erb:12-26` +— **P2** — `space-y-3` between 3-line rows visually merges them. +*Spacing — list density.* Use `divide-y divide-subdued` or `space-y-4`. + +--- + +## 13. Empty state — first run + +`app/views/savings_goals/_empty_state.html.erb:3-29` — **P1** — Icon + +heading + body + button is functional but visually generic. *Empty +states — first-run sells the feature.* Replace the 32px target icon +with a muted hero illustration showing what a populated goal looks like. + +`app/views/savings_goals/_empty_state.html.erb:19-26` — **P0** — When +`linkable_account_count == 0`, CTA goes to `new_account_path` with no +return path. *Empty states — guide the flow.* After account creation +the user lands on /accounts/new redirects, not /savings_goals. Add +`?return_to=/savings_goals` and a 2-step preview ("1. Connect 2. Set"). + +`app/views/savings_goals/_empty_state.html.erb:5-7` — **P2** — Icon +container `bg-surface-inset` differs from `bg-container` by ~5% L\*. +*Depth.* Use `bg-app` to invert the relief (card > inset > icon). + +--- + +## 14. Mobile (375×667) + +`app/views/savings_goals/index.html.erb:11` — **P1** — KPI strip +collapses to single-column. *Dashboards — mobile collapse.* Three +stacked full-width cards read as a notifications page. 2x2 with one +spanning, or compact "stat lines" (eyebrow + numeral inline). + +`app/views/savings_goals/show.html.erb:33-78` — **P0** — Header action +group truncates the goal name on mobile (captured: "House …"). +*Hierarchy — action bar must collapse.* Demote Edit + kebab to a sheet; +keep only "Add contribution" visible. Name must always show. + +`app/views/savings_goals/show.html.erb:130` — **P1** — Stacked +ring/chart cards on mobile have no gap. *Spacing.* Add `space-y-3` on +the section so eye doesn't flow from "13%" into the chart axis. + +`app/views/savings_goals/_form_stepper.html.erb:155-176` — **P2** — +Continue button isn't sticky on mobile. *Forms — mobile primary CTA.* +After selecting accounts, user scrolls back up to find Continue. Make +the footer `sticky bottom-0` on mobile. + +--- + +## 15. Sidebar, breadcrumbs, header chrome + +`app/views/savings_goals/index.html.erb:2-4` — **P2** — Subtitle "Your +savings accounts and the goals you're working toward" shows every +visit. *Typography — page subtitles carry decoration not info.* Replace +with current-period context ("$2,940 saved in May 2026") or hide after +first visit. + +`config/locales/breadcrumbs/en.yml` (savings entry) — **P2** — +"Home › Savings › Goal name" on mobile wastes ~40px vertical. *Nav — +levels.* Drop "Home" on mobile or replace with a back chevron. + +`app/views/savings_goals/show.html.erb:2` — **P2** — No explicit "Back +to Savings" link near the H1. *Nav — back affordance.* The breadcrumb +is chrome, not content. Add an arrow-left button next to the avatar. + +--- + +## Top 10 ship-now + +1. `show.html.erb:86-89,98-101` **P0** — Resume/Restore banner CTAs + reimplement the primary button by hand. Replace with `DS::Button` so + focus/hover/disabled match. +2. `show.html.erb:33-78` mobile **P0** — Header truncates goal name on + mobile. Demote Edit + kebab to a sheet, keep only Add contribution. +3. `_form_stepper.html.erb:56-87` **P0** — Funding accounts list needs + an explicit hint *before* the user clicks Continue. +4. `_empty_state.html.erb:19-26` **P0** — No-accounts state needs a + return-to-savings_goals path after account creation + 2-step preview. +5. `index.html.erb:11-68` **P1** — Three equal-weight KPIs hide the one + answering "am I winning?". Elevate "Goals on track" to primary card. +6. `status_pill_component.rb:3-8` **P1** — Reached + on-track share + green; paused + no-target share grey. Give reached a gold accent; + give paused a true muted look. +7. `show.html.erb:130-140` + `goal_card_component.html.erb:8-41` **P1** + — Ring + numeric percent + dollar/target trio is redundant. Drop one. +8. `show.html.erb:81-127` **P1** — Paused + archived banners use + info-blue. Use neutral; reserve info-blue for actual info. +9. `index.html.erb:92-119` **P1** — Search/chip toolbar mismatch. Cap + search at `max-w-xs`, drop its border, add colored dots to chips. +10. `funding_accounts_breakdown_component.html.erb:4` **P1** — Stacked + bar `h-2` is too thin. `h-3` + 1px inset ring lifts it from + decoration to data. + +--- + +## Closing notes + +- Screenshots in `/Users/guillem.arias/Documents/gariasf/sure/audit-shots/`. +- No code edits made. Browser closed. +- Surfaces read from source rather than captured: add-contribution + modal, contribution delete-confirm, archived show, no-accounts empty + state, most mobile modal states. Findings still ground in real code.