تخطَّ إلى المحتوى

Tabs

يبدّل بين لوحات محتوى مترابطة في صفحة واحدة. أفقي وعمودي وثلاثة أحجام وأيقونات وفاصل، ومفاتيح أسهم تتبع اتجاه الصفحة.

الإصدار 0.4.1 ·

التبويبات

التثبيت

bunx --bun shadcn@latest add @dga/tabs

الاستخدام

page.tsx
tsx
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";

export function RequestTabs() {
  return (
    <Tabs defaultValue="details">
      <TabsList aria-label="أقسام الطلب">
        <TabsTrigger value="details">التفاصيل</TabsTrigger>
        <TabsTrigger value="documents">المستندات</TabsTrigger>
        <TabsTrigger value="history">السجل</TabsTrigger>
      </TabsList>
      <TabsContent value="details">اسم مقدم الطلب والخدمة وتاريخ التقديم.</TabsContent>
      <TabsContent value="documents">ملفان مرفقان.</TabsContent>
      <TabsContent value="history">قُدّم في ٤ نوفمبر ٢٠٢٦.</TabsContent>
    </Tabs>
  );
}

استخدم Tabs لتقسيم صفحة واحدة إلى أجزاء مترابطة تُقرأ واحدًا بعد آخر: تفاصيل الطلب ومستنداته وسجله. ولا تغيّر التبويبات الصفحة: وللانتقال بين الصفحات استخدم روابط أو قائمة تنقل. والتبويبات ليست خطوات؛ فللتسلسل استخدم مؤشر خطوات. يحتاج كل TabsTrigger إلى value، ويكون TabsContent بالقيمة نفسها لوحته. وأعط القائمة aria-label إن كان في الصفحة أكثر من قائمة.

البنية

  • القائمة (role="tablist"): صف التبويبات، وتحتها فاصل بسمك 3px (divider). وتُمرَّر جانبيًا إن لم تتسع التبويبات.
  • التبويب (role="tab"): أيقونة اختيارية وتسمية. والتبويب المحدد بخط عريض مع شريط بسمك 3px بلون border-primary.
  • اللوحة (role="tabpanel"): محتوى التبويب المحدد.

أمثلة

الأحجام والأيقونات

قيمة size إما sm أو md (الافتراضي) أو lg. ضع أيقونة قبل التسمية. ويمكن الوصول إلى التبويب المعطّل بمفاتيح الأسهم لكن لا يمكن تحديده.

الأحجام والأيقونات

عمودي

يضع orientation="vertical" القائمة بجانب اللوحة، والشريط في جهة النهاية. ويتنقل أعلى وأسفل بين التبويبات.

عمودي

السلوك

افتراضيًا يحرّك مفتاح السهم التركيز ويحدد التبويب. اضبط activateOnFocus={false} على TabsList للتفعيل اليدوي: تحرّك الأسهم التركيز فقط، ويحدد Enter أو Space التبويب. وتزيل divider={false} الخط تحت القائمة، وتزيل flush الحشوة الجانبية، ويجعل value مع onValueChange التحديد في يدك.

السلوك

RTL

تبدأ القائمة من اليمين ويتبادل السهمان يمين ويسار: فبالعربية ينقل اليسار إلى التبويب التالي. وتقرأ المكوّنات الاتجاه من <html dir> بنفسها، فلا تلفّها بموفّر.

LTR (الإنجليزية)
RTL (العربية)

إمكانية الوصول

المفتاحالإجراء
Tabينقل التركيز إلى القائمة (إلى التبويب المحدد) ثم إلى اللوحة.
ArrowRightينتقل إلى التبويب التالي ويفتح لوحته (والسابق بالعربية).
ArrowLeftينتقل إلى التبويب السابق (والتالي بالعربية).
ArrowDownفي القائمة العمودية ينتقل إلى التبويب التالي (وArrowUp إلى السابق).
Homeينتقل إلى التبويب الأول (وEnd إلى الأخير).
  • مبنية على Base UI Tabs: role="tablist" وtab وtabpanel، مع aria-selected وaria-controls وaria-orientation. والتبويب المحدد وحده في ترتيب Tab (تركيز متنقل).
  • يفتح التبويب لوحته بمجرد تركيزه. واللوحة نفسها قابلة للتركيز، فيصل مستخدم لوحة المفاتيح إلى محتوى لا يحوي عنصرًا قابلًا للتركيز.
  • يظهر التبويب المحدد بخط عريض وشريط لا باللون وحده. والنص بنسبة 4.5:1 والأيقونات والشريط 3:1 أو أفضل على كل سطح، فاتحًا وداكنًا. والتركيز حد بسمك 2px داخل التبويب.

مرجع API

Tabs

ينتقل بين لوحات محتوى مترابطة في صفحة واحدة (في DGA: Tabs). تبويب واحد فقط في ترتيب Tab؛ وتنقل مفاتيح الأسهم بين التبويبات (يمين ويسار يتبادلان في الصفحات العربية، وأعلى وأسفل في القائمة العمودية)، وHome وEnd إلى الأول والأخير. ويفتح التبويب لوحته عند التركيز.

خصائص Tabs
الخاصيةالنوعالقيمة الافتراضية
"horizontal" | "vertical"

اتجاه القائمة. تستخدم التبويبات العمودية مفتاحي أعلى وأسفل.

"horizontal"
string | number

التبويب المحدد في البداية (دون تحكم).

لا توجد قيمة افتراضية
(value) => void

تُستدعى بقيمة التبويب الذي حُدد.

لا توجد قيمة افتراضية
string | number

التبويب المحدد بتحكّم خارجي.

لا توجد قيمة افتراضية

يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).

TabsContent

المحتوى الذي يعرضه التبويب. يُخفى ما دام تبويبه غير محدد.

خصائص TabsContent
الخاصيةالنوعالقيمة الافتراضية
string | number

قيمة التبويب الذي تنتمي إليه هذه اللوحة.

لا توجد قيمة افتراضية

يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).

TabsList

صف التبويبات (أو عمودها في Tabs عمودي). أعطه `aria-label` عند وجود أكثر من قائمة.

خصائص TabsList
الخاصيةالنوعالقيمة الافتراضية
"sm" | "md" | "lg"

التباعد والنص: `sm` أو `md` أو `lg`.

"md"
boolean

خط بسمك 3px تحت القائمة (أو بجانبها). الافتراضي `true`.

true
boolean

بلا حشوة جانبية في بداية القائمة.

false
boolean

تُمرَّر جانبيًا بدل الالتفاف عندما لا تتسع التبويبات.

true
boolean

يفتح التبويب لوحته بمجرد أن تركّزه مفاتيح الأسهم. الافتراضي `true`؛ واضبط `false` لفتحها بـ Enter أو Space.

true

يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).

TabsTrigger

تبويب واحد. ضع أيقونة أولًا ثم التسمية.

خصائص TabsTrigger
الخاصيةالنوعالقيمة الافتراضية
boolean

لا يمكن تحديد التبويب. ويبقى في ترتيب مفاتيح الأسهم ليمكن العثور عليه.

لا توجد قيمة افتراضية
string | number

ما يعرّف التبويب. وتظهر اللوحة ذات القيمة نفسها.

لا توجد قيمة افتراضية

يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).

الاختلافات عن DGA

  • علامة التبويب «المزيد» (قائمة فائض في التبويبات الأفقية) غير مبنية. وتُمرَّر القائمة جانبيًا بدلًا منها إن لم تتسع؛ ولقائمة فائض ضع Menu في آخر تبويب.
  • تعرض التبويبات العمودية أيضًا شريطًا محايدًا عند التمرير والضغط (كما في CSS لـ DGA)؛ ويعرض كل تبويب الشريط الأساسي عند تحديده.
التغييرالسبب
Tabs: selected, hover and More tabA scrolling list needs no extra control and keeps every tab reachable with Tab and the arrow keys. The overflow menu is on the roadmap.
Tabs, Content Switcher: arrow keys in RTLThe arrow keys must match what the eyes see, in both directions (WAI-ARIA tabs pattern).

عرض جميع الاختلافات (2) لهذا المكوّن أسباب الاختلافات مكتوبة بالإنجليزية.

التباين

78 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 13 حالة
النمط / الحالةالفاتحالداكن
selected text17.31:1 AAA15.87:1 AAA
unselected text9.73:1 AAA12.04:1 AAA
unselected icon9.73:1 3:112.04:1 3:1
selected icon17.31:1 3:115.87:1 3:1
selected bar4.54:1 3:17.73:1 3:1
focus ring17.31:1 3:117.49:1 3:1
panel text17.31:1 AAA15.87:1 AAA
text / hovered16.44:1 AAA9.59:1 AAA
unselected icon / hovered9.24:1 3:17.28:1 3:1
focus ring / hovered16.44:1 3:110.57:1 3:1
text / pressed14.61:1 AAA6.95:1 AA
unselected icon / pressed8.22:1 3:15.27:1 3:1
focus ring / pressed14.61:1 3:17.66:1 3:1

يحتاج النص إلى تباين 4.5:1، والأيقونات وحلقات التركيز إلى 3:1. الحالات المعطّلة مستثناة. تقرير التباين الكامل