Command
Uma lista pesquisável de ações, inline ou como paleta ⌘K, com páginas, atalhos e correspondências destacadas.
pnpm dlx shadcn@latest add https://hextaui.com/r/command.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 cmdk cnCopie e cole o código a seguir no seu projeto.
components/ui/command.tsx components/ui/button.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Os atalhos usam mod para ⌘ em dispositivos Apple e Ctrl em todos os outros. Os rótulos são formatados por plataforma para você.
Básico
Digitar filtra e classifica os itens conforme você escreve. Grupos sem correspondências desaparecem, e a altura da lista é animada para se ajustar ao que sobra.
Dialog
Coloque um <Command /> dentro de <CommandDialog /> e alterne-o com useCommandHotkey. Pressione ⌘K ou Ctrl K. Os atalhos dos itens funcionam enquanto ele está aberto, as correspondências são destacadas e preserveSearch mantém a consulta e a seleção para a próxima vez que abrir.
Páginas
Um item com page abre o <CommandPage /> correspondente. O título da página aparece como um chip no input, a lista desliza pelo lado, e Backspace em uma busca vazia ou Escape volta.
Rolável
Listas longas rolam dentro de uma altura limitada. O item selecionado sempre é mantido à vista enquanto você se move pelo teclado.
Resultados assíncronos
Defina shouldFilter={false} e renderize os resultados que você buscar. <CommandLoading /> espera 150 ms antes de aparecer e então permanece por pelo menos 300 ms, de modo que respostas rápidas nunca exibem um spinner em flash. Experimente as duas latências.
Conteúdo longo
Os títulos quebram de linha, nomes longos são truncados ou quebrados como você preferir, e os atalhos nunca são empurrados para fora.
Da direita para a esquerda
Os ícones, os atalhos, o chip da página e o deslize da página seguem a direção de leitura.
| Tecla | Ação |
|---|---|
| ↓ | Seleciona o próximo item. |
| ↑ | Seleciona o item anterior. |
| Alt↓ | Salta para o primeiro item do próximo grupo. |
| Alt↑ | Salta para o primeiro item do grupo anterior. |
| Home | Seleciona o primeiro item. |
| End | Seleciona o último item. |
| CtrlN | Seleciona o próximo item. Ctrl J também funciona. Desative com vimBindings. |
| CtrlP | Seleciona o item anterior. Ctrl K também funciona. Desative com vimBindings. |
| Enter | Executa o item selecionado. Em um item de link, ⌘ Enter ou Ctrl Enter o abre em uma nova aba. |
| Esc | Primeiro limpa a busca, depois volta uma página e depois fecha o diálogo. |
| Backspace | Volta uma página quando a busca está vazia. |
| ⌘P | Qualquer atalho de item executa o seu item enquanto o foco está dentro do menu de comandos. |
- O input é um combobox que aponta para o item selecionado, então os leitores de tela anunciam cada item conforme você se move.
- Uma região live educada (polite) anuncia o número de resultados logo depois que você para de digitar e anuncia o título da página ao abrir ou sair de uma página. Altere o texto com
formatResultserootTitle. <CommandDialog />tem título e descrição ocultos, prende o foco enquanto aberto e o devolve ao gatilho ao fechar.- Os atalhos dos itens são expostos com
aria-keyshortcuts. - Com movimento reduzido ativado, os itens executam sem o piscar de confirmação e as páginas aparecem com fade em vez de deslizar.
Construído sobre o cmdk, com <CommandDialog /> no diálogo do Base UI. As partes aceitam as props da parte do cmdk que envolvem.
| Prop | Tipo | Padrão |
|---|---|---|
labelNome acessível do menu. | string | "Command menu" |
highlightDestaca as letras correspondentes em cada item e atenua o resto. | boolean | false |
shouldFilterDefina como false para filtrar e ordenar os itens você mesmo, por exemplo quando os resultados vêm de um servidor. | boolean | true |
filterRetorna uma pontuação de 0 (oculto) a 1 (melhor correspondência). | (value: string, search: string, keywords?: string[]) => number | – |
valueO valor do item selecionado. | string | – |
defaultValue | string | – |
onValueChange | (value: string) => void | – |
loopVolta ao início nas pontas da lista. | boolean | false |
vimBindingsNavegação com Ctrl N, J, P e K. | boolean | true |
disablePointerSelection | boolean | false |
formatResultsTexto anunciado aos leitores de tela após a digitação. | (count: number) => string | "3 results" |
rootTitleAnunciado quando você sai da última página e volta à raiz. | string | "All commands" |
| Atributo | Descrição |
|---|---|
data-slot="command" | Selecione a raiz no CSS. |
data-highlighting | Presente enquanto highlight está ativado e a busca não está vazia. |
--command-radius | Raio externo. Os itens derivam dele um raio concêntrico. |
--command-inset | Padding entre a borda da lista e seus itens. |
| Prop | Tipo | Padrão |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
preserveSearchMantém o diálogo montado para que a consulta, a página e a seleção sobrevivam ao fechamento. A consulta fica selecionada quando ele reabre. | boolean | false |
titleTítulo do diálogo visualmente oculto. | string | "Command menu" |
descriptionDescrição do diálogo visualmente oculta. | string | "Search for a command to run." |
showCloseButton | boolean | false |
classNameAplicado ao popup do diálogo. | string | – |
| Atributo | Descrição |
|---|---|
data-slot="command-dialog" | O popup do diálogo. |
data-slot="command-dialog-overlay" | O pano de fundo. |
data-open | Presente no popup enquanto está aberto. |
| Prop | Tipo | Padrão |
|---|---|---|
valueTexto de busca controlado. | string | – |
onValueChange | (search: string) => void | – |
placeholder | string | – |
clearLabelNome acessível do botão de limpar. | string | "Clear search" |
backLabelNome acessível do chip da página. | (title: string) => string | (title) => `Back from ${title}` |
| Atributo | Descrição |
|---|---|
data-slot="command-input" | O input. |
data-slot="command-input-wrapper" | A linha que contém o ícone, o input e o botão de limpar. |
data-slot="command-clear" | O botão de limpar, exibido depois que você digita. |
data-slot="command-page-chip" | O chip de voltar exibido em uma página. |
| Prop | Tipo | Padrão |
|---|---|---|
labelNome acessível da lista. | string | – |
| Atributo | Descrição |
|---|---|
data-slot="command-list" | A lista. |
data-settled | Presente depois que a lista se mediu. A transição de altura só roda enquanto está definido. |
--cmdk-list-height | Altura dos itens visíveis, usada para animar a lista. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenUse a forma de função para repetir a consulta. | ReactNode | (search: string) => ReactNode | – |
| Atributo | Descrição |
|---|---|
data-slot="command-empty" | Oculto enquanto um CommandLoading está na lista. |
| Prop | Tipo | Padrão |
|---|---|---|
loading | boolean | true |
delayMilissegundos de espera antes de o spinner aparecer. | number | 150 |
minDurationMínimo de milissegundos que o spinner permanece depois de exibido. | number | 300 |
labelRótulo acessível. O padrão são os children em string. | string | – |
progress | number | – |
| Atributo | Descrição |
|---|---|
data-slot="command-loading" | A linha de carregamento. |
data-pending | Presente durante o delay, enquanto a linha é anunciada mas ainda não está visível. |
| Prop | Tipo | Padrão |
|---|---|---|
heading | ReactNode | – |
valueObrigatório quando não há heading. | string | – |
forceMountMantém o grupo visível durante a filtragem. | boolean | false |
| Atributo | Descrição |
|---|---|
data-slot="command-group" | O grupo. |
[cmdk-group-heading] | O elemento de heading. |
| Prop | Tipo | Padrão |
|---|---|---|
onSelectExecuta ao clicar, com Enter ou pelo atalho do item, depois do piscar de confirmação. | (value: string) => void | – |
valueUsado na filtragem. O padrão é o texto do item, sem o atalho. | string | – |
keywordsPalavras extras que correspondem a este item. | string[] | – |
disabled | boolean | false |
shortcutUm atalho de teclado como "mod+shift+c". Exibido no item e o executa enquanto o foco está no menu. | string | – |
pageAbre o CommandPage com este id em vez de executar. | string | – |
pageTitleTítulo exibido no chip da página. O padrão é o value. | string | – |
hrefRenderiza o item como um link. Enter o segue, ⌘ ou Ctrl Enter abre uma nova aba. | string | – |
renderUm elemento de link para renderizar no lugar, como o <Link /> do Next.js. | ReactElement | – |
confirmPisca o item brevemente antes de executá-lo, para que a escolha seja percebida. | boolean | true |
forceMountMantém o item visível durante a filtragem. | boolean | false |
| Atributo | Descrição |
|---|---|
data-slot="command-item" | O item. |
data-selected="true" | Presente no item selecionado. |
data-disabled="true" | Presente em itens desativados. |
data-value | O valor usado para filtragem. |
data-confirming | Presente durante o piscar de confirmação. |
data-page | Presente em itens que abrem uma página. |
| Prop | Tipo | Padrão |
|---|---|---|
idCorresponde à prop page do item que a abre. Seus grupos e itens só são renderizados enquanto ela é a página atual. | string | – |
| Prop | Tipo | Padrão |
|---|---|---|
hotkeyFormata um atalho como "mod+k" para a plataforma atual. Os children o substituem. | string | – |
| Atributo | Descrição |
|---|---|
data-slot="command-shortcut" | O rótulo do atalho. |
| Prop | Tipo | Padrão |
|---|---|---|
alwaysRenderMantém visível durante a busca. | boolean | false |
| Atributo | Descrição |
|---|---|
data-slot="command-separator" | O separador. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenO padrão são dicas de teclas que se atualizam em uma página. Oculto em telas sensíveis ao toque. | ReactNode | – |
| Atributo | Descrição |
|---|---|
data-slot="command-footer" | O rodapé. |
| Prop | Tipo | Padrão |
|---|---|---|
hotkeyEscutado no documento inteiro. Atalhos sem modificador são ignorados enquanto você digita em um campo. | string | – |
callback | (event: KeyboardEvent) => void | – |
options.enabled | boolean | true |
Retorna se um indicador de carregamento deve estar visível, com o mesmo delay e duração mínima de <CommandLoading />. Use para ocultar resultados desatualizados enquanto uma requisição está em andamento.
| Prop | Tipo | Padrão |
|---|---|---|
loading | boolean | – |
options.delay | number | 150 |
options.minDuration | number | 300 |
useCommandPages()retorna{ pages, page, push, pop, reset }para controlar as páginas a partir do seu código.useCommandState(selector)lê o estado do cmdk, como a busca ou a contagem filtrada.useHotkeyLabel(hotkey)formata um atalho para a plataforma atual, como ⌘K ou Ctrl+K.
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- HotkeyAnalise, rotule, anuncie e compare atalhos de teclado, com ⌘ nas plataformas Apple e Ctrl em todas as outras.
- MotionAs curvas de easing, as durações e a verificação de movimento reduzido com que todo componente anima, além de hooks para transformações de tamanho e destaques deslizantes.
- SpinnerUm indicador de carregamento com tracinhos no estilo Apple ou um anel que "respira", que pode esperar antes de aparecer e permanecer o suficiente para não piscar.
- 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.
- Context menuUm 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.
Usado em blocos
Blocos que se baseiam em Command.