ProPro components are coming soon. Stay tuned!

Tabs Component

The Tabs component allows you to organize content into multiple panels that can be switched between. Perfect for settings pages, forms, and content organization.

Basic Usage

import { Tabs, TabsList, TabsTrigger, TabsContent } from 'nebula-ui';
 
export default function Example() {
  return (
    <Tabs defaultValue="account">
      <TabsList>
        <TabsTrigger value="account">Account</TabsTrigger>
        <TabsTrigger value="password">Password</TabsTrigger>
      </TabsList>
      <TabsContent value="account">
        Account content goes here
      </TabsContent>
      <TabsContent value="password">
        Password content goes here
      </TabsContent>
    </Tabs>
  );
}

Default Value

Set the initially active tab:

<Tabs defaultValue="first">
  <TabsList>
    <TabsTrigger value="first">First</TabsTrigger>
    <TabsTrigger value="second">Second</TabsTrigger>
  </TabsList>
  <TabsContent value="first">First content</TabsContent>
  <TabsContent value="second">Second content</TabsContent>
</Tabs>

Controlled Component

Control the active tab programmatically:

const [activeTab, setActiveTab] = useState('account');
 
<Tabs value={activeTab} onValueChange={setActiveTab}>
  <TabsList>
    <TabsTrigger value="account">Account</TabsTrigger>
    <TabsTrigger value="settings">Settings</TabsTrigger>
  </TabsList>
  <TabsContent value="account">Account content</TabsContent>
  <TabsContent value="settings">Settings content</TabsContent>
</Tabs>

Disabled Tabs

Disable specific tabs:

<TabsList>
  <TabsTrigger value="account">Account</TabsTrigger>
  <TabsTrigger value="settings" disabled>Settings</TabsTrigger>
  <TabsTrigger value="billing">Billing</TabsTrigger>
</TabsList>

With Cards

Combine tabs with cards for a polished look:

import { Tabs, TabsList, TabsTrigger, TabsContent, Card, CardHeader, CardTitle, CardContent } from 'nebula-ui';
 
<Tabs defaultValue="account">
  <TabsList>
    <TabsTrigger value="account">Account</TabsTrigger>
    <TabsTrigger value="settings">Settings</TabsTrigger>
  </TabsList>
  <TabsContent value="account">
    <Card>
      <CardHeader>
        <CardTitle>Account Settings</CardTitle>
      </CardHeader>
      <CardContent>
        Account content here
      </CardContent>
    </Card>
  </TabsContent>
  <TabsContent value="settings">
    <Card>
      <CardHeader>
        <CardTitle>Settings</CardTitle>
      </CardHeader>
      <CardContent>
        Settings content here
      </CardContent>
    </Card>
  </TabsContent>
</Tabs>

Props

Tabs Props

PropTypeDefaultDescription
defaultValuestring-Default active tab value
valuestring-Controlled active tab value
onValueChange(value: string) => void-Callback when tab changes
childrenReactNode-Tab content

TabsTrigger Props

PropTypeDefaultDescription
valuestring-Unique value for this tab
disabledbooleanfalseDisable the tab
childrenReactNode-Tab trigger content

TabsContent Props

PropTypeDefaultDescription
valuestring-Unique value for this tab content
childrenReactNode-Tab content

Accessibility

The Tabs component is fully accessible:

  • Keyboard navigation (Arrow keys to navigate, Enter/Space to activate)
  • Proper ARIA attributes (role="tablist", role="tab", role="tabpanel")
  • Focus management
  • Screen reader support

Examples

Settings Page

<Tabs defaultValue="general">
  <TabsList>
    <TabsTrigger value="general">General</TabsTrigger>
    <TabsTrigger value="notifications">Notifications</TabsTrigger>
    <TabsTrigger value="privacy">Privacy</TabsTrigger>
  </TabsList>
  <TabsContent value="general">
    <div className="space-y-4">
      <Input label="Name" />
      <Input label="Email" type="email" />
    </div>
  </TabsContent>
  <TabsContent value="notifications">
    <div className="space-y-4">
      <Switch label="Email notifications" />
      <Switch label="Push notifications" />
    </div>
  </TabsContent>
  <TabsContent value="privacy">
    <div className="space-y-4">
      <Checkbox label="Make profile public" />
      <Checkbox label="Allow search engines" />
    </div>
  </TabsContent>
</Tabs>

Best Practices

  1. Use descriptive labels for tab triggers
  2. Keep content focused - each tab should have a clear purpose
  3. Limit the number of tabs - too many tabs can be overwhelming
  4. Use consistent styling across all tabs
  5. Provide keyboard navigation (handled automatically)

Was this page helpful?

Let us know if this documentation helped you.