Tabs
Tab item + tab bar. 3 styles × 4 states.
First flush Darjeeling, picked in March and packed in Dhaka.
Use water just off the boil and steep for three minutes.
128 reviews, 4.8 on average.
import * as React from "react";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export default function Example() {
const [tab, setTab] = React.useState("details");
return (
<Tabs value={tab} onValueChange={setTab} style={{ width: 360, maxWidth: "100%" }}>
<TabsList>
<TabsTrigger value="details">Details</TabsTrigger>
<TabsTrigger value="brewing">Brewing</TabsTrigger>
<TabsTrigger value="reviews">Reviews</TabsTrigger>
</TabsList>
<TabsContent value="details">First flush Darjeeling, picked in March and packed in Dhaka.</TabsContent>
<TabsContent value="brewing">Use water just off the boil and steep for three minutes.</TabsContent>
<TabsContent value="reviews">128 reviews, 4.8 on average.</TabsContent>
</Tabs>
);
}
Installation
$ npx uix-ui@latest add tabsThis copies the file into components/ui/tabs.tsx in your project. npx shadcn@latest add @uix/tabs works too.
Usage
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
<Tabs value={tab} onValueChange={setTab} style={{ width: 360, maxWidth: "100%" }}>
<TabsList>
<TabsTrigger value="details">Details</TabsTrigger>
<TabsTrigger value="brewing">Brewing</TabsTrigger>
<TabsTrigger value="reviews">Reviews</TabsTrigger>
</TabsList>
<TabsContent value="details">First flush Darjeeling, picked in March and packed in Dhaka.</TabsContent>
<TabsContent value="brewing">Use water just off the boil and steep for three minutes.</TabsContent>
<TabsContent value="reviews">128 reviews, 4.8 on average.</TabsContent>
</Tabs>
Examples
Pill and boxed
All 14 teas
5 green teas
6 black teas
All 14 teas
5 green teas
6 black teas
import * as React from "react";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export default function Example() {
const [a, setA] = React.useState("all");
const [b, setB] = React.useState("all");
return (
<div style={{ display: "grid", gap: 24 }}>
<Tabs appearance="pill" value={a} onValueChange={setA}>
<TabsList>
<TabsTrigger value="all">All</TabsTrigger>
<TabsTrigger value="green">Green</TabsTrigger>
<TabsTrigger value="black">Black</TabsTrigger>
</TabsList>
<TabsContent value="all">All 14 teas</TabsContent>
<TabsContent value="green">5 green teas</TabsContent>
<TabsContent value="black">6 black teas</TabsContent>
</Tabs>
<Tabs appearance="boxed" value={b} onValueChange={setB}>
<TabsList>
<TabsTrigger value="all">All</TabsTrigger>
<TabsTrigger value="green">Green</TabsTrigger>
<TabsTrigger value="black">Black</TabsTrigger>
</TabsList>
<TabsContent value="all">All 14 teas</TabsContent>
<TabsContent value="green">5 green teas</TabsContent>
<TabsContent value="black">6 black teas</TabsContent>
</Tabs>
</div>
);
}
Icons and counts
12 orders this month.
3 saved teas.
Nusrat Jahan, Mirpur.
import * as React from "react";
import { Inbox, Star, User } from "@/components/ui/icons";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export default function Example() {
const [tab, setTab] = React.useState("orders");
return (
<Tabs value={tab} onValueChange={setTab}>
<TabsList>
<TabsTrigger value="orders" leadingIcon={<Inbox />} count={12}>Orders</TabsTrigger>
<TabsTrigger value="saved" leadingIcon={<Star />} count={3}>Saved</TabsTrigger>
<TabsTrigger value="account" leadingIcon={<User />}>Account</TabsTrigger>
</TabsList>
<TabsContent value="orders">12 orders this month.</TabsContent>
<TabsContent value="saved">3 saved teas.</TabsContent>
<TabsContent value="account">Nusrat Jahan, Mirpur.</TabsContent>
</Tabs>
);
}
Props
Tabs props
| Prop | Type | Default | Description |
|---|---|---|---|
appearance | underline | pill | boxed | "underline" | |
value | string | – | |
onValueChange | (value: string) => void | – |
TabsTriggerProps
| Prop | Type | Default | Description |
|---|---|---|---|
value | string | – | |
leadingIcon | React.ReactNode | – | Icon before the label. |
count | React.ReactNode | – | Number pill after the label. |
TabsContentProps
| Prop | Type | Default | Description |
|---|---|---|---|
value | string | – |
Everything else is passed to the root element, so className, aria-* and event handlers work as usual.
Dependencies
Installed for you by the CLI.
class-variance-authorityclsxtailwind-merge
lib/utils.ts
This file exports 4 parts: Tabs, TabsList, TabsTrigger, TabsContent. Use only the ones you need.