Updated: 2026-07-06 17:22 ET
Audited: 2026-06-26
4245:5754 · COMPONENT_SET 167×158 (Property 1=default 127×31, Property 1=selected 109×31) · live file owEYzHf7FrHRvWC2u82UOl ("ALPA mobile app"). Confirmed the same component as above — the "pill button" spelling seen in some older docs was a word-order transcription slip, not a Figma rename.button pill is one selectable item inside a tab group container.
The Notifications screen uses a two-tab configuration: "Comms" and "Flight Finder". Switching tabs filters the notification list —
this is not two separate screens, it is one screen with two filtered feeds.
Figma annotation: "Notifications — two-tab segmentation. Flight Finder tab vs. Comms tab. Switching changes the list source; the same card serves both (comms variant on the Comms side)."
The tab group outer container is a white rounded pill (border-radius:32px); individual pills have border-radius:24px.
psH738AqHDxuMyFm897f9r ·
Component: button pill (5048:13572–73) in tab group (5048:13576) · Screen: Notifications (5060:14989) ·
captured 2026-06-26
| State | Figma node | Background | Text color |
|---|---|---|---|
| Inactive (default) | 5048:13572 | surface/default = white | text/primary #05273e |
| Active (selected) | 5048:13573 | interactive/blue-lt #007bc2 | text/on-brand = white |
Tier: primitive. No dedicated ViewModel needed — the tab group is driven by an index or enum from the page ViewModel.
Note: ButtonPillViewModel is spec-only and will not be added to ComponentViewModels.cs until implementation. The tab group state is managed by the consuming page ViewModel (e.g. NotificationsViewModel.ActiveTab).
| Screen | Node | Tabs | Behavior |
|---|---|---|---|
| Notifications | 5048:13576 | Comms / Flight Finder | Switches filtered notification feed — same card component, different data source. Designer annotation: one screen, two filtered feeds — not two screens. |
| Flight Finder results (4713:25117) | 4713:25124 | Nonstop / One Stop / Multileg | 3-option filter on flight search results. Confirmed labels from Figma. Gap between pills: 33px in this instance. |
Distinct from interior-tab-nav (underline + font switch, no fill, scrollable) — that is a different component for named sub-screen navigation. The segmented pill control is a compact in-place filter, always fully visible.
tab group container is a separate element from the individual pills — it provides the white rounded pill backdrop and distributes pills via justify-content:space-between. Do not apply a border to the outer container; the background provides the visual separation.interior-tab-nav component (underline + font switch on active, no fill) — that is a different component. button pill uses background fill. Do not conflate.Target home: ALPAMobile.HybridUi. Two components: ButtonPill.razor (individual pill) and TabGroup.razor (outer container managing the tab collection).
| Parameter | Component | Type | Required | Description |
|---|---|---|---|---|
Label | ButtonPill | string | Yes | Tab label. CSS applies uppercase. |
IsActive | ButtonPill | bool | Yes | When true, applies alpa-btn-pill--active modifier (blue fill, white text). |
OnClick | ButtonPill | EventCallback | Yes | Fires on tap. Consumer updates active tab state in page ViewModel. |
Tabs | TabGroup | IReadOnlyList<ButtonPillViewModel> | Yes | Ordered list of tab definitions. Renders as one ButtonPill per entry. |
OnTabSelected | TabGroup | EventCallback<int> | Yes | Index of selected tab. Consumer updates page state and re-filters content. |
@* Notifications page — two-tab group *@
<AlpaTabGroup Tabs="@Vm.Tabs"
OnTabSelected="@Vm.SelectTab" />
@* Or using individual pills within a custom layout *@
<div class="alpa-tab-group">
<AlpaButtonPill Label="Comms"
IsActive="@(Vm.ActiveTab == 0)"
OnClick="@(() => Vm.SelectTab(0))" />
<AlpaButtonPill Label="Flight Finder"
IsActive="@(Vm.ActiveTab == 1)"
OnClick="@(() => Vm.SelectTab(1))" />
</div>
Classes will live in ALPAMobile.HybridUi/wwwroot/css/alpa-components.css under the alpa-tab-group and alpa-btn-pill BEM blocks.
| Class | Scope | Key rules |
|---|---|---|
.alpa-tab-group | Outer container | background:var(--interactive-fields, white); border-radius:32px; display:flex; width:345px |
.alpa-tab-group__slot | Inner layout row | display:flex; align-items:center; justify-content:space-between; width:100% |
.alpa-btn-pill | Individual pill | flex:1; display:flex; align-items:center; justify-content:center; padding:8px 16px; border-radius:24px; border:none; cursor:pointer; background:var(--surface-default, white); font-family:var(--font-family/body); font-weight:500; font-size:15px; color:var(--text-primary); text-transform:uppercase; letter-spacing:0.6px; line-height:1; white-space:nowrap |
.alpa-btn-pill--active | Active pill modifier | background:var(--interactive-blue-lt); color:var(--text-on-brand, white) |