Show one related panel at a time without navigating away from the page.
tsx
import { Card, CardContent, CardDescription, CardHeader, CardTitle,} from "@/components/ui/card"import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"export function Example() { return ( <Tabs defaultValue="overview" className="w-full"> <TabsList> <TabsTrigger value="overview">Overview</TabsTrigger> <TabsTrigger value="analytics">Analytics</TabsTrigger> <TabsTrigger value="reports">Reports</TabsTrigger> <TabsTrigger value="settings">Settings</TabsTrigger> </TabsList> <TabsContent value="overview"> <Card> <CardHeader> <CardTitle>Overview</CardTitle> <CardDescription> Key metrics and recent activity across your projects. </CardDescription> </CardHeader> <CardContent className="text-sm text-muted-foreground"> 12 active projects and 3 tasks waiting on review. </CardContent> </Card> </TabsContent> <TabsContent value="analytics"> <Card> <CardHeader> <CardTitle>Analytics</CardTitle> <CardDescription> Traffic and conversion for the last 30 days. </CardDescription> </CardHeader> <CardContent className="text-sm text-muted-foreground"> Sessions are up 8% week over week. </CardContent> </Card> </TabsContent> <TabsContent value="reports"> <Card> <CardHeader> <CardTitle>Reports</CardTitle> <CardDescription> Export ready summaries for your team. </CardDescription> </CardHeader> <CardContent className="text-sm text-muted-foreground"> Weekly digest ships every Monday at 09:00. </CardContent> </Card> </TabsContent> <TabsContent value="settings"> <Card> <CardHeader> <CardTitle>Settings</CardTitle> <CardDescription> Preferences for this workspace. </CardDescription> </CardHeader> <CardContent className="text-sm text-muted-foreground"> Notifications stay on for mention and review events. </CardContent> </Card> </TabsContent> </Tabs> )}Installation
npx @arctis-sh/@arctis-sh/ui@latest add tabsUsage
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"<Tabs defaultValue="account"> <TabsList> <TabsTrigger value="account">Account</TabsTrigger> <TabsTrigger value="password">Password</TabsTrigger> </TabsList> <TabsContent value="account">Account settings.</TabsContent> <TabsContent value="password">Password settings.</TabsContent></Tabs>Composition
Tabs ├── TabsList │ ├── TabsTrigger │ └── TabsTrigger ├── TabsContent └── TabsContent
Line
Set variant="line" on TabsList for an underline instead of a filled pill.
tsx
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"export function Example() { return ( <Tabs defaultValue="overview"> <TabsList variant="line"> <TabsTrigger value="overview">Overview</TabsTrigger> <TabsTrigger value="analytics">Analytics</TabsTrigger> <TabsTrigger value="reports">Reports</TabsTrigger> </TabsList> </Tabs> )}Vertical
Set orientation="vertical" on Tabs to stack the triggers beside their panels.
tsx
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"export function Example() { return ( <Tabs defaultValue="account" orientation="vertical"> <TabsList> <TabsTrigger value="account">Account</TabsTrigger> <TabsTrigger value="password">Password</TabsTrigger> <TabsTrigger value="notifications">Notifications</TabsTrigger> </TabsList> </Tabs> )}Disabled
Set disabled on a trigger so that tab cannot be selected.
tsx
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"export function Example() { return ( <Tabs defaultValue="home"> <TabsList> <TabsTrigger value="home">Home</TabsTrigger> <TabsTrigger value="disabled" disabled> Disabled </TabsTrigger> </TabsList> </Tabs> )}Icons
Add an icon when the label benefits from a quick visual cue.
tsx
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"export function Example() { return ( <Tabs defaultValue="preview"> <TabsList> <TabsTrigger value="preview"> <AppWindowIcon /> Preview </TabsTrigger> <TabsTrigger value="code"> <CodeIcon /> Code </TabsTrigger> </TabsList> </Tabs> )}API Reference
Tabs
| Prop | Type | Default |
|---|---|---|
| value | string | — |
| defaultValue | string | — |
| onValueChange | (value: string) => void | — |
| orientation | "horizontal" | "vertical" | "horizontal" |
| className | string | — |
<Tabs defaultValue="account"> <TabsList> <TabsTrigger value="account">Account</TabsTrigger> </TabsList> <TabsContent value="account">Account panel</TabsContent></Tabs>TabsList
| Prop | Type | Default |
|---|---|---|
| variant | "default" | "line" | "default" |
| className | string | — |
<TabsList> <TabsTrigger value="account">Account</TabsTrigger></TabsList>TabsTrigger
| Prop | Type | Default |
|---|---|---|
| value | string | — |
| disabled | boolean | false |
| className | string | — |
<TabsTrigger value="account">Account</TabsTrigger>TabsContent
| Prop | Type | Default |
|---|---|---|
| value | string | — |
| forceMount | boolean | false |
| className | string | — |
<TabsContent value="account">Account panel</TabsContent>