Accordion
يعرض أقسام المحتوى ويخفيها تحت عناوينها. ثلاثة أحجام وسهم في البداية أو النهاية وبلا إطار، وفتح قسم واحد أو عدة أقسام.
الإصدار 0.4.1 ·
التثبيت
bunx --bun shadcn@latest add @dga/accordionالاستخدام
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
} from "@/components/ui/accordion";
export function ServiceFaq() {
return (
<Accordion defaultValue={["eligibility"]}>
<AccordionItem value="eligibility">
<AccordionTrigger>من يستطيع التقديم؟</AccordionTrigger>
<AccordionContent>المواطنون والمقيمون ممن لديهم هوية سارية.</AccordionContent>
</AccordionItem>
<AccordionItem value="time">
<AccordionTrigger>كم تستغرق المعالجة؟</AccordionTrigger>
<AccordionContent>تُنجز معظم الطلبات خلال ٥ أيام عمل.</AccordionContent>
</AccordionItem>
</Accordion>
);
}استخدم Accordion لمحتوى يتصفحه الناس بعناوينه ولا يفتحون منه إلا جزءًا: أسئلة وأجوبة أو أقسام نموذج طويل. ولا تخفِ ما يجب أن يقرأه الجميع. يُفتح قسم واحد في كل مرة افتراضيًا؛ وضبط multiple يتيح فتح عدة أقسام.
البنية
- العنصر: قسم واحد، وفوقه خط بسمك 1px. وتعرّفه
value. - الزر (
<button>في عنوان): نصmdبخط شبه عريض، وسهم يدور عند فتح القسم. - اللوحة (
role="region"): المحتوى. وتحرّك ارتفاعها.
أمثلة
الأحجام والسهم في البداية وبلا إطار
يحدد size حشوة العنوان: sm 8px وmd 12px وlg 16px. ويضع iconPosition="leading" السهم أولًا. ويُبقي flush الخطوط على بعد 16px من الحواف. ويتيح multiple بقاء عدة أقسام مفتوحة.
RTL
يقع السهم في جهة النهاية (اليسار بالعربية)، أو في جهة البداية مع iconPosition="leading". وتُزاح نصوص اللوحة بحشوة منطقية لتحاذي نص العنوان. ولا حاجة إلى أي تجاوزات لـ [dir=rtl].
إمكانية الوصول
| المفتاح | الإجراء |
|---|---|
| Tab | ينقل التركيز إلى العنوان التالي. |
| Enter | يفتح القسم المركَّز أو يغلقه. |
| Space | يفتح القسم المركَّز أو يغلقه. |
- مبنية على Base UI Accordion: كل عنوان
<button>معaria-expandedوaria-controlsداخل عنصر عنوان؛ واللوحةregionتسمّيها. واللوحة المغلقة مخفية عن قارئ الشاشة. وكما يطلب نمط WAI-ARIA يكفي Tab وEnter وSpace. - تظهر حالة الفتح من دوران السهم ومن اللوحة نفسها لا من اللون. والتركيز حد بسمك 2px داخل العنوان.
- النص بنسبة 4.5:1 والسهم 3:1 أو أفضل في كل حالة، فاتحًا وداكنًا. ولا يمكن فتح القسم المعطّل.
- تفتح اللوحة وتغلق بتحريك ارتفاعها؛ ومع تقليل الحركة تفتح فورًا.
مرجع API
Accordion
يعرض أقسام المحتوى ويخفيها تحت عناوينها (في DGA: Accordion). كل عنوان زر: ينقل Tab بين العناوين ويفتح Enter أو Space القسم أو يغلقه. ويُفتح قسم واحد في كل مرة ما لم تضبط `multiple`.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
"sm" | "md" | "lg"حشوة العنوان: `sm` 8px، و`md` 12px، و`lg` 16px (كما في DGA). | "lg" | |
| ||
"trailing" | "leading"موضع السهم: `trailing` في النهاية (الافتراضي) أو `leading` في البداية. | "trailing" | |
| ||
booleanتتوقف الخطوط على بعد 16px من الحواف. | false | |
| ||
booleanيتيح فتح عدة عناصر معًا. الافتراضي `false`. | لا توجد قيمة افتراضية | |
| ||
string[]قيم العناصر المفتوحة بتحكّم خارجي. | لا توجد قيمة افتراضية | |
| ||
string[]العناصر المفتوحة في البداية (دون تحكم). | لا توجد قيمة افتراضية | |
| ||
(value: string[]) => voidتُستدعى بقيم العناصر المفتوحة. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Accordion (يفتح في نافذة جديدة).
AccordionContent
محتوى القسم. يحرّك ارتفاعه ويُخفى عن قارئ الشاشة وهو مغلق.
يقبل أيضًا جميع خصائص Base UI Accordion (يفتح في نافذة جديدة).
AccordionItem
قسم واحد: عنوان ولوحته. أعطه `value` للتحكم في المفتوح.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
stringما يعرّف العنصر. الافتراضي موضعه. | لا توجد قيمة افتراضية | |
| ||
booleanلا يمكن فتح القسم ولا إغلاقه. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Accordion (يفتح في نافذة جديدة).
AccordionTrigger
زر العنوان. يعرض سهمًا يدور عند فتح القسم.
يقبل أيضًا جميع خصائص Base UI Accordion (يفتح في نافذة جديدة).
الاختلافات عن DGA
- يكرر CSS في DGA كل قاعدة حشوة للجسم لـ
[dir=rtl]وhtml[lang=ar](اثنتا عشرة قاعدة). أما الحشوة المنطقية (psوpe) فلا تحتاج إلى أي منها. - الخط بلا إطار هامش 16px على كل جانب؛ بينما ترسمه DGA بتدرج
border-imageعند 16px و382px، ولا يلائم إلا عرضًا واحدًا. - يستخدم القسم المعطّل
text-default-disabledبدلneutral-300مع!important.
| التغيير | السبب |
|---|---|
Accordion: RTL padding, flush and disabled | The CSS needs twelve rules where logical properties need none, and the gradient hard-codes a 382px width. |
عرض جميع الاختلافات (1) لهذا المكوّن أسباب الاختلافات مكتوبة بالإنجليزية.
التباين
60 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 10 حالةإخفاء
| النمط / الحالة | الفاتح | الداكن |
|---|---|---|
| heading | 17.31:1 AAA | 15.87:1 AAA |
| chevron | 17.31:1 3:1 | 15.87:1 3:1 |
| panel text | 9.73:1 AAA | 12.04:1 AAA |
| focus ring | 17.31:1 3:1 | 17.49:1 3:1 |
| heading / hovered | 16.44:1 AAA | 9.59:1 AAA |
| chevron / hovered | 16.44:1 3:1 | 9.59:1 3:1 |
| focus ring / hovered | 16.44:1 3:1 | 10.57:1 3:1 |
| heading / pressed | 14.61:1 AAA | 6.95:1 AA |
| chevron / pressed | 14.61:1 3:1 | 6.95:1 3:1 |
| focus ring / pressed | 14.61:1 3:1 | 7.66:1 3:1 |
يحتاج النص إلى تباين 4.5:1، والأيقونات وحلقات التركيز إلى 3:1. الحالات المعطّلة مستثناة. تقرير التباين الكامل