C-14 · Components · Navigation
All elements · Tabs on the Components page
Last checked 2026-10-22 · Awaiting approval · Accessibility tests
Approve Tabs
Approving as
| Axis | Values |
|---|---|
data-variant |
underline (default) · pill · segmented · vertical |
.qf-tabs__tab[aria-selected] · [aria-disabled] · __badge
|
state and count |
The stepper is no longer a Tabs variant: a fixed, ordered process is shown with
StepIndicator (C-47), which marks the
current step with aria-current="step" and says in text which steps are complete.
Tabs: icon
C-14 OfficeIcon-only tabs with tooltips for the Format panes (Fill & Line, Effects, Size & Properties, Picture).
| Axis / element | Values |
|---|---|
data-variant="icon" |
on .qf-tabs |
Guidance
When to use
- Split one record or object into peer views, such as Properties, Documents and History, where only one view shows at a time.
-
Filter one collection into named slices, such as All, Mine and Overdue, with the pill variant and a
__badgecount. - Switch the time scale or mode of a single view with the segmented variant.
-
Put a settings area's sections down the side with the vertical variant, or icon-only pane sections
with
data-variant="icon"in the editors.
When to consider something else
- When users need to compare the sections or read several at once, use Accordion or a plain page instead of hiding them behind tabs. See Accordion.
-
When the choice toggles a setting or pressed state rather than swapping a panel, use a segmented
Button group with
aria-pressed. See ButtonGroup. - When there are more sections than fit on one row, or they nest, use Tree or the shell navigation. See Tree.
- When the slices are saved searches or filters the user can add and remove, use Chips. See Chip.
- When the views are steps of a process the user must complete in order, use Step indicator above each step's page; Tabs no longer has a stepper variant. See StepIndicator.
Usability
- Keep tab labels short, one or two words, and in a stable order.
-
Use
__badgeonly for a count the user acts on, such as unread or pending items. -
Give every icon-only tab an
aria-labeland a Tooltip ortitlewith the same text. - Keep the selected tab when the user returns to the record, so they do not lose their place.
- Don't nest tabs inside tabs.
- Don't use tabs as navigation to other pages; links that change the URL belong in the shell navigation.
-
Don't hide a tab the user can't use; mark it
aria-disabled="true"so its place stays stable.
Accessibility
Keyboard
| Keys | Action |
|---|---|
| Tab | Moves focus into the tab list to the selected tab, then on into the visible panel. |
| Arrow Right / Arrow Left | Moves to the next or previous enabled tab and selects it, wrapping at the ends (automatic activation). |
| Arrow Down / Arrow Up |
Required for the vertical variant: the binding must move between tabs with these keys and set
aria-orientation="vertical".
|
| Home / End | Moves to and selects the first or last enabled tab. |
Roles and names
-
.qf-tabs__listhasrole="tablist"; each.qf-tabs__tabis abuttonwithrole="tab"andaria-selected. -
Each tab points to its panel with
aria-controls; each.qf-tabs__panelhasrole="tabpanel"and must havearia-labelledbynaming its tab (the icon specimen does; the binding must always add it). -
Give the tab list an
aria-labelwhen there is no visible heading for it, as the Format shape icon tabs do. -
A disabled tab uses
aria-disabled="true", is skipped by the arrow keys and ignores clicks.
Focus
-
Only the selected tab is in the Tab order (roving
tabindex0 and -1); the arrow keys move focus within the list. - Focus shows the shared focus ring on the tab (
:focus-visible). -
Switching tabs does not move focus into the panel; if a panel has no focusable content, give it
tabindex="0"so keyboard users can reach and scroll it.
Other requirements
- The selected tab is marked by an underline, fill or position, not color alone (1.4.1); its indicator needs 3:1 against the background (1.4.11).
- Tabs are 2.5rem high and segmented items use the small control height, so targets meet 2.5.8.
- Panels that load slowly should show a Progress or Skeleton and announce errors, not leave an empty panel.
- At 320px width (1.4.10) a long tab row must scroll or collapse into Overflow, not clip labels.
Test your implementation too. This guidance covers the element as specified here. How a screen composes it (labels, order, announcements) still needs its own keyboard and screen reader check.
Accessibility tests
Passed the gate (run 358b316 on 2026-10-22): no finding in any theme. Awaiting a person’s approval of the checklist below.
| Area | Automated | A person checks |
|---|---|---|
| General | Passed | Color is never the only cue, text alternatives say the same thing as the graphic, and the element reads the same in the light and the dark theme. |
| Zoom | Passed | At 200% zoom, at 320 CSS pixels wide and with the WCAG text-spacing overrides, nothing is lost, clipped or overlapping. |
| Keyboard | Passed | Every row of the Keyboard table works, focus is always visible and never trapped, and the tab order follows the reading order. (4 rows) |
| Screen reader | Passed | With NVDA or JAWS on Windows and VoiceOver on macOS, names, roles and states are announced as Roles and names says, and changes are announced once. (4 items) |
Approving. When the checklist passes on the checked run, record it with
bun run a11y:approve -- tabs --by "Your name" and commit
a11y/approvals.json with the rebuilt pages.
All test status
Package
Consumers link one stylesheet, css/classic/index.css, which includes every element. The
files below are where this element is defined.
Latest updates
| Date | Version | Breaking | Description |
|---|---|---|---|
| 2026-10-20 | 0.1 | Yes |
Tabs: the stepper variant (.qf-stepper, __step[data-state],
__dot) is gone; StepIndicator (C-47) is the system's one stepper. Replace
.qf-stepper with .qf-step-indicator:
data-state="active" becomes aria-current="step", pending steps carry
no state, and each label states completion in text
|
| 2026-10-02 | 0.1 | No | Extend Tooltip, Menu, Select, Tabs and Toolbar for office surfaces |