Components / Tabs
A small Green marker, never a filled pill.
Tabs v1 — packages/design-system/src/components/tabs.css. The
WAI-ARIA Tabs pattern throughout — styled entirely from
[aria-selected="true"], never an .is-active class.
List
.iz-tabs with role="tablist" and an aria-label.Tab
.iz-tab, a real <button>, role="tab", aria-selected, aria-controls.Panel
.iz-tab-panel, role="tabpanel", aria-labelledby pointing back at its tab.Variant
data-variant="stretched" — tabs fill the row equally. Default is content-width.Content switching
Try it — click, or use arrow keys.
Click a tab, or focus the tablist and use Left/Right (or Up/Down), Home and End. Only the selected tab is in the Tab-key sequence — the rest are reached with arrow keys, per the roving-tabindex pattern.
Plan: Scale · MRR: $1,240 · 18 seats.
3 deploys, 1 webhook failure, in the last 24 hours.
Billing, seats and integrations live here.
data-variant="stretched" — equal-width, no panels wired (static example)
Dark theme
Semantic tokens only.
Accessibility
Follows the WAI-ARIA Tabs pattern exactly.
Roles
role="tablist" on the container, role="tab" on each trigger, role="tabpanel" on each panel — all native ARIA, no custom widget semantics invented.Selection state
aria-selected is the only source of truth; the underline and text-color styling both key off it.Keyboard
Arrow keys move focus between tabs (Left/Right or Up/Down depending on orientation), Home/End jump to the first/last tab, and only the selected tab sits in the page's Tab order (roving
tabindex) — implemented in the page's demo JS, not the canonical CSS.Panel association
Each tab's
aria-controls points at its panel's id; each panel's aria-labelledby points back at its tab.Reduced motion
The underline's reveal transition drops out entirely under
prefers-reduced-motion: reduce — selection still reads instantly from text color and aria-selected.