Every Blazor Hybrid page route (ALPAMobile/Components/Pages/**/*.razor) classified by whether the screen itself — not just the atoms/domain-controls it composes — traces to a captured Figma frame.
/mec/events) found it was built as a
"sensible scaffold" with no corresponding Figma design anywhere in the 3 known file keys — confirmed via live Figma MCP
search, not just a missing doc citation. That raised the question of how many other screens are in the same situation.
This inventory answers it for every route at once, so design-gap screens can be triaged deliberately instead of discovered
one at a time during unrelated bug fixes.
First pass was a docs-based cross-reference against the two authoritative citation sources in this repo:
docs/component-specifications/screen-mapping.html — embedded JSON registry, file key R6hPjBdjSIn6946qTJasUC, section-level node citations.docs/component-specifications/pages/*.html — an 11-file per-screen screenshot gallery, file key psH738AqHDxuMyFm897f9r.A route with an explicit node/file citation tied to that exact screen is Figma-backed. A route composed entirely of individually-cited atoms/domain-controls, but with no citation for the screen composition itself, is indirectly covered. A route with no citation anywhere is a design-gap candidate.
Second pass (this update): every GAP and UNCERTAIN route from the first pass was live-verified via the
Figma MCP tools (get_metadata, search_design_system, get_screenshot) rather than
left as docs-silence. This surfaced a fourth working file key beyond the three originally tracked
(gpO3masyyNNHxjvRtdcRo7, owEYzHf7FrHRvWC2u82UOl, R6hPjBdjSIn6946qTJasUC) —
psH738AqHDxuMyFm897f9r, the file the pages/*.html gallery's FTDT/KCM/Comms citations actually
come from — which the first pass's live check (MEC Events only) hadn't needed to reach for. All 4 keys are now the
standard search set for any future design-source check in this app.
docs/blazor-hybrid-migration-guide.html (dated 2026-06-26, still the canonical migration plan) explicitly
scoped as a functional port — not new design work. "MEC" is the Blazor-era rename of the legacy
"Pilot Group" concept, which is why the app's routes don't textually match the migration guide's page
names. None of these 8 screens were ever commissioned for a UI-Refresh redesign; the plan's scope for each was
"reimplement the existing native screen in Razor," which is the real reason no UI-Refresh-era Figma capture exists for
any of them — not a documentation oversight, and not something a design capture request would normally fix on its own.
| Route (this inventory) | Legacy XAML page | Migration tier | Guide's own description |
|---|---|---|---|
/mec/events | PilotGroupEventsPage | Tier 2 — Migrate Soon | "Event list; unread badges; preferences" — MEDIUM complexity |
/mec/hotels | PilotGroupHotelsPage | Tier 3 — Defer, HARD | "Platform-specific map URLs, grouped collection... complex filtering" |
/mec/reps | PilotGroupRepresentativesPage | Tier 1 — Migrate Now | "Directory with search filter" — LOW complexity |
/mec/committees (diverged, not gap) | PilotGroupCommitteePage / CommitteeDetailsPage | Tier 1 — Migrate Now | "List + detail via Razor component params" — LOW complexity |
/ftdt/add-duty-period, /ftdt/edit-duty-period | FTDTDutyPeriodBasePage (+ FTDTCADutyPeriodDetailsPage) | Tier 4 — Defer Late, VERY HARD | "500+ line XAML ControlTemplate... base class for 3 duty period variants" — the legacy app has no separately-named add/edit pages either; they're sub-variants of one complex templated base class. Correspondence is close but not 1:1 named. |
/document-open | PDFJSPage | Tier 4 — Defer Late, HARD | The guide's own recommendation was Option A: keep fully native, 0 days, don't migrate during the straggler period — yet DocumentOpenPage.razor exists as a Blazor page today, a deviation from the guide's own plan. Explains the missing design source doubly: not scoped for a new design, and not even scoped to migrate yet. |
/kcm/airport | KCMAirportDetailsPage | Tier 2 — Migrate Soon (item 2.7) | "Detail view; connectivity check" — MEDIUM complexity. Direct 1:1 name correspondence, unlike the FTDT case above. |
No Figma source found for these routes, confirmed via live Figma MCP search across all 4 known file keys (not just docs-silence). All are real, shipped product screens — not dev tooling. See Legacy migration lineage above: all 7 trace to a legacy XAML page the migration guide scoped as a straight port, which is why no source was ever commissioned.
A note on method: some near-miss nodes surfaced by search_design_system during this search were false positives —
blunt keyword/text matching within the Figma file, not a verified screen-to-route mapping. "HOTEL COMMITTEE" matched a
"hotels" query but is a different MEC committee (union business), not the travel-hotel list; the KCM "Airports" list node
matched an "airport" query but is the list screen, not the detail page the route actually is. Each near-miss is called out
per-row below rather than silently discarded.
| Route | Page file | Status | Note |
|---|---|---|---|
/mec/events | MecEventsPage.razor | GAP | No "Events" frame in any of the 4 file keys. Closest artifacts: MEC Home "Events" teaser carousel (node 4684:7914, horizontal scroll, no date box) and an ERW 005 LEC detail slider (node 20878:9764) — neither matches the app's vertical date-box list layout. |
/mec/hotels | MecHotelsPage.razor | GAP | Only match found was "HOTEL COMMITTEE" (node 20904:2633) — a name-matching false positive. Screenshot shows a single committee's detail page (Resources + Committee Members lists), structurally unrelated to the real app's hotel-list screen (search bar, hotel name/address/star-rating/rate/contract-badge rows). |
/mec/reps | MecRepsPage.razor | GAP | No standalone "Representatives" list frame anywhere. "REPRESENTATIVES" only appears as a 2–3 row preview section (+ "VIEW ALL" link) inside other composite MEC pages — the VIEW ALL destination was never located as its own frame. |
/ftdt/add-duty-period | FTDTDutyPeriodForm.razor | GAP | search_design_system for "add duty period" only surfaces the generic card-duty period component and generic Master Form Field set — no dedicated add-form screen. |
/ftdt/edit-duty-period | FTDTEditDutyPeriod.razor | GAP | Same search, same result — no dedicated edit-form screen. |
/document-open | DocumentOpenPage.razor | GAP | No document-viewer/PDF frame found; only a generic i-action icon component. Likely a technical webview wrapper with no custom design surface — lowest-priority gap to close, if it needs one at all. |
/kcm/airport, /kcm/airport/{Code} | KcmAirportDetailPage.razor | GAP | Node 4562:8249 "Airports" exists but is the wrong granularity — an alphabetical airport-list screen (ABQ, ANC, ATL… with chevrons), while the real route is a single-airport detail page (IATA hero, check-in notes, map link, KCM airlines list). No detail-page frame found; reclassified from UNCERTAIN to GAP. |
/mec and,
per the finding below, /mec/committees do. Still the single largest concentrated gap area in the app.
A source exists for the same screen concept, but the shipped implementation doesn't match it — a fidelity gap, not a design-source gap. Not counted in the totals above.
| Route | Page file | Status | Note |
|---|---|---|---|
/mec/committees | MecCommitteesPage.razor | FIGMA-BACKED | gpO3masyyNNHxjvRtdcRo7, node 20900:2432 "Committees" — confirmed via screenshot. Figma: flat list of committee rows (Hotel, Pilot Compensation, Retirement & Insurance, SOAR, SPSC, System Scheduling, Security) with heart-toggle icons, "VOLUNTEER OPPORTUNITIES" / "ALL MEC COMMITTEES" CTAs. App: 2 sections (Standing/Special) with Chair names, no hearts, no CTAs. Likely explanation (see Legacy migration lineage): the shipped page is a straight port of legacy PilotGroupCommitteePage (Tier 1), and this Figma frame is a newer UI-Refresh design nobody has applied yet — not the original source the port was built from. Worth a reconciliation pass, not a capture request. |
| Route | Page file | Status | Note |
|---|---|---|---|
/documents | DocumentsListPage.razor | UNCERTAIN | Node 4867:34739 "ALP Mag" — dated magazine-style entries with excerpt text + chevron, confirmed via screenshot. The real page is generic (Scope/Category/Grouping-driven; rows show Title + FormattedPublishDate only, no excerpt, no unread affordance per its own doc comment). "ALP Mag" is plausibly one Category/Grouping this generic page renders, but the row shape doesn't clearly match, and the no-param Category-list variant is unconfirmed either way. Needs a live app screenshot compared side-by-side. |
Every @page route in ALPAMobile/Components/Pages/**/*.razor. One file, FTDT/FTDTDutyPeriodList.razor, has no @page directive — it's a child component embedded in /ftdt/dashboard, not its own route, and is excluded below.
| Route | Page file | Status | Evidence |
|---|---|---|---|
/home | Home.razor | FIGMA-BACKED | pages/home.html, node 4099:5229 |
/mec | MecOverviewPage.razor | FIGMA-BACKED | screen-mapping.html registry, node 4684:7914 |
/mec/committees | MecCommitteesPage.razor | FIGMA-BACKED | node 20900:2432, implementation diverged — see Diverged section above |
/mec/events | MecEventsPage.razor | GAP | none, live-verified — see Confirmed gaps above |
/mec/hotels | MecHotelsPage.razor | GAP | none — see Confirmed gaps above |
/mec/reps | MecRepsPage.razor | GAP | none — see Confirmed gaps above |
/kcm | KcmHomePage.razor | FIGMA-BACKED | pages/kcm.html, node 4562:7572 |
/kcm/airlines | KcmAirlinesPage.razor | FIGMA-BACKED | pages/kcm.html, node 4562:7754 |
/kcm/policies | PURGED 2026-08-13 | Removed — no backing data source and no legacy-XAML counterpart; node 4562:7954's search need is served by /jumpseat/airline-policies | |
/kcm/airport, /kcm/airport/{Code} | KcmAirportDetailPage.razor | GAP | node 4562:8249 is the airport-list screen (wrong granularity), not the detail page — see Confirmed gaps above |
/jumpseat/search | JumpseatSearchPage.razor | FIGMA-BACKED | pages/flight-finder.html, node 4713:25117 |
/jumpseat/results | JumpseatResultsPage.razor | FIGMA-BACKED | node 4713:25168 |
/jumpseat/recent | JumpseatRecentSearchesPage.razor | FIGMA-BACKED | node 4713:25203 |
/jumpseat/saved-searches | JumpseatSavedSearchesPage.razor | FIGMA-BACKED | node 4713:25253 |
/jumpseat/saved | JumpseatSavedFlightsPage.razor | FIGMA-BACKED | node 4713:25365 |
/jumpseat/airline-policies | JumpseatAirlinePoliciesPage.razor | FIGMA-BACKED | nodes 4713:25303 / 25321 / 25339 (Search/List/Detail) |
/jumpseat/details | JumpseatDetailsPage.razor | INDIRECT | no page-level node; composes the cited "flight detail flight info" component (4325:6399), design-questions.html:774 |
/ftdt | FTDTRoot.razor | FIGMA-BACKED | pages/ftdt.html, node 4535:14038 |
/ftdt/select-op-type | FTDTSelectOpType.razor | FIGMA-BACKED | node 4535:14386 |
/ftdt/dashboard | FTDTDashboard.razor | FIGMA-BACKED | node 4544:5877 ("FTDT — Duty Periods") |
/ftdt/add-flight-segment | FTDTAddFlightSegment.razor | FIGMA-BACKED | node 4555:6566 |
/ftdt/add-rest | FTDTAddRest.razor | FIGMA-BACKED | node 4603:13187 |
/ftdt/add-note | FTDTAddNote.razor | FIGMA-BACKED | node 4603:13348 |
/ftdt/add-duty-period | FTDTDutyPeriodForm.razor | GAP | none — see Confirmed gaps above |
/ftdt/edit-duty-period | FTDTEditDutyPeriod.razor | GAP | none — see Confirmed gaps above |
/ftdt/test-scenarios | FTDTTestScenariosPage.razor | N/A | internal test harness, not a product screen |
/comms | CommsNotificationsPage.razor | FIGMA-BACKED | pages/comms.html, node 4565:9260 |
/advocacy | AdvocacyPage.razor | FIGMA-BACKED | pages/advocacy.html, node 4877:11274 |
/favorites | FavoritesPage.razor | FIGMA-BACKED | pages/favorites.html, node 5287:15227 |
/documents | DocumentsListPage.razor | UNCERTAIN | possibly folded into Comms / ALP Mag node 4867:34739 — not confirmed |
/member-resources | MemberResourcesPage.razor | FIGMA-BACKED | pages/member-resources.html, node 4870:10671 |
/notifications | NotificationsPage.razor | FIGMA-BACKED | pages/notifications.html, nodes 5060:14989 / 5060:15039 |
/notifications/settings | NotificationSettingsPage.razor | FIGMA-BACKED | node 5155:13608 |
/search | SearchPage.razor | FIGMA-BACKED | pages/search.html, node 4951:11891 |
/login | LoginPage.razor | FIGMA-BACKED | pages/login.html, node 5387:31926 |
/login/non-members | LoginNonMembersPage.razor | FIGMA-BACKED | node 5387:32346 |
/item-unavailable | ItemUnavailablePage.razor | FIGMA-BACKED | off-the-radar-component.html, node 5369:31134 |
/document-open | DocumentOpenPage.razor | GAP | none — see Confirmed gaps above |
/ | DevDashboard.razor | N/A | dev router index (the "TO TEST / All" readiness screen) |
/dev/auth-status | DevAuthStatusPage.razor | N/A | dev-only diagnostic page |
/home-preview | HomePreviewPage.razor | N/A | explicitly labeled "test surface" in the dev index |
All 7 GAP and 1 diverged route are now live-verified (see Methodology) and traced to a legacy-migration root cause
(see Legacy migration lineage). The open questions have shifted from "why is this
undocumented" to "does the original port-as-is scope decision still hold." Only /documents remains a genuine
unresolved documentation question rather than a scope question.
/documents with a live app screenshot compared against the "ALP Mag" node (4867:34739) side-by-side — the row shape looks close but isn't confirmed. This is the one case not explained by legacy lineage./mec/committees against its Figma source (node 20900:2432) — a fidelity pass, not a capture request: decide whether to adopt the 2-section/Chair-name shape already shipped, or rebuild to match Figma's flat list + hearts + CTAs./mec/events, /mec/hotels, /mec/reps, the 2 FTDT duty-period forms, /document-open): the decision isn't "close a documentation gap," it's a product/design call — does anyone want a UI-Refresh redesign for these screens now, or does the original migration-guide scope (port the native screen as-is) still stand? Raise with whoever owns the UI-Refresh backlog rather than filing a design-capture request against a documentation team./document-open deviation separately — it shipped as a Blazor page despite the migration guide explicitly recommending it stay fully native during the straggler period. Worth a quick check that this didn't skip an intended review gate, independent of the missing-design question./mec/events, /mec/hotels, /mec/reps) are the highest-value target to bundle into one capture request, since a design pass would likely produce one consistent MEC sub-page template rather than three one-offs.