Provas Largura

banco-data.html · bancada do §61 · preview v0.4 — catálogo de ESTADOS do seletor de data, intervalo e hora (DH1–DH18), do seed-componentes.md. Bancada, não tela (CP31). Dado sintético. O “hoje” desta bancada é FIXADO em 16 de agosto de 2026, domingo — um calendário que muda todo dia não tem âncora: os bytes mudariam sozinhos e nenhuma guarda poderia afirmar nada. A data de referência entra pelo gerador, declarada, em vez de vir de Date.now().

Data, intervalo e hora

A régua em uma frase: pergunte se o usuário JÁ SABE a data. Sabe — nota fiscal, nascimento, prazo em contrato — e digitar é mais rápido que caçar num calendário. Não sabe, e precisa do contexto que só o calendário dá: que dia da semana cai, quantos dias faltam, se cai no fim de semana. Os dois existem sempre, e nenhum é opcional — escolher um seria acertar metade dos casos.

O calendário (DH5–DH9, DH12, DH15) — interativo

A grade é <table role="grid">row, columnheader e gridcell vêm implícitos de tr, th e td. Cada dia tem nome acessível completo (dia, mês, ano e dia da semana), nunca só o número: no produto de referência o dia é um button "2", e o leitor de tela anuncia exatamente isso.

Ele funciona. Clique num dia para começar o intervalo e em outro para fechá-lo; passe o mouse entre os dois e o vão se desenha antes do clique. As setas mudam de mês, “Hoje” volta para 16/08/2026, e os atalhos preenchem. No teclado: Tab entra na grade com um pressionamento, ←/→ andam por dia, ↑/↓ por semana, Home/End vão às pontas da semana, PageUp/PageDown mudam o mês, com Shift mudam o ano, e Enter ou Espaço escolhem.

Intervalo — clique, arraste o olhar, clique de novo
Formato: dia/mês/ano — por exemplo, 16/08/2026.
O vão entre os extremos é o único contrato desta seção decidido sem leitura visual do produto de referência: a tarefa observada tinha só um extremo preenchido, e preencher o outro seria escrita — fora do modo autorizado. Está declarado na §61.4, e é o primeiro a reconferir.

Os estados do campo

Data de emissão
Formato: dia/mês/ano — por exemplo, 16/08/2026.
Vazio. O formato fica visível abaixo do campo, não só no placeholder — que some ao digitar, justamente quando o usuário mais precisa dele (SC 3.3.2). É a ressalva que o próprio USWDS registrou contra si.
Data de emissão
Formato: dia/mês/ano — por exemplo, 16/08/2026.
Preenchido. Este é o caso em que o usuário já sabe a data: digitar custa oito teclas; caçar no calendário custa navegação. O gatilho continua ali, e ninguém é obrigado a abri-lo.
Início da visita
Formato: dia/mês/ano — por exemplo, 16/08/2026. A hora é opcional.
Data + hora (DH13). A hora é campo separado e opt-in: não existir hora não é erro, e existir o campo não a torna obrigatória. No produto de referência a hora é um terceiro campo de texto e a data não a carrega por padrão (C118).
Período do relatório
Formato: dia/mês/ano — por exemplo, 16/08/2026.
Intervalo vazio. Um controle, dois campos, um calendário compartilhado (DH10) — contra os dois seletores independentes do USWDS, que admite não validar a coerência entre início e fim.
Período do relatório
Formato: dia/mês/ano — por exemplo, 16/08/2026.
Intervalo preenchido. A seta entre os campos é o único sinal de que os dois são um controle só — por isso ela não é fronteira decorativa.
Período do relatório
Formato: dia/mês/ano — por exemplo, 16/08/2026.

Fim antes do início. A mensagem nomeia qual dos dois corrigir e sugere o valor (DH11) — “intervalo inválido” deixaria o usuário adivinhando onde mexer. Herda o VD11.
Vigência do contrato
Formato: dia/mês/ano — por exemplo, 16/08/2026.
Desabilitado. O valor continua legível — campo desabilitado que apaga o próprio conteúdo esconde informação de quem só quer ler.

Leitura fora de campo

O valor exibido fora de campo usa a mesma formatação do campo. E vazio não é hoje: ausência de data exibe travessão, porque "sem prazo" e "vence hoje" são coisas diferentes — herda o VD16.

Os contratos, e onde cada um se prova

#ContratoOnde se prova
DH1O campo de TEXTO existe sempre e aceita digitaçãoTodos os campos desta página
DH2O calendário existe sempre, com gatilho de nome próprio e alvo de 44px.cd__gatilho, com aria-label por campo
DH3O formato esperado é VISÍVEL, não só no placeholder.cd__formato sob cada campo — permanente
DH4pt-BR dd/mm/aaaa, inputmode="numeric", parser tolerante a / . -Digite 31.12.2026 ou 31-12-26 — e tente 31/02/2026
DH5A grade é role="grid" sobre <table>, com abbr nos cabeçalhosO calendário abaixo
DH6Nome acessível COMPLETO de cada dia — nunca só o númeroContraexemplo medido (C122): no produto de referência é button "2"
DH7aria-selected no escolhido; aria-current="date" em hojeHoje tem anel; escolhido tem fundo cheio — marcas diferentes para coisas diferentes
DH8Teclado do APG inteiro, incluindo PageUp/Down e Shift+PageUp/DownFoque um dia e navegue
DH9UM tab stop na grade (roving)Tab entra e sai do calendário com um pressionamento
DH10Intervalo é UM controle: dois campos e um calendário compartilhadoOs três estados de “Período do relatório”
DH11A validação diz QUAL dos dois corrigir, e sugere o valorEstado “fim antes do início”
DH12O vão entre os extremos é desenhado; extremos ≠ meioO calendário abaixo — único contrato decidido sem leitura visual
DH13A hora é campo SEPARADO e opt-in; ausência não é erroEstado “Início da visita” e o campo de hora no rodapé do calendário
DH14ISO na camada de dado; a string ISO NUNCA passa por new Date(string)window.__DATA.deISO — construtor por componentes, não por string
DH15Atalho relativo mostra a data ABSOLUTA que resolveColuna à esquerda do calendário
DH16“Hoje” é o do usuário, e o fuso fica declaradoRodapé do calendário — e o “hoje” desta bancada é fixado, por âncora
DH17Recorrência NÃO é deste componenteAusência declarada — até o produto de referência a põe atrás de um passo (C124)
DH18Data já informada na sessão não se pede de novo (SC 3.3.7, nível A)Fronteira de produto: o componente aceita valor inicial; quem o pré-carrega é a tela