Skip to content

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).

StatusCountMeaning here
exists7same job, props cover the kit's (specimen-only props aside)
partial14a v2 or near-v2 app component with named missing props or variants
legacy84the app has the job, built on the pre-flat grammar; the library's "Replaces in code" names it as replaced
missing31no component (or only an ad hoc inline implementation)
unsure2mapping 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 pieceJobPropsApp componentStatusGapUses
FvkCellA 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, weightFactRow / 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)legacyNo 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
FvkSectionHeadTitles 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, titleSectionHeader variant="feed" (packages/ui/src/section-header.tsx)partialvariant "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
FvkEmptyStateNothing 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, whatEmptyState; 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)legacyLibrary 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
FvkHeaderThe 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, titleAppHeader (+ HeaderIconButton, HeaderTextAction, CollapsingTopBar) (packages/ui/src/app-header.tsx)legacyLibrary 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
FvkFieldWrapper of every form control: label, control, support line (hint | error), counter, required/optional marker, note.children, counter, counterOver, error, hint, hintAbove, label, note, optional, requiredLabeledField (packages/ui/src/labeled-field.tsx)legacyLibrary 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
FvkThumbThe 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, venueVenueTile, 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)legacyNo 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
FvkDialogA decision that cannot be postponed: title, body, left/right actions or one acknowledgement; equal variant for consent.actions, body, equal, one, titleConfirmSheet (ConfirmProvider, useConfirm) (packages/ui/src/confirm-sheet.tsx)legacyLibrary replaces it but "the API stays". App: title, message, buttons[1-3]. Missing: left/right 1/3-2/3 pair, equal, one.55
FvkPersonRowThe 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, tagListRow 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)partialW3-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
FvkChoiceSetPick 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, sizeChoiceSet (packages/ui/src/choice-set.tsx)partialW2a. 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
FvkCellGroupA 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, topRowList / FactList (packages/ui/src/row-list.tsx, packages/ui/src/fact-row.tsx)legacyRowList (spacing-only stack, edge classification) and FactList are the nearest; the seam rule (top/bottom trims) is not there. Depends on Cell.48
FvkNoticeA 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, trailingBanner, 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)legacyLibrary (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
FvkStripTwo 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, tailStatStrip (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)legacyLibrary 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
FvkSkeletonThe loading shape of each surface at its exact pitch (media, person, cell, block, strip, line, chart, hero, field).kind, nSkeleton, SkeletonCard, SkeletonRow, SkeletonHero, SkeletonFlatPage (packages/ui/src/skeleton.tsx, packages/ui/src/skeleton-flat-page.tsx)legacyLibrary replaces them. SkeletonRow has a v2 person shape only.41
FvkTThe 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, weightText (+ RowTitleText, FootText) (packages/ui/src/text.tsx, packages/ui/src/flat-text.tsx)legacyText 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
FvkSheetThe 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, titleModalPanel placement="bottom"; ChipPickerPanel (packages/ui/src/modal-panel.tsx, packages/ui/src/chip-picker-panel.tsx)legacyLibrary 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
FvkInputOne 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, valueStyledInput (single line) (packages/ui/src/labeled-field.tsx)legacyLibrary 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
FvkChoiceOne 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, tallChoice (packages/ui/src/choice.tsx)existsW2a. 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
FvkOfflineStripConnectivity lost while content is on screen: neutral one-line Notice with 다시 시도.flush, slottedNetworkBanner (packages/app/src/presentation/components/network-banner.tsx)legacyLibrary replaces it (it is also folded into Notice).34
FvkTagPassive label of state, category or exception (sm 24 / md 28, tone x tier, optional dot/pulse dot).bleed, children, dot, label, meaning, size, tier, toneTag (packages/ui/src/tag.tsx)existsW2a (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
FvkCtaBandThe 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, toneBottomCtaBand; WizardShell footer (packages/ui/src/bottom-cta-band.tsx, packages/ui/src/wizard-shell.tsx)legacyBottomCtaBand takes children, onHeightChange, contentMaxWidth only. Library replaces it plus the WizardShell footer/primaryHint and primary-action.tsx helpers.33
FvkMenuSheetThe commands for one object (rows with icon, chevron, count tag, destructive; groups; quick row; anchored from 600 pt).anchored, groups, question, quick, sub, titleHeaderActionsMenu; local row menus (packages/ui/src/header-actions-menu.tsx, packages/features/home/src/notification-center/notification-menu-sheet.tsx)legacyLibrary replaces HeaderActionsMenu and the local row menus; sheet below 600 pt, anchored from 600.33
FvkMediaRowThe 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, trailingSessionCardV2, 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)legacyLibrary MediaRow lists these as replaced. Card-based, pre-flat grammar.31
FvkValueSheetChoose one value from a list (options with sub, chosen, several radio groups).chosen, groups, options, titleValueSheet (packages/ui/src/value-sheet.tsx)partialSheet 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
FvkBlockThe 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, weatherHeroCard (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)missingNo Block primitive. Library lists four compositions to become configurations of one Block (replacing the above).26
FvkSheetFooterA Sheet footer: one lg Button or the tonal + primary pair, with an optional helper above.helper, helperTone, label, loadingLabel, pair, tonenone (WizardShell footer / BottomCtaBand children) (packages/ui/src/wizard-shell.tsx)missingNo footer component for a Sheet. Props: helper, helperTone, label, loadingLabel, pair, tone.25
FvkPickerCellA field whose value is chosen elsewhere: a Cell with value (or "선택") and chevron; required/optional; error line.error, hint, label, last, optional, required, valuePickerRow; EditFieldRow (packages/ui/src/picker-row.tsx, packages/ui/src/edit-field-row.tsx)legacyLibrary replaces both. PickerRow takes value, placeholder, active, disabled (no label, hint, error, required).23
FvkDayHeaderNames the day above a day-grouped list (24 above, 12 below, 22 line; today/rel/stuck).date, first, rel, stuck, todaySessionDayHeader (packages/app/src/presentation/components/sessions/session-day-header.tsx)legacyLibrary replaces SessionDayHeader. App props date, first; kit adds rel, today, stuck (edge hairline).21
FvkShelfA bounded sideways row of items, the next one peeks; presets card/tile/cell; one horizontal list per kind (1.20).head, items, kind, label, presetPhotoStrip (venue detail), club home preview rails (packages/features/sessions/src/directory-venue-detail/parts/photo-strip.tsx)legacyLibrary: one Shelf primitive wraps ScrollView horizontal (lint-restricted); none in ui.20
FvkTextRowAn 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, trailingListRow (ad hoc compositions) (packages/ui/src/list-row.tsx)legacyLibrary (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
FvkToastResult of what the person just did, or an offer to undo: text, optional action verb then x; inverse surface; pinned above chrome.action, textToastHost + toast.store (packages/app/src/presentation/components/toast-host.tsx)legacyLibrary 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
FvkButtonThe 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, trailButton; ActionButton; ActionPill (packages/ui/src/button.tsx, packages/ui/src/action-button.tsx, packages/ui/src/action-pill.tsx)legacyLibrary: 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
FvkCheckRowCheckbox and radio rows (alias of Cell variant="option"): checked, mixed, lead, value, expand.checked, expand, kind, label, last, lead, mixed, sub, value, weightSelectionCard lists; StyleOptionRow (packages/ui/src/selection-card.tsx, packages/app/src/presentation/components/sessions/style-option-row.tsx)legacyLibrary replaces selection-card lists. Depends on Cell.14
FvkExpandToggleThe "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, openLabelExpandToggle / ExpandChevron / ExpandReveal (packages/ui/src/expand-toggle.tsx)legacyApp 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
FvkFabThe screen's single create action on a list root: extended pill or 56 circle.collapsed, icon, label, placednonemissingLibrary: only the pressable-visual fab physics entry exists.13
FvkFeedItemSkeletonA Feed item loading shape at the item pitches (thumb square, four bars; who swaps the second facts bar).n, whoSkeletonRow (avatar + 2 bars) (packages/ui/src/skeleton.tsx)missingSkeletonRow has a person form only (library 8 Skeleton, person); no Feed-item shape, no n repeat.13
FvkTaskCellAn official's pending-work entry: ink 500 label, count Tag, chevron.count, label, last, toneAdminNavRow (feature-local) (packages/features/clubs/src/club-detail/admin-nav-row.tsx)legacyLibrary (Task Cell) replaces AdminNavRow; not in ui or presentation/components. Needs Cell and the Count tag first.13
FvkScrimThe backdrop behind a sheet or dialog (ink a0.4 light, black a0.6 dark).-ModalPanel.Overlay (packages/ui/src/modal-panel.tsx)partialOverlay exists (dismissOnPress); the two scheme-dependent alphas were not checked.12
FvkTabsScope tabs: label + count, active underline, 48 min height.edge, itemsPillNav (pill, underline); SegmentedTabs (packages/ui/src/pill-nav.tsx, packages/ui/src/segmented-tabs.tsx)legacyLibrary replaces both (SegmentedTabs pane machinery stays). The underline variant draws a 6 dot, not a count.12
FvkTextAreaFree text: min 120, grows to 200 then scrolls; counter on the Field line.capped, placeholder, valueStyledInput multiline (packages/ui/src/labeled-field.tsx)legacyLibrary replaces it (in-box counter becomes the Field counter).11
FvkMetaFacts 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, weightMetaSegments (packages/ui/src/meta-segments.tsx)partialApp 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
FvkWizardHeaderWizard header (back/x, skip) and the progress row.backLabel, backState, first, of, scrolled, skip, skipState, step, titleWizardShell (packages/ui/src/wizard-shell.tsx)legacyLibrary 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
FvkFeedItemOne 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, whoSessionCardV2 / PostFeedRow / CompletedRow (per-kind rows) (packages/app/src/presentation/components/sessions/session-card-v2.tsx, packages/features/clubs/src/shared/post-row.tsx)legacyLibrary "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
FvkHeroDetail hero without media: eyebrow, title (wraps), up to three facts with glyph and optional Tag.eyebrow, facts, title, topTypeHero (packages/ui/src/type-hero.tsx)legacyLibrary (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
FvkMediaBandThe 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, titleMediaHero; CollapsingTopBar + PhotoScrim; ClubAlbumBanner (packages/ui/src/media-hero.tsx, packages/ui/src/collapsing-top-bar.tsx, packages/ui/src/photo-scrim.tsx)legacyLibrary replaces them (HERO_BAND_ASPECT becomes 2.4).8
FvkScoreEntryOne way to record a finished match: type it, keypad first; modes enter/appeal/...active, kind, matchName, mode, run, saving, sets, stored, tb, tbs, teams, viewerScoreEditSheet, ScoreCallSheet, ScoreCorrectionSheet, MultiSetScoreEntry (packages/features/sessions/src/scorecard/score-edit-sheet.tsx)legacyLibrary replaces the +/-1 stepper sheets.8
FvkChoiceWrapLayout for a set of Choices: wrap rule, never one Choice alone on the last row.children, g, overlay, roleChoiceSet (internal layout) (packages/ui/src/choice-set.tsx)existsThe kit wrap rule is ported inside ChoiceSet (W2a, tested on 300 inputs); not a separate export.7
FvkFeedEndWhat closes a Feed: its doors as task Cells, then the 40 tail; draws no line.doorsFeedEnd (packages/ui/src/feed-end.tsx)partialApp 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
FvkGroupTitleA group title in a Sheet (MenuSheet, value picker, FilterSheet): 13/18 600 secondary, 8 above its group.children, railSectionEyebrow (packages/ui/src/section-eyebrow.tsx)unsureThe 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
FvkResultRowOne 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, winMatchHistoryRow; CompletedRow (packages/app/src/presentation/components/match-history-row.tsx, packages/features/sessions/src/scorecard/completed-row.tsx)legacyLibrary (ResultRow) replaces both. MatchHistoryRow is the avatar-stack/badge/chips/ELO-delta row.7
FvkTabBarThe five app destinations 홈 클럽 경기 기록 프로필; neutral, no brand colour.active, badges, scrolled, statesinline bar in apps/mobile/app/(tabs)/_layout.tsx (apps/mobile/app/(tabs)/_layout.tsx)legacyOutside packages/ui and presentation/components; library replaces the inline bar. MainTabShell (ui) is the title shell, not the bar.7
FvkStepperA bounded integer: 136 x 36 pill (- 44, value 48, + 44); typed variant; fill = bordered 48 row.fill, focus, label, max, min, press, text, typed, valueStepper (packages/ui/src/stepper.tsx)legacyLibrary 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
FvkCalendarPick a day or a range or read activity: month grid / week strip, today ring, range band, activity dots.disabled, dots, mode, range, selected, todayActivityMetricCalendar; 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)legacyLibrary names all of these as replaced.5
FvkEditGuardThe discard-edit Dialog preset.(a FvkDialog preset: its Dialog props)none (per-screen ConfirmSheet use)missingAs FvkLeaveGuard.5
FvkSearchTakeoverThe full-screen search layer for an open-ended search inside a flow.children, footer, keyboard, placeholder, valueVenueSearchTakeover (packages/app/src/presentation/components/venue-search-takeover.tsx)legacyVenue-specific (hosts VenueFinder); library replaces it with the generic takeover.5
FvkAdminSheetThe 관리 sheet: doors of a club or a session drawn from a registry (FVK_ADMIN_DOORS).can, counts, doors, groups, loading, offline, titleAdminNavRow lists (feature-local) (packages/features/clubs/src/club-detail/admin-nav-row.tsx)missingNo sheet or registry in code. Depends on MenuSheet/Task Cell.4
FvkDocPageA legal/long document page: header, version caption, article headings, paragraphs, label/value tables.articles, caption, children, namePolicyDocumentPage (feature-local) (packages/features/profile/src/components/policy-document-page.tsx)legacyLibrary names it as the renderer to rebuild.4
FvkFieldSkeletonPlaceholder of a form field while its value loads (70 per field, 32 between).kind, kinds, nnone (field-shaped Skeleton blocks) (packages/ui/src/skeleton.tsx)missingLibrary: ad hoc Skeleton blocks in edit/settings screens. Props kind, kinds, n.4
FvkFilterSheetNarrow a list by facets in one Sheet with the live result count on the button.active, count, groupsExpandableFilterBar; MatchHistoryScopeSheet; DropdownChip/RangeChip panels (packages/app/src/presentation/components/expandable-filter-bar.tsx, packages/app/src/presentation/components/match-history-scope-sheet.tsx)legacyLibrary replaces the inline expandable panel and the scope sheet. DropdownChip/RangeChip were rebuilt on Choice in W2a.4
FvkMatchTagThe Tag of a match state (Match row states map).-MatchStatusBadge / ScoreStatusBadge (packages/app/src/presentation/components/status/status-badges.tsx)partialWrappers already render Tag; library says they learn awaiting_result and the review state via a pure deriveMatchResultState (not in code).4
FvkCommentA reply under a post with one level of replies.author, body, clamp, kind, more, replies, sending, timeCommentRow (packages/features/clubs/src/post-detail/comment-row.tsx)legacyFeature-local.3
FvkDoorPillA door drawn as a control: the Choice 36 pill with a right chevron naming the place it opens.chevron, label, size, surfacenone (SectionHeader link text; ActionPill) (packages/ui/src/section-header.tsx, packages/ui/src/action-pill.tsx)missingLibrary (Door pill): replaces the text-link action of SectionHeader and the Block door. Props chevron, label, size, surface.3
FvkFlagThe club flag medallion (monogram, shape, hue, preset).hue, label, preset, shape, sizeFlagMedallion (packages/ui/src/flag-medallion.tsx)existsSame job. Prop mapping: hue -> palette, preset -> presetKey, label/shape/size same; app adds seed (generative) and scale. Mapping not tested.3
FvkHostReviewSheetHow the host settles a review: keep, change, or leave the match out.by, list, proposal, sets, teams, wherenonemissingLibrary: nothing today; replaces the Decide sheet.3
FvkLeftLineWhat's left: the one line that stands in for a Strip whose numbers only restate the counts under it.facts, leadnonemissingA form of Strip in the library (Strip, What's left); no component. Props facts, lead.3
FvkMatchShellThe 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, winnerMatchRowHeader + LiveMatchRow / CompletedRow (packages/app/src/presentation/components/sessions/match-row-header.tsx, packages/features/sessions/src/scorecard/live-tab/live-match-row.tsx)legacyLibrary (Match row states) replaces live-match-row, completed-row and match-card status badges.3
FvkPhotoGridThree-column full-bleed square grid, gap 2, +N tile, select checkboxes.count, more, offset, picked, selectFeedPhotoStrip (in PostFeedRow); club-album-grid (packages/features/clubs/src/shared/post-row.tsx, packages/features/clubs/src/club-album-grid.ts)legacyLibrary replaces both.3
FvkPodiumThe top three as faces, columns ordered 2-1-3, medal ring, Level tag.entriesLeaderboardPodium (packages/app/src/presentation/components/leaderboard-podium.tsx)legacyLibrary replaces it. App props top3, onAvatarPress; kit entries[{name, elo, level, photo}].3
FvkPostRowOne post of the club feed.author, body, chips, clamp, club, comments, event, hearts, kind, page, photos, reacted, result, timePostFeedRow, FeedPhotoStrip (packages/features/clubs/src/shared/post-row.tsx)legacyFeature-local; library also folds it into Feed item.3
FvkSliderA 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, tagWValueSlider; 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)legacyLibrary replaces all four (and the two cores). Missing: the stepper alternative, live value tag above the thumb.3
FvkStickyEdgeThe one chrome line: a 1 px hairline on a bar edge while content scrolls under it.at, offsetnone (permanent borders on AppHeader, BottomCtaBand, tab bar)missingLibrary: one useScrollEdge(offsetY) hook; absent in code (grep found no useScrollEdge).3
FvkAnswerPairTwo sm tonal Buttons under the last line of a request row (수락/거절, 참석/불참), stack from 1.5x.no, yesnone (inline accept/decline buttons per row)missingLibrary: "Replaces: inline accept and decline buttons in request rows" (hand-rolled).2
FvkAvatarRowRow of faces 40 x n, gap 8, "+N" as a gray100 circle; pressable as a whole; anonymous circles for a non-member preview.more, peopleAvatarStack / ParticipationCluster (packages/ui/src/avatar-stack.tsx, packages/ui/src/participation-cluster.tsx)legacyAvatarStack overlaps by 6 (names, avatarUrls, max, size, fit); library (Avatar, Roster) replaces it. Kit people[] ({name, photo} | {anonymous}), more.2
FvkBandThe one change of kind on a page: full-bleed 12 tall with 24 air.airDivider seam="section" (packages/ui/src/divider.tsx)legacyLibrary (Band) replaces Divider seam="section" and FlatColumn section dividers (hairline vs a 12-tall band).2
FvkCaptionRowOne quiet line (or two) of context at the rail: state/support line, section note, page legend.attach, glyph, label, text, tonenone (SectionEyebrow, unused, retires) (packages/ui/src/section-eyebrow.tsx)missingLibrary: "None (new)"; SectionEyebrow retires.2
FvkCoachmarkA one-time pointer at a control a person would not find alone (inverse surface, arrow, step n/N).action, arrow, arrowX, of, step, target, textCoachmarkTooltip (spotlight tour render) (packages/app/src/presentation/components/coachmark-tooltip.tsx)legacyLibrary replaces it plus tour-ref-injector. App: title, body, dismissLabel; kit text, action, step/of, arrow.2
FvkComposerThe bar that writes the next message or comment.edge, keyboard, kind, reply, textcompose-bar; comment-composer (packages/features/messaging/src/dm-thread/compose-bar.tsx, packages/features/clubs/src/post-detail/comment-composer.tsx)legacyTwo feature-local copies.2
FvkCountdownNoticeThe clock on a held seat: warning Notice with a tabular countdown; expired danger form.account, expired, timepayment-hold banner on useLiveCountdown (feature-local) (packages/app/src/presentation/hooks/use-live-countdown.ts)legacyLibrary replaces the banner in the session-detail fee flow. Needs Notice.2
FvkExplainerSheetThe rules behind a Score Sheet: group title and a two-line Cell per part with the maximum.groupTitle, note, rules, titleTierInfoSheet / TrustTierInfoSheet (explainer ModalPanels, different content) (packages/app/src/presentation/components/tier-info-sheet.tsx)missingLibrary: new PartnerScoreInfoSheet. Needs Sheet and Cell.2
FvkFormStripRecent form: the last five results in order plus the summary.label, results, summarynonemissingLibrary: "None (new)"; used by head-to-head-screen.2
FvkHelperLineTHE 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, toneLabeledField caption/error slot (inline) (packages/ui/src/labeled-field.tsx)missingNo 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
FvkIconThe glyph (name, size, stroke, filled, colour) from the kit glyph set.bleed, color, filled, name, size, strokeIcon (packages/ui/src/icon.tsx)partialIcon 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
FvkLeaveGuardThe leave-without-saving Dialog preset.(a FvkDialog preset: its Dialog props)none (per-screen ConfirmSheet use)missingOne preset over Dialog; I did not search features for existing unsaved-changes prompts.2
FvkLockupBrand lockup: mark slot and wordmark; stacked/horizontal; canvas/ink/ball ground.bare, form, groundLogo (packages/ui/src/logo.tsx)legacyApp Logo: variant default/reverse/mark, width, height. Kit: form, ground, height, bare. Brand name is open again (owner 2026-10-27).2
FvkMapFaceThe 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)legacyLibrary replaces it.2
FvkRosterWho is coming as one row of four faces (3 + door beyond four), role pill for host and guest.door, label, people, totalParticipationCluster / 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)legacyLibrary (Roster) replaces the ParticipationSection PersonRow preview list, AvatarStack and EmptySlotRow.2
FvkScoreSheetRead-only Sheet explaining one number as the sum of its parts for one person (추천 점수).max, parts, person, sum, title, totalPartnerCandidateCard expanding bars (partner-suggester-screen) (packages/features/clubs/src/partner-suggester-screen.tsx)missingLibrary: new PartnerScoreSheet. Props parts, person, sum, total, title.2
FvkSearchFieldA find field: 40 tall, r12, gray100, 44 target; focused shows 취소; filled shows clear.noCancel, placeholder, valueSearchBar (packages/ui/src/search-bar.tsx)legacyLibrary replaces SearchBar ($card fill, border, 44 pill). App has value/onChange/placeholder/clear; no 취소 on focus, no noCancel.2
FvkSpinnerWork in progress inside a control: the platform activity indicator, 20, ink (white on danger).color, sizenone (raw ActivityIndicator, eight files; Button loading)missingLibrary (Spinner): raw ActivityIndicator uses to replace. Props size, color.2
FvkTimeWheelStart and end time in one Sheet with one wheel; invalid and wrap states.back, commit, end, invalid, start, tab, title, wraptwo single-value DateTimePickerModal rows (quiet hours, venue-hours-composer) (packages/features/sessions/src/venue-hours-composer.tsx)legacyLibrary replaces the separate start/end rows.2
FvkBracketA knockout's rounds as columns, viewer's path marked.champion, label, me, roundsnonemissingLibrary: nothing draws a bracket today.1
FvkButtonPairTwo buttons in a Dialog or Sheet footer: tonal one third, primary or danger two thirds; equal/stacked.equal, left, right, size, stackedConfirmSheet button row (packages/ui/src/confirm-sheet.tsx)legacyLibrary replaces variantFor in confirm-sheet (outline cancel + primary/destructive).1
FvkCheckBoxCheckbox: 24 square r6, 2 px edge, checked ink + white check, mixed minus.checked, mixedSelectionCheck (packages/ui/src/selection-check.tsx)legacyLibrary replaces it. App: checked, shape square|circle; no mixed state.1
FvkConsentGroupMaster row 전체 동의 then every consent item, each with 보기.checked, errors, itemsonboarding-step-consent (SelectionCheck row per purpose) (packages/features/onboarding/src/onboarding-step-consent.tsx)legacyLibrary replaces it.1
FvkCoverGridPick one picture of a set (club default covers): 2 columns of 16:9, ring and check on the chosen.chosen, countDefaultCoverPicker (feature-local) (packages/features/clubs/src/settings/default-cover-picker.tsx)legacyLibrary replaces it.1
FvkDateFilterSheetThe date picker of a filter: presets as a ChoiceSet over a Calendar.selectionnonemissingNeeds Calendar, ChoiceSet and Sheet.1
FvkDatePickerOne date or time on the platform wheel inside the Sheet.kind, title, valueraw react-native-modal-datetime-picker (six files)legacyLibrary: raw DateTimePickerModal to replace; no shared wrapper in ui.1
FvkGroupCardOne tournament group as one card (bordered, r16) with heading, facts, done rows.children, done, doneRows, facts, title, trailnonemissingLibrary (Group card): new.1
FvkGroupTableOne group's standings in a 예선 리그, advancing teams marked.advance, caption, label, rowsnonemissingLibrary: nothing; TournamentBoardScreen flattens pools.1
FvkHeatmapOne month of results by day (won more, lost more, even), with scrubber.mode, month, scrubActivityHeatmapCard (feature-local) (packages/features/records/src/cards/activity-heatmap-card.tsx)legacyLibrary replaces it.1
FvkIconButtonA 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, variantHeaderIconButton; 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)legacyLibrary replaces all four (three components for one job; 44 targets, 36 hit box).1
FvkLevelBandTHE NTRP-range control: two-knob slider over the five tiers.valueTierRangeSelector (packages/app/src/presentation/components/tier-range-selector.tsx)partialKit comment: "the app TierRangeSelector over RangeBandSlider". Same job; props minTierIndex/maxTierIndex/onChange/discipline vs kit value. Sits on RangeBandSlider, which Slider replaces.1
FvkLiveTagSays a session or match is being played now: danger-solid Tag with a pulsing 6 dot.label, sizeTag tone="live" dot="pulse" (via the in-progress XxxStatusBadge) (packages/ui/src/tag.tsx, packages/app/src/presentation/components/status/status-badges.tsx)existsRebuilt 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
FvkPhotoTilesComposer photo tiles: 4-up, remove x, add tile, drag order, uploading state.dragging, limit, photos, uploadingattachment strip in post-create-screen (feature-local) (packages/features/clubs/src/post-create-screen.tsx)legacyLibrary replaces it.1
FvkSwipeActionLeft swipe reveals one 72-wide verb (delete danger | archive ink).action, children, h, labelnonemissingLibrary: "None (new)". Accelerator only.1
FvkThreadBubbles composed with the message spacing, date/system lines.group, itemsuse-dm-chat-items + dm-thread-screen spacing literals (packages/features/messaging/src/dm-thread/use-dm-chat-items.ts)legacyFeature-local; library wants one constants file.1
FvkTrustMeterThe 신뢰 score told as a place on a 0-100 scale: figure, one story line, bar with tick at 50.delta, line, score, start, stepsTrustTierBadge / TrustTierInfoSheet (four-tier, different model) (packages/app/src/presentation/components/trust-tier-badge.tsx, packages/app/src/presentation/components/trust-tier-info-sheet.tsx)missingLibrary (Trust) replaces the four-tier badge and sheet with a 0-100 score; no meter component. Props: score, delta, line, start, steps.1
FvkWindowBarOne person's hours on the session time axis (4 track, 4 ink bar, window tag).band, label, tagnonemissingLibrary (Window bar): new. Props band, label, tag.1
FvkAvatarA 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, sizeAvatarBubble (packages/ui/src/avatar-bubble.tsx)partialHas 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
FvkBadgedThe badged icon host: a size x size box (24/20) holding a glyph with its dot or count mark at the corner.badge, children, sizeCornerCountBadge (packages/ui/src/corner-count-badge.tsx)legacyLibrary (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
FvkBreakThe 1 px MetaBreak between facts (never a middle dot).color, hMetaBreak (packages/ui/src/meta-segments.tsx)existsProps color, h (height) vs app color, opacity: same job.0
FvkBubbleOne message in a conversation; runs, group sender labels.group, last, mine, reactions, text, timedm-message-row (packages/features/messaging/src/dm-thread/dm-message-row.tsx)legacyFeature-local.0
FvkCellLineA hairline between single-line cells, inset to the rail.-Divider (packages/ui/src/divider.tsx)unsureDivider 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
FvkChartOne trend over time (ELO path, metric) with exact readout on demand.at, label, mode, readout, series, ticksSparkLine (packages/ui/src/charts/SparkLine.tsx)legacyLibrary replaces SparkLine (120 x 48) and EloTrendCard. Kit props series, ticks, readout, at, mode, label.0
FvkClubHeroA club's identity under its MediaBand: logo straddling the band, name, tagline, three facts.hue, kind, logo, meta, mono, name, overlap, photo, taglineClubPlaceHeader (feature-local) (packages/features/clubs/src/club-detail/club-place-header.tsx)legacyLibrary replaces the photo seam and hero in ClubPlaceHeader. PlaceShell / CollapsingHeaderLayer in ui are the place scaffolding.0
FvkCountTagA 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, toneCornerCountBadge (corner form only) (packages/ui/src/corner-count-badge.tsx)partialOnly 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
FvkDotThe 8 leading marker (unread = danger); a 6 dot rides an icon or a tab.meaning, size, toneDot (packages/ui/src/dot.tsx)partialDot 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
FvkEditSheetEdit 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, valueEditControlModal / EditFieldModal (packages/app/src/presentation/components/edit-field-modal.tsx)legacyLibrary replaces both (취소 + 저장 pair, no x). App: open, title, onClose, onSave, commit save|apply, initialValue, multiline, maxLength.0
FvkFieldNoteWhat an answer does: a line (<=24 syllables, optional lock/eye glyph) or a box with a title.box, glyph, text, titleAttachedPanel (when it holds only a sentence) (packages/ui/src/attached-panel.tsx)legacyLibrary replaces AttachedPanel for that use.0
FvkHeaderBadgeA mark on a header icon: 6 danger dot or the 16-tall Count tag (99+), 1.5 canvas ring.anchor, nCornerCountBadge (packages/ui/src/corner-count-badge.tsx)legacyLibrary replaces it with Badged (see FvkBadged).0
FvkInfoHintThe "?" beside a term with its own explainer Sheet: 20 help glyph, 44 hit overlay, spoken "<term> 안내".termInfoHintButton (packages/ui/src/info-hint-button.tsx)existsLibrary (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
FvkLevelTagThe NTRP band numeral in a ball circle (24, grows with its numeral to 36).onInk, spoken, valueEloTierBadge / TierBadgeChrome (different grammar) (packages/app/src/presentation/components/elo-tier-badge.tsx, packages/app/src/presentation/components/tier-badge-utils.tsx)legacyLibrary: EloTierBadge and TierBadgeChrome are replaced "as level chrome" (emoji glyph plus label pill). No numeral circle exists. Kit props: value, onInk, spoken.0
FvkLineSlotThe 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, roleLineSlot (packages/ui/src/line-slot.tsx)partialW2a. 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
FvkLiveRowThe one line under the header saying a session is being played now: Live tag then date and venue.date, venueSessionLiveAnchor / SessionLiveBand (packages/app/src/presentation/components/sessions/session-live-anchor.tsx)legacyLibrary replaces the solid LIVE band. App takes sessionId/session/matches (data-bound); kit takes date, venue.0
FvkMatchRowOne 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, whoLiveMatchRow, CompletedRow, match-card (packages/features/sessions/src/scorecard/live-tab/live-match-row.tsx)legacyLibrary: one pure deriveMatchResultState supplies Tag, action and copy.0
FvkMetaCBlock zone C: meta in white a0.85, 15/22 500, 2 lines (3 from 1.5x).childrennone (slot of Block)missingSlot of Block; same status as Block.0
FvkNamesPartners as separate names with the 1 px break, non-breaking within a name, viewer suffix (나), tone ink/secondary.me, names, role, tone, weightjoinNames() / PLAYER_JOINER " & " (packages/app/src/presentation/utils/match-history-display.ts)legacyLibrary (Team lines): joinNames() becomes the one place names are joined; today match-history-display.ts joins with PLAYER_JOINER = " & " locally.0
FvkOgCardThe share (Open Graph) card for a page: kind, title, sub.kind, sub, titleOgCard / OgSessionCard (apps/web, satori inline styles) (apps/web/lib/og-card.tsx)legacyOutside 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
FvkProviderButtonA sign-in button per provider (kakao, naver, apple, google) in the provider own colours inside our geometry.helper, label, providerKakao button in login-screen (packages/app/src/presentation/screens/auth/login-screen.tsx)legacyLibrary replaces it; only the Kakao button exists.0
FvkReactionsReact with one of six (quick row) and see who did (chip summary).chips, kind, selectedReactionPickerModal in post-row; QUICK_REACTIONS (packages/features/clubs/src/shared/post-row.tsx)legacyLibrary: three reaction vocabularies become one domain registry; no shared component.0
FvkScoreStopThe stop-the-match step of ScoreEntry (경기 중단).active, by, resume, sets, step, stop, teams, viewernonemissingLibrary: "the stop step is new".0
FvkScoreTableThe score table of ScoreEntry (sets, tiebreaks, viewer).active, bad, me, sets, tbActive, tbs, teams, viewerMultiSetScoreEntry (progressive-row logic) (packages/features/sessions/src/multi-set-score-entry.tsx)legacyLibrary keeps the progressive-row logic only.0
FvkSearchBarThe bar of the search takeover and header search mode (Search field, focused or filled).placeholder, valueSearchBar (packages/ui/src/search-bar.tsx)legacySame as FvkSearchField.0
FvkSelectBarSelect-mode header: 취소, "n명 선택됨", 전체 선택.allSelected, n, nounnonemissingRetired 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
FvkSkBarSkeleton bar: gray100 at a static .75 frame; pulse draws one frame of the 800 ms pulse.bg, h, rSkeleton (packages/ui/src/skeleton.tsx)legacySkeleton (shimmer, width/height/borderRadius/circle) is named by the library (Skeleton) as replaced; no static-frame/bg props. shimmer.ts to retire.0
FvkSwitchImmediate on/off: track 52 x 32 inside a 48 target; applies at once.onTogglePill (packages/ui/src/toggle-pill.tsx)legacyLibrary replaces it (display-only 44 x 24). App prop: value only (pair with a Pressable); kit adds state.0
FvkTeamLinesTwo 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, winnerMatchScoreboard (TeamRow, ScoreCell) (packages/app/src/presentation/components/sessions/match-scoreboard.tsx)legacyLibrary: MatchScoreboard TeamRow/ScoreCell are the starting point; LiveMatchRow, CompletedRow, MatchHistoryRow also replaced.0
FvkTextActionTHE 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, toneSectionHeaderLink (inside SectionHeader); HeaderTextAction (header only) (packages/ui/src/section-header.tsx, packages/ui/src/header-text-action.tsx)missingNo general text action. HeaderTextAction is retired by the library (Header) and the SectionHeader link is a chevron Pressable local to that component.0
FvkTooltipThe web hover name of an icon: inverse surface, r6.at, childrennonemissingNo 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.

#PieceUseshubdetaillist-alist-bformsauthStatusNeeds first
1FvkCell242218118110912legacyv2 text roles, Switch, Tag (exists), Divider/cell hairline
2FvkSectionHead21629725522362partialDoor pill, InfoHint (exists), Button tonal sm
3FvkEmptyState187193756362811legacyButton, v2 text roles
4FvkHeader87446223210legacyIconButton, Badged, Sticky edge, Search field
5FvkField612450464legacyHelper line, Input/TextArea
6FvkThumb5623376143legacyRemoteImage (stays), Avatar
7FvkDialog55223152121legacySheet surface, Button pair
8FvkPersonRow55127171270partialAvatar group/ring, Level tag, AnswerPair, Figure column
9FvkChoiceSet490620410partialChoice (exists), Field legend/hint/required
10FvkCellGroup489851232legacyCell
11FvkNotice455281164legacyButton, glyph allow-list
12FvkStrip426277200legacyv2 text roles
13FvkSkeleton41017101112legacystatic-frame bar
14FvkT406728017legacythe eleven FVK_TYPE roles
15FvkSheet395226240legacyButton, IconButton, v2 text roles
16FvkInput371050274legacyField, Button (clear)
17FvkChoice3610166400existsdone (W2a)
18FvkOfflineStrip344681123legacyNotice
19FvkTag342138533existsdone (W2a)
20FvkCtaBand3321331311legacyButton (lg, pair), helper line, sticky edge
21FvkMenuSheet335165070legacySheet, Cell (command variant), GroupTitle
22FvkMediaRow313544132legacyThumb, Tag, MetaSegments, Row trailing control
23FvkValueSheet274372110partialSheet, Cell (option variant)
24FvkBlock2614111000missingv2 text roles, Door pill, Avatar (onInk), ring/spark chart
25FvkSheetFooter252173120missingButton, Button pair, helper line
26FvkPickerCell230540140legacyCell
27FvkDayHeader210515100legacyv2 text roles, sticky edge
28FvkShelf209100010legacyThumb, Avatar, MediaRow (card preset)
29FvkTextRow18136710legacyTag, Row trailing control, leading marker slot
30FvkToast18286110legacyIconButton (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 a command prop (tonal sm Button, "모두 읽음"), which owner review 48 removed from the kit ("a head carries no command"); the kit offers bulk for a group verb instead.
  • FeedEnd draws an end line (line), which owner review 48 (2026-10-28) ruled out; the kit FvkFeedEnd takes doors only and draws no line. FeedList/GroupedFeedList do not mount a Feed end yet (the library notes hasMore is unread).
  • ExpandToggle (app) is a chevron-only row by owner ruling 2026-09-28 ("stay away from text-based control buttons"); the kit FvkExpandToggle is 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 FvkGroupTitle as scaffolding. The core FvkGroup is; the controls-file FvkGroupTitle (13/18 600 secondary, a Sheet group title) is a real piece and is tabled (status unsure).
  • FvkSelectBar is 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 ​

FunctionWhy
FvkFrameboard scaffolding
FvkFramesboard scaffolding
FvkPhoneboard scaffolding
FvkPhoneTopboard scaffolding
FvkBoardboard scaffolding
FvkGroupboard scaffolding
FvkSectionboard scaffolding
FvkSpecTableboard scaffolding
FvkFlowScriptboard scaffolding
FvkFlowStepboard scaffolding
FvkFocusScriptboard scaffolding
FvkFocusOrderboard scaffolding
FvkGhostPageboard scaffolding
FvkKeyboardboard scaffolding
FvkAndroidStatusboard scaffolding
FvkHomeIndicatorboard scaffolding
FvkGuideboard scaffolding
FvkProviderboard provider (theme, scale, locale context)
FvkStagecomponent-specimen stage (a canvas without phone chrome)
FvkStatusBardraws the phone status bar
FvkSysNavdraws the Android system navigation bar
FvkSlotScriptboard script (slot wiring)
FvkSpecspec layer, hidden unless Show specs is on
FvkDimspec-layer measurement drawn over a phone
FvkSliceboard frame: a page dimmed behind an overlay in a small context
FvkSurfaceboard palette provider for what is drawn inside a Sheet or Dialog
FvkCaretspecimen of the text caret inside an Input (platform behaviour)
FvkWheelspecimen of the native date/time wheel (the platform draws it)
FvkSheetBoxpalette-wrapper internal: FvkSheet draws it; its props are used for FvkSheet
FvkDialogBoxpalette-wrapper internal: FvkDialog draws it; its props are used for FvkDialog
FvkMenuSheetBoxpalette-wrapper internal: FvkMenuSheet draws it; its props are used for FvkMenuSheet
FvkRailboard 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.

Markdown remains the source of truth. Run yarn docs:check before handoff.