Radial Meter
ProOne ratio against a limit, drawn as a ring or a gauge with the number at its heart. Thresholds recolour the fill and add a labelled chip, and up to three concentric rings track goals side by side.
Installation#
Usage#
RadialMeter ships in the Chart folder. Pass a value and, when the limit is not 100, a max; the centre shows the share of the range as a percent unless you pass a valueFormatter. It is the radial counterpart of Meter: same meaning, same role="meter", a round shape for a KPI tile or a hero figure. Use it instead of a two-slice pie whenever the chart is a single percentage.
The preview is yours to explore. Its code comes with a Pro license, paid once and used in every project.
Have a license? Unlock it here
Radial Meter or Meter#
Both report how much of something there is against a known limit, and both announce as a meter. Meter is a bar, the better fit in a row, a table or a settings list, where several readings line up and compare by length. A radial meter carries one number in a compact square, the better fit for a dashboard tile or a single headline reading.
Gauge and thresholds#
variant="gauge" opens the ring into a 240° arc and crops the empty space below it. thresholds mark where a reading becomes a warning and a critical one (higher is worse, both inclusive): a notch breaks the track at each, and past one the fill takes the status hue and a labelled chip appears below, so the state never rides on colour alone. Shuffle to watch the fill ease between readings.
Concentric rings#
segments draws up to three rings, outermost first, with a gap that grows with the size (2px minimum), each measured against its own max: an activity goal, a budget per team. The centre still shows value, here the average of the three. Two or more series always want a legend, so pair the rings with one; the meter already gives assistive tech a list of every ring and its reading.
In a stat#
A small ring beside an absolute figure in a Stat: the ring says how full, the value says how much. A numeric size (56px here) with a thinner thickness fits a header row, and shared thresholds flag the resources running out.
Accessibility#
A single reading is a role="meter" with aria-valuenow, aria-valuemin and aria-valuemax, named by label (or your aria-label). Its aria-valuetext is the formatted value plus the status, so a screen reader hears “94%, critical”; pass your own to say more. With segments the meter becomes a labelled group described by a visually hidden list of every ring. The SVG is hidden from assistive tech. The fill draws in once on mount and eases between values, and lands at once under prefers-reduced-motion.
The preview is yours to explore. Its code comes with a Pro license, paid once and used in every project.
Have a license? Unlock it here
API reference#
RadialMeter
A role="meter" (or, with segments, a labelled group) wrapping one measured SVG and the centre text. Forwards all native <div> props; className is merged last.
| Prop | Type | Default | Description |
|---|---|---|---|
| value* | number | - | The reading, clamped to [min, max]. A non-finite value reads as min. |
| min | number | 0 | The low end of the range. |
| max | number | 100 | The high end of the range, the limit the value is measured against. |
| variant | "ring" | "gauge" | "ring" | ring is a full 360° circle; gauge a 240° arc open at the bottom, cropped to its height. |
| size | "sm" | "md" | "lg" | number | "md" | sm 80px, md 128px, lg 176px wide, or any width in px; a number scales the stroke and picks the closest type size. |
| thickness | number | - | Stroke width in px. Defaults to 9% of the diameter (7.5% per ring with segments); concentric rings cap it so the centre keeps at least 40% of the diameter. |
| color | "chart-1" | "chart-2" | ... | "chart-8" | "chart-1" | The fill's hue while the reading is under every threshold. |
| thresholds | { warning?: number; critical?: number } | - | Higher is worse. At or past a threshold the fill takes the warning or critical hue and a labelled chip appears under the meter; a notch marks where each zone begins. |
| segments | RadialMeterSegment[] | - | Up to three concentric rings, outermost first: { label, value, max?, color? }. Each ring has its own max (a goal); colours default to chart-1, chart-2, chart-3. Thresholds do not apply. |
| label | string | - | The caption under the number, and the accessible name unless aria-label or aria-labelledby is passed. The number and caption are sized to the hole inside the rings; a caption that does not fit is hidden visually but stays in the accessibility tree. |
| valueFormatter | (value: number) => string | - | Formats the centre number and aria-valuetext; defaults to the share of the range as a whole percent. |
| children | ReactNode | - | Replaces the number and caption in the centre. |
| Data attribute | Description |
|---|---|
| data-variant | "ring" or "gauge". |
| data-status | "normal", "warning" or "critical"; absent with segments. Also on the status chip. |
| data-fraction | On each radial-meter-indicator: the share of its range it fills, 0 to 1. |