Stepper
Indicador de etapas que mostra em que ponto a pessoa está de um fluxo com ordem fixa, como uma compra ou um cadastro, e quanto falta. É uma lista numerada, não uma navegação.
- ContaE-mail e senha
- EmpresaCNPJ e endereço
- RevisãoConferir e ativar
Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. É um componente de cliente: cada etapa lê sua situação do stepper.
import { Stepper, Step, StepIndicator, StepTitle, StepDescription, StepSeparator } from "@camaleo/react";Anatomia
O Stepper é um <ol> e cada Step um <li>, então o leitor de tela diz "lista, 4 itens" e a posição de cada um. Passe activeStep ao stepper e cada etapa descobre sua situação: concluída antes dele, atual nele, futura depois. A linha entre as etapas é desenhada pela própria etapa, ou por um StepSeparator colocado por último nela; o indicador fica escondido do leitor de tela, então é o título que carrega o sentido. Um stepper horizontal com menos de 30rem de largura (uma container query, não a tela) esconde todos os títulos menos o da etapa atual.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.
- Carrinho
- Entrega
- Pagamento
- Revisão
- Carrinho
- Entrega
- Pagamento
- Revisão
Etapa 1 de 4Carrinho
Café do Cerrado 500 g, filtros de papel e uma caneca de cerâmica. Subtotal R$ 274,00.
Voltar e Continuar
Clique em Continuar. O foco vai para o título da nova etapa, então o leitor de tela diz "Etapa 2 de 4: Entrega" e quem usa teclado começa no topo do novo formulário.
- CarrinhoConcluída
- EntregaEm andamento
- PagamentoNão iniciada
Situação em palavras
Cor e um sinal de visto não bastam. Dê nome à lista com aria-label e uma palavra para cada situação, visível ou dentro de VisuallyHidden.
- Pagamento
- Revisão
Voltar a uma etapa concluída
Clique em Carrinho. Só as etapas que a pessoa já alcançou são links; as seguintes ficam como texto, porque os dados delas ainda não existem.
- Carrinho
- Entrega
- PagamentoCartão recusado
- Revisão
Cartão recusado. Tente outro cartão.
Etapa com erro
status="error" deixa a etapa vermelha com um X e mantém o aria-current quando ela é a etapa ativa. Diga também em palavras o que deu errado, porque a cor e o ícone não são anunciados.
- Pedido feito
- Embalado
- Entregue
Uma linha com estilo próprio
Coloque um StepSeparator por último na etapa quando uma linha precisa de outro visual, como uma linha tracejada até uma etapa que depende de outra pessoa.
- Perfil da lojaNome, logo e endereço da Grão Cafés.
- Cadastrar produtos12 de 12 importados da sua planilha.
- Conectar pagamentosVincule uma conta bancária para receber as vendas.
- Abrir a lojaEscolha um domínio e publique.
Vertical, com descrições
Em coluna sobra espaço para uma linha embaixo de cada etapa. Use numa barra lateral ou num checklist de configuração que a pessoa retoma depois.
- Criar contaana@graocafes.com.br
- Escolher planoPro, R$ 49/mês
- Convidar a equipeOpcionalAdicione pessoas agora ou depois em Configurações.
- Começar a venderSeu painel está pronto.
Etapa opcional
Marque com um badge, não só com um texto mais claro, para a pessoa saber que pode seguir sem ela.
- Carrinho
- Entrega
- Pagamento
- Revisão
Compacto no celular
Com menos de 30rem de largura, o stepper horizontal mostra só o título da etapa atual; os outros continuam na lista para o leitor de tela. Coloque "Etapa 2 de 4" acima dele para que todos vejam o tamanho do fluxo.
Em contexto
São pedaços inteiros de interface para copiar, no estilo que você escolheu.
- Carrinho
- Entrega
- Pagamento
- Revisão
Configure sua loja
2 de 4 concluídas- Perfil da loja
- Cadastrar produtos
- Conectar pagamentos
- Abrir a loja
As vendas caem nesta conta todo dia útil. Leva uns 3 minutos.
- Pedido feito14/03, 9:12
- Embalado14/03, 16:40
- Saiu para entregaPrevisto para hoje até 18h
- EntreguePrecisa de assinatura
Boas práticas
- Empresa
- Documentos
- Frete
- Abrir
A pessoa lê o fluxo inteiro de relance e sabe quanto falta para terminar.
- Conte sobre a sua empresa e os sócios
- Envie seus documentos
- Configure as regiões e os valores de frete
- Revise e abra a sua loja
Elas não cabem lado a lado, então o stepper esconde todas menos a atual e a pessoa não vê o que vem depois. Coloque os detalhes no título de cada etapa.
Uma página de configurações não tem primeira nem última seção, e nada ali fica "concluído".
- Perfil
- Notificações
- Cobrança
Números e sinais de visto prometem uma ordem e um fim que não existem, e as etapas nem dão para clicar.
Props
completed, ela fica current e as seguintes upcoming, a não ser que um Step defina o próprio status.O Step recebe status ("completed" · "current" · "upcoming" · "error") ou os atalhos completed e current; sem eles, a situação vem do activeStep, e é "upcoming" quando não há um. O StepIndicator usa a situação da sua etapa, ou o próprio status; com "completed" mostra um sinal de visto e com "error" um X no lugar dos filhos. O resto são as props nativas de <ol>, <li> e <span>.
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 stepper.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
/* indicadores quadrados e linha mais grossa no checkout */
.checkout [data-slot="stepper"] {
--cml-step-indicator-radius: 6px;
--cml-stepper-line: 3px solid var(--cml-border-control);
}Acessibilidade
- É um <ol>: o leitor de tela anuncia o número de etapas e a posição de cada uma. Dê nome a ele com aria-label.
- A etapa atual tem aria-current="step". Concluída e não iniciada não são anunciadas pela cor nem pelo sinal de visto, que é aria-hidden: acrescente uma palavra como "concluída" em VisuallyHidden. Vale o mesmo para um erro: diga o que deu errado no título ou num StepDescription.
- Quando a etapa mudar, leve o foco para o título da nova etapa, com "Etapa 2 de 4" nele, para que leitor de tela e teclado comecem no lugar certo.
- Deixe clicáveis só as etapas já alcançadas. As seguintes ficam como texto, para ninguém cair num formulário sem as respostas anteriores.