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

Accordion

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

الإصدار 0.4.1 ·

الأكورديون

التثبيت

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

الاستخدام

page.tsx
tsx
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].

LTR (الإنجليزية)
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`.

خصائص Accordion
الخاصيةالنوعالقيمة الافتراضية
"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` للتحكم في المفتوح.

خصائص AccordionItem
الخاصيةالنوعالقيمة الافتراضية
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 disabledThe CSS needs twelve rules where logical properties need none, and the gradient hard-codes a 382px width.

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

التباين

60 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 10 حالة
النمط / الحالةالفاتحالداكن
heading17.31:1 AAA15.87:1 AAA
chevron17.31:1 3:115.87:1 3:1
panel text9.73:1 AAA12.04:1 AAA
focus ring17.31:1 3:117.49:1 3:1
heading / hovered16.44:1 AAA9.59:1 AAA
chevron / hovered16.44:1 3:19.59:1 3:1
focus ring / hovered16.44:1 3:110.57:1 3:1
heading / pressed14.61:1 AAA6.95:1 AA
chevron / pressed14.61:1 3:16.95:1 3:1
focus ring / pressed14.61:1 3:17.66:1 3:1

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