Skip to content
Open
Show file tree
Hide file tree
Changes from 85 commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
48c4fa0
update types
alexfauquette Apr 13, 2026
4849a27
share config that can be shared
alexfauquette Apr 13, 2026
c789b0b
copy some config helpers
alexfauquette Apr 13, 2026
b3686b1
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 13, 2026
6ff162f
prettier
alexfauquette Apr 13, 2026
f10f53c
docs:api
alexfauquette Apr 13, 2026
60a25a8
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 13, 2026
96f9b06
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 14, 2026
3e1e34b
move-to-premium
alexfauquette Apr 15, 2026
7f5abbb
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 15, 2026
968411b
pnpm prettier
alexfauquette Apr 15, 2026
ee08733
pnpm proptypes
alexfauquette Apr 15, 2026
8fa6236
pnpm docs:api
alexfauquette Apr 15, 2026
3eaffab
fix relative imports
alexfauquette Apr 15, 2026
b455c73
pnpm prettier
alexfauquette Apr 15, 2026
188d071
gix
alexfauquette Apr 15, 2026
f446724
pnpm prettier
alexfauquette Apr 15, 2026
7f5e7ee
prefer duplicating code
alexfauquette Apr 15, 2026
a2bcd67
copilot feedback
alexfauquette Apr 15, 2026
c8debbb
api update
alexfauquette Apr 15, 2026
7a81b83
fix types (harder than expected)
alexfauquette Apr 16, 2026
a22fd92
AI review
alexfauquette Apr 16, 2026
2cac9a1
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 16, 2026
8cf32e4
pnpm extract-error-codes
alexfauquette Apr 16, 2026
7c6f1ad
simplify axes types
alexfauquette Apr 16, 2026
8ab0e75
fix missed AI mistakes
alexfauquette Apr 16, 2026
fab6bb9
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 16, 2026
7fed8a3
pnpm prettier
alexfauquette Apr 16, 2026
c0d67c8
fix-eslint
alexfauquette Apr 16, 2026
15d329a
fix TS build
alexfauquette Apr 16, 2026
c083bc7
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 16, 2026
bb1fa26
forgoten experiment
alexfauquette Apr 16, 2026
8f9de9d
move types to premium
alexfauquette Apr 16, 2026
34a6a48
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 16, 2026
bde815e
pnpm docs:api
alexfauquette Apr 16, 2026
d192b38
rename
alexfauquette Apr 16, 2026
135e618
Merge remote-tracking branch 'upstream/master' into radial-line
alexfauquette Apr 16, 2026
b497131
test
alexfauquette Apr 16, 2026
e85e8f7
fix point grid
alexfauquette Apr 16, 2026
6f47bc9
fix radius computation
alexfauquette Apr 16, 2026
6c8d987
update demo
alexfauquette Apr 16, 2026
e8b2ae8
Merge remote-tracking branch 'upstream/master' into radial
alexfauquette Apr 16, 2026
558ad94
pnpm prettier
alexfauquette Apr 16, 2026
6e38102
export
alexfauquette Apr 16, 2026
e888cef
proptypes
alexfauquette Apr 16, 2026
bb09a01
fix
alexfauquette Apr 16, 2026
4d17654
pnpm docs:api
alexfauquette Apr 16, 2026
54e8526
pnpm docs:typescript:formatted
alexfauquette Apr 16, 2026
8e64cda
Merge remote-tracking branch 'upstream/master' into radial
alexfauquette Apr 21, 2026
0f0deb1
cleaning
alexfauquette Apr 21, 2026
799e4d1
Add Line and Area plots
alexfauquette Apr 21, 2026
e0fa3be
Merge remote-tracking branch 'upstream/master' into radial
alexfauquette Apr 21, 2026
c9118ee
fix docs:api
alexfauquette Apr 21, 2026
c3cc963
Merge remote-tracking branch 'upstream/master' into radial
alexfauquette Apr 21, 2026
a2e9716
fix JSDocs
alexfauquette Apr 21, 2026
a12d7ad
create renderer
alexfauquette Apr 21, 2026
14fe909
use the D3 radial line/area
alexfauquette Apr 21, 2026
0dd27ba
remove wrong export
alexfauquette Apr 21, 2026
8e9e4b8
fix docs api
alexfauquette Apr 21, 2026
e7e4223
pnpm docs:typescript:formatted
alexfauquette Apr 21, 2026
6e65985
[charts] Get closest item
alexfauquette Apr 22, 2026
47acbba
addapt radial line for highlight
alexfauquette Apr 22, 2026
d8d6380
extends to other elements
alexfauquette Apr 22, 2026
b3644b1
add highlight Plot
alexfauquette Apr 22, 2026
c65c5fe
fix tooltip/highlight when the chart is not a full circle
alexfauquette Apr 22, 2026
0d0a273
Merge remote-tracking branch 'upstream/master' into radia-interaction
alexfauquette Apr 22, 2026
181fb18
pnpm prettier
alexfauquette Apr 22, 2026
08e9da3
docs:api
alexfauquette Apr 22, 2026
ed416ab
pnpm extract-error-codes
alexfauquette Apr 22, 2026
75d1c5e
Merge remote-tracking branch 'upstream/master' into radia-interaction
alexfauquette Apr 22, 2026
2e6cdbd
demo
alexfauquette Apr 22, 2026
411bbb8
WIP: fixing the area detection
alexfauquette Apr 22, 2026
7bf28a4
export the getIteamAtPosition
alexfauquette Apr 23, 2026
620940e
fix out of range on the right
alexfauquette Apr 23, 2026
a7c24d8
fix approximations
alexfauquette Apr 23, 2026
b78a50e
fix ordinal bands
alexfauquette Apr 23, 2026
d76d447
export radial line position
alexfauquette Apr 23, 2026
0c2b3fc
fix edge cases
alexfauquette Apr 23, 2026
373449c
fix import
alexfauquette Apr 23, 2026
dfed3fe
ignore points outside the available range
alexfauquette Apr 23, 2026
0e1a6ed
Set radial line default to natural
alexfauquette Apr 23, 2026
58765b1
Merge remote-tracking branch 'upstream/master' into radia-interaction
alexfauquette Apr 23, 2026
b746ea4
pnpm prettier
alexfauquette Apr 23, 2026
d8d597b
pnpm docs:api
alexfauquette Apr 23, 2026
b649555
pnpm extract-error-codes
alexfauquette Apr 23, 2026
7e12559
bots feedback
alexfauquette Apr 24, 2026
547966c
pnpm prettier
alexfauquette Apr 24, 2026
a802a4e
fix band plots
alexfauquette Apr 24, 2026
0d2fbbf
fic the band scale case
alexfauquette Apr 24, 2026
00d4a58
Merge remote-tracking branch 'upstream/master' into radia-interaction
alexfauquette Apr 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions docs/data/charts/radial-lines/ElementHighlights.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import * as React from 'react';
import Stack from '@mui/material/Stack';
import Box from '@mui/material/Box';
import FormControlLabel from '@mui/material/FormControlLabel';
import Switch from '@mui/material/Switch';
import TextField from '@mui/material/TextField';
import MenuItem from '@mui/material/MenuItem';
import { Unstable_RadialLineChart as RadialLineChart } from '@mui/x-charts-premium/RadialLineChart';

const params = {
series: [
{
data: [3, 4, 1, 6, 5],
label: 'A',
area: false,
stack: 'total',
},
{ data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' },
{
data: [4, 2, 5, 4, 1],
label: 'C',
area: false,
stack: 'total',
},
],
rotationAxis: [{ scaleType: 'point', data: [1, 2, 3, 4, 5] }],
height: 400,
grid: { rotation: true, radius: true },
};

export default function ElementHighlights() {
const [withArea, setWithArea] = React.useState(false);
const [highlight, setHighlight] = React.useState('item');
const [fade, setFade] = React.useState('global');

return (
<Stack
direction={{ xs: 'column', xl: 'row' }}
spacing={1}
sx={{ width: '100%' }}
>
<Box sx={{ flexGrow: 1 }}>
<RadialLineChart
{...params}
series={params.series.map((series) => ({
...series,
area: withArea,
highlightScope: {
highlight,
fade,
},
}))}
/>
</Box>
<Stack
direction={{ xs: 'row', xl: 'column' }}
spacing={3}
useFlexGap
sx={{ justifyContent: 'center', flexWrap: 'wrap' }}
>
<TextField
select
label="highlight"
value={highlight}
onChange={(event) => setHighlight(event.target.value)}
sx={{ minWidth: 150 }}
>
<MenuItem value={'none'}>none</MenuItem>
<MenuItem value={'item'}>item</MenuItem>
<MenuItem value={'series'}>series</MenuItem>
</TextField>
<TextField
select
label="fade"
value={fade}
onChange={(event) => setFade(event.target.value)}
sx={{ minWidth: 150 }}
>
<MenuItem value={'none'}>none</MenuItem>
<MenuItem value={'series'}>series</MenuItem>
<MenuItem value={'global'}>global</MenuItem>
</TextField>

<FormControlLabel
control={
<Switch
checked={withArea}
onChange={(event) => setWithArea(event.target.checked)}
/>
}
label="Fill line area"
/>
</Stack>
</Stack>
);
}
99 changes: 99 additions & 0 deletions docs/data/charts/radial-lines/ElementHighlights.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import * as React from 'react';
import Stack from '@mui/material/Stack';
import Box from '@mui/material/Box';
import FormControlLabel from '@mui/material/FormControlLabel';
import Switch from '@mui/material/Switch';
import TextField from '@mui/material/TextField';
import MenuItem from '@mui/material/MenuItem';
import { Unstable_RadialLineChart as RadialLineChart } from '@mui/x-charts-premium/RadialLineChart';

type HighlightOptions = 'none' | 'item' | 'series';
type FadeOptions = 'none' | 'series' | 'global';

const params = {
series: [
{
data: [3, 4, 1, 6, 5],
label: 'A',
area: false,
stack: 'total',
},
{ data: [4, 3, 1, 5, 8], label: 'B', area: false, stack: 'total' },
{
data: [4, 2, 5, 4, 1],
label: 'C',
area: false,
stack: 'total',
},
],
rotationAxis: [{ scaleType: 'point' as const, data: [1, 2, 3, 4, 5] }],
height: 400,
grid: { rotation: true, radius: true },
};

export default function ElementHighlights() {
const [withArea, setWithArea] = React.useState(false);
const [highlight, setHighlight] = React.useState<HighlightOptions>('item');
const [fade, setFade] = React.useState<FadeOptions>('global');

return (
<Stack
direction={{ xs: 'column', xl: 'row' }}
spacing={1}
sx={{ width: '100%' }}
>
<Box sx={{ flexGrow: 1 }}>
<RadialLineChart
{...params}
series={params.series.map((series) => ({
...series,
area: withArea,
highlightScope: {
highlight,
fade,
},
}))}
/>
</Box>
<Stack
direction={{ xs: 'row', xl: 'column' }}
spacing={3}
useFlexGap
sx={{ justifyContent: 'center', flexWrap: 'wrap' }}
>
<TextField
select
label="highlight"
value={highlight}
onChange={(event) => setHighlight(event.target.value as HighlightOptions)}
sx={{ minWidth: 150 }}
>
<MenuItem value={'none'}>none</MenuItem>
<MenuItem value={'item'}>item</MenuItem>
<MenuItem value={'series'}>series</MenuItem>
</TextField>
<TextField
select
label="fade"
value={fade}
onChange={(event) => setFade(event.target.value as FadeOptions)}
sx={{ minWidth: 150 }}
>
<MenuItem value={'none'}>none</MenuItem>
<MenuItem value={'series'}>series</MenuItem>
<MenuItem value={'global'}>global</MenuItem>
</TextField>

<FormControlLabel
control={
<Switch
checked={withArea}
onChange={(event) => setWithArea(event.target.checked)}
/>
}
label="Fill line area"
/>
</Stack>
</Stack>
);
}
8 changes: 7 additions & 1 deletion docs/data/charts/radial-lines/radial-lines.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: React Radial Line chart
productId: x-charts
components: ChartsRadialDataProvider, ChartsRadialGrid, RadialLineChart, RadialMarkPlot, RadialLinePlot, RadialAreaPlot
components: ChartsRadialDataProvider, ChartsRadialGrid, RadialLineChart, RadialMarkPlot, RadialLinePlot, RadialAreaPlot, RadialLineHighlightPlot
---

# Charts - Radial Lines
Expand All @@ -14,6 +14,12 @@ The `RadialLineChart` component accepts `series`, `rotationAxis`, and `radiusAxi

{{"demo": "BasicRadialLineChart.js", "bg": "outline"}}

## Highlight

Like other series the radial line series have a `highlightScope` property which accept an objects with `highlight` and `fade` properties.
Comment thread
alexfauquette marked this conversation as resolved.
Outdated

{{"demo": "ElementHighlights.js", "bg": "outline"}}

## Radial grid

Similarly to the `ChartsGrid` we provide a `ChartsRadialGrid` for radial coordinates
Expand Down
5 changes: 5 additions & 0 deletions docs/data/chartsApiPages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,11 @@ const chartsApiPages: MuiPage[] = [
title: 'RadialLineChart',
plan: 'premium',
},
{
pathname: '/x/api/charts/radial-line-highlight-plot',
title: 'RadialLineHighlightPlot',
plan: 'premium',
},
{
pathname: '/x/api/charts/radial-line-plot',
title: 'RadialLinePlot',
Expand Down
1 change: 1 addition & 0 deletions docs/pages/x/api/charts/radial-line-chart.json
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@
"default": "ChartsNoDataOverlay",
"class": null
},
{ "name": "radialLineHighlight", "description": "", "class": null },
{
"name": "toolbar",
"description": "Custom component for the toolbar.",
Expand Down
20 changes: 20 additions & 0 deletions docs/pages/x/api/charts/radial-line-highlight-plot.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import * as React from 'react';
import { ApiPage } from '@mui/internal-core-docs/ApiPage';
import { mapApiPageTranslations } from '@mui/internal-core-docs/mapApiPageTranslations';
import jsonPageContent from './radial-line-highlight-plot.json';

export default function Page(props) {
const { descriptions } = props;
return <ApiPage descriptions={descriptions} pageContent={jsonPageContent} />;
}

export async function getStaticProps() {
const req = require.context(
'docs/translations/api-docs/charts/radial-line-highlight-plot',
false,
/\.\/radial-line-highlight-plot.*\.json$/,
);
const descriptions = mapApiPageTranslations(req);

return { props: { descriptions } };
}
15 changes: 15 additions & 0 deletions docs/pages/x/api/charts/radial-line-highlight-plot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"props": {},
"name": "RadialLineHighlightPlot",
"imports": [
"import { RadialLineHighlightPlot } from '@mui/x-charts-premium/RadialLineChart';",
"import { RadialLineHighlightPlot } from '@mui/x-charts-premium';"
],
"slots": [{ "name": "radialLineHighlight", "description": "", "class": null }],
"classes": [],
"muiName": "MuiRadialLineHighlightPlot",
"filename": "/packages/x-charts-premium/src/RadialLineChart/RadialLineHighlightPlot.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/x/react-charts/radial-lines/\">Charts - Radial Lines</a></li></ul>",
"cssComponent": false
}
3 changes: 2 additions & 1 deletion docs/public/static/error-codes.json
Original file line number Diff line number Diff line change
Expand Up @@ -265,5 +265,6 @@
"265": "MUI X Scheduler: `TimelineGridEventContext` is missing. TimelineGrid Event parts must be placed within <TimelineGrid.Event />.",
"266": "MUI X Scheduler: `TimelineGridEventRowContext` is missing. <TimelineGrid.Event /> part must be placed within <TimelineGrid.EventRow />.",
"267": "MUI X Scheduler: TimelineGridRootContext is missing. TimelineGrid parts must be placed within <TimelineGrid.Root />.",
"268": "MUI X Scheduler: TimelineGridSubGridContext is missing. <TimelineGrid.TitleRow /> and <TimelineGrid.EventRow /> must be placed within <TimelineGrid.SubGrid />."
"268": "MUI X Scheduler: TimelineGridSubGridContext is missing. <TimelineGrid.TitleRow /> and <TimelineGrid.EventRow /> must be placed within <TimelineGrid.SubGrid />.",
"269": "MUI X Charts: getAxisIndex is not implemented for polar continuous axes. This function only supports ordinal (band/point) scales."
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
"line": "The component that renders the line.",
"loadingOverlay": "Overlay component rendered when the chart is in a loading state.",
"noDataOverlay": "Overlay component rendered when the chart has no data to display.",
"radialLineHighlight": "",
"toolbar": "Custom component for the toolbar.",
"tooltip": "Custom component for the tooltip popper."
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"componentDescription": "",
"propDescriptions": {
"slotProps": { "description": "The props used for each component slot." },
"slots": { "description": "Overridable component slots." }
},
"classDescriptions": {},
"slotDescriptions": { "radialLineHighlight": "" }
}
14 changes: 13 additions & 1 deletion packages/x-charts-premium/src/RadialLineChart/RadialArea.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { areaRadial as d3AreaRadial } from '@mui/x-charts-vendor/d3-shape';
import type { CurveType, SeriesId } from '@mui/x-charts/models';
import { getCurveFactory } from '@mui/x-charts/internals';
import { type RadialLinePoint } from './useRadialLinePlotData';
import { useItemHighlightState } from '../hooks';

export interface RadialAreaProps extends Omit<React.SVGProps<SVGPathElement>, 'ref' | 'points'> {
seriesId: SeriesId;
Expand All @@ -15,20 +16,31 @@ export interface RadialAreaProps extends Omit<React.SVGProps<SVGPathElement>, 'r
function RadialArea(props: RadialAreaProps) {
const { seriesId, color, hidden, curve, points, ...other } = props;

const identifier = React.useMemo(() => ({ type: 'radialLine' as const, seriesId }), [seriesId]);

const highlightState = useItemHighlightState(identifier);

const isHighlighted = highlightState === 'highlighted';
const isFaded = highlightState === 'faded';

const d =
d3AreaRadial<RadialLinePoint>()
.angle((p) => p.angle)
.innerRadius((p) => p.baseRadius)
.outerRadius((p) => p.radius)
.curve(getCurveFactory(curve))(points) || '';

const fadedOpacity = isFaded ? 0.3 : 1;
return (
<path
data-series={seriesId}
data-highlighted={isHighlighted || undefined}
data-faded={isFaded || undefined}
d={d}
fill={color}
stroke="none"
opacity={hidden ? 0 : 1}
filter={isHighlighted ? 'brightness(120%)' : undefined}
opacity={hidden ? 0 : fadedOpacity}
{...other}
/>
);
Expand Down
14 changes: 13 additions & 1 deletion packages/x-charts-premium/src/RadialLineChart/RadialLine.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { lineRadial as d3LineRadial } from '@mui/x-charts-vendor/d3-shape';
import { getCurveFactory } from '@mui/x-charts/internals';
import { type CurveType, type SeriesId } from '@mui/x-charts/models';
import { type RadialLinePoint } from './useRadialLinePlotData';
import { useItemHighlightState } from '../hooks';

export interface RadialLineProps extends Omit<React.SVGProps<SVGPathElement>, 'ref' | 'points'> {
seriesId: SeriesId;
Expand All @@ -15,19 +16,30 @@ export interface RadialLineProps extends Omit<React.SVGProps<SVGPathElement>, 'r
function RadialLine(props: RadialLineProps) {
const { seriesId, color, hidden, points, curve, ...other } = props;

const identifier = React.useMemo(() => ({ type: 'radialLine' as const, seriesId }), [seriesId]);

const highlightState = useItemHighlightState(identifier);

const isHighlighted = highlightState === 'highlighted';
const isFaded = highlightState === 'faded';

const d =
d3LineRadial<RadialLinePoint>()
.angle((p) => p.angle)
.radius((p) => p.radius)
.curve(getCurveFactory(curve))(points) || '';

const fadedOpacity = isFaded ? 0.3 : 1;
return (
<path
data-series={seriesId}
data-highlighted={isHighlighted || undefined}
data-faded={isFaded || undefined}
d={d}
stroke={color}
fill="none"
opacity={hidden ? 0 : 1}
filter={isHighlighted ? 'brightness(120%)' : undefined}
opacity={hidden ? 0 : fadedOpacity}
{...other}
/>
);
Expand Down
Loading
Loading