Tabs
A set of layered sections of content—known as tab panels—that are displayed one at a time.
Account
Make changes to your account here. Click save when you're done.
Password
Change your password here. After saving, you'll be logged out.
import { component$ } from '@builder.io/qwik';
import { Button, Card, Input, Label, Tabs } from '@qwik-ui/styled';
export default component$(() => {
return (
<Tabs.Root class="max-w-[400px]">
<Tabs.List class="grid w-full grid-cols-2">
<Tabs.Tab>Account</Tabs.Tab>
<Tabs.Tab>Password</Tabs.Tab>
</Tabs.List>
<Tabs.Panel>
<Card.Root>
<Card.Header>
<Card.Title>Account</Card.Title>
<Card.Description>
Make changes to your account here. Click save when you're done.
</Card.Description>
</Card.Header>
<Card.Content class="space-y-2">
<div class="space-y-1">
<Label for="name">Name</Label>
<Input id="name" value="Pedro Duarte" />
</div>
<div class="space-y-1">
<Label for="username">Username</Label>
<Input id="username" value="~peduarte" />
</div>
</Card.Content>
<Card.Footer>
<Button>Save changes</Button>
</Card.Footer>
</Card.Root>
</Tabs.Panel>
<Tabs.Panel>
<Card.Root>
<Card.Header>
<Card.Title>Password</Card.Title>
<Card.Description>
Change your password here. After saving, you'll be logged out.
</Card.Description>
</Card.Header>
<Card.Content class="space-y-2">
<div class="space-y-1">
<Label for="current">Current password</Label>
<Input id="current" type="password" />
</div>
<div class="space-y-1">
<Label for="new">New password</Label>
<Input id="new" type="password" />
</div>
</Card.Content>
<Card.Footer>
<Button>Save password</Button>
</Card.Footer>
</Card.Root>
</Tabs.Panel>
</Tabs.Root>
);
});
Installation
Run the following cli command or copy/paste the component code into your project
qwik-ui add tabs
import { Slot, component$, type PropsOf } from '@builder.io/qwik';
import { Tabs as HeadlessTabs } from '@qwik-ui/headless';
import { cn } from '@qwik-ui/utils';
const Root = (props: PropsOf<typeof HeadlessTabs.Root>) => (
<HeadlessTabs.Root
{...props}
tabListComponent={List}
tabComponent={Tab}
tabPanelComponent={Panel}
/>
);
const List = component$<PropsOf<typeof HeadlessTabs.List>>((props) => {
return (
<HeadlessTabs.List
{...props}
class={cn(
'inline-flex items-center justify-center rounded-lg border-base bg-muted p-1 text-muted-foreground shadow-sm',
props.class,
)}
>
<Slot />
</HeadlessTabs.List>
);
});
const Tab = component$<PropsOf<typeof HeadlessTabs.Tab>>((props) => {
return (
<HeadlessTabs.Tab
{...props}
class={cn(
'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-2 font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=selected]:border-base data-[state=selected]:bg-background data-[state=selected]:text-foreground data-[state=selected]:shadow-inner',
props.class,
)}
>
<Slot />
</HeadlessTabs.Tab>
);
});
const Panel = component$<PropsOf<typeof HeadlessTabs.Panel>>((props) => {
return (
<HeadlessTabs.Panel
{...props}
class={cn(
'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
props.class,
)}
>
<Slot />
</HeadlessTabs.Panel>
);
});
export const Tabs = {
Root,
List,
Tab,
Panel,
};
Usage
import { Tabs } from '~/components/ui';
<Tabs.Root>
<Tabs.List>
<Tabs.Tab>Tab 1</Tabs.Tab>
<Tabs.Tab>Tab 2</Tabs.Tab>
<Tabs.Tab>Tab 3</Tabs.Tab>
</Tabs.List>
<Tabs.Panel>Panel 1</Tabs.Panel>
<Tabs.Panel>Panel 2</Tabs.Panel>
<Tabs.Panel>Panel 3</Tabs.Panel>
</Tabs.Root>