Domain-specific controls that compose a generic scaffold component by mapping real
data onto it. A domain control is not a scaffold subclass — it maps a domain source onto a
scaffold ViewModel through a pure RawRepresentationFactory<T> mapper, keeping the
library domain-free (decision D11; see the
Architecture → Domain Controls layer).
| Domain control | Composes | Domain source | Mapper / factory | Spec |
|---|---|---|---|---|
| Home screen 4099:5229 | ||||
| Pilot Card | Card · Chevron (CardViewModel) |
UserInfo (IAuthentication) + contract DocumentItem (DataManager) |
PilotCardFactory : RawRepresentationFactory<CardViewModel> |
data-source analysis |
| Document Hero | CardHero (CardHeroViewModel) |
featured/contract DocumentItem (DataManager) |
DocumentHeroFactory : RawRepresentationFactory<CardHeroViewModel> |
data-source analysis |
| Home Feed Carousel | Carousel (CarouselViewModel) |
content feed (DocumentItem[] via DataManager) |
FeedCarouselFactory : RawRepresentationFactory<CarouselViewModel> |
data-source analysis |
| Resource Tile | CardSmall (CardSmallViewModel) |
MenuItem (nav / resource links) |
ResourceTileFactory : RawRepresentationFactory<CardSmallViewModel> |
data-source analysis |
| Emergency Hotline | Button (ButtonViewModel) |
emergency contact config (tel:) |
EmergencyButtonFactory : RawRepresentationFactory<ButtonViewModel> |
data-source analysis |
| MEC screen 4684:7914 | ||||
| Menu Text | CardText (CardTextViewModel) |
MenuItem (+ parent category) + local Settings |
MenuTextFactory : RawRepresentationFactory<CardTextViewModel> |
data-source analysis |
| Notifications · “Did you know” screen 5172:15051 | ||||
| Did You Know List ABANDONED | List (ListViewModel) |
Change 4 abandoned 2026-06-24 — no endpoint will be built; kept here for historical ListViewModel factory-pattern reference only |
DidYouKnowListFactory : RawRepresentationFactory<ListViewModel> — not to be implemented |
data-source analysis |
| Flight Finder flight card-og 5452:679 · D15 | ||||
| Flight Card Track B · D17 | FlightCardView (typed ContentView — D17) |
Flight / Leg (flight segment data — source TBD) |
FlightCardView (no factory — direct BindableProperty binding) |
spec below |
| Flight Finder Filter Sort D41 | Master Form Field · radio button · tab group (FlightFinderFilterSortViewModel) |
JSFF flight-search filter/sort state — confirmed 2026-07-06 (D41): JumpseatFlightFinderResultsFiltersPageViewModel.cs |
FlightFinderFilterSortFactory — spec |
spec below |
| Flight Finder Advanced Search D44 | Expander (FlightFinderAdvancedSearchViewModel) |
JSFF flight-search advanced-filter state — confirmed 2026-07-06 (D44): JumpseatFlightFinderSearchPageViewModel.cs |
FlightFinderAdvancedSearchFactory — spec |
spec below |
| Promotions banner 5512:12925 · D43 · provisional | ||||
| Promo Banner Provisional | PromoBannerViewModel (standalone, D40 pattern) |
Promo/announcement content — source confirmed 2026-07-06 (D43): existing PageBanner model (GET /api/pagebanner/list), not a new Dynamic Feed type. Field additions tracked as Change 5. |
PromoBannerFactory — spec |
spec below |
| Duty Period identified · spec pending | ||||
| Duty Period Card Pending | Card (CardViewModel — scaffold TBD) |
Duty period / schedule data — source TBD | DutyPeriodCardFactory — spec pending |
pending |
| Button Card instances D14 · 4 instances identified · specs pending | ||||
MEC Button Card · Jump Seat Button Card · Committees Button Card · PAC Action Card — each will compose Button Card (ButtonCardViewModel) via its own factory. Specs pending.
|
||||
Renders through the generic Card (Chevron variant — heading + link + right chevron, no title/image). It maps the authenticated pilot's identity and their current contract document onto a CardViewModel; the scaffold stays domain-free.
Two context variants (Teamwork mobile requirements — Pilot Card, Space 4173): a Light version on the Home tab — light-blue background with the right chevron (shown below) — and a Dark version on the My MEC tab — dark navy background, no chevron. Both carry the same two elements (personalized name greeting + Contract link); only the surface colour and chevron presence differ by context. The Chevron Card variant covers the Light case; the Dark case needs a chevron-less navy variant.
| Scaffold property | Domain source | Notes |
|---|---|---|
HeaderText | UserInfo.MEC via IAuthentication | Falls back to "ALPA" |
ContentText | UserInfo.FirstName + LastName | Rank omitted — UserType is tier (STAFF/MEMBER), not rank |
LinkText / Link | contract DocumentItem via DataManager | First contract doc for the pilot's MEC scope; opened via SharedActionsService |
IsLinkVisible | derived | true only when a contract doc is found |
Full mapping, code, and data gaps: see the Pilot Card data-source analysis — including the PilotCardFactory + PilotCardService split and the pilot-rank gap.
Renders through the generic CardHero. Queries the featured/contract DocumentItem for a scope + category and maps it onto a CardHeroViewModel (title, description, image, link); the scaffold never references DocumentItem.
Full mapping & gaps: CardHero data-source analysis — incl. the scope/category content-config gap.
Renders through the generic Carousel (horizontal scrolling feed — a section header + a horizontal row of content cards). Maps a feed of documents onto a CarouselViewModel whose Items are Document Hero cards (card-lg). Home uses three of these (MEC docs · resources · press releases). Figma variants: with images / no images / no-images + eyebrows. The header is the scaffold Section Title (title + "View All" link).
Data-source analysis: Carousel data-source analysis — the feed query and per-item mapping.
Renders through the generic CardSmall (card-sm — a wide 361×51 row that leads with a navy image/thumbnail block, then a serif title). Maps a MenuItem (resource / nav link) onto a CardSmallViewModel. Home uses these for DART, Flight Pay Loss, My Payments, Infor Expense Management, Meeting Request, MPS. Favorite heart shown per D31 (2026-06-26).
Data-source analysis: CardSmall data-source analysis — the MenuItem navigation-tile mapping.
Renders through the generic Button (Primary, with a phone icon). Maps the emergency contact configuration onto a ButtonViewModel whose command opens a tel: link. The number is configuration — a candidate for the Options pattern (IOptions<EmergencyOptions>) rather than per-request data (see D11).
Data-source analysis: Button data-source analysis — the Button scaffold (Emergency is a config-driven use).
Renders through the generic CardText. Maps a MenuItem (and its parent category) plus locally-stored badge/favorite state onto a CardTextViewModel; the favorite / new-count persistence lives in the service, not the scaffold.
Full mapping & gaps: CardText data-source analysis — incl. the MenuItem.Description API expansion and the NewCount write path.
Renders through the generic List (listy card generic — date · headline · subtitle). Maps a “Did you know” item onto a ListViewModel. Corrected: not a flight card — the rich DL 302 / status flight result is the separate Flight Finder card (node 4713:25168, future). The concrete item type is confirmed in the Notifications deep-dive.
Full mapping & correction: List data-source analysis — it was mis-modelled as a flight card; the rich flight result is the separate Flight Finder component.
Implemented as FlightCardView : ContentView with BindableProperty fields (D17, two-track component pattern). Decision D15 (2026-06-22) unified all flight card Figma masters into one domain control. Decision D16 defined the 8 typed fields; D17 moved the implementation from scaffold ViewModel to typed ContentView. Direct property binding replaces RawRepresentationFactory<T>. Spec: flight-segment-card-component.html.
| Figma master | Node | Dimensions | Role | Notes |
|---|---|---|---|---|
flight card-og | 5452:679 | 353×111 px | Base / phone | Authoritative master. #FFFFFF fill, #E3E3E3 border. Adds swipe variant. D13: -og suffix not used in code name. |
flight segment card | 4555:7483 | 353×111 px | Retired alias | Exact dimension/fill/stroke match with flight card-og. Retired 2026-06-22 (D15). Child tree preserved in figma-component-specs.json as authoritative structure reference. |
flight card-TABLET | TBD | TBD | Tablet tier | Deferred (D12) — responsive layout system post-AB#2087. |
flight card-recent searches | TBD | TBD | Recent searches | Variant for the Recent Searches section of Flight Finder. |
flight card-FTDT | TBD | TBD | FTDT | Flight tracking / departure tracking variant. |
Track B typed ContentView (D17, 2026-06-22): FlightCardView : ContentView — 8 BindableProperty fields: Origin, Destination, DepartureTime, ArrivalTime, Duration, FlightNumber, AircraftType, StatusBadge (D16 field list unchanged). No factory required — direct property binding. Registered via DataTemplate for CollectionView usage. Implementation gated on AB#2087.
D15 (2026-06-22): flight card-og (5452:679) confirmed identical to flight segment card (4555:7483) — 353×111 px, #FFFFFF fill, #E3E3E3 stroke. flight segment card retired as alias. Swipe variant added to base. Tablet tier deferred (D12). See Decisions Record → D15.
D18 (2026-06-23): A new distinct flight card component_set (componentKey 8e152db6…) was inventoried in the 2026-06-23 library sweep, separate from flight card-og. Provisional code name FlightCard. Relationship to flight card-og and impact on this domain control's implementation are pending designer confirmation. Dimensions TBD (MCP page access limited).
DutyPeriodCardView : ContentView (3 variants: Default / Expanded / Delete-demo · node 4617:13876). Direct BindableProperty binding; no factory. Compact flight rows are internal to DutyPeriodCardView (DQ-11 resolved). Confirmed 2026-07-02 (D45): live-file check (owEYzHf7FrHRvWC2u82UOl) verified this is the only surviving Figma master — card-duty period-alt (node 4617:13876 matches exactly), filed under the "components ftdt" section. The non-alt card-duty period name is confirmed absent from the live file (retired); no change to this control's spec.ButtonCardViewModel) via its own factory: MEC Button Card (MEC screen 4684:7914), Jump Seat Button Card (JSFF screen), Committees Button Card, PAC Action Card (PAC-specific domain control). See decision D14.c3045b66…); full spec pending.
FlightCardView (existing) · ToggleSubscriptionAsync (existing API).
Reclassified 2026-07-02 (D42): the D22 (2026-06-23) provisional domain-control stub is resolved. Live capture found no domain-specific fields on either variant — search secondary buttons is a scaffold/atom (a reusable icon+label secondary-action chip), not a domain control. No longer catalogued here; see the scaffold spec: search-secondary-button-component.html.
owEYzHf7FrHRvWC2u82UOl4450:11374, canonical; duplicate 4705:8702 flagged, not catalogued). Composes flight finder filters (D22, ×3 in Filter state) + radio button (×5 in Sort state) + tab group + nav controls + Primary button (Apply) + Underline Button (clear). Likely the live successor to the previously binary-only overlay-flight finder filter reference in screen-mapping.html. Dimensions: 433×1087 (Filter 393×499, Sort 393×480).
PageBanner model (GET /api/pagebanner/list) — not a new Dynamic Feed ItemDto type or a dedicated announcements service (the two candidates originally floated). This also resolves the D40 "one-off static content" question: it's a recurring, already-multi-page pattern, so it correctly stays a catalogued domain control. Required Title/Subtitle/LogoImageLink field additions tracked as Change 5. Dimensions: 346.4×172 (Default 319.4×56, Variant2 309.4×56).
owEYzHf7FrHRvWC2u82UOl4450:9884, 393×465 overall — Default 353×61 collapsed, Variant2 353×340 expanded/parameters). Two per-context usage frames instance this master rather than being separate scaffold masters: flight card-saved searches (node 4450:10395, swipe-to-delete) and flight card-recent searches (node 4450:11208, swipe-to-favorite) — each adds a swipe-reveal action + an expanded detail flight-leg panel around an instance of this master's Default state. Confirms retirement of the three stale 2026-06-17 placeholder entries in figma-component-specs.json.