Audit 1 — kit → component parity (2026-11-01)
Status: Reference · Date: 2026-11-01 · The table behind owner-review-52-audits-2026-11-01.md § 1. Read-only, at HEAD 191e628bd.
Read-only audit, 2026-11-01. Kit: docs/twomore_design_system/wireframes/flat-v2-kit{,-content,-controls,-chrome}.jsx. App: packages/ui/src and packages/app/src/presentation/components, with feature-local components named where a piece lives only there. Machine copy: kit-parity.json (same directory).
Summary
138 public kit pieces tabled (168 Fvk* functions found, minus 30 excluded as board scaffolding or specimens, listed at the end).
| Status | Count | Meaning here |
|---|---|---|
| exists | 7 | same job, props cover the kit's (specimen-only props aside) |
| partial | 14 | a v2 or near-v2 app component with named missing props or variants |
| legacy | 84 | the app has the job, built on the pre-flat grammar; the library's "Replaces in code" names it as replaced |
| missing | 31 | no component (or only an ad hoc inline implementation) |
| unsure | 2 | mapping not settled; the Gap column says why |
What W2a moved (confirmed in the file headers): packages/ui/src/tag.tsx ("Tag ... library Tag; W2a") and packages/ui/src/choice.tsx ("Choice ... library Choice; W2a"), plus choice-set.tsx (W2a; ChoiceSet), choice-visual.ts, tag-visual.ts, line-slot.tsx (LineSlot, IA1-IA4), text-scale.ts/use-text-scale.ts (library 2.4), and dropdown-chip.tsx, range-chip.tsx, removable-chip.tsx, chip-picker-panel.tsx rebuilt on Choice. The XxxStatusBadge wrappers in packages/app/src/presentation/components/status/status-badges.tsx render Tag (rebuild-log 2026-10-19, W2a phases 1-4d). Beyond W2a, some pieces already carry v2 clauses: ListRow size="person" (list-row-person.tsx, PersonRow pitch), SectionHeader variant="feed", FeedEnd, ValueSheet, AvatarBubble glyph, SkeletonRow person, MetaSegments wrap rule, PulseDot 5 s stop. W2b (55 files that need a design call) and W3 (the primitives: Block, MediaBand, Feed item, PersonRow, MediaRow, Cell, Task Cell, Section head, Strip, Tabs, Header, Tab bar, FAB, CTA band) are not built.
How to read the table. Props are the props.x reads of the kit function (for FvkSheet, FvkDialog and FvkMenuSheet the reads of their *Box function, since the wrapper only forwards; FvkPersonRow also lists the props its comment documents, since it reads through an alias). Props that only draw a specimen state are left out of the Props column and kept in the JSON as propsOmittedAsSpecimen (state, pulse, pressed, pin, z, style, cls, hidden, seed, width, bottom, maxH, inset, stops, scrollX, focusIndex, capture, id, as, w, shift, height). Uses is the number of <FvkName occurrences across the six boards (hub, detail, list-a, list-b, forms, auth). Rows are ordered by uses, most first.
Basis and limits. Statuses come from the kit function and its comment, the app file headers and exported Props types, and the library's "Replaces in code" lines (docs/design/flat-v2-component-library-2026-10-09.md). I did not read every legacy component body, did not measure pitches or sizes against the kit, and did not run anything. exists means the prop set matches by name or by a mapping the Gap column states, not that a visual diff was done. A feature-local component (under packages/features or apps) is marked legacy with its path, because it is not a shared component today.
| Kit piece | Job | Props | App component | Status | Gap | Uses |
|---|---|---|---|---|---|---|
FvkCell | A label/value pair or single setting inside a group: static, nav, value+chevron, toggle, input, destructive, tag, locked, two-line, consent, command, option, copy, action, expand, inset. | body, checked, copy, error, expand, hint, icon, inert, ink, label, labelTag, last, lead, line2, master, mixed, nav, open, optional, pick, placeholder, reason, required, role, sub, value, valueMuted, variant, view, weight | FactRow / FactList, ListRow (settings), PickerRow, EditFieldRow, EloFactRow, SettingsRow, AdminNavRow (packages/ui/src/fact-row.tsx, packages/ui/src/list-row.tsx, packages/ui/src/picker-row.tsx, packages/ui/src/edit-field-row.tsx, packages/app/src/presentation/components/elo-fact-row.tsx) | legacy | No Cell. Note: cell-row.tsx (CellRow/CellRowGrid) is NOT this piece: it is the equal-column horizontal run the library maps to Strip. The library (Cell) lists the replaced code above; EditCue (edit-field-row.tsx) stays. Most-used piece (see Build order). | 242 |
FvkSectionHead | Titles a section and offers its one way onward: count, door (action), choice, expand chevron, pager, info hint, note, bulk, stuck. | action, bulk, choice, count, expand, first, info, note, pager, stuck, title | SectionHeader variant="feed" (packages/ui/src/section-header.tsx) | partial | variant "feed" is the v2 head (32 above, 12 below, first, choice on the title line via LineSlot). Has: title, first, choice, meta (count). Missing: action as a Door pill (link is a chevron Pressable), expand, pager, info, note, bulk, stuck. CONFLICT: app command (tonal sm Button, 모두 읽음) was removed by owner review 48 ("a head carries no command") in favour of bulk. Library replaces SectionHeader and SectionBlock. | 216 |
FvkEmptyState | Nothing here / failure / offline / wall / missing record: one centred explanation and at most one way forward (kinds first, filtered, permission, error, offline, notfound, full). | action, body, compact, glyph, kind, lockup, primary, title, what | EmptyState; QueryErrorState; OfflineEmptyState; NotFoundState; UpdateRequiredScreen (packages/ui/src/empty-state.tsx, packages/app/src/presentation/components/query-error-state.tsx, packages/app/src/presentation/components/offline-empty-state.tsx, packages/app/src/presentation/components/not-found-state.tsx) | legacy | Library replaces all five. App EmptyState: icon, title, subtitle, actionLabel/onAction, secondary action, variant full|compact (mint disc). Missing: kind, what, primary, lockup, default copy for error/offline. | 187 |
FvkHeader | The 56 bar: title, sub, back, close, up to two actions or one mode (edit/select), search mode, onPhoto, scrollTitle. | actions, back, backState, close, mode, onPhoto, scrollTitle, scrolled, search, sub, title | AppHeader (+ HeaderIconButton, HeaderTextAction, CollapsingTopBar) (packages/ui/src/app-header.tsx) | legacy | Library replaces AppHeader (centred 17 title, permanent hairline), the MainTabShell title block, HeaderIconButton, HeaderTextAction (retired), HeaderActionsMenu and CollapsingTopBar. App props title, subtitle, showBack, left, right, chrome. | 87 |
FvkField | Wrapper of every form control: label, control, support line (hint | error), counter, required/optional marker, note. | children, counter, counterOver, error, hint, hintAbove, label, note, optional, required | LabeledField (packages/ui/src/labeled-field.tsx) | legacy | Library replaces it. App has label, required (asterisk), caption, error (one slot, never both), labelRight, size. Missing: hint/error as the helper line, counter (+counterOver), optional marker, note, hintAbove. | 61 |
FvkThumb | The identity image at the start of a row (photo, map, court, club, glyph, pair, achievement, face), sizes 56/96, r8. | bleed, compact, court, glyph, hue, kind, locked, medal, mono, name, pair, photo, r, size, v, venue | VenueTile, ClubAvatar, ClubLogoBubble, VenueMonogram, DateTile, CourtLinesTile (one kind each) (packages/app/src/presentation/components/sessions/venue-tile.tsx, packages/app/src/presentation/components/club-avatar.tsx, packages/app/src/presentation/components/venue-monogram.tsx, packages/ui/src/date-tile.tsx, packages/ui/src/charts/CourtLinesTile.tsx) | legacy | No component switches on kind. The library (Thumb) names all of these as replaced and keeps RemoteImage (packages/ui/src/remote-image.tsx) as the loader. | 56 |
FvkDialog | A decision that cannot be postponed: title, body, left/right actions or one acknowledgement; equal variant for consent. | actions, body, equal, one, title | ConfirmSheet (ConfirmProvider, useConfirm) (packages/ui/src/confirm-sheet.tsx) | legacy | Library replaces it but "the API stays". App: title, message, buttons[1-3]. Missing: left/right 1/3-2/3 pair, equal, one. | 55 |
FvkPersonRow | The list row for people (avatar 40, l1, l2 as MetaSegments, figure/rank columns, level, tag, meta, marker, select, control, answer pair, context/data resolution). | answer, avatar, context, control, data, extra, figure, figureW, first, l1, l2, l2Lines, label, last, level, levelSlot, marker, meta, person, rank, rankW, select, tag | ListRow size="person" (PersonSizedRow); presentation PersonRow (packages/ui/src/list-row.tsx, packages/ui/src/list-row-person.tsx, packages/app/src/presentation/components/person-row.tsx) | partial | W3-in-progress: ListRow size="person" already draws [marker 8][8][lead 40][12][text][trailing], meta, check (Select), control as 2nd stop, LineSlot. Missing: figure/rank column (Figure column), Level tag slot, answer pair (AnswerPair), extra node under l2, l2Lines clamp, club avatar/group lead, the context+person+data resolver (fvkCPersonResolve). presentation PersonRow (name/avatarUrl/badge/trailing) is the pre-flat wrapper the library replaces. | 55 |
FvkChoiceSet | Pick one or several from a small list in a form: legend, options, selected, hint, error, required/optional. | check, columns, error, fill, hint, legend, multi, optional, options, required, selected, size | ChoiceSet (packages/ui/src/choice-set.tsx) | partial | W2a. App: label (names the radiogroup), multiple, fill, columns, tall, error, children Choices. Missing vs kit: visible legend with required/optional marker, hint, size sm (36 Choices) vs tall, options/selected index API (app composes Choice children). | 49 |
FvkCellGroup | A Cell group: trims the Cell's 13 air to the 12 a row list uses under a Section head and above the next section. | children, top | RowList / FactList (packages/ui/src/row-list.tsx, packages/ui/src/fact-row.tsx) | legacy | RowList (spacing-only stack, edge classification) and FactList are the nearest; the seam rule (top/bottom trims) is not there. Depends on Cell. | 48 |
FvkNotice | A state or consequence worth a box: title, body, action, glyph, close, trailing; tone neutral/warning/danger/info/live, tier. | action, alert, body, close, glyph, meaning, tier, title, tone, trailing | Banner, Callout, Well, NetworkBanner (packages/ui/src/banner.tsx, packages/ui/src/callout.tsx, packages/ui/src/well.tsx, packages/app/src/presentation/components/network-banner.tsx) | legacy | Library (Notice) replaces all four with one Notice and a glyph allow-list. Banner (title, text, actions[]) and Callout (tone, icon, children) overlap its props. | 45 |
FvkStrip | Two to four headline numbers side by side, equal centred cells, label-first, fit-test reflow (tiles/action faces, delta, twoUp). | face, items, kind, layout, lead, tail | StatStrip (on CellRow, StatTile); ActionIconRow (packages/ui/src/stat-strip.tsx, packages/ui/src/cell-row.tsx, packages/ui/src/stat-tile.tsx, packages/ui/src/action-icon-row.tsx) | legacy | Library replaces StatStrip, CellRow/CellRowGrid, StatTile/StatGrid and ActionIconRow with one Strip. StatStrip cells (label, value, tone, press to explain) cover the plain face only: no tiles face, delta, fit-test reflow, lead/tail. | 42 |
FvkSkeleton | The loading shape of each surface at its exact pitch (media, person, cell, block, strip, line, chart, hero, field). | kind, n | Skeleton, SkeletonCard, SkeletonRow, SkeletonHero, SkeletonFlatPage (packages/ui/src/skeleton.tsx, packages/ui/src/skeleton-flat-page.tsx) | legacy | Library replaces them. SkeletonRow has a v2 person shape only. | 41 |
FvkT | The text node: a type role (display, hero, title, headline, reading, body, foot, footWrap, caption, tab, count) at the OS scale with its cap. | align, children, color, inline, lines, meaning, role, tabular, weight | Text (+ RowTitleText, FootText) (packages/ui/src/text.tsx, packages/ui/src/flat-text.tsx) | legacy | Text still carries the pre-flat role set (cardBody, cardMeta, cardTitle, navTitle, displaySm...). flat-text.tsx holds only two v2 styles (body 15/22 as RowTitleText, foot 13/18 as FootText); its header says "until W3 gives the kit its v2 text roles". Missing: the eleven FVK_TYPE roles, tabular, color keys (ink, ink2, ink3, errorText, onInverse), align, lines, weight. | 40 |
FvkSheet | The one bottom overlay for a scoped task: title row with x, description, body, footer (props via SheetBox: title, back, description, footer, sub, more, bleed, noClose). | back, bleed, children, closeState, description, footer, more, noClose, sub, title | ModalPanel placement="bottom"; ChipPickerPanel (packages/ui/src/modal-panel.tsx, packages/ui/src/chip-picker-panel.tsx) | legacy | Library replaces ModalPanel placement="bottom" (Frame close x is always present) and chip-picker-panel. ModalPanel offers Overlay/Frame/ScrollView, no title row, description or footer. | 39 |
FvkInput | One line of text, also the Number field: leading/trailing glyph, unit, password, clear, size, tabular. | clear, label, leading, multiline, password, placeholder, size, tabular, trailing, unit, value | StyledInput (single line) (packages/ui/src/labeled-field.tsx) | legacy | Library replaces it; app has secureTextEntry, invalid, textAlign, many RN passthroughs. Missing: leading/trailing glyph, unit suffix, clear, size, tabular. Won/count fields: won-amount-field.tsx, suggested-count-field.tsx also replaced. | 37 |
FvkChoice | One of a small set, or a control that opens a Sheet (pill 36/44; selected ink fill + check; chevron; removable; fill). | check, chevron, fill, label, multi, removable, selected, tall | Choice (packages/ui/src/choice.tsx) | exists | W2a. check, chevron, fill, label, selected, tall, onRemove (removable) match. Kit multi is carried by the set (role radio vs toggle button); state is a specimen. App adds expanded, disabled, role, tabIndex. | 36 |
FvkOfflineStrip | Connectivity lost while content is on screen: neutral one-line Notice with 다시 시도. | flush, slotted | NetworkBanner (packages/app/src/presentation/components/network-banner.tsx) | legacy | Library replaces it (it is also folded into Notice). | 34 |
FvkTag | Passive label of state, category or exception (sm 24 / md 28, tone x tier, optional dot/pulse dot). | bleed, children, dot, label, meaning, size, tier, tone | Tag (packages/ui/src/tag.tsx) | exists | W2a (file header "library Tag; W2a"). tone neutral/brand/success/warning/danger/info/live, tier weak/solid, size sm/md, dot boolean|pulse all present. Kit-only props are board drawing aids: meaning (shorthand resolved by fvkMeaningTone; the app resolves tone in the XxxStatusBadge wrappers), bleed, children (alias of label). App adds testID. | 34 |
FvkCtaBand | The one pinned primary action at the foot of a page, form or sheet: helper, pair, entry variants, keyboard-aware. | entry, entryBusy, entryBusyLabel, helper, helperTone, keyboard, pair, primary, scrolled, tone | BottomCtaBand; WizardShell footer (packages/ui/src/bottom-cta-band.tsx, packages/ui/src/wizard-shell.tsx) | legacy | BottomCtaBand takes children, onHeightChange, contentMaxWidth only. Library replaces it plus the WizardShell footer/primaryHint and primary-action.tsx helpers. | 33 |
FvkMenuSheet | The commands for one object (rows with icon, chevron, count tag, destructive; groups; quick row; anchored from 600 pt). | anchored, groups, question, quick, sub, title | HeaderActionsMenu; local row menus (packages/ui/src/header-actions-menu.tsx, packages/features/home/src/notification-center/notification-menu-sheet.tsx) | legacy | Library replaces HeaderActionsMenu and the local row menus; sheet below 600 pt, anchored from 600. | 33 |
FvkMediaRow | The list row for things you open: session, club, venue, sameCourt (thumb, l1-l3, trailing, control). | checked, compact, control, first, kind, l1, l2, l3, label, last, marker, nameLines, select, thumb, trailing | SessionCardV2, SessionCardFromEntry, SessionCompactRow, ClubCard, DirectoryVenueCard, VenueRow, VenueSearchResultRow (packages/app/src/presentation/components/sessions/session-card-v2.tsx, packages/app/src/presentation/components/venue-row.tsx, packages/features/clubs/src/shared/club-card.tsx) | legacy | Library MediaRow lists these as replaced. Card-based, pre-flat grammar. | 31 |
FvkValueSheet | Choose one value from a list (options with sub, chosen, several radio groups). | chosen, groups, options, title | ValueSheet (packages/ui/src/value-sheet.tsx) | partial | Sheet a Choice with chevron opens; library 8 citation. App: title, options {value,label,count}, value, onSelect. Missing: option sub, groups (several radio groups: 정렬 and 묶기), bottom-sheet geometry (it is a ModalPanel centred panel), Sheet title row/x. | 27 |
FvkBlock | The screen's one answer on the ink surface: eyebrow, figure, unit, outOf, meta, door; kinds day, elo, dues, identity, match, clubHero. | door, doorChevron, eyebrow, faces, figure, going, kind, label, meta, outOf, pay, ring, spark, tail, unit, venue, weather | HeroCard (records), TypeHero identity header, EloFactRow, SummaryCard, StatGrid hero (packages/features/records/src/cards/hero-card.tsx, packages/ui/src/type-hero.tsx, packages/ui/src/summary-card.tsx, packages/ui/src/stat-grid.tsx) | missing | No Block primitive. Library lists four compositions to become configurations of one Block (replacing the above). | 26 |
FvkSheetFooter | A Sheet footer: one lg Button or the tonal + primary pair, with an optional helper above. | helper, helperTone, label, loadingLabel, pair, tone | none (WizardShell footer / BottomCtaBand children) (packages/ui/src/wizard-shell.tsx) | missing | No footer component for a Sheet. Props: helper, helperTone, label, loadingLabel, pair, tone. | 25 |
FvkPickerCell | A field whose value is chosen elsewhere: a Cell with value (or "선택") and chevron; required/optional; error line. | error, hint, label, last, optional, required, value | PickerRow; EditFieldRow (packages/ui/src/picker-row.tsx, packages/ui/src/edit-field-row.tsx) | legacy | Library replaces both. PickerRow takes value, placeholder, active, disabled (no label, hint, error, required). | 23 |
FvkDayHeader | Names the day above a day-grouped list (24 above, 12 below, 22 line; today/rel/stuck). | date, first, rel, stuck, today | SessionDayHeader (packages/app/src/presentation/components/sessions/session-day-header.tsx) | legacy | Library replaces SessionDayHeader. App props date, first; kit adds rel, today, stuck (edge hairline). | 21 |
FvkShelf | A bounded sideways row of items, the next one peeks; presets card/tile/cell; one horizontal list per kind (1.20). | head, items, kind, label, preset | PhotoStrip (venue detail), club home preview rails (packages/features/sessions/src/directory-venue-detail/parts/photo-strip.tsx) | legacy | Library: one Shelf primitive wraps ScrollView horizontal (lint-restricted); none in ui. | 20 |
FvkTextRow | An object in a list with no leading media (documents, receipts, history): l1, l2, tag, trailing, marker, select, control. | control, extra, first, l1, l1Tag, l2, l2Lines, label, last, marker, select, trailing | ListRow (ad hoc compositions) (packages/ui/src/list-row.tsx) | legacy | Library (Text row): "Replaces: ad hoc ListRow compositions for document and history lists". ListRow size default is the pre-flat 44 row; the person pitch is only for people. | 18 |
FvkToast | Result of what the person just did, or an offer to undo: text, optional action verb then x; inverse surface; pinned above chrome. | action, text | ToastHost + toast.store (packages/app/src/presentation/components/toast-host.tsx) | legacy | Library replaces the shadowed pill with a status glyph. Store already takes message, variant, duration, action. Missing: the chrome-stack pin, the x after an action, glyph removal ("results and undo only, no glyph"), errorSurface routing. | 18 |
FvkButton | The action: tones primary/tonal/ghost/danger x sizes sm 36 / md 44 / lg 52; leading/trailing glyph, loading label, expanded. | ariaLabel, expanded, fg, flex, full, ghostBleed, icon, label, loadingLabel, meaning, size, tone, trail | Button; ActionButton; ActionPill (packages/ui/src/button.tsx, packages/ui/src/action-button.tsx, packages/ui/src/action-pill.tsx) | legacy | Library: six variants (primary, secondary, outline, ghost, danger, destructive) x xs-lg become four tones x three sizes. App already has loading/loadingLabel. Missing: tonal, ghost-pad-12 rule, icon/trail glyph, full/flex, expanded, soft-disabled. | 15 |
FvkCheckRow | Checkbox and radio rows (alias of Cell variant="option"): checked, mixed, lead, value, expand. | checked, expand, kind, label, last, lead, mixed, sub, value, weight | SelectionCard lists; StyleOptionRow (packages/ui/src/selection-card.tsx, packages/app/src/presentation/components/sessions/style-option-row.tsx) | legacy | Library replaces selection-card lists. Depends on Cell. | 14 |
FvkExpandToggle | The "show more" at a list end: full-width tonal md Button stating the count with a chevron; disclosure form is Cell variant=disclosure. | label, open, openLabel | ExpandToggle / ExpandChevron / ExpandReveal (packages/ui/src/expand-toggle.tsx) | legacy | App is a chevron-only row (never a button, owner 2026-09-28); kit is a tonal Button with count label (owner review 48). Opposite resting cue; library replaces all three. | 14 |
FvkFab | The screen's single create action on a list root: extended pill or 56 circle. | collapsed, icon, label, placed | none | missing | Library: only the pressable-visual fab physics entry exists. | 13 |
FvkFeedItemSkeleton | A Feed item loading shape at the item pitches (thumb square, four bars; who swaps the second facts bar). | n, who | SkeletonRow (avatar + 2 bars) (packages/ui/src/skeleton.tsx) | missing | SkeletonRow has a person form only (library 8 Skeleton, person); no Feed-item shape, no n repeat. | 13 |
FvkTaskCell | An official's pending-work entry: ink 500 label, count Tag, chevron. | count, label, last, tone | AdminNavRow (feature-local) (packages/features/clubs/src/club-detail/admin-nav-row.tsx) | legacy | Library (Task Cell) replaces AdminNavRow; not in ui or presentation/components. Needs Cell and the Count tag first. | 13 |
FvkScrim | The backdrop behind a sheet or dialog (ink a0.4 light, black a0.6 dark). | - | ModalPanel.Overlay (packages/ui/src/modal-panel.tsx) | partial | Overlay exists (dismissOnPress); the two scheme-dependent alphas were not checked. | 12 |
FvkTabs | Scope tabs: label + count, active underline, 48 min height. | edge, items | PillNav (pill, underline); SegmentedTabs (packages/ui/src/pill-nav.tsx, packages/ui/src/segmented-tabs.tsx) | legacy | Library replaces both (SegmentedTabs pane machinery stays). The underline variant draws a 6 dot, not a count. | 12 |
FvkTextArea | Free text: min 120, grows to 200 then scrolls; counter on the Field line. | capped, placeholder, value | StyledInput multiline (packages/ui/src/labeled-field.tsx) | legacy | Library replaces it (in-box counter becomes the Field counter). | 11 |
FvkMeta | Facts as separate nodes with the 1 px break between them; a break never ends or starts a line; wrapping meta wraps whole facts. | align, breakColor, color, inline, items, lines, role, tabular, weight | MetaSegments (packages/ui/src/meta-segments.tsx) | partial | App props: segments, tier (primary/secondary/eyebrow/caption), foot, numberOfLines. Kit adds role, weight, color, align, tabular, breakColor, inline. Header of meta-segments-visual.ts cites library 5 (one line below 1.5x text), so the wrap rule is partly v2; the 17-px leading-padding whole-fact wrapping was not verified. | 10 |
FvkWizardHeader | Wizard header (back/x, skip) and the progress row. | backLabel, backState, first, of, scrolled, skip, skipState, step, title | WizardShell (packages/ui/src/wizard-shell.tsx) | legacy | Library replaces the 4 px segments, "n / N" count and footer placement. App props stepIndex, totalSteps, stepLabel, onClose, onBack plus primary*/secondary* footer props; the kit header has back/x, skip and a progress row. | 10 |
FvkFeedItem | One item of a mixed Feed: same layout/facts order/height for session, match, post, photos, result (thumb, title, who, facts, due, counts, unread, control). | control, counts, due, facts, first, label, last, over, thumb, time, title, titleLines, unread, who | SessionCardV2 / PostFeedRow / CompletedRow (per-kind rows) (packages/app/src/presentation/components/sessions/session-card-v2.tsx, packages/features/clubs/src/shared/post-row.tsx) | legacy | Library "Replaces in a Feed": PostRow, ResultRow and the session row as Feed items (and, proposed, ClubCard, SessionCardV2, DirectoryVenueCard, VenueRow, ChallengeBlock). No shared Feed item exists. | 8 |
FvkHero | Detail hero without media: eyebrow, title (wraps), up to three facts with glyph and optional Tag. | eyebrow, facts, title, top | TypeHero (packages/ui/src/type-hero.tsx) | legacy | Library (Hero) replaces TypeHero, GlyphFactRow chip density, the lead of SessionFactsSection and VenueHero. TypeHero props eyebrow, title, titleBadge, facts, leading are close; kit facts {icon, text, tag}. | 8 |
FvkMediaBand | The full-bleed photo or map at the top of a place-like page (counter, album frame, door, actions, ratio 2.4). | actions, album, counter, door, edge, kind, ratio, scrolled, src, title | MediaHero; CollapsingTopBar + PhotoScrim; ClubAlbumBanner (packages/ui/src/media-hero.tsx, packages/ui/src/collapsing-top-bar.tsx, packages/ui/src/photo-scrim.tsx) | legacy | Library replaces them (HERO_BAND_ASPECT becomes 2.4). | 8 |
FvkScoreEntry | One way to record a finished match: type it, keypad first; modes enter/appeal/... | active, kind, matchName, mode, run, saving, sets, stored, tb, tbs, teams, viewer | ScoreEditSheet, ScoreCallSheet, ScoreCorrectionSheet, MultiSetScoreEntry (packages/features/sessions/src/scorecard/score-edit-sheet.tsx) | legacy | Library replaces the +/-1 stepper sheets. | 8 |
FvkChoiceWrap | Layout for a set of Choices: wrap rule, never one Choice alone on the last row. | children, g, overlay, role | ChoiceSet (internal layout) (packages/ui/src/choice-set.tsx) | exists | The kit wrap rule is ported inside ChoiceSet (W2a, tested on 300 inputs); not a separate export. | 7 |
FvkFeedEnd | What closes a Feed: its doors as task Cells, then the 40 tail; draws no line. | doors | FeedEnd (packages/ui/src/feed-end.tsx) | partial | App FeedEnd draws an end line (line) only, and its header defers the door Cell to W3. Owner review 48 (2026-10-28) ruled the line out ("no line"); kit takes doors. Needs: doors (task Cells), drop the line; FeedList/GroupedFeedList do not mount it yet (library: hasMore unread). | 7 |
FvkGroupTitle | A group title in a Sheet (MenuSheet, value picker, FilterSheet): 13/18 600 secondary, 8 above its group. | children, rail | SectionEyebrow (packages/ui/src/section-eyebrow.tsx) | unsure | The brief lists FvkGroupTitle as board scaffolding; core FvkGroup is, but this controls-file FvkGroupTitle is a real Sheet piece, so it is kept. SectionEyebrow (13 px 600 $textTertiary, unused, retiring per library Caption row) is the nearest; colour differs. | 7 |
FvkResultRow | One played match in a history: date/round header, 승/패/무 Tag, viewer team, opponents, games. | date, faces, first, label, last, mine, minePhotos, opponents, outcome, photos, result, score, viewer, win | MatchHistoryRow; CompletedRow (packages/app/src/presentation/components/match-history-row.tsx, packages/features/sessions/src/scorecard/completed-row.tsx) | legacy | Library (ResultRow) replaces both. MatchHistoryRow is the avatar-stack/badge/chips/ELO-delta row. | 7 |
FvkTabBar | The five app destinations 홈 클럽 경기 기록 프로필; neutral, no brand colour. | active, badges, scrolled, states | inline bar in apps/mobile/app/(tabs)/_layout.tsx (apps/mobile/app/(tabs)/_layout.tsx) | legacy | Outside packages/ui and presentation/components; library replaces the inline bar. MainTabShell (ui) is the title shell, not the bar. | 7 |
FvkStepper | A bounded integer: 136 x 36 pill (- 44, value 48, + 44); typed variant; fill = bordered 48 row. | fill, focus, label, max, min, press, text, typed, value | Stepper (packages/ui/src/stepper.tsx) | legacy | Library replaces stepper.tsx (32 px circle buttons, fullWidth bordered row). Props already map: value/min/max, fill -> fullWidth, text -> format, typed -> editable. Restyle in place is possible. | 6 |
FvkCalendar | Pick a day or a range or read activity: month grid / week strip, today ring, range band, activity dots. | disabled, dots, mode, range, selected, today | ActivityMetricCalendar; DayDotsRow; DayCalendarPicker; WeekMonthPicker; PeriodScrubberShell (packages/app/src/presentation/components/activity-metric-calendar.tsx, packages/ui/src/day-dots-row.tsx, packages/ui/src/period-scrubber-shell.tsx) | legacy | Library names all of these as replaced. | 5 |
FvkEditGuard | The discard-edit Dialog preset. | (a FvkDialog preset: its Dialog props) | none (per-screen ConfirmSheet use) | missing | As FvkLeaveGuard. | 5 |
FvkSearchTakeover | The full-screen search layer for an open-ended search inside a flow. | children, footer, keyboard, placeholder, value | VenueSearchTakeover (packages/app/src/presentation/components/venue-search-takeover.tsx) | legacy | Venue-specific (hosts VenueFinder); library replaces it with the generic takeover. | 5 |
FvkAdminSheet | The 관리 sheet: doors of a club or a session drawn from a registry (FVK_ADMIN_DOORS). | can, counts, doors, groups, loading, offline, title | AdminNavRow lists (feature-local) (packages/features/clubs/src/club-detail/admin-nav-row.tsx) | missing | No sheet or registry in code. Depends on MenuSheet/Task Cell. | 4 |
FvkDocPage | A legal/long document page: header, version caption, article headings, paragraphs, label/value tables. | articles, caption, children, name | PolicyDocumentPage (feature-local) (packages/features/profile/src/components/policy-document-page.tsx) | legacy | Library names it as the renderer to rebuild. | 4 |
FvkFieldSkeleton | Placeholder of a form field while its value loads (70 per field, 32 between). | kind, kinds, n | none (field-shaped Skeleton blocks) (packages/ui/src/skeleton.tsx) | missing | Library: ad hoc Skeleton blocks in edit/settings screens. Props kind, kinds, n. | 4 |
FvkFilterSheet | Narrow a list by facets in one Sheet with the live result count on the button. | active, count, groups | ExpandableFilterBar; MatchHistoryScopeSheet; DropdownChip/RangeChip panels (packages/app/src/presentation/components/expandable-filter-bar.tsx, packages/app/src/presentation/components/match-history-scope-sheet.tsx) | legacy | Library replaces the inline expandable panel and the scope sheet. DropdownChip/RangeChip were rebuilt on Choice in W2a. | 4 |
FvkMatchTag | The Tag of a match state (Match row states map). | - | MatchStatusBadge / ScoreStatusBadge (packages/app/src/presentation/components/status/status-badges.tsx) | partial | Wrappers already render Tag; library says they learn awaiting_result and the review state via a pure deriveMatchResultState (not in code). | 4 |
FvkComment | A reply under a post with one level of replies. | author, body, clamp, kind, more, replies, sending, time | CommentRow (packages/features/clubs/src/post-detail/comment-row.tsx) | legacy | Feature-local. | 3 |
FvkDoorPill | A door drawn as a control: the Choice 36 pill with a right chevron naming the place it opens. | chevron, label, size, surface | none (SectionHeader link text; ActionPill) (packages/ui/src/section-header.tsx, packages/ui/src/action-pill.tsx) | missing | Library (Door pill): replaces the text-link action of SectionHeader and the Block door. Props chevron, label, size, surface. | 3 |
FvkFlag | The club flag medallion (monogram, shape, hue, preset). | hue, label, preset, shape, size | FlagMedallion (packages/ui/src/flag-medallion.tsx) | exists | Same job. Prop mapping: hue -> palette, preset -> presetKey, label/shape/size same; app adds seed (generative) and scale. Mapping not tested. | 3 |
FvkHostReviewSheet | How the host settles a review: keep, change, or leave the match out. | by, list, proposal, sets, teams, where | none | missing | Library: nothing today; replaces the Decide sheet. | 3 |
FvkLeftLine | What's left: the one line that stands in for a Strip whose numbers only restate the counts under it. | facts, lead | none | missing | A form of Strip in the library (Strip, What's left); no component. Props facts, lead. | 3 |
FvkMatchShell | The one match row, header first: facts line (court first), one trailing element (Tag/text/sm Button), team lines, answer. | answer, control, faces, first, header, history, label, last, me, outcome, photos, result, sets, teams, tiebreaks, trailing, viewer, winner | MatchRowHeader + LiveMatchRow / CompletedRow (packages/app/src/presentation/components/sessions/match-row-header.tsx, packages/features/sessions/src/scorecard/live-tab/live-match-row.tsx) | legacy | Library (Match row states) replaces live-match-row, completed-row and match-card status badges. | 3 |
FvkPhotoGrid | Three-column full-bleed square grid, gap 2, +N tile, select checkboxes. | count, more, offset, picked, select | FeedPhotoStrip (in PostFeedRow); club-album-grid (packages/features/clubs/src/shared/post-row.tsx, packages/features/clubs/src/club-album-grid.ts) | legacy | Library replaces both. | 3 |
FvkPodium | The top three as faces, columns ordered 2-1-3, medal ring, Level tag. | entries | LeaderboardPodium (packages/app/src/presentation/components/leaderboard-podium.tsx) | legacy | Library replaces it. App props top3, onAvatarPress; kit entries[{name, elo, level, photo}]. | 3 |
FvkPostRow | One post of the club feed. | author, body, chips, clamp, club, comments, event, hearts, kind, page, photos, reacted, result, time | PostFeedRow, FeedPhotoStrip (packages/features/clubs/src/shared/post-row.tsx) | legacy | Feature-local; library also folds it into Feed item. | 3 |
FvkSlider | A value or band dialled by drag with the live value tag; single, band, hue; stepper alternative (WCAG 2.5.7). | band, focusThumb, frac, hue, stepper, tag, tagW | ValueSlider; RangeBandSlider; TimeBandSlider; HueSlider (packages/ui/src/value-slider.tsx, packages/ui/src/range-band-slider.tsx, packages/ui/src/time-band-slider.tsx, packages/ui/src/hue-slider.tsx) | legacy | Library replaces all four (and the two cores). Missing: the stepper alternative, live value tag above the thumb. | 3 |
FvkStickyEdge | The one chrome line: a 1 px hairline on a bar edge while content scrolls under it. | at, offset | none (permanent borders on AppHeader, BottomCtaBand, tab bar) | missing | Library: one useScrollEdge(offsetY) hook; absent in code (grep found no useScrollEdge). | 3 |
FvkAnswerPair | Two sm tonal Buttons under the last line of a request row (수락/거절, 참석/불참), stack from 1.5x. | no, yes | none (inline accept/decline buttons per row) | missing | Library: "Replaces: inline accept and decline buttons in request rows" (hand-rolled). | 2 |
FvkAvatarRow | Row of faces 40 x n, gap 8, "+N" as a gray100 circle; pressable as a whole; anonymous circles for a non-member preview. | more, people | AvatarStack / ParticipationCluster (packages/ui/src/avatar-stack.tsx, packages/ui/src/participation-cluster.tsx) | legacy | AvatarStack overlaps by 6 (names, avatarUrls, max, size, fit); library (Avatar, Roster) replaces it. Kit people[] ({name, photo} | {anonymous}), more. | 2 |
FvkBand | The one change of kind on a page: full-bleed 12 tall with 24 air. | air | Divider seam="section" (packages/ui/src/divider.tsx) | legacy | Library (Band) replaces Divider seam="section" and FlatColumn section dividers (hairline vs a 12-tall band). | 2 |
FvkCaptionRow | One quiet line (or two) of context at the rail: state/support line, section note, page legend. | attach, glyph, label, text, tone | none (SectionEyebrow, unused, retires) (packages/ui/src/section-eyebrow.tsx) | missing | Library: "None (new)"; SectionEyebrow retires. | 2 |
FvkCoachmark | A one-time pointer at a control a person would not find alone (inverse surface, arrow, step n/N). | action, arrow, arrowX, of, step, target, text | CoachmarkTooltip (spotlight tour render) (packages/app/src/presentation/components/coachmark-tooltip.tsx) | legacy | Library replaces it plus tour-ref-injector. App: title, body, dismissLabel; kit text, action, step/of, arrow. | 2 |
FvkComposer | The bar that writes the next message or comment. | edge, keyboard, kind, reply, text | compose-bar; comment-composer (packages/features/messaging/src/dm-thread/compose-bar.tsx, packages/features/clubs/src/post-detail/comment-composer.tsx) | legacy | Two feature-local copies. | 2 |
FvkCountdownNotice | The clock on a held seat: warning Notice with a tabular countdown; expired danger form. | account, expired, time | payment-hold banner on useLiveCountdown (feature-local) (packages/app/src/presentation/hooks/use-live-countdown.ts) | legacy | Library replaces the banner in the session-detail fee flow. Needs Notice. | 2 |
FvkExplainerSheet | The rules behind a Score Sheet: group title and a two-line Cell per part with the maximum. | groupTitle, note, rules, title | TierInfoSheet / TrustTierInfoSheet (explainer ModalPanels, different content) (packages/app/src/presentation/components/tier-info-sheet.tsx) | missing | Library: new PartnerScoreInfoSheet. Needs Sheet and Cell. | 2 |
FvkFormStrip | Recent form: the last five results in order plus the summary. | label, results, summary | none | missing | Library: "None (new)"; used by head-to-head-screen. | 2 |
FvkHelperLine | THE line under an object (a field support line and its error, a CTA band helper, a Caption row body): text, array of facts or node; tone neutral or danger with alert glyph. | glyph, meaning, role, size, text, tone | LabeledField caption/error slot (inline) (packages/ui/src/labeled-field.tsx) | missing | No standalone helper line. LabeledField renders caption and error as one slot ("error ?? caption") which the library lists as replaced (Field hint, Field error and validation). Needs: tone, glyph, array-of-facts text, node form. | 2 |
FvkIcon | The glyph (name, size, stroke, filled, colour) from the kit glyph set. | bleed, color, filled, name, size, stroke | Icon (packages/ui/src/icon.tsx) | partial | Icon takes a Lucide component and a named size from the app scale; the kit addresses glyphs by name with stroke, filled, bleed. The library 1.10 sizes (20/24) are not confirmed against icon-sizes.ts (not read). | 2 |
FvkLeaveGuard | The leave-without-saving Dialog preset. | (a FvkDialog preset: its Dialog props) | none (per-screen ConfirmSheet use) | missing | One preset over Dialog; I did not search features for existing unsaved-changes prompts. | 2 |
FvkLockup | Brand lockup: mark slot and wordmark; stacked/horizontal; canvas/ink/ball ground. | bare, form, ground | Logo (packages/ui/src/logo.tsx) | legacy | App Logo: variant default/reverse/mark, width, height. Kit: form, ground, height, bare. Brand name is open again (owner 2026-10-27). | 2 |
FvkMapFace | The picked venue on a static map under its Cell (350 x 140 r12, ink pin). | - | PickedVenueCard (packages/app/src/presentation/components/picked-venue-card.tsx) | legacy | Library replaces it. | 2 |
FvkRoster | Who is coming as one row of four faces (3 + door beyond four), role pill for host and guest. | door, label, people, total | ParticipationCluster / AvatarStack / EmptySlotRow; PersonRow preview list in ParticipationSection (packages/ui/src/participation-cluster.tsx, packages/ui/src/avatar-stack.tsx, packages/ui/src/empty-slot-row.tsx) | legacy | Library (Roster) replaces the ParticipationSection PersonRow preview list, AvatarStack and EmptySlotRow. | 2 |
FvkScoreSheet | Read-only Sheet explaining one number as the sum of its parts for one person (추천 점수). | max, parts, person, sum, title, total | PartnerCandidateCard expanding bars (partner-suggester-screen) (packages/features/clubs/src/partner-suggester-screen.tsx) | missing | Library: new PartnerScoreSheet. Props parts, person, sum, total, title. | 2 |
FvkSearchField | A find field: 40 tall, r12, gray100, 44 target; focused shows 취소; filled shows clear. | noCancel, placeholder, value | SearchBar (packages/ui/src/search-bar.tsx) | legacy | Library replaces SearchBar ($card fill, border, 44 pill). App has value/onChange/placeholder/clear; no 취소 on focus, no noCancel. | 2 |
FvkSpinner | Work in progress inside a control: the platform activity indicator, 20, ink (white on danger). | color, size | none (raw ActivityIndicator, eight files; Button loading) | missing | Library (Spinner): raw ActivityIndicator uses to replace. Props size, color. | 2 |
FvkTimeWheel | Start and end time in one Sheet with one wheel; invalid and wrap states. | back, commit, end, invalid, start, tab, title, wrap | two single-value DateTimePickerModal rows (quiet hours, venue-hours-composer) (packages/features/sessions/src/venue-hours-composer.tsx) | legacy | Library replaces the separate start/end rows. | 2 |
FvkBracket | A knockout's rounds as columns, viewer's path marked. | champion, label, me, rounds | none | missing | Library: nothing draws a bracket today. | 1 |
FvkButtonPair | Two buttons in a Dialog or Sheet footer: tonal one third, primary or danger two thirds; equal/stacked. | equal, left, right, size, stacked | ConfirmSheet button row (packages/ui/src/confirm-sheet.tsx) | legacy | Library replaces variantFor in confirm-sheet (outline cancel + primary/destructive). | 1 |
FvkCheckBox | Checkbox: 24 square r6, 2 px edge, checked ink + white check, mixed minus. | checked, mixed | SelectionCheck (packages/ui/src/selection-check.tsx) | legacy | Library replaces it. App: checked, shape square|circle; no mixed state. | 1 |
FvkConsentGroup | Master row 전체 동의 then every consent item, each with 보기. | checked, errors, items | onboarding-step-consent (SelectionCheck row per purpose) (packages/features/onboarding/src/onboarding-step-consent.tsx) | legacy | Library replaces it. | 1 |
FvkCoverGrid | Pick one picture of a set (club default covers): 2 columns of 16:9, ring and check on the chosen. | chosen, count | DefaultCoverPicker (feature-local) (packages/features/clubs/src/settings/default-cover-picker.tsx) | legacy | Library replaces it. | 1 |
FvkDateFilterSheet | The date picker of a filter: presets as a ChoiceSet over a Calendar. | selection | none | missing | Needs Calendar, ChoiceSet and Sheet. | 1 |
FvkDatePicker | One date or time on the platform wheel inside the Sheet. | kind, title, value | raw react-native-modal-datetime-picker (six files) | legacy | Library: raw DateTimePickerModal to replace; no shared wrapper in ui. | 1 |
FvkGroupCard | One tournament group as one card (bordered, r16) with heading, facts, done rows. | children, done, doneRows, facts, title, trail | none | missing | Library (Group card): new. | 1 |
FvkGroupTable | One group's standings in a 예선 리그, advancing teams marked. | advance, caption, label, rows | none | missing | Library: nothing; TournamentBoardScreen flattens pools. | 1 |
FvkHeatmap | One month of results by day (won more, lost more, even), with scrubber. | mode, month, scrub | ActivityHeatmapCard (feature-local) (packages/features/records/src/cards/activity-heatmap-card.tsx) | legacy | Library replaces it. | 1 |
FvkIconButton | A glyph-only action: 48 target, 24/20 glyph, tones ink/secondary/danger/inverse/onInverse, selected, badge, onPhoto, square. | badge, bleed, glyph, icon, label, onPhoto, selected, tone, variant | HeaderIconButton; ActionIconButton; RemoveIconButton; SaveButton (packages/ui/src/header-icon-button.tsx, packages/ui/src/action-icon-button.tsx, packages/ui/src/remove-icon-button.tsx, packages/app/src/presentation/components/sessions/save-button.tsx) | legacy | Library replaces all four (three components for one job; 44 targets, 36 hit box). | 1 |
FvkLevelBand | THE NTRP-range control: two-knob slider over the five tiers. | value | TierRangeSelector (packages/app/src/presentation/components/tier-range-selector.tsx) | partial | Kit comment: "the app TierRangeSelector over RangeBandSlider". Same job; props minTierIndex/maxTierIndex/onChange/discipline vs kit value. Sits on RangeBandSlider, which Slider replaces. | 1 |
FvkLiveTag | Says a session or match is being played now: danger-solid Tag with a pulsing 6 dot. | label, size | Tag tone="live" dot="pulse" (via the in-progress XxxStatusBadge) (packages/ui/src/tag.tsx, packages/app/src/presentation/components/status/status-badges.tsx) | exists | Rebuilt in W2a phase 3 ("in progress is the Live tag", live has its own colour: commit 9976e1f7f). The kit takes label and size; the app composes it. pulse is a specimen frame. | 1 |
FvkPhotoTiles | Composer photo tiles: 4-up, remove x, add tile, drag order, uploading state. | dragging, limit, photos, uploading | attachment strip in post-create-screen (feature-local) (packages/features/clubs/src/post-create-screen.tsx) | legacy | Library replaces it. | 1 |
FvkSwipeAction | Left swipe reveals one 72-wide verb (delete danger | archive ink). | action, children, h, label | none | missing | Library: "None (new)". Accelerator only. | 1 |
FvkThread | Bubbles composed with the message spacing, date/system lines. | group, items | use-dm-chat-items + dm-thread-screen spacing literals (packages/features/messaging/src/dm-thread/use-dm-chat-items.ts) | legacy | Feature-local; library wants one constants file. | 1 |
FvkTrustMeter | The 신뢰 score told as a place on a 0-100 scale: figure, one story line, bar with tick at 50. | delta, line, score, start, steps | TrustTierBadge / TrustTierInfoSheet (four-tier, different model) (packages/app/src/presentation/components/trust-tier-badge.tsx, packages/app/src/presentation/components/trust-tier-info-sheet.tsx) | missing | Library (Trust) replaces the four-tier badge and sheet with a 0-100 score; no meter component. Props: score, delta, line, start, steps. | 1 |
FvkWindowBar | One person's hours on the session time axis (4 track, 4 ink bar, window tag). | band, label, tag | none | missing | Library (Window bar): new. Props band, label, tag. | 1 |
FvkAvatar | A person or group as a circle: photo else initials, group pair, overlap, anonymous, glyph, presence, ring, onInk. | anonymous, bleed, fit, glyph, group, name, onInk, overlap, photo, presence, ring, size | AvatarBubble (packages/ui/src/avatar-bubble.tsx) | partial | Has name/initials, imageUrl, size ladder, glyph (library 6 clause), silhouette for empty name, outlined (ring). Missing: group (footprint pair), presence, onInk, fit="overlap" on one avatar (that is AvatarStack), tone vocabulary differs (primary/neutral/muted). | 0 |
FvkBadged | The badged icon host: a size x size box (24/20) holding a glyph with its dot or count mark at the corner. | badge, children, size | CornerCountBadge (packages/ui/src/corner-count-badge.tsx) | legacy | Library (Tab bar, Header icon badge) replaces CornerCountBadge (18 circle, amber and red tones) with a Badged host that owns the corner offsets. App props: tone, label, children; kit: badge (dot | true | number | 99+), size. | 0 |
FvkBreak | The 1 px MetaBreak between facts (never a middle dot). | color, h | MetaBreak (packages/ui/src/meta-segments.tsx) | exists | Props color, h (height) vs app color, opacity: same job. | 0 |
FvkBubble | One message in a conversation; runs, group sender labels. | group, last, mine, reactions, text, time | dm-message-row (packages/features/messaging/src/dm-thread/dm-message-row.tsx) | legacy | Feature-local. | 0 |
FvkCellLine | A hairline between single-line cells, inset to the rail. | - | Divider (packages/ui/src/divider.tsx) | unsure | Divider is the one 1 px hairline (inset full/card, seam section, bleed). Not verified that it can inset to the rail; the cell hairline is also part of Cell, which does not exist yet. | 0 |
FvkChart | One trend over time (ELO path, metric) with exact readout on demand. | at, label, mode, readout, series, ticks | SparkLine (packages/ui/src/charts/SparkLine.tsx) | legacy | Library replaces SparkLine (120 x 48) and EloTrendCard. Kit props series, ticks, readout, at, mode, label. | 0 |
FvkClubHero | A club's identity under its MediaBand: logo straddling the band, name, tagline, three facts. | hue, kind, logo, meta, mono, name, overlap, photo, tagline | ClubPlaceHeader (feature-local) (packages/features/clubs/src/club-detail/club-place-header.tsx) | legacy | Library replaces the photo seam and hero in ClubPlaceHeader. PlaceShell / CollapsingHeaderLayer in ui are the place scaffolding. | 0 |
FvkCountTag | A count (20 tall, numeral 11/16 700, grows with text to 1.3x); tone danger/neutral/ink; h=16 ring form for tab bar and header badge. | h, meaning, n, ring, tone | CornerCountBadge (corner form only) (packages/ui/src/corner-count-badge.tsx) | partial | Only the corner/ring use. Missing: the inline count beside a label (via LineSlot), tones neutral and ink, the 1.3 text-scale growth rule, 99+ cap rule, meaning. | 0 |
FvkDot | The 8 leading marker (unread = danger); a 6 dot rides an icon or a tab. | meaning, size, tone | Dot (packages/ui/src/dot.tsx) | partial | Dot takes a raw colour token (size, color); kit takes tone/meaning (unread = danger). Library (Unread marker) names DOT_SIZE.XS 7 and the hung dot as replaced. | 0 |
FvkEditSheet | Edit one field in place: x in the title and one 저장; kinds text/number/choice/picker; dirty, saving, error. | closeState, dirty, error, hint, inputState, keyboard, kind, options, pickerLabel, placeholder, saving, selected, title, unit, value | EditControlModal / EditFieldModal (packages/app/src/presentation/components/edit-field-modal.tsx) | legacy | Library replaces both (취소 + 저장 pair, no x). App: open, title, onClose, onSave, commit save|apply, initialValue, multiline, maxLength. | 0 |
FvkFieldNote | What an answer does: a line (<=24 syllables, optional lock/eye glyph) or a box with a title. | box, glyph, text, title | AttachedPanel (when it holds only a sentence) (packages/ui/src/attached-panel.tsx) | legacy | Library replaces AttachedPanel for that use. | 0 |
FvkHeaderBadge | A mark on a header icon: 6 danger dot or the 16-tall Count tag (99+), 1.5 canvas ring. | anchor, n | CornerCountBadge (packages/ui/src/corner-count-badge.tsx) | legacy | Library replaces it with Badged (see FvkBadged). | 0 |
FvkInfoHint | The "?" beside a term with its own explainer Sheet: 20 help glyph, 44 hit overlay, spoken "<term> 안내". | term | InfoHintButton (packages/ui/src/info-hint-button.tsx) | exists | Library (Info hint): "Nothing: InfoHintButton is this part, which the kit now draws". App props onPress, aria-label; kit term maps to the label. Glyph size/hit target not measured. | 0 |
FvkLevelTag | The NTRP band numeral in a ball circle (24, grows with its numeral to 36). | onInk, spoken, value | EloTierBadge / TierBadgeChrome (different grammar) (packages/app/src/presentation/components/elo-tier-badge.tsx, packages/app/src/presentation/components/tier-badge-utils.tsx) | legacy | Library: EloTierBadge and TierBadgeChrome are replaced "as level chrome" (emoji glyph plus label pill). No numeral circle exists. Kit props: value, onInk, spoken. | 0 |
FvkLineSlot | The one way to attach an adornment (Tag, count, glyph, dot, spinner) to a label: a box as tall as the label first line, centring the adornment. | children, role | LineSlot (packages/ui/src/line-slot.tsx) | partial | W2a. Same job; the app takes lineHeight + scaleClass (the caller computes the line) where the kit takes role + cls (the slot computes it). Needs the v2 text roles (FvkT row) to derive lineHeight from a role. | 0 |
FvkLiveRow | The one line under the header saying a session is being played now: Live tag then date and venue. | date, venue | SessionLiveAnchor / SessionLiveBand (packages/app/src/presentation/components/sessions/session-live-anchor.tsx) | legacy | Library replaces the solid LIVE band. App takes sessionId/session/matches (data-bound); kit takes date, venue. | 0 |
FvkMatchRow | One match in a round of a 대진표 or scorecard in every result state (upcoming, playing, enter, ...). | by, court, elapsed, first, header, holds, last, me, n, noOfficial, overdue, queued, refused, rowState, score, side, teams, viewer, who | LiveMatchRow, CompletedRow, match-card (packages/features/sessions/src/scorecard/live-tab/live-match-row.tsx) | legacy | Library: one pure deriveMatchResultState supplies Tag, action and copy. | 0 |
FvkMetaC | Block zone C: meta in white a0.85, 15/22 500, 2 lines (3 from 1.5x). | children | none (slot of Block) | missing | Slot of Block; same status as Block. | 0 |
FvkNames | Partners as separate names with the 1 px break, non-breaking within a name, viewer suffix (나), tone ink/secondary. | me, names, role, tone, weight | joinNames() / PLAYER_JOINER " & " (packages/app/src/presentation/utils/match-history-display.ts) | legacy | Library (Team lines): joinNames() becomes the one place names are joined; today match-history-display.ts joins with PLAYER_JOINER = " & " locally. | 0 |
FvkOgCard | The share (Open Graph) card for a page: kind, title, sub. | kind, sub, title | OgCard / OgSessionCard (apps/web, satori inline styles) (apps/web/lib/og-card.tsx) | legacy | Outside packages/ui. Same job but a separate web-only renderer (1200 x 630, inline styles, props eyebrow/title/subtitle/chips); no board draws FvkOgCard (flat-v2-brand.jsx draws its own FbOgCard). | 0 |
FvkProviderButton | A sign-in button per provider (kakao, naver, apple, google) in the provider own colours inside our geometry. | helper, label, provider | Kakao button in login-screen (packages/app/src/presentation/screens/auth/login-screen.tsx) | legacy | Library replaces it; only the Kakao button exists. | 0 |
FvkReactions | React with one of six (quick row) and see who did (chip summary). | chips, kind, selected | ReactionPickerModal in post-row; QUICK_REACTIONS (packages/features/clubs/src/shared/post-row.tsx) | legacy | Library: three reaction vocabularies become one domain registry; no shared component. | 0 |
FvkScoreStop | The stop-the-match step of ScoreEntry (경기 중단). | active, by, resume, sets, step, stop, teams, viewer | none | missing | Library: "the stop step is new". | 0 |
FvkScoreTable | The score table of ScoreEntry (sets, tiebreaks, viewer). | active, bad, me, sets, tbActive, tbs, teams, viewer | MultiSetScoreEntry (progressive-row logic) (packages/features/sessions/src/multi-set-score-entry.tsx) | legacy | Library keeps the progressive-row logic only. | 0 |
FvkSearchBar | The bar of the search takeover and header search mode (Search field, focused or filled). | placeholder, value | SearchBar (packages/ui/src/search-bar.tsx) | legacy | Same as FvkSearchField. | 0 |
FvkSelectBar | Select-mode header: 취소, "n명 선택됨", 전체 선택. | allSelected, n, noun | none | missing | Retired by the owner 2026-10-25 (library "Picking rows, Select mode retired"); 0 uses on the six boards (2 on flat-v2-lib-rows.jsx). No build needed; the kit function can be deleted. | 0 |
FvkSkBar | Skeleton bar: gray100 at a static .75 frame; pulse draws one frame of the 800 ms pulse. | bg, h, r | Skeleton (packages/ui/src/skeleton.tsx) | legacy | Skeleton (shimmer, width/height/borderRadius/circle) is named by the library (Skeleton) as replaced; no static-frame/bg props. shimmer.ts to retire. | 0 |
FvkSwitch | Immediate on/off: track 52 x 32 inside a 48 target; applies at once. | on | TogglePill (packages/ui/src/toggle-pill.tsx) | legacy | Library replaces it (display-only 44 x 24). App prop: value only (pair with a Pressable); kit adds state. | 0 |
FvkTeamLines | Two teams with players and their games, in every place a match is drawn (history, row, set headers, tiebreaks, faces). | colExtra, colExtraLabel, context, faces, headerNote, history, me, outcome, photos, renderSet, result, setHeader, sets, teams, tiebreaks, viewer, winner | MatchScoreboard (TeamRow, ScoreCell) (packages/app/src/presentation/components/sessions/match-scoreboard.tsx) | legacy | Library: MatchScoreboard TeamRow/ScoreCell are the starting point; LiveMatchRow, CompletedRow, MatchHistoryRow also replaced. | 0 |
FvkTextAction | THE text action: a destination as text (link/cue), 44 target as a hit overlay, kinds link/cue, chevron option. | chevron, cue, kind, label, onInverse, role, tone | SectionHeaderLink (inside SectionHeader); HeaderTextAction (header only) (packages/ui/src/section-header.tsx, packages/ui/src/header-text-action.tsx) | missing | No general text action. HeaderTextAction is retired by the library (Header) and the SectionHeader link is a chevron Pressable local to that component. | 0 |
FvkTooltip | The web hover name of an icon: inverse surface, r6. | at, children | none | missing | No tooltip component (CoachmarkTooltip is a different job). | 0 |
Build order
Pieces ranked by uses across the six boards (occurrences of <FvkName, not matching lines as grep -c would count; a piece drawn inside a loop or a helper counts once per source occurrence). Status is the table's. Dependencies matter more than rank at the top: the v2 text roles feed LineSlot and every row, Button feeds every footer and Sheet, Cell feeds CellGroup, CheckRow, PickerCell, TaskCell and the Consent group, Sheet feeds Dialog, MenuSheet, ValueSheet, EditSheet and FilterSheet.
| # | Piece | Uses | hub | detail | list-a | list-b | forms | auth | Status | Needs first |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | FvkCell | 242 | 21 | 81 | 18 | 1 | 109 | 12 | legacy | v2 text roles, Switch, Tag (exists), Divider/cell hairline |
| 2 | FvkSectionHead | 216 | 29 | 72 | 55 | 22 | 36 | 2 | partial | Door pill, InfoHint (exists), Button tonal sm |
| 3 | FvkEmptyState | 187 | 19 | 37 | 56 | 36 | 28 | 11 | legacy | Button, v2 text roles |
| 4 | FvkHeader | 87 | 4 | 46 | 22 | 3 | 2 | 10 | legacy | IconButton, Badged, Sticky edge, Search field |
| 5 | FvkField | 61 | 2 | 4 | 5 | 0 | 46 | 4 | legacy | Helper line, Input/TextArea |
| 6 | FvkThumb | 56 | 23 | 3 | 7 | 6 | 14 | 3 | legacy | RemoteImage (stays), Avatar |
| 7 | FvkDialog | 55 | 2 | 23 | 15 | 2 | 12 | 1 | legacy | Sheet surface, Button pair |
| 8 | FvkPersonRow | 55 | 12 | 7 | 17 | 12 | 7 | 0 | partial | Avatar group/ring, Level tag, AnswerPair, Figure column |
| 9 | FvkChoiceSet | 49 | 0 | 6 | 2 | 0 | 41 | 0 | partial | Choice (exists), Field legend/hint/required |
| 10 | FvkCellGroup | 48 | 9 | 8 | 5 | 1 | 23 | 2 | legacy | Cell |
| 11 | FvkNotice | 45 | 5 | 28 | 1 | 1 | 6 | 4 | legacy | Button, glyph allow-list |
| 12 | FvkStrip | 42 | 6 | 27 | 7 | 2 | 0 | 0 | legacy | v2 text roles |
| 13 | FvkSkeleton | 41 | 0 | 17 | 10 | 1 | 11 | 2 | legacy | static-frame bar |
| 14 | FvkT | 40 | 6 | 7 | 2 | 8 | 0 | 17 | legacy | the eleven FVK_TYPE roles |
| 15 | FvkSheet | 39 | 5 | 22 | 6 | 2 | 4 | 0 | legacy | Button, IconButton, v2 text roles |
| 16 | FvkInput | 37 | 1 | 0 | 5 | 0 | 27 | 4 | legacy | Field, Button (clear) |
| 17 | FvkChoice | 36 | 10 | 16 | 6 | 4 | 0 | 0 | exists | done (W2a) |
| 18 | FvkOfflineStrip | 34 | 4 | 6 | 8 | 1 | 12 | 3 | legacy | Notice |
| 19 | FvkTag | 34 | 2 | 13 | 8 | 5 | 3 | 3 | exists | done (W2a) |
| 20 | FvkCtaBand | 33 | 2 | 13 | 3 | 1 | 3 | 11 | legacy | Button (lg, pair), helper line, sticky edge |
| 21 | FvkMenuSheet | 33 | 5 | 16 | 5 | 0 | 7 | 0 | legacy | Sheet, Cell (command variant), GroupTitle |
| 22 | FvkMediaRow | 31 | 3 | 5 | 4 | 4 | 13 | 2 | legacy | Thumb, Tag, MetaSegments, Row trailing control |
| 23 | FvkValueSheet | 27 | 4 | 3 | 7 | 2 | 11 | 0 | partial | Sheet, Cell (option variant) |
| 24 | FvkBlock | 26 | 14 | 11 | 1 | 0 | 0 | 0 | missing | v2 text roles, Door pill, Avatar (onInk), ring/spark chart |
| 25 | FvkSheetFooter | 25 | 2 | 17 | 3 | 1 | 2 | 0 | missing | Button, Button pair, helper line |
| 26 | FvkPickerCell | 23 | 0 | 5 | 4 | 0 | 14 | 0 | legacy | Cell |
| 27 | FvkDayHeader | 21 | 0 | 5 | 15 | 1 | 0 | 0 | legacy | v2 text roles, sticky edge |
| 28 | FvkShelf | 20 | 9 | 10 | 0 | 0 | 1 | 0 | legacy | Thumb, Avatar, MediaRow (card preset) |
| 29 | FvkTextRow | 18 | 1 | 3 | 6 | 7 | 1 | 0 | legacy | Tag, Row trailing control, leading marker slot |
| 30 | FvkToast | 18 | 2 | 8 | 6 | 1 | 1 | 0 | legacy | IconButton (onInverse), Button/text action |
Below the top 30, used on the boards (uses): FvkButton 15, FvkCheckRow 14, FvkExpandToggle 14, FvkFab 13, FvkFeedItemSkeleton 13, FvkTaskCell 13, FvkScrim 12, FvkTabs 12, FvkTextArea 11, FvkMeta 10, FvkWizardHeader 10, FvkFeedItem 8, FvkHero 8, FvkMediaBand 8, FvkScoreEntry 8, FvkChoiceWrap 7, FvkFeedEnd 7, FvkGroupTitle 7, FvkResultRow 7, FvkTabBar 7, FvkStepper 6, FvkCalendar 5, FvkEditGuard 5, FvkSearchTakeover 5, FvkAdminSheet 4, FvkDocPage 4, FvkFieldSkeleton 4, FvkFilterSheet 4, FvkMatchTag 4, FvkComment 3, FvkDoorPill 3, FvkFlag 3, FvkHostReviewSheet 3, FvkLeftLine 3, FvkMatchShell 3, FvkPhotoGrid 3, FvkPodium 3, FvkPostRow 3, FvkSlider 3, FvkStickyEdge 3, FvkAnswerPair 2, FvkAvatarRow 2, FvkBand 2, FvkCaptionRow 2, FvkCoachmark 2, FvkComposer 2, FvkCountdownNotice 2, FvkExplainerSheet 2, FvkFormStrip 2, FvkHelperLine 2, FvkIcon 2, FvkLeaveGuard 2, FvkLockup 2, FvkMapFace 2, FvkRoster 2, FvkScoreSheet 2, FvkSearchField 2, FvkSpinner 2, FvkTimeWheel 2, FvkBracket 1, FvkButtonPair 1, FvkCheckBox 1, FvkConsentGroup 1, FvkCoverGrid 1, FvkDateFilterSheet 1, FvkDatePicker 1, FvkGroupCard 1, FvkGroupTable 1, FvkHeatmap 1, FvkIconButton 1, FvkLevelBand 1, FvkLiveTag 1, FvkPhotoTiles 1, FvkSwipeAction 1, FvkThread 1, FvkTrustMeter 1, FvkWindowBar 1.
No direct use on the six boards but drawn inside other kit pieces (build with the piece that hosts them): FvkAvatar (14 in kit), FvkBadged (2 in kit), FvkBreak (2 in kit), FvkBubble (1 in kit), FvkCellLine (2 in kit), FvkClubHero (2 in kit), FvkCountTag (7 in kit), FvkDot (2 in kit), FvkHeaderBadge (1 in kit), FvkInfoHint (2 in kit), FvkLevelTag (4 in kit), FvkLineSlot (21 in kit), FvkMatchRow (1 in kit), FvkMetaC (2 in kit), FvkNames (3 in kit), FvkProviderButton (1 in kit), FvkReactions (3 in kit), FvkScoreStop (1 in kit), FvkScoreTable (2 in kit), FvkSearchBar (2 in kit), FvkSkBar (8 in kit), FvkSwitch (1 in kit), FvkTeamLines (7 in kit), FvkTextAction (4 in kit), FvkTooltip (1 in kit).
No use on the six boards and none inside the kit, but drawn on a library or flow board (flat-v2-lib-*.jsx, flat-v2-flows.jsx, flat-v2-match-row.jsx; board in brackets with its count): FvkChart (lib-surfaces 6), FvkEditSheet (lib-behaviour 1, lib-overlays 10), FvkLiveRow (lib-surfaces 1, lib-chrome 1, lib-rows 3), FvkSelectBar (lib-rows 2). Build with the page that adopts them.
Drawn nowhere in any flat-v2-*.jsx board: FvkFieldNote, FvkOgCard. (FvkSelectBar is retired; the others are candidates to drop from the kit or are not yet placed.)
Suggested sequence, from the counts and the dependencies above: (1) v2 text roles (FvkT) and Button/IconButton, which every other row consumes; (2) Cell with CellGroup (the largest count, and Switch, PickerCell, CheckRow, TaskCell, Consent hang off it); (3) SectionHead (feed variant extended: Door pill, bulk, note, pager, info) and EmptyState; (4) Header, Sheet (then Dialog, MenuSheet, ValueSheet, EditSheet, FilterSheet), Field/Input/TextArea/ChoiceSet gaps; (5) rows: PersonRow gaps, Thumb, MediaRow/FeedItem, TextRow, Strip, Block; (6) Notice, Skeleton, Toast; (7) the long tail (scoring, social, charts).
Findings that contradict the app or the record
SectionHeader variant="feed"carries acommandprop (tonal sm Button, "모두 읽음"), which owner review 48 removed from the kit ("a head carries no command"); the kit offersbulkfor a group verb instead.FeedEnddraws an end line (line), which owner review 48 (2026-10-28) ruled out; the kitFvkFeedEndtakesdoorsonly and draws no line. FeedList/GroupedFeedList do not mount a Feed end yet (the library noteshasMoreis unread).ExpandToggle(app) is a chevron-only row by owner ruling 2026-09-28 ("stay away from text-based control buttons"); the kitFvkExpandToggleis a full-width tonal md Button stating the count (owner review 48). The two rulings point opposite ways; the library says the kit replaces the app component.cell-row.tsx(CellRow) is not the kit Cell. It is the equal-column horizontal run that the library folds into Strip. There is no Cell in the app; FactRow, ListRow settings uses, PickerRow, EditFieldRow and EloFactRow are what it replaces.- The brief lists
FvkGroupTitleas scaffolding. The coreFvkGroupis; the controls-fileFvkGroupTitle(13/18 600 secondary, a Sheet group title) is a real piece and is tabled (status unsure). FvkSelectBaris retired (library "Select mode retired", owner 2026-10-25) and has no use on the six boards (two on the library rows board); it can leave the kit.
Excluded from the table
| Function | Why |
|---|---|
FvkFrame | board scaffolding |
FvkFrames | board scaffolding |
FvkPhone | board scaffolding |
FvkPhoneTop | board scaffolding |
FvkBoard | board scaffolding |
FvkGroup | board scaffolding |
FvkSection | board scaffolding |
FvkSpecTable | board scaffolding |
FvkFlowScript | board scaffolding |
FvkFlowStep | board scaffolding |
FvkFocusScript | board scaffolding |
FvkFocusOrder | board scaffolding |
FvkGhostPage | board scaffolding |
FvkKeyboard | board scaffolding |
FvkAndroidStatus | board scaffolding |
FvkHomeIndicator | board scaffolding |
FvkGuide | board scaffolding |
FvkProvider | board provider (theme, scale, locale context) |
FvkStage | component-specimen stage (a canvas without phone chrome) |
FvkStatusBar | draws the phone status bar |
FvkSysNav | draws the Android system navigation bar |
FvkSlotScript | board script (slot wiring) |
FvkSpec | spec layer, hidden unless Show specs is on |
FvkDim | spec-layer measurement drawn over a phone |
FvkSlice | board frame: a page dimmed behind an overlay in a small context |
FvkSurface | board palette provider for what is drawn inside a Sheet or Dialog |
FvkCaret | specimen of the text caret inside an Input (platform behaviour) |
FvkWheel | specimen of the native date/time wheel (the platform draws it) |
FvkSheetBox | palette-wrapper internal: FvkSheet draws it; its props are used for FvkSheet |
FvkDialogBox | palette-wrapper internal: FvkDialog draws it; its props are used for FvkDialog |
FvkMenuSheetBox | palette-wrapper internal: FvkMenuSheet draws it; its props are used for FvkMenuSheet |
FvkRail | board wrapper for the rail padding; the app gets the rail from CONTENT_INSET (content-insets.ts) and FlatColumn |
Also excluded by the brief's pattern: every FvkC*, FvkCh* and FvkCtl* function (kit-private). FvkFlowScript and FvkFocusScript take no props and were not in the extraction; they are board scaffolding.