Menu
قائمة إجراءات على سطح مؤقت. أيقونات ونص في النهاية وعناصر مربع اختيار وراديو ومجموعات وقوائم فرعية، مع تنقل بمفاتيح الأسهم.
الإصدار 0.4.1 ·
التثبيت
bunx --bun shadcn@latest add @dga/menuالاستخدام
import { Edit02Icon, Delete02Icon } from "@hugeicons/core-free-icons";
import { HugeiconsIcon } from "@hugeicons/react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuSeparator,
MenuTrigger,
} from "@/components/ui/menu";
export function RequestActions() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>الإجراءات</MenuTrigger>
<MenuContent>
<MenuItem>
<HugeiconsIcon icon={Edit02Icon} aria-hidden />
تعديل الطلب
</MenuItem>
<MenuSeparator />
<MenuItem>
<HugeiconsIcon icon={Delete02Icon} aria-hidden />
سحب الطلب
</MenuItem>
</MenuContent>
</Menu>
);
}استخدم Menu لمجموعة إجراءات على شيء واحد: صف في جدول أو بطاقة أو ملف شخصي. ولاختيار قيمة تُحفظ في نموذج استخدم Select. وتنفّذ العناصر إجراءً عند اختيارها. ضع أيقونة أولًا (وهي زخرفية) ثم التسمية ثم محتوى اختياريًا في النهاية مثل MenuShortcut. وللرابط اعرض عنصر a: <MenuItem render={<a href="/" />}>. وأبقِ القائمة في نحو سبعة عناصر؛ وقسّم الأطول بـ MenuSeparator وMenuGroup.
البنية
- الزر: الذي يفتح القائمة.
- القائمة (
role="menu"):background-menuوحد بسمك 1px وانحناء radius-md وshadow-2xl. - العنصر (
role="menuitem"): بارتفاع 40px وحشوة 8px، وأيقونة ومحتوى في النهاية اختياريان. - عناصر مربع الاختيار والراديو: تعرض علامة صح أو نقطة في جهة النهاية عند اختيارها.
- المجموعة والعنوان والفاصل: بنية للقوائم الأطول.
- القائمة الفرعية: MenuSub مع MenuSubTrigger (سهم) وMenuSubContent.
أمثلة
عناصر مربع الاختيار والراديو
يشغّل MenuCheckboxItem شيئًا أو يوقفه. ويختار MenuRadioGroup مع MenuRadioItem خيارًا واحدًا. وتحصل المجموعات على MenuLabel.
قائمة فرعية
يفتح MenuSub قائمة ثانية بجانب عنصرها في جهة النهاية. وتُفتح بـ Enter أو Space أو السهم المتجه إليها، وتُغلق بالسهم المعاكس.
تبقى مفتوحة ومُدارة
يمكن لعنصر مربع الاختيار أو الراديو أن يضبط closeOnClick={false} فتبقى القائمة مفتوحة بينما يغيّر الشخص عدة خيارات. مرّر open وonOpenChange إلى Menu لقراءة حالتها أو ضبطها. والعنصر العادي يغلق القائمة.
RTL
تُحاذى القوائم إلى حافة بداية الزر (الحافة اليمنى بالعربية). وتفتح القائمة الفرعية في جهة النهاية أي على اليسار، ويُعكس سهمها. ويتبادل اليمين واليسار: فاليسار يفتح قائمة فرعية بالعربية. وتبقى الأرقام والاختصارات من اليسار إلى اليمين.
إمكانية الوصول
| المفتاح | الإجراء |
|---|---|
| Enter | على الزر يفتح القائمة ويركّز العنصر الأول. وعلى عنصر يختاره. |
| Space | يختار العنصر المركَّز (أو يفتح القائمة من الزر). |
| ArrowDown | يفتح القائمة من الزر؛ وينتقل إلى العنصر التالي. |
| ArrowUp | ينتقل إلى العنصر السابق. |
| Home | ينتقل إلى العنصر الأول (وEnd إلى الأخير). |
| ArrowRight | يفتح قائمة فرعية (ArrowLeft بالعربية)؛ ويغلقها السهم المعاكس. |
| A إلى Z | ينتقل إلى العنصر التالي الذي يبدأ بذلك الحرف. |
| Escape | يغلق القائمة ويعيد التركيز إلى الزر. |
- مبنية على Base UI Menu:
role="menu"وعناصر بـrole="menuitem"وmenuitemcheckboxوmenuitemradio، وللزرaria-haspopupوaria-expanded. - عنصر واحد فقط في ترتيب Tab في كل مرة (تركيز متنقل)؛ وتنقل الأسهم بين العناصر ويعود التركيز إلى الزر عند الإغلاق.
- يعرض التمرير والتمييز بلوحة المفاتيح تعبئة؛ ويضيف تركيز لوحة المفاتيح حدًا بسمك 2px داخل العنصر (بنسبة 3:1 أو أفضل). وللعنصر المحدد تظليل وعلامة صح أو نقطة، فلا يعتمد على اللون وحده.
- النص بنسبة 4.5:1 والأيقونات 3:1 أو أفضل في كل حالة، فاتحًا وداكنًا. ويبقى العنصر المعطّل في ترتيب مفاتيح الأسهم ليمكن العثور عليه، لكن لا يمكن اختياره.
مرجع API
Menu
قائمة إجراءات على سطح مؤقت (في DGA: Menu). تنقل مفاتيح الأسهم بين العناصر، وHome وEnd إلى الأول والأخير، وحرف يقفز إلى المطابق، ويغلقها Escape ويعود التركيز إلى الزر. وتفتح القوائم الفرعية في جهة النهاية وتنعكس في الصفحات العربية.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
booleanحالة الفتح بتحكّم خارجي. | لا توجد قيمة افتراضية | |
| ||
booleanمفتوحة في البداية (دون تحكم). | لا توجد قيمة افتراضية | |
| ||
(open: boolean) => voidتُستدعى عند فتحها أو إغلاقها. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuCheckboxItem
عنصر يمكن تشغيله وإيقافه. يعرض علامة صح عند تشغيله.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
booleanحالة التشغيل بتحكّم خارجي. | لا توجد قيمة افتراضية | |
| ||
(checked: boolean) => voidتُستدعى عند تشغيله أو إيقافه. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuContent
القائمة المنبثقة. تفتح أسفل الزر، محاذاة لجهة بدايته.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuGroup
يجمع عناصر مترابطة تحت MenuLabel.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuItem
إجراء واحد. ضع أيقونة أولًا ثم التسمية ثم MenuShortcut أو Tag أو Switch اختياريًا. واستخدم `render` ليكون رابطًا: `<MenuItem render={<a href="/" />}>`.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
booleanلا يمكن اختيار العنصر. ويبقى في ترتيب مفاتيح الأسهم ليمكن العثور عليه. | لا توجد قيمة افتراضية | |
| ||
booleanهل يغلق اختياره القائمة. الافتراضي `true`. | لا توجد قيمة افتراضية | |
| ||
(event) => voidتُستدعى عند اختيار العنصر بالفأرة أو لوحة المفاتيح. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuLabel
عنوان MenuGroup.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuRadioGroup
يجمع خيارات MenuRadioItem ليُختار واحد فقط.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
(value: string) => voidتُستدعى بالقيمة المختارة حديثًا. | لا توجد قيمة افتراضية | |
| ||
stringالقيمة المختارة. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuRadioItem
خيار في MenuRadioGroup. يعرض الخيار المختار نقطة.
| الخاصية | النوع | القيمة الافتراضية |
|---|---|---|
stringقيمة هذا الخيار. | لا توجد قيمة افتراضية | |
| ||
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuSeparator
خط بين مجموعات العناصر.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuShortcut
نص في نهاية العنصر، كاختصار أو عدد. تبقى الأرقام والرموز من اليسار إلى اليمين.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuSub
يجمع MenuSubTrigger مع MenuSubContent.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuSubContent
القائمة الفرعية. تفتح بجانب عنصرها في جهة النهاية.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuSubTrigger
عنصر يفتح قائمة فرعية. سهمه نحو جهة النهاية وينعكس في RTL.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
MenuTrigger
الزر الذي يفتح القائمة. اعرض Button الخاص بك عبر `render`.
يقبل أيضًا جميع خصائص Base UI Menu (يفتح في نافذة جديدة).
الاختلافات عن DGA
- تعبئة التمرير في Figma هي
button-background-neutral-hovered، بينما يضبط CSS أيضًاneutral-100على المحدد نفسه. ويُعتمد Figma. وحد التركيز بسمك 2px مخطط داخلي لتركيز لوحة المفاتيح فقط. - تستخدم العناصر المعطّلة
text-default-disabledلاopacity: .5كما في CSS: فالشفافية تُبهت حلقة التركيز وعلامة الصح أيضًا. - أُضيفت القوائم الفرعية وعناصر مربع الاختيار والراديو؛ وصُيّرت متغيرات النهاية الخمسة فتحة واحدة (أي عنصر بعد التسمية).
| التغيير | السبب |
|---|---|
Menu: states and disabled | Figma is the source of truth where the CSS disagrees with itself. Opacity on the whole item also fades the focus ring. |
Menu: trailing element | One slot covers every trail variant and the extra items cover the menus that apps actually need. |
عرض جميع الاختلافات (2) لهذا المكوّن أسباب الاختلافات مكتوبة بالإنجليزية.
التباين
34 زوجًا لونيًا فُحص · جميعها تجتاز WCAG 2.1 AAعرض 17 حالةإخفاء
| النمط / الحالة | الفاتح | الداكن |
|---|---|---|
| item text / default | 18.09:1 AAA | 14.42:1 AAA |
| item icon / default | 18.09:1 3:1 | 14.42:1 3:1 |
| shortcut / default | 10.17:1 AAA | 10.95:1 AAA |
| focus ring / default | 18.09:1 3:1 | 15.89:1 3:1 |
| item text / hovered | 16.44:1 AAA | 9.59:1 AAA |
| item icon / hovered | 16.44:1 3:1 | 9.59:1 3:1 |
| shortcut / hovered | 9.24:1 AAA | 7.28:1 AAA |
| focus ring / hovered | 16.44:1 3:1 | 10.57:1 3:1 |
| item text / pressed | 14.61:1 AAA | 6.95:1 AA |
| item icon / pressed | 14.61:1 3:1 | 6.95:1 3:1 |
| shortcut / pressed | 8.22:1 AAA | 5.27:1 AA |
| focus ring / pressed | 14.61:1 3:1 | 7.66:1 3:1 |
| item text / selected | 4.53:1 AA | 8.74:1 AAA |
| item icon / selected | 4.53:1 3:1 | 8.74:1 3:1 |
| shortcut / selected | 9.72:1 AAA | 10.14:1 AAA |
| focus ring / selected | 17.29:1 3:1 | 14.72:1 3:1 |
| group label | 14.53:1 AAA | 14.42:1 AAA |
يحتاج النص إلى تباين 4.5:1، والأيقونات وحلقات التركيز إلى 3:1. الحالات المعطّلة مستثناة. تقرير التباين الكامل