Tabs

Peer views in one place; one visible, all reachable.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Click a view — the panel follows
The overview panel. Peer views share one region — only this panel is mounted, the others stay one click away.
Configuration
Variant
Size
Active
<Tabs variant="line">…</Tabs>
Behavior — The Engineering Contract
Prop / eventTypeNotes
variantline · pill · enclosedIndicator style; line is the default
sizeS · M · LTab scale; M is the default
value / onChangestring / (v) => voidThe active tab; controlled or default
countnumberOptional pill riding in a tab
disabled (tab)booleanUnreachable, skipped by the arrow keys
← / → · Home / EndRoving focus between tabs; Home/End jump to the ends

Tabs switch peer views inside one page. To move between pages of a list use Pagination; for top-level wayfinding use the nav.

Anatomy
OverviewActivity3Settings
1Active tabBrightest label; only one active at a time.
2CountOptional pill for unread or pending items.
3Indicator2px warm underline that slides to the active tab.
Do's and Don'ts
✓ Do
DetailsReviewsRelated

Two to five short, parallel labels. One noun each; they scan as a set.

✕ Don't
HomeDocsPricingLog out

Don't route the whole app through tabs. Navigation and sign-out aren't peer views.

✓ Do
DayWeekMonth

Use the pill variant for a short, toggle-like set of mutually exclusive modes.

✕ Don't
ConfigurationIntegrationsPerms…

Don't overflow tabs off the edge. Too many peers wants a nav or a menu.

In context: Examples
A · Panel header
OverviewActivity3

Line tabs sit at the top of a card, the panel content directly below.

B · Segmented control
ListBoardTimeline

Pill tabs act as a compact view switcher in a toolbar.

C · Enclosed
PreviewCode

Folder tabs read as a container the active tab belongs to.

Measurements & Tokens
TokenValueRole
--tab-gap24pxSpace between line tabs
--tab-indicator2px · #FF7A00Sliding active underline
--tab-idle#9AA0A8Inactive label
--tab-active#F4F5F6Active label
--tab-tray#101114Pill variant background
--tab-active-fill#1F1F25Pill / enclosed active fill
Code
<div class="o-tabs o-tabs--line" role="tablist">
  <button role="tab" aria-selected="true" class="o-tab is-active">Overview</button>
  <button role="tab" aria-selected="false" class="o-tab">
    Activity <span class="o-tab__count">3</span>
  </button>
  <button role="tab" aria-selected="false" class="o-tab">Settings</button>
</div>
<div role="tabpanel">…</div>