The page boards drew every page only from the library and listed what it lacked. The library was extended first (sections 18.2, 19.3, 19.5, 20.2, 20.3, 21.2 and 22.2); this board draws those additions the way /wireframes/flat-v2-patterns drew section 14: one specimen block per component at 1:1 with its rulers, every applicable state, the content rules, the spoken label (B8), the motion with its reduced-motion variant (B7), the dark values and the 130% and 200% frames (B6). Scheme S2 Ball & Ink. The sibling boards are flat-v2-components (chrome, surfaces, rows), flat-v2-controls (controls, overlays, forms) and flat-v2-patterns (page components, scaling, motion, accessibility, platform).
Everything below was read from the rendered page by a script: 55 specimen blocks, 54 anatomy stages and 571 state and variant frames. The rules are the page-board contract section 5: rail 20 / 370, boxes on the 4pt grid (a height set by text lines, n × 22, is a standard exemption; spacing values (pads, gaps, seams) are never exempt), type nodes only on the scale, media rows 80 / person rows 68 / Cells 48 as floors, section seams, no shadow, no middle dot, one trailing element per row, Tags at most two per row, every interactive element a 44 target. Magenta board chrome, art and the platform keyboard stand-in are outside the checks.
| Rule | Checked | Fails | Exemptions (listed, with the reason) |
|---|---|---|---|
| Heights against the spec (marked boxes) | 544 | 0 | none minHeights are floors (§15): a mark with a spec must measure exactly that at 100% text; large-text frames and wrapped variants are listed as text-driven. |
| Marked box heights on the 4pt grid | 4404 | 0 | 533 height set by text lines (n × line) 135 computed media size (the width / 3 or / 4) 65 the device home inset (34, an OS value) in the height 14 height built from text lines (22 meta line · 18 label line) |
| Spacing on the 4pt grid (pads, margins, gaps; never exempt) | 10341 | 0 | 85 device home inset (OS value) added to a 16 / 20 pad 24 2pt photo-grid gap (ruled by §18.1 D5, the photo-grid standard) Negative margins (345: -10 × 180, -12 × 75, -6 × 65, -2 × 25) are the glyph boxes bleeding onto the rail (a 44 target around a 24 glyph) and are not spacing. |
| Type nodes on the scale (11/14 12/16 13/18 15/22 17/24 20/28 24/32 40/48) | 2956 | 0 | 392 scaled by B6 (base on the scale, ×k) 4 Kakao label: platform system font, 15 × label cap |
| Interactive elements: 44 targets (visual < 44 needs hit slop) | 1081 | 0 | 170 Choice 36 (hit slop 4) (library §1: hit slop (44 − visual) / 2) 97 sm Button 36 (hit slop 4) (library §1: hit slop (44 − visual) / 2) 64 checkbox 24 inside a 48 row (hit slop 10) (library §1: hit slop (44 − visual) / 2) 49 reaction chip 28 (hit slop 8) (library §1: hit slop (44 − visual) / 2) 13 wizard back square 40 in a 44 target 2 Switch 28 (hit slop 8) (library §1: hit slop (44 − visual) / 2) 1 tab item 26 wide (the 24 gap is its slop) (library §1: hit slop (44 − visual) / 2) Slop is read as a 44 box around the visual; none of the exempt visuals is smaller than 24. |
| Hairlines and seams (cell 1 #E5E5E5 on the rail, none after the last, edge 1 #D4D4D4, seams exact) | 292 | 0 | none |
| Rail 20 (text edges on 390 frames) | 182 | 0 | none Pressed frames (scaled .98) and swiped rows are outside the check. |
| No shadows (blur 0 only) | 53 | 0 | none 54 zero-blur rings (a focus or reaction ring, the avatar-group canvas ring) are not shadows. |
| No middle dot between facts (text nodes read) | 2956 | 0 | 13 the Korean term 수집·이용 (a word-joiner inside one term, the shipped string) |
| One trailing element per row, at most two Tags | 147 | 0 | none |
| Names and text never clipped (L1 / L2 text boxes) | 1225 | 0 | none |
| Annotation hygiene: ruler notes inside their column and not overlapping | 229 | 0 | none |
| Component | Spec | n | Measured | |
|---|---|---|---|---|
| Avatar group, 32 box | 32 (§19.5) | 1 | 32 ×1 | pass |
| Avatar group, 40 box | 40 (§19.5) | 7 | 40 ×7 | pass |
| Avatar group, 48 box | 48 (§19.5 rule) | 1 | 48 ×1 | pass |
| Avatar group, 56 box | 56 (§19.5 rule) | 1 | 56 ×1 | pass |
| Caption row, one line | 32 (§18.2 min 32) | 13 | 32 ×14 · 36 ×1 | pass |
| Cell | 48 (§5 min 48) | 3 | 48 ×3 | pass |
| Two-line Cell | 68 (§19.2 min 68) | 7 | 68 ×7 | pass |
| Cell, sm Button slot | 48 (§21.2 min 48) | 2 | 48 ×2 | pass |
| Cell, busy | 48 (§22.2 min 48) | 20 | 48 ×20 · 52.6 ×3 · 68 ×3 | pass |
| Cell, Choice slot | 48 (§21.2 min 48) | 2 | 48 ×2 | pass |
| Cell, contribution row | 48 (§21.2 min 48) | 1 | 48 ×1 | pass |
| Cell, document table | 48 (§22.2 min 48) | 15 | 48 ×15 · 52.6 ×3 · 116 ×3 | pass |
| Cell, edit | 48 (§21.2 min 48) | 16 | 48 ×16 | pass |
| Cell, IconButton slot | 48 (§21.2 min 48) | 2 | 48 ×2 | pass |
| Cell, label Tag | 48 (§21.2 min 48) | 1 | 48 ×1 | pass |
| Cell, locked (reason line) | 68 (§21.2 min 68) | 4 | 68 ×4 | pass |
| Cell, Switch slot | 48 (§21.2 min 48) | 2 | 48 ×2 | pass |
| Cell, Tag value | 48 (§19.3 min 48) | 2 | 48 ×2 | pass |
| Task Cell | 48 (§18.2 min 48) | 4 | 48 ×4 | pass |
| Cell, consent | 48 (§22.2 min 48) | 39 | 48 ×39 · 52.6 ×3 · 81.2 ×1 · 108 ×1 · 152 ×3 | pass |
| Cell, 전체 동의 | 48 (§22.2 min 48) | 10 | 48 ×10 · 52.6 ×1 · 68 ×1 | pass |
| CTA band (danger, with / without helper) | 118 / 144 (§3: 16 + 52 + 16 + 34 (+ 26)) | 11 | 118 ×9 · 144 ×2 | pass |
| Disclosure Cell, closed | 48 (§19.3 min 48) | 2 | 48 ×2 | pass |
| Edit Sheet footer band | 84 / 118 (§18.2: 118 (84 on the keyboard)) | 9 | 84 ×1 · 118 ×8 · 182 ×1 | pass |
| CTA band, entry (± helper) | 204 / 230 (§22.2: 204 (+ 26)) | 8 | 204 ×6 · 217.4 ×1 · 230 ×2 · 238 ×1 | pass |
| ExpandToggle, lone row | 48 (§19.3 48) | 11 | 48 ×11 | pass |
| Field skeleton | 74 (§21.2: 18 + 8 + 48) | 9 | 74 ×9 | pass |
| Figure column row | 68 (§20.2 68) | 19 | 68 ×19 · 80 ×1 · 103.4 ×1 · 145 ×1 · 181 ×1 | pass |
| FilterSheet footer band | 118 (§18.2: 118) | 7 | 118 ×7 · 182 ×1 | pass |
| Club hero, place variant | 82 (§18.2: 82) | 5 | 82 ×5 · 98.2 ×1 · 114 ×1 · 126.4 ×1 | pass |
| Hero facts (3 / 2 / 1 facts) | 96 / 128 / 160 (§19.3: 160 / 136 / 112 (drawn 96 / 128 / 160 without the top 24)) | 12 | 56 ×1 · 96 ×4 · 128 ×1 · 160 ×7 · 194.6 ×1 · 403.8 ×1 | pass |
| HeaderTextAction target | 44 (§14 44) | 18 | 44 ×18 | pass |
| Web install row | 56 (§22.2 56) | 5 | 56 ×5 | pass |
| ProviderButton, Kakao | 52 (§22.2: 52 (60 / 68 at large text)) | 19 | 52 ×19 · 60 ×1 · 68 ×1 | pass |
| Live row (with its 8 and 8) | 40 (§19.3: 24 + 16) | 7 | 40 ×7 | pass |
| Map face in a form | 140 (§21.2 140) | 8 | 140 ×8 | pass |
| Offline strip over a band | 48 (§9 / §19.5 48) | 8 | 48 ×8 · 52.6 ×1 · 116 ×1 | pass |
| Offline strip, plain page | 48 (§9 48) | 2 | 48 ×2 | pass |
| Offline strip, no header | 48 (§22.2 48) | 4 | 48 ×4 · 52.6 ×1 · 116 ×1 | pass |
| Composer reply target | 44 (§19.3 44) | 8 | 44 ×8 | pass |
| Reply toggle (lone row) | 48 (§19.3 48) | 1 | 48 ×1 | pass |
| Review page CTA band (helper) | 144 (§3: 144) | 1 | 144 ×1 | pass |
| Achievement row (glyph tile) | 80 (§5 MediaRow 80) | 8 | 80 ×8 | pass |
| Row, anonymous avatar | 68 (§5 PersonRow 68) | 2 | 68 ×2 | pass |
| Row with a trailing control | 68 (§20.2 68) | 1 | 68 ×1 | pass |
| Row, group avatar | 68 (§5 PersonRow 68) | 6 | 68 ×6 | pass |
| Row, notification (unread) | 68 (§5 68) | 44 | 68 ×44 · 80 ×4 · 184 ×4 | pass |
| Request row with AnswerPair | 112 (§18.2: 68 + 44 = 112) | 8 | 112 ×8 | pass |
| Row with form text | 68 (§5 68) | 1 | 68 ×1 | pass |
| Person row | 68 (§5 68) | 5 | 68 ×5 | pass |
| Recent search Text row | 68 (§20.2 68) | 6 | 68 ×6 | pass |
| ResultRow in a post | 68 (§5 68) | 5 | 68 ×5 · 80 ×1 · 139 ×1 | pass |
| Text row | 68 (§20.2 min 68) | 22 | 68 ×22 | pass |
| ScoreEntry 저장 band (inset 0) | 84 / 118 (§19.3: 16 + 52 + 16) | 19 | 84 ×10 · 118 ×9 | pass |
| Search takeover field | 40 (§21.2 40) | 7 | 40 ×7 | pass |
| SectionHead | 24 (§3 24) | 30 | 24 ×30 · 31.2 ×2 · 48 ×1 · 79 ×1 | pass |
| Strip with / without deltas | 80 / 100 (§19.3: 100 / 80) | 8 | 80 ×1 · 100 ×7 | pass |
| Tabs row | 44 (§3 44) | 11 | 44 ×11 | pass |
| Time range 완료 band | 118 (§3: 118) | 9 | 118 ×9 | pass |
| Time range tabs | 52 (§21.2 52) | 9 | 52 ×9 | pass |
| Wizard footer band (± helper) | 118 / 144 (§3: 118 (+ 26)) | 2 | 118 ×1 · 144 ×1 | pass |
| WizardShell header | 56 (§21.2 56) | 12 | 56 ×12 | pass |
| WizardShell header at large text | 56 (B6: 56 at every scale) | 2 | 56 ×2 | pass |
| Caption row, two lines | 9 | 36 · 108 · 46.8 | 2 × 18 (floor 32) |
| Caption row, past two lines | 1 | 36 | a copy defect, shown flagged |
| Cells at large text | 2 | 116 · 52.6 | n × line + 24 |
| Two-line Cells, long text and large text | 3 | 80 · 86 · 156 | n × line + 24 |
| Locked Cell at 200% | 1 | 156 | n × line + 24 |
| Tag-value Cell at large text | 2 | 99 · 52.6 | n × line + 24 |
| Choice-slot Cell at large text | 2 | 108 · 52.6 | n × line + 24 |
| Comment (body of n lines) | 14 | 44 · 60 · 96 · 140 | 22 + 4 + n × 22 + 8 + 18 |
| Comment at large text | 2 | 268 · 149.8 | n × line |
| Reply (body of n lines) | 9 | 74 · 96 | 22 + 4 + n × 22 + 8 + 18 |
| Disclosure Cell, open | 8 | 84 · 106 · 256 · 125.8 | 12 + 22 + 12 + n × 22 + 16 (§19.5 exemption) |
| Figure row, long name | 1 | 90 | n × line + 24 |
| Text row, wrapped or large text | 3 | 80 · 90 · 139 | n × line + 24 |
| Row with control, wrapped | 3 | 80 · 90 · 148 | n × line + 24 |
| Request row, wrapped | 3 | 124 · 134 · 272 | n × line + 24 + 44 |
| Request row, error line | 1 | 138 | 112 + 8 + 18 |
| Notification row, large text | 2 | 80 · 184 | n × line + 24 |
| PhotoGrid (390 / 350 wide) | 12 | 390 · 115.3 · 259.3 · 128.7 | tile = (w − 4) / 3, computed |
| PhotoGrid tile | 58 | 115.3 · 128.7 | computed media size |
| Composer photo tile | 43 | 81.5 | (350 − 24) / 4 = 81.5, computed |
| Composer add tile | 10 | 81.5 | the tile size |
| Composer tile rows | 12 | 171 · 81.5 · 260.5 | rows of 81.5 + 8 |
| FilterSheet | 8 | 492 · 614 · 508.2 | the sum of its parts (content) |
| Edit Sheet | 10 | 252 · 286 · 304 · 410 | the sum of its parts (content) |
| Document Sheet | 9 | 172 · 260 · 522 · 676 · 631.6 | content, capped at 88% |
| Time range Sheet | 9 | 452 · 456 | the sum of its parts (content) |
| ScoreEntry Sheet (without the keypad) | 19 | 290 · 314 · 316 · 346 · 372 · 454 · 478 · 461.2 · 297.2 | the sum of its parts (content) |
| ActionSheet | 9 | 254 · 278 · 302 · 370 · 474 · 734 | the sum of its parts (content) |
| Dialog, one action | 8 | 188 · 237 · 344 | content |
| Dialog (pair) | 3 | 166 · 368 | content |
| EmptyState, permission (content area) | 6 | 420 | fills the content area |
| Roster with the door | 10 | 200 · 548 · 234.8 | rows of 100 |
| Strip at large text | 2 | 100 · 116 | 24 + n × line |
| Kakao button at large text | 2 | 60 · 68 | 3 × font size |
| Live row, wrapped | 3 | 40 · 52 · 88 | n × line + 16 |
| Where | What the spec says | What the board draws, and the proposed fix |
|---|---|---|
| §19.3 ScoreEntry Sheet form (height) | “Worst case about 390 + the keypad, under the 88% cap (§16 P2).” | Measured: with the keypad up, the quick row plus tiebreak plus validation reached 785, over the 88% cap of 742.7. Ruled in §23 ruling 1 and drawn: the sheet opens without the keyboard on the title row, the set table and all seven quick picks (454); a tap on a set field raises the keypad and folds the quick row, and the typing worst case (tiebreak plus validation) is 372 + 291 keypad = 663, 78.6% of 844, under the cap. |
| §19.3 vs §18.2 Edit Sheet | §18.2: an edit Sheet has no ×, its footer is the pair 취소 + 저장. §19.3 / D4: ScoreEntry has “one 저장”. | Drawn: no ×, a single 저장, dismissal by backdrop or back with the unsaved-changes Dialog. Proposed fix: allow a single-action edit Sheet when the Sheet is a rapid-entry form (ScoreEntry); the pair stays the rule for field edits. |
| §20.2 / §21.2 tertiary ink in dark | A 16 chevron, edit pencil and lock are drawn in tertiary (#626C64 on white, “≥ 16px only”). | Ruled in §23 ruling 2 and drawn: the dark tertiary is #8F968F, 5.47:1 on the dark card #1A201B (the light tertiary #626C64 is 5.46:1 on white); it lands in the colour gate with the other dark values at D/S1. |
| §15 B6 Cell formula | B6 derives a Cell as line + 26 (a 13 pad above and below). | 13 is off the 4pt grid and spacing is never exempt: Cells are drawn with a 12 pad and a 48 floor (22 + 24 = 46 → 48), so from 130% a Cell is 2 shorter than the addendum table. Proposed fix: change the formula to line + 24. |
| §21.2 Cell trailing slot (Choice, Button) | A Choice ▾ (sm 36) or an sm tonal Button sits in a Cell that “stays 48”. | 48 holds only if the control has 6 above and below, which is off the grid as a pad; drawn with no vertical pad on the Cell (the label block carries its own 12), so the control is centred by alignment. Proposed fix: say “min 48, vertical padding on the label block only”. |
| §21.2 WizardShell header | “Centre: the progress, in ink.” | Drawn as the forms board does: the 2 pt line on the header’s bottom edge, ink for done + current, #E5E5E5 for the rest; nothing sits in the centre of the header. Proposed fix: reword to “the progress line on the header’s bottom edge”. |
| §21.2 Search takeover field vs §7 Search | §7: Search is 44, r full, gray100 with a 20 icon. §21.2: the takeover bar is 40, r12, gray100, 15/22. | Ruled in §23 ruling 3 and drawn: the 40 r12 field sits inside a 44 target in the 56 header (the hit area stays 44, the visual follows the grammar’s radii); the page Search stays the 44 pill. |
| §20.2 EmptyState, permission vs §9 | §9: disc 80 gray100 with a 32 glyph; §20.2: a bare 48 lock glyph, no disc, vertically centred. | Drawn as §20.2 (bare glyph) so a wall does not read as an empty list. Proposed fix: state in §9 that the permission variant is bare and centred. |
| §19.3 ExpandToggle lone row vs Comment | The lone row’s label is centred; a Comment’s reply toggle is “aligned to the text column”. | Drawn: centred for lists, left-aligned at x 96 for the reply toggle. Proposed fix: add a left-aligned variant to the lone-row spec. |
| §19.3 Disclosure Cell label position | Cell label centred in 48 (13 from the top); the body opens “12 below the label”. | Centring would move the label 1 when the cell opens; drawn with the label 12 from the top in both states. Proposed fix: write “label 12 from the top”. |
| §18.2 Tabs item with count | §3: the active underline is “the label width”; §18.2 adds a count Tag 4 after the label. | Drawn: the underline spans label + count (the item is one target). Proposed fix: say “the underline spans the item”. |
| §18.2 Header icon badge (dot) | §3 Tab bar: “7px danger dot”; §18.2: the same badge on a header icon. | 7 is off the grid: drawn 8 for the dot and a 16 count Tag (as the tab bar’s count). Proposed fix: make the dot 8 in §3 too. |
| §18.2 Count Tag padding | Count tag: 20 tall, min 20, 12/16·700. | The other boards pad it 6 (off the grid); drawn 4 here. Proposed fix: fix the pad at 4 in §6. |
| §18.2 SectionHead (large text) | Unspecified: where the action goes when the title and action no longer fit. | Drawn: the action moves under the title, left-aligned, from 150% (B6.5 for a trailing element). Proposed: confirm. |
| §18.2 Activity heatmap | Only: 7 × n weeks of 12 cells, gap 4, r3, five steps from gray100 to ink, month labels, a scrub readout. | Unspecified and drawn as proposals: the five steps (#F2F2F2, #C4C7C4, #8D928E, #4F5851, #0D100E; dark inverted), 22 weeks (fits 350), no weekday labels, an ink count Tag readout; colour is not the only carrier (readout and spoken total, WCAG 1.4.1). |
| §18.2 PhotoGrid select mode | “Long-press enters select.” | The select affordance (a 24 round check at the tile’s top-right, inset 8, the photo dimmed to .6), the “N장 선택됨” header and the 삭제 action are proposals. Gap 2 is ruled by D5 and is the one spacing value off the 4pt grid. |
| §18.2 MediaBand album overlay | A count Tag bottom-right and pager dots bottom-centre. | Unspecified: the Tag inset (12), the dot gap (drawn 8), the dots above 12 photos (dropped; the Tag alone carries the position) and legibility of the white dots on a bright photo (a bottom scrim ink α0.2 → 0 over 48 is proposed). |
| §19.3 Live row, ended | The Live tag then the date and venue. | The ended state is not specified; drawn as a neutral Tag “종료” in the Live tag’s place. Proposed fix: add it to the row. |
| §19.3 Form strip (dark) | 승 = ink fill with white 12/16·700; 패 = gray100 with secondary. | In dark, ink becomes #DFE4DC and the character takes the canvas colour; drawn so. |
| §19.3 Comment spacing | Spacing only between comments (24) and to replies (12). | Drawn as proposals: 4 between line 1 and the body, 8 between the body and 답글 달기; a deleted comment shows a plain gray100 circle (not the anonymous glyph, which is a privacy cue). |
| §19.5 Group avatar sizes | 20 in a 32 box, 24 in a 40 box. | 48 and 56 boxes are not specified; drawn by the same 0.6× rule rounded to the grid (28 and 32), and the anonymous glyph at half the box. Proposed: confirm. |
| §18.2 SwipeAction | One 72-wide action, full swipe commits with an undo toast. | The commit point (drawn at half the row width, 195), the glyph over label layout and the archive colour are proposals; the board notes no shipped swipeable row exists. |
| §21.2 Time range wheel | A native wheel edits the selected tab. | The wheel is the platform control, drawn as a stand-in; its minute step is not specified (5 minutes proposed for sessions). |
| §21.2 Photo tiles | Remove = a 24 circle in a 44 target at the top-right inset 4. | The 44 target overlaps the tile’s corner and its neighbours; a drag lift (scale 1.05, .9) and the failed-upload tile are proposals. |
| §22.2 ProviderButton, large text | “The container grows so the label stays within a third of its height.” | Read as: the label font size is at most a third of the height (15 → 52, 19.5 → 60, 22.5 → 68). The Kakao symbol is drawn as a stand-in bubble; the label weight is not specified (500 drawn). |
| §22.2 CTA band, entry (links) | “이용약관 · 개인정보 처리방침 as ghost links”. | The written middle dot is not allowed in the board contract (no middle dots, MetaBreak instead): drawn with a 1px break. Proposed fix: write the spec with the break. |
| §22.2 EmptyState, full screen (mark slot) | “mark slot, title, body, one primary Button”. | The mark size is not specified: drawn as the stacked lockup (180 wide, a 73.5 slot). The Button is md 44 (the §9 EmptyState size). |
| §22.2 / §19.5 Offline strip placement | Over a MediaBand: attached to the header’s bottom edge, pushing nothing; no header: directly under the status bar, pushing the content. | A plain page with a header is not specified: drawn pinned under the header with 8 above and below. Proposed: the same 8 rule everywhere. |
| §22.2 Cell, consent | A leading 24 checkbox, the [필수] / [선택] prefix, a trailing sm ghost 보기. | The prefix weight (600) and tone ([선택] secondary) are not specified; the master row’s mixed state is drawn as a minus in the ink square. |
| B7 / B8 verification limits | Reduced-motion variants, spoken labels and live regions. | A static render cannot run motion or a screen reader: the motion is printed as tokens and frames, the spoken names are written from the model and are unverified until a device run (axe-core was not run). |
| Emoji font | The Reactions set is the platform emoji. | The board’s browser has no emoji font: the six reactions are flat vector stand-ins; the app renders the platform emoji. |
| § | Library row | Specimen |
|---|---|---|
| 18.2 | Unread marker | Unread marker |
| 18.2 | SwipeAction | SwipeAction |
| 18.2 | AnswerPair | AnswerPair |
| 18.2 | PhotoGrid | PhotoGrid |
| 18.2 | SectionHead variants (count suffix · command action · ExpandToggle slot) | SectionHead variants |
| 18.2 | Tabs item with count | Tabs item with count |
| 18.2 | FilterSheet | FilterSheet |
| 18.2 | Edit Sheet footer | Edit Sheet footer |
| 18.2 | CTA band, danger tone | CTA band · danger tone |
| 18.2 | PersonRow trailing meta | Row trailing control |
| 18.2 | Caption row | Caption row |
| 18.2 | Activity heatmap | Activity heatmap |
| 18.2 | MediaBand album overlay | MediaBand · album overlay |
| 18.2 | PostRow system variant | PostRow · system variant |
| 18.2 | Club hero, place variant | Club hero · place variant |
| 18.2 | Header icon badge | Header icon badge |
| 18.2 | Task Cell | Cell · edit, trailing slot, label Tag, Task Cell |
| 18.2 | Two-line Cell (min 68, §19.2) | Cell · two-line, reason line, locked |
| 18.2 | Reaction picker (replaced by Reactions, §19.2) | Reactions |
| 19.3 | ExpandToggle, lone row | ExpandToggle |
| 19.3 | ExpandToggle, disclosure Cell | ExpandToggle |
| 19.3 | Cell, reason line | Cell · two-line, reason line, locked |
| 19.3 | Cell, Tag value | Cell · edit, trailing slot, label Tag, Task Cell |
| 19.3 | Roster door | Roster door |
| 19.3 | Hero facts: count and state | Hero facts · count and state |
| 19.3 | PersonRow trailing alignment | Row trailing control |
| 19.3 | Composer reply target | Composer reply target |
| 19.3 | Avatar, group | Avatar · group |
| 19.3 | Avatar, anonymous | Avatar · anonymous |
| 19.3 | Comment | Comment |
| 19.3 | Live row | Live row |
| 19.3 | Strip with deltas | Strip with deltas |
| 19.3 | Form strip | Form strip |
| 19.3 | ScoreEntry, Sheet form | ScoreEntry · Sheet form |
| 19.3 | ActionSheet (scope) | ActionSheet · scope and the group-title rule |
| 19.3 | Reactions | Reactions |
| 19.5 | ScoreEntry title row (the match name) | ScoreEntry · Sheet form |
| 19.5 | Group avatar sizes (20 in 32, 24 in 40) | Avatar · group |
| 19.5 | Disclosure Cell body (pad 16, n × 22 exemption) | ExpandToggle |
| 19.5 | Offline strip over a MediaBand | Offline strip · over a MediaBand |
| 19.5 | ActionSheet group titles (two or more non-destructive groups) | ActionSheet · scope and the group-title rule |
| 19.5 | PostRow counts vs Reactions (feed heart / post-page chips) | Reactions · PostRow · system variant |
| 19.5 | Content under a MediaBand (24) | Content under a MediaBand |
| 19.5 | Strip delta: zero or no data | Strip with deltas |
| 19.5 | Form strip data (fewer than five) | Form strip |
| 20.2 | Text row | Text row |
| 20.2 | Thumb, glyph tile | Thumb · glyph tile, and the medal set |
| 20.2 | Row trailing control | Row trailing control |
| 20.2 | Figure column | Figure column |
| 20.2 | EmptyState, permission | EmptyState · permission |
| 20.3 | Medal colours and the glyph tile (four tiers) | Thumb · glyph tile, and the medal set |
| 21.2 | Cell, edit | Cell · edit, trailing slot, label Tag, Task Cell |
| 21.2 | Cell, locked | Cell · two-line, reason line, locked |
| 21.2 | Cell trailing slot | Cell · edit, trailing slot, label Tag, Task Cell |
| 21.2 | Cell, label Tag | Cell · edit, trailing slot, label Tag, Task Cell |
| 21.2 | WizardShell header (owner LAW) | WizardShell header |
| 21.2 | Dialog, one action | Dialog · one action |
| 21.2 | Search takeover | Search takeover |
| 21.2 | Map face in a form | Map face in a form |
| 21.2 | Photo tiles (composer) | Photo tiles (composer) |
| 21.2 | Field skeleton | Field skeleton |
| 21.2 | Input counter | Input counter |
| 21.2 | Caption row, two lines | Caption row · two lines (and Caption row) |
| 21.2 | Time range wheel | Time range wheel |
| 21.1 | Required-marker LAW (asterisk, starts unset) | Required marker |
| 22.2 | ProviderButton (Kakao) | ProviderButton · Kakao |
| 22.2 | CTA band, entry | CTA band · entry, and the danger helper |
| 22.2 | CTA band helper, danger | CTA band · entry, and the danger helper |
| 22.2 | Brand lockup | Brand lockup slot |
| 22.2 | Cell, consent (+ 전체 동의 mixed) | Cell · consent, and 전체 동의 |
| 22.2 | Cell, busy | Cell · busy |
| 22.2 | Sheet, document | Sheet · document |
| 22.2 | EmptyState, full screen | EmptyState · full screen, and the header-less offline strip |
| 22.2 | Offline strip, no header | EmptyState · full screen, and the header-less offline strip |
| 22.2 | Web install row (blocked, EXT-8) | Web install row (blocked on EXT-8) |
Proposal (2026-10-10), Phase B of the flat grammar v2 migration, the fourth component board: the components the page boards found missing, specified in docs/design/flat-v2-component-library-2026-10-09.md sections 18.2, 19.3, 19.5, 20.2, 20.3, 21.2 and 22.2, each drawn as a specimen at 1:1 with anatomy rulers, every applicable state, content rules, the spoken label, the motion with its reduced-motion variant, the dark values and the 130% / 200% frames, then a DOM verification (grid, type scale, minHeights, 44 targets, hairlines and seams) and the spec conflicts with a proposed fix each. Built from local primitives only (Fa*): no WFPhone, WFCard, WFChip, WFBadge, WFSelectChip, WFInput or WFSwitch.
packages/ui/src/cell-row.tsx · expand-toggle.tsx · section-header.tsx · pill-nav.tsx · empty-state.tsx · wizard-shell.tsx · list-row.tsx · avatar-stack.tsx · stat-strip.tsx · labeled-field.tsx · bottom-cta-band.tsx · time-band-field.tsx · confirm-sheet.tsx · packages/app/src/presentation/components/network-banner.tsx · venue-search-takeover.tsx · packages/features/clubs/src/shared/post-row.tsx · packages/features/messaging/src/dm-thread/compose-bar.tsx · packages/features/records/src/cards/activity-heatmap-card.tsx · packages/features/sessions/src/scorecard/score-edit-sheet.tsx · directory-venue-detail/parts/photo-strip.tsx · packages/features/onboarding/src/onboarding-step-consent.tsx
grounded in 21 source file(s)
packages/ui/src/cell-row.tsxpackages/ui/src/expand-toggle.tsxpackages/ui/src/section-header.tsxpackages/ui/src/pill-nav.tsxpackages/ui/src/empty-state.tsxpackages/ui/src/wizard-shell.tsxpackages/ui/src/person-row.tsxpackages/ui/src/avatar-stack.tsxpackages/ui/src/stat-strip.tsxpackages/ui/src/labeled-field.tsxpackages/ui/src/bottom-cta-band.tsxpackages/ui/src/time-band-field.tsxpackages/ui/src/confirm-sheet.tsxpackages/app/src/presentation/components/network-banner.tsxpackages/app/src/presentation/components/venue-search-takeover.tsxpackages/features/clubs/src/shared/post-row.tsxpackages/features/messaging/src/dm-thread/compose-bar.tsxpackages/features/records/src/tab/records-record-zone.tsxpackages/features/sessions/src/scorecard-page/overlays/score-entry-sheet.tsxpackages/features/sessions/src/venue-page/venue-shelves.tsxpackages/features/onboarding/src/onboarding-step-consent.tsx