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

ProgressCircle

Progresso circular — um anel que mostra quanto uma tarefa já avançou, do tamanho certo para cards, blocos e barras de ferramentas. Quando houver espaço para uma barra inteira, use Progress.

Feito com Anel SVGPadrão WAI-ARIA progressbarComponente de servidorCódigo ↗
minimal · light · #3fa34d
72%
Exportando relatório
tone
showValue

Instalação

Configure o Camaleo uma vez (Instalação) e importe o que precisar. Ele renderiza no servidor.

import { ProgressCircle } from "@camaleo/react";

Anatomia

Uma raiz com o papel progressbar guarda o anel (um SVG com a trilha e o arco, e o valor por cima) e um rótulo opcional embaixo. 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 marca da barra acima.

minimal · light · #3fa34d
65%
Sincronizando fotos
64%
Enviando relatorio.pdf
40%
Pausado · sem conexão
30%
Falhou · arquivo grande demais

Travada ou com falha

Use tone="warning" quando a tarefa travar e tone="danger" quando ela falhar. Diga o motivo no rótulo também, para a cor não ser o único sinal.

60%
Barra, 40 px
60%
Card, 56 px
60%
Resumo, 80 px

Tamanhos

Mude size e strokeWidth juntos. Um traço fino num anel grande fica apagado, e um grosso num anel pequeno aperta o número.

Preparando o backup

Duração desconhecida

Passe value={null} quando ainda não der para medir o trabalho: o número some e o arco gira (ele pulsa com movimento reduzido). Deixar value de fora não é a mesma coisa, significa 0%.

3/5
Aulas concluídas

Contagem em vez de porcentagem

Defina max com o total real e mostre "3/5" em valueLabel. O getAriaValueText dá ao leitor de tela as palavras, "3 de 5 aulas", em vez de "60%".

Backup4 de 6 pastas

Anel pequeno ao lado do texto

Abaixo de uns 40 px o número não cabe. Esconda-o com showValue={false}, escreva o valor ao lado do anel e dê um nome a ele com aria-label.

78 GB
Armazenamento usado

Uma medida, não uma tarefa

O armazenamento usado nunca caminha para "concluído". Passe role="meter" para o leitor de tela não anunciar isso como uma tarefa em andamento.

2/6
Enviando fotos

Avise quando terminar

Clique até terminar. O leitor de tela não anuncia cada mudança do anel, então uma mensagem com role="status" avisa quando todas as fotos chegaram.

Em contexto

O anel cabe onde uma barra ficaria larga demais: ao lado de um título, num card ou numa fileira de metas. Estas são peças inteiras de interface que você pode copiar, no estilo que escolheu.

Enviando para o Drive compartilhado

4 de 6 arquivos · cerca de 1 minuto restante

4/6
Envio em andamentoCard · ProgressCircle · Button

Atividade de hoje

Quarta-feira, 28/10/2026

84%
Passos
30/45
Minutos ativos
10/12
Horas em pé
Metas do diaCard · ProgressCircle
7/12

TypeScript para quem usa React

Próxima aula: componentes genéricos

Card de cursoCard · ProgressCircle · Button

Boas práticas

40%
Importando contatos
FaçaDiga o que está rodando.

"Importando contatos" diz à pessoa o que ela está esperando, e vira o nome acessível do anel.

40%
EviteUm anel só com o número.

40% de quê? Sem rótulo, a pessoa não sabe qual tarefa ele acompanha, e o leitor de tela só diz "Progresso".

30%
O envio falhou · tente de novo
FaçaGuarde o vermelho para um problema real.

Um anel vermelho ao lado de "O envio falhou" leva a pessoa direto ao que precisa dela.

25%
Configuração do perfil
EviteVermelho para uma tarefa que só está rodando.

Uma configuração de perfil em 25% é normal. Vermelho ali ensina a pessoa a ignorar o vermelho quando algo quebrar de verdade.

Props

PropriedadeTipoPadrãoDescrição
valuenumber | null0Quanto a tarefa avançou, entre min e max (limitado a eles). null indica duração desconhecida e o anel gira; deixar de fora significa 0.
minnumber0Valor mínimo da escala.
maxnumber100Valor máximo da escala.
sizenumber56Diâmetro externo do anel, em pixels.
strokeWidthnumber5Espessura da trilha e do arco, em pixels.
toneProgressCircleTone"brand"Cor do arco: warning quando a tarefa trava, danger quando falha.
labelReactNode—Texto abaixo do anel, que também dá nome a ele para o leitor de tela, a menos que aria-label exista. Sem nenhum dos dois, o nome é "Progresso" (ou o texto do MessagesProvider).
showValuebooleantrueMostra o valor dentro do anel. Fica sempre escondido enquanto value é null.
valueLabelReactNode—Texto visível que substitui a porcentagem, como "3/5". Uma string também é o que o leitor de tela ouve; senão, passe getAriaValueText.
getAriaValueTextfunction`valueLabel` when it is a string; otherwise the percentageO que o leitor de tela ouve como valor (aria-valuetext). Recebe a porcentagem mostrada (como "40%") e o valor, os dois null enquanto indeterminado. Padrão: o valueLabel quando é string; senão, a porcentagem.

Os atributos nativos de <div> são repassados, como aria-label, aria-valuetext e role.

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

Atributos

data-tonebrand · warning · danger, na raiz e no indicador
data-indeterminatepresente quando value é null

Tokens que ele lê

Cor

--cml-accent-text--cml-danger--cml-fg--cml-fg-secondary--cml-surface-raised--cml-warning

Tipografia e movimento

--cml-duration-base--cml-ease-standard--cml-font-control--cml-font-label--cml-ring-linecap

Acessibilidade

—Não recebe foco. Ele informa um estado; os controles ao redor recebem o foco.

Relacionados

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