Tabs

Tabs is a navigation component that switches between related content panels. Three variants and four sizes adapt to a wide range of layouts.

3
Variants
4
Sizes
2
Orientation
Radix
Base

Playground

Preview
D

Account settings content

Variant
Size
Color
Options
<Tabs defaultValue="account">
  <Tabs.List>
    <Tabs.Trigger value="account">Account</Tabs.Trigger>
    <Tabs.Trigger value="settings">Settings</Tabs.Trigger>
    <Tabs.Trigger value="notifications">Notifications</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Content value="account">
    <p className="text-sm text-text-muted">Account settings content</p>
  </Tabs.Content>
  <Tabs.Content value="settings">
    <p className="text-sm text-text-muted">General settings content</p>
  </Tabs.Content>
  <Tabs.Content value="notifications">
    <p className="text-sm text-text-muted">Notification preferences</p>
  </Tabs.Content>
</Tabs>

Variants

line

Content for tab 1

<Tabs defaultValue="tab1">
  <Tabs.List variant="line">
    <Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
    <Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
    <Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Content value="tab1">
    <p className="text-sm text-text-muted">Content for tab 1</p>
  </Tabs.Content>
  <Tabs.Content value="tab2">
    <p className="text-sm text-text-muted">Content for tab 2</p>
  </Tabs.Content>
  <Tabs.Content value="tab3">
    <p className="text-sm text-text-muted">Content for tab 3</p>
  </Tabs.Content>
</Tabs>

enclosed

Content for tab 1

<Tabs defaultValue="tab1">
  <Tabs.List variant="enclosed">
    <Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
    <Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
    <Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Content value="tab1">
    <p className="text-sm text-text-muted">Content for tab 1</p>
  </Tabs.Content>
  <Tabs.Content value="tab2">
    <p className="text-sm text-text-muted">Content for tab 2</p>
  </Tabs.Content>
  <Tabs.Content value="tab3">
    <p className="text-sm text-text-muted">Content for tab 3</p>
  </Tabs.Content>
</Tabs>

pill

Content for tab 1

<Tabs defaultValue="tab1">
  <Tabs.List variant="pill">
    <Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
    <Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
    <Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Content value="tab1">
    <p className="text-sm text-text-muted">Content for tab 1</p>
  </Tabs.Content>
  <Tabs.Content value="tab2">
    <p className="text-sm text-text-muted">Content for tab 2</p>
  </Tabs.Content>
  <Tabs.Content value="tab3">
    <p className="text-sm text-text-muted">Content for tab 3</p>
  </Tabs.Content>
</Tabs>

Sizes

sm
Height32px
Font13px
Padding X12px
md
Height36px
Font13px
Padding X14px
default
Height40px
Font14px
Padding X16px
lg
Height48px
Font16px
Padding X24px

Features

Fitted

Account content

<Tabs defaultValue="tab1">
  <Tabs.List fitted>
    <Tabs.Trigger value="tab1">Account</Tabs.Trigger>
    <Tabs.Trigger value="tab2">Settings</Tabs.Trigger>
    <Tabs.Trigger value="tab3">Notifications</Tabs.Trigger>
  </Tabs.List>
</Tabs>

With Icons

Account settings

<Tabs defaultValue="account">
  <Tabs.List>
    <Tabs.Trigger value="account"><User /> Account</Tabs.Trigger>
    <Tabs.Trigger value="settings"><Settings /> Settings</Tabs.Trigger>
    <Tabs.Trigger value="notifications"><Bell /> Notifications</Tabs.Trigger>
  </Tabs.List>
</Tabs>

Disabled

Active tab content

<Tabs defaultValue="tab1">
  <Tabs.List>
    <Tabs.Trigger value="tab1">Active</Tabs.Trigger>
    <Tabs.Trigger value="tab2" disabled>Disabled</Tabs.Trigger>
    <Tabs.Trigger value="tab3">Active</Tabs.Trigger>
  </Tabs.List>
</Tabs>

API

Component Structure

Tabs— Radix Tabs
.ListProps.TriggerProps.ContentProps

Props

Tabs (Root)

defaultValueundefined
string

Default selected tab value (uncontrolled)

valueundefined
string

Selected tab value (controlled)

onValueChangeundefined
(value: string) => void

Callback fired on tab change

orientation"horizontal"
"horizontal" | "vertical"

Orientation of the tab list

activationMode"automatic"
"automatic" | "manual"

Tab activation mode — automatic switches on focus, manual requires Enter/Space

Tabs.List

variant"line"
"line" | "enclosed" | "pill"

Visual style of the tab list

size"default"
"sm" | "md" | "default" | "lg"

Size of the tab triggers

color"default"
"default" | "primary"

Active indicator color (line variant only)

radius"md"
"none" | "sm" | "base" | "md" | "lg" | "xl" | "2xl" | "3xl" | "full"

Border radius — enclosed: top corners none–xl, pill: container 9 steps

fittedfalse
boolean

Distribute tabs evenly across the full width

Tabs.Trigger

value
string

Unique identifier for the tab (required)

disabledfalse
boolean

Disable the tab

Tabs.Content

value
string

Matching tab value (required)

forceMountundefined
boolean

Keep in DOM when inactive — for animations

Anatomy

1
2
3
Overview
4
Settings
History
5
Trigger height40px
Padding X16px
Content gapmt-4
1
Root
Root container
2
List
Tab bar
3
Trigger
Individual tab button
4
Indicator
Active underline
5
Content
Content panel

Best Practices

Recommended

  • Keep tab labels short — one or two words
  • Use to group related content
  • Reinforce tab meaning with icons
  • Pre-select the most important tab by default

Don't

  • Don't exceed five tabs — limit to five or fewer
  • Don't use tabs for page-level navigation
  • Don't reorder tabs dynamically
  • Don't nest tabs within tabs

Accessibility

Keyboard

TabFocus the tab list / move to panel
←→Navigate between horizontal tabs
↑↓Navigate between vertical tabs
Home / EndJump to first / last tab
Enter / SpaceSelect tab (manual activation mode)

ARIA / WCAG

  • role="tablist" / role="tab" / role="tabpanel"
  • aria-selected reflects selection state automatically
  • aria-orientation set automatically
  • Disabled tabs are skipped in keyboard navigation

Tabs vs Segmented

Visually similar but different in purpose and structure — choose the right one.

Purpose

Tabs: Content navigation

Segmented: Value selection — filter, view toggle

Structure

Tabs: TabList + TabPanel combination

Segmented: Single component

Result

Tabs: Switch visible panels

Segmented: Change data in the same area

Placement

Tabs: Top of page or section

Segmented: Anywhere inside content

Radix Primitive

Tabs: @radix-ui/react-tabs

Segmented: RadioGroup

Key distinction: Use Tabs when switching between different content panels. Use Segmented when changing what is displayed in the same content area. Even when they look similar (Tabs pill vs Segmented default), choose by whether Tabs.Content panels are present.