Owner, 2026-10-09: “design all of the components first, including all their interactive behaviours, so that we have shared components used throughout the app.” Every component of library sections 3 to 6 is drawn below as one specimen block: its name and role; the anatomy at 1:1 with vertical and horizontal dimension rulers; the states row with the section 2 values applied; the variants; the behaviour note; and what it replaces. Scheme S2 Ball & Ink. The controls, overlays, states and forms are the sibling board /wireframes/flat-v2-controls; the grammar and the six screens are /wireframes/flat-v2.
| component | mark | spec height | measured | instances | pass | library row |
|---|---|---|---|---|---|---|
| Header | header | 56 | 56 | 15 | pass | §3 Header |
| Header · subtitle | header-sub | 64 | 64 | 1 | pass | §3 Header (height 64) |
| Tabs (scope) | tabs | 44 | 44 | 10 | pass | §3 Tabs |
| Tab bar | tabbar | 56 | 56 | 11 | pass | §3 Tab bar |
| Tab bar + home inset | tabbar-wrap | 90 | 90 | 11 | pass | §3 Tab bar (56 + 34) |
| FAB | fab | 48 | 48 | 10 | pass | §3 FAB |
| CTA band | cta-band | 118 | 118 | 10 | pass | §3 CTA band (16 + 52 + 16 + 34) |
| CTA button | cta-btn | 52 | 52 | 12 | pass | §3 CTA band (button 52) |
| Day header | day | 32 | 32 | 4 | pass | §3 Day header |
| Section head | section | 24 | 24 | 8 | pass | §3 Section head |
| Band | band | 12 | 12 | 3 | pass | §3 Band |
| Block · home | block-home | 144 | 144 | 9 | pass | §4 Block |
| Block · ELO | block-elo | 160 | 160 | 3 | pass | §4 Block |
| Block · identity | block-id | 144 | 144 | 3 | pass | §4 Block |
| Strip | stat | 80 | 80 | 10 | pass | §4 Strip |
| Hero (detail) | hero | 160 | 160 | 4 | pass | §4 Hero (24 above and 32 below are gaps) |
| Chart | chart | 160 | 160 | 5 | pass | §4 Chart |
| Thumb / map tile | thumb | 56 | 56 | 34 | pass | §4 Thumb |
| Notice · title + body | notice-2 | 68 | 68 | 11 | pass | §4 Notice (12 + 22 + 22 + 12) |
| Notice · single line | notice-1 | 48 | 48 | 3 | pass | §4 Notice (min 48, §13 L4) |
| Avatar 40 | avatar-40 | 40 | 40 | 68 | pass | §4 Avatar |
| Avatar 48 | avatar-48 | 48 | 48 | 36 | pass | §4 Avatar |
| Avatar 56 | avatar-56 | 56 | 56 | 6 | pass | §4 Avatar |
| Avatar row | avatar-row | 40 | 40 | 8 | pass | §4 Avatar row |
| MediaRow | row-media | 80 | 80 | 25 | pass | §5 MediaRow |
| PersonRow / ResultRow | row-person | 68 | 68 | 23 | pass | §5 PersonRow (§15: pitch 68) |
| Cell | cell | 48 | 48 | 25 | pass | §5 Cell |
| Roster cell | roster-cell | 100 | 100 | 32 | pass | §5 Roster cell |
| Tag sm | tag | 24 | 24 | 44 | pass | §6 Tag |
| Tag md | tag-md | 28 | 28 | 13 | pass | §6 Tag |
| Level tag | level | 24 | 24 | 55 | pass | §6 Level tag |
| Count tag | count | 20 | 20 | 16 | pass | §6 Count tag |
| Count tag · tab bar | count-16 | 16 | 16 | 6 | pass | §3 Tab bar (count tag 16 tall) |
| Switch (in Cell) | switch | 28 | 28 | 2 | pass | §7 Switch |
| Block progress | progress | 8 | 8 | 2 | pass | §4 Block (progress 8) |
| Roster 4-up row | roster | 100 | 100 | 8 | pass | §5 Roster cell (pitch 100) |
| Hero fact row | hero-fact | 24 | 24 | 6 | pass | §4 Hero (three facts 17/24) |
| Tabs underline | underline | 2 | 2 | 11 | pass | §3 Tabs (2pt underline) |
| Strip hairline | hair | 24 | 24 | 22 | pass | §4 Strip (1 × 24) |
| Cell hairline | hair-cell | 1 | 1 | 7 | pass | §5 Cell (1px #E5E5E5) |
| Edge hairline | hair-edge | 1 | 1 | 9 | pass | §3 (1px #D4D4D4) |
| Tab-bar dot badge | dot | 7 | 7 | 2 | pass | §3 Tab bar (7px dot) |
| Today dot | today-dot | 6 | 6 | 2 | pass | §3 Day header (6px dot) |
| Home inset | inset | 34 | 34 | 11 | pass | §3 Tab bar / CTA band (34) |
| Action glyph | icon-24 | 24 | 24 | 96 | pass | §1 icons 24 (actions) |
| Hero / inline glyph | icon-20 | 20 | 20 | 6 | pass | §1 icons 20 (hero facts) |
Proposal (2026-10-09), Phase B of the flat grammar v2 migration: docs/design/flat-v2-component-library-2026-10-09.md sections 3 to 6, drawn component by component. Each block: the name and role, the anatomy at 1:1 with vertical and horizontal dimension rulers, the states row (rest, pressed with the dim and scale of section 2 applied, hover, focus, disabled, loading, selected, empty where each exists), the variants, the behaviour note printed from section 2 and the replaces line; then a dark-mode strip and the DOM verification of every component height against the library table. Chrome: Header, Tabs, Tab bar, FAB, CTA band, Day header, Section head, Band. Surfaces: Block, Strip, Hero, Chart, Thumb, Notice, Avatar, Avatar row. Rows: MediaRow, PersonRow, Cell, Roster cell, ResultRow. Labels: Tag, Level tag, Count tag, Live tag. Built from local primitives only (Fq*): no WFPhone, WFCard, WFChip or WFBadge. The controls, overlays, states and forms are the sibling board flat-v2-controls.
packages/ui/src/pressable.tsx · packages/ui/src/pressable-visual.ts · packages/ui/src/motion.ts · packages/ui/src/app-header.tsx · packages/ui/src/pill-nav.tsx · packages/ui/src/bottom-cta-band.tsx · packages/ui/src/section-header.tsx · packages/ui/src/list-row.tsx · packages/ui/src/person-row.tsx · packages/ui/src/fact-row.tsx · packages/ui/src/badge.tsx · packages/ui/src/avatar-bubble.tsx · packages/ui/src/stat-strip.tsx · packages/ui/src/cell-row.tsx · packages/ui/src/banner.tsx · packages/ui/src/empty-state.tsx · packages/app/src/presentation/components/sessions/venue-tile.tsx · apps/mobile/app/(tabs)/_layout.tsx
grounded in 18 source file(s)
packages/ui/src/pressable.tsxpackages/ui/src/pressable-visual.tspackages/ui/src/motion.tspackages/ui/src/header.tsxpackages/ui/src/pill-nav.tsxpackages/ui/src/bottom-cta-band.tsxpackages/ui/src/section-header.tsxpackages/ui/src/person-row.tsxpackages/app/src/presentation/components/person-row.tsxpackages/ui/src/fact-row.tsxpackages/ui/src/badge.tsxpackages/ui/src/avatar.tsxpackages/ui/src/stat-strip.tsxpackages/ui/src/cell-row.tsxpackages/ui/src/banner.tsxpackages/ui/src/empty-state.tsxpackages/app/src/presentation/components/sessions/venue-tile.tsxapps/mobile/app/(tabs)/_layout.tsx