Tabs

A component for organizing content into multiple tabs

Default Variant

The standard tabs style with background and rounded corners.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4
5  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
6</script>
7
8<Tabs value="account">
9  <TabsList>
10    <TabsTrigger value="account">Account</TabsTrigger>
11    <TabsTrigger value="password">Password</TabsTrigger>
12    <TabsTrigger value="settings">Settings</TabsTrigger>
13  </TabsList>
14  <TabsContent value="account">
15    <h3 class="text-lg font-medium">Account Information</h3>
16    <p class="text-sm text-muted-foreground">View and manage your account details here.</p>
17  </TabsContent>
18  <TabsContent value="password">
19    <h3 class="text-lg font-medium">Password Settings</h3>
20    <p class="text-sm text-muted-foreground">Change your password and security preferences.</p>
21  </TabsContent>
22  <TabsContent value="settings">
23    <h3 class="text-lg font-medium">Application Settings</h3>
24    <p class="text-sm text-muted-foreground">Configure your application preferences and options.</p>
25  </TabsContent>
26</Tabs>

Underline Variant

Clean underline style with active indicator at the bottom.


Code Svelte
1
2<Tabs value="overview">
3  <TabsList variant="underline">
4    <TabsTrigger variant="underline" value="overview">Overview</TabsTrigger>
5    <TabsTrigger variant="underline" value="analytics">Analytics</TabsTrigger>
6    <TabsTrigger variant="underline" value="reports">Reports</TabsTrigger>
7    <TabsTrigger variant="underline" value="notifications">Notifications</TabsTrigger>
8  </TabsList>
9  <TabsContent value="overview">
10    <h3 class="text-lg font-medium">Overview Dashboard</h3>
11    <p class="text-sm text-muted-foreground">Your main dashboard overview with key metrics.</p>
12  </TabsContent>
13</Tabs>

Pills Variant

Rounded pill-style tabs with smooth transitions.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4  import { Home, User, Settings } from "@kareyes/aether/icons";
5
6  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
7</script>
8
9<Tabs value="home">
10  <TabsList variant="pills">
11    <TabsTrigger variant="pills" value="home">
12      <Home class="size-4" />
13      Home
14    </TabsTrigger>
15    <TabsTrigger variant="pills" value="profile">
16      <User class="size-4" />
17      Profile
18    </TabsTrigger>
19    <TabsTrigger variant="pills" value="settings">
20      <Settings class="size-4" />
21      Settings
22    </TabsTrigger>
23  </TabsList>
24  <TabsContent value="home">
25    <h3 class="text-lg font-medium">Home Page</h3>
26    <p class="text-sm text-muted-foreground">Welcome to your home page.</p>
27  </TabsContent>
28</Tabs>

Solid Variant

Bold solid background style with primary color for active state.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4  import { Mail, Calendar, Bell } from "@kareyes/aether/icons";
5
6  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
7</script>
8
9<Tabs value="inbox">
10  <TabsList variant="solid">
11    <TabsTrigger variant="solid" value="inbox">
12      <Mail class="size-4" />
13      Inbox
14    </TabsTrigger>
15    <TabsTrigger variant="solid" value="scheduled">
16      <Calendar class="size-4" />
17      Scheduled
18    </TabsTrigger>
19    <TabsTrigger variant="solid" value="notifications">
20      <Bell class="size-4" />
21      Alerts
22    </TabsTrigger>
23  </TabsList>
24  <TabsContent value="inbox">
25    <h3 class="text-lg font-medium">Inbox Messages</h3>
26    <p class="text-sm text-muted-foreground">View all your incoming messages.</p>
27  </TabsContent>
28</Tabs>

Segmented Variant

Segmented control style with continuous background.


Code Svelte
1
2<Tabs value="daily">
3  <TabsList variant="segmented">
4    <TabsTrigger variant="segmented" value="daily">Daily</TabsTrigger>
5    <TabsTrigger variant="segmented" value="weekly">Weekly</TabsTrigger>
6    <TabsTrigger variant="segmented" value="monthly">Monthly</TabsTrigger>
7    <TabsTrigger variant="segmented" value="yearly">Yearly</TabsTrigger>
8  </TabsList>
9  <TabsContent value="daily">
10    <h3 class="text-lg font-medium">Daily Statistics</h3>
11    <p class="text-sm text-muted-foreground">View your daily performance metrics.</p>
12  </TabsContent>
13</Tabs>

Size Variants

Different sizes for various use cases.


Code Svelte
1
2<!-- Small Size -->
3<Tabs value="tab1">
4  <TabsList size="sm">
5    <TabsTrigger size="sm" value="tab1">Small Tab 1</TabsTrigger>
6    <TabsTrigger size="sm" value="tab2">Small Tab 2</TabsTrigger>
7    <TabsTrigger size="sm" value="tab3">Small Tab 3</TabsTrigger>
8  </TabsList>
9  <TabsContent value="tab1" padding="sm">
10    <p class="text-sm text-muted-foreground">Small size content area</p>
11  </TabsContent>
12</Tabs>
13
14<!-- Large Size -->
15<Tabs value="tab1">
16  <TabsList size="lg">
17    <TabsTrigger size="lg" value="tab1">Large Tab 1</TabsTrigger>
18    <TabsTrigger size="lg" value="tab2">Large Tab 2</TabsTrigger>
19    <TabsTrigger size="lg" value="tab3">Large Tab 3</TabsTrigger>
20  </TabsList>
21  <TabsContent value="tab1" padding="lg">
22    <p class="text-sm text-muted-foreground">Large size for better touch targets</p>
23  </TabsContent>
24</Tabs>

Animation Variants

Different transition effects for content changes.


Code Svelte
1
2<!-- Slide Animation -->
3<Tabs value="slide1">
4  <TabsList variant="pills">
5    <TabsTrigger variant="pills" value="slide1">Slide 1</TabsTrigger>
6    <TabsTrigger variant="pills" value="slide2">Slide 2</TabsTrigger>
7    <TabsTrigger variant="pills" value="slide3">Slide 3</TabsTrigger>
8  </TabsList>
9  <TabsContent value="slide1" animation="slide">
10    <div class="rounded-lg border border-border p-4">
11      <p class="text-sm">Content slides in from bottom</p>
12    </div>
13  </TabsContent>
14</Tabs>
15
16<!-- Scale Animation -->
17<Tabs value="scale1">
18  <TabsList variant="solid">
19    <TabsTrigger variant="solid" value="scale1">Scale 1</TabsTrigger>
20    <TabsTrigger variant="solid" value="scale2">Scale 2</TabsTrigger>
21    <TabsTrigger variant="solid" value="scale3">Scale 3</TabsTrigger>
22  </TabsList>
23  <TabsContent value="scale1" animation="scale">
24    <div class="rounded-lg border border-border p-4">
25      <p class="text-sm">Content zooms in on appear</p>
26    </div>
27  </TabsContent>
28</Tabs>

Responsive: Overflow Scroll

Many tabs in a single row. On mobile (≤640px), the tab list scrolls horizontally with a hidden scrollbar.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4  import { Home, BarChart3, Settings, CreditCard, Users, Puzzle, Shield } from "@kareyes/aether/icons";
5
6  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
7</script>
8
9<Tabs value="dash">
10  <TabsList variant="underline">
11    <TabsTrigger variant="underline" value="dash">
12      <Home class="size-4" />
13      Dashboard
14    </TabsTrigger>
15    <TabsTrigger variant="underline" value="analytics">
16      <BarChart3 class="size-4" />
17      Analytics
18    </TabsTrigger>
19    <TabsTrigger variant="underline" value="reports">Reports</TabsTrigger>
20    <TabsTrigger variant="underline" value="settings">
21      <Settings class="size-4" />
22      Settings
23    </TabsTrigger>
24    <TabsTrigger variant="underline" value="billing">
25      <CreditCard class="size-4" />
26      Billing
27    </TabsTrigger>
28    <TabsTrigger variant="underline" value="team">
29      <Users class="size-4" />
30      Team
31    </TabsTrigger>
32    <TabsTrigger variant="underline" value="integrations">
33      <Puzzle class="size-4" />
34      Integrations
35    </TabsTrigger>
36    <TabsTrigger variant="underline" value="security">
37      <Shield class="size-4" />
38      Security
39    </TabsTrigger>
40  </TabsList>
41  <TabsContent value="dash">
42    <h4 class="font-medium">Dashboard</h4>
43    <p class="text-sm text-muted-foreground mt-1">
44      Resize the browser to see horizontal scroll on mobile.
45    </p>
46  </TabsContent>
47</Tabs>

Responsive: Vertical Tabs

Vertical tabs automatically convert to horizontal layout on mobile (≤640px). Resize the browser to see the switch.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4  import { Home, User, Settings, Shield } from "@kareyes/aether/icons";
5
6  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
7</script>
8
9<!-- Vertical Default -->
10<Tabs orientation="vertical" value="general">
11  <TabsList>
12    <TabsTrigger value="general">General</TabsTrigger>
13    <TabsTrigger value="appearance">Appearance</TabsTrigger>
14    <TabsTrigger value="notifications">Notifications</TabsTrigger>
15  </TabsList>
16  <TabsContent value="general">
17    <h4 class="font-medium">General Settings</h4>
18    <p class="text-sm text-muted-foreground mt-1">
19      On desktop, tabs are vertical. On mobile ≤640px, they switch to horizontal.
20    </p>
21  </TabsContent>
22</Tabs>
23
24<!-- Vertical Pills -->
25<Tabs orientation="vertical" value="v1">
26  <TabsList variant="pills">
27    <TabsTrigger variant="pills" value="v1">
28      <Home class="size-4" />
29      Dashboard
30    </TabsTrigger>
31    <TabsTrigger variant="pills" value="v2">
32      <User class="size-4" />
33      Profile
34    </TabsTrigger>
35    <TabsTrigger variant="pills" value="v3">
36      <Settings class="size-4" />
37      Settings
38    </TabsTrigger>
39    <TabsTrigger variant="pills" value="v4">
40      <Shield class="size-4" />
41      Privacy
42    </TabsTrigger>
43  </TabsList>
44  <TabsContent value="v1">
45    <h4 class="font-medium">Dashboard</h4>
46    <p class="text-sm text-muted-foreground mt-1">Vertical pills variant with icons.</p>
47  </TabsContent>
48</Tabs>

Dropdown on Mobile

With dropdownOnMobile and items props, tabs convert to a Select dropdown on mobile (≤640px).


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4
5  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
6
7  const settingsTabs: TabsPrimitives.TabItem[] = [
8    { value: "general", label: "General" },
9    { value: "appearance", label: "Appearance" },
10    { value: "notifications", label: "Notifications" },
11    { value: "privacy", label: "Privacy" },
12    { value: "security", label: "Security" },
13  ];
14</script>
15
16<Tabs value="general" dropdownOnMobile items={settingsTabs}>
17  <TabsList variant="underline">
18    <TabsTrigger variant="underline" value="general">General</TabsTrigger>
19    <TabsTrigger variant="underline" value="appearance">Appearance</TabsTrigger>
20    <TabsTrigger variant="underline" value="notifications">Notifications</TabsTrigger>
21    <TabsTrigger variant="underline" value="privacy">Privacy</TabsTrigger>
22    <TabsTrigger variant="underline" value="security">Security</TabsTrigger>
23  </TabsList>
24  <TabsContent value="general">
25    <h4 class="font-medium">General Settings</h4>
26    <p class="text-sm text-muted-foreground mt-1">
27      On mobile, the tab list becomes a Select dropdown.
28    </p>
29  </TabsContent>
30</Tabs>

Disabled Tabs

Individual tabs can be disabled while keeping others interactive.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4
5  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
6</script>
7
8<Tabs value="enabled">
9  <TabsList>
10    <TabsTrigger value="enabled">Enabled</TabsTrigger>
11    <TabsTrigger value="disabled" disabled>Disabled</TabsTrigger>
12    <TabsTrigger value="another">Another Tab</TabsTrigger>
13  </TabsList>
14  <TabsContent value="enabled">
15    <p class="text-sm text-muted-foreground">
16      This tab is active. The "Disabled" tab cannot be selected.
17    </p>
18  </TabsContent>
19</Tabs>

Combinations

Mixing variants, sizes, and animations.


Code Svelte
1
2<script lang="ts">
3  import { TabsPrimitives } from "@kareyes/aether";
4  import { Home, User, Settings } from "@kareyes/aether/icons";
5
6  const { Tabs, TabsList, TabsTrigger, TabsContent } = TabsPrimitives;
7</script>
8
9<!-- Pills + Large + Slide -->
10<Tabs value="ch1">
11  <TabsList variant="pills" size="lg">
12    <TabsTrigger variant="pills" size="lg" value="ch1">
13      <Home class="size-4" />
14      Home
15    </TabsTrigger>
16    <TabsTrigger variant="pills" size="lg" value="ch2">
17      <User class="size-4" />
18      Profile
19    </TabsTrigger>
20    <TabsTrigger variant="pills" size="lg" value="ch3">
21      <Settings class="size-4" />
22      Settings
23    </TabsTrigger>
24  </TabsList>
25  <TabsContent value="ch1" animation="slide" padding="lg">
26    <p class="text-sm text-muted-foreground">Large pills with slide animation</p>
27  </TabsContent>
28</Tabs>
29
30<!-- Underline + Small + No Animation -->
31<Tabs value="cm1">
32  <TabsList variant="underline" size="sm">
33    <TabsTrigger variant="underline" size="sm" value="cm1">Compact 1</TabsTrigger>
34    <TabsTrigger variant="underline" size="sm" value="cm2">Compact 2</TabsTrigger>
35    <TabsTrigger variant="underline" size="sm" value="cm3">Compact 3</TabsTrigger>
36  </TabsList>
37  <TabsContent value="cm1" animation="none" padding="sm">
38    <p class="text-sm text-muted-foreground">Small underline with instant switch</p>
39  </TabsContent>
40</Tabs>
41
42<!-- Solid + Scale Animation -->
43<Tabs value="cs1">
44  <TabsList variant="solid">
45    <TabsTrigger variant="solid" value="cs1">Overview</TabsTrigger>
46    <TabsTrigger variant="solid" value="cs2">Details</TabsTrigger>
47    <TabsTrigger variant="solid" value="cs3">History</TabsTrigger>
48  </TabsList>
49  <TabsContent value="cs1" animation="scale">
50    <p class="text-sm text-muted-foreground">Solid variant with zoom-in effect</p>
51  </TabsContent>
52</Tabs>