Wallet, add funds, then the prepaid statement.
Wallet, top-up, statement, and invoicing — one flat Billing surface (Billing and Usage are now separate nav rows, no in-page tab bar).
The widths drawn here are samples of a fluid
continuum, not the only states that exist — content (spacing, type, gaps, card/column widths)
scales continuously between them, each clamp reading a named container. Structure (rail,
row↔stack, grid columns) steps only at sm 640 · md 768 ·
lg 1024; radius, hairlines, and pills never scale. Kit: design-canon.md U8.
Reading order in this document: § Desktop
journey first — every desktop frame, full flow, journey order — then § Mobile
journey — 375 below it — every mobile frame, same order, laid out side by side as a
wrapping grid (never a tall single-file column of phone screens). Two sections, never
interleaved — a review-document convention only (this repo's design-canon.md §
Mockup review reading order). Mobile 375px is still designed and scored FIRST in the /design
ritual (kit canon U5/U8) — the two rules never conflate.
BillingPage.tsx
<h1>Billing</h1> on the readable column, not the PageLayout h1/description zone.WalletBalance (hero + wallet activity), then BillingOverview "Billing setup" group.topup / refund / adjustment / chargeback (labels from walletActivityLabel(): Added funds · Refund to card · Adjustment · Chargeback). run / ai / addon debit rows are DROPPED here — those events live in Pulse → Activity (Assistant/Brain scope) and their totals in Usage. Empty state: “Top-ups and refunds will show here.” (replaces “Runs and top-ups will show here” in WalletBalance.tsx). The section runs short at realistic volume (1–3 rows/month) — let the balance hero breathe, never pad it./billing/history (frame 3) and that statement stays COMPLETE — every category including run/AI/add-on debits. Only this on-page list is wallet-movements-only.lg).TopUpModal)FundToGoLiveSheet, AddMoneyToContinueDialog) reuse it with different copy, never a second surface./billing/history)/billing/history, prepaid statement)BillingDrillOver
/billing./billing/history/:invoiceId)BillingDrillOver at z-10300; row → /billing/history/:invoiceId, InvoiceDetailModal mounts zIndexOffset=2500 (backdrop/sheet at 10500/12000, above the drill)./billing/details)InvoicingDetails + BillingPreferences
onSignupRequired).BillingHistory reads the wallet statement (no Stripe fetch).