shadcn-remix
GitHub

Tabs

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

Account
Make changes to your account here. Click save when you're done.
import { css } from 'remix/component'

import { Button } from '#app/ui/button.tsx'
import {
  Card,
  CardContent,
import { css } from 'remix/component'

import { Button } from '#app/ui/button.tsx'
import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from '#app/ui/card.tsx'
import { Input } from '#app/ui/input.tsx'
import { Label } from '#app/ui/label.tsx'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '#app/ui/tabs.tsx'

const content = css({ display: 'grid', gap: '1.5rem' })
const field = css({ display: 'grid', gap: '0.75rem' })

export function TabsDemo() {
  return () => (
    <div
      mix={css({
        display: 'flex',
        width: '100%',
        maxWidth: '24rem',
        flexDirection: 'column',
        gap: '1.5rem',
      })}
    >
      <Tabs defaultValue="account">
        <TabsList>
          <TabsTrigger value="account">Account</TabsTrigger>
          <TabsTrigger value="password">Password</TabsTrigger>
        </TabsList>
        <TabsContent value="account">
          <Card>
            <CardHeader>
              <CardTitle>Account</CardTitle>
              <CardDescription>
                Make changes to your account here. Click save when you&apos;re done.
              </CardDescription>
            </CardHeader>
            <CardContent mix={content}>
              <div mix={field}>
                <Label htmlFor="tabs-demo-name">Name</Label>
                <Input id="tabs-demo-name" defaultValue="Pedro Duarte" />
              </div>
              <div mix={field}>
                <Label htmlFor="tabs-demo-username">Username</Label>
                <Input id="tabs-demo-username" defaultValue="@peduarte" />
              </div>
            </CardContent>
            <CardFooter>
              <Button>Save changes</Button>
            </CardFooter>
          </Card>
        </TabsContent>
        <TabsContent value="password">
          <Card>
            <CardHeader>
              <CardTitle>Password</CardTitle>
              <CardDescription>
                Change your password here. After saving, you&apos;ll be logged out.
              </CardDescription>
            </CardHeader>
            <CardContent mix={content}>
              <div mix={field}>
                <Label htmlFor="tabs-demo-current">Current password</Label>
                <Input id="tabs-demo-current" type="password" />
              </div>
              <div mix={field}>
                <Label htmlFor="tabs-demo-new">New password</Label>
                <Input id="tabs-demo-new" type="password" />
              </div>
            </CardContent>
            <CardFooter>
              <Button>Save password</Button>
            </CardFooter>
          </Card>
        </TabsContent>
      </Tabs>
    </div>
  )
}

Installation

$ pnpm dlx shadcn@latest add https://www.shadcn-remix.com/r/tabs.json

Usage

import { Tabs, TabsContent, TabsList, TabsTrigger } from '#app/ui/tabs.tsx'
<Tabs defaultValue="account">
  <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>

Composition

Use the following composition to build Tabs:

Tabs
├── TabsList
│   └── TabsTrigger
└── TabsContent

API Reference

Tabs

Root <div>. Arrow keys along the orientation, Home and End move focus and activate tabs.

PropTypeDefault
valuestring-
defaultValuestring-
onValueChange(value: string) => void-
orientation"horizontal" | "vertical""horizontal"
mixMixValue-

TabsList

The role="tablist" container.

PropTypeDefault
variant"default" | "line""default"
mixMixValue-

TabsTrigger

A role="tab" <button> with data-state="active" | "inactive".

PropTypeDefault
valuestring-
disabledbooleanfalse
mixMixValue-

TabsContent

The role="tabpanel" for a tab; hidden while inactive.

PropTypeDefault
valuestring-
mixMixValue-

tabsListVariants

Returns the tabs list styles as a mix for any element.

PropTypeDefault
variant"default" | "line""default"