Moodinary/UI

Command palette (⌘K)

Saltar a cualquier equipo, página o acción desde el teclado. ⌘K o Ctrl+K en todo Moodinary.

Paleta de comandos para navegar páginas, ajustes, organizaciones y acciones desde el teclado. ⌘K o Ctrl+K en el dashboard de Moodinary.

Instalación

shadcn
npx shadcn@latest add https://design.moodinary.com/r/command.json
import
import { CommandDialog, CommandTrigger, useCommandShortcut } from "@moodinary/ui/components/command";

Ejemplos

Paleta

El disparador muestra el atajo. Los resultados se agrupan y la búsqueda ignora tildes.

Código
palette.tsx
import {
	CommandDialog,
	CommandTrigger,
	useCommandShortcut,
} from "@moodinary/ui/components/command";
import { useCallback } from "react";

const items = [
	{
		group: "Páginas",
		id: "inicio",
		label: "Inicio",
		onSelect: () => undefined,
	},
	{
		group: "Páginas",
		id: "analiticas",
		label: "Analíticas",
		onSelect: () => undefined,
	},
	{
		group: "Ajustes",
		id: "miembros",
		keywords: "ajustes configuración",
		label: "Miembros y equipos",
		onSelect: () => undefined,
	},
	{
		group: "Acciones",
		id: "qr",
		keywords: "qr código compartir pulso imprimir",
		label: "Mostrar QR",
		onSelect: () => undefined,
	},
	{
		group: "Organizaciones",
		id: "escuela",
		label: "Escuela de ejemplo",
		onSelect: () => undefined,
		trailing: "Actual",
	},
	{
		group: "Organizaciones",
		id: "empresa",
		label: "Empresa de ejemplo",
		onSelect: () => undefined,
	},
	{
		group: "Cuenta",
		id: "notificaciones",
		label: "Notificaciones",
		onSelect: () => undefined,
	},
];
export default function CommandPalette() {
	const [open, setOpen] = useCommandShortcut();
	const show = useCallback(() => setOpen(true), [setOpen]);
	return (
		<>
			<CommandTrigger onClick={show} />
			<CommandDialog items={items} onOpenChange={setOpen} open={open} />
		</>
	);
}

Props

CommandDialog

PropTipoDefaultDescripción
openboolean-Estado controlado.
onOpenChange(open: boolean) => void-Se llama al abrir o cerrar; al cerrar limpia la búsqueda.
itemsCommandItem[]-Ítems con group, id, label, leading, trailing, keywords y onSelect.
placeholderstring"Buscar equipos, páginas, acciones…"Texto del input.
emptystring"Sin resultados."Texto sin coincidencias.

CommandTrigger

PropTipoDefaultDescripción
labelstring"Buscar"Texto del botón; en mobile queda solo el ícono.

useCommandShortcut

PropTipoDefaultDescripción
returns[boolean, (open: boolean) => void]-Estado abierto y setter, con ⌘K / Ctrl+K ya escuchado.

Cuándo sí y cuándo no

Hacé
  • Montá un solo useCommandShortcut por app.
  • Usá keywords para sinónimos: configuración para Ajustes.
  • Marcá la organización actual con trailing="Actual", como hace el dashboard.
Evitá
  • No la uses como única forma de llegar a algo.
  • No registres el atajo en más de un lugar.
  • No cargues cientos de ítems sin agrupar.

Accesibilidad

  • El input es un combobox con aria-activedescendant.
  • Flechas navegan, Enter abre, Esc cierra.
  • Al cerrar, el foco vuelve a donde estaba.