InfinitiBit Design System

Tabs

Tab navigation for switching between related panels, built on Radix.

Tabs organises content into panels you switch between. Built on Radix: arrow keys move between tabs, and the active tab shows a coloured underline. Compose TabsList + TabsTrigger (one per tab) and a matching TabsContent per panel.

Overview content.

Installation

pnpm add @infinitibit_gmbh/ui @infinitibit_gmbh/theme-default

Usage

import '@infinitibit_gmbh/theme-default/theme.css';
import '@infinitibit_gmbh/ui/styles.css';

import { Tabs, TabsList, TabsTrigger, TabsContent } from '@infinitibit_gmbh/ui';

export function Example() {
  return (
    <Tabs defaultValue="overview">
      <TabsList aria-label="Sections">
        <TabsTrigger value="overview">Overview</TabsTrigger>
        <TabsTrigger value="activity">Activity</TabsTrigger>
      </TabsList>
      <TabsContent value="overview">…</TabsContent>
      <TabsContent value="activity">…</TabsContent>
    </Tabs>
  );
}

Sizes

TabsTrigger takes sizesm, md (default), or lg.

API

Tabs

PropTypeDefaultDescription
valuestringControlled active tab
defaultValuestringInitial active tab (uncontrolled)
onValueChange(value: string) => voidCalled when the active tab changes

TabsTrigger

PropTypeDefaultDescription
valuestringThe tab's value (required)
size'sm' | 'md' | 'lg''md'Tab size
disabledbooleanSkips the tab in keyboard nav

TabsList and TabsContent forward all native Radix props.

Accessibility

  • TabsList is role="tablist"; triggers are role="tab" with aria-selected; panels are role="tabpanel".
  • Arrow keys move between tabs; disabled tabs are skipped. The focus ring uses :focus-visible.

On this page