Content Switcher
صف قصير من خيارين إلى أربعة يبدّل العرض تحته. ثلاثة أحجام ونسخة للألوان الداكنة، ويبقى خيار واحد مختارًا دائمًا.
الإصدار 0.4.1 ·
التثبيت
bunx --bun shadcn@latest add @dga/content-switcherالاستخدام
import { useState } from "react";
import { ContentSwitcher, ContentSwitcherItem } from "@/components/ui/content-switcher";
export function PeriodSwitcher() {
const [period, setPeriod] = useState("week");
return (
<ContentSwitcher value={period} onValueChange={setPeriod} aria-label="الفترة">
<ContentSwitcherItem value="day">يوم</ContentSwitcherItem>
<ContentSwitcherItem value="week">أسبوع</ContentSwitcherItem>
<ContentSwitcherItem value="month">شهر</ContentSwitcherItem>
</ContentSwitcher>
);
}استخدم Content Switcher لتغيير طريقة عرض مجموعة محتوى واحدة: عرض يومي أو أسبوعي أو شهري، أو قائمة أو خريطة. وتعرض كل الخيارات النوع نفسه من الأشياء. ولأقسام محتوى منفصلة استخدم Tabs؛ ولاختيار يُحفظ في نموذج استخدم Radio. أبقِ الخيارات بين اثنين وأربعة بتسميات قصيرة. وسمِّ المجموعة بـ aria-label، وضع المحتوى الذي تتحكم فيه تحتها مباشرة.
البنية
- المبدّل (
role="group"): المسار، بلون neutral-100 وحد 1px. بارتفاع 32 أو 40 أو 48px. - الخيار (زر تبديل مع
aria-pressed): تسمية وأيقونة اختيارية. وللخيار المختار تعبئة أساسية وتسمية بيضاء.
أمثلة
الأحجام
قيمة size إما sm أو md (الافتراضي) أو lg. وتشترك المبدّلات الثلاثة هنا في قيمة واحدة.
على لون العلامة
يلائم onColor خلفية بلون العلامة: مسار أسود شفاف وخيار مختار أبيض.
معطّل وبأيقونات ومُدار
يبقى الخيار المعطّل ظاهرًا ولا يمكن اختياره. ضع أيقونة أولًا في الخيار حين تفيد، ومرّر value مع onValueChange لتملك التحديد.
RTL
يقع الخيار الأول على اليمين ويتبادل السهمان يمين ويسار. وعرض المبدّل بقدر خياراته؛ أعطه className="w-full" ليملأ صفًا.
إمكانية الوصول
| المفتاح | الإجراء |
|---|---|
| Tab | ينقل التركيز إلى المبدّل (إلى الخيار المختار) ثم يخرج منه. |
| ArrowRight | ينقل التركيز إلى الخيار التالي (والسابق بالعربية). |
| ArrowLeft | ينقل التركيز إلى الخيار السابق (والتالي بالعربية). |
| Enter | يختار الخيار المركَّز. |
| Space | يختار الخيار المركَّز. |
- مبنية على Base UI Toggle Group:
groupمن أزرار معaria-pressed، وأحدها في ترتيب Tab (تركيز متنقل). واختيار الخيار المضغوط مرة أخرى لا يفعل شيئًا، فيبقى خيار واحد مختارًا دائمًا. - يظهر الخيار المختار من التعبئة ومن
aria-pressed. والتسمية بنسبة 4.5:1 على المسار، وتعبئة المختار 3:1 مقابله، فاتحًا وداكنًا. والتركيز حد بسمك 2px داخل الخيار. - إن تغيّر المحتوى تحته فأعلِن عنه: ضعه في منطقة
aria-live="polite"أو انقل التركيز إليه.
مرجع API
ContentSwitcher
صف قصير من خيارين إلى أربعة يبدّل العرض تحته (في DGA: Content Switcher). يبقى خيار واحد مختارًا دائمًا. وخيار واحد في ترتيب Tab؛ وتنقل مفاتيح الأسهم بين الخيارات (يمين ويسار يتبادلان في الصفحات العربية). سمّه بـ `aria-label`.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
"sm" | "md" | "lg"الارتفاع: `sm` 32px، و`md` 40px، و`lg` 48px. | "md" | |
| ||
booleanللخلفيات ذات لون العلامة (`background-primary`، وترويسة التنقل). | false | |
| ||
stringالخيار المختار بتحكّم خارجي. | لا توجد قيمة افتراضية | |
| ||
stringالخيار المختار في البداية (دون تحكم). الأول إن لم تحدده. | لا توجد قيمة افتراضية | |
| ||
(value: string) => voidتُستدعى بالقيمة الجديدة. يبقى خيار مختار دائمًا فلا تكون فارغة. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Toggle (يفتح في نافذة جديدة).
ContentSwitcherItem
خيار واحد. قيمته `value` هي ما يبلّغ عنه ContentSwitcher. ضع أيقونة أولًا إن لزمت.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
stringما يعرّف الخيار. | لا توجد قيمة افتراضية | |
| ||
booleanلا يمكن اختيار الخيار. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Toggle (يفتح في نافذة جديدة).
الاختلافات عن DGA
- في Figma عنصران أو ثلاثة بتسمية بيضاء ونسخة OnColor؛ بينما لا يضبط CSS إلا
margin: 10px. وصُمّم المسار وتعبئة المختار هنا من رموز الأزرار. - على خلفية العلامة يكون المسار أسود شفافًا لا أبيض: فالأبيض يُفتّح التعبئة ويخفض التسمية البيضاء إلى 3.34:1 (و2.81:1 عند الضغط).
| التغيير | السبب |
|---|---|
Content Switcher: design and on-colour | White on a white-lightened brand fill is 3.34:1 (down to 2.81:1 pressed); a darkened track keeps 4.5:1 or better, as the on-colour buttons do. |
عرض جميع الاختلافات (1) لهذا المكوّن أسباب الاختلافات مكتوبة بالإنجليزية.
التباين
40 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 14 حالةإخفاء
| النمط / الحالة | الفاتح | الداكن |
|---|---|---|
| option text / default | 16.44:1 AAA | 14.42:1 AAA |
| focus ring / default | 16.44:1 3:1 | 15.89:1 3:1 |
| option text / hovered | 16.44:1 AAA | 9.59:1 AAA |
| focus ring / hovered | 16.44:1 3:1 | 10.57:1 3:1 |
| option text / pressed | 14.61:1 AAA | 6.95:1 AA |
| focus ring / pressed | 14.61:1 3:1 | 7.66:1 3:1 |
| chosen text | 4.74:1 AA | 4.74:1 AA |
| chosen fill | 4.31:1 3:1 | 3.34:1 3:1 |
| on-colour / option text | 6.30:1 AA | 6.30:1 AA |
| on-colour / option text, hovered | 7.31:1 AAA | 7.31:1 AAA |
| on-colour / option text, pressed | 8.46:1 AAA | 8.46:1 AAA |
| on-colour / chosen text | 6.60:1 AA | 6.60:1 AA |
| on-colour / chosen fill | 4.74:1 3:1 | 4.74:1 3:1 |
| on-colour / focus ring | 4.74:1 3:1 | 4.74:1 3:1 |
يحتاج النص إلى تباين 4.5:1، والأيقونات وحلقات التركيز إلى 3:1. الحالات المعطّلة مستثناة. تقرير التباين الكامل