پرتوپرتو

تب‌ها (Tabs)

کامپوننت سازماندهی محتوا در تب‌های قابل تعویض

معرفی

کامپوننت Tabs برای سازماندهی محتوا در بخش‌های جداگانه که قابل تعویض هستند استفاده می‌شود.

چه زمانی استفاده کنیم:

  • وقتی محتوای مرتبط را در view های موازی سازماندهی می‌کنید
  • برای جابجایی بین بخش‌های مختلف بدون تغییر صفحه
  • وقتی کاربر نیاز دارد بین ۲ تا ۵ بخش رفت‌وبرگشت کند

چه زمانی استفاده نکنیم:

  • برای محتوای collapsible — از Accordion استفاده کنید
  • برای flow های step-by-step — از Stepper استفاده کنید
  • وقتی بیش از ۵-۶ تب دارید — از DropdownMenu یا ناوبری دیگری استفاده کنید

استفاده

سفارش‌های امروز

۲۳ سفارش جدید ثبت شد.

import {
  Tabs,
  TabsList,
  TabsTrigger,
  TabsContent,
  Card,
  CardHeader,
  CardTitle,
  CardDescription,
} from '@parto-system-design/ui'
;<Tabs defaultValue="tab1" className="w-full max-w-xl">
  <TabsList className="grid grid-cols-3">
    <TabsTrigger value="tab1">تب اول</TabsTrigger>
    <TabsTrigger value="tab2">تب دوم</TabsTrigger>
    <TabsTrigger value="tab3">تب سوم</TabsTrigger>
  </TabsList>
  <TabsContent value="tab1">
    <Card>
      <CardHeader>
        <CardTitle>مرور کلی</CardTitle>
        <CardDescription>آمار امروز را مشاهده کنید.</CardDescription>
      </CardHeader>
    </Card>
  </TabsContent>
  <TabsContent value="tab2">
    <Card>
      <CardHeader>
        <CardTitle>فروش</CardTitle>
        <CardDescription>گزارش فروش هفتگی.</CardDescription>
      </CardHeader>
    </Card>
  </TabsContent>
  <TabsContent value="tab3">
    <Card>
      <CardHeader>
        <CardTitle>اعلان‌ها</CardTitle>
        <CardDescription>سه اعلان جدید دارید.</CardDescription>
      </CardHeader>
    </Card>
  </TabsContent>
</Tabs>

حالت‌ها و انواع

مثال کامل

<Tabs defaultValue="account" className="w-[400px]">
  <TabsList className="grid w-full grid-cols-2">
    <TabsTrigger value="account">حساب کاربری</TabsTrigger>
    <TabsTrigger value="password">رمز عبور</TabsTrigger>
  </TabsList>
  <TabsContent value="account">
    <Card>
      <CardHeader>
        <CardTitle>حساب کاربری</CardTitle>
        <CardDescription>تغییرات حساب کاربری خود را اینجا اعمال کنید.</CardDescription>
      </CardHeader>
      <CardContent className="space-y-2">
        <div className="space-y-1">
          <label htmlFor="name">نام</label>
          <Input id="name" defaultValue="علی احمدی" />
        </div>
      </CardContent>
      <CardFooter>
        <Button>ذخیره تغییرات</Button>
      </CardFooter>
    </Card>
  </TabsContent>
  <TabsContent value="password">
    <Card>
      <CardHeader>
        <CardTitle>رمز عبور</CardTitle>
        <CardDescription>رمز عبور خود را تغییر دهید.</CardDescription>
      </CardHeader>
      <CardContent className="space-y-2">
        <div className="space-y-1">
          <label htmlFor="current">رمز فعلی</label>
          <Input id="current" type="password" />
        </div>
        <div className="space-y-1">
          <label htmlFor="new">رمز جدید</label>
          <Input id="new" type="password" />
        </div>
      </CardContent>
      <CardFooter>
        <Button>ذخیره رمز عبور</Button>
      </CardFooter>
    </Card>
  </TabsContent>
</Tabs>

ترکیب کامپوننت‌ها

Tabs از چهار جزء اصلی تشکیل شده است:

  • Tabs: کانتینر اصلی و مدیریت state
  • TabsList: کانتینر دکمه‌های تب
  • TabsTrigger: دکمه انتخاب تب
  • TabsContent: محتوای هر تب

Props

Tabs

Prop

Type

TabsTrigger

Prop

Type

دسترسی‌پذیری

  • پیمایش با کیبورد (Arrow keys) پشتیبانی می‌شود
  • از role="tablist" و role="tab" استفاده می‌شود
  • aria-selected برای تب فعال تنظیم می‌شود
  • aria-controls برای ارتباط تب با محتوا

تعامل با کیبورد

  • Arrow Right / Arrow Left: حرکت بین تب‌ها (در RTL جهت معکوس) - Home: رفتن به اولین تب - End: رفتن به آخرین تب
  • Enter یا Space: فعال‌سازی تب انتخاب‌شده

راهنمای استفاده

بکنید

  • همیشه defaultValue تعیین کنید تا تب اولیه مشخص باشد - عناوین تب‌ها را کوتاه و گویا نگه دارید (حداکثر ۲-۳ کلمه) - محتوای هر تب را مستقل نگه دارید تا کاربر نیازی به رفت‌وبرگشت نداشته باشد

نکنید

  • بیش از ۵-۶ تب نگذارید — از DropdownMenu یا ناوبری دیگری استفاده کنید - از Tabs برای flow های ترتیبی استفاده نکنید — از Stepper استفاده کنید - محتوای حیاتی را در تب‌های غیرفعال پنهان نکنید — کاربر ممکن است آن‌ها را نبیند

ملاحظات RTL

  • TabsList به‌صورت خودکار راست‌چین می‌شود
  • کلیدهای پیمایش به‌درستی در RTL عمل می‌کنند
  • فاصله‌گذاری با Logical Properties

کامپوننت‌های مرتبط

  • Accordion — وقتی محتوا باید تاشو باشد و کاربر فقط یک بخش را در لحظه ببیند
  • Stepper — وقتی مراحل ترتیبی دارید و کاربر باید گام‌به‌گام پیش برود
  • ToggleGroup — وقتی فقط انتخاب مهم است و محتوای مرتبط با هر گزینه ندارید