زر الاختيار (Radio)

يتيح لك زر الاختيار (Radio) تحديد خيار واحد فقط من مجموعة خيارات.

التثبيت

bash
npx @smicolon/cli add radio

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

معاينة

الأنماط (variant)

يضع النمط (variant) layout زر الاختيار ونصّه داخل بطاقة بإطار، فتصبح البطاقة كلها قابلة للنقر. استخدمه عندما تحمل الخيارات وصفًا، واستخدم default للخيارات القصيرة في قائمة متقاربة.

الأحجام

الحالات

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

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

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

الخصائص (props)

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

الاستخدام

tsx
import { Radio } from "@/components/ui/radio"

// مجموعة خيارات تشترك في قيمة name
<Radio name="plan" value="standard" label="شحن عادي" />
<Radio name="plan" value="express" label="شحن سريع" />

// مع وصف
<Radio
  name="plan"
  value="courier"
  label="توصيل في اليوم نفسه"
  description="يصل قبل السادسة مساءً"
/>

// بطاقة بإطار
<Radio variant="layout" name="plan" value="express" label="شحن سريع" />

// التحكّم بالقيمة
<Radio
  name="plan"
  value="express"
  label="شحن سريع"
  checked={plan === "express"}
  onChange={(e) => setPlan(e.target.value)}
/>

الخيار المحدد: standard