Skip to main content

tabs

A set of layered sections of content -- known as tab panels -- that are displayed one at a time.

Philosophy

Tabs organize content into parallel views — only one is visible at a time, but all are equally important. We keep the component controlled-optional (works with or without state management) because simple use cases shouldn't pay the complexity tax. The TabsList/TabsTrigger/TabsContent split keeps styling separate from behavior.

Installation


npx @gentleduck/cli add tabs

npx @gentleduck/cli add tabs

Usage

import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
<Tabs
  defaultValue="account"
  className="w-[400px]"
>
  <TabsList>
    <TabsTrigger value="account">Account</TabsTrigger>
    <TabsTrigger value="password">Password</TabsTrigger>
  </TabsList>
  <TabsContent value="account">Make changes to your account here.</TabsContent>
  <TabsContent value="password">Change your password here.</TabsContent>
</Tabs>
<Tabs
  defaultValue="account"
  className="w-[400px]"
>
  <TabsList>
    <TabsTrigger value="account">Account</TabsTrigger>
    <TabsTrigger value="password">Password</TabsTrigger>
  </TabsList>
  <TabsContent value="account">Make changes to your account here.</TabsContent>
  <TabsContent value="password">Change your password here.</TabsContent>
</Tabs>

Component Composition

Loading diagram...

API Reference

Tabs

PropTypeDefaultDescription
valuestring--Controlled active tab value. Must be used alongside onValueChange
defaultValuestring--Uncontrolled initial tab value
onValueChange(value: string) => void--Callback fired when the active tab changes
dir'ltr' | 'rtl'--Text direction override. Resolved via useDirection (dir prop -> DirectionProvider -> 'ltr').
...propsOmit<React.HTMLProps<HTMLDivElement>, 'defaultValue'>--Additional props to spread to the content div

TabsList

PropTypeDefaultDescription
classNamestring--Additional CSS class names
childrenReact.ReactNode--TabsTrigger elements
...propsReact.HTMLProps<HTMLDivElement>--Additional props to spread to the container div (renders with role="tablist")

TabsTrigger

PropTypeDefaultDescription
valuestring(required)A unique value that identifies this tab trigger
defaultCheckedboolean--If true, sets this tab as the default active tab on first render
disabledboolean--Disables the tab trigger from user interaction
classNamestring--Additional CSS class names
childrenReact.ReactNode--Label or node to render inside the tab
...propsReact.HTMLProps<HTMLButtonElement>--Additional props to spread to the button element

TabsContent

PropTypeDefaultDescription
valuestring(required)The associated value that matches a TabsTrigger
forceMountbooleanfalseIf true, the content stays mounted in the DOM even when hidden
classNamestring--Additional CSS class names
childrenReact.ReactNode--Tab panel content
...propsReact.HTMLProps<HTMLDivElement>--Additional props to spread to the content div

RTL Support

Direction is resolved through the shared primitives direction module. Use a local dir="rtl" override when the component exposes it, or set DirectionProvider at app/root level for global RTL/LTR behavior.