Menu

Menu — общая основа пунктов меню, а не самостоятельный оверлей. Отсюда два вида артефактов. Словарь пунктов — тип MenuItem (MenuItemOption | MenuSeparator): им заполняется проп items у ContextMenu и DropdownMenu. Пункт (MenuItemOption) — обязательные value и label плюс icon, variant (danger для разрушающих действий), disabled и вложенный items (подменю); { separator: true } — разделитель смысловых групп. Рендерит этот массив внутренний MenuItems — общий список, который оба меню кладут в свой Content (потому вид пунктов у них совпадает). MenuItemButton — одиночный пункт того же вида, но вне машины Ark Menu: обычная <button> (или, через asChild, ссылка), из которой набирают меню там, где готового оверлея нет — контент DropdownPanel, popover крошек, сайдбар. Вид пункта у обоих один — общий menu.module.css (внешность ghost-кнопки, слот иконки для выравнивания, подсветка по ховеру и клавиатуре). Родня: ContextMenu — меню по правому клику, DropdownMenu — меню по клику на триггер (оба потребляют словарь items); DropdownPanel — панель произвольного контента, куда MenuItemButton обычно и кладут.

Анатомия

Menu (общий словарь пунктов)
MenuItemOption (value | label | icon | variant | disabled)
items → вложенное подменю
MenuSeparator (separator)
MenuItemButton (label | icon | variant | asChild) — standalone
ItemIcon (слот иконки)
ItemLabel (текст, до 2 строк)

Примеры

Пункт-ссылка

asChild рендерит пункт не <button>, а переданным элементом (<a>, next/link, Link роутера), вживляя в него классы и содержимое — иконку и текст. Так пункт становится настоящей ссылкой, сохраняя вид: навигация работает нативно, без onClick. Button-пропсы (type и пр.) при этом не применяются.

label

Текст пункта. Длинный текст обрезается двумя строками.

icon

Иконка слева от текста — компонент из @phosphor-icons/react. Слот под иконку рендерится всегда, даже без неё, чтобы текст соседних пунктов был выровнен по одной линии.

variant

Вариант пункта — задаёт цвет текста и подсветки. danger — для разрушающих действий (удаление), default — обычный пункт.

primary
secondary
success
warning
danger
default

API

PropTypeDefault
label*

Текст пункта

string-
icon

Иконка, отображается слева от текста

Icon-
variant

Вариант пункта — задаёт цвет текста и подсветки (danger для разрушающих действий и т.п.)

Variant"default"
asChild

Отрендерить пункт как переданный элемент (напр. <Link> / <a>) вместо <button>, вживив в него классы и содержимое (иконку + label). Так пункт становится настоящей ссылкой, сохраняя вид. type/button-пропсы при этом не применяются — передавай только атрибуты целевого элемента.

ReactElement<{ className?: string }>-

Наследуется от ButtonHTMLAttributes<HTMLButtonElement>