vaiperui

componentes / menu

Menu

Botão de menu suspenso com navegação por setas, busca por digitação, ícones, separadores e itens perigosos.

Como usar

A lista é `role="menu"` com botões `menuitem`. Setas, Home e End movem entre itens (desabilitados são pulados), digitar uma letra salta para um item correspondente, Enter/Espaço seleciona, Esc fecha e devolve o foco ao gatilho. `onSelect` roda no clique e no teclado; chame `event.preventDefault()` nele para manter o menu aberto. Monte com `MenuItem`, `MenuLabel` e `MenuSeparator`.

preview
Menu.tsx
import { Button, Menu, MenuItem, MenuLabel, MenuSeparator } from "vaiperui";
<Menu trigger={<Button variant="outlined">Ações</Button>} label="Ações">
<MenuLabel>Projeto</MenuLabel>
<MenuItem icon="✎" onSelect={() => rename()}>Renomear</MenuItem>
<MenuItem disabled>Arquivar</MenuItem>
<MenuSeparator />
<MenuItem destructive icon="✕">Excluir</MenuItem>
</Menu>

Alinhamento

preview
start
center
end
alinhamento.tsx
<Menu align="start" trigger={<Button>start</Button>}>...</Menu>
<Menu align="center" trigger={<Button>center</Button>}>...</Menu>
<Menu align="end" trigger={<Button>end</Button>}>...</Menu>

Props

PropValoresPadrãoDescrição
triggerReactElementnenhumBotão que abre o menu (precisa de ref, foco e onClick)
labelstringnenhumNome acessível do menu
side / aligntop | right | bottom | left / start | center | endbottom / startLado do gatilho e alinhamento
open / defaultOpen / onOpenChangeboolean / boolean / (open) => voidnenhumEstado aberto controlado ou não controlado
sizesm | md | lgmdTamanho do texto dos itens
radius / animationnone | sm | md | lg | full / none | smooth | fast | bouncelg / fastArredondamento e velocidade da transição de entrada
MenuItemonSelect, icon, destructive, disablednenhumItem; `onSelect` roda no clique/teclado e o menu fecha, a menos que seja impedido

Acessibilidade

  • A lista é `role="menu"` nomeada por `label`; cada `MenuItem` é um `button` com `role="menuitem"`.
  • O gatilho recebe `aria-haspopup="menu"`, `aria-expanded` e, enquanto aberto, `aria-controls`.
  • Ao abrir, o foco vai para o primeiro item habilitado; itens desabilitados são pulados pelas setas.
  • A navegação por setas é circular, e digitar letras em até 500ms salta para o próximo item cujo texto começa com elas.
  • Selecionar um item fecha o menu e devolve o foco ao gatilho, a menos que `onSelect` chame `event.preventDefault()`.
  • `MenuSeparator` é `role="separator"`, `MenuLabel` é `role="presentation"` e os ícones dos itens são `aria-hidden`.

Teclado

TeclaAção
ArrowDownNo gatilho fechado, abre o menu; dentro, vai ao próximo item
ArrowUpVai ao item anterior
Home / EndVai ao primeiro / último item
A-ZBusca por digitação: salta ao item cujo texto começa com as letras digitadas
Enter / SpaceAtiva o item focado
EscFecha o menu e foca o gatilho
TabFecha o menu e deixa o foco seguir

Tenha em mente

  • Os itens devem ser ações simples; não é uma barra de menu e não há itens marcáveis (`menuitemcheckbox`/`menuitemradio`) nem submenus.
  • Passe `label` para o menu ter nome acessível; o gatilho precisa de texto visível ou do próprio `aria-label`.