Drawer
لوحة تنزلق من بداية الشاشة أو نهايتها أو أعلاها أو أسفلها (في DGA: Slideout Menu). بيضاء أو رمادية، وتُغلق بالسحب، وتنعكس مع اتجاه الصفحة.
الإصدار 0.4.1 ·
التثبيت
bunx --bun shadcn@latest add @dga/drawerالاستخدام
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: فاللوحة نفسها تنزلق من اليمين في الصفحات العربية وحدّها على اليسار، ويغلقها السحب نحو اليمين. وتنعكس حركة الانزلاق معها.
إمكانية الوصول
| المفتاح | الإجراء |
|---|---|
| Tab | ينقل التركيز إلى العنصر التالي داخل اللوحة. ويبقى التركيز داخلها. |
| Shift + Tab | يعيد التركيز إلى الخلف. |
| Escape | يغلق اللوحة ويعيد التركيز إلى العنصر الذي فتحها. |
- مبنية على Base UI Drawer: نافذة معتمة مع
aria-labelledbyوaria-describedby. والصفحة خلفها معطّلة وتمريرها مقفل. - يُحبس التركيز داخلها ويعود إلى الزر عند الإغلاق. والسحب وسيلة إضافية للإغلاق لا الوحيدة.
- لزر الإغلاق اسم (
closeLabel). والنصوص بنسبة 4.5:1 والأيقونات 3:1 أو أفضل على السطحين الأبيض والرمادي، فاتحًا وداكنًا. - ومع تقليل الحركة تظهر اللوحة دون انزلاق.
مرجع API
Drawer
لوحة تنزلق من حافة الشاشة (في DGA: Slideout Menu). هي نافذة معتمة: يُحبس التركيز فيها ويغلقها Escape ويعود التركيز إلى الزر. وعلى شاشات اللمس تُغلق بالسحب.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
"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 على الجانبين وبعرض كامل في الأعلى أو الأسفل.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
"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 drawer | A 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 / title | 14.53:1 AAA | 14.42:1 AAA |
| white / description | 10.17:1 AAA | 10.95:1 AAA |
| white / body text | 18.09:1 AAA | 14.42:1 AAA |
| white / close icon | 18.09:1 3:1 | 14.42:1 3:1 |
| white / focus ring | 18.09:1 3:1 | 15.89:1 3:1 |
| gray / title | 13.20:1 AAA | 14.42:1 AAA |
| gray / description | 9.24:1 AAA | 10.95:1 AAA |
| gray / body text | 16.44:1 AAA | 14.42:1 AAA |
| gray / close icon | 16.44:1 3:1 | 14.42:1 3:1 |
| gray / focus ring | 16.44:1 3:1 | 15.89:1 3:1 |
يحتاج النص إلى تباين 4.5:1، والأيقونات وحلقات التركيز إلى 3:1. الحالات المعطّلة مستثناة. تقرير التباين الكامل