omverse-ui

Menu

ComponentsExamplesGitHub

Getting started

IntroductionInstallationThemingDesign tokensDark mode

Form

ButtonInputSelectCheckboxRadioSwitchSlidernewDatePickernew

Display

AvatarBadgeCardChipAccordionProgressDivider

Navigation

NavbarBreadcrumbTabsPaginationStepper

Overlay

DialogTooltipToast

Other

IconIconButtonSpinner
ComponentsNavigationTabs

Tabs

9 variants · horizontal + vertical · badge · icon · subtitle · scrollable · step

UnderlinePillFilledBorderedCardFloatingBubbleGradientVertical (line)ScrollableStepTabsWith subtitle

Underline (M3 primary)

Live preview

Classic bottom-border active indicator — icon, badge, disabled states

Content for Overview

App.tsx
tsx
1<Tabs variant="underline" defaultValue="overview">
2 <TabsList>
3 <TabsTrigger value="overview" icon="info">Overview</TabsTrigger>
4 <TabsTrigger value="analytics" badge={3}>Analytics</TabsTrigger>
5 <TabsTrigger value="reports">Reports</TabsTrigger>
6 <TabsTrigger value="messages" badge={12}>Messages</TabsTrigger>
7 <TabsTrigger value="settings" disabled>Disabled</TabsTrigger>
8 </TabsList>
9 <TabsContent value="overview"><p>Overview content goes here.</p></TabsContent>
10 <TabsContent value="analytics"><p>Analytics content goes here.</p></TabsContent>
11 <TabsContent value="reports"><p>Reports content goes here.</p></TabsContent>
12 <TabsContent value="messages"><p>Messages content goes here.</p></TabsContent>
13</Tabs>

Pill / Segmented

Live preview

Floating pill on a tinted background — great for filter controls

Content for All

App.tsx
tsx
1<Tabs variant="pill" defaultValue="all">
2 <TabsList>
3 <TabsTrigger value="all">All</TabsTrigger>
4 <TabsTrigger value="active">Active</TabsTrigger>
5 <TabsTrigger value="paused">Paused</TabsTrigger>
6 <TabsTrigger value="completed">Completed</TabsTrigger>
7 </TabsList>
8 <TabsContent value="all"><p>All items shown here.</p></TabsContent>
9 <TabsContent value="active"><p>Active items shown here.</p></TabsContent>
10 <TabsContent value="paused"><p>Paused items shown here.</p></TabsContent>
11 <TabsContent value="completed"><p>Completed items shown here.</p></TabsContent>
12</Tabs>

Filled

Live preview

Solid primary background on the active tab

Content for Design

App.tsx
tsx
1<Tabs variant="filled" defaultValue="design">
2 <TabsList>
3 <TabsTrigger value="design">Design</TabsTrigger>
4 <TabsTrigger value="engineering">Engineering</TabsTrigger>
5 <TabsTrigger value="marketing">Marketing</TabsTrigger>
6 <TabsTrigger value="product">Product</TabsTrigger>
7 </TabsList>
8 <TabsContent value="design"><p>Design team content.</p></TabsContent>
9 <TabsContent value="engineering"><p>Engineering team content.</p></TabsContent>
10 <TabsContent value="marketing"><p>Marketing team content.</p></TabsContent>
11 <TabsContent value="product"><p>Product team content.</p></TabsContent>
12</Tabs>

Bordered

Live preview

Outlined active tab — clean and minimal

Content for Day

App.tsx
tsx
1<Tabs variant="bordered" defaultValue="day">
2 <TabsList>
3 <TabsTrigger value="day">Day</TabsTrigger>
4 <TabsTrigger value="week">Week</TabsTrigger>
5 <TabsTrigger value="month">Month</TabsTrigger>
6 <TabsTrigger value="year">Year</TabsTrigger>
7 </TabsList>
8 <TabsContent value="day"><p>Daily view.</p></TabsContent>
9 <TabsContent value="week"><p>Weekly view.</p></TabsContent>
10 <TabsContent value="month"><p>Monthly view.</p></TabsContent>
11 <TabsContent value="year"><p>Yearly view.</p></TabsContent>
12</Tabs>

Card tabs

Live preview

Each tab styled as an individual card — supports icons

Content for Analytics

App.tsx
tsx
1<Tabs variant="card" defaultValue="analytics">
2 <TabsList>
3 <TabsTrigger value="analytics" icon="info">Analytics</TabsTrigger>
4 <TabsTrigger value="team" icon="info">Team</TabsTrigger>
5 <TabsTrigger value="settings" icon="settings">Settings</TabsTrigger>
6 <TabsTrigger value="billing" icon="info">Billing</TabsTrigger>
7 </TabsList>
8 <TabsContent value="analytics"><p>Analytics dashboard content.</p></TabsContent>
9 <TabsContent value="team"><p>Team management content.</p></TabsContent>
10 <TabsContent value="settings"><p>Settings content.</p></TabsContent>
11 <TabsContent value="billing"><p>Billing content.</p></TabsContent>
12</Tabs>

Floating pill

Live preview

Elevated floating appearance with shadow on the active tab

Content for Overview

App.tsx
tsx
1<Tabs variant="floating" defaultValue="overview">
2 <TabsList>
3 <TabsTrigger value="overview">Overview</TabsTrigger>
4 <TabsTrigger value="analytics">Analytics</TabsTrigger>
5 <TabsTrigger value="reports">Reports</TabsTrigger>
6 <TabsTrigger value="settings">Settings</TabsTrigger>
7 </TabsList>
8 <TabsContent value="overview"><p>Overview content.</p></TabsContent>
9 <TabsContent value="analytics"><p>Analytics content.</p></TabsContent>
10 <TabsContent value="reports"><p>Reports content.</p></TabsContent>
11 <TabsContent value="settings"><p>Settings content.</p></TabsContent>
12</Tabs>

Bubble

Live preview

Rounded bubble selection on a tinted container

Content for All posts

App.tsx
tsx
1<Tabs variant="bubble" defaultValue="all">
2 <TabsList>
3 <TabsTrigger value="all">All posts</TabsTrigger>
4 <TabsTrigger value="published">Published</TabsTrigger>
5 <TabsTrigger value="drafts">Drafts</TabsTrigger>
6 <TabsTrigger value="archived">Archived</TabsTrigger>
7 </TabsList>
8 <TabsContent value="all"><p>All posts content.</p></TabsContent>
9 <TabsContent value="published"><p>Published posts.</p></TabsContent>
10 <TabsContent value="drafts"><p>Draft posts.</p></TabsContent>
11 <TabsContent value="archived"><p>Archived posts.</p></TabsContent>
12</Tabs>

Gradient active

Live preview

Gradient background on the active tab — great for pricing toggles

Content for Monthly

App.tsx
tsx
1<Tabs variant="gradient" defaultValue="monthly">
2 <TabsList>
3 <TabsTrigger value="monthly">Monthly</TabsTrigger>
4 <TabsTrigger value="yearly">Yearly</TabsTrigger>
5 <TabsTrigger value="lifetime">Lifetime</TabsTrigger>
6 </TabsList>
7 <TabsContent value="monthly"><p>Monthly pricing plans.</p></TabsContent>
8 <TabsContent value="yearly"><p>Yearly pricing — save 20%.</p></TabsContent>
9 <TabsContent value="lifetime"><p>Lifetime access — one-time payment.</p></TabsContent>
10</Tabs>

Vertical (line variant)

Live preview

orientation=vertical stacks the tab list on the left — icons supported

Profile settings

Manage your profile information.

App.tsx
tsx
1<Tabs variant="line" orientation="vertical" defaultValue="profile">
2 <TabsList>
3 <TabsTrigger value="profile" icon="info">Profile</TabsTrigger>
4 <TabsTrigger value="notifications" icon="bell">Notifications</TabsTrigger>
5 <TabsTrigger value="security" icon="lock">Security</TabsTrigger>
6 <TabsTrigger value="billing" icon="info">Billing</TabsTrigger>
7 <TabsTrigger value="advanced" icon="settings">Advanced</TabsTrigger>
8 </TabsList>
9 <TabsContent value="profile">
10 <p className="font-medium">Profile settings</p>
11 <p>Manage your profile information.</p>
12 </TabsContent>
13 <TabsContent value="notifications">
14 <p className="font-medium">Notification preferences</p>
15 <p>Control how you receive notifications.</p>
16 </TabsContent>
17 {/* … other content panels */}
18</Tabs>

Scrollable

Live preview

Overflow tabs scroll horizontally — scroll with mouse wheel or drag

Active: React— scroll left/right to see all tabs

App.tsx
tsx
1const scrollRef = useRef<HTMLDivElement>(null)
2 
3function handleWheel(e: React.WheelEvent<HTMLDivElement>) {
4 e.preventDefault()
5 if (scrollRef.current) scrollRef.current.scrollLeft += e.deltaY
6}
7 
8<div style={{ width: 300, overflow: 'hidden' }}>
9 <div
10 ref={scrollRef}
11 onWheel={handleWheel}
12 style={{
13 display: 'flex',
14 overflowX: 'scroll',
15 borderBottom: '2px solid var(--color-border)',
16 scrollbarWidth: 'none',
17 }}
18 >
19 {['React', 'TypeScript', 'Tailwind', 'Next.js',
20 'Vue', 'Angular', 'Svelte', 'Remix', 'Astro'].map(t => (
21 <button
22 key={t}
23 type="button"
24 style={{ flexShrink: 0, padding: '8px 16px', whiteSpace: 'nowrap' }}
25 >
26 {t}
27 </button>
28 ))}
29 </div>
30</div>

StepTabs — wizard

Live preview

Progress indicator for multi-step flows — done, active, and disabled states

Current step: profile

App.tsx
tsx
1import { StepTabs } from 'omverse-ui'
2 
3const steps = [
4 { value: 'account', label: 'Account', done: true },
5 { value: 'profile', label: 'Profile' },
6 { value: 'plan', label: 'Plan' },
7 { value: 'done', label: 'Done', disabled: true },
8]
9 
10const [step, setStep] = useState('profile')
11 
12<StepTabs value={step} onChange={setStep} steps={steps} />
13 
14<div style={{ marginTop: 16, display: 'flex', gap: 12 }}>
15 <button onClick={() => {
16 const idx = steps.findIndex(s => s.value === step)
17 if (idx > 0) setStep(steps[idx - 1].value)
18 }}>← Back</button>
19 <button onClick={() => {
20 const idx = steps.findIndex(s => s.value === step)
21 const next = steps[idx + 1]
22 if (next && !next.disabled) setStep(next.value)
23 }}>Next</button>
24</div>

With subtitle

Live preview

subtitle prop adds a small secondary line below each tab label

Content for Overview

App.tsx
tsx
1<Tabs variant="underline" defaultValue="overview">
2 <TabsList>
3 <TabsTrigger value="overview" subtitle="All metrics">Overview</TabsTrigger>
4 <TabsTrigger value="revenue" subtitle="$48.2k">Revenue</TabsTrigger>
5 <TabsTrigger value="users" subtitle="2,841 active">Users</TabsTrigger>
6 <TabsTrigger value="conversion" subtitle="3.2%">Conversion</TabsTrigger>
7 </TabsList>
8 <TabsContent value="overview"><p>All metrics overview.</p></TabsContent>
9 <TabsContent value="revenue"><p>Revenue breakdown.</p></TabsContent>
10 <TabsContent value="users"><p>User analytics.</p></TabsContent>
11 <TabsContent value="conversion"><p>Conversion funnel.</p></TabsContent>
12</Tabs>

Tabs props

Props

PropTypeDefaultDescription
defaultValuestringInitially active tab value (uncontrolled)
valuestringControlled active tab value
onValueChange(value: string) => voidCallback fired when the active tab changes
variant'underline' | 'line' | 'pill' | 'filled' | 'bordered' | 'card' | 'floating' | 'bubble' | 'gradient''underline'Visual style of the tab list
orientation'horizontal' | 'vertical''horizontal'Tab list direction
size'sm' | 'md' | 'lg''md'Size of tab labels
childrenReactNodeTabsList + TabsContent components

StepTabs props

Props

PropTypeDefaultDescription
valuestringControlled active step value
onChange(value: string) => voidCallback fired when the active step changes
steps{ value: string; label: string; done?: boolean; disabled?: boolean }[]Step definitions