TaavUI Lab
Business Components

TaavBusinessSidebar

shell کسب‌وکار RTL برای پنل‌های DastRanj و VahedYek — سایدبار، مسیر صفحه و ناحیه محتوا در یک کامپوننت؛ presentation-only و data-driven.

import { TaavBusinessSidebar } from "@repo/ui/taav/business";

مسیر صفحه + سایدبار

breadcrumb مسیر کاربر بالای محتوا و هم‌راستا با سایدبار داخل همان TaavBusinessSidebar رندر می‌شود. پیش‌فرض مسیر خانه است. آیتم آخر صفحه فعلی (bold) و بقیه لینک/دکمه بازگشت هستند.

VahedYek-style breadcrumb · shell یکپارچه

Light / Dark

نمونه تم روشن و تیره برای shell یکپارچه سایدبار + مسیر صفحه.

A) DastRanj-style full sidebar

حالت کامل سایدبار دسترنج؛ مناسب زمانی که کاربر باید نام منوها، وضعیت tenant و اکشن‌های سریع را همزمان ببیند. حالت کامل برای استفاده روزمره در پنل، با نمایش عنوان منوها و وضعیت tenant.

placement=right · full · mock app viewport

B) DastRanj-style collapsed sidebar

حالت بسته یا Collapsed؛ برای آزاد کردن فضای صفحه در پنل‌های عملیاتی. در این حالت فقط آیکون‌ها نمایش داده می‌شوند و توضیح هر آیتم از طریق tooltip یا aria-label در دسترس است. حالت فشرده برای زمانی که کاربر به فضای کاری بیشتری نیاز دارد؛ فقط آیکون‌ها نمایش داده می‌شوند.

collapsed · placement=right · icon rail

C) Data-driven example

نمونه داده‌محور؛ نشان می‌دهد که سایدبار مالک route، tenant، auth یا permission نیست و فقط داده و handler از اپ دریافت می‌کند. آیتم فعال باید مسیر فعلی کاربر را نشان دهد و از خود کامپوننت route را تشخیص ندهد.

interactive activeItemId · right-aligned viewport

آیتم فعال: employees

D) Tenant states

نمایش وضعیت tenant مانند active، loading، inactive و error بدون وارد کردن منطق tenant به خود کامپوننت. نمایش وضعیت tenant فقط نمایشی است؛ تغییر tenant و وضعیت واقعی از اپ اصلی پاس داده می‌شود.

tenant active
tenant loading

Quick actions & badges

اکشن‌های سریع برای عملیات پرتکرار مثل خانه، اعلان، تنظیمات یا خروج استفاده می‌شوند.

notification badge
disabled nav item

E) Scroll behavior

فقط بخش منو اسکرول می‌شود؛ header، quick actions و bottom status ثابت می‌مانند. اسکرول باید مینیمال و کم‌جلب‌توجه باشد. اسکرول فقط برای لیست منو است و باید بسیار مینیمال باشد تا تمرکز کاربر را نگیرد.

taav-scrollarea--minimal · menu only scrolls

Props

Propنوعپیش‌فرضتوضیح
navPathTaavBusinessSidebarNavPathItem[][{ label: "خانه" }]breadcrumb بالای محتوا — هم‌راستا با سایدبار
navPath[].labelstringبرچسب هر سطح
navPath[].href / onClickstring / fnسطوح قبل از آخر قابل کلیک
showNavPathbooleantrueنمایش نوار مسیر
childrenReactNodeمحتوای اصلی صفحه (سمت چپ سایدبار در RTL)
userTaavBusinessSidebarUserنام، subtitle، avatar
tenantTaavBusinessSidebarTenanttenant name، label/slug، status
itemsTaavBusinessSidebarItem[]آیتم‌های منوی navigation
quickActionsTaavBusinessSidebarQuickAction[]میانبرهای toolbar
activeItemIdstringشناسه آیتم فعال (از app)
variant'dastranj' | 'default'dastranjتم بصری
placement'left' | 'right'rightلنگر فیزیکی سایدبار — DastRanj از right استفاده می‌کند
width'compact' | 'default' | 'wide'defaultعرض expanded
collapsedbooleanحالت جمع‌شده controlled
defaultCollapsedbooleanfalseحالت جمع‌شده uncontrolled
collapsiblebooleantrueنمایش دکمه collapse/expand
lockCollapsedbooleanقفل collapsed و مخفی کردن toggle
loadingbooleanplaceholder loading برای user/tenant
versionstringبرچسب نسخه در footer
onNavigate(item) => voidکلیک آیتم منو
onTenantSwitch() => voidدکمه تغییر tenant
onTenantPanelClick() => voidکلیک پنل tenant پایین
onLogout() => voidhandler خروج (fallback toolbar)
onCollapsedChange(collapsed: boolean) => voidتغییر collapse

Design specs

Nav pathnavPath prop — top of content column, aligned with sidebar rail
Placementplacement="right" (default) — DastRanj RTL app shell
Collapsed width52px — icon rail with tooltips
Scrolltaav-scrollarea--minimal (3px, hover reveal)
Collapsed tenantCompact teal strip + status dot
Active (collapsed)Teal tint + inset border accent
Collapsiblecollapsible=true shows footer toggle

Accessibility

راهنمای استفاده در DastRanj / VahedYek

  • در collapsed همه آیتم‌های icon-only دارای aria-label و tooltip هستند.
  • Nav items از aria-current="page" برای آیتم فعال استفاده می‌کنند.
  • Nav path از aria-current="page" برای آیتم فعلی breadcrumb استفاده می‌کند.
  • Quick actions و collapse toggle دارای aria-label/title و aria-expanded هستند.
  • آیتم disabled با aria-disabled مشخص می‌شود.
  • focus-visible ring روی menu items، actions و collapse button.
  • اسکرول منو با scrollbar مینیمال — wheel/touch/keyboard همچنان کار می‌کند.

Do / Don't

انجام دهید

  • در محصولات RTL مثل DastRanj از placement="right" استفاده کنید
  • navPath را از router/state اپ پاس دهید — پیش‌فرض خانه
  • collapsed را به‌عنوان icon rail عمدی طراحی‌شده استفاده کنید نه squeeze
  • فقط ناحیه منو را scrollable نگه دارید — header/footer ثابت
  • activeItemId را از router/state app پاس دهید
  • از taav-scrollarea--minimal برای navigation تیره استفاده کنید

انجام ندهید

  • سایدبار را به‌صورت کارت شناور وسط/چپ صفحه render نکنید
  • route detection داخل TaavUI ننویسید
  • breadcrumb را جدا از TaavBusinessSidebar رندر نکنید
  • scrollbar پیش‌فرض خاکستری مرورگر در navigation تیره استفاده نکنید
  • در collapsed برچسب متنی را بدون aria-label/tooltip مخفی نکنید

Migration guidance (DastRanj)

راهنمای استفاده در DastRanj / VahedYek

  • در commit جداگانه: Sidebar.tsx فعلی را با TaavBusinessSidebar جایگزین کنید.
  • APP_MENU_ITEMS و getActiveNavigationItem در app باقی بمانند.
  • localStorage collapse state در PanelShell مدیریت شود.
  • shellClassName="h-full" و padding shell از خود کامپوننت — دیگر py/mr جدا لازم نیست.