Pular para o conteúdo
// visualizar em
salvo em todas as páginas

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.

Padrão Alert + in-page linksComponente clienteCódigo ↗

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.

íconetítuloE-mailCelular
[data-slot="alert"][data-kind="error-summary"][data-slot="alert-icon"] · [data-slot="alert-title"] · [data-slot="error-summary-list"][data-slot="error-summary-link"]

Exemplos

Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.

minimal · light · #3fa34d
Digite o endereço completo, como ana.souza@empresa.com.br.
Digite DDD e 9 dígitos, como (11) 98765-4321.

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.

Escolha um plano para ver o preço.
Aceite os termos para criar o workspace.

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.

Conta
Digite o endereço completo, como ana.souza@empresa.com.br.
Endereço de cobrança
Digite o CEP com 8 dígitos, como 01310-200.

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.

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.

Erro

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.

Cadastro com react-hook-form + zodCard · ErrorSummary · Field · Input · PasswordInput · Checkbox

Pagamento

Total a pagar hoje: R$ 1.188,00

Digite os 16 dígitos.
Este cartão venceu em setembro de 2024.
Pagamento com cartãoCard · ErrorSummary · Field · Input · Button

Perfil público

Suas alterações não foram salvas.

“ana.souza” já está em uso. Tente ana.souza.design.
Comece com https://, como https://anasouza.com.br.
Perfil não salvoCard · ErrorSummary · Field · Input · Textarea

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
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

FaçaLigue cada erro ao seu campo.

Um clique ou Enter leva a pessoa direto ao que precisa corrigir.

Há erros no formulário.

EviteUm alerta que só diz que algo está errado.

A pessoa precisa caçar os campos vermelhos no formulário.

FaçaDiga o campo e a correção.

"Número do cartão: digite os 16 dígitos" funciona fora de contexto, numa lista de links.

Corrija 2 campos para continuar.

EviteA mesma mensagem vaga duas vezes.

Dois links chamados "Valor inválido" ficam iguais para quem usa leitor de tela.

Props

PropriedadeTipoPadrãoDescrição
labelReactNode—Tipo da mensagem por escrito ("Atenção", "Erro"). Alguns estilos mostram no lugar do ícone.
iconReactNode—Substitui o ícone de perigo.
title*ReactNode—O título do resumo; diga quantos campos precisam de correção.
errors*{ target: string; message: ReactNode }[]—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

data-slot"alert" · "alert-title" · "error-summary-list" · "error-summary-link"
data-kind"error-summary"
data-tone"danger"

Tokens que ele lê

Cor

--cml-fg--cml-focus-offset--cml-focus-ring--cml-focus-width--cml-surface-raised

Forma e tamanho

--cml-border-width--cml-font-size-help--cml-radius-popover

Tipografia e movimento

--cml-tone-line

Só deste componente

--cml-corner-shape--cml-tone--cml-tone-soft
/* um erro por linha, só no checkout */
.checkout [data-slot="error-summary-list"] {
  flex-direction: column;
}

Acessibilidade

TabPercorre os links, na ordem do formulário.
EnterSegue um link: o foco vai para o controle e ele rola até ficar visível.
Shift + TabDo controle, volta para os links do resumo.

Relacionados

Esta página foi útil? · Editar esta página no GitHub