Updated: 2026-08-27 09:53 ET
Audited: 2026-07-09 21:15 ET
card-lg also appears in the "New & Notable" and "Feed" carousels,
confirming it is a reusable component. This spec is authoritative for the component structure.
RawRepresentationFactory from CMS content.
Appears in horizontal scrolling carousels (320 px wide) and as a full-width list item (361 px wide — same component,
different width context). A 2 px bottom accent border sits between the image slot and the card body —
color comes from the CMS content category token (border/blue-lt or border/yellow)
or MEC brand token (united-brand/blue-500 #0008ce).
Figma annotation: "Card image is CMS-fed — expect variable crop/aspect; define focal-point / fit rules."
Title similarly annotated: "Card title is CMS-fed — length varies; set max-lines / truncation behavior."
psH738AqHDxuMyFm897f9r ·
Component: card-lg (4179:10018, 4116:6869) in Home screen (4099:5229) ·
captured 2026-06-26
| Variant | Figma node | Width | Content | When used |
|---|---|---|---|---|
| Blue accent | 4179:10018 | 320 px | Eyebrow + Title | MEC or standard content in carousel |
| Yellow accent | 4179:10019 | 320 px | Eyebrow + Title | Highlighted / priority content in carousel |
| Full-width + description | 4116:6869 | 361 px | Title + Description (no eyebrow) | List position outside carousel (e.g. "Hotel Request") |
Tier: container. Extends DocumentCardViewModel (which extends CardViewModel → SurfaceViewModel).
DocumentCardViewModel already carries Eyebrow, Title, Description, Image, and AccentColor — no new ViewModel needed.
Note: IsFavorite comes from CardViewModel. The heart is rendered — D7 (heart hidden on CardTextViewModel) was reversed 2026-08-27; card-md now shows the heart too, so this is no longer a card-lg-only distinction.
| Screen | Node | Context | Width |
|---|---|---|---|
| Home — UAL MEC carousel | 4099:5247 | Horizontal scrolling feed ("UAL MEC" section) | 320 px |
| Home — New & Notable carousel | 4185:10208 | Horizontal scrolling feed ("New & Notable" section) | 320 px |
| Home — Feed carousel | 4099:5249 | Horizontal scrolling feed ("Feed" section) | 320 px |
| Home — Full-width list item | 4116:6869 | Between card-sm rows ("Hotel Request") | 361 px |
object-fit:cover with a configurable object-position driven by CMS metadata.AccentColor holds the token name ("interactive/blue-lt", "border/yellow", or "united-brand/blue-500" for UAL MEC) — never a raw hex. Resolve via IThemeResolver.ResolveColor() at render time so MEC theming can override. The accent renders as a 2 px bottom border on the image slot (border-bottom: 2px solid), NOT a left border.Eyebrow != null vs Description != null.CardTextViewModel list items while card-lg showed one (D31 amends D7); D7 itself was reversed 2026-08-27, so card-md renders the same heart now (CardText.ShowFavorite/IsFavorite/OnFavoriteToggle, Figma node 4718:11125). Wired in CardHero.razor as ShowFavorite/IsFavorite/OnFavoriteToggle parameters — the card stays presentational; the consuming page (e.g. FavoritesPage.razor, HomePreviewPage.razor) wires the callback to the live Favorites API (WI 2182, Change 3 delivered) and gates ShowFavorite on IAuthentication.IsLoggedIn and on the item having a stable id (no id → no heart, never a dead control). States (verified against the Figma i-heart variant set 5192:15185, 2026-07-09): off = navy outline (icons/heart.svg), on = filled navy #05273E (icons/heart-selected.svg) — an earlier build filled it red; navy is the design-correct on-state./images/figma/cockpit.jpg / pilots.jpg, alternating deterministically by title) instead of an empty media slot.overflow:hidden; text-overflow:ellipsis with a max-lines constraint (suggest 3 lines) to prevent card height explosion in carousels.CardHero.razor (renamed from HeroCard.razor, D59) lives in ALPAMobile.Presentation/Components/Library/ — the RCL extraction of the component library happened 2026-07-15 (WI-2254/D61). Used by the Favorites/home-preview screens landed with WI 2182. ALPAMobile.HybridUi is the pre-development prototype codename for that RCL (used across the planning-era spec docs); the project that materialized under that plan is ALPAMobile.Presentation.Target home: ALPAMobile.HybridUi. Component file: CardLarge.razor. Uses DocumentCardViewModel — no new ViewModel required.
| Parameter | Type | Required | Description |
|---|---|---|---|
Vm | DocumentCardViewModel | Yes | Full card data. Passed as a single ViewModel; component reads all properties from it. |
OnFavoriteToggle | EventCallback<DocumentCardViewModel> | No | Fires when user taps the heart. Consumer wires to Favorites API. |
OnTap | EventCallback<DocumentCardViewModel> | No | Fires when user taps the card body (navigate to article). |
@* Carousel — fixed 320px width, AccentColor from CMS category *@
<AlpaCardLarge Vm="@card"
OnFavoriteToggle="@ToggleFavorite"
OnTap="@NavigateToArticle" />
@* Full-width list item — width controlled by parent layout (361px context) *@
<AlpaCardLarge Vm="@featuredCard"
OnTap="@NavigateToArticle" />
Classes will live in ALPAMobile.HybridUi/wwwroot/css/alpa-components.css under the alpa-card-lg BEM block.
| Class | Scope | Key rules |
|---|---|---|
.alpa-card-lg | Root card | background:white; display:flex; flex-direction:column; border-radius:8px; overflow:hidden · width set by parent context (320px carousel / 361px list) |
.alpa-card-lg__img | Image block | height:200px; border-bottom:2px solid var(--accent-color); overflow:hidden; position:relative · --accent-color set inline from AccentColor token |
.alpa-card-lg__img img | Image element | width:100%; height:100%; object-fit:cover; object-position:center |
.alpa-card-lg__content | Below-image area | display:flex; flex-direction:column; padding-top:8px; padding-bottom:24px |
.alpa-card-lg__fav-wrapper | Heart button row | display:flex; justify-content:flex-end; padding:0 8px; margin-bottom:-12px |
.alpa-card-lg__fav-btn | Heart button | width:18px; height:18px; background:none; border:none; cursor:pointer |
.alpa-card-lg__text-wrapper | Text content area | display:flex; flex-direction:column; gap:12px; padding:0 24px |
.alpa-card-lg__eyebrow | Category label | font-family:var(--font-family/eyebrow); font-weight:700; font-size:12px; color:var(--text-secondary); opacity:0.5; text-transform:uppercase; letter-spacing:0.6px; line-height:1.4 |
.alpa-card-lg__title | Card title | font-family:var(--font-family/heading); font-weight:600; font-size:20px; color:var(--text-primary); line-height:1.2; overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical |
.alpa-card-lg__description | Optional sub-copy | font-family:var(--font-family/alt); font-weight:600; font-size:18px; color:var(--text-primary); line-height:1.2 |