ContextMenu

ContextMenu — меню по правому клику на области. Область — это children: компонент оборачивает их в div и вешает обработчик на него, так что внутри могут быть ссылки и кнопки. Пункты описываются массивом items, где элемент — либо { separator: true } (разделитель групп), либо пункт: обязательные value и label плюс icon, variant (danger для разрушающих действий), disabled и вложенный items (подменю). Состояния открытия у компонента нет — потребитель получает только onSelect(value) и ветвится по значению выбранного пункта; в IDE пункты обычно зовут команды реестра. Меню порталится в body и монтируется лениво при открытии. Родня: DropdownMenu — то же меню, но открывается кликом по своему триггеру; MenuItemButton — одиночный пункт того же вида вне меню (например, в popover крошек или в сайдбаре).

Анатомия

ContextMenu
Trigger (div-обёртка, className)
Children
Portal → Positioner → Content
Item (icon | label)
Separator
TriggerItem → вложенный Content

Примеры

Подменю

Пункт с собственным items становится триггером вложенного меню: оно раскрывается по наведению, а его value приходят в тот же onSelect. У самого пункта-триггера value используется только как ключ — выбрать его нельзя.

Область клика

Своих стилей у обёртки триггера нет — её размер задаёт className. Без него область равна высоте содержимого, и правый клик по пустому месту под списком меню не откроет; height: 100% растягивает её на всю панель.

Вложенные области

Меню можно вкладывать: у списка своё (действия над списком), у каждой строки — своё. Выигрывает ближайшее к курсору: клик по строке открывает меню строки, клик мимо строк — меню списка.

API

PropTypeDefault
items*

Пункты меню: value + label (плюс icon, variant, disabled, вложенный items для подменю) либо { separator: true } — разделитель

MenuItem[]-
onSelect*

Вызывается при выборе пункта со значением value этого пункта

(value: string) => void-
children*

Область, по правому клику на которой открывается меню

ReactNode-
className

Класс div-обёртки триггера — например, чтобы растянуть область клика

string-