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

Drawer

لوحة تنزلق من بداية الشاشة أو نهايتها أو أعلاها أو أسفلها (في DGA: Slideout Menu). بيضاء أو رمادية، وتُغلق بالسحب، وتنعكس مع اتجاه الصفحة.

الإصدار 0.4.1 ·

جهات اللوحة

التثبيت

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

الاستخدام

page.tsx
tsx
import { Button } from "@/components/ui/button";
import {
  Drawer,
  DrawerClose,
  DrawerContent,
  DrawerDescription,
  DrawerFooter,
  DrawerHeader,
  DrawerTitle,
  DrawerTrigger,
} from "@/components/ui/drawer";

export function FilterDrawer() {
  return (
    <Drawer side="start">
      <DrawerTrigger render={<Button variant="outline" />}>التصفية</DrawerTrigger>
      <DrawerContent closeLabel="إغلاق">
        <DrawerHeader>
          <DrawerTitle>التصفية</DrawerTitle>
          <DrawerDescription>اختر ما يظهر في قائمة الطلبات.</DrawerDescription>
        </DrawerHeader>
        <DrawerFooter>
          <DrawerClose render={<Button />}>تطبيق</DrawerClose>
        </DrawerFooter>
      </DrawerContent>
    </Drawer>
  );
}

استخدم Drawer لمحتوى يقع بجانب الصفحة ولا ينبغي أن يغادرها: قائمة تنقل على الجوال أو مرشحات أو لوحة تفاصيل. ولقرار لا بد من الإجابة عنه استخدم Dialog. قيمة side هي start أو end أو top أو bottom. وتتبع start وend اتجاه الصفحة، فاللوحة start على اليسار في الإنجليزية وعلى اليمين في العربية، ويغلقها السحب نحو تلك الحافة. وأعطها DrawerTitle.

البنية

  • الخلفية: تعتّم الصفحة وتعطّلها.
  • المحتوى: اللوحة، بعرض 346px على الجانبين وعرض كامل في الأعلى أو الأسفل. بيضاء (background-menu) أو رمادية (neutral-100).
  • الترويسة: DrawerTitle وDrawerDescription.
  • التذييل: DrawerFooter، مدفوع إلى الأسفل، والإجراءات في جهة النهاية.
  • زر الإغلاق: في الزاوية، في جهة النهاية.

أمثلة

الجهات

الجهات الأربع. افتح الأولى في كل اتجاه وقارن موضع ظهورها.

الجهات

النمط الرمادي، ولوحة start فيها قائمة روابط. والروابط أزرار عادية تعرض <a>.

التنقل

مُدار، دون زر في الزاوية

مرّر open وonOpenChange لفتح الدرج من شيفرتك، واضبط showCloseButton={false} حين يحمل التذييل إجراء إغلاق أصلًا. ويظل Escape والنقر على الصفحة خلفه يغلقانه.

مُدار

RTL

تتبادل start وend: فاللوحة نفسها تنزلق من اليمين في الصفحات العربية وحدّها على اليسار، ويغلقها السحب نحو اليمين. وتنعكس حركة الانزلاق معها.

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

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

المفتاحالإجراء
Tabينقل التركيز إلى العنصر التالي داخل اللوحة. ويبقى التركيز داخلها.
Shift + Tabيعيد التركيز إلى الخلف.
Escapeيغلق اللوحة ويعيد التركيز إلى العنصر الذي فتحها.
  • مبنية على Base UI Drawer: نافذة معتمة مع aria-labelledby وaria-describedby. والصفحة خلفها معطّلة وتمريرها مقفل.
  • يُحبس التركيز داخلها ويعود إلى الزر عند الإغلاق. والسحب وسيلة إضافية للإغلاق لا الوحيدة.
  • لزر الإغلاق اسم (closeLabel). والنصوص بنسبة 4.5:1 والأيقونات 3:1 أو أفضل على السطحين الأبيض والرمادي، فاتحًا وداكنًا.
  • ومع تقليل الحركة تظهر اللوحة دون انزلاق.

مرجع API

Drawer

لوحة تنزلق من حافة الشاشة (في DGA: Slideout Menu). هي نافذة معتمة: يُحبس التركيز فيها ويغلقها Escape ويعود التركيز إلى الزر. وعلى شاشات اللمس تُغلق بالسحب.

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

الحافة التي تنزلق منها. تتبع `start` و`end` اتجاه الصفحة، فتكون `start` على اليمين في الصفحات العربية. ويتبعها اتجاه السحب للإغلاق.

"end"
boolean

مفتوحة في البداية (دون تحكم).

لا توجد قيمة افتراضية
(open: boolean) => void

تُستدعى عند فتحها أو إغلاقها.

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

حالة الفتح بتحكّم خارجي.

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

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

DrawerClose

يغلق اللوحة. اعرض Button معه: `<DrawerClose render={<Button />}>`.

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

DrawerContent

اللوحة: خلفية معتمة والبطاقة، بعرض 346px على الجانبين وبعرض كامل في الأعلى أو الأسفل.

خصائص DrawerContent
الخاصيةالنوعالقيمة الافتراضية
"white" | "gray"

السطح: `white` ‏(background-menu) أو `gray` ‏(neutral-100).

"white"
boolean

يعرض زر الإغلاق في الزاوية.

true
string

الاسم الذي يقرؤه قارئ الشاشة لزر الإغلاق. ترجمه في الصفحات العربية.

"Close"

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

DrawerDescription

يشرح اللوحة. مرتبط بها عبر `aria-describedby`.

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

DrawerFooter

الإجراءات في أسفل اللوحة، محاذاة إلى النهاية.

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

DrawerHeader

يجمع العنوان والوصف في أعلى اللوحة.

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

DrawerTitle

اسم اللوحة. يقرؤه قارئ الشاشة عند فتحها.

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

DrawerTrigger

الزر الذي يفتح اللوحة.

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

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

  • Slideout Menu في Figma لوحة بعرض 346px جزء من التخطيط. أما هذه فلوحة معتمة: حبس تركيز وEscape وسحب. أما اللوحة الجانبية في تخطيطك فقائمة تنقل لا هذه.
  • الحد المجاور للصفحة منطقي (border-e أو border-s). أما border-right واتجاه الانزلاق في DGA فماديان، فيكونان في الجهة الخاطئة بالعربية.
التغييرالسبب
Drawer: from Slideout Menu to a modal drawerA panel that covers the page needs the same focus trap and Escape as a dialog. DGA's border-right and its slide direction are physical, so they would be on the wrong side in Arabic.

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

التباين

20 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 10 حالة
النمط / الحالةالفاتحالداكن
white / title14.53:1 AAA14.42:1 AAA
white / description10.17:1 AAA10.95:1 AAA
white / body text18.09:1 AAA14.42:1 AAA
white / close icon18.09:1 3:114.42:1 3:1
white / focus ring18.09:1 3:115.89:1 3:1
gray / title13.20:1 AAA14.42:1 AAA
gray / description9.24:1 AAA10.95:1 AAA
gray / body text16.44:1 AAA14.42:1 AAA
gray / close icon16.44:1 3:114.42:1 3:1
gray / focus ring16.44:1 3:115.89:1 3:1

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