The bars and entries around every screen: the header, tabs, tab bar, FAB, CTA band, media band, wizard chrome and search layer, each in its states.
The 56 bar at the top of every screen: where you are, the way back, and at most two universal actions or one mode's controls.
Switches the panes or filters of one screen (예정, 매치 찾기, 테니스장). It is not app-level navigation and not a form choice.
The five app destinations, always at hand on the tab roots. It is neutral and never carries brand colour.
The screen's single create action on a list root. It is the screen's one coloured action, so a page with a CTA band has no FAB.
The one pinned primary action at the foot of a detail page, form or sheet. One band, one primary, never a second action.
The one line the flat grammar draws on chrome: a hairline on the edge of a bar while content passes under it.
The full-bleed photo or map at the top of a place-like page. It carries only back and at most two icons; everything else is in the body.
The one line under the header that says a session is being played now, on the scorecard and the match board.
The chrome above a wizard step: movement and departure live in the header, orientation in the progress row, and the footer holds one CTA.
The full-screen search layer for an open-ended search inside a flow. It replaces an in-scroll search field.
A mark on a header icon that says something there needs attention, or how many.
A one-time pointer at a control a person would not find alone. It points; it never blocks a flow.
The chrome and navigation family of the flat v2 library (header, tabs, tab bar, FAB, CTA band, sticky edges, MediaBand, Live row, WizardShell header, search takeover, header icon badge, coachmark), drawn by the shared kit in flat-v2-kit-chrome.jsx.
docs/design/flat-v2-component-library-2026-10-09.md §3
grounded in 31 source file(s)
packages/ui/src/header.tsxpackages/ui/src/header-visual.tspackages/ui/src/main-tab-shell.tsxpackages/ui/src/icon-button.tsxpackages/features/clubs/src/club-detail-screen.tsxpackages/features/sessions/src/session-detail/header/use-session-header.tsxpackages/ui/src/header-menu.tsxpackages/ui/src/collapsing-top-bar.tsxpackages/ui/src/use-collapsing-top-bar.tspackages/ui/src/collapsing-header-layer.tsxpackages/ui/src/pill-nav.tsxpackages/ui/src/pill-nav-underline.tsxpackages/ui/src/pill-nav-shared.tspackages/ui/src/segmented-tabs.tsxapps/mobile/app/(tabs)/_layout.tsxpackages/ui/src/corner-count-badge.tsxpackages/ui/src/pressable-visual.tspackages/features/home/src/page/home-body.tsxpackages/ui/src/wizard-shell.tsxpackages/features/sessions/src/session-detail/view/build-band.tspackages/ui/src/media-hero.tsxpackages/ui/src/photo-scrim.tsxpackages/features/clubs/src/club-detail/club-band-media.tsxpackages/features/clubs/src/club-detail/club-place-header.tsxpackages/features/sessions/src/session-detail/page/session-hero.tsxpackages/app/src/presentation/components/sessions/session-live-anchor.tsxpackages/app/src/presentation/components/sessions/session-strip-ui.tsxpackages/app/src/presentation/components/venue-search-takeover.tsxpackages/ui/src/coachmark.tsxpackages/features/home/src/overlays/fab-layer.tsxpackages/app/src/presentation/stores/coachmark-seen.store.ts