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

Menu

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

الإصدار 0.4.1 ·

القائمة

التثبيت

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

الاستخدام

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

تُحاذى القوائم إلى حافة بداية الزر (الحافة اليمنى بالعربية). وتفتح القائمة الفرعية في جهة النهاية أي على اليسار، ويُعكس سهمها. ويتبادل اليمين واليسار: فاليسار يفتح قائمة فرعية بالعربية. وتبقى الأرقام والاختصارات من اليسار إلى اليمين.

LTR (الإنجليزية)
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 ويعود التركيز إلى الزر. وتفتح القوائم الفرعية في جهة النهاية وتنعكس في الصفحات العربية.

خصائص Menu
الخاصيةالنوعالقيمة الافتراضية
boolean

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

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

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

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

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

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

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

MenuCheckboxItem

عنصر يمكن تشغيله وإيقافه. يعرض علامة صح عند تشغيله.

خصائص 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="/" />}>`.

خصائص MenuItem
الخاصيةالنوعالقيمة الافتراضية
boolean

لا يمكن اختيار العنصر. ويبقى في ترتيب مفاتيح الأسهم ليمكن العثور عليه.

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

هل يغلق اختياره القائمة. الافتراضي `true`.

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

تُستدعى عند اختيار العنصر بالفأرة أو لوحة المفاتيح.

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

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

MenuLabel

عنوان MenuGroup.

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

MenuRadioGroup

يجمع خيارات MenuRadioItem ليُختار واحد فقط.

خصائص MenuRadioGroup
الخاصيةالنوعالقيمة الافتراضية
(value: string) => void

تُستدعى بالقيمة المختارة حديثًا.

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

القيمة المختارة.

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

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

MenuRadioItem

خيار في MenuRadioGroup. يعرض الخيار المختار نقطة.

خصائص MenuRadioItem
الخاصيةالنوعالقيمة الافتراضية
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 disabledFigma is the source of truth where the CSS disagrees with itself. Opacity on the whole item also fades the focus ring.
Menu: trailing elementOne 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 / default18.09:1 AAA14.42:1 AAA
item icon / default18.09:1 3:114.42:1 3:1
shortcut / default10.17:1 AAA10.95:1 AAA
focus ring / default18.09:1 3:115.89:1 3:1
item text / hovered16.44:1 AAA9.59:1 AAA
item icon / hovered16.44:1 3:19.59:1 3:1
shortcut / hovered9.24:1 AAA7.28:1 AAA
focus ring / hovered16.44:1 3:110.57:1 3:1
item text / pressed14.61:1 AAA6.95:1 AA
item icon / pressed14.61:1 3:16.95:1 3:1
shortcut / pressed8.22:1 AAA5.27:1 AA
focus ring / pressed14.61:1 3:17.66:1 3:1
item text / selected4.53:1 AA8.74:1 AAA
item icon / selected4.53:1 3:18.74:1 3:1
shortcut / selected9.72:1 AAA10.14:1 AAA
focus ring / selected17.29:1 3:114.72:1 3:1
group label14.53:1 AAA14.42:1 AAA

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