Command
Una lista de acciones con búsqueda, en línea o como paleta ⌘K, con páginas, atajos y coincidencias resaltadas.
pnpm dlx shadcn@latest add https://hextaui.com/r/command.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cmdk cnCopia y pega el siguiente código en tu proyecto.
components/ui/command.tsx components/ui/button.tsx lib/motion.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Los atajos usan mod para ⌘ en dispositivos Apple y Ctrl en todos los demás. Las etiquetas se formatean por plataforma automáticamente.
Básico
Al escribir se filtran y clasifican los elementos sobre la marcha. Los grupos sin coincidencias desaparecen y la altura de la lista se anima para ajustarse a lo que queda.
Dialog
Pon un <Command /> dentro de <CommandDialog /> y alterna con useCommandHotkey. Pulsa ⌘K o Ctrl K. Los atajos de los elementos funcionan mientras está abierto, las coincidencias se resaltan y preserveSearch conserva la consulta y la selección para la próxima vez que se abra.
Páginas
Un elemento con page abre el <CommandPage /> correspondiente. El título de la página aparece como un chip en el input, la lista entra deslizándose desde el lado, y Backspace en una búsqueda vacía o Escape vuelve atrás.
Desplazable
Las listas largas se desplazan dentro de una altura limitada. El elemento seleccionado se mantiene siempre a la vista mientras te mueves con el teclado.
Resultados asíncronos
Define shouldFilter={false} y renderiza los resultados que obtengas. <CommandLoading /> espera 150 ms antes de aparecer y luego permanece al menos 300 ms, así que las respuestas rápidas nunca muestran un spinner por un instante. Prueba ambas latencias.
Contenido largo
Los encabezados se ajustan, los nombres largos se truncan o se ajustan según elijas, y los atajos nunca quedan desplazados fuera.
De derecha a izquierda
Los iconos, los atajos, el chip de página y el deslizamiento de página siguen la dirección de lectura.
| Key | Acción |
|---|---|
| ↓ | Selecciona el elemento siguiente. |
| ↑ | Selecciona el elemento anterior. |
| Alt↓ | Salta al primer elemento del grupo siguiente. |
| Alt↑ | Salta al primer elemento del grupo anterior. |
| Home | Selecciona el primer elemento. |
| End | Selecciona el último elemento. |
| CtrlN | Selecciona el elemento siguiente. Ctrl J también funciona. Desactívalo con vimBindings. |
| CtrlP | Selecciona el elemento anterior. Ctrl K también funciona. Desactívalo con vimBindings. |
| Enter | Ejecuta el elemento seleccionado. En un elemento de enlace, ⌘ Enter o Ctrl Enter lo abre en una pestaña nueva. |
| Esc | Primero borra la búsqueda, luego retrocede una página y después cierra el diálogo. |
| Backspace | Retrocede una página cuando la búsqueda está vacía. |
| ⌘P | Cualquier atajo de un elemento ejecuta ese elemento mientras el foco está dentro del menú de comandos. |
- El input es un combobox que apunta al elemento seleccionado, así que los lectores de pantalla anuncian cada elemento a medida que te mueves.
- Una región activa polite anuncia el número de resultados poco después de que dejas de escribir, y anuncia el título de la página cuando abres o sales de una. Cambia el texto con
formatResultsyrootTitle. <CommandDialog />tiene un título y una descripción ocultos, atrapa el foco mientras está abierto y lo devuelve al trigger cuando se cierra.- Los atajos de los elementos se exponen con
aria-keyshortcuts. - Con movimiento reducido, los elementos se ejecutan sin el parpadeo de confirmación y las páginas se desvanecen en lugar de deslizarse.
Construido sobre cmdk, con <CommandDialog /> sobre el diálogo de Base UI. Las partes aceptan las props de la parte de cmdk que envuelven.
| Prop | Tipo | Predeterminado |
|---|---|---|
labelNombre accesible del menú. | string | "Command menu" |
highlightResalta las letras coincidentes en cada elemento y atenúa el resto. | boolean | false |
shouldFilterPonlo en false para filtrar y ordenar los elementos tú mismo, por ejemplo cuando los resultados vienen de un servidor. | boolean | true |
filterDevuelve una puntuación de 0 (oculto) a 1 (mejor coincidencia). | (value: string, search: string, keywords?: string[]) => number | – |
valueEl valor del elemento seleccionado. | string | – |
defaultValue | string | – |
onValueChange | (value: string) => void | – |
loopVuelve al otro extremo al llegar a los extremos de la lista. | boolean | false |
vimBindingsNavegación con Ctrl N, J, P y K. | boolean | true |
disablePointerSelection | boolean | false |
formatResultsTexto que se anuncia a los lectores de pantalla tras escribir. | (count: number) => string | "3 results" |
rootTitleSe anuncia al salir de la última página y volver a la raíz. | string | "All commands" |
| Atributo | Descripción |
|---|---|
data-slot="command" | Apunta a la raíz en CSS. |
data-highlighting | Presente mientras highlight está activado y la búsqueda no está vacía. |
--command-radius | Radio exterior. Los elementos derivan de él un radio concéntrico. |
--command-inset | Relleno entre el borde de la lista y sus elementos. |
| Prop | Tipo | Predeterminado |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
preserveSearchMantiene el diálogo montado para que la consulta, la página y la selección sobrevivan al cierre. La consulta queda seleccionada al reabrirlo. | boolean | false |
titleTítulo del diálogo oculto visualmente. | string | "Command menu" |
descriptionDescripción del diálogo oculta visualmente. | string | "Search for a command to run." |
showCloseButton | boolean | false |
classNameSe aplica al popup del diálogo. | string | – |
| Atributo | Descripción |
|---|---|
data-slot="command-dialog" | El popup del diálogo. |
data-slot="command-dialog-overlay" | El fondo. |
data-open | Presente en el popup mientras está abierto. |
| Prop | Tipo | Predeterminado |
|---|---|---|
valueTexto de búsqueda controlado. | string | – |
onValueChange | (search: string) => void | – |
placeholder | string | – |
clearLabelNombre accesible del botón de borrar. | string | "Clear search" |
backLabelNombre accesible del chip de página. | (title: string) => string | (title) => `Back from ${title}` |
| Atributo | Descripción |
|---|---|
data-slot="command-input" | El input. |
data-slot="command-input-wrapper" | La fila que contiene el icono, el input y el botón de borrar. |
data-slot="command-clear" | El botón de borrar, que se muestra una vez que escribes. |
data-slot="command-page-chip" | El chip de retroceso que se muestra en una página. |
| Prop | Tipo | Predeterminado |
|---|---|---|
labelNombre accesible de la lista. | string | – |
| Atributo | Descripción |
|---|---|
data-slot="command-list" | La lista. |
data-settled | Presente una vez que la lista se ha medido. La transición de altura solo se ejecuta mientras está definido. |
--cmdk-list-height | Altura de los elementos visibles, usada para animar la lista. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenUsa la forma de función para reflejar la consulta. | ReactNode | (search: string) => ReactNode | – |
| Atributo | Descripción |
|---|---|
data-slot="command-empty" | Oculto mientras hay un CommandLoading en la lista. |
| Prop | Tipo | Predeterminado |
|---|---|---|
loading | boolean | true |
delayMilisegundos de espera antes de que aparezca el spinner. | number | 150 |
minDurationMilisegundos mínimos que permanece el spinner una vez mostrado. | number | 300 |
labelEtiqueta accesible. Por defecto, los hijos de tipo cadena. | string | – |
progress | number | – |
| Atributo | Descripción |
|---|---|
data-slot="command-loading" | La fila de carga. |
data-pending | Presente durante el retraso, mientras la fila se anuncia pero aún no es visible. |
| Prop | Tipo | Predeterminado |
|---|---|---|
heading | ReactNode | – |
valueObligatorio cuando no hay encabezado. | string | – |
forceMountMantiene el grupo visible al filtrar. | boolean | false |
| Atributo | Descripción |
|---|---|
data-slot="command-group" | El grupo. |
[cmdk-group-heading] | El elemento de encabezado. |
| Prop | Tipo | Predeterminado |
|---|---|---|
onSelectSe ejecuta al hacer clic, con Enter o con el atajo del elemento, tras el parpadeo de confirmación. | (value: string) => void | – |
valueSe usa para filtrar. Por defecto es el texto del elemento, sin el atajo. | string | – |
keywordsPalabras adicionales que coinciden con este elemento. | string[] | – |
disabled | boolean | false |
shortcutUn atajo como "mod+shift+c". Se muestra en el elemento y lo ejecuta mientras el foco está en el menú. | string | – |
pageAbre el CommandPage con este id en lugar de ejecutarse. | string | – |
pageTitleTítulo que se muestra en el chip de página. Por defecto es el valor. | string | – |
hrefRenderiza el elemento como un enlace. Enter lo sigue, ⌘ o Ctrl Enter abre una pestaña nueva. | string | – |
renderUn elemento de enlace para renderizar en su lugar, como <Link /> de Next.js. | ReactElement | – |
confirmHace parpadear brevemente el elemento antes de ejecutarlo, para que se note la elección. | boolean | true |
forceMountMantiene el elemento visible al filtrar. | boolean | false |
| Atributo | Descripción |
|---|---|
data-slot="command-item" | El elemento. |
data-selected="true" | Presente en el elemento seleccionado. |
data-disabled="true" | Presente en los elementos deshabilitados. |
data-value | El valor usado para filtrar. |
data-confirming | Presente durante el parpadeo de confirmación. |
data-page | Presente en los elementos que abren una página. |
| Prop | Tipo | Predeterminado |
|---|---|---|
idCoincide con la prop page del elemento que lo abre. Sus grupos y elementos solo se renderizan mientras es la página actual. | string | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
hotkeyDa formato a un atajo como "mod+k" para la plataforma actual. Los hijos lo reemplazan. | string | – |
| Atributo | Descripción |
|---|---|
data-slot="command-shortcut" | La etiqueta del atajo. |
| Prop | Tipo | Predeterminado |
|---|---|---|
alwaysRenderLo mantiene visible durante la búsqueda. | boolean | false |
| Atributo | Descripción |
|---|---|
data-slot="command-separator" | El separador. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenPor defecto muestra pistas de teclas que se actualizan en una página. Oculto en pantallas táctiles. | ReactNode | – |
| Atributo | Descripción |
|---|---|
data-slot="command-footer" | El pie. |
| Prop | Tipo | Predeterminado |
|---|---|---|
hotkeySe escucha en todo el documento. Los atajos sin modificador se ignoran mientras se escribe en un campo. | string | – |
callback | (event: KeyboardEvent) => void | – |
options.enabled | boolean | true |
Devuelve si debe verse un indicador de carga, con el mismo retraso y duración mínima que <CommandLoading />. Úsalo para ocultar resultados obsoletos mientras hay una petición en curso.
| Prop | Tipo | Predeterminado |
|---|---|---|
loading | boolean | – |
options.delay | number | 150 |
options.minDuration | number | 300 |
useCommandPages()devuelve{ pages, page, push, pop, reset }para controlar las páginas desde tu propio código.useCommandState(selector)lee el estado de cmdk, como la búsqueda o el número de resultados filtrados.useHotkeyLabel(hotkey)da formato a un atajo para la plataforma actual, como ⌘K o Ctrl+K.
- ButtonBotones en todas las variantes y tamaños, con un flujo integrado de carga, éxito y error que omite el spinner en las peticiones rápidas.
- HotkeyAnaliza, etiqueta, anuncia y reconoce atajos de teclado, con ⌘ en plataformas Apple y Ctrl en el resto.
- MotionLas curvas de easing, duraciones y la comprobación de movimiento reducido con las que se anima cada componente, además de hooks para transformaciones de tamaño y resaltados deslizantes.
- SpinnerUn indicador de carga con marcas al estilo Apple o un anillo que respira, que puede esperar antes de mostrarse y permanecer el tiempo suficiente para no parpadear.
- Alert dialogUn diálogo de confirmación para acciones destructivas o importantes que espera el trabajo asíncrono y se convierte en una hoja inferior en móviles.
- Context menuUn menú de acciones con clic derecho o pulsación larga, con submenús, elementos de casilla y de radio, y respuesta al mantener pulsado en pantallas táctiles.
Usado en bloques
Bloques que se construyen sobre Command.