Tema
BaseDateInput
Campo de data. Usa o <input type="date"> do navegador, com o calendário nativo, e guarda o valor no formato ISO (AAAA-MM-DD). Dentro de um BaseField, se liga sozinho ao rótulo, à ajuda e ao erro, como o BaseInput.
Dia em que o fiscal esteve na obra.
Entre 01/10/2026 e 31/08/2027.
Valor do v-model: (vazio) e 2026-10-01.
Uso
- Use para uma data só: vistoria, assinatura, publicação. Para início e fim, use dois campos lado a lado com um rótulo para cada.
- O
v-modelé sempreAAAA-MM-DD, ou''enquanto a data está vazia ou incompleta. Formate paradd/mm/aaaasó na hora de mostrar. - Data incompleta (por exemplo, só dia e mês) ou impossível (31/02) também chega ao
v-modelcomo'': o navegador não entrega o que foi digitado. Para separar "vazia" de "incompleta", usev-model:incomplete, que ficatrueenquanto sobra parte da data no campo. Assim dá para mostrar "Data incompleta. Informe dia, mês e ano." em vez de "Informe a data". - O
incompleteé atualizado a cada tecla, ao mudar a data e ao sair do campo. Mostre a mensagem de data incompleta ao sair do campo ou ao enviar, não enquanto a pessoa digita. - Para limpar o formulário, ponha
''nov-modelefalsenoincomplete. Isso apaga também as partes que o usuário deixou pela metade (verificado no Chromium, no WebKit e no Firefox). - O ano tem no máximo 4 dígitos. Sem
max, o campo usa9999-12-31como limite; sem esse limite, o Chrome aceitaria anos de até 6 dígitos e ov-modeldeixaria de serAAAA-MM-DD. minemaxlimitam o calendário. Diga o intervalo na ajuda: o navegador não explica por que um dia está bloqueado.- O navegador não marca a data fora do intervalo como erro na tela. Valide ao sair do campo ou ao enviar e use
invalidcom um texto que diga como corrigir: "A vigência termina até 31/08/2027. Escolha uma data até lá." invalidsempre vem com um texto visível. Dentro doBaseField, passeinvalid-text: sem ele, o campo só fica com a borda vermelha. Fora doBaseField, mostre a mensagem perto do campo e ligue-a comaria-describedby.- O formato exibido segue o idioma do navegador. Em um navegador em português, aparece
dd/mm/aaaa.
Estados
Informe a data da vistoria.
Data no fim de semana. Confira com o fiscal.
Fora do BaseField
A vigência termina até 31/08/2027. Escolha uma data até lá.
Tamanhos
Cada tamanho tem a mesma altura do BaseInput correspondente, para os dois ficarem alinhados na mesma linha do formulário.
Estilo
Herda o campo do BaseInput. Só o que muda está abaixo.
| Propriedade | Token |
|---|---|
| Fundo | --tj-field-01; desabilitado e somente leitura --tj-field-disabled |
| Borda | --tj-border-strong-01, hover --tj-border-strong-02, foco --tj-border-interactive |
| Data vazia | --tj-text-helper nos campos dd/mm/aaaa (5,8:1 no tema claro e 7,1:1 no escuro, calculado dos tokens): é a única instrução de formato na tela |
| Parte da data em edição | fundo --tj-interactive, texto --tj-text-on-color; em somente leitura, o foco padrão do navegador |
| Botão do calendário | hover --tj-layer-hover-01; some em somente leitura e desabilitado |
| Números | font-variant-numeric: tabular-nums, para as datas alinharem em colunas |
| Altura | a mesma do BaseInput em cada tamanho |
No tema escuro, o color-scheme: dark dos tokens troca o ícone e o calendário do navegador.
A cor da data vazia vale em todos os navegadores. O destaque da parte em edição e o botão do calendário só têm esse acabamento no Chrome, no Edge e no Safari; no Firefox ficam com o visual nativo.
Código
vue
<BaseField label="Fim da vigência" :invalid="erro" invalid-text="A vigência termina até 31/08/2027. Escolha uma data até lá." required>
<BaseDateInput v-model="fim" v-model:incomplete="fimIncompleto" :min="inicio" max="2027-08-31" />
</BaseField>| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
v-model | string | '' | Data em ISO AAAA-MM-DD; '' quando vazia ou incompleta |
v-model:incomplete | boolean | false | true enquanto a data está pela metade ou é impossível; false vindo do pai apaga o que sobrou |
min | string | — | Primeira data aceita, em ISO |
max | string | '9999-12-31' | Última data aceita, em ISO; o padrão limita o ano a 4 dígitos |
size | 'sm' | 'md' | 'lg' | 'md' | Altura |
disabled, readonly, required, invalid | boolean | false | Estados; dentro de um BaseField, invalid, warn e required vêm dele |
autocomplete | string | — | Por exemplo bday para data de nascimento |
Eventos:
update:modelValue: a cada data válida no campo, digitada ou escolhida, e com''quando a data é apagada ou fica incompleta. Enquanto o ano é digitado, o Chrome já entrega uma data válida a cada tecla:0002-10-20,0020-10-20,0202-10-20e só então2026-10-20. Por isso, valide intervalo e regra de negócio (data fora da vigência, fim de semana) ao sair do campo ou ao enviar, não numwatchdov-model; senão o erro pisca e a mensagem lida pelo leitor de tela muda no meio da digitação.update:incomplete: quando a data passa a estar ou deixa de estar pela metade.
Fora de um BaseField, passe aria-label: o atributo vai direto para o <input>. Dentro de um BaseField, o id do campo prevalece, para o rótulo continuar ligado, e um aria-describedby seu é somado ao da ajuda ou do erro, sem substituí-lo.
Acessibilidade
- Usa o controle de data nativo; cada parte (dia, mês, ano) é anunciada como um campo giratório (spinbutton) e segue o teclado desse padrão do APG.
- Teclado, verificado com Playwright no Chromium, no WebKit e no Firefox: as setas para cima e para baixo mudam a parte em foco, a seta para a direita passa para a parte seguinte, Tab também passa para a parte seguinte, e Backspace apaga a parte. No Chromium, os números digitam a parte e já passam para a seguinte. A abertura do calendário pelo teclado não foi verificada; dá para preencher tudo sem ele.
- O rótulo é um
<label for>ligado ao campo. Ajuda, erro e aviso ficam emaria-describedby. - Com erro, o campo recebe
aria-invalid="true". A cor nunca é o único sinal desde que haja texto: oBaseFieldmostra ícone e texto quando recebeinvalid-text, e fora dele a mensagem ligada poraria-describedbycumpre esse papel.invalidsem texto deixa só a cor, então não use assim. - O foco aparece com o anel
--tj-ringde 3 px. - O botão do calendário só muda o fundo no hover, sem animação quando o sistema pede
prefers-reduced-motion. - Testado com axe em todos os estados e tamanhos, dentro do
BaseField(inclusive com rótulo oculto, campo opcional, data incompleta einvalidsem texto) e fora dele comaria-label, obrigatório e com a mensagem ligada poraria-describedby. O axe roda sem a regra de contraste, porque o jsdom não desenha a página; o contraste da data vazia foi calculado a partir dos tokens.