Progress
Barras que mostram o andamento de uma tarefa (Progress) ou o quanto de um limite já foi usado (Meter).
'use client';
import { useEffect, useState } from 'react';
import { Progress } from '@/components/ui/progress';
export default function ProgressDemo() {
const [value, setValue] = useState(13);
useEffect(() => {
const timer = setInterval(() => setValue((v) => (v >= 100 ? 0 : v + 7)), 800);
return () => clearInterval(timer);
}, []);
return (
<div className="w-full max-w-sm">
<Progress label="Enviando fotos do cardápio" value={Math.min(value, 100)} />
</div>
);
}Instalação
npx shadcn@latest add @lenstech/progressUso
import { Meter, Progress } from "@/components/ui/progress"<Progress label="Enviando fotos" value={45} />
<Meter label="Armazenamento" value={3.2} maxValue={10} valueLabel="3,2 GB de 10 GB" />Progress ou Meter?
Progress mostra o andamento de uma tarefa que vai terminar (upload, importação, etapas de cadastro).
Meter mostra uma quantidade dentro de um intervalo conhecido (armazenamento usado, meta de vendas,
limite do plano). Os dois têm a mesma aparência, mas são anunciados de forma diferente por leitores de tela
(progressbar x meter).
Sem label, informe aria-label. O valor exibido é formatado pelo React Aria (percentual por padrão); use
formatOptions para mudar o formato ou valueLabel para um texto próprio.
Exemplos
Indeterminado
Sem value ou com isIndeterminate, a barra exibe uma animação contínua — use quando não dá para saber quanto falta.
'use client';
import { Progress } from '@/components/ui/progress';
export default function ProgressIndeterminate() {
return (
<div className="w-full max-w-sm">
<Progress label="Gerando relatório de vendas…" isIndeterminate />
</div>
);
}Variantes
'use client';
import { Progress } from '@/components/ui/progress';
export default function ProgressVariants() {
return (
<div className="grid w-full max-w-sm gap-6">
<Progress label="Padrão" value={40} />
<Progress label="Cadastro concluído" value={100} variant="success" />
<Progress label="Importação de clientes" value={65} variant="info" />
<Progress label="Espaço de backup" value={82} variant="warning" />
<Progress label="Sincronização com falhas" value={30} variant="destructive" />
</div>
);
}Tamanhos e intervalo personalizado
size aceita sm, default e lg. Com minValue/maxValue a barra representa etapas, e valueLabel troca o
texto do valor.
'use client';
import { Progress } from '@/components/ui/progress';
export default function ProgressSizes() {
return (
<div className="grid w-full max-w-sm gap-6">
<Progress aria-label="Progresso pequeno" size="sm" value={30} />
<Progress aria-label="Progresso padrão" value={55} />
<Progress aria-label="Progresso grande" size="lg" value={80} />
<Progress
label="Etapa 2 de 4"
minValue={0}
maxValue={4}
value={2}
valueLabel="Dados da empresa"
/>
</div>
);
}Meter
Use formatOptions (as mesmas opções do Intl.NumberFormat) para exibir moeda, unidades etc.
'use client';
import { Meter } from '@/components/ui/progress';
export default function ProgressMeter() {
return (
<div className="grid w-full max-w-sm gap-6">
<Meter
label="Armazenamento de fotos"
value={3.2}
maxValue={10}
valueLabel="3,2 GB de 10 GB"
/>
<Meter
label="Meta de vendas de setembro"
value={18400}
maxValue={25000}
formatOptions={{ style: 'currency', currency: 'BRL', maximumFractionDigits: 0 }}
variant="info"
/>
</div>
);
}Meter com cor automática
Com variant="auto" a cor muda conforme o nível: até 70% verde, até 90% amarelo e acima disso vermelho.
'use client';
import { Meter } from '@/components/ui/progress';
export default function ProgressMeterAuto() {
return (
<div className="grid w-full max-w-sm gap-6">
<Meter label="E-mails enviados no mês" value={45} variant="auto" />
<Meter label="Usuários do plano" value={8} maxValue={10} variant="auto" />
<Meter label="Cota de disparos de WhatsApp" value={96} variant="auto" />
</div>
);
}Quando usar
- Use
Progresspara tarefas com duração perceptível (mais de ~1 s) em que o usuário espera o resultado. - Use
Meterpara mostrar consumo de um limite: armazenamento, cota de envios, meta. - Não use para carregamentos curtos de dados na tela — use
SkeletonouSpinner.
API
Progress
Aceita todas as props do ProgressBar do React Aria, mais:
Prop
Type
Meter
Aceita todas as props do Meter do React Aria, mais label, showValue,
size e:
Prop
Type