CommandPalette
Paleta de comandos — uma busca dentro de um diálogo que encontra e executa comandos, páginas e registros pelo nome. Agiliza quem usa o app todo dia; tudo o que está nela também precisa de um caminho visível.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no cliente.
import { CommandPalette, CommandPaletteTrigger, CommandPaletteContent, CommandPaletteInput, CommandPaletteList, CommandPaletteGroup, CommandPaletteItem, CommandPaletteEmpty, CommandPaletteFooter } from "@camaleo/react";Anatomia
O CommandPaletteContent renderiza o fundo e o dialog num portal. O foco fica na busca; as setas movem um destaque pela lista com aria-activedescendant.
Exemplos
Todo exemplo é um arquivo real que você pode copiar, no estilo, modo e marca da barra acima. Todos começam fechados: abra, digite, use as setas e o Enter, depois o Esc. A paleta não filtra sozinha. Guarde a busca no estado, renderize só os comandos que correspondem e dê ao CommandPaletteList um key={query}, para as setas seguirem a nova ordem.
Ctrl+K e atalhos dos comandos
Aperte Ctrl+K em qualquer lugar desta página. O botão continua sendo a entrada visível, e cada comando mostra o próprio atalho para as pessoas aprenderem.
Grupos: Navegação, Ações, Recentes
Títulos ajudam a percorrer uma lista longa. Um grupo sem resultados some junto com o título, e o destaque rola até ficar à vista.
Palavras-chave e sinônimos
Digite "recibo" ou "adicionar usuário". As pessoas buscam com as próprias palavras, então procure também nas palavras-chave e mostre qual delas bateu.
Estado vazio
Repita o que foi buscado e sugira o que tentar. A busca continua na caixa, fácil de corrigir.
Resultados do servidor
Digite um nome. Enquanto a requisição roda, a lista fica com aria-busy e o rodapé diz "Buscando…"; uma busca mais nova descarta a anterior.
Páginas dentro da paleta
"Mudar tema…" abre uma página de opções. O Esc ou o Backspace com a busca vazia voltam um nível antes de fechar.
Contagem e resultado anunciados
A contagem do rodapé é um status educado, lido quando a digitação pausa. Depois que um comando roda, um status fora da paleta diz o que aconteceu.
Um comando que você não pode rodar
Deixe na lista com aria-disabled e diga por quê. As pessoas encontram, descobrem quem pode fazer, e o Enter não faz nada.
Em contexto
Estas são partes inteiras de interface que você pode copiar, no estilo que escolheu.
Boas práticas
Emitir e exportar têm botões próprios. A paleta é o caminho mais rápido para quem já sabe o que quer.
Ninguém navega por uma caixa de busca. Se "Emitir nota fiscal" não está na página, a maioria nunca encontra.
"Enviar lembrete de pagamento" diz o que vai acontecer, e a primeira palavra é o que as pessoas digitam.
"Nota fiscal" pode abrir, emitir ou cancelar uma. Uma frase é cortada e difícil de encontrar.
Props
onOpenChange para controlar o estado.true prende o foco e esconde a página de trás dos leitores de tela. Mantenha o padrão.eventDetails.reason diz o motivo, por exemplo escape-key.CommandPaletteContent, CommandPaletteList, CommandPaletteEmpty e CommandPaletteFooter recebem as props da sua div; passe aria-label ao conteúdo e à lista. O CommandPaletteInput recebe as props de um input, incluindo value, onChange e aria-label. O CommandPaletteTrigger recebe render.
Cada comando é um CommandPaletteItem:
data-value, para o seu filtro ou para testes. A paleta não filtra por ele.onSelect doesn't run. Say why in the label.O onSelect executa o comando, no clique ou no Enter com o item destacado. Ele também recebe as props da sua div, como aria-disabled, aria-keyshortcuts e onMouseDown. O CommandPaletteGroup recebe label, o título visível do grupo.
Styling hooks
Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou na própria paleta.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
/* uma lista mais alta para o buscador de arquivos */
.editor [data-slot="command-palette-list"] {
max-height: 24rem;
}Acessibilidade
- O dialog é modal e precisa de um nome: passe aria-label ao CommandPaletteContent, e outro ao CommandPaletteInput, no idioma da página.
- A busca é um combobox com aria-expanded e aria-controls apontando para o listbox. O aria-activedescendant acompanha o destaque, então o leitor de tela lê cada comando conforme você se move.
- Os resultados mudam em silêncio. Coloque a contagem num role="status" dentro da paleta e, depois que um comando roda, conte o resultado num status fora dela: a paleta sumiu e o foco voltou ao gatilho.
- O Ctrl+K escuta a página toda. Deixe shortcut ligado em uma paleta só e desligue nas outras, ou um toque abre todas.