Componentes
39. Command Palette ⌘K
seed-componentes.md v1.43 · §39seção 41 de 9839-command-palette-k-estavel-v0-41-cp1-cp6-bloco-5.md · MD5 bc663542Título completo no canon: Command Palette ⌘K — estável (v0.41) · CP1–CP6 · Bloco 5/5E · lote autônomo 1 · fecha o Bloco 5 · resolve a fronteira do §4.11
Base (3 rodadas, 2026-08-06): R1 — precedentes Linear/Vercel/GitHub/Raycast (techinterview: registry por id estável; <100ms; guarda do atalho em inputs). R2 — cmdk (a base do shadcn Command — a stack do Lovable): combobox correto out-of-the-box; CommandDialog = cmdk dentro de dialog real (trap/Esc/retorno são do dialog, não do cmdk); Command.Empty como FRASE; virtualizar só em milhares de itens; distinção shadcn: palette=Command+Dialog · valor em form=combobox · ações de linha=menu (reforça MN1). R3 — heranças normativas integrais: combobox ARIA 1.2 do §11 (input mantém o foco;
aria-activedescendantmove a seleção virtual;aria-expanded/aria-controls) + modal §30 (showModal, trap nativo, foco devolvido) + busca §4 (o atalho Ctrl/⌘K JÁ reservado e treinado desde o v0.8 — a memória muscular migra sem custo, exatamente como o §4.11 previu) + live region nomeada (1.13-b).
| # | Decisão | Porquê | Descartado |
|---|---|---|---|
| CP1 | Semântica = COMPOSIÇÃO de 2 componentes já normatizados: modal §30 (showModal, trap, Esc, retorno ao gatilho) contendo combobox §11 (foco fica no input; setas movem aria-activedescendant; aria-expanded reflete resultados). Nada novo nasce |
cmdk/shadcn implementam exatamente isto; §11 e §30 já pesquisados com fonte primária | Listbox com foco real nas opções (perde a digitação contínua); role=menu (é busca+seleção, não menu — MN1) |
| CP2 | Abertura: Ctrl/⌘K global (cumpre a promessa do §4.11 — o mesmo atalho que focava a busca passa a abrir a palette; rótulo por plataforma herdado) + gatilho visível no chrome. Toggle: Ctrl+K com a palette aberta fecha. Guarda: dentro de input/textarea só abre com o modificador explícito | §4.11 (decisão de 2026-08-02 sendo executada); techinterview (guarda de inputs) | Atalho novo (joga fora a memória treinada); só atalho sem gatilho visível (indescobrível) |
| CP3 | Conteúdo: grupos rotulados (Ações · Navegação · Recentes) fora da semântica de option; rótulo verbo+substantivo (herda MN4); atalho exibido em mono decorativo; máx ~8 visíveis com scroll; empty = FRASE ("Nenhum resultado. Tente outro termo." — herda o tipo zero-resultados do §25: SEM CTA de criação); live region nomeada anuncia "N resultados" | cmdk (Empty como frase); Fiori/Polaris herdados; 1.13-b | "0 results" seco; CTA de criar no zero-resultados (Z herdado) |
| CP4 | Teclado: ↓↑ movem a seleção virtual (com fim de curso, sem wrap — consistente com o disclosure), Home/End, Enter executa e FECHA devolvendo ao gatilho, Esc fecha. Digitação filtra em tempo real (client-side; fonte assíncrona = produto com CommandLoading/skeleton §19) | Combobox §11 (modelo já decidido); cmdk | Wrap nas setas (numa lista filtrada curta, fim de curso orienta melhor) |
| CP5 | Fronteiras: registry de comandos, índice de busca, recentes persistidos, fuzzy avançado, telemetria = produto/Lovable (ids estáveis como contrato); o DS entrega o componente, a régua editorial e o contrato de acessibilidade | techinterview (registry por id — sobrevive a rename); CN4 como precedente de fronteira | Fuzzy/scoring no DS |
| CP6 | Mobile: <640px a palette abre em largura total (herda DW2); sem tecla ⌘, a entrada é o gatilho visível (o chip do §4 já esconde o atalho onde não existe) | Paridade estrutural; §4 (rótulo por plataforma) | Palette desktop-only |
Tokens: opção ativa = list-hover + anel interno (herdado); kbd chips = §4; grupos text-muted; backdrop = §30. Nenhum par novo. Os 7 testes: 1 herdados ✓ · 2 ativa por fundo+anel (nunca só cor) · 3 grayscale ok · 4 palette × busca §4 a 1s (comandos+navegação × conteúdo) · 5 regra do um: uma live region nomeada, um atalho, uma ativa · 6 gatilho visível com atalho exibido · 7 360px largura total, opções 44px. (Suite 5E: CP-01–10 ✓; Ctrl+K REAL + :modal nativo + activedescendant conferidos em pixels na render R8 ✓.)
Também cita o §39: tela-busca.