Sidebar
نوار کناری کامل برای داشبورد: جمع میشود، روی موبایل به کشو تبدیل میشود، حالتش در کوکی میماند و با Ctrl+B باز و بسته میشود. لبهاش منطقی است، پس در چیدمان راستبهچپ خودش سمت راست مینشیند.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/sidebar.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/sidebar.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/sidebar.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/sidebar.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
// app/layout.tsx یا لایهٔ داشبورد
import {
Sidebar,
SidebarInset,
SidebarProvider,
SidebarTrigger,
} from "@/components/ui/sidebar"
<SidebarProvider defaultOpen={sidebarOpenFromCookie}>
<Sidebar>…</Sidebar>
<SidebarInset>
<header className="flex h-14 items-center gap-2 border-b px-4">
<SidebarTrigger />
<h1 className="text-sm font-medium">داشبورد</h1>
</header>
{children}
</SidebarInset>
</SidebarProvider>این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
دسترسپذیری
- SidebarTrigger یک دکمهٔ واقعی با متن sr-only است؛ میانبر Ctrl+B هم همان کار را میکند.
- روی موبایل محتوا داخل کشو (Sheet) میرود که فوکوس را قفل میکند و با Escape بسته میشود؛ عنوان کشو برای صفحهخوان تعریف شده است.
- SidebarMenuButton را با asChild روی Link بگذارید تا لینک واقعی بماند و برای صفحهٔ فعلی isActive و aria-current بدهید.
- در حالت جمعشدهٔ آیکونی، متن دکمهها پنهان میشود؛ برای هر دکمه tooltip بدهید تا معنایش از دست نرود.
- SidebarRail یک هدف کلیک نازک کنار نوار است که tabIndex=-1 دارد و از ناوبری صفحهکلید بیرون میماند، چون همان کار تریگر را تکرار میکند.
مرجع API
SidebarProvider
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| defaultOpen | boolean | true | حالت اولیه؛ برای حفظ انتخاب کاربر، کوکی sidebar_state را در سرور بخوانید و اینجا بدهید. |
| open / onOpenChange | boolean / (open: boolean) => void | — | کنترل کامل حالت از بیرون. |
| style | React.CSSProperties | — | برای تغییر عرضها: --sidebar-width و --sidebar-width-icon. |
Sidebar
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| side | "start" | "end" | "start" | لبهٔ منطقی؛ در راستبهچپ start یعنی سمت راست صفحه. |
| variant | "sidebar" | "floating" | "inset" | "sidebar" | چسبیده به لبه، شناور با کادر و سایه، یا فرورفته با فاصله از لبهها. |
| collapsible | "offcanvas" | "icon" | "none" | "offcanvas" | کامل از صفحه بیرون میرود، به ستون آیکونی جمع میشود، یا اصلاً جمع نمیشود. |
SidebarMenuButton
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| isActive | boolean | false | صفحهٔ فعلی؛ پسزمینه و وزن متن را تغییر میدهد. |
| tooltip | string | TooltipContentProps | — | فقط در حالت جمعشدهٔ آیکونی روی دسکتاپ نمایش داده میشود. |
| asChild | boolean | false | برای گذاشتن Link نکست بهجای button. |
| variant / size | "default" | "outline" / "default" | "sm" | "lg" | — | ظاهر و ارتفاع دکمه. |
useSidebar
هوک دسترسی به حالت نوار از هر جای درخت.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| state | "expanded" | "collapsed" | — | حالت فعلی روی دسکتاپ. |
| open / setOpen | boolean / (open: boolean) => void | — | باز بودن روی دسکتاپ. |
| openMobile / setOpenMobile | boolean / (open: boolean) => void | — | باز بودن کشو روی موبایل. |
| isMobile | boolean | — | آیا عرض صفحه زیر ۷۶۸ پیکسل است. |
| toggleSidebar | () => void | — | باز و بسته کردن؛ خودش میفهمد موبایل است یا دسکتاپ. |
بقیهٔ اجزا
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| SidebarHeader / SidebarFooter | div | — | بالا و پایین نوار، بیرون از ناحیهٔ اسکرول. |
| SidebarContent | div | — | ناحیهٔ اسکرولشوندهٔ میانی. |
| SidebarGroup / SidebarGroupLabel / SidebarGroupContent | div | — | دستهبندی آیتمها؛ برچسب در حالت آیکونی محو میشود. |
| SidebarMenuBadge / SidebarMenuAction | div / button | — | شمارنده و دکمهٔ عملیات در انتهای آیتم؛ در حالت آیکونی پنهان میشوند. |
| SidebarMenuSkeleton | div | — | جاینگهدار بارگذاری با عرض تصادفیِ پایدار. |
| SidebarInset | main | — | ناحیهٔ محتوای کنار نوار؛ با حالت inset گوشهگرد و سایهدار میشود. |
| SidebarRail | button | — | نوار نازک کنار برای باز و بسته کردن با کلیک. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
در حال دریافت منو (Loading)
منوی خالی نشان ندهید؛ کاربر فکر میکند دسترسی ندارد. با SidebarMenuSkeleton همان تعداد و همان شکل ردیف را جای خالی نشان دهید تا با رسیدن داده، ارتفاع نپرد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
عنوان بلند (Overflow)
SidebarMenuButton خودش truncate میکند، ولی روی برچسب سرگروه هم همین لازم است، چون نوار عرض ثابتی دارد و بزرگشدنش با محتوا چیدمان صفحه را جابهجا میکند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Icon Collapse
با collapsible=«icon» نوار به جای ناپدید شدن، به ستون باریک آیکونی تبدیل میشود. tooltip دکمهها را در همان حالت خوانا نگه میدارد. (در اپ واقعی این نوار به خود پنجره چسبیده است؛ اینجا برای اینکه از کادر نمونه بیرون نزند، داخل همین کادر محدود شده.)
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| در حال دریافت منو (Loading) | پنلی که فهرست بخشهایش از سرور میآید |
| عنوان بلند (Overflow) | نام بخش یا سازمانی که در عرض باریک نوار جا نمیشود |
| Icon Collapse | با collapsible=«icon» نوار به جای ناپدید شدن، به ستون باریک آیکونی تبدیل میشود |
| Submenu | زیرمنو با خط راهنمای منطقی (border-s) که در راستبهچپ سمت راست میافتد. |
دستورالعمل استفاده
راهنمای ابزار برای حالت جمعشده
انجام بده
در حالت آیکونی متن دکمهها پنهان میشود؛ با tooltip معنای هر آیکون را نگه دارید.
انجام نده
بدون tooltip، نوارِ جمعشده یک ستون آیکون بینام است و کاربر باید حدس بزند هر کدام کجا میبرد.
دستهبندی آیتمهای ناوبری
انجام بده
آیتمها را در گروههای عنواندار بچینید تا فهرست بلند نوار قابل مرور بماند.
انجام نده
یک فهرست تخت و بیعنوان، هرچه بلندتر شود پیدا کردن مقصد در آن سختتر میشود.