Components
Tabs
Tabstrips allow users to navigate between two or more related views. They’re a helpful way of letting users quickly switch between related information.
Content for Tab 1
import { Tabs, Tab, TabsList, TabsPanel } from '../ui/tabs';
import { Separator } from '../ui/separator';
import { cn } from '@/lib/utils';
export default function TabsDemo() {
return (
<Tabs
defaultValue='tab1'
className={cn('w-full max-w-64 rounded-lg border')}
>
<TabsList className='p-2'>
<Tab value='tab1'>Tab 1</Tab>
<Tab value='tab2'>Tab 2</Tab>
<Tab value='tab3'>Tab 3</Tab>
</TabsList>
<Separator />
<TabsPanel value='tab1' className='p-2'>
Content for Tab 1
</TabsPanel>
<TabsPanel value='tab2' className='p-2'>
Content for Tab 2
</TabsPanel>
<TabsPanel value='tab3' className='p-2'>
Content for Tab 3
</TabsPanel>
</Tabs>
);
}
Manual Installation
import { Tabs as BaseTabs } from '@base-ui-components/react/tabs';
import { cn } from '@/lib/utils';
function Tabs({
className,
...props
}: React.ComponentProps<typeof BaseTabs.Root>) {
return (
<BaseTabs.Root
{...props}
className={cn('overflow-hidden outline-none', className)}
/>
);
}
function TabsList({
className,
...props
}: React.ComponentProps<typeof BaseTabs.List>) {
return (
<div
className={cn(
'relative',
'before:from-white-1000 dark:before:from-grey-800 before:pointer-events-none before:absolute before:top-0 before:left-0 before:z-10 before:h-full before:w-2 before:bg-gradient-to-r before:to-transparent before:content-[""]',
'after:from-white-1000 dark:after:from-grey-800 after:pointer-events-none after:absolute after:top-0 after:right-0 after:z-10 after:h-full after:w-2 after:bg-gradient-to-l after:to-transparent after:content-[""]',
)}
>
<BaseTabs.List
{...props}
className={cn(
'no-scrollbar flex gap-1 overflow-x-auto outline-none',
className,
)}
>
{props.children}
</BaseTabs.List>
</div>
);
}
function Tab({
className,
...props
}: React.ComponentProps<typeof BaseTabs.Tab>) {
return (
<BaseTabs.Tab
{...props}
className={cn(
'typography-body-medium text-black-500 data-selected:text-black-1000 dark:data-selected:text-white-1000 dark:text-white-500 data-selected:bg-grey-100 dark:data-selected:bg-grey-700 hover:bg-grey-100 dark:hover:bg-grey-700 h-6 shrink-0 rounded-md px-2 outline-none focus-visible:inset-ring focus-visible:inset-ring-blue-500 data-selected:font-[500]',
className,
)}
/>
);
}
function TabsPanel({
className,
...props
}: React.ComponentProps<typeof BaseTabs.Panel>) {
return (
<BaseTabs.Panel {...props} className={cn('outline-none', className)} />
);
}
export { Tabs, TabsList, Tab, TabsPanel };