← Back to Index

Notification Card Flight Status Figma: notification card flight status domain control

Updated: 2026-08-27 08:24 ET

Audited: 2026-06-26

Flight notification list item — timestamp, 44px icon, route + date, collapse/expand caret
Figma node: 5054:13801 (notification card flight status) · Screen: Notifications 5060:14989 · file key: psH738AqHDxuMyFm897f9r · Working file: owEYzHf7FrHRvWC2u82UOl — parent page node notifications-ff 5060:14989 · component set 5054:13776 (Default 5054:13775 · open 5054:13777 · comms 5056:13824); also instanced on manu-notifications 4860:31213
Domain control — Notifications screen. Appears in the "Flight Finder" tab of the Notifications screen (5060:14989). Each card represents one flight status notification. The bottom section is a caret-only pill button (Underline Button in Figma — 18px height, border-radius:38px) that indicates expand/collapse affordance. The card itself is a tappable button (cursor:pointer). The "Comms" tab uses a comms variant of the notification card (different content structure — separate spec pending).
Implemented 2026-08-12 as ALPAMobile.Presentation/Components/Notifications/FlightNotificationCard.razor (CSS prefix alpa-fsnc-* in alpa-components.css), validated live on the iOS simulator against the working Figma file. Deliberate deviations from this spec's target API, each with its reason:
Design tokens sourced from Figma file key psH738AqHDxuMyFm897f9r · Component: notification card flight status (5054:13801) in Notifications screen (5060:14989) · captured 2026-06-26

Live CSS Preview

Collapsed (as seen in Figma)
7min ago
DEN » MIA
Fri April 24
Multiple notifications (stacked)
7min ago
DEN » MIA
Fri April 24
1hr ago
LAX » ORD
Thu April 23

Design Tokens

Dimensions

Card width
345 px (screen 393 − 2×24px margins)
Card padding-top
8 px (--tiny)
Card gap
8 px between header section and expand button
Timestamp padding-x
16 px (--xsmall)
Content row padding-x
16 px (--xsmall)
Content row gap
16 px between icon and text
Icon size
44×44 px circle
Icon inner image
18×18 px
Expand button height
18 px
Expand button border-radius
38 px (rounded-[38px])
Expand button padding-x
12 px (--xxsmall)
Expand button padding-y
4 px (--xtiny)
Caret icon size
12×12 px (14px wide × 7px tall SVG)

Colors

Card background
white/500 #ffffff
Card bottom border
border/default #d2d4d6
Route text
text/primary #05273e
Date text
text/primary #05273e
Timestamp text
text/secondary #5d6471
Expand button background
white/500 #ffffff

Typography — Timestamp

Font family
Font Family/Caption (Inter Regular)
Font weight
Font Weight/Caption (400)
Font size
14 px (--font-size/other/caption)
Line height
1.5
Alignment
right (justify-content:flex-end in row)

Typography — Route

Font family
Font Family/Body (Futura PT Demi)
Font weight
Demi (500)
Font size
20 px (--font-size/body/l)
Line height
1.3
White-space
nowrap

Typography — Date

Font family
Afacad SemiBold
Font weight
600
Font size
18 px (--font-size/body/m)
Line height
1.2

Variants

States (flight variant)

StateDescription
Collapsed (default)Caret chevron points down — indicates content can be expanded. Content area shows route + date.
ExpandedCaptured 2026-08-12 as the open variant (5054:13777): a status row above the caret pill — flight number ("DL 302", Futura Medium 16px) left, severity pill right (radius 24, 2px/8px padding, 12px navy text; yellow/500 for "Delayed 34m"), separated from the content block by a 1px gray/100 (#f3f6f7) top border. The variant's caret is drawn unrotated; the implementation flips it while open for affordance.

Comms variant

Captured from Notifications — Comms tab screen (parent page node notifications-comms 5060:15039, instances 5056:13946/13947). Same component name (notification card flight status), same container structure, different slot content. Implemented 2026-08-12 as CommsNotificationCard.razor, sharing the alpa-fsnc-* CSS block with the flight variant — one component in the design, one CSS block in code (the old alpa-notif-card row styles were removed). The drawn expander pill is empty in this variant and is rendered as drawn (decorative); the whole card remains the tap target, routed by the host through NotificationContentRouter — behavior the design does not address. Weblink rows open the app's auto-login AuthenticatedWebViewPage modal (renamed from WebViewPage, AB#2591) via IDocumentActionNavigator.NavigateToWebLinkAsync — the same path native's notification list takes — not the system browser (parity fix 2026-08-12: Safari bounced member-only links to a second login). The same card serves the live Comms tab and the read-state scenarios surface (/notifications/comms-scenarios), which inherits the redesign automatically.

SlotFlight variantComms variant
TimestampInter Regular 14px, right-aligned, secondary color — always elapsed time ("7min ago"), never a calendar date; the implementation's ladder continues upward ("2 hrs ago" · "3 days ago" · "2 wks ago" · "3 mos ago" · "1 yr ago") in RelativeTimeExtensions. Note: both feeds send offset-naive timestamps (verified against production 2026-08-12) — the elapsed value assumes they are local wall clock; an explicit-offset ask is flagged for the backend.Same ("2 hrs ago" drawn)
Icon circle44×44px circle, 18×18 inner image (airline/status icon)Same structure (generic icon placeholder)
Line 1 (primary)Route string — e.g. "DEN » MIA" — Futura PT Demi 20px, nowrapCategory/source — e.g. "Operations Bulletin", "From the President" — Futura PT Demi 20px, same font
Line 2 (secondary)Date string — e.g. "Fri April 24" — Afacad SemiBold 18px (body/m), 1 lineArticle headline/body — Afacad SemiBold (body/m), multi-line, leading-[1.3]
Expand button18px pill with 12px caret icon18px pill drawn empty (no caret) — rendered as drawn, decorative; the comms card does not expand, its tap opens the routed destination

The comms variant body text font size shows a fallback of 20px in the Figma export vs 18px for the flight variant, both using var(--font-size/body/m). Treat as the same token — confirm the token resolves to 18px with the design system.

Layer Tree

└── notification card flight status · 345px · white bg · border-b:border/default
    ├── header section · flex-col · gap:0
    │    ├── timestamp row · flex row · justify-end · px:16px
    │    │    └── [Timestamp] · TEXT · Inter Regular 14px · text/secondary · right-align
    │    └── content row · flex row · items-center · gap:16px · px:16px
    │        ├── icon-generic · 44×44 · circle
    │        │    └── [icon image] · 18×18 px
    │        └── text · flex-col · flex:1
    │            ├── [Route] · TEXT · Futura PT Demi 20px · text/primary · nowrap
    │            └── [Date] · TEXT · Afacad SemiBold 18px · text/primary
    └── Underline Button (expand toggle) · h:18px · w:100% · radius:38px · bg:white
        └── i-caret · 12×12px · px:12px py:4px · caret SVG (14×7px inner)

ViewModel

Tier: domain control. Spec-only ViewModel — not added to ComponentViewModels.cs until implementation.

└── NotificationFlightStatusViewModel : ComponentViewModel (spec-only)
    ├── Timestamp : string — human-friendly elapsed time (e.g. "7min ago", "1hr ago")
    ├── IconUrl : string? — 18×18 icon within the 44px circle; null = default circle placeholder
    ├── Route : string — origin » destination (e.g. "DEN » MIA")
    ├── Date : string — formatted flight date (e.g. "Fri April 24")
    ├── IsExpanded : bool — controls caret direction + expanded detail visibility
    └── OnExpandToggle : EventCallback — invoked when caret button is tapped

Usage Context

ScreenNodeTabRole
Notifications5054:13801Flight Finder tabRepeating list item — one per flight status notification
Notifications (Comms tab)5056:13946 / 5056:13947Comms tabComms variant — same component, different slot content (category + headline instead of route + date). See § Comms variant above.

Developer Notes

Blazor Component API

Target home: ALPAMobile.HybridUi. Component file: NotificationCardFlightStatus.razor.

ParameterTypeRequiredDescription
TimestampstringYesHuman-readable elapsed time (e.g. "7min ago"). Formatted by the ViewModel, not the component.
IconUrlstring?NoURL for 18×18 icon inside the 44px circle. Null renders a default placeholder circle.
RoutestringYesRoute string (e.g. "DEN » MIA"). Include the » separator in the data.
DatestringYesFormatted date string (e.g. "Fri April 24").
IsExpandedboolNoControls caret direction. Default: false. Expanded detail content is a child RenderFragment.
ExpandedContentRenderFragment?NoDetail content shown when IsExpanded is true. Allows callers to provide domain-specific expanded view.
OnExpandToggleEventCallbackNoFires when caret button is tapped. Consumer toggles IsExpanded on the ViewModel.

Razor Usage (target)

@* Notifications page — Flight Finder tab *@
@foreach (var notif in Vm.FlightNotifications)
{
    <AlpaNotificationCardFlightStatus
        Timestamp="@notif.Timestamp"
        IconUrl="@notif.IconUrl"
        Route="@notif.Route"
        Date="@notif.Date"
        IsExpanded="@notif.IsExpanded"
        OnExpandToggle="@(() => notif.ToggleExpand())" />
}

CSS Class Reference (target)

Classes will live in ALPAMobile.HybridUi/wwwroot/css/alpa-components.css under the alpa-notif-card-fs BEM block ("fs" = flight status).

ClassScopeKey rules
.alpa-notif-card-fsRoot cardbackground:white; border-bottom:1px solid var(--border-default); display:flex; flex-direction:column; gap:8px; padding-top:8px; width:100%; cursor:pointer
.alpa-notif-card-fs__headerTimestamp + content areadisplay:flex; flex-direction:column; gap:0
.alpa-notif-card-fs__timestamp-rowRight-aligned timestamp rowdisplay:flex; justify-content:flex-end; padding:0 16px
.alpa-notif-card-fs__timestampTime elapsed textfont-family:var(--font-family/caption); font-weight:var(--font-weight/caption); font-size:14px; color:var(--text-secondary); line-height:1.5; white-space:nowrap
.alpa-notif-card-fs__content-rowIcon + text rowdisplay:flex; align-items:center; gap:16px; padding:0 16px
.alpa-notif-card-fs__icon44px circle icon slotwidth:44px; height:44px; border-radius:50%; display:flex; align-items:center; justify-content:center; overflow:hidden; flex-shrink:0
.alpa-notif-card-fs__icon imgIcon imagewidth:18px; height:18px
.alpa-notif-card-fs__textRoute + date text columndisplay:flex; flex-direction:column; flex:1; min-width:0
.alpa-notif-card-fs__routeRoute line (DEN » MIA)font-family:var(--font-family/body); font-weight:500; font-size:20px; color:var(--text-primary); line-height:1.3; white-space:nowrap
.alpa-notif-card-fs__dateDate linefont-family:var(--font-family/alt); font-weight:600; font-size:18px; color:var(--text-primary); line-height:1.2
.alpa-notif-card-fs__expand-btnCaret-only expand buttonbackground:white; border:none; border-radius:38px; width:100%; height:18px; display:flex; align-items:center; justify-content:center; padding:4px 12px; cursor:pointer
.alpa-notif-card-fs__caretCaret icon wrapperwidth:12px; height:12px; display:flex; align-items:center; justify-content:center · SVG rotates 180° when IsExpanded via alpa-notif-card-fs__caret--up
.alpa-notif-card-fs__caret--upExpanded caret modifiertransform:rotate(180deg)