Tabs
Switch between peer panels while coordinating focus and activation.
Usage
Manual
Move focus between tabs without activating a panel until selection is confirmed.
Panels stay mounted. Arrow keys either activate immediately or wait for Enter and Space.
Release health and deployment summary.
Recent changes across adapters.
Visibility and notification preferences.
<!-- Tabs / Manual -->
<script setup lang="ts">
import { TabsContent, TabsIndicator, TabsList, TabsRoot, TabsTrigger } from '@sectile/vue/tabs'
const tabs = ['overview', 'activity', 'settings']
</script>
<template><TabsRoot :items="tabs" default-value="overview"><TabsList><TabsTrigger v-for="tab in tabs" :key="tab" :value="tab">{{ tab }}</TabsTrigger><TabsIndicator /></TabsList><TabsContent v-for="tab in tabs" :key="tab" :value="tab">{{ tab }}</TabsContent></TabsRoot></template>Automatic
Advance automatically while still exposing pause and direct navigation controls.
Panels stay mounted. Arrow keys either activate immediately or wait for Enter and Space.
Release health and deployment summary.
Recent changes across adapters.
Visibility and notification preferences.
<!-- Tabs / Automatic -->
<script setup lang="ts">
import { TabsContent, TabsIndicator, TabsList, TabsRoot, TabsTrigger } from '@sectile/vue/tabs'
const tabs = ['overview', 'activity', 'settings']
</script>
<template><TabsRoot :items="tabs" default-value="overview"><TabsList><TabsTrigger v-for="tab in tabs" :key="tab" :value="tab">{{ tab }}</TabsTrigger><TabsIndicator /></TabsList><TabsContent v-for="tab in tabs" :key="tab" :value="tab">{{ tab }}</TabsContent></TabsRoot></template>Vertical disabled
Move vertically through actions while skipping an unavailable item.
Panels stay mounted. Arrow keys either activate immediately or wait for Enter and Space.
Release health and deployment summary.
Recent changes across adapters.
Visibility and notification preferences.
<!-- Tabs / Vertical Disabled -->
<script setup lang="ts">
import { TabsContent, TabsIndicator, TabsList, TabsRoot, TabsTrigger } from '@sectile/vue/tabs'
const tabs = ['overview', 'activity', 'settings']
</script>
<template><TabsRoot :items="tabs" default-value="overview"><TabsList><TabsTrigger v-for="tab in tabs" :key="tab" :value="tab">{{ tab }}</TabsTrigger><TabsIndicator /></TabsList><TabsContent v-for="tab in tabs" :key="tab" :value="tab">{{ tab }}</TabsContent></TabsRoot></template>API
Vue package: @sectile/vue/tabs
TabsRootTabsListTabsTriggerTabsContentTabsIndicator
Props
TabsRootProps
activationModeWhether focus activates a tab automatically or waits for explicit confirmation.
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
defaultValueInitial value used when the component owns its state.
disabledWhether interaction is unavailable.
disabledItemsItem values excluded from focus and selection.
itemsOrdered item values managed by the component.
modelValueCurrent value when state is controlled by the parent.
orientationAxis used for layout and keyboard movement.
readonlyWhether the value can be inspected but not changed.
TabsListProps
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
labelAccessible name announced for the control.
TabsTriggerProps
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
disabledWhether interaction is unavailable.
valueCurrent value exposed by this contract.
TabsContentProps
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
valueCurrent value exposed by this contract.
TabsIndicatorProps
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
Slots
TabsRootSlotProps
disabledWhether interaction is unavailable.
highlightedValueValue currently highlighted for interaction.
readonlyWhether the value can be inspected but not changed.
valueCurrent value exposed by this contract.
TabsTriggerSlotProps
disabledWhether interaction is unavailable.
highlightedWhether this item is highlighted for interaction.
selectedWhether this item is selected.
valueCurrent value exposed by this contract.
TabsContentSlotProps
selectedWhether this item is selected.
valueCurrent value exposed by this contract.
Events
TabsRoot
activateEmitted when an item becomes active.
highlightEmitted when the highlighted item changes.
update:modelValueEmitted when the component requests a new controlled value.
Other types
TabsActivationMode
type TabsActivationMode = 'automatic' | 'manual'TabsValueChangeHandler
type TabsValueChangeHandler = (value: string) => voidTabsHighlightHandler
type TabsHighlightHandler = (value: string | null) => voidTabsActivateHandler
type TabsActivateHandler = (value: string) => voidParts
Shared scope: [data-scope="tabs"]. Combine it with a part selector to keep styles local to this component.
| Part | Selector | Role | Extra attributes |
|---|---|---|---|
root | [data-part="root"] | Defines the component boundary and owns its composed parts. | — |
list | [data-part="list"] | Groups the component items in navigation order. | — |
trigger | [data-part="trigger"] | Opens, closes, or activates the associated content. | — |
indicator | [data-part="indicator"] | Shows state or position without replacing the primary content. | — |
content | [data-part="content"] | Contains the component content shown for the active state. | — |
Keyboard interaction
| Key | Behavior |
|---|---|
| Arrow Left / Arrow Right | Move between tabs in a horizontal list. |
| Arrow Up / Arrow Down | Move between tabs in a vertical list. |
| Home / End | Move to the first or last tab. |
| Enter / Space | Activate the focused tab in manual activation mode. |
Accessibility
The tab list connects every tab to one tab panel and preserves selected, disabled, and orientation state.
See the corresponding WAI-ARIA pattern for the host accessibility contract.
