---
fonte: 01-canonicos/seed-componentes.md
versao_da_fonte: v1.43
secao: 41
titulo: "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)"
sequencia: 43 de 98
bytes_do_corpo: 3624
md5_do_corpo: 13a5baf71b4eab6a8a0ff04025cd0575
gerado_por: 06-validacao/geradores/gen-camada-ia.py
nota: fatia GERADA — o corpo abaixo é byte a byte o trecho do canônico; edite o canônico, nunca esta fatia. Canônico inteiro em https://ds.seed.eng.br/01-canonicos/seed-componentes.md
---
## 41. 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.)*

---

