Last reviewed: June 2026
Audience: Designers, product managers, engineers, AI agents
Purpose: Single source of truth for the gallery implementation of the Personal Loan application flow — what exists today, how tokens and components propagate, what remains, and how to complete a live end-to-end prototype without backend work.
Table of contents
- How this document relates to other docs
- Executive summary
- Project scope
- Environment and architecture
- Investigated items
- Step inventory (full audit)
- Design tokens — how changes apply
- Components — state and token coverage
- End-to-end connectivity today
- Risks and concerns
- Implementation plan (step-by-step)
- Validation and maintenance
- Appendix
1. How this document relates to other docs
| Document | Role |
|---|
| personal-loans-flow.md | Product routing spec — production step order, branches, footnotes (*, †, ‡), and assumptions |
| This document | Gallery implementation tracker — code status, gaps, token/component workflows, and phased build plan |
| personalLoanFlow.ts | Runtime registry — slugs, metadata, screen components, flow-map data |
| workflow-contracts.md | Engineering contracts — file placement, token change rules, validation commands |
| review-checklist.md | Pre-delivery quality gate |
When production routing changes, update personal-loans-flow.md first, then the registry, then this master plan.
2. Executive summary
The Spring Design Library already contains a strong visual prototype of the Personal Loan AppFlow: 22 of 24 steps have authored screen bodies, shared chrome (AppFlowShell), token-backed components from @spring/ds-react, and a flow map with live iframe previews.
| Metric | Value |
|---|
| Registry steps | 24 |
Screens with Body component | 22 |
Placeholder only (planned) | 2 — start, complete-skipped-steps |
Status ready | 20 |
Status new (built, not yet promoted) | 2 — loan-amount, purpose-of-loan |
| Full journey manual QA | None |
Feasibility
| Goal | Rating | Notes |
|---|
| Visual prototype steps 2 → 19 | High | Click-through works with real screens |
| Full path through terminal outcomes | Medium | Outcome screens exist; analyzing → outcomes routing is missing |
| All production branches/variants | Medium–Low | Partial; needs demo routing layer |
| Global restyle via tokens | High | Sync pipeline is solid; a few hardcoded literals remain |
| Production application | Out of scope | No API, persistence, Flinks, or Twilio |
Top three gaps blocking a demo narrative
- Analyzing → outcomes — step 20 has no forward navigation or demo controls.
- Step 1 landing (
start) — no real UI; PlaceholderStep only.
- Step 21 recovery (
complete-skipped-steps) — not built.
3. Project scope
In scope
- Live, clickable Personal Loan flow in the design library from landing through terminal outcomes
- Consistent mobile shell: floating bottom CTA, scrollable content, hidden scrollbar
- Token-driven visual consistency across all steps and components
- Demo routing for branches and outcomes without backend APIs
- Flow map +
PageMapPopup as visual source-of-truth preview
- Documentation for non-technical stakeholders (token change workflow)
Out of scope
- Production APIs, database, session persistence, analytics
- Real Flinks bank connection, Twilio SMS, or eligibility polling
- Returning customer paths (
welcome-back, verify-otp, deeper prepop)
- Full Foundation cross-sell flow (PL declined screen links out only)
- Plan selection step (exists as a component screen but is not in the Personal Loan registry)
4. Environment and architecture
Monorepo layout
| Area | Path | Role |
|---|
| Design system package | packages/spring-ds-react/ | Reusable UI + tokens → @spring/ds-react |
| Design library app | apps/design-library/ | Next.js gallery at /library/* |
| Token source | packages/spring-ds-react/src/components/tokens/design-tokens.mjs | Visual source of truth |
| Generated CSS | packages/spring-ds-react/src/components/tokens/generated/css-variables.css | --spring-* variables |
| AppFlow registry | apps/design-library/src/gallery/page/appflow/personalLoanFlow.ts | Step metadata + Body imports |
| AppFlow screens | apps/design-library/src/gallery/page/appflow/screens/ | Step body implementations |
| AppFlow shell | apps/design-library/src/gallery/page/appflow/AppFlowShell.tsx | Shared chrome |
| Flow map | apps/design-library/src/gallery/page/appflow/PersonalLoanFlowChart.tsx | Visual map |
| Step popup | apps/design-library/src/gallery/page/appflow/PageMapPopup.tsx | Live preview + source-of-truth panel |
How a step renders
flowchart LR
registry[personalLoanFlow.ts] --> route["/library/page/appflow/personal-loan/slug"]
route --> layout["[slug]/layout.tsx"]
layout --> shell[AppFlowShell]
shell --> body[Step Body or PlaceholderStep]
ds["@spring/ds-react"] --> shell
ds --> body
Route entry: apps/design-library/src/app/library/page/appflow/personal-loan/[slug]/page.tsx
- If
step.Body exists → render screen component
- Else → render
PlaceholderStep.tsx (shell CTA advances to next registry step)
URL modes
| Mode | Query | Effect |
|---|
| Normal | — | Full library chrome or AppFlow page |
| Embed | ?embed=1 | No library header/sidebar; for iframes |
| Map thumbnail | ?preview=map | Tight shell layout for flow-map tiles |
| Viewport | ?viewport=mobile | Mobile artboard in popup iframe |
| Variants | e.g. ?frequency=, ?variant=manual, ?phone= | Step-specific preview state |
Gallery root: /library/page/appflow/personal-loan
Step URL pattern: /library/page/appflow/personal-loan/<slug>
Navigation model (prototype)
- Each screen calls
router.push() to the next gallery slug on Continue
- No shared application state — data entered on one step is not available on later steps (intentional for design-library prototype)
- Branching is implemented locally via
*Options.ts helper files
5. Investigated items
Audit performed against the codebase in June 2026. Items reviewed:
| # | Area | Files / artifacts |
|---|
| 1 | Step registry (24 entries) | personalLoanFlow.ts |
| 2 | Screen implementations (22) | screens/AppFlow*.tsx |
| 3 | Placeholder fallback | PlaceholderStep.tsx, [slug]/page.tsx |
| 4 | Next-step routing | *Options.ts, inline NEXT_HREF constants |
| 5 | Employment branches | employmentStatusOptions.ts |
| 6 | CTA patterns | AppFlowShell.tsx — useAppFlowCta, AppFlowInlineCta |
| 7 | Token pipeline | design-tokens.mjs, scripts/sync-tokens.js, app/layout.tsx |
| 8 | Component exports | packages/spring-ds-react/src/index.ts |
| 10 | Mobile responsiveness | AppFlowShell.tsx, per-screen max-md: usage |
| 11 | Flow map + popup | PersonalLoanFlowChart.tsx, PageMapPopup.tsx |
| 12 | Product spec cross-check | docs/ux/personal-loans-flow.md footnotes |
| 13 | Decision / outcome metadata | PERSONAL_LOAN_DECISIONS in registry |
Key findings
- Registry and screens are aligned for all steps except
start and complete-skipped-steps.
- Linear happy path (name → verify-income → analyzing) is wired with
router.push.
- Employment branching matches the UX doc for the common cases.
- Analyzing is a dead end in the gallery — no CTA, no auto-advance, no outcome simulator.
- Verify bank is a dead end — static Flinks mockup by design; no prototype Continue.
- Mobile body layouts are only refined on
name and purpose-of-loan; shell provides floating CTA globally.
- Token sync updates all
--spring-* consumers; documented literals still bypass sync (see §7).
6. Step inventory (full audit)
Gallery URL base: /library/page/appflow/personal-loan/
| Step | Label | Slug | Phase | Status | Screen | Next route(s) | CTA | Mobile body | Blocker |
|---|
| 1 | Landing | start | A | planned | — | name (via PlaceholderStep) | Shell | — | No landing UI |
| 2 | Name | name | A | ready | AppFlowWhatsYourNameScreen.tsx | loan-amount | useAppFlowCta | Yes | — |
| 3 | Loan Amount | loan-amount | A | new | AppFlowLoanAmountScreen.tsx | purpose-of-loan | Inline submit | No | Always routes to step 4* |
| 4 | Loan Purpose | purpose-of-loan | A | new | AppFlowLoanPurposeScreen.tsx | credit-rating | Inline submit | Yes | — |
| 5 | Credit Rating | credit-rating | A | ready | AppFlowCreditRatingScreen.tsx | employment-status | Inline submit | No | — |
| 6 | Employment | employment-status | A | ready | AppFlowEmploymentStatusScreen.tsx | Branched† | Inline submit | No | — |
| 7 | Income Frequency | income-details-frequency | A | ready | AppFlowIncomeDetailsFrequencyScreen.tsx | income-details-amount?frequency= | Inline submit | No | — |
| 8 | Income Amount | income-details-amount | A | ready | AppFlowIncomeDetailsAmountScreen.tsx | income-duration | Inline submit | No | — |
| 9 | Income Duration | income-duration | A | ready | AppFlowIncomeDurationScreen.tsx | home-address | Inline submit | No | — |
| 10 | Home Address | home-address | A | ready | AppFlowHomeAddressScreen.tsx | homeowner-status | Inline submit | No | ?variant=manual |
| 11 | Homeowner | homeowner-status | A | ready | AppFlowHomeownerStatusScreen.tsx | date-of-birth | Inline submit | No | — |
| 12 | Date of Birth | date-of-birth | A | ready | AppFlowDateOfBirthScreen.tsx | contact-phone | Inline submit | No | — |
| 13 | Contact Phone | contact-phone | B | ready | AppFlowContactPhoneScreen.tsx | contact-code?phone= | Inline submit | No | — |
| 14 | Verify Code | contact-code | B | ready | AppFlowContactCodeScreen.tsx | financial-selector | Inline submit | No | — |
| 15 | Select Bank | financial-selector | B | ready | AppFlowFinancialSelectorScreen.tsx | verify-bank | Inline onClick | No | — |
| 16 | Verify Bank | verify-bank | B | ready | AppFlowVerifyBankScreen.tsx | None | None | No | No forward nav |
| 17 | Verify Identity | verify-identity | B | ready | AppFlowVerifyIdentityScreen.tsx | verify-address‡ | Inline onClick | No | — |
| 18 | Verify Address | verify-address | C | ready | AppFlowVerifyAddressScreen.tsx | verify-income | Inline onClick | No | Skip → same |
| 19 | Verify Income | verify-income | C | ready | AppFlowVerifyIncomeScreen.tsx | analyzing-application | Inline onClick | No | Skip → analyzing |
| 20 | Analyzing | analyzing-application | C | ready | AppFlowAnalyzingApplicationScreen.tsx | None | None | No | No outcome routing |
| 21 | Complete Skipped | complete-skipped-steps | C | planned | — | — | Shell (placeholder) | — | Screen not built |
| 22-1 | Success | application-success | D | ready | AppFlowApplicationSuccessScreen.tsx | Terminal | In-body button | No | Not linked from 20 |
| 22-2 | Try Foundation | declined-try-foundation | D | ready | AppFlowDeclinedTryFoundationScreen.tsx | Foundation flow | In-body button | No | Not linked from 20 |
| 22-3 | Declined Sorry | declined-sorry | D | ready | AppFlowDeclinedSorryScreen.tsx | Terminal | None | No | Not linked from 20 |
* Footnote *: when purposeOfLoanVariant === 'false', production skips step 4; gallery always routes loan-amount → purpose-of-loan.
† Footnote † — employment branches (employmentStatusOptions.ts):
| Employment selection | Next slug |
|---|
| Employed, Self Employed | income-details-frequency |
| No Current Income | home-address (skips income steps) |
| Retired/Pension, LTD, EI, Other | income-details-amount (skips frequency) |
‡ Footnote ‡: production may skip verify-address when POA not required; gallery always shows the screen.
CTA pattern reference
| Pattern | When used | Mobile behaviour |
|---|
useAppFlowCta({ … }) | Name step; PlaceholderStep | Shell fixed bottom bar |
AppFlowInlineCta | Most form steps | Fixed bottom on mobile; inline on desktop |
useAppFlowCta(null) + inline | Verify upload steps, financial selector | Inline only (shell CTA hidden) |
In-body SpringButton | Success, declined, analyzing | No shell CTA |
7. Design tokens — how changes apply
Architecture
flowchart TB
source[design-tokens.mjs]
sync["npm run tokens:sync"]
css[css-variables.css]
layout["app/layout.tsx import"]
components["DS components + AppFlow screens"]
source --> sync --> css --> layout --> components
Global import in apps/design-library/src/app/layout.tsx:
import '@spring/ds-react/tokens/generated/css-variables.css'
Components consume tokens as CSS variables, e.g. var(--spring-semantic-color-text-text-primary, #242621).
Step-by-step: for designers and PMs (non-technical)
When a colour, font size, or spacing value changes in the design system:
- Identify what changed — e.g. primary purple, body text size, card border colour.
- Request an engineering update — token changes require approval and must be applied in
design-tokens.mjs (not in individual screens).
- Engineer runs sync — they run
npm run tokens:sync and restart the preview server.
- Verify visually — open any AppFlow step (e.g. Name, Loan Purpose) and any component doc page (e.g. TextField, SpringButton). The new values should appear everywhere that uses the token.
- Understand limits — layout widths (e.g. 630px tile grid), screen copy, and routing are not controlled by tokens. A few error colours and bank tints are still hardcoded (see below).
What updates automatically after sync
- Button colours and sizes
- Input field borders, backgrounds, error states
- Progress bar gradient
- Page title typography (via
AppFlowPageTitle token bindings)
- Shell wash and footer styling
- All component doc preview pages
What does not update automatically
- Fixed layout dimensions in screen files (400px form width, 630px grid)
- Screen text/copy
- Icons and illustration assets
- Hardcoded literals listed in the table below
Step-by-step: for engineers and AI agents (technical)
- Get approval for token changes (workflow-contracts.md § Token Change Contract).
- Edit
packages/spring-ds-react/src/components/tokens/design-tokens.mjs.
- Regenerate artifacts:
npm run tokens:sync
- Restart the dev server if running (
npm run dev).
- Before production build validation, clear the Next.js cache:
rm -rf apps/design-library/.next
npm run build
- Lint:
npm run lint
- Optional Figma pull (requires
.env with FIGMA_TOKEN, FIGMA_FILE_ID):
npm run tokens:figma
npm run tokens:sync
See also: CONTRIBUTING.md, Design Tokens hub in the running gallery.
Known non-token literals (will NOT auto-update)
| Location | Value / note |
|---|
packages/spring-ds-react/src/components/inputs/TileSelector.tsx | Error text #dd233e (Figma AppFlow error) |
packages/spring-ds-react/src/components/inputs/financialSelectorBankOptions.tsx | Bank tile surface rgba/hex tints |
packages/spring-ds-react/src/components/inputs/TileSelector.tsx | Default tile surface rgba(255,255,255,0.5) |
| Various AppFlow screens | Shadow/opacity values using color-mix with token fallbacks (partial) |
Address these in Phase P2 if full token purity is required.
8. Components — state and token coverage
All Personal Loan screens import from @spring/ds-react (index.ts).
| Component | AppFlow steps | States implemented | Gallery docs |
|---|
SpringButton | Shell CTA, success, declined | primary, disabled, loading, block, href | /library/components/actions/spring-button |
SpringProgress | Shell | value, caption | /library/components/feedback-indicators/spring-progress |
SpringHeader | Shell | app variant | /library/components/navigations/spring-header |
SpringFooterLegal | Shell (desktop) | appflow variant | /library/components/navigations/spring-footer |
TextField | Name, DOB, address, income | default, active, error | /library/components/inputs/text-field |
BoxSelector | Credit, employment, homeowner, frequency | default, selected, keyboard nav | /library/components/inputs/box-selector |
TileSelector | Purpose, financial selector | default, selected, error, mobile fluid | /library/components/inputs/tile-selector |
LoanAmountSlider | Loan amount | validation min/max | /library/components/inputs/loan-amount-slider |
SplitPillInput | Income duration | default, error | /library/components/inputs/split-pill-input |
PhoneNumberField | Contact phone | default, error | /library/components/inputs/phone-number-field |
OtpField | Contact code | default, error, timer | /library/components/inputs/otp-field |
ConsentBox | Contact phone | checked/unchecked | /library/components/actions/consent-box |
DropdownField | Home address (manual) | default, error, menu | /library/components/inputs/dropdown-field |
SearchField | Home address (search) | default | /library/components/inputs/search-field |
FileUploader | Verify identity/address/income | default, error, file chosen | /library/components/inputs/file-uploader |
FaqAccordion | Declined try Foundation | expand/collapse | /library/components/modules/faq-accordion |
Component quality gaps
- Error states: not every screen surfaces validation in the UI during normal demo walkthrough (some only on submit).
- Mobile layouts: only
name and purpose-of-loan bodies have dedicated max-md: spacing; others use desktop-centric widths inside the mobile shell.
- Disabled states: loan amount disables Continue when invalid; most other steps do not disable the CTA.
9. End-to-end connectivity today
What works (gallery demo)
| Flow segment | Status |
|---|
name → loan-amount → … → verify-income | Continue chain works |
employment-status branches | Implemented |
income-details-frequency → amount with ?frequency= | Implemented |
home-address search vs manual | ?variant=manual |
contact-phone → code with ?phone= | Implemented |
financial-selector → verify-bank | Works; bank step is terminal |
| Flow map click → popup preview | Works with mobile/desktop toggle |
start placeholder → name | PlaceholderStep shell CTA |
What is incomplete for a full demo
| Gap | Impact | Workaround today |
|---|
No start landing UI | Cannot demo step 1 design | Start at /name or use placeholder |
verify-bank has no Continue | Breaks linear walk at step 16 | Navigate manually to verify-identity URL |
analyzing-application has no forward nav | Cannot reach outcomes by clicking | Open outcome URLs directly or use flow map |
No complete-skipped-steps screen | Recovery path missing | N/A |
| Purpose variant skip not wired | Always shows step 4 | N/A |
| No cross-step data | {firstName} on step 21 won't populate | N/A |
Recommended demo path (today)
- Open
/library/page/appflow/personal-loan/name
- Click Continue through each step through
verify-income
- Continue to
analyzing-application
- Manually open
/library/page/appflow/personal-loan/application-success (or other outcome) from flow map popup or URL bar
10. Risks and concerns
| Risk | Severity | Description | Mitigation (see §11) |
|---|
| Analyzing dead-end | High | Breaks end-to-end demo narrative | P0: outcome simulator or query param |
| Missing landing + recovery screens | High | Steps 1 and 21 are placeholders | P0 / P1 builds |
| Verify bank dead-end | Medium | Linear walk stops at step 16 | P0: prototype Continue |
| Mobile desktop layouts | High | 20 screens lack mobile body refinements | P1 mobile pass |
| Registry vs UX doc drift | Medium | Footnotes and branches may diverge | Update both when changing order |
| Hardcoded literals | Low–Med | Token sync misses some colours | P2 cleanup |
| Dual CTA patterns | Medium | Authors mix useAppFlowCta and inline | Documented in §6; standardize in P1 |
| PlaceholderStep linear advance | Low | start → name OK; won't respect branches | Use direct URLs for branch testing |
| No journey manual QA | Medium | Regressions may go unnoticed | P2 manual browser journey |
| Stale CSS after token sync | Medium | Dev server cache | §7 restart + .next clear |
| Scope creep to production | High | Backend/API work expands scope | §3 out-of-scope list |
11. Implementation plan (step-by-step)
Each task includes: owner role, files, acceptance criteria, validation.
Phase P0 — Demo-ready end-to-end (must have)
P0-1 — Build step 1 landing screen
| |
|---|
| Owner | AppFlow engineer + designer |
| Files | New AppFlowStartScreen.tsx; update personalLoanFlow.ts (Body, status: 'ready') |
| Figma | Application-Flow-2026 landing node (production /personal-loans) |
| Acceptance | Email/value prop + CTA → name; shell progress 7%; mobile floating CTA |
| Validate | npm run lint && npm run build; manual walk start → name |
P0-2 — Analyzing → outcome demo routing
| |
|---|
| Owner | AppFlow engineer |
| Files | AppFlowAnalyzingApplicationScreen.tsx; optional analyzingApplicationOptions.ts |
| Approach (choose one) | (A) Query param `?outcome=success |
| Acceptance | From analyzing, user reaches each of the three outcome slugs without manual URL entry |
| Validate | Manual + document query param in §13 |
P0-3 — Verify bank prototype Continue
| |
|---|
| Owner | AppFlow engineer |
| Files | AppFlowVerifyBankScreen.tsx |
| Acceptance | Prototype “Continue” (or auto-link) → verify-identity; labelled as demo-only in code comment |
| Validate | Walk steps 15 → 16 → 17 |
P0-4 — Manual walkthrough checklist
| |
|---|
| Owner | QA / PM |
| Deliverable | Checklist in this doc’s appendix or team wiki |
| Acceptance | Happy path + three outcomes verified on mobile and desktop popup |
P0-5 — Automated validation
npm run lint
npm run build
Optional: add one manual browser spec for name → loan-amount → purpose-of-loan chain.
Phase P1 — Spec completeness
P1-1 — Build complete-skipped-steps (step 21)
| |
|---|
| Files | New AppFlowCompleteSkippedStepsScreen.tsx; registry update |
| Acceptance | Matches UX doc recovery prompt; links back to verify-address / verify-income |
| Validate | Build + manual skip flow |
P1-2 — Wire skip/recovery paths
| |
|---|
| Files | verifyAddressOptions.ts, verifyIncomeOptions.ts, verify screen components |
| Acceptance | When both POA and POI skipped, route to complete-skipped-steps before analyzing (per UX doc) |
| Validate | Cross-check with personal-loans-flow.md |
P1-3 — Purpose variant flag
| |
|---|
| Files | AppFlowLoanAmountScreen.tsx; optional gallery query param e.g. ?purposeVariant=false |
| Acceptance | When variant false, loan-amount Continue → credit-rating (skips step 4) |
| Validate | Both paths manually |
P1-4 — Mobile layout pass (remaining 20 screens)
| |
|---|
| Pattern | Follow AppFlowWhatsYourNameScreen.tsx + AppFlowLoanPurposeScreen.tsx + shell max-md: |
| Figma | Mobile nodes in Application-Flow-2026 (106-xxxx series) |
| Acceptance | Each step readable on 393px width; no clipped CTAs; scroll where needed |
| Validate | PageMapPopup mobile viewport for each slug |
P1-5 — Promote registry status
| |
|---|
| Files | personalLoanFlow.ts |
| Change | loan-amount and purpose-of-loan: new → ready |
Phase P2 — Quality and maintainability
P2-1 — Optional demo context
| |
|---|
| Files | New AppFlowDemoContext.tsx; wire name step to provide firstName for step 21 title |
| Acceptance | {firstName} renders on complete-skipped when context set |
P2-2 — Token literal cleanup
| |
|---|
| Files | TileSelector.tsx, financialSelectorBankOptions.tsx |
| Acceptance | Error and bank tints use semantic tokens where equivalents exist |
P2-3 — Expand manual QA coverage
| |
|---|
| Acceptance | Full journey name → analyzing; one outcome path; employment branch spot-check |
P2-4 — Flow map / registry sync
| |
|---|
| Files | personalLoanFlow.ts, PersonalLoanFlowChart.tsx |
| Acceptance | Outcome labels 22-1, 22-2, 22-3 match popup and map tiles after P0–P1 |
12. Validation and maintenance
Pre-PR checklist
Use review-checklist.md. Minimum for AppFlow changes:
How to preview a step
| Method | URL / action |
|---|
| Direct | http://localhost:3000/library/page/appflow/personal-loan/<slug> |
| Flow map | /library/page/appflow/personal-loan → click tile → Open view |
| Mobile popup | Open view → Mobile toggle |
| Embed | Add ?embed=1 for iframe-style preview |
When to update which doc
| Change | Update |
|---|
| Production routing / branches | personal-loans-flow.md |
| Gallery implementation status | This master plan |
| Slug, order, screen component | personalLoanFlow.ts |
| Token values | design-tokens.mjs + run sync |
| New reusable component | packages/spring-ds-react + gallery component page |
13. Appendix
A. Quick commands
npm install
npm run dev # local gallery → http://localhost:3000/library/...
npm run tokens:sync # after token edits
npm run lint
npm run build
B. Glossary
| Term | Meaning |
|---|
| AppFlow | Gallery implementation of a product application flow |
| Registry | PERSONAL_LOAN_STEPS in personalLoanFlow.ts |
| Shell | AppFlowShell — header, progress, CTA, footer |
| Body | Step-specific centre column component |
| Embed | ?embed=1 preview mode for iframes |
| Outcome | Terminal step after analyzing (success, declined variants) |
C. Figma reference
- Application Flow 2026: Figma file
- Key mobile nodes: Name
106-995, Purpose 106-1115
- Key desktop nodes: Purpose
100-778, Credit 88-573, Analyzing 141-3664
D. Demo outcome URLs (after P0-2)
| Outcome | Gallery URL |
|---|
| Approved | /library/page/appflow/personal-loan/application-success |
| Declined → Foundation | /library/page/appflow/personal-loan/declined-try-foundation |
| Declined (all) | /library/page/appflow/personal-loan/declined-sorry |
E. Manual walkthrough checklist (P0-4)
F. Investigated file index
apps/design-library/src/gallery/page/appflow/
├── personalLoanFlow.ts # Registry
├── AppFlowShell.tsx # Chrome + CTA
├── PersonalLoanFlowChart.tsx # Flow map
├── PageMapPopup.tsx # Live preview
├── screens/
│ ├── AppFlow*.tsx # 22 step bodies
│ ├── PlaceholderStep.tsx # Fallback
│ └── *Options.ts # Routing + copy constants
apps/design-library/src/app/library/page/appflow/personal-loan/[slug]/
├── layout.tsx # Shell wrapper
└── page.tsx # Body vs placeholder
packages/spring-ds-react/src/
├── index.ts # Public exports
└── components/tokens/
├── design-tokens.mjs # Token source
└── generated/css-variables.css
docs/ux/personal-loans-flow.md # Product spec
End of master plan. For questions about agent workflow, see operational-manifesto.md.