Componentes
41. Seleção e ações em massa
seed-componentes.md v1.43 · §41seção 43 de 9841-selecao-e-acoes-em-massa-estavel-v0-43-sl1-sl5.md · MD5 13a5baf7Título completo no canon: Seleção e ações em massa — estável (v0.43) · SL1–SL5 · Bloco 6/6B · lote autônomo 2 · encerra a pendência do indeterminate (§10)
Base (3 rodadas, 2026-08-06): R1 — Carbon data table selection/batch actions (barra de ações aparece com ≥1 selecionado; header-checkbox seleciona A PÁGINA; "selecionar todas" de todas as páginas é ação da barra; Cancelar sai do modo; radio para seleção única; issue #7565 documenta o contrato página×dataset) + Polaris (IndexTable bulk). R2 — TanStack row selection (indeterminate no header; ids ESTÁVEIS como chave da seleção — sobrevive a ordenação/paginação; shift-range na discussão #3068 como prática da stack). R3 — checkbox §10 herdado (o estado indeterminate pendente desde o B2) + 1.13-b (regime contínuo).
| # | Decisão | Porquê | Descartado |
|---|---|---|---|
| SL1 | Coluna de seleção = 1ª: checkbox §10 nomeado citando o item ("Selecionar proposta N — cliente"); hitbox = a célula inteira (label envolvente); clicar na LINHA não seleciona (linha-clique é navegação/ação — seleção só no checkbox) | Carbon (checkbox da linha); Gmail (separação clique×seleção evita seleção acidental) | Linha inteira selecionando (conflita com navegar-ao-detalhe) |
| SL2 | Selecionar-tudo do header com INDETERMINATE (encerra a pendência do §10): 3 estados; marca/desmarca A PÁGINA visível, nunca o dataset; página cheia dispara a oferta "Selecionar todas as N" (barra própria); desmarcar no header desfaz SÓ a página | Carbon batch guidance literal (contrato página×dataset do #7565); TanStack (toggleAllPage vs All); Gmail | Header marcando o dataset silenciosamente (destrutivo invisível em ação de massa) |
| SL3 | Barra de ações em massa SUBSTITUI a toolbar quando há seleção: contagem "N selecionadas" + ações (máx. ~4; destrutiva por último) + Cancelar (limpa e sai do modo); fundo action-primary (par herdado §1) |
Carbon ("batch action mode" com saída explícita); MN5 herdado p/ a destrutiva | Barra flutuante extra (2 toolbars simultâneas); ações sem Cancelar |
| SL4 | Anúncio da contagem = regime CONTÍNUO do 1.13-b: live region nomeada ("Seleção da tabela") com debounce ~400ms — shift-range e select-all coalescem num anúncio só; "Seleção limpa" no cancelamento | 1.13-b (contagem que muda rápido é atualização contínua, nunca rajada de mensagens) | Anúncio por clique (metralhadora no SR) |
| SL5 | Seleção por ID ESTÁVEL: sobrevive a ordenação e paginação (page 2 chega com as marcas); filtro/busca que muda o conjunto LIMPA a seleção (o "tudo" mudou de significado — com o anúncio); shift+clique seleciona intervalo na página. Persistência entre sessões = produto | TanStack (ids como chave); Carbon #7496 (selecionar através de filtro errado é bug documentado); #3068 (shift-range) | Seleção por índice (ordena e seleciona o item errado); manter seleção através de filtro |
Tokens/pares (contraste-dados.py ✅): linha selecionada ci-900/tq-50 12.92 light · ci-100/tq-900 11.23 dark; borda tq-600/tq-50 4.28 (≥3 ✓); barra = par do botão primário §1. Os 7 testes: 1 medidos ✓ · 2 seleção por fundo+borda+checkbox (3 sinais) · 3 grayscale ok · 4 selecionada×hover a 1s · 5 uma barra, uma live region, uma oferta · 6 contagem visível sem interação · 7 360px hitbox=célula, barra empilha. (Suites: jsdom 6B ✓ incl. página×dataset e shift-range · render R9: fundo pintado + barra visível.)
Também cita o §41: tela-lista, tela-tabela.