Ir para o conteúdo principal
WBC - GovBR-DS
Copiar página como Markdown para IA

Input

Componente estável e recomendada para novos projetos.
Anatomia, uso, comportamento visual e recomendações conceituais são mantidos pelo Padrão Digital de Governo. Esta página documenta a implementação Web Components e sua API executável.

Visão Geral

Design System

Para a documentação completa de design, incluindo diretrizes de uso, acessibilidade e exemplos visuais, consulte o Design System do GovBR.

Validação e Acessibilidade

  • Validação: Utilize a propriedade state="danger" para indicar um campo inválido e forneça o motivo no slot feedback utilizando o <br-message>. O gerenciamento da regra de validação é de responsabilidade da aplicação ou framework consumidor.
  • Acessibilidade: Este componente respeita a navegação por teclado e automaticamente sinaliza erros para leitores de tela quando state="danger" é ativado. Se o campo não possuir rótulo visual (label), use a propriedade aria-label.

Exemplo(s)

Desktop (100%)
Tablet - 768px
iPhone (iOS) - 390x844
Android - 360x800
Compartilhar URL
Mudar fundo
Abrir no StackBlitz
Tela cheia
HTML
Controles
JS
CSS
Console
Angular (Somente leitura)
React (Somente leitura)
Vue (Somente leitura)
Acessibilidade
Recolher controles e código
Formatar código
Resetar código para o estado inicial
Copiar para a área de transferência

Propriedades

actionLabel

Atributoaction-label
DescriçãoTexto exibido no botão de ação à direita do input.
Tipostring
Valor padrão---

actionTabIndex

Atributoaction-tab-index
DescriçãoDefine o tabindex do botão de ação.
Útil para remover o botão da sequência de tabulação quando o foco é gerenciado externamente (ex.: br-select).
Tiponumber
Valor padrão---

ariaLabel

Atributoaria-label
DescriçãoNome acessível usado quando não há um rótulo visual.
Tipostring
Valor padrãonull

autocomplete

Atributoautocomplete
DescriçãoControla o comportamento de preenchimento automático do navegador para o input.
Tipo"off" | "on"
Valor padrão---

autocorrect

Atributoautocorrect
DescriçãoControla a correção automática do texto.
Tipostring
Valor padrão'off'

borderless

Atributoborderless
DescriçãoRemove a borda do input quando não está em foco.
Útil para composições contextuais (ex.: paginação).
Tipoboolean
Valor padrãofalse

controlWidth

Atributocontrol-width
DescriçãoLargura do campo de entrada (por exemplo, '88px').
Quando definido, sobrescreve a largura padrão de 100%.
Tipostring
Valor padrão---

customId

Atributocustom-id
DescriçãoIdentificador único.
Caso não seja fornecido, um ID gerado automaticamente será usado.
Tipostring
Valor padrãobr-input-${inputId++}

density

Atributodensity
DescriçãoAjusta a densidade, alterando o espaçamento interno para um visual mais compacto ou mais expandido.
Tipo"large" | "medium" | "small"
Valor padrão'medium'

disabled

Atributodisabled
DescriçãoDesativa o input, tornando-o não interativo.
Tipoboolean
Valor padrãofalse

feedbackState

Atributofeedback-state
DescriçãoEstado de feedback canônico. Quando informado, tem precedência sobre state.
Tipo"danger" | "info" | "success" | "warning"
Valor padrão---

helpText

Atributohelp-text
DescriçãoTexto adicional que fornece ajuda ou informações sobre o input.
Tipostring
Valor padrão---

highlight

Atributohighlight
DescriçãoHabilita destaque visual. Quando informada, tem precedência sobre isHighlight.
Tipoboolean
Valor padrão---

inline

Atributoinline
DescriçãoExibe rótulo e controle em linha. Quando informada, tem precedência sobre isInline.
Tipoboolean
Valor padrão---

isHighlight Componente mantido por compatibilidade; prefira a alternativa indicada na documentação.

Atributois-highlight
DepreciaçãoUse highlight.
DescriçãoSe verdadeiro, o input terá destaque visual.
Tipoboolean
Valor padrãofalse

isInline Componente mantido por compatibilidade; prefira a alternativa indicada na documentação.

Atributois-inline
DepreciaçãoUse inline.
DescriçãoSe verdadeiro, o rótulo e o input estarão na mesma linha (layout inline).
Tipoboolean
Valor padrãofalse

label

Atributolabel
DescriçãoTexto exibido como rótulo do input.
Tipostring
Valor padrão---

mask

Atributomask
DescriçãoMáscara aplicada ao valor digitado (use # para marcar posições numéricas).
Tipostring
Valor padrão---

max

Atributomax
DescriçãoDefine o valor máximo para campos de entrada numéricos.
Tiponumber
Valor padrão---

maxlength

Atributomaxlength
DescriçãoDefine o comprimento máximo do valor do campo de entrada.
Tiponumber
Valor padrão---

min

Atributomin
DescriçãoDefine o valor mínimo para campos de entrada numéricos.
Tiponumber
Valor padrão---

minlength

Atributominlength
DescriçãoDefine o comprimento mínimo do valor do campo de entrada.
Tiponumber
Valor padrão---

multiple

Atributomultiple
DescriçãoSe verdadeiro, permite a entrada de múltiplos e-mails (quando type="email").
Tipoboolean
Valor padrãofalse

name

Atributoname
DescriçãoNome do input, utilizado para identificação em formulários.
Tipostring
Valor padrão---

pattern

Atributopattern
DescriçãoDefine o padrão de entrada para validação.
Tipostring
Valor padrão---

placeholder

Atributoplaceholder
DescriçãoTexto exibido dentro do input quando está vazio, fornecendo uma dica ou sugestão ao usuário.
Tipostring
Valor padrão---

readonly

Atributoreadonly
DescriçãoSe verdadeiro, o valor do input é exibido, mas não pode ser editado pelo usuário.
Tipoboolean
Valor padrãofalse

required

Atributorequired
DescriçãoSe verdadeiro, o input é obrigatório e deve ser preenchido antes que o formulário possa ser enviado.
Tipoboolean
Valor padrãofalse

state

Atributostate
DescriçãoDefine o estado do input
Tipo"danger" | "info" | "success" | "warning"
Valor padrão---

step

Atributostep
DescriçãoDefine o valor do passo para campos de entrada numéricos.
Tiponumber
Valor padrão---

type

Atributotype
DescriçãoEspecifica o tipo de entrada do campo.
Tipo"color" | "email" | "hidden" | "number" | "password" | "range" | "search" | "tel" | "text" | "url"
Valor padrão'text'

validator

Atributovalidator
DescriçãoFunção ou regra de validação customizada para o campo.

A função pode ser síncrona ou assíncrona. Retorne uma mensagem para invalidar o
campo e null ou '' para validá-lo. A regra é executada no change ou pelo
método validate(), nunca a cada tecla.

Em frameworks, passe a função como property binding, por exemplo:
validator={validate} no React, [validator]="validate" no Angular ou
:validator="validate" no Vue.

Como alternativa para HTML sem binding de propriedades, uma string pode
referenciar uma função global em window. A forma inline legada aceita apenas
comparação simples; JavaScript arbitrário é rejeitado para manter CSP segura.
Prefira sempre a função por binding.

Durante validações assíncronas, o campo sinaliza aria-busy="true", exibe o
indicador de carregamento e emite brInputValidationChange.
Tipo((value: string) => string | Promise<string>) | string
Valor padrão---

value

Atributovalue
DescriçãoValor exibido no input.
Pode ser alterado pelo usuário se a propriedade readonly não estiver ativa.
Tipostring
Valor padrão''

Slots

NomeDescrição
"action"Botão à direita do input.
"feedback"Mensagem de feedback como resposta específica a uma interação do usuário com o input. Pode ser feedback de erro, aviso, sucesso ou informação.
"help-text"Personalização do texto de ajuda.
"icon"Ícone à esquerda do input.
"validation-loading"Indicador exibido enquanto o validator assíncrono está pendente.

Eventos

EventoDescriçãoDepreciaçãoPropagação
brClearEmitted when the input clear button action is triggered.---true
brInputValidationChangeInforma o início e o resultado do validator, inclusive quando ele consulta um serviço remoto. O detail contém validating, valid e message; escrita programática e reset não representam interação do usuário.---true
valueChange Componente mantido por compatibilidade; prefira a alternativa indicada na documentação.Valor atualizado do inputUse o evento nativo input e leia event.target.value.true

Métodos

checkValidity

DescriçãoRetorna true se o valor do input for válido, caso contrário false.
Se o input for inválido, dispara um evento 'invalid'.
AssinaturacheckValidity() => Promise<boolean>
Parâmetros---

getValidationState

DescriçãoRetorna um snapshot serializável da Constraint Validation API.
AssinaturagetValidationState() => Promise<FormValidationState>
Parâmetros---

reportValidity

DescriçãoRetorna true se o valor do input for válido, caso contrário false.
Se o input for inválido, exibe uma mensagem de erro padrão do navegador.
AssinaturareportValidity() => Promise<boolean>
Parâmetros---

select

DescriçãoSeleciona todo o texto do controle nativo, conforme HTMLInputElement.select().
Assinaturaselect() => Promise<void>
Parâmetros---

setCustomValidity

DescriçãoDefine uma mensagem de validação customizada para o input.
Se a mensagem for uma string vazia, o erro customizado é limpo.
AssinaturasetCustomValidity(message: string) => Promise<void>
Parâmetrosmessage: - Mensagem de erro customizada ou string vazia para limpar

setRangeText

DescriçãoSubstitui um intervalo de texto usando a API nativa do input.
AssinaturasetRangeText(replacement: string, start?: number, end?: number, selectionMode?: SelectionMode) => Promise<void>
Parâmetrosreplacement:
start:
end:
selectionMode:

setSelectionRange

DescriçãoDefine o intervalo selecionado no controle nativo.
AssinaturasetSelectionRange(start: number, end: number, direction?: "forward" | "backward" | "none") => Promise<void>
Parâmetrosstart:
end:
direction:

showPicker

DescriçãoAbre o picker nativo quando o navegador e o tipo do input oferecem essa API.
AssinaturashowPicker() => Promise<void>
Parâmetros---

stepDown

DescriçãoDecrementa o valor numérico pelo step nativo.
AssinaturastepDown(n?: number) => Promise<void>
Parâmetrosn:

stepUp

DescriçãoIncrementa o valor numérico pelo step nativo.
AssinaturastepUp(n?: number) => Promise<void>
Parâmetrosn:

validate

DescriçãoExecuta a regra customizada e retorna se o campo está válido.
Se o validator for assíncrono, aguarda a resposta e ignora resultados
antigos quando uma execução posterior já começou.
Assinaturavalidate() => Promise<boolean>
Parâmetros---

CSS Shadow Parts

NomeDescrição
"action-button"Botão interno reexportado do br-button da ação.
"action"Botão de ação lateral.
"container"Contêiner visual principal do input.
"feedback"Slot de feedback.
"group"Grupo que contém ícone, input, botão e ajuda.
"help-text"Texto de ajuda ou slot de ajuda.
"icon"Contêiner do slot de ícone.
"input"Elemento input nativo.
"label"Rótulo do input.

Dependências

Usado por

Depende de

Gráfico

Migração de <br-input> (1.x → 2.x)

O input mantém a maior parte das propriedades de formulário. A migração principal é substituir estados visuais antigos pela propriedade semântica state e mover ícones para a composição atual.

Propriedades

API 1.xAPI 2.xAção na migração
icon, iconSign, iconSubmitslots/composição de íconeNão dependa dos dados de ícone da 1.x; declare o ícone na composição atual.
inlineinlineMantenha; is-inline é alias legado.
isHighlighthighlightUse o nome canônico atual.
ispasswordtype="password"Use o tipo nativo.
label, placeholder, disabled, density, id, name, value, maskmesmos nomesMantenha e revise o formato camelCase para atributos kebab-case.
success, danger, info, warningstateConverta para o estado semântico correspondente.

O campo continua emitindo eventos nativos input e change. Use as APIs de validação e feedbackState da versão atual quando precisar mostrar mensagens.

Exemplo

1.x:

<br-input ispassword is-highlight label="Senha" icon="lock"></br-input>

2.x:

<br-input type="password" highlight label="Senha" state="info">
<br-icon slot="start" icon-name="lock"></br-icon>
</br-input>

Validação

Para o contrato geral e a matriz de componentes, consulte o guia de formulários. Esta seção documenta o contrato específico do br-input.

O br-input participa da Constraint Validation API e de formulários HTML. Use as constraints nativas (required, pattern, min, max, step, minlength e maxlength) sempre que elas forem suficientes.

<form id="profile-form">
<br-input id="email" name="email" type="email" label="E-mail" required maxlength="120"></br-input>
<button type="submit">Salvar</button>
</form>

Para regras de domínio, use validator. A propriedade recebe uma função JavaScript. Em HTML puro, propriedades de função não podem ser declaradas diretamente como atributo; em frameworks, use o property binding do framework:

type InputValidator = (value: string) => string | null | Promise<string | null>;
// A prop também aceita `string` para nome de função global ou expressão legada restrita.
type InputValidatorProp = InputValidator | string;

Retorne uma mensagem para invalidar o campo e null (ou uma string vazia) para validá-lo.

Uso como prop em frameworks

O ponto importante é passar a função como propriedade, e não como texto:

// React
<BrInput label="CPF" validator={validateCpf} />
<!-- Angular -->
<br-input label="CPF" [validator]="validateCpf"></br-input>

<!-- Vue -->
<br-input label="CPF" :validator="validateCpf"></br-input>
// Vanilla Web Components
const input = document.querySelector('br-input');
input.validator = validateCpf;

No Angular, Vue e React, validateCpf deve ser uma função existente no escopo do componente:

const validateCpf = (value: string) => (value.replace(/\D/g, '').length === 11 ? null : 'Informe um CPF válido.');

Também é possível usar HTML sem property binding apontando o atributo para uma função global:

<br-input validator="validateCpfGlobal"></br-input>
<script>
window.validateCpfGlobal = (value) => (value.replace(/\D/g, '').length === 11 ? null : 'Informe um CPF válido.');
</script>

Esse formato depende de uma função em window e não deve receber código vindo de usuário. A expressão inline legada é limitada a comparações simples e não executa JavaScript arbitrário. Para aplicações com framework, o binding de função é a opção recomendada.

Quando a validação acontece

O validator é executado:

  • automaticamente quando o valor confirmado dispara change — normalmente ao sair do campo ou confirmar a edição;
  • explicitamente quando a aplicação chama await input.validate().

Ele não é executado a cada tecla. Escritas programáticas em value apenas invalidam o resultado anterior; chame validate() quando quiser validar o novo valor. O reset do formulário também descarta validações pendentes.

Validação síncrona

const cpf = document.querySelector('br-input#cpf') as HTMLBrInputElement;

cpf.validator = (value) => {
if (value.trim() === '') return 'Informe o CPF.';
return isCpfValid(value) ? null : 'CPF inválido. Verifique os dígitos.';
};

// Opcional: valida sem esperar um novo blur/change.
const valid = await cpf.validate();
console.log(valid); // true ou false

Sem um slot feedback, uma mensagem retornada pelo validator é renderizada automaticamente como br-message. Com um slot feedback, o conteúdo fornecido pela aplicação continua sendo usado:

<br-input id="cpf" label="CPF">
<br-message slot="feedback" state="danger"></br-message>
</br-input>

Validação assíncrona

O validator pode consultar o servidor. Enquanto a Promise estiver pendente, o campo recebe aria-busy="true" e exibe um br-loading pequeno.

const username = document.querySelector('br-input#username') as HTMLBrInputElement;

username.validator = async (value) => {
if (value.length < 3) return 'Use pelo menos 3 caracteres.';

const response = await fetch(`/api/users/available?name=${encodeURIComponent(value)}`);
if (!response.ok) throw new Error('Falha ao consultar disponibilidade');

const { available } = await response.json();
return available ? null : 'Este nome de usuário já está em uso.';
};

username.addEventListener('brInputValidationChange', (event) => {
const { validating, valid, message } = event.detail;
console.log({ validating, valid, message });
});

Para substituir o indicador padrão, use o slot validation-loading:

<br-input id="username" label="Nome de usuário">
<span slot="validation-loading" role="status">Consultando disponibilidade…</span>
</br-input>

O componente considera somente o resultado da validação mais recente. Assim, uma resposta antiga não sobrescreve o resultado de uma edição ou validação posterior.

Evento brInputValidationChange

O evento é emitido duas vezes por execução do validator:

  1. no início, com { validating: true, valid: null, message: null };
  2. na conclusão, com { validating: false, valid: true | false, message: string | null }.
input.addEventListener('brInputValidationChange', (event) => {
const { validating, valid, message } = event.detail;

if (validating) {
submitButton.disabled = true;
} else {
submitButton.disabled = false;
if (!valid) console.warn(message);
}
});

Uma Promise rejeitada produz a mensagem genérica Não foi possível validar o campo. e torna a validação inválida. Trate o erro no validator quando precisar exibir uma mensagem específica.

Mensagens externas e formulários

setCustomValidity() e a mensagem do validator são mantidos separadamente. A mensagem definida pela aplicação continua tendo precedência na validade nativa:

await input.setCustomValidity('O serviço está temporariamente indisponível.');
const valid = await input.validate(); // false, mesmo se o validator retornar null

Para limpar a mensagem externa, use await input.setCustomValidity(''). Para submeter um formulário depois de uma validação assíncrona, valide antes de chamar requestSubmit():

form.addEventListener('submit', async (event) => {
event.preventDefault();

const valid = await input.validate();
if (!valid || !form.checkValidity()) return;

// Envie os dados somente depois que a regra assíncrona terminar.
form.submit();
});

Use getValidationState() para consultar valid, validationMessage, willValidate e os flags de ValidityState sem depender do DOM interno.

Auditoria dos demais controles de formulário

O mesmo contrato não deve ser copiado para todos os componentes sem considerar o tipo de valor e o comportamento existente:

ComponenteSituação atualAvaliação
br-buttonÉ associado a formulário, mas não representa um campo com valor validável.Não precisa desse contrato.
br-checkbox / br-radioPossuem validade nativa, estados visuais valid/invalid e slot feedback.O slot ou o br-message padrão é referenciado por ARIA sem duplicar mensagens.
br-datetime-pickerPossui controles internos de data/hora.Fora desta entrega; requer decisão específica para o valor estruturado.
br-inputvalidator, validate(), loading, evento e feedback implementados.Atendido por #1195/#1198.
br-selectPossui validator, validate(), loading, evento feedback para string/string[].Atendido; consulte a seção de validação do br-select.
br-sliderPossui constraints numéricas (min, max, step) e setCustomValidity().Baixa prioridade; constraints nativas cobrem a maior parte dos casos.
br-switchPossui validade de controle booleano.Pode receber validator síncrono apenas se houver regra de domínio comprovada.
br-tagPossui validade relacionada à seleção/grupo.Deve ser avaliado junto ao componente de grupo, não como validator isolado de texto.
br-textareaPossui validator, validate(), loading, evento e feedback para valores string.Atendido; consulte a seção de validação do br-textarea.
br-uploadPossui validade de arquivo, tamanho e tipo.Precisa de API própria baseada em File/FileList; não deve receber o tipo string do input.

br-upload, br-slider, br-switch, br-tag e br-datetime-picker continuam usando as constraints nativas e setCustomValidity() documentados em suas próprias seções. Eles não devem receber automaticamente o validator de texto: arquivos, intervalos e valores estruturados precisam de contratos específicos antes de uma nova API ser criada.

Acessibilidade

Forneça sempre um label visível ou uma relação <label for>. O nome acessível deve conter o texto visual. Erros devem ter texto associado por aria-describedby/aria-errormessage; o componente sincroniza aria-invalid quando a validade é apresentada.

O foco é delegado ao <input> interno e focus() no host deve colocar o usuário no campo. Use readonly para leitura sem edição e disabled quando o controle não puder receber foco nem participar do formulário. Não use tabindex positivo.

Eventos nativos

Elemento HTML de referência

br-input representa o <input> do type informado e mantém um <input> dentro do Shadow DOM.

Como ouvir os eventos

const input = document.querySelector('br-input');
input.addEventListener('input', () => console.log(input.value));
input.addEventListener('change', () => console.log(input.value));

Eventos nativos suportados

EventoQuando ocorreBubblesComposedCancelableHostObservações
beforeinputantes da ediçãoSimSimSim, conforme a ediçãoSimO navegador ajusta o alvo externo para o host.
changeno commit ou blurSimSimNãoSimEvento sintético emitido uma vez.
focus / blurentrada/saída de focoNãoSimNãoSimPara delegação, use focusin/focusout.
focusin / focusoutentrada/saída com bubblingSimSimNãoSimFunciona em ancestral.
inputa cada ediçãoSimSimNãoSimInputEvent sintético após sincronizar value.

Eventos não suportados ou ainda não caracterizados

Composição, clipboard e seleção têm propagação caracterizada com eventos construídos em Chromium; gatilhos reais e os outros engines permanecem pendentes. Escrita em value, inicialização e reset não emitem eventos de interação.

Eventos customizados

valueChange é alias depreciado. Prefira input/change; não existe brInput nem brChange.

Valor, frameworks e acessibilidade

Leia event.target.value, validade pelos métodos públicos e dados por FormData. HTML usa addEventListener; React usa ref quando necessário; Angular e Vue usam seus adaptadores de formulário. Teclado, edição e foco pertencem ao input interno e são expostos pelo host.

Evidência de teste

src/shared/platform-contract.e2e.tsx cobre ordem, flags, target, currentTarget, caminho, delegação, reset, FormData, validade, múltiplas instâncias e reinserção em Chromium headless.

Documentações relacionadas

Consulte o guia geral de dados remotos para integrar validações assíncronas, controlar concorrência e manter o transporte sob responsabilidade da aplicação.

Também são relacionados:

  • Textarea, para validação remota de texto em áreas maiores;
  • Select, para busca remota e atualização assíncrona de opções;
  • Formulários, para integração com a Constraint Validation API.