Tabs

Navigation

Stablev1.0.0

Tabbed interface component for organizing content into separate views. Built with Ariakit.

Preview

Account settings content goes here.

Posts content

Installation

npx @component-labs/cli add tabs

This will:
- Install required dependencies
- Copy the Tabs component to your project
- Add utility functions (cn helper)

Make sure you've initialized Component Labs first:
```bash
npx @component-labs/cli init
```

Usage

import { Tabs, TabList, Tab, TabPanel } from "@component-labs/ui";

<Tabs defaultSelectedId="tab1">
  <TabList>
    <Tab id="tab1">Account</Tab>
    <Tab id="tab2">Password</Tab>
    <Tab id="tab3">Settings</Tab>
  </TabList>

  <TabPanel tabId="tab1">
    <p>Account settings content</p>
  </TabPanel>

  <TabPanel tabId="tab2">
    <p>Password settings content</p>
  </TabPanel>

  <TabPanel tabId="tab3">
    <p>General settings content</p>
  </TabPanel>
</Tabs>

Props

NameTypeDefaultDescription
Tabs.variant"default" | "outline" | "underline""default"Visual style variant applied to all tabs
Tabs.defaultSelectedIdstring-Default selected tab ID (uncontrolled)
Tabs.selectedIdstring-Controlled selected tab ID
Tabs.onSelectIdChange(id: string | null) => void-Callback when selected tab changes
TabListComponent-Container for Tab components
Tab.id*string-Unique identifier for the tab
Tab.disabledboolean-Whether the tab is disabled
TabPanel.tabId*string-ID of the tab this panel belongs to
classNamestring-Additional CSS classes (applies to all components)

Examples

Basic

Simple tabs with default style

<Tabs defaultSelectedId="tab1">
  <TabList>
    <Tab id="tab1">Account</Tab>
    <Tab id="tab2">Password</Tab>
    <Tab id="tab3">Settings</Tab>
  </TabList>

  <TabPanel tabId="tab1">
    <p>Account settings content</p>
  </TabPanel>

  <TabPanel tabId="tab2">
    <p>Password settings content</p>
  </TabPanel>

  <TabPanel tabId="tab3">
    <p>General settings content</p>
  </TabPanel>
</Tabs>

Outline Variant

Tabs with outline style

<Tabs variant="outline" defaultSelectedId="overview">
  <TabList>
    <Tab id="overview">Overview</Tab>
    <Tab id="analytics">Analytics</Tab>
    <Tab id="reports">Reports</Tab>
  </TabList>

  <TabPanel tabId="overview">Overview content</TabPanel>
  <TabPanel tabId="analytics">Analytics content</TabPanel>
  <TabPanel tabId="reports">Reports content</TabPanel>
</Tabs>

Underline Variant

Tabs with underline style

<Tabs variant="underline" defaultSelectedId="posts">
  <TabList>
    <Tab id="posts">Posts</Tab>
    <Tab id="comments">Comments</Tab>
    <Tab id="likes">Likes</Tab>
  </TabList>

  <TabPanel tabId="posts">Posts content</TabPanel>
  <TabPanel tabId="comments">Comments content</TabPanel>
  <TabPanel tabId="likes">Likes content</TabPanel>
</Tabs>

Controlled

Controlled tabs with state

const [activeTab, setActiveTab] = useState("tab1");

<Tabs selectedId={activeTab} onSelectIdChange={setActiveTab}>
  <TabList>
    <Tab id="tab1">Tab 1</Tab>
    <Tab id="tab2">Tab 2</Tab>
  </TabList>

  <TabPanel tabId="tab1">Content 1</TabPanel>
  <TabPanel tabId="tab2">Content 2</TabPanel>
</Tabs>

With Disabled Tab

Tabs with disabled option

<Tabs defaultSelectedId="available">
  <TabList>
    <Tab id="available">Available</Tab>
    <Tab id="upcoming" disabled>Upcoming</Tab>
    <Tab id="archived">Archived</Tab>
  </TabList>

  <TabPanel tabId="available">Available content</TabPanel>
  <TabPanel tabId="upcoming">Upcoming content</TabPanel>
  <TabPanel tabId="archived">Archived content</TabPanel>
</Tabs>

Performance

Bundle Size

~3KB gzipped

Minified and gzipped

Dependencies

  • @ariakit/react
  • class-variance-authority
  • clsx
  • tailwind-merge

Accessibility

  • Full keyboard navigation support (Arrow keys, Home, End)
  • Proper ARIA attributes for tabs pattern
  • Screen reader friendly
  • Focus management and visual indicators