Progress
Atom
Progress mostra avanço mensurável. Use apenas quando existe total conhecido ou critério claro de conclusão.
Use Progress para upload, processamento, onboarding, cobertura de checklist ou sincronização com percentual conhecido. Para espera indeterminada, use Spinner ou Skeleton.
Exemplos copiáveis
React
React
import * as React from "react"
type PulsoProgressProps = {
value: number
max?: number
label: string
description?: string
showValue?: boolean
}
export function PulsoProgress({
value,
max = 100,
label,
description,
showValue = true,
}: PulsoProgressProps) {
const safeValue = Math.min(Math.max(value, 0), max)
const percent = Math.round((safeValue / max) * 100)
return (
<div className="grid gap-2">
<div className="flex items-end justify-between gap-3">
<div>
<p className="text-sm font-medium text-[var(--fg)]">{label}</p>
{description ? (
<p className="mt-0.5 text-xs text-[var(--fg-muted)]">{description}</p>
) : null}
</div>
{showValue ? (
<span className="font-mono text-sm font-semibold tabular-nums text-[var(--fg-muted)]">
{percent}%
</span>
) : null}
</div>
<div
role="progressbar"
aria-label={label}
aria-valuemin={0}
aria-valuemax={max}
aria-valuenow={safeValue}
className="h-2 overflow-hidden rounded-full bg-[var(--muted)]"
>
<div
className="h-full rounded-full bg-[var(--primary)] transition-[width] duration-[var(--motion-duration-base)] ease-[var(--motion-easing)]"
style={{ width: `${percent}%` }}
/>
</div>
</div>
)
}<PulsoProgress
label="Cobertura de fontes"
description="Fontes auditáveis verificadas para o caso PLS-012."
value={72}
/>Quando usar
- Upload, importação ou processamento com total conhecido.
- Cobertura de checklist, fontes ou etapas concluídas.
- Onboarding com número finito de passos.
- Sincronização quando há percentual real.
Quando não usar
- Espera indeterminada; use Spinner ou Skeleton.
- Métrica de risco ou severidade.
- Comparação entre categorias; use chart/bar adequado.
- Progresso falso sem base mensurável.
Acessibilidade
- Use
role="progressbar". - Informe
aria-valuemin,aria-valuemaxearia-valuenowquando determinado. - Mantenha label visível ou
aria-labelespecífico. - Mostre percentual textual quando ele ajuda decisão.
Regras
- Valor deve refletir total conhecido.
- Não use Progress como decoração de card.
- Não confunda cobertura com confiança de IA.
- Motion deve ser suave e respeitar
prefers-reduced-motion. - Se o processo travar, troque para estado de erro/partial com explicação.
Last updated on