import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export default function TabsDefault() {
return (
<Tabs defaultValue="overview" className="w-full max-w-lg">
<TabsList>
<TabsTrigger value="overview">Overview</TabsTrigger>
<TabsTrigger value="tasks">Tasks</TabsTrigger>
<TabsTrigger value="files">Files</TabsTrigger>
<TabsTrigger value="archive" disabled>
Archive
</TabsTrigger>
</TabsList>
<TabsContent
value="overview"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Website redesign is 64% complete with 10 tasks remaining.
</TabsContent>
<TabsContent
value="tasks"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
28 tasks, 4 assigned to you.
</TabsContent>
<TabsContent
value="files"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
12 files, last uploaded 2 hours ago.
</TabsContent>
</Tabs>
);
}- Add the registryOnce per project
pnpm dlx shadcn@latest registry add @jarvis=https://ui.jarv.is/r/{name}.json - Add tabs
pnpm dlx shadcn@latest add @jarvis/tabs
Usage
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export function ProjectTabs() {
return (
<Tabs defaultValue="overview">
<TabsList>
<TabsTrigger value="overview">Overview</TabsTrigger>
<TabsTrigger value="tasks">Tasks</TabsTrigger>
</TabsList>
<TabsContent value="overview">A summary of the project.</TabsContent>
<TabsContent value="tasks">Everything left to do.</TabsContent>
</Tabs>
);
}Each TabsTrigger shows the TabsContent with the same value. Set defaultValue on Tabs, or
control it with value and onValueChange.
Composition
Examples
Line
variant="line" underlines the active tab, for a page's main sections. When the tabs don't fit,
the row scrolls and fades at its edges.
import { ActivityIcon, RocketIcon, SettingsIcon, UsersIcon } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export default function TabsLine() {
return (
<Tabs defaultValue="activity" className="w-full">
<TabsList variant="line">
<TabsTrigger value="activity">
<ActivityIcon />
Activity
</TabsTrigger>
<TabsTrigger value="deployments">
<RocketIcon />
Deployments
</TabsTrigger>
<TabsTrigger value="members">
<UsersIcon />
Members
<Badge variant="muted">12</Badge>
</TabsTrigger>
<TabsTrigger value="settings">
<SettingsIcon />
Settings
</TabsTrigger>
</TabsList>
<TabsContent
value="activity"
className="mt-2 border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Sam Rivera moved “Update pricing page” to In progress.
</TabsContent>
<TabsContent
value="deployments"
className="mt-2 border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
The latest deployment finished 3 minutes ago.
</TabsContent>
<TabsContent
value="members"
className="mt-2 border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
12 people have access to this project.
</TabsContent>
<TabsContent
value="settings"
className="mt-2 border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Rename the project, change its visibility or archive it.
</TabsContent>
</Tabs>
);
}Vertical
orientation="vertical" stacks the tabs beside their content.
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export default function TabsVertical() {
return (
<Tabs defaultValue="general" orientation="vertical" className="w-full max-w-lg">
<TabsList className="w-32">
<TabsTrigger value="general">General</TabsTrigger>
<TabsTrigger value="members">Members</TabsTrigger>
<TabsTrigger value="billing">Billing</TabsTrigger>
<TabsTrigger value="security">Security</TabsTrigger>
</TabsList>
<TabsContent
value="general"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Name, URL and default language.
</TabsContent>
<TabsContent
value="members"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Invite people and manage roles.
</TabsContent>
<TabsContent
value="billing"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Plan, invoices and billing address.
</TabsContent>
<TabsContent
value="security"
className="border-[0.5px] border-border-muted p-4 text-muted-foreground"
>
Two-step verification and active sessions.
</TabsContent>
</Tabs>
);
}Props
The tables leave out className, style and render. Parts built on Base UI take them as its styling and composition guides describe.
Tabs
| Prop | Type | Default |
|---|---|---|
valueThe value of the currently active | any | — |
defaultValueThe default value. Use when the component is not controlled.
When the value is | any | 0 |
orientationThe component orientation (layout flow direction). | "horizontal" | "vertical" | "horizontal" |
onValueChangeCallback invoked when new value is being set. The event For automatic changes, the selected value can be Automatic changes cannot be canceled; calling | ((value: Tabs.Tab.Value, eventDetails: Tabs.Root.ChangeEventDetails) => void) | — |
TabsList
| Prop | Type | Default |
|---|---|---|
activateOnFocusWhether to automatically change the active tab on arrow key focus. Otherwise, tabs will be activated using Enter or Space key press. | boolean | false |
loopFocusWhether to loop keyboard focus back to the first item when the end of the list is reached while using the arrow keys. | boolean | true |
variant | "default" | "line" | "default" |
TabsTrigger
| Prop | Type | Default |
|---|---|---|
valueThe value of the Tab. | any | — |
disabledWhether the Tab is disabled. If a first Tab on a | boolean | — |
nativeButtonWhether the component renders a native | boolean | true |
TabsContent
| Prop | Type | Default |
|---|---|---|
valueThe value of the TabPanel. It will be shown when the Tab with the corresponding value is active. | any | — |
keepMountedWhether to keep the HTML element in the DOM while the panel is hidden. | boolean | false |