Error summary
Resumo de erros que lista os campos inválidos no topo de um formulário depois de um envio com erro, cada um como um link que leva o foco ao controle. Use em formulários com mais de dois ou três campos.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o componente. Ele trabalha junto com as partes do Field.
import { ErrorSummary } from "@camaleo/react";Anatomia
Um Alert de perigo com título e uma lista de links. Cada parte tem um data-slot que você pode usar no CSS.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.
Corrija 2 campos para continuar.
Foco no envio
Clique em Continuar com os campos vazios. O resumo recebe o foco com ref e tabIndex={-1}, então é lido primeiro, e diminui conforme você corrige cada campo.
Erros vindos do servidor
Clique em Salvar. Quando a API recusa um valor, mostre o mesmo resumo: a pessoa tem um só lugar para olhar, venha o erro do navegador ou do backend.
Corrija 2 campos para continuar.
Selects e checkboxes
O target é o id de qualquer controle focável. O id de um checkbox fica no input escondido, que passa o foco para a caixa visível.
Corrija 2 campos para continuar.
Num formulário longo
Clique num link. O controle rola até o meio da tela, então um cabeçalho fixo nunca esconde o campo para onde você foi.
Corrija 1 campo para continuar.
Corrija 3 campos para continuar.
Um ou vários
Conte os erros no título e escolha o texto com Intl.PluralRules, para "1 campo" e "3 campos" ficarem certos em qualquer idioma.
Corrija 1 campo para continuar.
Com rótulo escrito
O label acrescenta uma palavra como "Erro". Alguns estilos mostram ela no lugar do ícone, e ela dá ao alerta um sinal em texto além da cor.
Em contexto
O resumo de erros fica no topo de formulários reais. São pedaços inteiros de interface para copiar, no estilo que você escolheu.
Crie sua conta
Grátis por 14 dias. Sem cartão.
Com react-hook-form e zod
O Camaleo não depende de nenhuma biblioteca de formulários. O cadastro acima liga react-hook-form e zod ao Field e ao ErrorSummary; a aba Código tem o arquivo inteiro.
pnpm add react-hook-form zod @hookform/resolvers- O schema guarda as mensagens. O
zodResolver(schema)valida no envio, e cada mensagem do zod virafieldState.error.message. - O
Controllerconecta cada controle. PassefieldState.invalidparaField invalide a mensagem paraFieldError match={fieldState.invalid}, assim o erro fica ligado ao controle e oaria-invalidé marcado. - Dê um id a cada controle. Use
useId()e coloque noInput(ou noCheckbox,NativeSelectouRating, que o repassam ao elemento que recebe o foco); o resumo aponta para esse mesmo id. - Monte o resumo a partir de
formState.errors. Mostre quandoisSubmittede houver erros, transforme cada nome inválido em{ target: id, message: rótulo }e dê foco a ele quandosubmitCountmudar. PasseshouldFocusError: falsepara o react-hook-form não levar o foco ao primeiro campo antes. - Use
noValidateno formulário. Senão os balões do próprio navegador aparecem antes das suas mensagens.
const { control, handleSubmit, formState: { errors, isSubmitted, submitCount } } =
useForm<Values>({ resolver: zodResolver(schema), defaultValues, shouldFocusError: false });
const invalid = (Object.keys(labels) as (keyof Values)[]).filter((name) => errors[name]);
useEffect(() => {
if (submitCount > 0) summaryRef.current?.focus();
}, [submitCount]);
{isSubmitted && invalid.length > 0 && (
<ErrorSummary
ref={summaryRef}
tabIndex={-1}
title={`Corrija ${invalid.length} campos para continuar.`}
errors={invalid.map((name) => ({ target: ids[name], message: labels[name] }))}
/>
)}Boas práticas
Corrija 2 campos para continuar.
Um clique ou Enter leva a pessoa direto ao que precisa corrigir.
Há erros no formulário.
A pessoa precisa caçar os campos vermelhos no formulário.
Corrija 2 campos para continuar.
"Número do cartão: digite os 16 dígitos" funciona fora de contexto, numa lista de links.
Corrija 2 campos para continuar.
Dois links chamados "Valor inválido" ficam iguais para quem usa leitor de tela.
Props
target é o id do controle inválido; o link dele leva o foco até lá.Os outros atributos de div são repassados, inclusive ref e tabIndex: use os dois para levar o foco ao resumo depois de um envio com erro.
Styling hooks
Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou no próprio resumo.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
/* um erro por linha, só no checkout */
.checkout [data-slot="error-summary-list"] {
flex-direction: column;
}Acessibilidade
- Ele usa role="alert", então o leitor de tela anuncia assim que ele aparece.
- Leve o foco até ele depois de um envio com erro (ref + tabIndex={-1}), para quem usa teclado começar pela lista e não pelo botão de enviar.
- Cada link foca o próprio controle, não só o rótulo, então dá para digitar na hora.
- Mantenha também o FieldError em cada campo: o resumo é o mapa, o campo diz o que mudar.