Theme studio

Design a theme, preview it live, then export it. Saved in this browser.

Quick picks #10b981
Generated scale
50100200300400500600700800900
Some text is below AA

RadialChart

  • Stable
  • WCAG 2.2 evidence
  • RTL

A radial chart: concentric rings that each fill clockwise from 12 o'clock to show how far a measure has got, with a column of values beside them. Data driven: rings in, SVG out; the same props render the static SVG on the server. Accessibility: the figure is named by title, described by summary and backed by a data table with every value, maximum and progress (WCAG 1.1.1, 1.3.1). The plot is ONE tab stop: any arrow key moves between rings (Right and Down go inwards), Home and End jump to the first and last, and each ring is announced with its name, value, maximum and progress. Hovering or focusing a ring outlines it and shows a tooltip that stays while hovered and closes with Escape (1.4.13, 2.1.1). Rings differ by colour AND fill pattern, and the value rows repeat the pattern next to the name and value as text (1.4.1). The draw-in is behind motion-safe:. The plot is a fixed 176 px and the value rows wrap under it on a narrow card (1.4.10); the plot stays left-to-right in right-to-left pages while the card, rows and table mirror, and digits follow the locale. Consumer duties: a title that asks the question, a summary with the main message, units in valueFormat or formatValue (a ring of 87 reads "87" unless you format it as a percent), meaningful ring names.

import { RadialChart } from "@nexera-ui/react";
Loading example…
11
examples
20
props
3
live controls
1
platform
9
WCAG criteria
0
blocks use it

Try every prop. Copy the code.

Change the props and the code updates. Check light and dark, LTR and RTL, and phone width.

Loading…
title
description
isLegendHidden
Generated code
import { RadialChart } from "@nexera-ui/react";

<RadialChart />

Examples 10

The same examples as Storybook, rendered live. Open Code to copy one.

Own maximum

Each ring can have its own full turn: 112 of 128 here, 9 of 12 hours there. The rows show the value, the table the maximum and the progress.

Loading example…

Full empty and missing

A ring that is full, one at 0, and one with no value ("No data").

Loading example…

Plot only

Without the value rows the rings stay named in the tooltip and the table.

Loading example…

Loading

Loading, empty and error are ChartStates inside the card; the header stays.

Loading example…

Empty

Loading example…

Error state

Loading example…

Single ring

One ring.

Loading example…

Many rings

Eight rings get thinner to fit; the rows and the table carry every value. Use a bar chart past about five.

Loading example…

Long labels

Long ring names wrap in the rows, the tooltip and the table; nothing is cut off.

Loading example…

Right to left

Right-to-left page: the card, value rows and table mirror, the rings keep their clockwise direction from 12 o'clock, digits follow the locale.

Loading example…

Props 20

Press "Try it" on a card to load that prop into the playground.

20 props shown

rings*Nexera
readonly RadialRing[]

The rings from the outermost to the innermost. Each ring is one measure against its own full turn: attendance, goals, completion. Rings differ by colour AND fill pattern (WCAG 1.4.1), and each ring's value, name, maximum and progress are in the value rows, the tooltip and the table. Keep to about five rings; use a BarChart to compare many values precisely.

Default –
maxNexera
number

The value of a full turn for every ring that does not set its own max.

Default 100
valueLabelNexera
string

Header of the value column of the table and label of the value row in the tooltip and the point labels. Translate it.

Default Value
maxLabelNexera
string

Header of the maximum column and label of the maximum row in the tooltip and the point labels. Translate it.

Default Maximum
progressLabelNexera
string

Header of the progress column (the value as a share of the maximum) and label of the progress row in the tooltip and the point labels. Translate it.

Default Progress
title*Nexera
string

Chart title: the question the chart answers ("Headcount"). Required: it names the figure, the plot and the data table (WCAG 1.1.1).

Default –
descriptionNexera
ReactNode

Secondary line under the title.

Default –
summary*Nexera
string

One or two sentences with what the chart shows and its main message ("Headcount grew from 96 to 128 over twelve months"). Required: it describes the figure for assistive technology (WCAG 1.1.1); the data table has the details.

Default –
rangeNexera
ChartRangeProps

Range switch in the header: 3M, 6M, 12M. Pass the data of the chosen range back in.

Default –
actionsNexera
ReactNode

Extra controls in the header, after the range switch.

Default –
kpiNexera
ChartKpiProps

KPI row above the plot: the headline number with an optional label or change badge.

Default –
stateNexera
ChartPlotState

The state that replaces the plot: loading (skeleton), empty or error. A chart without a value to plot shows the empty state by itself; pass { status: "empty", title, description, action } to give it your wording.

Default –
tableNexera
ChartTableOptions

The data table that is the text alternative: caption, first-column header and whether it is visible or only for assistive technology.

Default –
localeNexera
string

Locale of digits and separators.

Default the `NexeraProvider` locale
valueFormatNexera
NumberFormatOptions

Intl.NumberFormat options for values ({ style: "currency", currency: "PKR" }, { style: "percent" }). Serialisable, so it works from a Server Component; formatValue needs a Client Component.

Default –
formatValueNexera
(value: number) => string

Formats a value for tooltips, point labels and the table (full precision). Wins over valueFormat.

Default –
heightNexera
number

Height of the plot in px. The card grows with the header, KPI and legend around it.

Default 180
isLegendHiddenNexera
boolean

Hide the legend. The series stay named in the tooltip, the point labels and the table.

Default false
plotLabelNexera
string

Accessible name of the plot group. Translate it.

Default the chart `title`
noDataLabelNexera
string

Text for a missing value in the tooltip and the table. Translate it.

Default No data

* Required. React Aria props shown are the ones most apps use; the component accepts the rest of its React Aria props too.

Accessible by default.

Built on React Aria, and covered by the WCAG 2.2 evidence generated on every build.

WCAG 2.2 evidence

8 direct · 1 supporting
  • 1.1.1Non-text ContentLevel A · tested directly
  • 1.3.1Info and RelationshipsLevel A · tested directly
  • 1.4.1Use of ColorLevel A · tested directly
  • 1.4.10ReflowLevel AA · tested directly
  • 1.4.13Content on Hover or FocusLevel AA · tested directly
  • 2.1.1KeyboardLevel A · tested directly
  • 2.3.3Animation from InteractionsLevel AAA · supporting test
  • 4.1.2Name, Role, ValueLevel A · tested directly
  • 4.1.3Status MessagesLevel AA · tested directly

Fits any width.

Nexera components respond to the space they are given. Drag the corner of the frame, or pick a width.

0 px · drag the corner

Styling hooks

Pass className to add Tailwind classes (merged last). State is exposed as data attributes, so you can style it with variants like data-pressed:.

Usage
<RadialChart className="shadow-sm" />

Used in blocks

No block uses RadialChart yet.

Related components