# Tabs
Layered panels, one shown at a time, chosen from a list of tabs.
```ehtml Example
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@elements/ui/tabs";
Account
Password
Make changes to your account here.
Change your password here.
```
## Parts
| Part | What it is |
|---|---|
| `Tabs` | The root. Owns value, the active tab. |
| `TabsList` | The tablist: one tab stop, arrows between its triggers. |
| `TabsTrigger` | A tab button. Activates the panel with the same value. |
| `TabsContent` | A panel. Shown while its value is active, hidden otherwise. |
## Attributes
### Tabs
| Attribute | Type | Default | Description |
|---|---|---|---|
| `value` | `string \| null` (two-way) | `""` | The active tab. Empty selects the first enabled tab, already in the server HTML. null starts with no tab active and no panel. |
| `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | Lays the list out in a row or a column and picks the arrow keys. |
| `activation` | `"automatic" \| "manual"` | `"automatic"` | automatic activates a tab when it gets focus; manual waits for Enter or Space. |
| `dir` | `"" \| "ltr" \| "rtl"` | `""` | Reading direction. Empty inherits. Flips Left and Right. |
| `loop` | `boolean` | `true` | Arrow keys wrap from the last tab to the first. |
| `variant` | `"line" \| "segmented"` | `"line"` | line underlines the active tab; segmented raises it on a muted track. |
| `onValueChange` | `(value: string, details: DisclosureDetails) => void` | `() => {}` | Called when the user activates a tab, before the switch, with details second (reason, event, trigger, cancel(), isCanceled; reason none). details.cancel() keeps the current tab, for an unsaved-changes guard. Not called for changes the caller makes. |
| `onTabDelete` | `(value: string) => void` | `undefined` | When set, Delete on a focused tab calls it so the caller can remove the tab; focus moves to the next tab. |
| `class` | `string` | `""` | Extra classes on the root. |
### TabsList
| Attribute | Type | Default | Description |
|---|---|---|---|
| `label` | `string` | `""` | aria-label for the tablist. |
| `attrs` | `Record` | `{}` | Other attributes for the tablist, such as aria-labelledby for a visible label. TabsContent takes attrs too. |
| `class` | `string` | `""` | Extra classes on the list. |
### TabsTrigger
| Attribute | Type | Default | Description |
|---|---|---|---|
| `value` | `string` | (required) | Pairs the tab with its panel. |
| `href` | `string` | `""` | Renders the tab as a link (a[role=tab]): same tab stop and arrows; following it navigates. |
| `disabled` | `boolean` | `false` | Cannot be activated; arrows skip it. |
| `attrs` | `Record` | `{}` | Other attributes for the button: id, title, data-\*. |
| `class` | `string` | `""` | Extra classes on the tab. |
### TabsContent
| Attribute | Type | Default | Description |
|---|---|---|---|
| `value` | `string` | (required) | Pairs the panel with its tab. |
| `class` | `string` | `""` | Extra classes on the panel. |
## Slots
| Slot | Part | Content |
|---|---|---|
| `default` | `Tabs` | A TabsList and TabsContents. |
| `default` | `TabsList` | TabsTriggers. |
| `default` | `TabsTrigger` | The label: text, an ``, or both. |
| `default` | `TabsContent` | The panel. |
## Keyboard
| Keys | Action |
|---|---|
| `Tab` | Into the list, focuses the active tab; from a tab, moves to its panel. |
| `ArrowRight / ArrowLeft` | Next or previous tab (horizontal, flipped right to left); activates it in automatic mode. |
| `ArrowDown / ArrowUp` | Next or previous tab (vertical). |
| `Home / End` | First or last tab. |
| `Enter / Space` | Activates the focused tab (manual mode). |
| `Delete` | Closes the focused tab when the root has onTabDelete. |
## Data attributes
| Attribute | Values | On |
|---|---|---|
| `data-orientation` | `"horizontal" \| "vertical"` | root, list, tab, panel |
| `data-state` | `"active" \| "inactive"` | tab, panel |
| `data-active` | present on the active tab | tab |
| `data-index` | the panel's position, from 0 | panel |
| `data-hidden` | present while the panel is inactive | panel |
| `data-disabled` | present when disabled | tab |
## Accessibility
- Follows the WAI-ARIA tabs pattern: role="tablist" with aria-orientation, role="tab" with aria-selected and aria-controls, role="tabpanel" with aria-labelledby.
- Roving tabindex: the list is one tab stop, on the active tab. Panels are focusable so their text is reachable.
- Inactive panels are hidden and stay mounted, so fields in other tabs keep their values.
- The server renders the active tab and panel, so nothing moves when the page attaches.
## See also
- [Accordion](accordion): A stack of headings that each show and hide a panel, one or several at a time.
- [Collapsible](collapsible): A trigger that shows and hides a region, with its height animated.
- [Breadcrumb](breadcrumb): The path to the current page as a trail of links, composed from parts or built from a list.
- [Pagination](pagination): Page numbers with previous and next, from a page count or composed from parts.
- [Tree](tree): A hierarchical list that opens with the arrow keys, selects one node or many, and loads children on demand.