Tabs
يبدّل بين لوحات محتوى مترابطة في صفحة واحدة. أفقي وعمودي وثلاثة أحجام وأيقونات وفاصل، ومفاتيح أسهم تتبع اتجاه الصفحة.
الإصدار 0.4.1 ·
التثبيت
bunx --bun shadcn@latest add @dga/tabsالاستخدام
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> بنفسها، فلا تلفّها بموفّر.
إمكانية الوصول
| المفتاح | الإجراء |
|---|---|
| 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 إلى الأول والأخير. ويفتح التبويب لوحته عند التركيز.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
"horizontal" | "vertical"اتجاه القائمة. تستخدم التبويبات العمودية مفتاحي أعلى وأسفل. | "horizontal" | |
| ||
string | numberالتبويب المحدد في البداية (دون تحكم). | لا توجد قيمة افتراضية | |
| ||
(value) => voidتُستدعى بقيمة التبويب الذي حُدد. | لا توجد قيمة افتراضية | |
| ||
string | numberالتبويب المحدد بتحكّم خارجي. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).
TabsContent
المحتوى الذي يعرضه التبويب. يُخفى ما دام تبويبه غير محدد.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
string | numberقيمة التبويب الذي تنتمي إليه هذه اللوحة. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).
TabsList
صف التبويبات (أو عمودها في Tabs عمودي). أعطه `aria-label` عند وجود أكثر من قائمة.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
"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
تبويب واحد. ضع أيقونة أولًا ثم التسمية.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
booleanلا يمكن تحديد التبويب. ويبقى في ترتيب مفاتيح الأسهم ليمكن العثور عليه. | لا توجد قيمة افتراضية | |
| ||
string | numberما يعرّف التبويب. وتظهر اللوحة ذات القيمة نفسها. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Tabs (يفتح في نافذة جديدة).
الاختلافات عن DGA
- علامة التبويب «المزيد» (قائمة فائض في التبويبات الأفقية) غير مبنية. وتُمرَّر القائمة جانبيًا بدلًا منها إن لم تتسع؛ ولقائمة فائض ضع Menu في آخر تبويب.
- تعرض التبويبات العمودية أيضًا شريطًا محايدًا عند التمرير والضغط (كما في CSS لـ DGA)؛ ويعرض كل تبويب الشريط الأساسي عند تحديده.
| التغيير | السبب |
|---|---|
Tabs: selected, hover and More tab | A 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 RTL | The arrow keys must match what the eyes see, in both directions (WAI-ARIA tabs pattern). |
عرض جميع الاختلافات (2) لهذا المكوّن أسباب الاختلافات مكتوبة بالإنجليزية.
التباين
78 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 13 حالةإخفاء
| النمط / الحالة | الفاتح | الداكن |
|---|---|---|
| selected text | 17.31:1 AAA | 15.87:1 AAA |
| unselected text | 9.73:1 AAA | 12.04:1 AAA |
| unselected icon | 9.73:1 3:1 | 12.04:1 3:1 |
| selected icon | 17.31:1 3:1 | 15.87:1 3:1 |
| selected bar | 4.54:1 3:1 | 7.73:1 3:1 |
| focus ring | 17.31:1 3:1 | 17.49:1 3:1 |
| panel text | 17.31:1 AAA | 15.87:1 AAA |
| text / hovered | 16.44:1 AAA | 9.59:1 AAA |
| unselected icon / hovered | 9.24:1 3:1 | 7.28:1 3:1 |
| focus ring / hovered | 16.44:1 3:1 | 10.57:1 3:1 |
| text / pressed | 14.61:1 AAA | 6.95:1 AA |
| unselected icon / pressed | 8.22:1 3:1 | 5.27:1 3:1 |
| focus ring / pressed | 14.61:1 3:1 | 7.66:1 3:1 |
يحتاج النص إلى تباين 4.5:1، والأيقونات وحلقات التركيز إلى 3:1. الحالات المعطّلة مستثناة. تقرير التباين الكامل