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

Select

اختيار خيار واحد من قائمة (في DGA: Dropdown Input أي القائمة المنسدلة). حجمان وثلاث تعبئات ومجموعات وكل الحالات، على Base UI Select.

الإصدار 0.4.1 ·

حالات القائمة المنسدلة

التثبيت

bunx --bun shadcn@latest add @dga/select

ويثبّت Field أيضًا. هذا هو Dropdown Input في DGA (القائمة المنسدلة)؛ وسمّيناه Select تيمّنًا بجزء Base UI.

الاستخدام

page.tsx
tsx
import { Field, FieldLabel } from "@/components/ui/field";
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "@/components/ui/select";

const services = [
  { value: "issue", label: "إصدار رخصة" },
  { value: "renew", label: "تجديد رخصة" },
];

export function ServiceField() {
  return (
    <Field name="service">
      <FieldLabel required>الخدمة</FieldLabel>
      <Select items={services} required>
        <SelectTrigger>
          <SelectValue placeholder="اختر خدمة" />
        </SelectTrigger>
        <SelectContent>
          {services.map((s) => (
            <SelectItem key={s.value} value={s.value}>
              {s.label}
            </SelectItem>
          ))}
        </SelectContent>
      </Select>
    </Field>
  );
}

استخدم Select لاختيار خيار واحد من خمسة إلى خمسة عشر. وللأقل من ذلك يعرض Radio كل الخيارات معًا؛ وللأكثر أضف حقل بحث. مرّر items ليعرض الزر تسمية القيمة المختارة، وplaceholder يوضح ما المطلوب اختياره.

البنية

  • الزر (<button>): الحد والتسمية المختارة أو النص التلميحي وسهم.
  • المحتوى: القائمة المنبثقة على سطح البطاقة وبعرض الزر.
  • الخيار: خيار واحد، وعليه علامة صح في جهة النهاية عند اختياره.
  • المجموعة والتسمية والفاصل (اختيارية): تجمع الخيارات المترابطة.

أمثلة

الأساسي

انقر للفتح، أو ركّز عليه واضغط Enter أو Space أو ArrowDown.

الأساسي

الحالات

الافتراضية والمعبأة وللقراءة فقط والمعطّلة وحالة الخطأ، والحجم المتوسط مع التعبئة الأغمق.

الحالات

المجموعات

لفّ الخيارات المترابطة في SelectGroup مع SelectLabel، وافصل بين المجموعات بـ SelectSeparator.

المجموعات

RTL

يبدأ نص الزر من اليمين ويقع السهم على اليسار. وتفتح القائمة أسفل الزر وتُحاذى بحافة بدايته (اليمنى)؛ وتقع علامة الصح على اليسار.

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

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

المفتاحالإجراء
Tabينقل التركيز إلى الزر.
Enter أو Space أو ArrowDownيفتح القائمة.
ArrowUp / ArrowDownينتقل بين الخيارات.
Home / Endيقفز إلى أول خيار أو آخره.
كتابة حرفيقفز إلى الخيار الذي يبدأ به.
Enterيختار الخيار المميّز ويغلق القائمة.
Escيغلق القائمة ويعيد التركيز إلى الزر.
  • للزر الدور combobox مع aria-expanded؛ وللقائمة الدور listbox ولكل خيار الدور option مع aria-selected.
  • تأتي التسمية من Field. ويرتبط النص المساعد والأخطاء عبر aria-describedby.
  • للخيار المميّز شريط بسمك 2px مع تظليل، لا تظليل وحده (WCAG 2.4.7). وللخيار المختار علامة صح.
  • تحتفظ كل الحالات بحد بنسبة 3:1 ونص بنسبة 4.5:1، فاتحًا وداكنًا.

مرجع API

Select

يتيح اختيار خيار واحد من قائمة (في DGA: Dropdown Input، أي القائمة المنسدلة). ركّبه من SelectTrigger وSelectValue وSelectContent. مرّر `items` ليعرض الزر تسمية القيمة المختارة، وسمّه بـ Field.

خصائص Select
الخاصيةالنوعالقيمة الافتراضية
{ value, label }[] | Record<string, ReactNode>

الخيارات مع تسمياتها، ليعرض الزر تسمية القيمة المختارة قبل فتح القائمة.

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

قيمة متحكَّم بها.

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

القيمة الابتدائية عند عدم التحكم.

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

يعطّل القائمة المنسدلة.

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

يتيح اختيار عدة خيارات. وتكون القيمة حينئذٍ مصفوفة.

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

اسم الحقل عند إرسال النموذج.

لا توجد قيمة افتراضية
(value: Value, details) => void

تُستدعى عند اختيار المستخدم خيارًا. من Base UI.

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

يعرض الاختيار دون فتح القائمة.

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

لا يمكن إرسال النموذج دون اختيار.

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

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

SelectContent

القائمة المنبثقة. تفتح أسفل الزر افتراضيًا وبعرضه.

خصائص SelectContent
الخاصيةالنوعالقيمة الافتراضية
"top" | "bottom" | "inline-start" | "inline-end"

أي جهة من الزر تفتح عليها القائمة. الافتراضي `bottom`.

"bottom"
"start" | "center" | "end"

المحاذاة مع الزر. و`start` هي الحافة اليمنى في RTL.

"start"
number

الفجوة بين الزر والقائمة بالبكسل. الافتراضي 4.

4
boolean

يجعل الخيار المختار فوق الزر تمامًا، كالقائمة الأصلية في macOS. الافتراضي `false`.

false

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

SelectGroup

يجمع خيارات مترابطة تحت SelectLabel.

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

SelectItem

خيار واحد. يظهر على الخيار المختار علامة صح في جهة النهاية.

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

القيمة التي يمثلها هذا الخيار.

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

يعطّل الخيار.

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

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

SelectLabel

عنوان SelectGroup.

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

SelectSeparator

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

SelectTrigger

الزر الذي يعرض الخيار المختار ويفتح القائمة.

خصائص SelectTrigger
الخاصيةالنوعالقيمة الافتراضية
"md" | "lg"

الارتفاع: `md` ‏32px، و`lg` ‏40px.

"lg"
"default" | "lighter" | "darker"

التعبئة: `default` (أبيض) أو `lighter` أو `darker`. وتحتفظ الثلاث بحد ظاهر.

"default"

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

SelectValue

الخيار المختار، أو `placeholder` ما دام لا يوجد اختيار.

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

يظهر ما دام لم يُختر شيء.

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

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

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

  • سمّيناه Select (في Figma: Dropdown Input). يرسم Figma القائمة المفتوحة فقط؛ وسطح القائمة المنبثقة من عندنا.
  • للخيار المميّز شريط مع التظليل، لأن التظليل وحده بنسبة 1.1:1.
  • الحالات نفسها كما في Input: لا حد خارجي، وخط سفلي كامل عند التركيز أو الفتح، ويعرض الضغط نصف الخط السفلي. والضغط بالفأرة يفتح القائمة فورًا، فينتقل من السكون إلى الفتح.
التغييرالسبب
Select: popupThe tint alone is 1.1:1 against the popup, so keyboard users could not see which option is highlighted (WCAG 2.4.7).
Select: nameNamed after the Base UI part and the shadcn convention, so it is found when people search for it. The docs page says it is DGA's Dropdown Input.

عرض جميع الاختلافات (2) لهذا المكوّن أسباب الاختلافات مكتوبة بالإنجليزية.

التباين

282 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 51 حالة
النمط / الحالةالفاتحالداكن
filled text18.09:1 AAA15.87:1 AAA
hovered text18.09:1 AAA15.87:1 AAA
focused text10.17:1 AAA12.04:1 AAA
pressed text9.24:1 AAA9.64:1 AAA
pressed placeholder6.69:1 AA5.06:1 AA
pressed prefix and suffix text9.24:1 AAA9.64:1 AAA
underline, focused and pressed18.74:1 3:116.80:1 3:1
placeholder4.77:1 AA6.32:1 AA
prefix and suffix text10.17:1 AAA12.04:1 AAA
icon4.77:1 3:19.38:1 3:1
border, default4.57:1 3:13.80:1 3:1
border, hovered9.73:1 3:112.04:1 3:1
border, focused and pressed17.93:1 3:116.80:1 3:1
underline, error4.62:1 3:14.65:1 3:1
border, error4.62:1 3:14.65:1 3:1
filled text (lighter)17.64:1 AAA14.42:1 AAA
hovered text (lighter)17.64:1 AAA14.42:1 AAA
focused text (lighter)10.17:1 AAA12.04:1 AAA
pressed text (lighter)9.24:1 AAA9.64:1 AAA
pressed placeholder (lighter)6.69:1 AA5.06:1 AA
pressed prefix and suffix text (lighter)9.24:1 AAA9.64:1 AAA
underline, focused and pressed (lighter)18.28:1 3:115.27:1 3:1
placeholder (lighter)4.65:1 AA5.75:1 AA
prefix and suffix text (lighter)9.92:1 AAA10.95:1 AAA
icon (lighter)4.65:1 3:18.52:1 3:1
border, hovered (lighter)9.73:1 3:112.04:1 3:1
border, focused and pressed (lighter)17.93:1 3:116.80:1 3:1
underline, error (lighter)4.62:1 3:14.65:1 3:1
border, error (lighter)4.62:1 3:14.65:1 3:1
filled text (darker)16.44:1 AAA17.04:1 AAA
hovered text (darker)16.44:1 AAA17.04:1 AAA
focused text (darker)10.17:1 AAA12.04:1 AAA
pressed text (darker)9.24:1 AAA9.64:1 AAA
pressed placeholder (darker)6.69:1 AA5.06:1 AA
pressed prefix and suffix text (darker)9.24:1 AAA9.64:1 AAA
underline, focused and pressed (darker)17.03:1 3:118.03:1 3:1
placeholder (darker)6.69:1 AA6.79:1 AA
prefix and suffix text (darker)9.24:1 AAA12.93:1 AAA
icon (darker)4.34:1 3:110.07:1 3:1
border, hovered (darker)9.73:1 3:112.04:1 3:1
border, focused and pressed (darker)17.93:1 3:116.80:1 3:1
underline, error (darker)4.62:1 3:14.65:1 3:1
border, error (darker)4.62:1 3:14.65:1 3:1
border, hover and focus (lighter and darker)4.57:1 3:13.80:1 3:1
read-only text18.09:1 AAA15.87:1 AAA
option text18.09:1 AAA15.87:1 AAA
option text, highlighted16.44:1 AAA12.71:1 AAA
group label4.77:1 AA6.32:1 AA
selected check4.74:1 3:110.38:1 3:1
selected check, highlighted4.31:1 3:18.31:1 3:1
highlight bar18.09:1 3:117.49:1 3:1

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