Part of the SPA look-and-feel pass (design review 2026-09-02). Sibling slices: numeric typesetting, elevation hierarchy, table layout, dashboard rework, empty states, visual identity.
Problem
Seven rules in web/src/styles.css set text-transform: uppercase with tracked letter-spacing: table.data th, .badge, .stat-label, .nav-group-label, .eyebrow, .step-n, .more-group-label. Table headers at 0.68rem caps muted are the hardest text on the screen to read, and the app is used on a phone in a hen house. Caps-everywhere is also the commonest tell of a templated UI; it stops meaning anything when it is on every label.
Proposal
Keep caps only where they mark real structure — the sidebar / More-sheet group dividers (.nav-group-label, .more-group-label). Everything else goes sentence case:
table.data th: ~0.8rem, sentence case, weight 600, --ink rather than --muted, letter-spacing: 0.
.badge: sentence case, ~0.78rem, keep the tinted pill and weight.
.stat-label: sentence case under the figure, ~0.85rem, --muted.
.step-n ("Step 1"): sentence case, keep the pill.
.eyebrow: audit its call sites; drop the class where it labels content that does not need a label, sentence case elsewhere.
Acceptance
Siblings: #650 #651 #653 #654 #655 #656 #657
Part of the SPA look-and-feel pass (design review 2026-09-02). Sibling slices: numeric typesetting, elevation hierarchy, table layout, dashboard rework, empty states, visual identity.
Problem
Seven rules in
web/src/styles.csssettext-transform: uppercasewith tracked letter-spacing:table.data th,.badge,.stat-label,.nav-group-label,.eyebrow,.step-n,.more-group-label. Table headers at 0.68rem caps muted are the hardest text on the screen to read, and the app is used on a phone in a hen house. Caps-everywhere is also the commonest tell of a templated UI; it stops meaning anything when it is on every label.Proposal
Keep caps only where they mark real structure — the sidebar / More-sheet group dividers (
.nav-group-label,.more-group-label). Everything else goes sentence case:table.data th: ~0.8rem, sentence case, weight 600,--inkrather than--muted,letter-spacing: 0..badge: sentence case, ~0.78rem, keep the tinted pill and weight..stat-label: sentence case under the figure, ~0.85rem,--muted..step-n("Step 1"): sentence case, keep the pill..eyebrow: audit its call sites; drop the class where it labels content that does not need a label, sentence case elsewhere.Acceptance
text-transform: uppercase— pinned by a styles unit test.--surfaceclear 4.5:1 in light and night.tools/simulation/ui/specs that match badge text by exact case still pass (PlaywrightgetByTextis case-sensitive by default — read the callers, Daily entry: require grading to reconcile sellable eggs before submit #394).Siblings: #650 #651 #653 #654 #655 #656 #657