MSQ Logo

Tabs

Tab component for organizing content into multiple panels. Supports multiple variants including default, underline, filled, color, filter, and select styles.

Installation

The Tabs component is part of the design system. Import it from the UI package.

import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"

Usage

Use Tabs with TabsList, TabsTrigger, and TabsContent. Copy the example below to get started.

<Tabs defaultValue="tab1">
  <TabsList>
    <TabsTrigger value="tab1">Tab 1</TabsTrigger>
    <TabsTrigger value="tab2">Tab 2</TabsTrigger>
    <TabsTrigger value="tab3">Tab 3</TabsTrigger>
  </TabsList>
</Tabs>

Variants

Tabs component supports multiple visual variants to match different use cases.

Default

Standard tabs with rounded corners. Selected tab has primary blue background.

<Tabs defaultValue="activity" variant="default">
  <TabsList>
    <TabsTrigger value="activity">Activity history</TabsTrigger>
    <TabsTrigger value="access">Access history</TabsTrigger>
    <TabsTrigger value="excel">Excel Download History</TabsTrigger>
  </TabsList>
</Tabs>

Default with Icon

Default variant with icon support. Icons can be placed on the left or right.

<Tabs defaultValue="activity" variant="default">
  <TabsList>
    <TabsTrigger value="activity" icon="check-circle">Activity history</TabsTrigger>
    <TabsTrigger value="access">Access history</TabsTrigger>
    <TabsTrigger value="excel">Excel Download History</TabsTrigger>
  </TabsList>
</Tabs>

Underline

Tabs with underline indicator. Selected tab shows a blue underline.

<Tabs defaultValue="msqp" variant="underline">
  <TabsList>
    <TabsTrigger value="msqp">MSQP</TabsTrigger>
    <TabsTrigger value="p2u">P2U</TabsTrigger>
  </TabsList>
</Tabs>

Filled

Tabs with filled background. Selected tab has white background with blue text.

<Tabs defaultValue="msqp" variant="filled">
  <TabsList>
    <TabsTrigger value="msqp">MSQP</TabsTrigger>
    <TabsTrigger value="p2u">P2U</TabsTrigger>
  </TabsList>
</Tabs>

Color

Tabs with colored background. Selected tab has primary blue background with white text.

<Tabs defaultValue="msqp" variant="color">
  <TabsList>
    <TabsTrigger value="msqp">MSQP</TabsTrigger>
    <TabsTrigger value="p2u">P2U</TabsTrigger>
  </TabsList>
</Tabs>

Filter

Filter-style tabs with borders. Each tab looks like a button with border.

<Tabs defaultValue="all" variant="filter">
  <TabsList>
    <TabsTrigger value="all">All</TabsTrigger>
    <TabsTrigger value="today">Today</TabsTrigger>
    <TabsTrigger value="yesterday">Yesterday</TabsTrigger>
    <TabsTrigger value="week">1 Week</TabsTrigger>
    <TabsTrigger value="month">1 Month</TabsTrigger>
    <TabsTrigger value="quarter">3 Month</TabsTrigger>
  </TabsList>
</Tabs>

Select

Connected tabs with shared borders, similar to a segmented control.

<Tabs defaultValue="individual" variant="select">
  <TabsList>
    <TabsTrigger value="all">All</TabsTrigger>
    <TabsTrigger value="individual">Individual</TabsTrigger>
    <TabsTrigger value="corporate">Corporate</TabsTrigger>
  </TabsList>
</Tabs>

Examples

Controlled

const [activeTab, setActiveTab] = useState("tab1")

<Tabs value={activeTab} onValueChange={setActiveTab}>
  <TabsList>
    <TabsTrigger value="tab1">Tab 1</TabsTrigger>
    <TabsTrigger value="tab2">Tab 2</TabsTrigger>
  </TabsList>
</Tabs>

API Reference

The Tabs component organizes content into switchable panels. It supports defaultValue, value, onValueChange, and variant.

Tabs, TabsList, TabsTrigger, and TabsContent accept standard HTML and Radix UI props. See the interface below for details.

interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {
  defaultValue: string
  value?: string
  onValueChange?: (value: string) => void
  variant?: "default" | "underline" | "filled" | "color" | "filter" | "select"
}

interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {
  variant?: "default" | "underline" | "filled" | "color" | "filter" | "select"
}

interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  value: string
  icon?: string | React.ReactNode
  iconPosition?: "left" | "right"
}

interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {
  value: string
}