مفتاح التبديل (Switch)

يتيح لك مكوّن مفتاح التبديل (Switch) تشغيل إعداد أو إيقافه.

التثبيت

bash
npx @smicolon/cli add switch

قبل إضافة أي مكوّن، شغّل الأمر init مرة واحدة في مشروعك. التفاصيل في صفحة التثبيت.

معاينة

الأنماط (variant)

يأتي مفتاح التبديل بنمطين (variant) كما في Figma. النمط (variant) solid هو الافتراضي، ويملأ المسار باللون الأساسي عند التشغيل. أما النمط (variant) outline فيُبقي المسار بلون خلفية الصفحة ويرسم حوله خطًا بسماكة 1px، ويلوّن المقبض بدلًا منه.

solid
outline

الأحجام

يتوفر مفتاح التبديل بثلاثة أحجام، والحجم الافتراضي هو md. يبلغ عرض المسار 32 أو 40 أو 48px، ويبقى حجم التسمية ثابتًا.

solid
outline

التخطيط (layout)

في التخطيط (layout) الافتراضي control-first يأتي المسار قبل التسمية، ويبدأ الوصف تحت التسمية مباشرة. أما التخطيط (layout) label-first فيضع التسمية في بداية سطر بعرض كامل والمسار في نهايته، وهو مناسب لقوائم الإعدادات.

control-first
label-first

الحالات

تأتي حالة التركيز (focus) من CSS مباشرة، لا من خاصية. انتقل إلى مفتاح التبديل بمفتاح Tab لترى حلقة التركيز. وعند التعطيل يظهر المكوّن كله باهتًا، بما فيه التسمية والوصف.

solid
outline

إتاحة الوصول (accessibility)

  • يعمل مفتاح التبديل مع لوحة المفاتيح تلقائيًا: تبدّل حالته بمفتاح المسافة، ويُرسَل مع النموذج دون شيفرة إضافية، لأنه مبني على عنصر <input type="checkbox" role="switch"> الأصلي.
  • يقرأ قارئ الشاشة نص description بعد التسمية مباشرة، لأنه مرتبط بمفتاح التبديل عبر aria-describedby. أما المسار المرسوم فمخفي عن قارئ الشاشة.
  • أضف aria-label لمفتاح التبديل الذي يظهر بلا label، ليعرف قارئ الشاشة ما يتحكم فيه.
  • يتبع مفتاح التبديل اتجاه الصفحة المحدد في السمة (attribute) dir، فيتحرك المقبض دائمًا نحو نهاية السطر عند التشغيل.

الخصائص (props)

الخاصيةالنوعالافتراضيالوصف
variant"solid" | "outline""solid"مسار مملوء أو مسار بإطار.
layout"control-first" | "label-first""control-first"المسار قبل التسمية أو بعدها.
size"sm" | "md" | "lg""md"حجم مفتاح التبديل.
checkedbooleanلا يوجدحالة التشغيل، وتُستخدم مع onChange.
defaultCheckedbooleanfalseالحالة الأولى عندما لا تتحكم بالقيمة.
disabledbooleanfalseيعطّل المفتاح ويُظهره باهتًا.
labelstringلا يوجدنص التسمية.
descriptionstringلا يوجدسطر ثانوي تحت التسمية.
namestringلا يوجدالاسم الذي يُرسَل مع النموذج.
onChange(event) => voidلا يوجدتُستدعى عند تغيير حالة المفتاح.
classNamestringلا يوجدأصناف (class) إضافية للمكوّن.

الاستخدام

tsx
import { Switch } from "@/components/ui/switch"

// مفتاح تبديل بسيط
<Switch aria-label="وضع الطيران" />

// مع تسمية
<Switch label="وضع الطيران" defaultChecked />

// مع وصف
<Switch
  label="الوضع الداكن"
  description="شغّل الوضع الداكن أو أوقفه"
/>

// النمط (variant) outline
<Switch variant="outline" label="المزامنة التلقائية" />

// التسمية أولًا والمسار في النهاية
<Switch layout="label-first" label="الإشعارات" />

// أحجام مختلفة
<Switch size="sm" label="صغير" />
<Switch size="md" label="متوسط" />
<Switch size="lg" label="كبير" />

// التحكّم بالقيمة
const [enabled, setEnabled] = useState(true)

<Switch
  label="الإشعارات"
  checked={enabled}
  onChange={(e) => setEnabled(e.target.checked)}
/>

الحالة الحالية: قيد التشغيل