# 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