# Rokkit Tabs Component
> Data-driven tabbed interface with horizontal/vertical layout, editable tabs, and keyboard navigation.
The Tabs component renders a list of tab triggers above (or beside) associated content panels. Supports orientation variants, alignment, editable tabs (add/remove), and custom rendering via snippets.
## Quick Start
```svelte
```
## Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `options` | `TabsItem[]` | `[]` | Tab data array |
| `fields` | `TabsFields` | defaults | Field mapping |
| `value` | `unknown` | — | Selected tab value — use `bind:value` |
| `orientation` | `'horizontal'|'vertical'` | `'horizontal'` | Tab list direction |
| `position` | `'before'|'after'` | `'before'` | Tab list placement (top/left vs bottom/right) |
| `align` | `'start'|'center'|'end'` | `'start'` | Alignment of tabs within the list |
| `name` | `string` | `'tabs'` | Accessible label for the tablist |
| `editable` | `boolean` | `false` | Show add/remove buttons |
| `placeholder` | `string` | — | Text shown when no tab is selected |
| `disabled` | `boolean` | `false` | Disable all tabs |
| `class` | `string` | `''` | Additional CSS classes |
## Field Mapping
| Field | Default | Description |
|-------|---------|-------------|
| `value` | `'value'` | Tab selection value |
| `text` | `'text'` | Tab trigger label |
| `icon` | `'icon'` | Icon class name |
| `label` | `'label'` | Aria-label override |
| `content` | `'content'` | Panel content (for default renderer) |
| `disabled` | `'disabled'` | Disabled state |
## Layout Variants
### Vertical Tabs
```svelte
```
### Bottom Tabs
```svelte
```
### Centered Tabs
```svelte
```
## Editable Tabs
Add and remove tabs dynamically:
```svelte
```
## Callbacks
| Callback | Signature | Description |
|----------|-----------|-------------|
| `onchange` | `(value, item) => void` | Selection changed |
| `onselect` | `(value, item) => void` | Tab clicked (fires even on same tab) |
| `onadd` | `() => void` | Add button clicked (editable mode) |
| `onremove` | `(value) => void` | Remove button clicked (editable mode) |
## Snippets
### Custom Tab Trigger
```svelte
{#snippet tabItem(data, fields, handlers, selected)}
{/snippet}
```
### Custom Panel Content
```svelte
{#snippet tabPanel(data, fields)}
{data.text}
{@html data.content}
{/snippet}
```
### Empty State
```svelte
{#snippet empty()}
No tabs available
{/snippet}
```
## Keyboard Navigation
### Horizontal Tabs
| Key | Action |
|-----|--------|
| `ArrowLeft` | Previous tab |
| `ArrowRight` | Next tab |
| `Home/End` | First/last tab |
| `Enter/Space` | Select focused tab |
### Vertical Tabs
| Key | Action |
|-----|--------|
| `ArrowUp` | Previous tab |
| `ArrowDown` | Next tab |
| `Home/End` | First/last tab |
## Accessibility
- `role="tablist"` on tab list
- `role="tab"` on each tab trigger
- `role="tabpanel"` on each panel
- `aria-selected` on selected tab
- `aria-orientation` reflects orientation
- `aria-controls` links tab to panel
## Data Attributes
| Attribute | Description |
|-----------|-------------|
| `data-tabs` | Root element |
| `data-tabs-list` | Tab trigger list |
| `data-tabs-trigger` | Individual tab button |
| `data-tabs-panel` | Content panel |
| `data-tabs-content` | Inner panel content |
| `data-orientation` | horizontal/vertical |
| `data-position` | before/after |
| `data-selected` | Selected tab/panel |
| `data-panel-active` | Visible panel |
## Import
```javascript
import { Tabs } from '@rokkit/ui'
```
## TypeScript Types
```typescript
interface TabsProps {
options?: TabsItem[]
fields?: TabsFields
value?: unknown
orientation?: 'horizontal' | 'vertical'
position?: 'before' | 'after'
align?: 'start' | 'center' | 'end'
name?: string
editable?: boolean
placeholder?: string
disabled?: boolean
class?: string
onchange?: (value: unknown, item: TabsItem) => void
onselect?: (value: unknown, item: TabsItem) => void
onadd?: () => void
onremove?: (value: unknown) => void
tabItem?: Snippet<[TabsItem, TabsFields, TabsItemHandlers, boolean]>
tabPanel?: Snippet<[TabsItem, TabsFields]>
empty?: Snippet<[]>
}
interface TabsFields extends Record {
content?: string // default: 'content'
}
```
## Related Components
- [Toggle](/llms/components/toggle.txt) — compact option switcher
- [List](/llms/components/list.txt) — vertical navigable list
- [Toolbar](/llms/components/toolbar.txt) — horizontal action bar