Context menu
Um menu de ações ao clicar com o botão direito ou pressionar e segurar, com submenus, itens de checkbox e de rádio e feedback de pressão no toque.
Last action: Nothing yet
pnpm dlx shadcn@latest add https://hextaui.com/r/context-menu.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/context-menu.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Lista de arquivos
Dê a cada linha o seu próprio menu. A linha aberta mantém um destaque, e um item destrutivo passa a um alert dialog para confirmação.
Controlado
Passe open e onOpenChange para controlar o estado. O segundo argumento diz por que mudou, como trigger-press, outside-press ou escape-key. Itens com closeOnClick={false} o mantêm aberto.
Desabilitado
Um <ContextMenu /> desativado devolve a área ao menu nativo do navegador. Itens desativados continuam visíveis, mas são ignorados pelo teclado.
Feedback de pressão longa
Em telas sensíveis ao toque, o menu abre após um toque longo. Enquanto o dedo é mantido, a área encolhe um pouco para que as pessoas saibam que o toque foi registrado. Mover o dedo o cancela. Defina holdFeedback={false} para desativar.
Conteúdo longo
Rótulos longos quebram de linha dentro de uma largura máxima de 20rem, e menus altos rolam dentro do espaço restante no viewport.
Submenus aninhados
Os submenus abrem ao passar o mouse ou com as teclas de seta, em qualquer profundidade. Um gatilho de submenu desativado nunca abre.
Dentro de uma sheet
O menu fica acima de outras sobreposições, e Escape fecha apenas o menu, não o sheet atrás dele.
Renderizar como outro elemento
Use render para fazer do gatilho qualquer elemento, como um figure, ou para transformar um item em link.
Da direita para a esquerda
O menu lê a direção do gatilho, então os submenus abrem para a esquerda e as teclas de seta se invertem.
| Tecla | Ação |
|---|---|
| ↓ | Destaca o próximo item, voltando ao início no fim. |
| ↑ | Destaca o item anterior, voltando ao fim no início. |
| Home | Destaca o primeiro item. |
| End | Destaca o último item. |
| EnterSpace | Executa o item destacado. Itens de checkbox e radio alternam e mantêm o menu aberto. |
| → | Abre o submenu destacado e entra nele. ← em layouts da direita para a esquerda. |
| ← | Fecha o submenu atual e volta ao seu gatilho. → em layouts da direita para a esquerda. |
| Esc | Fecha o menu atual. Em um submenu, apenas esse submenu fecha. |
| A–Z | Destaca o próximo item que começa com aquela letra. |
- Um context menu é um atalho. Torne toda ação nele acessível de outra forma também, como um botão visível ou um dropdown menu, já que muitas pessoas nunca usam o clique direito nem o toque longo.
- Os navegadores também disparam o evento de context menu para Shift F10 e a tecla Menu em um elemento focado, então um elemento focável dentro do gatilho permite que usuários de teclado o abram.
- Os atalhos em
<ContextMenuShortcut />são apenas rótulos. Associe as teclas você mesmo. - Com movimento reduzido ativado, o feedback de pressão longa e o piscar do item são ignorados e o menu apenas faz fade.
Construído sobre o context menu do Base UI. Cada parte aceita as props da primitiva que envolve, e um className em forma de função que recebe o estado da parte.
| Prop | Tipo | Padrão |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChangedetails.reason informa o que causou a mudança. | (open: boolean, details) => void | – |
onOpenChangeCompleteExecuta depois que a animação de abertura ou fechamento termina. | (open: boolean) => void | – |
disabledMostra o menu nativo do navegador. | boolean | false |
loopFocusVolta ao início nas pontas da navegação por teclas de seta. | boolean | true |
highlightItemOnHover | boolean | true |
actionsRefFecha o menu de forma imperativa. | RefObject<{ close, unmount }> | – |
| Prop | Tipo | Padrão |
|---|---|---|
holdFeedbackEncolhe um pouco a área enquanto um toque longo é mantido em telas sensíveis ao toque. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-trigger" | Selecione o gatilho no CSS. |
data-popup-open | Presente enquanto o menu está aberto. |
data-holding | Presente enquanto um toque longo é mantido. |
data-pressed | Presente enquanto o gatilho está pressionado. |
| Prop | Tipo | Padrão |
|---|---|---|
sideLado preferido, em relação ao ponteiro. | "top" | "right" | "bottom" | "left" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 0 |
alignOffset | number | 0 |
collisionPaddingEspaço a manter entre o menu e as bordas do viewport. | number | { top, right, bottom, left } | – |
collisionAvoidanceComo o menu se inverte ou se desloca quando transbordaria. | CollisionAvoidance | – |
anchorPosiciona em relação a algo diferente do ponteiro. | Element | VirtualElement | RefObject | – |
finalFocusPara onde o foco vai depois que o menu fecha. | boolean | RefObject | (closeType) => HTMLElement | boolean | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-content" | O popup do menu. |
data-open | Presente enquanto aberto. |
data-starting-style | Presente enquanto o menu anima a entrada. |
data-ending-style | Presente enquanto o menu anima a saída. |
data-side | O lado em que foi posicionado após as colisões. |
data-chosen | Presente depois que um item é clicado. O fade-out espera o piscar. |
--transform-origin | O ponto de onde a animação de escala cresce. |
--available-height | Espaço restante no viewport. Limita a altura do menu. |
| Prop | Tipo | Padrão |
|---|---|---|
variant | "default" | "destructive" | "default" |
insetRecua o rótulo para alinhá-lo aos itens com checkbox. | boolean | false |
onClickExecuta ao clicar, com Enter ou Space. O menu fecha após um breve piscar. | (event) => void | – |
closeOnClick | boolean | true |
disabled | boolean | false |
labelTexto usado na busca por digitação quando os children não são texto simples. | string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-item" | Selecione itens no CSS. |
data-variant | A variante atual. |
data-highlighted | Presente no item sob o ponteiro ou com foco do teclado. |
data-disabled | Presente quando o item está desabilitado. |
data-inset | Presente quando inset está definido. |
data-chosen | Presente no item clicado enquanto ele pisca. |
| Prop | Tipo | Padrão |
|---|---|---|
checked | boolean | – |
defaultChecked | boolean | false |
onCheckedChange | (checked: boolean, details) => void | – |
closeOnClick | boolean | false |
inset | boolean | false |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-checkbox-item" | Seleciona os itens com checkbox no CSS. |
data-checked | Presente quando marcado. |
data-unchecked | Presente quando desmarcado. |
data-highlighted | Presente no item sob o ponteiro ou com foco do teclado. |
data-disabled | Presente quando o item está desabilitado. |
data-inset | Presente quando inset está definido. |
data-chosen | Presente no item clicado enquanto ele pisca. |
| Prop | Tipo | Padrão |
|---|---|---|
value | any | – |
defaultValue | any | – |
onValueChange | (value: any, details) => void | – |
disabled | boolean | false |
| Prop | Tipo | Padrão |
|---|---|---|
value | any | – |
closeOnClick | boolean | false |
inset | boolean | false |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-radio-item" | Seleciona os itens radio no CSS. |
data-checked | Presente quando selecionado. |
data-highlighted | Presente no item sob o ponteiro ou com foco do teclado. |
data-disabled | Presente quando o item está desabilitado. |
data-inset | Presente quando inset está definido. |
data-chosen | Presente no item clicado enquanto ele pisca. |
| Prop | Tipo | Padrão |
|---|---|---|
inset | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
Dentro de <ContextMenuGroup /> ou <ContextMenuRadioGroup />, rotula o grupo para tecnologias assistivas. Em outros lugares, é um heading simples.
| Prop | Tipo | Padrão |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
closeParentOnEscFecha o menu inteiro com Escape, não apenas este submenu. | boolean | false |
| Prop | Tipo | Padrão |
|---|---|---|
inset | boolean | false |
openOnHover | boolean | true |
delayMilissegundos de hover antes de o submenu abrir. | number | 100 |
closeDelay | number | 0 |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-sub-trigger" | Seleciona os gatilhos de submenu no CSS. |
data-popup-open | Presente enquanto o seu submenu está aberto. |
data-highlighted | Presente enquanto destacado. |
data-disabled | Presente quando desabilitado. |
| Prop | Tipo | Padrão |
|---|---|---|
sideAbre em direção ao fim da linha por padrão. | "top" | "right" | "bottom" | "left" | "inline-start" | "inline-end" | – |
align | "start" | "center" | "end" | – |
sideOffset | number | 0 |
alignOffset | number | -4 |
collisionPaddingEspaço a manter entre o menu e as bordas do viewport. | number | { top, right, bottom, left } | – |
collisionAvoidanceComo o menu se inverte ou se desloca quando transbordaria. | CollisionAvoidance | – |
anchorPosiciona em relação a algo diferente do ponteiro. | Element | VirtualElement | RefObject | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-sub-content" | O popup do submenu. Recebe os mesmos atributos de estado do menu. |
| Prop | Tipo | Padrão |
|---|---|---|
dirMantém atalhos como ⇧⌘S em ordem dentro de menus da direita para a esquerda. | "ltr" | "rtl" | "ltr" |
| Atributo | Descrição |
|---|---|
data-slot="context-menu-shortcut" | O rótulo do atalho. |
<ContextMenuGroup /> agrupa itens relacionados sob um rótulo. <ContextMenuSeparator /> desenha um divisor. Ambos aceitam render e className, e carregam context-menu-group e context-menu-separator como seu data-slot.
- Alert dialogUm diálogo de confirmação para ações destrutivas ou importantes que aguarda trabalho assíncrono e vira um bottom sheet no celular.
- CommandUma lista pesquisável de ações, inline ou como paleta ⌘K, com páginas, atalhos e correspondências destacadas.
- DialogUma janela sobre a página para formulários e tarefas focadas, com cabeçalho e rodapé fixos, aninhamento e um bottom sheet com deslize no celular.
- DrawerUm painel que desliza a partir de qualquer borda e acompanha o seu dedo, com pontos de ancoragem, uma alça funcional e drawers aninhados que se empilham.
- Dropdown menuUm menu de ações e opções atrás de um botão, com grupos, submenus, itens de checkbox e de rádio e atalhos.
- Hover cardUm card de prévia que abre quando um link recebe hover ou foco, para conteúdo que usuários que enxergam podem conferir rapidamente.
Usado em blocos
Blocos que se baseiam em Context menu.