Barra de progresso linear e anel circular animado, ambos guiados por CSS.
Mostra o preenchimento de algo — armazenamento usado, conclusão de uma tarefa, porcentagem de qualquer métrica.
A barra linear é só CSS (largura via style). O anel circular usa conic-gradient + @property --sw-prg-val (registra a variável como número animável) e um IntersectionObserver que dispara a contagem de 0 até o valor real só quando o elemento entra na tela.
<div sw-prg>
<div class="sw-prg-bar" style="width:65%"></div>
</div>
<!-- Tamanhos: sw-prg-pp (fino) | padrão | sw-prg-g (grosso) -->
<div class="sw-prg-lbl"><span>Upload</span><span>72%</span></div>
<div sw-prg><div class="sw-prg-bar" style="width:72%"></div></div>
<!-- Cores: sw-prg-bar (padrão) | is-suc | is-ale | is-err -->
<div sw-prg class="sw-prg-strp sw-prg-anim">
<div class="sw-prg-bar" style="width:60%"></div>
</div>
<div sw-prg-circ style="--sw-prg-val:72"><span>72%</span></div>
<!-- --sw-prg-val: 0-100 · --sw-prg-sz: diâmetro (padrão 8rem) -->
<div sw-prg-circ sw-prg-animate style="--sw-prg-val:72"><span>0%</span></div>
<!-- sw-prg-duration="1400" (ms) · sw-prg-suffix="%" (troque ou remova o sufixo) -->
<div sw-prg-circ sw-prg-animate class="is-grad" style="--sw-prg-val:80"><span>0%</span></div>
<div sw-prg-circ sw-prg-animate class="is-suc is-glow" style="--sw-prg-val:88"><span>0%</span></div>
<div sw-prg-circ sw-prg-animate class="is-thin" style="--sw-prg-val:65"><span>0%</span></div>
<div sw-prg-circ sw-prg-animate class="is-thick is-ale" style="--sw-prg-val:40"><span>0%</span></div>
sw-prg-animatesw-prg-suffixsw-prg-duration--sw-prg-szsw-prg-pp / sw-prg-g (na barra)sw-prg-strp / sw-prg-anim (na barra)is-suc / is-ale / is-err (barra ou anel)is-grad (no anel)is-glow (no anel)is-thin / is-thick (no anel)Nenhum.
Nenhum.
@property (todos navegadores modernos; sem ele, ainda funciona mas sem a animação suave do número).Nenhuma.