Anneau de progression
Un indicateur de progression circulaire, pourcentage au centre, qui rejoint chaque nouvelle valeur avec un léger ressort.
Réglages
Code
import { motion } from "framer-motion";
const RADIUS = 42;
const CIRCUMFERENCE = 2 * Math.PI * RADIUS;
interface WatchProgressRingProps {
color?: string;
/** Progreso de 0 a 100. */
progress?: number;
size?: number;
}
export default function WatchProgressRing({
color = "#0071e3",
progress = 72,
size = 112,
}: WatchProgressRingProps) {
return (
<div
role="progressbar"
aria-valuenow={progress}
aria-valuemin={0}
aria-valuemax={100}
className="relative grid place-items-center text-[#1d1d1f] dark:text-[#f5f5f7]"
style={{ width: size, height: size }}
>
<svg viewBox="0 0 100 100" className="absolute inset-0 -rotate-90">
<circle
cx="50"
cy="50"
r={RADIUS}
fill="none"
strokeWidth="9"
className="stroke-black/5 dark:stroke-white/10"
/>
<motion.circle
cx="50"
cy="50"
r={RADIUS}
fill="none"
stroke={color}
strokeWidth="9"
strokeLinecap="round"
strokeDasharray={CIRCUMFERENCE}
animate={{ strokeDashoffset: CIRCUMFERENCE * (1 - progress / 100) }}
transition={{ type: "spring", stiffness: 300, damping: 30 }}
/>
</svg>
<motion.strong
key={progress}
initial={{ scale: 0.8, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
className="text-xl"
>
{progress}%
</motion.strong>
</div>
);
}
Prompt pour l’IA
Collez-le dans ChatGPT, Claude ou Cursor : le bloc sera adapté à votre projet avec ces réglages, même sans React.
Plus dans Loaders
Où l’utiliser
Une barre de progression circulaire est idéale quand le chiffre compte : le taux de remplissage d’un profil, la part d’un cours déjà suivie par un élève ou la distance qui sépare quelqu’un de son objectif de pas dans une appli de sport. L’anneau rejoint chaque valeur avec souplesse, comme les anneaux d’activité d’une montre connectée.
Ne l’utilisez que si vous connaissez le vrai pourcentage : un anneau qui recule fait perdre confiance. Un anneau par carte suffit. Choisissez une couleur bien contrastée avec la piste grise, surtout sur fond clair.