Provas Largura

banco-pessoa.html · bancada do §62 · preview v0.1 — catálogo de ESTADOS do seletor de pessoa (PS1–PS16), do seed-componentes.md. Bancada, não tela (CP31). Dado sintético: todos os nomes, iniciais e cargos abaixo são inventados para esta bancada — nenhum colaborador, cliente ou identificador real.

Seletor de pessoa

Atribuir é transferir responsabilidade técnica — num ERP de engenharia isso não é um select bonito. É por isso que a escolha precisa ser desfazível, auditável, e que quem saiu da empresa continue aparecendo onde já assinou (PS12).

O achado que originou os contratos. No produto de referência a lista é exemplar na tela — agrupada, com avatares, com o escolhido destacado — e na árvore de acessibilidade é um bloco de nomes soltos: cada pessoa é generic, sem option, sem aria-selected, e o campo é um textbox sem combobox, sem aria-expanded, sem aria-controls (dispositivo C130). Dois de dois seletores auditados repetem o padrão — o do calendário (C122) e este.

Estado 1 — fechado, com uma pessoa escolhida

Responsável · escolha única
Responsável pela ordem
Marina Duarte
Escolha única: escolher substitui quem estava.
O avatar é aria-hidden (PS7): quem informa é o nome. Concatenar avatar e nome faz o leitor de tela anunciar as iniciais duas vezes — é o mesmo defeito do ✋ Mover que o SG8 já tinha pego.
Aberto · agrupado, com “Eu” no topo
Responsável — lista aberta
Eu
Você (Rafael)Disponível
Já atribuídos
Marina DuarteDisponível
Equipe
Caio BastosAusente
Helena PradoDisponível
Tiago MenezesAusente
Rita SalgueiroDisponível
Otávio LinsAusente
Os grupos têm nome próprio — o agrupamento é informação, não enfeite.
“Eu” vem primeiro e é rotulado como tal (PS10) — é o caso mais frequente. Os grupos são role="group" com nome próprio (PS4): cabeçalho só visual é decoração, e o agrupamento aqui é informação.

Estado 2 — múltipla escolha, com chips

Equipe da ordem · multi, teto de 3 chips
Equipe da ordem
Backspace no campo vazio remove o último chip.
O teto é declarado (herda o SG11): acima de 3 o excedente vira "+N", que é um botão real com aria-expanded — não um texto. Corte silencioso lê como “coube tudo”.
Teclado
  • ↓ / ↑andam pela lista sem tirar o foco do campo
  • Enterescolhe a opção corrente
  • Escfecha sem alterar — nunca confirma
  • Backspaceno campo vazio, remove o último chip
O Esc que confirma é a armadilha clássica de picker (PS6). E o foco do DOM não entra na lista: ele fica no campo, e a AT anda por aria-activedescendant (PS3) — mover o foco real quebraria a digitação contínua, que é o modo natural de filtrar.

Estado 3 — busca sem resultado, e o convite

Vazio de busca (PS14)
Responsável — busca sem resultado
Equipe

Ninguém com esse nome.
Digite um e-mail para convidar alguém para o projeto.

Não está na lista?
Convidar cria acesso ao sistema: são dois toques, e o primeiro diz o que o segundo faz.
“Nenhum resultado” não é uma resposta: o vazio diz o que fazer. E convidar é uma ação distinta de buscar (PS11) — num ERP, convidar cria acesso, então não pode ser efeito colateral de teclar Enter num campo de busca.
Lista longa · carga em página (PS13)
Equipe — lista longa
Equipe
Você (Rafael)Disponível
Marina DuarteDisponível
Caio BastosAusente
Helena PradoDisponível
Tiago MenezesAusente
Carrega em página, e o botão diz quantos faltam.
A lista carrega em página com o estado declarado, e o botão diz quantos faltam. Cortar em N sem dizer é o mesmo cap silencioso que o SG11 proíbe.

Estado 4 — quem saiu da empresa

Inativo (PS12)
Responsável — inclui quem saiu
Equipe
Você (Rafael)Disponível
Marina DuarteDisponível
Caio BastosAusente
Inativos
Nadir CoelhoInativo desde 2026-05
Quem saiu continua onde já assinou — e não é oferecido para novas atribuições.
Some com quem saiu e o histórico mente. Quem assinou o laudo continua exibido onde já foi atribuído, marcado como inativo — e não é oferecido para novas atribuições (aria-disabled). Herda o VD16: ausência e vazio não são a mesma coisa.

A paleta das iniciais é FECHADA — e é isso que a torna demonstrável

A cor do avatar sem foto sai de um hash do nome para um índice neste conjunto de 8 pares (PS8). Determinístico: a mesma pessoa tem a mesma cor em toda tela, sempre. Alternativa descartada: derivar matiz livre (HSL a partir do hash), que é o que a maioria dos produtos faz — ela gera uma classe infinita de cores, e contraste de classe infinita não se mede, se torce para dar certo. Com o conjunto fechado, a PS-P3 se prova por enumeração: a suíte mede os 8 pares, nos dois temas, e reprova se qualquer um ficar abaixo do piso.

Os contratos, e onde cada um se prova

#ContratoOnde se prova
PS1O campo é role="combobox" com aria-expanded e aria-controlsTodos os quatro seletores desta página — é o C130 corrigido
PS2A lista é listbox; cada item é option com aria-selectedAbra qualquer lista: “lista de N, 1 selecionada”
PS3O foco do DOM fica no CAMPO; a AT anda por aria-activedescendant↓/↑ movem o realce sem tirar o cursor de digitação do campo
PS4Grupos são role="group" com nome próprio“Eu”, “Já atribuídos”, “Equipe”, “Inativos” — nomeados, não só desenhados
PS5Multi produz CHIPS removíveis — herda SG9–SG13, com teto e "+N"Estado 2, com teto de 3
PS6↓/↑ andam · Enter escolhe · Esc fecha SEM alterar · Backspace no campo vazio remove o último chipEstado 2 — o Esc que confirma é a armadilha clássica de picker
PS7O avatar é aria-hidden; quem informa é o NOMEHerda o SG8 e o defeito real do ✋ Mover
PS8Sem foto, INICIAIS sobre fundo derivado do nome — determinísticoA paleta FECHADA de 8 pares, impressa nesta página
PS9Presença, quando existe, tem rótulo TEXTUAL“Disponível” / “Ausente”, escrito
PS10“Eu” aparece primeiro e é rotulado como talEstado 1 aberto — C127: é o caso mais frequente
PS11Buscar e CONVIDAR são ações distintas; convidar exige confirmação explícitaEstado 3 — dois toques, e o primeiro diz o que o segundo vai criar
PS12Inativo continua exibível onde já foi atribuído, marcado; e não é oferecidoEstado 4 — aria-disabled, e o clique diz por quê
PS13A lista carrega em página, com estado declarado; nunca corta em silêncioEstado 3 — o botão diz quantos faltam
PS14Vazio de busca diz O QUE FAZEREstado 3 — “Digite um e-mail para convidar”
PS15Remover anuncia quem saiu E quantos restamEstado 2 — herda o SG12
PS16Alvo de 44px por linha, e a linha inteira é clicávelMedido pela suíte em todas as opções de todas as listas