Skip to main content
Vuetify0 is now in alpha!
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

Tabs

A component for creating accessible tabbed interfaces with proper ARIA support and keyboard navigation.


Renders elementIntermediateApr 5, 2026

Usage

The Tabs component provides a compound pattern for building accessible tab interfaces. It uses the createStep composable internally for navigation and provides full v-model support with automatic state synchronization.

Tab Navigation

Profile, password, and billing tabs with content switching via v-model binding.

Profile

Content for the profile tab.

Anatomy

vue
<script setup lang="ts">
  import { Tabs } from '@vuetify/v0'
</script>

<template>
  <Tabs.Root>
    <Tabs.List>
      <Tabs.Item>Tab</Tabs.Item>
    </Tabs.List>

    <Tabs.Panel>Content</Tabs.Panel>
  </Tabs.Root>
</template>

Features

Keyboard Navigation

The component implements full WAI-ARIA keyboard support. Keyboard behavior depends on the activation mode:

KeyAutomaticManual
Arrow Left/Right (horizontal)Moves focus and activates tabMoves focus only
Arrow Up/Down (vertical)Moves focus and activates tabMoves focus only
HomeFocuses and activates first tabFocuses first tab only
EndFocuses and activates last tabFocuses last tab only
Enter/SpaceActivates the focused tab

Activation Modes

Control when tabs activate with the activation prop:

  • automatic (default): Arrow keys move focus and activate the tab simultaneously

  • manual: Arrow keys move focus without activating — the user must press Enter or Space to confirm their selection

vue
<template>
  <Tabs.Root activation="manual">
    <!-- Tabs only activate on Enter/Space -->
  </Tabs.Root>
</template>

Orientation

Support for both horizontal and vertical tab layouts:

vue
<template>
  <Tabs.Root orientation="vertical">
    <!-- Arrow Up/Down for navigation instead of Left/Right -->
  </Tabs.Root>
</template>

Circular Navigation

Control whether navigation wraps around at boundaries:

vue
<template>
  <Tabs.Root :circular="false">
    <!-- Navigation stops at first/last tab -->
  </Tabs.Root>
</template>

Auto-Enrollment

Set enroll to auto-select the first registered tab. Useful when tabs are rendered dynamically and the initial selection should track whichever tab mounts first:

vue
<template>
  <Tabs.Root enroll>
    <!-- First tab to register is automatically selected -->
    <Tabs.Tab v-for="tab in dynamicTabs" :key="tab.id" :value="tab.id">
      {{ tab.label }}
    </Tabs.Tab>
  </Tabs.Root>
</template>

API Reference

The following API details are for all variations of the Tabs component.

Tabs.Root

Props

namespace

string | undefined

Namespace for dependency injection (must match child namespace)

Default: "v0:tabs"

disabled

boolean | undefined

Disables the entire tabs instance

Default: false

enroll

boolean | undefined

Auto-select non-disabled items on registration

Default: false

mandatory

boolean | "force" | undefined

Controls mandatory tab behavior: - false: No mandatory tab enforcement - true: Prevents deselecting the last selected item - `force` (default): Automatically selects the first non-disabled tab

Default: "force"

circular

boolean | undefined

Whether arrow key navigation wraps around

Default: true

orientation

TabsOrientation | undefined

Tab orientation for keyboard navigation

Default: "horizontal"

activation

any

Activation mode: - `automatic`: Tab activates on focus (arrow keys) - `manual`: Tab activates on Enter/Space only

Default: "automatic"

modelValue

T | T[] | undefined

Events

update:model-value

[value: T | T[]]

Slots

default

TabsRootSlotProps

Tabs.Item

Props

id

any

Unique identifier (auto-generated if not provided)

value

V | undefined

Value associated with this tab (used to match with TabsPanel)

disabled

MaybeRefOrGetter<boolean> | undefined

Disables this specific tab

namespace

string | undefined

Namespace for dependency injection

Default: "v0:tabs"

ariaLabel

string | undefined

Accessible label for this tab

ariaLabelledby

string | undefined

ID of element that labels this tab

ariaDescribedby

string | undefined

ID of element that describes this tab

Slots

default

TabsItemSlotProps

Tabs.List

Props

label

string | undefined

Accessible label for the tablist

namespace

string | undefined

Namespace for dependency injection

Default: "v0:tabs"

Slots

default

TabsListSlotProps

Tabs.Panel

Props

value required

V

Value to match with corresponding TabsItem

namespace

string | undefined

Namespace for dependency injection

Default: "v0:tabs"

Slots

default

TabsPanelSlotProps
Was this page helpful?

© 2016-1970 Vuetify, LLC
Ctrl+/