Command Palettes & Keyboard-first UI
Command Palettes & Keyboard-first UI
12 reglasResponder a cada tecla en menos de 100ms
Los resultados de busqueda deben filtrar y renderizar en menos de 100ms por keystroke para sentirse instantaneos. Por encima de 100ms el usuario percibe lag; por encima de 300ms la interfaz parece rota. El filtrado debe correr client-side contra un índice pre-cargado, jamas un request de red por tecla.
Superhuman / Paul BuchheitAbrir la paleta en menos de 150ms con fade-in de 200ms
El overlay debe aparecer en menos de 150ms del shortcut y animarse con un fade-in de máximo 150-200ms. Animaciones más largas contradicen el contrato de velocidad del patrón. Focus debe moverse al input en el frame 1 de la animación, no al terminar. Respetar prefers-reduced-motion.
Mostrar 5-8 resultados por defecto; nunca más de 10 sin agrupar
La lista por defecto muestra 5 a 8 resultados sin scroll. Más de 10 sin agrupar obliga a escanear visualmente y elimina la ventaja de velocidad. Cuando el total supera 10, agrupar por categoría con headers en all-caps y limitar cada grupo a 3-5 items. Altura máxima recomendada: 480-500px.
Alicja Suska / Mobbin Command Palette Best PracticesMostrar badges de shortcut inline, alineados a la derecha, en cada resultado
El shortcut de cada comando aparece como badge a la derecha en su fila, usando el simbolo del OS (⌘ vs Ctrl, ⌥ vs Alt). Comandos sin shortcut no muestran badge. Usa elementos <kbd> para semejanza semántica con ARIA. Tamaño de glyphs ~11px, en color secundario (60% opacidad o token text-2).
Pre-poblar el estado vacio con 5-7 comandos recientes o fijados
Al abrir la paleta sin query, mostrar 5-7 comandos usados recientemente o defaults curados. Esto hace la paleta inmediatamente útil: la acción más probable es el item #1, alcanzable con un solo Enter. Etiquetar la sección "Recientes" para que el usuario entienda que la lista es personalizada.
Sam Solomon · Designing Command PalettesUsar fuzzy matching con scoring jerárquico, no prefix exacto
La busqueda debe encontrar "New Issue" escribiendo "nwiss" y "Project Settings" con "prj set". El scoring prioriza: (1) match exacto, (2) iniciales ("ni" → "New Issue"), (3) caracteres consecutivos, (4) caracteres dispersos. Resaltar en negrita los caracteres coincidentes para explicar el resultado.
UX Patterns for Developers / Alicja SuskaNo sobreescribir shortcuts reservados del OS o browser para el trigger
El shortcut de apertura no debe conflictuar con combinaciones reservadas del OS o browser. La opción más segura en web es ⌘K / Ctrl+K (adoptado por Linear, GitHub, Vercel, Notion y no reservado). Dentro de la paleta, letras solas (j/k para navegar) son seguras porque solo activan sin inputs enfocados.
Knock.app / Hidde de Vries · keyboard shortcuts need modifier keysAtrapar foco dentro de la paleta y devolverlo al trigger al cerrar
Mientras la paleta esta abierta, Tab y Shift+Tab solo ciclan dentro del overlay. Escape cierra la paleta en un solo press y devuelve el foco al elemento que la abrio. Usar role="combobox" en el input y aria-activedescendant en cada navegación con flecha.
Ensenhar shortcuts just-in-time: mostrar el tip después de la acción vía GUI
Mostrar un toast no bloqueante con el shortcut equivalente inmediatamente después de que el usuario completa una acción con raton o menú. Mostrar máximo 3 veces por acción. Nunca antes de que el usuario haya demostrado necesidad realizando la acción.
Nielsen Norman Group · Accelerators Maximize EfficiencyProveer referencia de shortcuts busqueda con ? o ⌘/
Toda app keyboard-first expone una referencia completa y buscable vía ? (cuando no hay input enfocado) o ⌘/ / Ctrl+/. La referencia se abre dentro de la app, no en una nueva pestana. Incluye busqueda live por nombre de acción e incluye link a "Personalizar".
Nielsen Norman Group · Google Docs (patrón Ctrl+/)Usar aria-live="polite" para anunciar conteos y selección a lectores de pantalla
Una region aria-live="polite" visualmente oculta anuncia el total de resultados tras cada keystroke ("5 resultados") y el item enfocado con flechas ("Rename, 2 de 5"). Sin esto los usuarios de lector de pantalla no saben si la paleta esta respondiendo.
Delimitar resultados al contexto actual; etiquetar comandos contextuales
La paleta distingue comandos globales (siempre disponibles) de contextuales (solo en la vista actual). Los contextuales aparecen primero con una etiqueta de contexto en texto secundario. Eliminar comandos irrelevantes en lugar de mostrarlos desactivados; los grayed-out generan desconfianza.
Sam Solomon / VS Code Command Palette UX Guidelines- R-1569 Responder a cada tecla en menos de 100ms
- R-1570 Abrir la paleta en menos de 150ms con fade-in de 200ms
- R-1571 Mostrar 5-8 resultados por defecto; nunca más de 10 sin agrupar
- R-1572 Mostrar badges de shortcut inline, alineados a la derecha, en cada resultado
- R-1573 Pre-poblar el estado vacio con 5-7 comandos recientes o fijados
- R-1574 Usar fuzzy matching con scoring jerárquico, no prefix exacto
- R-1575 No sobreescribir shortcuts reservados del OS o browser para el trigger
- R-1576 Atrapar foco dentro de la paleta y devolverlo al trigger al cerrar
- R-1577 Ensenhar shortcuts just-in-time: mostrar el tip después de la acción vía GUI
- R-1578 Proveer referencia de shortcuts busqueda con ? o ⌘/
- R-1579 Usar aria-live="polite" para anunciar conteos y selección a lectores de pantalla
- R-1580 Delimitar resultados al contexto actual; etiquetar comandos contextuales