← Component Specifications

Component Library

Scaffold Components & Visual Reference
Updated: 2026-06-26 · Audited: 2026-06-26 · Work Items: AB#1821 · AB#2095

About This Document

Reference for the ALPA Mobile component library, in two layers — a reusable, domain-free scaffold (the components below) and domain controls that map real data onto it (decision D11). Rooted at ComponentViewModel; names & hierarchy settled. Reference reports are linked in the specifications index.

ViewModel Hierarchy

Card and Button share card-like chrome via SurfaceViewModel; content cards add content on CardViewModel; containers share a paintable wrapper via ContainerSurfaceViewModel (D26). Domain controls (e.g. Pilot Card) compose these rather than subclass them — Domain Controls →. Click a component to open its spec — full reference & sortable table →

PageViewModel — page root · D27 · outside ComponentViewModel hierarchy · consumed by Home.razor
────────────────────────────
ComponentViewModel — library root (renderable state)
├── SurfaceViewModel — card-like chrome (background, radius, padding, tap)
│   ├── CardViewModel — content-surface base → Card
│   │   ├── CardHero (DocumentCardViewModel)
│   │   ├── CardText
│   │   ├── CardSmall
│   │   └── Button Card (ButtonCardViewModel · D14)
│   └── ButtonViewModel Button (optional Icon)
├── ContainerSurfaceViewModel — paintable wrapper (BackgroundToken, radius, padding · D26)
│   ├── ButtonGroupViewModel Button Group
│   ├── GridContainerViewModel Grid Container · D25 · v1 card-btn only
│   ├── CarouselViewModel Carousel
│   └── ListViewModel List

Component Scaffold

The reusable, domain-free building blocks — nine components (Track A), grouped by role. Complex flight/duty-period cases use Track B typed ContentViews (see architecture). Compose these for a use case; don't fork them.

Content Surfaces base: CardViewModel

Card Component

Base reusable card. Two layouts: Standard (header, content text, optional link) and Chevron (heading + link with a right chevron, no title — the Welcome / pilot card). Foundation for all card variants.
STANDARD
Header Primary content text Link text
CHEVRON · NO TITLE
Heading Link text

CardHero Component

Card with hero image, title, and description. Use for featured content, announcements, or visually rich items. Entire card is tappable.
Image Area Primary Heading Text Brief description text goes here spanning two lines for content

CardText Component

Card with optional eyebrow and title. Three variants, named by their leading element (simplest-first): Description (body only), Title (title + body), Label (label + title + body).
DESCRIPTION
Description text only, no title or label, spanning as many lines as needed
TITLE
Title Text Description text spanning multiple lines as needed
LABEL
LABEL Title Text Description text spanning multiple lines as needed

CardSmall Component

Home screen navigation tile (card-sm). Image left, title center, favorite heart right. Backed entirely by MenuItem — the simplest home component. Instances: DART, ALPA Directories, Committee Calendar, etc.
IMG DART

Button Card Component New · 2026-06-17 revision

Content card with an embedded call-to-action button (decision D14). Two variants: Default (filled primary CTA) and Variant2 (outlined secondary CTA). ViewModel adds CallToAction : ButtonViewModel to the inherited Header and ContentText. Four feature instances: My MEC, Jump Seat, Committees, PAC/Take Action.
DEFAULT · PRIMARY CTA
Section Header Body description text that spans multiple lines here. Action Label
VARIANT2 · SECONDARY CTA
Section Header Body description text that spans multiple lines here. Action Label

Flight Card Track B · D17 D16

Track B typed ContentView — not a scaffold subclass (D17). Flight itinerary card for Pairing / Schedule views. Three variants: Default (353×164 px), Swipe (same size, trailing action strip), Expanded (353×1361 px). Eight BindableProperty fields: Origin · Destination · DepartureTime · ArrivalTime · Duration · FlightNumber · AircraftType · StatusBadge. Implemented as FlightCardView : ContentView; direct property binding replaces factory. Phone scope; tablet deferred per D12.
DEFAULT · 353×164
ORD SFO 6:13 AM 4h 30m 8:43 AM UAL 423 · Boeing 737 ON TIME
SWIPE · 353×164
ORD SFO 6:13 AM 4h 30m 8:43 AM 🗑
Action Control base: SurfaceViewModel (shared with cards)

Button Component

Action button for primary actions and navigation. An optional leading Icon drives the variant: absent → text-only; present → icon + text. (Absorbs the former Icon Tile — an icon is an optional property, not a separate component.)
TEXT ONLY
Action Button
WITH ICON
Action with Icon
Containers base: ContainerSurfaceViewModel

Button Group Component

Collection of buttons (typically 3) arranged horizontally. Each button has an icon above text.
Button 1 Button 2 Button 3

Grid Container New · D25

Fixed 3-column grid of ButtonCardViewModel items. Auto-flows items in collection order — no coordinate placement. v1 scope: phone only, card-btn only. Used in My MEC (MEC Actions + Quick Links sections). Flexible column count and mixed content types are deferred extensions.
PDR DYK QRG DOCUMENTS COMMITTEES UPDATES
Horizontal scrollable collection of cards. Has title, optional "View All" link, and accepts any CardViewModel variant in its Items collection. Container for presenting multiple related cards.
Section Title View All › Horizontal Scrollable Card Card

List Component

Vertical stack of cards. Accepts any CardViewModel variant in its Items collection. Use for lists, menus, or grouped content that flows vertically.
Vertical Stack Card Item 1 Card Item 2 Card Item 3
New — 2026-06-10 Re-sync nav chrome · atoms · primitives · templates · domain controls

New Components catalog

Added in the 2026-06-10 Figma re-sync (decisions D12–D14): Nav chrome (Top/Bottom Navigation, Nav Controls, Navigation Drawer, Segmented Control) · Atoms (NavItem, Badge, Info Block, Endpoint, Logo, Back) · Primitives (Form Field, Progress Bar, Section Title) · Page templates (Page/Interior/Feed) · Domain controls (Flight Card/Segment/Detail, Duty Period). Per-component provenance, structure, variants, and dev notes are in the catalog; full per-folder pages land as each is built (AB#2087).