Context Menu
Menu de ações invocado por clique direito sobre uma região. Mesmo formato compound do DropdownMenu, ancorado a uma área alvo.
Visão geral
ContextMenu é um acelerador para usuários avançados. O clique direito é invisível para quem não foi ensinado sobre ele (a maioria dos usuários de touch; muitos usuários web hoje), então trate este menu como um atalho aditivo, nunca como o único caminho para uma ação. Toda opção mostrada aqui também deve ser alcançável por um botão, DropdownMenu ou atalho de teclado em outro lugar da UI.
O compound espelha o DropdownMenu exatamente: itens, grupos, separadores, submenus, variantes de checkbox ou radio, shortcuts. A única diferença é o trigger: ContextMenuTrigger envolve uma região, e o menu abre na posição do cursor no clique direito.
Preview
'use client';import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuTrigger,} from '@gremorie/rx-overlays';export function ContextMenuPreview() { return ( <ContextMenu> <ContextMenuTrigger> <div className="flex h-32 w-full items-center justify-center rounded-lg border border-dashed text-sm text-muted-foreground"> Right-click here </div> </ContextMenuTrigger> <ContextMenuContent> <ContextMenuItem>Copy</ContextMenuItem> <ContextMenuItem>Paste</ContextMenuItem> <ContextMenuSeparator /> <ContextMenuItem>Delete</ContextMenuItem> </ContextMenuContent> </ContextMenu> );}Anatomia
ContextMenu raiz Radix, detém o estado de abertura
├─ ContextMenuTrigger região que responde ao clique direito
└─ ContextMenuContent superfície de menu em portal
├─ ContextMenuGroup agrupa itens relacionados
├─ ContextMenuItem linha de ação (variant default | destructive, inset)
│ └─ ContextMenuShortcut dica de teclado alinhada à direita
├─ ContextMenuCheckboxItem item alternável
├─ ContextMenuRadioGroup container de escolha única
│ └─ ContextMenuRadioItem item de escolha única
├─ ContextMenuLabel rótulo de seção não interativo
├─ ContextMenuSeparator divisor
└─ ContextMenuSub submenu aninhado
├─ ContextMenuSubTrigger linha que abre o submenu
└─ ContextMenuSubContent superfície de menu aninhadoInstalação
bash npx gremorie@latest add rx-context-menu bash pnpm dlx gremorie@latest add rx-context-menu
bash yarn dlx gremorie@latest add rx-context-menu
bash bunx --bun gremorie@latest add rx-context-menu
Uso
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuTrigger,
} from "@gremorie/rx-overlays";
export function Example() {
return (
<ContextMenu>
<ContextMenuTrigger>
<div className="flex h-32 w-full items-center justify-center rounded-lg border border-dashed text-sm text-muted-foreground">
Right-click here
</div>
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>Copy</ContextMenuItem>
<ContextMenuItem>Paste</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>Delete</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
);
}A edição Angular deste componente hoje é distribuída a partir do source (veja o workbench para o lado a lado); a entrada no registry vem a seguir.
API
<ContextMenu>
Estende o Radix ContextMenu.Root. API controlada padrão (onOpenChange, modal).
<ContextMenuTrigger>
Envolve a região que deve responder ao clique direito. Por padrão renderiza um <span>; use asChild para encaminhar estilos a um elemento alvo.
<ContextMenuContent>
Mesmo formato do DropdownMenuContent. Envolvido em um Portal do Radix. Posiciona-se no cursor na abertura.
<ContextMenuItem>
| Prop | Type | Default | Description |
|---|---|---|---|
inset | boolean | false | Adiciona pl-8 para o item alinhar com as linhas de checkbox/radio. |
variant | "default" | "destructive" | "default" | Troca a cor do texto e do ícone para o token destructive. |
disabled | boolean | false | Desabilita a interação; renderiza a 50% de opacidade. |
<ContextMenuCheckboxItem>, <ContextMenuRadioGroup>, <ContextMenuRadioItem>
Mesma semântica dos equivalentes no DropdownMenu. Os indicadores renderizam automaticamente no slot esquerdo posicionado de forma absoluta.
<ContextMenuLabel>, <ContextMenuSeparator>, <ContextMenuShortcut>
Helpers não interativos idênticos aos do DropdownMenu.
<ContextMenuSub> + <ContextMenuSubTrigger> + <ContextMenuSubContent>
Padrão de submenu aninhado. O sub-trigger renderiza um chevron auto-posicionado.
<ContextMenuPortal>, <ContextMenuGroup>
Pass-throughs sobre os primitivos do Radix com atributos data-slot.
Composição
<ContextMenu>detém o estado de aberto/fechado.<ContextMenuTrigger>envolve a região; o clique direito em qualquer ponto dela abre o menu.<ContextMenuContent>monta via Portal na posição do cursor.- Dentro do content: mesmo vocabulário de layout do
DropdownMenu(itens, grupos, separadores, shortcuts, submenus).
Variações
Submenu, checkbox e shortcuts
Clique com o botão direito na região para abrir um menu que combina shortcuts, um ContextMenuSub aninhado, um item de checkbox e uma ação destrutiva.
'use client';import { useState } from 'react';import { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger,} from '@gremorie/rx-overlays';export function ContextMenuSubmenuPreview() { const [snapToGrid, setSnapToGrid] = useState(true); return ( <ContextMenu> <ContextMenuTrigger> <div className="flex h-32 w-full items-center justify-center rounded-lg border border-dashed text-sm text-muted-foreground"> Right-click here </div> </ContextMenuTrigger> <ContextMenuContent className="w-52"> <ContextMenuItem> Copy <ContextMenuShortcut>⌘C</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem> Paste <ContextMenuShortcut>⌘V</ContextMenuShortcut> </ContextMenuItem> <ContextMenuSub> <ContextMenuSubTrigger>Move to</ContextMenuSubTrigger> <ContextMenuSubContent> <ContextMenuItem>Reports</ContextMenuItem> <ContextMenuItem>Archive</ContextMenuItem> <ContextMenuItem>Trash</ContextMenuItem> </ContextMenuSubContent> </ContextMenuSub> <ContextMenuSeparator /> <ContextMenuCheckboxItem checked={snapToGrid} onCheckedChange={(checked) => setSnapToGrid(checked === true)} > Snap to grid </ContextMenuCheckboxItem> <ContextMenuSeparator /> <ContextMenuItem variant="destructive">Delete</ContextMenuItem> </ContextMenuContent> </ContextMenu> );}Ações de navegador de arquivos
Clique com o botão direito em uma linha de arquivo para expor mover, renomear e excluir.
<ContextMenu>
<ContextMenuTrigger asChild>
<tr>
<td>Report.pdf</td>
<td>2.4 MB</td>
</tr>
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>Open</ContextMenuItem>
<ContextMenuItem>Rename</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>Move to</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuItem>Reports</ContextMenuItem>
<ContextMenuItem>Archive</ContextMenuItem>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuItem variant="destructive">Delete</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>Ferramentas de canvas com shortcuts
Shortcuts para usuários avançados em um app criativo. Emparelhe cada item com seu equivalente de teclado.
<ContextMenuContent>
<ContextMenuItem>
Copy
<ContextMenuShortcut>⌘C</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Paste
<ContextMenuShortcut>⌘V</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuCheckboxItem checked={snap}>Snap to grid</ContextMenuCheckboxItem>
</ContextMenuContent>Contexto por célula com radio group
Alterne o alinhamento dentro de uma célula de tabela.
<ContextMenuContent>
<ContextMenuLabel>Align</ContextMenuLabel>
<ContextMenuSeparator />
<ContextMenuRadioGroup value={align} onValueChange={setAlign}>
<ContextMenuRadioItem value="left">Left</ContextMenuRadioItem>
<ContextMenuRadioItem value="center">Center</ContextMenuRadioItem>
<ContextMenuRadioItem value="right">Right</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuContent>Acessibilidade
- Trigger: abre no clique direito e na tecla
Menu(Windows). O long-press não é um gesto web padrão, então usuários de touch não verão o menu por padrão. - Apenas aditivo: nunca coloque uma ação exclusivamente atrás de um context menu. Forneça um botão visível ou equivalente em
DropdownMenu. - Role:
role="menu"no content,role="menuitem"nos itens,role="menuitemcheckbox"erole="menuitemradio"nas variantes com estado. - Teclado: as setas navegam;
EntereSpaceativam; o type-ahead salta para itens que começam com a letra digitada;Escfecha. - Submenus:
→abre,←fecha. - Gestão de foco: o foco entra no menu na abertura e retorna à região do trigger ao fechar.
- Reduced motion: as animações de abrir/fechar respeitam
prefers-reduced-motion.
Relacionados
- Dropdown Menu - mesmo compound, acionado por um botão visível.
- Popover - overlay interativo não-menu ancorado a um trigger.
- Tooltip - dica de hover, nunca um menu.