Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
a67bde5
create-radial-bar-component
alexfauquette Apr 29, 2026
7f9366b
dumb docs page
alexfauquette Apr 29, 2026
e853d59
first render
alexfauquette Apr 30, 2026
8b5220a
horzontal plot
alexfauquette Apr 30, 2026
eb25cfc
allow other stuff than linear for the radial axis
alexfauquette Apr 30, 2026
dd7c905
proptypes
alexfauquette Apr 30, 2026
ae4c415
propagate TS fixe
alexfauquette Apr 30, 2026
f52b05f
fix docs:api
alexfauquette Apr 30, 2026
d8fbf7b
pnpm docs:api
alexfauquette Apr 30, 2026
170c930
pnpm docs:typescript:formatted
alexfauquette Apr 30, 2026
e21116c
get the highlighted item
alexfauquette Apr 30, 2026
4cc23f2
simplify transformations
alexfauquette Apr 30, 2026
36df4ce
show highlight
alexfauquette Apr 30, 2026
57dcd88
docs update
alexfauquette Apr 30, 2026
99427d4
[internal] Replace Codspeed with @mui/internal-benchmark for charts (…
JCQuintas Apr 30, 2026
3227182
Bump @mui/internal-docs-infra to ^0.10.1-canary.5 (#22167)
renovate[bot] Apr 30, 2026
26dade0
pnpm prettier
alexfauquette Apr 30, 2026
437f592
pnpm generate:exports
alexfauquette Apr 30, 2026
7d525ad
fix
alexfauquette Apr 30, 2026
f5001a2
fix import
alexfauquette Apr 30, 2026
6c79f51
fix import
alexfauquette Apr 30, 2026
894f6e5
pnpm docs:api
alexfauquette Apr 30, 2026
ba38f19
pnpm generate:exports
alexfauquette Apr 30, 2026
4e67233
create-radial-bar-component
alexfauquette Apr 29, 2026
bfddb08
dumb docs page
alexfauquette Apr 29, 2026
edbc771
first render
alexfauquette Apr 30, 2026
7e620d1
horzontal plot
alexfauquette Apr 30, 2026
55d97dc
allow other stuff than linear for the radial axis
alexfauquette Apr 30, 2026
ed9892b
proptypes
alexfauquette Apr 30, 2026
a48750a
propagate TS fixe
alexfauquette Apr 30, 2026
2270780
fix docs:api
alexfauquette Apr 30, 2026
31b57e1
pnpm docs:api
alexfauquette Apr 30, 2026
410bb3d
pnpm docs:typescript:formatted
alexfauquette Apr 30, 2026
084dda7
remove label classes
alexfauquette May 5, 2026
48c8d2a
isolate props propagation in a hook
alexfauquette May 5, 2026
0e3da7c
Merge remote-tracking branch 'upstream/master' into radialBar/plot
alexfauquette May 5, 2026
8d74d28
pnpm proptypes
alexfauquette May 5, 2026
4d7cc9d
pnpm docs:api
alexfauquette May 5, 2026
8dea4fc
Merge remote-tracking branch 'upstream/master' into radialBar/plot
alexfauquette May 6, 2026
e46254e
fix ts
alexfauquette May 6, 2026
6961032
feedback
alexfauquette May 6, 2026
f54fe13
Merge remote-tracking branch 'upstream/master' into radialBar/plot
alexfauquette May 6, 2026
b0771cf
pnpm prettier
alexfauquette May 6, 2026
3454857
pnpm docs:api
alexfauquette May 6, 2026
dedec5b
Merge branch 'radialBar/plot' into radialBar/highlight
alexfauquette May 6, 2026
12d3e1f
Merge remote-tracking branch 'upstream/master' into radialBar/highlight
alexfauquette May 6, 2026
70e493c
revert errors
alexfauquette May 6, 2026
d1b3ca9
ts fix
alexfauquette May 6, 2026
4b8e4aa
simplify
alexfauquette May 6, 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
5 changes: 5 additions & 0 deletions docs/data/charts/radial-bars/BasicRadialBarChart.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ const months = [
'Dec',
];

const highlightScope = { highlight: 'item', fade: 'global' };

export default function BasicRadialBarChart() {
return (
<RadialBarChart
Expand All @@ -24,16 +26,19 @@ export default function BasicRadialBarChart() {
{
data: [3, 5, 7, null, 12, 15, 18, 16, 13, 9, 6, 4],
label: 'Temperature',
highlightScope,
},
{
data: [12, 15, 18, 16, 13, null, 6, 4, 3, 5, 7, 9],
label: 'Temperature',
stack: 'a',
highlightScope,
},
{
data: [7, 9, 12, 15, 18, 16, 13, null, 6, 4, 3, 5],
label: 'Temperature',
stack: 'a',
highlightScope,
},
]}
rotationAxis={[{ scaleType: 'band', data: months }]}
Expand Down
4 changes: 4 additions & 0 deletions docs/data/charts/radial-bars/BasicRadialBarChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const months = [
'Nov',
'Dec',
];
const highlightScope = { highlight: 'item', fade: 'global' } as const;

export default function BasicRadialBarChart() {
return (
Expand All @@ -24,17 +25,20 @@ export default function BasicRadialBarChart() {
{
data: [3, 5, 7, null, 12, 15, 18, 16, 13, 9, 6, 4],
label: 'Temperature',
highlightScope,
},

{
data: [12, 15, 18, 16, 13, null, 6, 4, 3, 5, 7, 9],
label: 'Temperature',
stack: 'a',
highlightScope,
},
{
data: [7, 9, 12, 15, 18, 16, 13, null, 6, 4, 3, 5],
label: 'Temperature',
stack: 'a',
highlightScope,
},
]}
rotationAxis={[{ scaleType: 'band', data: months }]}
Expand Down
5 changes: 5 additions & 0 deletions docs/data/charts/radial-bars/HorizontalRadialBarChart.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { Unstable_RadialBarChart as RadialBarChart } from '@mui/x-charts-premium

const quarters = ['Q1', 'Q2', 'Q3', 'Q4'];

const highlightScope = { highlight: 'item', fade: 'global' };

export default function HorizontalRadialBarChart() {
return (
<RadialBarChart
Expand All @@ -12,17 +14,20 @@ export default function HorizontalRadialBarChart() {
data: [3, 5, 7, 9],
label: 'Temperature',
layout: 'horizontal',
highlightScope,
},
{
data: [9, 12, 15, 17],
label: 'Temperature',
layout: 'horizontal',
highlightScope,
stack: 'stack1',
},
{
data: [3, 5, 15, 3],
label: 'Temperature',
layout: 'horizontal',
highlightScope,
stack: 'stack1',
},
]}
Expand Down
5 changes: 5 additions & 0 deletions docs/data/charts/radial-bars/HorizontalRadialBarChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { Unstable_RadialBarChart as RadialBarChart } from '@mui/x-charts-premium

const quarters = ['Q1', 'Q2', 'Q3', 'Q4'];

const highlightScope = { highlight: 'item', fade: 'global' } as const;

export default function HorizontalRadialBarChart() {
return (
<RadialBarChart
Expand All @@ -12,17 +14,20 @@ export default function HorizontalRadialBarChart() {
data: [3, 5, 7, 9],
label: 'Temperature',
layout: 'horizontal',
highlightScope,
},
{
data: [9, 12, 15, 17],
label: 'Temperature',
layout: 'horizontal',
highlightScope,
stack: 'stack1',
},
{
data: [3, 5, 15, 3],
label: 'Temperature',
layout: 'horizontal',
highlightScope,
stack: 'stack1',
},
]}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import clsx from 'clsx';
import { arc as d3Arc } from '@mui/x-charts-vendor/d3-shape';
import { styled } from '@mui/material/styles';
import { type SeriesId } from '@mui/x-charts/internals';
import { useItemHighlightState } from '../hooks';
import { type RadialBarClasses, useUtilityClasses } from './radialBarClasses';

type RadialBarElementProps = Omit<React.SVGProps<SVGPathElement>, 'ref'> & {
Expand Down Expand Up @@ -40,6 +41,15 @@ function RadialBarElement(props: RadialBarElementProps) {

const classes = useUtilityClasses({ classes: innerClasses });

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

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

const d = d3Arc()({
startAngle,
endAngle,
Expand All @@ -56,6 +66,10 @@ function RadialBarElement(props: RadialBarElementProps) {
onClick={onClick}
cursor={onClick ? 'pointer' : undefined}
data-index={dataIndex}
data-highlighted={isHighlighted || undefined}
data-faded={isFaded || undefined}
filter={isHighlighted ? 'brightness(120%)' : undefined}
opacity={isFaded ? 0.3 : 1}
{...other}
/>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import {
type ChartState,
type ProcessedSeries,
type UseChartPolarAxisSignature,
selectorAllSeriesOfType,
selectorChartPolarCenter,
selectorChartRadiusAxis,
selectorChartRotationAxis,
getBandIndex,
clampAngleRad,
generateSvg2rotation,
} from '@mui/x-charts/internals';
import type { SeriesItemIdentifierWithType } from '@mui/x-charts/models';

export default function getItemAtPosition(
state: ChartState<[UseChartPolarAxisSignature]>,
point: { x: number; y: number },
): SeriesItemIdentifierWithType<'radialBar'> | undefined {
const { axis: rotationAxes, axisIds: rotationAxisIds } = selectorChartRotationAxis(state);
const { axis: radiusAxes, axisIds: radiusAxisIds } = selectorChartRadiusAxis(state);
const center = selectorChartPolarCenter(state);
const seriesState = selectorAllSeriesOfType(state, 'radialBar') as ProcessedSeries['radialBar'];

if (!seriesState || seriesState.seriesOrder.length === 0) {
return undefined;
}

const defaultRotationAxisId = rotationAxisIds[0];
const defaultRadiusAxisId = radiusAxisIds[0];

const polarCoordinate = {
rotation: generateSvg2rotation(center)(point.x, point.y),
radius: Math.sqrt((point.x - center.cx) ** 2 + (point.y - center.cy) ** 2),
};

for (let stackIndex = 0; stackIndex < seriesState.stackingGroups.length; stackIndex += 1) {
const group = seriesState.stackingGroups[stackIndex];
const seriesIds = group.ids;

for (const seriesId of seriesIds) {
const series = (seriesState.series ?? {})[seriesId];

const rotationAxisId = series.rotationAxisId ?? defaultRotationAxisId;
const radiusAxisId = series.radiusAxisId ?? defaultRadiusAxisId;

const rotationAxis = rotationAxes[rotationAxisId];
const radiusAxis = radiusAxes[radiusAxisId];

const bandAxis = series.layout === 'horizontal' ? radiusAxis : rotationAxis;
const continuousAxis = series.layout === 'horizontal' ? rotationAxis : radiusAxis;

const clampedAngle =
rotationAxis.scale.range()[0] +
clampAngleRad(polarCoordinate.rotation - rotationAxis.scale.range()[0]);
const bandCoordinate = series.layout === 'horizontal' ? polarCoordinate.radius : clampedAngle;
const valueCoordinate =
series.layout === 'horizontal' ? clampedAngle : polarCoordinate.radius;

const dataIndex = getBandIndex(
bandAxis,
{ groupNumber: seriesState.stackingGroups.length, groupIndex: stackIndex },
bandCoordinate,
);

if (dataIndex === -1) {
continue;
}

// The point is inside the band for this series
const bar = series.visibleStackedData[dataIndex];
const start = continuousAxis.scale(bar[0]);
const end = continuousAxis.scale(bar[1]);

if (start == null || end == null) {
continue;
}

const continuousMin = Math.min(start, end);
const continuousMax = Math.max(start, end);

if (valueCoordinate >= continuousMin && valueCoordinate <= continuousMax) {
return {
type: 'radialBar',
seriesId,
dataIndex,
};
}
}
}

return undefined;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import colorProcessor from './getColor';
import seriesProcessor from './seriesProcessor';
import getSeriesWithDefaultValues from './getSeriesWithDefaultValues';
import descriptionGetter from './descriptionGetter';
import getItemAtPosition from './getItemAtPosition';
import { radiusExtremumGetter, rotationExtremumGetter } from './extremums';
import tooltipGetter from './tooltip';

Expand All @@ -29,7 +30,7 @@ export const radialBarSeriesConfig: ChartSeriesTypeConfig<'radialBar'> = {
rotationExtremumGetter,
radiusExtremumGetter,
getSeriesWithDefaultValues,
// getItemAtPosition,
getItemAtPosition,
keyboardFocusHandler,
identifierSerializer: identifierSerializerSeriesIdDataIndex,
identifierCleaner: identifierCleanerSeriesIdDataIndex,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
type StackingGroupsType,
type ChartsRotationAxisProps,
type ChartsRadiusAxisProps,
type ChartsRadialAxisProps,
} from '@mui/x-charts/internals';
import { type SeriesId } from '@mui/x-charts/models';

Expand Down Expand Up @@ -91,7 +92,7 @@ function processRadialBarDataForPlot(

const baseAxisConfig = (
verticalLayout ? rotationAxisConfig : radiusAxisConfig
) as ComputedAxis<'band'>;
) as ComputedAxis<'band', any, ChartsRadialAxisProps>;
const valueAxisConfig = verticalLayout ? radiusAxisConfig : rotationAxisConfig;

const reverse = valueAxisConfig.reverse ?? false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
type UseChartVisibilityManagerSignature,
type ConvertSignaturesIntoPlugins,
} from '@mui/x-charts/internals';
import { useChartProExport, type UseChartProExportSignature } from '../plugins';
import { useChartProExport, type UseChartProExportSignature } from '@mui/x-charts-pro/plugins';

export type RadialLineChartPluginSignatures = [
UseChartZAxisSignature,
Expand Down
1 change: 1 addition & 0 deletions packages/x-charts/src/internals/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export * from './clampAngle';
export * from './getLabel';
export * from './legendUtils';
export * from './getChartPoint';
export * from './plugins/featurePlugins/useChartPolarAxis/coordinateTransformation';
export * from './isDefined';
export * from './getScale';
export * from './getAsNumber';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import {
type AxisConfig,
type ChartsXAxisProps,
type ChartsYAxisProps,
type ScaleName,
} from '../../../../models';
import { type AxisId } from '../../../../models/axis';
import type { AxisConfig, ScaleName } from '../../../../models';
import type { AxisId, ChartsCartesianAxisProps } from '../../../../models/axis';
import { defaultizeZoom } from './defaultizeZoom';
import { type DefaultizedZoomOptions } from './useChartCartesianAxis.types';

export const createZoomLookup =
(axisDirection: 'x' | 'y') =>
(axes: AxisConfig<ScaleName, any, ChartsXAxisProps | ChartsYAxisProps>[] = []) =>
(axes: AxisConfig<ScaleName, any, ChartsCartesianAxisProps>[] = []) =>
axes.reduce<Record<AxisId, DefaultizedZoomOptions>>((acc, v) => {
// @ts-ignore
const { zoom, id: axisId, reverse } = v;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export * from './useChartCartesianAxisLayout.selectors';
export * from './useChartCartesianInteraction.selectors';
export * from './useChartCartesianHighlight.selectors';
export * from './useChartCartesianAxisPreview.selectors';
export { getBandIndex } from './useChartCartesianAxisPosition.selectors';
export * from './useChartAxisAutoSize.selectors';
export * from './useChartCartesianTooltip.selectors';
export { defaultizeXAxis, defaultizeYAxis } from './defaultizeAxis';
Expand Down
Loading
Loading