Per-screen breakdown of which components appear in each slot, in what render order, bound to which
ViewModel, and fed from which data source. Use this alongside the
Page Template spec
(scaffold / padding / margins) and individual component specs. For visual reference,
call get_screenshot(nodeId) on the Figma node listed in each header to see the live design.
Dynamic Feed API mean the server-driven
PageDto contract.
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav (fixed chrome) | — | — | White bar, drop-shadow. Icons: avatar, heart, bell, search (left) · hamburger (right) |
| 1 | Welcome Banner | WelcomeBannerViewModel | GET /api/user/profileGreetingText, LinkText?, LinkUrl? | MEC-themeable bg via BackgroundToken. Home variant: blue/100 #dfedf9. Optional "View Contract" CTA link. |
| 2 | Carousel — "New & Notable" | CarouselViewModel → items: CardHeroViewModel[] | Dynamic Feed APIContainerDto type:"carousel"items type:"card-lg" | Horizontal scroll. card-lg with blue/yellow accent. Title "New & Notable", "View All" link. ShowEyebrows: true. |
| 3 | Button Group (3-up tiles) | ButtonGroupViewModel → items: ButtonViewModel[] (IsTile:true) | Static config / CMS menuMenuItemDto[] | 3-column grid of icon-tile buttons (e.g. KCM, Quick Ref Guide, Hotline). Icon + label below. |
| 4 | Carousel — "Feed" | CarouselViewModel → items: mixed (card-lg / card-md) | Dynamic Feed APIContainerDto type:"carousel" | Mixed card types. card-lg for featured, card-md for text items. ShowEyebrows: true. |
| 5+ | Additional carousels / card-btn / card-md sections | TBD — Home layout is draft | Dynamic Feed APIPageDto sections[] | Home screen shown in Figma is a UAL MEC prototype. Final layout TBD post-#2087. Use Figma node 4099:5229 screenshot at implementation time. |
| — | Bottom Nav (fixed chrome) | — | — | Navy #05273e. 5 items: Home · Jumpseat · KCM · FTDT · My MEC |
pb on slot-main feed — last section clears bottom nav.united-brand/blue-800).| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | Standard top nav chrome |
| 1 | Button Pill (tab switcher) | ButtonPillViewModel (spec-only) | Static — 2 tabs | Tabs: "COMMS" | "FLIGHT STATUS". Futura PT Demi 15px uppercase. Inactive: white bg; Active: #007bc2 bg white text. |
| When "COMMS" tab active | ||||
| 2a | Comms notification rows | TBD — likely ListViewModel or card-sm | Push notifications APIGET /api/notifications?type=comms | Comms tab content not fully captured in audit. Likely text-based notification rows. Confirm from node 5060:14989 screenshot. |
| When "FLIGHT STATUS" tab active | ||||
| 2b | Notification — Flight Status × N | NotificationFlightStatusViewModel | Flight status APIGET /api/notifications?type=flightFields: airline icon, route, date, timestamp | White cards, border-b #d2d4d6. Unread state: --unread modifier. Expand caret (38px pill) opens detail. Timestamp right-aligned Inter Regular 14px. |
| — | Bottom Nav | — | — | |
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| — | Nav-Controls Bar | — | Static | Title: "KCM" · Back button · no right icon |
| 1 | Interior Tab Nav | — | Static — section tabs | KCM sub-sections (e.g. Overview / History / Airports). Active: Futura PT Demi; Inactive: Afacad SemiBold. |
| 2 | Toggle Switch — "Acclimated" | ToggleSwitchViewModel | User preferenceSettings.KcmAcclimated | Adjacent label "Acclimated" rendered by page — not embedded in the component. iOS HIG toggle style. |
| 3 | KCM Table | KcmTableViewModel | KCM status APIGET /api/kcm/status | Grid of airport codes with KCM eligibility status. Documented in new-components-2026-06-10.html. |
| 4 | Card Small (card-sm) × N | CardSmallViewModel | KCM API itemsGET /api/kcm/resources | 80px image + title list rows for KCM reference resources. Full-width, border-b #d2d4d6. |
| — | Bottom Nav | — | — |
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| — | Nav-Controls Bar | — | Static | Title: "Internal Comms" · Back · no right icon |
| 1 | Card Small (card-sm) × N | CardSmallViewModel | CMS content listGET /api/comms/internalFields: title, image, link | Scrollable list of comms articles. 80px image left + title right. Tapping navigates to article detail. |
| — | Bottom Nav | — | — |
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| — | Nav-Controls Bar | — | Static | Title: "Member Resources" · Back · no right icon |
| 1 | Card Small (card-sm) × N | CardSmallViewModel | CMS resources listGET /api/member/resourcesFields: title, image, link | Identical pattern to Internal Comms. Scrollable card-sm list. Same component, different data source. |
| — | Bottom Nav | — | — |
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| — | Nav-Controls Bar | — | Static | Title: "Advocacy" · Back · no right icon |
| 1 | Secondary Button — Rectangular | ButtonViewModel (Style:Secondary, Shape:Rect) | Static — label "DONATE & JOIN" Link: external donate URL | Full-width rectangular outline button. 1px navy border, no radius. Futura PT Demi 15px uppercase. |
| 2 | Card Notification × N | CardNotificationViewModel | CMS advocacy contentGET /api/advocacy/itemsFields: text, link | Text-only disclosure rows. Navy bottom border (#05273e). Each row: label left + chevron right. Tapping navigates to detail. |
| — | Bottom Nav | — | — |
#05273e) is distinct from the standard list border (#d2d4d6) — do not swap.| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | Heart icon in top-left nav is the active state indicator for this section |
| 1 | Card Large (card-lg) × N | CardHeroViewModel (IsFavorite: true) | Favorites APIGET /api/favorites (Change 3 — in progress)Fallback: Settings.FavoriteItemIdsJSON | card-lg in full-width mode (361px). Heart overlay shown (IsFavorite:true, active state red). 2px bottom accent border. Tapping heart removes from favorites. |
| — | Bottom Nav | — | — |
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| — | Nav-Controls Bar | — | Static | Title: "Flight Finder" · Back · no right icon |
| 1 | Button Pill (tab switcher) | ButtonPillViewModel (spec-only) | Static — 2 tabs | Tabs: "ONE WAY" | "ROUND TRIP" (or similar). Controls form layout below. |
| 2 | Form section — blue bg container | — | — | Blue bg (#007bc2) section wrapping the labeled form fields. 16px padding, 8px corner radius. |
| 2a | Form Field — Labeled (Departure) | FormFieldViewModel (Variant:Labeled) | User input → flight search query | White label "Departure Airport" (Afacad SemiBold 16px white) + white input box. No leading icon. |
| 2b | Form Field — Labeled (Arrival) | FormFieldViewModel (Variant:Labeled) | User input → flight search query | White label "Arrival Airport" + white input box. |
| 2c | Form Field — Labeled (Date) | FormFieldViewModel (Variant:Labeled) | User input (date picker) | White label "Date" + white input box. Tapping opens native date picker. |
| 3 | Search Secondary Buttons (3-up) | SearchSecondaryButton (scaffold/atom, D42) | Static — fixed action set | 3-column row. Each: 88px wide, 22px icon + 2-line Futura PT Demi 15px uppercase label (e.g. "NON STOP / FLIGHTS"). Spec resolved 2026-07-02 (D42) — see linked component page. |
| 4 | Secondary Button — Pill-38 | ButtonViewModel (Style:Secondary, Shape:Pill38) | Static — label "ADVANCED SEARCH" | 38px radius outline pill. 1px navy border. Leads to advanced search form. |
| 5 | Flight search results | TBD — FlightSearchResultViewModel | Flight search APIPOST /api/flights/search | Results layout not captured in audit — confirm from Figma. Likely card-sm or flight-segment-card items. |
| — | Bottom Nav | — | — |
SearchSecondaryButton (D42) — see search-secondary-button-component.html.| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | Same white top nav — MEC theming does not change top nav chrome |
| 1 | Welcome Banner | WelcomeBannerViewModel (BackgroundToken: united-brand/blue-800) | GET /api/user/profile + theme tokenGET /api/theme/{mecId} | MEC-branded bg color (e.g. UAL: united-brand/blue-800). LinkText: "View Contract". Same component as Home, different token. |
| 2 | Button Pill (tab switcher) | ButtonPillViewModel (spec-only) | Static — MEC sections | MEC content section tabs (e.g. "NEWS" | "RESOURCES" | "EVENTS"). Controls content below. |
| 3 | Card Large (card-lg) × N | CardHeroViewModel (AccentColor: united-brand/blue-500) | MEC content APIGET /api/mec/{mecId}/contenttype:"card-lg" | MEC-branded accent: united-brand/blue-500 #0008ce (UAL). 2px bottom border. No eyebrow on some variants. |
| 4 | Card Text / Medium (card-md) × N | CardTextViewModel (Image: null — no-image variant) | MEC content APIGET /api/mec/{mecId}/contenttype:"card-md" | 250px width, no image (Image:null collapses image slot). Title + Description + optional NewCount badge (red). |
| 5 | Secondary Button — Full Pill | ButtonViewModel (Style:Secondary, Shape:PillFull) + --white modifier (on dark card) | Static — label "SIGN UP FOR TEXT ALERTS" | 100px radius, 2px border. When inside a dark MEC card: white border + white label (--white modifier). Wires to SMS opt-in flow. |
| — | Bottom Nav | — | — | Bottom nav shows "My MEC" active item |
GET /api/theme/{mecId} resolved via IThemeResolver. Never hardcode UAL-specific colors.| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | Search icon in top nav triggers this page |
| 1 | Form Field — Search | FormFieldViewModel (Variant:Search, HasLeadingIcon:true, HasClearButton:true) | User input → live autocomplete query | White bg, invisible border, leading search mag icon, trailing × clear button. Fixed at top of content area (inside pt-120px zone). Fires OnValueChanged on every keystroke. |
| 2 | Form Field — Result Row × N | FormFieldViewModel (Variant:ResultRow) | Search autocomplete APIGET /api/search/suggest?q={value} | Text-only rows, border-bottom #d2d4d6, no icons. Populated as user types. Tapping a row fires OnResultSelected and navigates to result. |
| — | System Keyboard (iOS) | — | — | Native iOS keyboard overlays bottom portion. Search input is focused on page entry. Keyboard dismisses on result select or scroll. |
| — | Bottom Nav | — | — | Hidden behind keyboard when active |
#f5f7fa — the white search input floats visibly against it.| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| — | Nav-Controls Bar | — | Static | Title: "Airline Policies" · Back (left) · Search mag icon (right) — right icon opens Search overlay |
| 1 | Form Field — Nav Row × N | FormFieldViewModel (Variant:NavRow, HasChevron:true) | Airline policies listGET /api/policies/airlinesFields: name (text), link (policy doc URL) | Full airline list (A–Z). Airline name left + chevron right + border-bottom #d2d4d6. Tapping navigates to that airline's policy document. |
| — | Bottom Nav | — | — |
| # | Component | ViewModel | Data source | Notes |
|---|---|---|---|---|
| — | Top Nav | — | — | |
| 1 | Toggle Switch — "Acclimated" | ToggleSwitchViewModel | User preferenceSettings.FtdtAcclimated | Adjacent label "Acclimated" rendered by page layout. iOS HIG toggle. Affects duty-time calculation display. |
| 2 | Progress Bar × N | ProgressBarViewModel | FTDT APIGET /api/ftdt/summaryFields: label, value, min, max | Flight time / duty time tracking bars (e.g. "8-IN-24", "FAR 117"). Value, label row, min/max row. Multiple bars stacked. |
| 3 | Duty Period × N | DutyPeriodViewModel → items: FlightSegmentViewModel[] | FTDT schedule APIGET /api/ftdt/scheduleFields: date, flights[], status | Each duty period card contains flight segment cards. "MANAGE" button on each: button-secondary pill-38. Status badge (on-time / delayed / etc.). |
| — | Bottom Nav | — | — | FTDT icon active in bottom nav |
ALPA Mobile Team · Component Specifications · Epic AB#1821
Component Index · Page Template · Screen Mapping · Dynamic Feed API