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

Content Switcher

صف قصير من خيارين إلى أربعة يبدّل العرض تحته. ثلاثة أحجام ونسخة للألوان الداكنة، ويبقى خيار واحد مختارًا دائمًا.

الإصدار 0.4.1 ·

مبدّل المحتوى

التثبيت

bunx --bun shadcn@latest add @dga/content-switcher

الاستخدام

page.tsx
tsx
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" ليملأ صفًا.

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

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

المفتاحالإجراء
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`.

خصائص ContentSwitcher
الخاصيةالنوعالقيمة الافتراضية
"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. ضع أيقونة أولًا إن لزمت.

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

ما يعرّف الخيار.

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

لا يمكن اختيار الخيار.

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

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

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

  • في Figma عنصران أو ثلاثة بتسمية بيضاء ونسخة OnColor؛ بينما لا يضبط CSS إلا margin: 10px. وصُمّم المسار وتعبئة المختار هنا من رموز الأزرار.
  • على خلفية العلامة يكون المسار أسود شفافًا لا أبيض: فالأبيض يُفتّح التعبئة ويخفض التسمية البيضاء إلى 3.34:1 (و2.81:1 عند الضغط).
التغييرالسبب
Content Switcher: design and on-colourWhite 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 / default16.44:1 AAA14.42:1 AAA
focus ring / default16.44:1 3:115.89:1 3:1
option text / hovered16.44:1 AAA9.59:1 AAA
focus ring / hovered16.44:1 3:110.57:1 3:1
option text / pressed14.61:1 AAA6.95:1 AA
focus ring / pressed14.61:1 3:17.66:1 3:1
chosen text4.74:1 AA4.74:1 AA
chosen fill4.31:1 3:13.34:1 3:1
on-colour / option text6.30:1 AA6.30:1 AA
on-colour / option text, hovered7.31:1 AAA7.31:1 AAA
on-colour / option text, pressed8.46:1 AAA8.46:1 AAA
on-colour / chosen text6.60:1 AA6.60:1 AA
on-colour / chosen fill4.74:1 3:14.74:1 3:1
on-colour / focus ring4.74:1 3:14.74:1 3:1

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