KDS
Overlays

DropdownMenu

Menu de ações ancorado a um trigger — verbos, atalhos, submenus.

Overview

DropdownMenu é um menu verb-led ancorado a um trigger. Use para ações (Editar, Duplicar, Excluir) — não para valores. A regra mental que evita confusão:

Os itens são…Use
verbos ("Editar", "Excluir")DropdownMenu
substantivos ("USA", "Brasil")Select

Suporta atalhos de teclado, submenus, checkbox / radio items, e item destrutivo. Evite misturar — um menu com 4 ações + 3 valores geralmente esconde dois componentes diferentes.

Preview
Menu de conta com submenus e shortcut.

Anatomy

<DropdownMenu>
  <DropdownMenuTrigger />
  <DropdownMenuContent>
    <DropdownMenuLabel />              ← título da seção
    <DropdownMenuSeparator />
    <DropdownMenuGroup>
      <DropdownMenuItem>               ← ação simples
        Editar
        <DropdownMenuShortcut>⌘E</DropdownMenuShortcut>
      </DropdownMenuItem>
      <DropdownMenuSub>
        <DropdownMenuSubTrigger />     ← abre submenu
        <DropdownMenuSubContent />
      </DropdownMenuSub>
      <DropdownMenuCheckboxItem />     ← toggle on/off
      <DropdownMenuRadioGroup>
        <DropdownMenuRadioItem />      ← exclusivo
      </DropdownMenuRadioGroup>
    </DropdownMenuGroup>
    <DropdownMenuItem variant="destructive" />  ← ação perigosa
  </DropdownMenuContent>
</DropdownMenu>

Subcomponents

ComponenteDescrição
DropdownMenuRaiz.
DropdownMenuTriggerElemento que abre o menu.
DropdownMenuContentContainer portalado.
DropdownMenuItemItem de ação. Aceita variant: 'default' | 'destructive'.
DropdownMenuCheckboxItemToggle on/off com indicador.
DropdownMenuRadioGroup + DropdownMenuRadioItemSeleção exclusiva entre N opções.
DropdownMenuLabelCabeçalho de seção.
DropdownMenuSeparatorLinha divisória entre grupos.
DropdownMenuShortcutTexto à direita com keyboard shortcut.
DropdownMenuSub + SubTrigger + SubContentSubmenu nested.
DropdownMenuGroupAgrupa items relacionados (semantic).
DropdownMenuPortalNecessário para SubContent em alguns casos.

Usage

import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuSeparator
} from "@kalvner/kds/overlays/dropdown-menu";
import { Button } from "@kalvner/kds/forms/button";

export function RowActions() {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <Button variant="ghost" size="icon-sm" aria-label="Ações">…</Button>
      </DropdownMenuTrigger>
      <DropdownMenuContent>
        <DropdownMenuItem>Editar</DropdownMenuItem>
        <DropdownMenuItem>Duplicar</DropdownMenuItem>
        <DropdownMenuSeparator />
        <DropdownMenuItem variant="destructive">Excluir</DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  );
}

States

Checkbox items
Toggle de exibição de paineis.
Radio group
Densidade da view (1 ativo).

When to use

  • Menu de ações em row de tabela (Editar, Duplicar, Excluir).
  • Avatar menu (Perfil, Configurações, Sair).
  • "Mais opções" em toolbars onde nem tudo cabe na linha.
  • Toggle de configurações de view (densidade, mostrar concluídos).

When not to use

  • Para selecionar entre valores — use Select.
  • Para ação primária na superfície — use Button direto.
  • Para menus baseados em right-click — use ContextMenu.
  • Para previews em hover — use HoverCard.

Best practices

  • Verbos curtos. "Editar", "Duplicar", "Excluir". Sem "Edição completa" ou "Excluir esta linha".
  • Destructive last + separator. Ação destrutiva por último, separada por Separator para não ser clicada por reflexo.
  • Atalhos quando existirem. Mostre o keyboard shortcut com DropdownMenuShortcut — ensina o atalho enquanto o usuário usa o menu.
  • Submenus com moderação. Mais que 1 nível de submenu fica difícil de navegar com teclado. Se você precisar de mais, use Sheet ou Dialog para a configuração.
  • Disabled vs hidden. Items inalcançáveis na situação atual (ex.: "API requer login") ficam disabled, não escondidos. Mantém consistência espacial.

Accessibility

ConcernComportamento
RolesRadix aplica role="menu" + role="menuitem" (e variantes).
FocoFoco entra no primeiro item ao abrir. Volta ao trigger ao fechar.
Keyboard↑/↓ navega items. abre submenu. Enter ativa. Esc fecha. Tipear letra pula para item começando com aquela letra.
Screen readerItens são anunciados como "menuitem"; checkboxes como "menuitemcheckbox" + estado; radios como "menuitemradio" + estado.
Destructive variantNão é anunciada por SR (é estilo). Inclua a palavra "Excluir" no label.
  • ContextMenu — menu equivalente via right-click.
  • Select — para escolher entre valores.
  • Popover — quando o menu precisa hospedar form ou conteúdo rico.

On this page