Tabs
نمای کلیimport { Tabs, TabsContent, TabsDivider, TabsList, TabsTrigger } from '@nili/ui';این همان صفحهی نمای کلیِ خود کتابخانه است که زنده رندر میشود. زبان یا تم را از هدر عوض کنید، همراهش میآید.
افقی
حالت پیشفرض. label مجموعهٔ تبها را نامگذاری میکند — بدون آن صفحهخوان فقط «فهرست تب» را اعلام میکند و بس، که در صفحهای با سهتا از اینها بیفایده است.
نام، عکس و معرفی شما.
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@nili/ui"
export function Example() {
return (
<Tabs defaultValue="profile">
<TabsList label={t('settings.label')}>
<TabsTrigger value="profile">{t('tab.profile')}</TabsTrigger>
<TabsTrigger value="security">{t('tab.security')}</TabsTrigger>
<TabsTrigger value="alerts">{t('tab.alerts')}</TabsTrigger>
</TabsList>
<TabsContent value="profile">Your name, photo and bio.</TabsContent>
<TabsContent value="security">Password and two-factor.</TabsContent>
<TabsContent value="alerts">What we email you about.</TabsContent>
</Tabs>
)
}آیکونها و بَجها
startIcon و endIcon منطقیاند، پس در هر دو جهت جلو میافتند. badge هر نودی را میگیرد — یک عدد خالی یا یک Badge کامل.
نام، عکس و معرفی شما.
import { Tabs, TabsList, TabsTrigger, TabsContent, Badge, Icon } from "@nili/ui"
import { RiUser3Line, RiNotification3Line } from "@remixicon/react"
export function Example() {
return (
<Tabs defaultValue="profile">
<TabsList label="Account settings">
<TabsTrigger value="profile" startIcon={<Icon icon={RiUser3Line} />}>
{t('tab.profile')}
</TabsTrigger>
<TabsTrigger
value="alerts"
startIcon={<Icon icon={RiNotification3Line} />}
badge={<Badge size="small" color="red">3</Badge>}
>
{t('tab.alerts')}
</TabsTrigger>
</TabsList>
…
</Tabs>
)
}کشیده
stretch باعث میشود تبها عرض را بین خودشان تقسیم کنند بهجای اینکه اندازهٔ برچسبشان بمانند — برای یک کنترل بخشبندیشده داخل کارت یا شیت موبایل مناسب است.
هفت روز گذشته.
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@nili/ui"
export function Example() {
return (
<Tabs defaultValue="week">
<TabsList stretch label={t('range.label')}>
<TabsTrigger value="day">{t('range.day')}</TabsTrigger>
<TabsTrigger value="week">{t('range.week')}</TabsTrigger>
<TabsTrigger value="month">{t('range.month')}</TabsTrigger>
</TabsList>
…
</Tabs>
)
}عمودی
appearance فقط روی تبهای عمودی اثر دارد — منوی افقی در طراحی محور سبک ندارد. TabsDivider یک گروه از تبها را با خط جدا میکند.
نام، عکس و معرفی شما.
نام، عکس و معرفی شما.
import { Tabs, TabsList, TabsTrigger, TabsContent, TabsDivider } from "@nili/ui"
export function Example() {
return (
<Tabs defaultValue="profile" orientation="vertical" appearance="card">
<TabsList label="Settings">
<TabsTrigger value="profile">{t('tab.profile')}</TabsTrigger>
<TabsTrigger value="security">{t('tab.security')}</TabsTrigger>
<TabsDivider />
<TabsTrigger value="usage">Usage</TabsTrigger>
</TabsList>
…
</Tabs>
)
}حالت فعالسازی و keepMounted
automatic تب را همین که فوکوس به آن برسد انتخاب میکند — پیشفرض ARIA، و وقتی پنلها ارزاناند درست است. اگر تبی داده بارگیری میکند از manual استفاده کنید: عبور با کلید جهت از کنار چهار تب نباید چهار درخواست بفرستد. keepMounted موقعیت اسکرول و وضعیت فرم را در پنل پنهان نگه میدارد.
با کلید جهت بین تبها حرکت کنید — با `manual` تا Enter یا Space نزنید چیزی عوض نمیشود.
این پنل هنگام پنهانبودن هم سوارشده میماند.
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@nili/ui"
export function Example() {
return (
<Tabs defaultValue="overview" activationMode="manual">
<TabsList label={t('report.label')}>
<TabsTrigger value="overview">{t('report.overview')}</TabsTrigger>
<TabsTrigger value="chart">{t('report.chart')}</TabsTrigger>
</TabsList>
<TabsContent value="overview">Cheap to render.</TabsContent>
{/* expensive to rebuild — keep it mounted */}
<TabsContent value="chart" keepMounted>
<RevenueChart />
</TabsContent>
</Tabs>
)
}Tabs
extends Omit< ComponentPropsWithoutRef<'div'>, 'onChange' | 'defaultValue' >
بقیهی پراپها
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| children | ReactNode | — | |
| aria-label | string | — | |
| value | string | — | Selected tab. Controlled. |
| defaultValue | string | ||
| onValueChange | (value: string) => void | — | |
| orientation | horizontal | vertical | horizontal | |
| appearance | card | list | list | Figma's `Style (Card | List)`. Vertical only — the horizontal tab menu has no style axis in the design. |
| activationMode | automatic | manual | automatic |
TabsContent
extends ComponentPropsWithoutRef<'div'>
بقیهی پراپها
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| children | ReactNode | — | |
| aria-label | string | — | |
| value* | string | — | |
| keepMounted | boolean | false | Keep the panel mounted while hidden. Off by default: an unmounted panel cannot run effects or hold stale data. Turn it on to preserve scroll position, form state or a chart that is expensive to rebuild. |
TabsDivider
TabsList
extends ComponentPropsWithoutRef<'div'>
محورهای واریانت — از تعریف cva کامپوننت
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| stretch | boolean | false | Tabs share the width instead of hugging their labels. |
| orientation | horizontal | vertical | horizontal | |
| appearance | card | list | list |
بقیهی پراپها
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| children | ReactNode | — | |
| aria-label | string | — | |
| label | string | — | Accessible name for the tab set, e.g. `'Account settings'`. |
TabsTrigger
extends Omit< ComponentPropsWithoutRef<'button'>, 'value' >
محورهای واریانت — از تعریف cva کامپوننت
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| orientation | horizontal | vertical | horizontal | |
| appearance | card | list | list | |
| selected | 'true' | 'false' | false |
بقیهی پراپها
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| children | ReactNode | — | |
| disabled | boolean | — | |
| required | boolean | — | |
| readOnly | boolean | — | |
| value* | string | — | Ties the tab to its panel. Must be unique within one `Tabs`. |
| defaultValue | string | — | |
| name | string | — | |
| aria-label | string | — | |
| startIcon | ReactNode | — | Figma's "Left Icon". Logical, so it leads in both directions. |
| endIcon | ReactNode | — | Figma's "Right Icon". |
| badge | ReactNode | — | Figma's "Number" — a count or a `<Badge>`, after the label. |