Navigation
Tabs
Underline tabs to switch between views of the same context. The underline slides to the active tab.
Goals, owners and dates.
Installation
Install the package (React 19):
terminal
terminal
terminal
Import the styles once, in your app entry or root layout:
/src/main.tsx
Use it anywhere inside your app's <Theme> (see Installation):
/src/TabsExample.tsx
Examples
Uncontrolled
Goals, owners and dates.
Controlled, inset underline
Selected: emoji
Composition
anatomy.tsx
API Reference
Tabs.Root
| Prop | Type | Default |
|---|---|---|
value | string | |
defaultValue | string | |
onValueChange | (value: string) => void | |
activationMode | "automatic""manual" | "automatic" |
orientation | "horizontal""vertical" | "horizontal" |
Tabs.List
The 40px bar with the sliding indicator.
| Prop | Type | Default |
|---|---|---|
loop | boolean | true |
Tabs.Trigger
| Prop | Type | Default |
|---|---|---|
value | string | |
disabled | boolean | false |
tone | "tertiary""secondary" | "tertiary" |
weight | "medium""regular" | "medium" |
underline | "full""inset" | "full" |
Tabs.Content
| Prop | Type | Default |
|---|---|---|
value | string | |
forceMount | true |
Accessibility
- Follows the WAI-ARIA tabs pattern:
tablist,tab(aria-selected,aria-controls) andtabpanel(aria-labelledby). - Tab moves focus to the active tab, then into the panel. ←/→ move to the previous/next tab and activate it (automatic activation), wrapping at the ends; Home/End jump to the first/last tab. Disabled tabs are skipped.
- Give the list an
aria-labelwhen there is no visible heading for it. - Lists wider than the screen scroll horizontally; the indicator slides with a transform transition (none with reduced motion).
Usage
- Use to switch between views of the same object (Overview / Activity / Settings).
- Don't use tabs for navigation between pages (use links or Sidebar) or for a compact option toggle (use SegmentedControl).
- Keep labels short, one or two words; avoid more than about six tabs.
© 2026 Motion. Internal documentation.