@gfazioli/mantine-rings-progress
A Mantine component that replicates the progress rings of Apple Watch.
Installation
After installation import package styles at the root of your application:
You can import styles within a layer @layer mantine-rings-progress by importing @gfazioli/mantine-rings-progress/styles.layer.css file.
Usage
The RingsProgress component renders multiple concentric RingProgress rings from @mantine/core. Each ring supports color, value, and tooltip props.
The label prop can be a string or a component. Try to change the label on the above configurator. You may use also an emoji 😊 or a custom component.
Per-ring Customization
Each ring can override the global thickness and roundCaps props, allowing you to create rings with different widths. You can also set a custom rootColor per ring to control the background track color independently.
Entrance Animation
Set animate to enable entrance animation — rings mount with value: 0 and smoothly transition to their target values. Control the speed with transitionDuration (in ms). When animate is enabled the component automatically uses a 1000ms transition if no explicit transitionDuration is set.
Staggered Animation
Use staggerDelay (in ms) to animate rings one after another instead of simultaneously. The outer ring animates first, followed by each inner ring after the specified delay.
Glow Effect
Enable a neon-like glow behind rings with the glow prop. Set it to true for a default 6px glow, or pass a number for a custom blur radius. Each ring can override the glow with glowIntensity and glowColor props. Best visible on dark backgrounds.
Pulse on Completion
Set pulseOnComplete to trigger a subtle pulse animation when a ring reaches 100%. This provides visual feedback when a goal is achieved — inspired by the Apple Watch ring completion celebration. Drag the sliders to 100% or click the button to see the effect.
You can also use the onRingComplete callback to run custom logic when a ring reaches 100% (e.g., show a notification, play a sound).
Move
72%
Exercise
45%
Stand
88%
Start Angle & Direction
Use startAngle (in degrees) to change where rings start filling from — 0 is the 12 o'clock position. Set direction to "counterclockwise" to reverse the fill direction.
startAngle=90
counterclockwise
Tooltip
Set withTooltip to display a unified tooltip on hover showing all rings info. Each ring's tooltip prop defines the content — if omitted, the ring value percentage is shown. The tooltip displays a color swatch next to each entry. You can customize the tooltip with tooltipProps.
Accessibility
The component renders with role="group" and each ring has role="progressbar" with proper aria-valuenow, aria-valuemin, and aria-valuemax attributes. You can customize the accessible label with aria-label on the component or ariaLabel per-ring.
The component automatically respects prefers-reduced-motion — when enabled, all animations are disabled.
Label
The label prop can be a string or a component.
Example: Countdown
Below, another example using RingsProgress to render a countdown timer.