← Component Specifications

Empty State Inventory & Gaps

Updated: 2026-08-02 06:43 ET Audited: 2026-08-02 06:43 ET AB#2286 For: design team review
What this is. Asked for by the design team: one place to see how each part of the app behaves when it has nothing to show. This documents every empty state that exists, the surfaces that render a list and have none, and the questions arising. A matching launcher ships in the app so the states can be reviewed on a device rather than only on paper — Page Readiness → Empty States.
Empty State Scenarios launcher on the readiness board

The in-app launcher, grouped by what it takes to reach each state.

1 · Three different treatments are in use

The most consequential finding is not a missing state — it is that empty is currently expressed three different ways, and only one of them is a component:

TreatmentWhereShape
<EmptyState> component11 screens — KCM, favorites, jumpseat saved/recent/saved-searches, documents, notifications, policy detailIcon + title + subtitle, centred
.alpa-form-emptyFlight Finder resultsA single line of text, no icon
.ftdt-emptyFTDT duty period listA single line of text, no icon

The two bespoke ones are not obviously wrong — the Flight Finder one deliberately distinguishes signed out and service failure from genuinely no flights (AB#2319), which the shared component has no vocabulary for. But three treatments means a member meets three different visual languages for the same idea.

2 · What exists today

SurfaceStateReachable how
KCM · airport not foundEmptyStateRoute — /kcm/airport/ZZZZ
KCM · airlines search no matchEmptyStateType a non-matching term
KCM · home with no menu itemsEmptyStateOnly if the CMS returns no children
Notifications · no flight alertsEmptyStateDevice with no subscriptions and sample fallback off
Notifications · flight update not foundEmptyStateRoute — stale deep link
Notifications · Comms inboxEmptyState (added)Member with no Comms items
Notifications · Comms filter matches nothingEmptyState (added)Filter to an audience with no items
Favorites · nothing savedEmptyStateSigned in, nothing favourited
Favorites · failed to loadEmptyStateFavorites service unreachable
Jumpseat · saved flights / saved searches / recentEmptyState ×3Device with none
Jumpseat · airline policy not foundEmptyStateRoute — ?airline=999999
Documents · empty scope / empty categoryEmptyState ×2Scope or category with nothing published
Flight Finder · no resultsbespokeSearch matching nothing
FTDT · no duty periodsbespokeDevice with none

3 · Gaps — renders a list, has no empty state

Each of these will render a blank area rather than say anything:

SurfaceWhen it goes blank
KCM · airports listAirports feed returns nothing
KCM · policies searchSearch matches no airline
Jumpseat · airline policies listPolicy list empty
My MEC · committeesAny of these four MEC feeds returns nothing — likely for a member whose MEC has not populated that section
My MEC · events
My MEC · hotels
My MEC · reps
Member ResourcesResource list empty
Notification Settings · subscriptionsMember has no audience subscriptions
Search resultsQuery matches nothing
The MEC four are the ones to worry about. The others need an unusual backend state; a member whose MEC has not filled in its hotels or events is ordinary, and today that member sees a screen that looks broken. Search results is the second concern — a search matching nothing is a normal thing for a member to do, not an error condition.

4 · Questions for the design team

  1. One treatment or three? Should Flight Finder results and the FTDT duty list adopt the shared EmptyState, or do their extra distinctions (signed out / service failure / genuinely none) justify staying bespoke? If they should converge, EmptyState needs a vocabulary for why it is empty.
  2. Does empty always need an icon? The component always draws one; the two bespoke treatments never do. Current icons are picked per-call-site (♡, ✈, 🕓, 🔍, ✉) with no guidance — worth a defined set.
  3. Empty vs failed. Favorites is the only surface that distinguishes "nothing here" from "we could not load it", and it does so by reusing the same component with different words. Should that distinction be visual rather than only textual?
  4. Does an empty state offer a way out? None of them currently carry an action. Several obviously could — an empty saved-flights could offer Search Flights, an empty search could offer Clear.
  5. The gaps above — which need designing now for alpha, and which can wait? Our read is that the four MEC screens and search results matter most, because a member reaches them in normal use.
  6. Filtered-empty wording. The Comms tab now says something different when a filter is the reason nothing shows. Should that pattern generalise to every filterable list?

5 · Related