← Back to Index

Design-Source Gap Inventory

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.

Date: 2026-07-14 Scope: UI Refresh Epic AB#1821 — Blazor Hybrid page set Method: docs cross-reference (see Methodology)
Why this exists. Live UI review of the MEC Events page (/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.

Methodology

First pass was a docs-based cross-reference against the two authoritative citation sources in this repo:

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.

FIGMA-BACKED explicit node/file citation for this exact screen INDIRECT composes cited atoms/controls, no screen-level citation GAP no citation found anywhere — design-gap candidate UNCERTAIN ambiguous match, needs a closer look N/A dev tooling / test harness, not a product screen

Legacy migration lineage — why these gaps exist

Every route in the Confirmed-gaps and Diverged tables traces to a pre-existing native XAML page that 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 pageMigration tierGuide's own description
/mec/eventsPilotGroupEventsPageTier 2 — Migrate Soon"Event list; unread badges; preferences" — MEDIUM complexity
/mec/hotelsPilotGroupHotelsPageTier 3 — Defer, HARD"Platform-specific map URLs, grouped collection... complex filtering"
/mec/repsPilotGroupRepresentativesPageTier 1 — Migrate Now"Directory with search filter" — LOW complexity
/mec/committees (diverged, not gap)PilotGroupCommitteePage / CommitteeDetailsPageTier 1 — Migrate Now"List + detail via Razor component params" — LOW complexity
/ftdt/add-duty-period, /ftdt/edit-duty-periodFTDTDutyPeriodBasePage (+ 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-openPDFJSPageTier 4 — Defer Late, HARDThe 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/airportKCMAirportDetailsPageTier 2 — Migrate Soon (item 2.7)"Detail view; connectivity check" — MEDIUM complexity. Direct 1:1 name correspondence, unlike the FTDT case above.

Confirmed design-gap candidates — live-verified (7)

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.

RoutePage fileStatusNote
/mec/eventsMecEventsPage.razorGAPNo "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/hotelsMecHotelsPage.razorGAPOnly 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/repsMecRepsPage.razorGAPNo 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-periodFTDTDutyPeriodForm.razorGAPsearch_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-periodFTDTEditDutyPeriod.razorGAPSame search, same result — no dedicated edit-form screen.
/document-openDocumentOpenPage.razorGAPNo 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.razorGAPNode 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.
Headline finding: 3 of 5 MEC routes have no Figma source (events, hotels, reps) — only /mec and, per the finding below, /mec/committees do. Still the single largest concentrated gap area in the app.

Figma-backed but implementation diverged (1)

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.

RoutePage fileStatusNote
/mec/committeesMecCommitteesPage.razorFIGMA-BACKEDgpO3masyyNNHxjvRtdcRo7, 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.

Still uncertain (1)

RoutePage fileStatusNote
/documentsDocumentsListPage.razorUNCERTAINNode 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.

Full inventory

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.

RoutePage fileStatusEvidence
/homeHome.razorFIGMA-BACKEDpages/home.html, node 4099:5229
/mecMecOverviewPage.razorFIGMA-BACKEDscreen-mapping.html registry, node 4684:7914
/mec/committeesMecCommitteesPage.razorFIGMA-BACKEDnode 20900:2432, implementation diverged — see Diverged section above
/mec/eventsMecEventsPage.razorGAPnone, live-verified — see Confirmed gaps above
/mec/hotelsMecHotelsPage.razorGAPnone — see Confirmed gaps above
/mec/repsMecRepsPage.razorGAPnone — see Confirmed gaps above
/kcmKcmHomePage.razorFIGMA-BACKEDpages/kcm.html, node 4562:7572
/kcm/airlinesKcmAirlinesPage.razorFIGMA-BACKEDpages/kcm.html, node 4562:7754
/kcm/policiesKcmPoliciesSearchPage.razorPURGED 2026-08-13Removed — 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.razorGAPnode 4562:8249 is the airport-list screen (wrong granularity), not the detail page — see Confirmed gaps above
/jumpseat/searchJumpseatSearchPage.razorFIGMA-BACKEDpages/flight-finder.html, node 4713:25117
/jumpseat/resultsJumpseatResultsPage.razorFIGMA-BACKEDnode 4713:25168
/jumpseat/recentJumpseatRecentSearchesPage.razorFIGMA-BACKEDnode 4713:25203
/jumpseat/saved-searchesJumpseatSavedSearchesPage.razorFIGMA-BACKEDnode 4713:25253
/jumpseat/savedJumpseatSavedFlightsPage.razorFIGMA-BACKEDnode 4713:25365
/jumpseat/airline-policiesJumpseatAirlinePoliciesPage.razorFIGMA-BACKEDnodes 4713:25303 / 25321 / 25339 (Search/List/Detail)
/jumpseat/detailsJumpseatDetailsPage.razorINDIRECTno page-level node; composes the cited "flight detail flight info" component (4325:6399), design-questions.html:774
/ftdtFTDTRoot.razorFIGMA-BACKEDpages/ftdt.html, node 4535:14038
/ftdt/select-op-typeFTDTSelectOpType.razorFIGMA-BACKEDnode 4535:14386
/ftdt/dashboardFTDTDashboard.razorFIGMA-BACKEDnode 4544:5877 ("FTDT — Duty Periods")
/ftdt/add-flight-segmentFTDTAddFlightSegment.razorFIGMA-BACKEDnode 4555:6566
/ftdt/add-restFTDTAddRest.razorFIGMA-BACKEDnode 4603:13187
/ftdt/add-noteFTDTAddNote.razorFIGMA-BACKEDnode 4603:13348
/ftdt/add-duty-periodFTDTDutyPeriodForm.razorGAPnone — see Confirmed gaps above
/ftdt/edit-duty-periodFTDTEditDutyPeriod.razorGAPnone — see Confirmed gaps above
/ftdt/test-scenariosFTDTTestScenariosPage.razorN/Ainternal test harness, not a product screen
/commsCommsNotificationsPage.razorFIGMA-BACKEDpages/comms.html, node 4565:9260
/advocacyAdvocacyPage.razorFIGMA-BACKEDpages/advocacy.html, node 4877:11274
/favoritesFavoritesPage.razorFIGMA-BACKEDpages/favorites.html, node 5287:15227
/documentsDocumentsListPage.razorUNCERTAINpossibly folded into Comms / ALP Mag node 4867:34739 — not confirmed
/member-resourcesMemberResourcesPage.razorFIGMA-BACKEDpages/member-resources.html, node 4870:10671
/notificationsNotificationsPage.razorFIGMA-BACKEDpages/notifications.html, nodes 5060:14989 / 5060:15039
/notifications/settingsNotificationSettingsPage.razorFIGMA-BACKEDnode 5155:13608
/searchSearchPage.razorFIGMA-BACKEDpages/search.html, node 4951:11891
/loginLoginPage.razorFIGMA-BACKEDpages/login.html, node 5387:31926
/login/non-membersLoginNonMembersPage.razorFIGMA-BACKEDnode 5387:32346
/item-unavailableItemUnavailablePage.razorFIGMA-BACKEDoff-the-radar-component.html, node 5369:31134
/document-openDocumentOpenPage.razorGAPnone — see Confirmed gaps above
/DevDashboard.razorN/Adev router index (the "TO TEST / All" readiness screen)
/dev/auth-statusDevAuthStatusPage.razorN/Adev-only diagnostic page
/home-previewHomePreviewPage.razorN/Aexplicitly labeled "test surface" in the dev index

Next steps

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.