Per-component pages for the components added in the 2026-06-10 Figma re-sync. Each entry covers details, variations, and developer notes. Data-source / API mappings are TBD at implementation (gated on Presentation Extraction AB#2087); structure, provenance, variants, and developer notes are captured now.
Authoritative decisions: naming-decisions-record.html (D1–D14).
Tiers: atoms → primitives → containers → nav chrome → page templates → domain controls. Screens are out of the library (D14).
Figma: tab group (4361:8479, 345×31) · VM: SegmentedControlViewModel : ComponentViewModel
In-screen single-select segment (e.g. NONSTOP · ONE STOP · MULTILEG; Notifications: Flight Finder ↔ Comms).
default / selected per segment; single-choice.Segmented Control.Figma: navBar-bottom (4038:1037, 393×88) · VM: BottomNavigationViewModel : ComponentViewModel
Global bottom nav — main-section switcher (HOME · JUMPSEAT · KCM · FTDT · MY MEC). Composes NavItem (Primary).
navBar-bottom-tablet = responsive variant (deferred).Figma: topNav (5419:34168) · VM: TopNavigationViewModel : ComponentViewModel
Top utility bar — profile · heart · bell · search + hamburger (≡). Composes NavItem (Top) + icon atoms + Logo.
Figma: nav controls (4084:2871, 193×38) · VM: NavControlsViewModel : ComponentViewModel
In-screen header row: back / home · title · contextual action (e.g. filter). Used inside interior screens & the drawer.
Figma: hamburger menu (4084:2712, 300×570) · VM: NavigationDrawerViewModel : ComponentViewModel
Slide-out drawer: back/home + nav rows (Internal Comms · Member Resources · PDR · Advocacy · United SOAR · Settings). Composes Nav Controls + NavItem (Drawer). The full-screen overlay (menu-hamburger) is a Screen, not this component.
Figma: NavItem-primary (4020:3429, 50×80) · NavItem-top (4038:3300, 38×54) · navItem hamburger (4057:7542, 280×48)
One atom, variants: Primary / Top / Drawer (D12). Icon + label; the layout differs per variant (vertical tile vs horizontal row).
Figma: status (4325:6332, 75×17) · VM: BadgeViewModel : ComponentViewModel
Shared presentational atom: Label + State/Severity variant → CSS token styling. Composed by domain controls (flight status, duty-period status) via their factories (D11). Same Badge, different data.
Figma: profile info block (4128:7690, 280×51) · VM: InfoBlockViewModel : ComponentViewModel
Generic label + value pair ("MEMBER NUMBER" / value), no surface chrome. Domain-neutral; the Profile screen composes a list of these from member data (D11). Distinct from CardText (which is on a surface).
Figma: endpoint (4322:5706, 41×44)
Flight endpoint atom (airport code + time, e.g. DEN 12:00). Composed into Flight Card / Flight Segment by their factories (D11).
Figma: alpa logo (4023:780, 60×60)
ALPA brand mark — a brand-asset atom (image), not a logic component.
Figma: back (4431:4432, 69×22)
Back affordance (caret + label). Used by Nav Controls.
Figma: check (4562:8918, 22×22) · No VM — presentational only
Circle outline with check mark; indicates KCM-access eligibility. State is data-driven (bool), not interactive — rendered by the KCM Airlines domain control. Two instances per row: Pilots column · Flight Attendants column.
bool, but the design only ever draws true: 4562:8918 is a
single symbol with no variant set, and the page mock 4562:7754 shows
every row fully ticked. Live data has false constantly — 125 eligible / 27
not at the time of writing.
false as
an empty cell reproduces that ambiguity in a new layout.
aria-label of "not eligible" so assistive tech states the value
rather than inferring it from a missing element. Our reading, not design intent — an explicit ×, or a
distinct third "unknown" state, are equally reasonable. Please confirm or supply a variant on
4562:8918. Decision recorded on AB#2390.
Figma: Master Form Field (92 instances) · VM: FormFieldViewModel : ComponentViewModel
Unified field. Variants/booleans select the form: text input · select dropdown · expanding textarea · ±leading/trailing icons · states (default / focused / entered / disabled).
Figma: progress bar & labels (4537:14830) · VM: ProgressBarViewModel : ComponentViewModel
Value bar + value/min-max labels. VM holds data (value/min/max + label text), not the fill look.
Figma: section title (4596:11818, 313×38) · VM: SectionTitleViewModel : ComponentViewModel
Section header: title text + optional "View All ›" link. Used by Carousel and screens.
card-notification is not a new component — it folds into Card as a layout variant (image placement/proportion = visual). comms vs flight-status = styling variant; collapsed/expanded = state. Axes orthogonal: Size ⟂ Layout ⟂ state. Dev note (§6): "one card component serves both notification tabs (comms variant)."CardTextViewModel (Image = null → text-only layout variant). Red new-count badges (e.g. "11" / "2") are covered by the existing NewCount property. Display width 250px is a CSS carousel-slot concern, not a VM property.Figma: toggle switch (4128:7738, 64×28) · VM: ToggleSwitchViewModel : ComponentViewModel
On/Off boolean toggle (HIG-compliant). Seen in FTDT "Add Unaugmented Duty Period" for the Acclimated flag. Label text ("Acclimated") is a separate adjacent text element — not part of the component; set by the consumer. Ref: HIG toggles.
On — blue fill (#007bc2) + white knob; Off — grey fill + white knob.bool IsOn { get; set; }. Consumer is responsible for the adjacent label text.Figma: template (4436:5299, 393×852)
Base screen scaffold (status bar · nav · content slot via RenderFragment).
Figma: main view-interior (4245:5027)
Interior screen scaffold (Nav Controls + title + content slot). Seen in Flight Finder.
Figma: main-feed slot (4038:891, 393×852)
Home/feed scaffold with a content slot.
Concrete screens (profile,menu-hamburger,*— TABLET) compose templates + library components and live app-side, not in the library (D14).
Domain controls compose scaffolds + atoms via factories (D11).
Figma: flight card (4348:4002, 5 variant states)
Composes base Card + Endpoint ×2 + leg/layover collection (DL 302 · AA 1753 · AA 1186) + icons.
detail expanded layer ("every flight card carries one"); the swipe-left look is a static depiction, not real layout — "same convention on Recent/Saved/notifications."Figma: flight segment card (4555:7483, 353×111)
Composes Endpoint (DEN ✈ MIA) + date/time + carrier/equipment (DL 302 · 757). FTDT add-segment.
Figma: flight detail flight info (4325:6399, 298×154)
Composes Badge ("Delayed 34m") + Info Block (Gate H14) + Buttons (KCM › · Jumpseat Policy ›). Departure/Arrival.
Figma: card-duty period-alt (4617:13876, 3 variant states)
Composes Progress Bar (Max Duty 14:00) + Info Block (Ends/Duty) + Button (Manage Flights & Details). Variants: Default · Variant2 · delete-demo.
Figma: Welcome thing (5419:35702 / 4185:10447, full width) · VM: WelcomeBannerViewModel : ComponentViewModel
Full-width member-greeting banner pinned at the top of the Home and MEC feeds. Shows a personalized heading ("Welcome Captain Johnson") + an optional CTA link ("View Contract"). Ends with the pointed chevron endcap — same SVG geometry as Action Button. MEC-themeable via token swap (D12/D13).
blue/100 (#dfedf9), dark text.united-brand/blue-800 (#002243), white heading, teal link (#94ebfe).GreetingText : string · LinkText : string? · LinkUrl : string? · BackgroundToken : string?. Link row hidden when both null/empty.Figma: KCM-Airlines (4562:7754) · same pattern for KCM-Airports — Airlines only, see below
Data-table domain control for KCM airline access data. Composes: Nav Controls (back · title "Airlines" · filter · search) + a CSS-sticky column-label row ("Airline" / "Pilots" / "Flight Attendants") + a scrollable body of rows (name text + two Check Indicator atoms).
KCMAirportItem carries airportName, airportCode,
checkinNotes, mapUrl and no crew-role booleans.
KCMAirlineItem is the only model with pilots / attendants,
so a check-column table on Airports would have nothing to check.4562:8249
is a plain drill-in list of airport codes with a chevron — no columns, no check indicators.position: sticky; top: 0 CSS on the header row — not a standalone component.KcmTableViewModel (domain-side, not in library) holds IReadOnlyList<KcmAccessEntry>. Each entry: Name : string · AllowsPilots : bool · AllowsFlightAttendants : bool. Airports table: same VM shape, different API source.overlay- frames (filter/sort/notification-filter) layer over a base screen.IsFavorite stays as state.ToggleSwitchViewModel carries only IsOn : bool.Each entry above becomes a full per-folder page (<component>/<component>-component.html+-property-mapping.md) with data-source analysis when the component is implemented under AB#2087.