@mui/x-charts 9.2.0 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/BarChart/BarChart.js +10 -10
  2. package/BarChart/BarChart.mjs +10 -10
  3. package/BarChart/seriesConfig/bar/getColor.js +7 -53
  4. package/BarChart/seriesConfig/bar/getColor.mjs +7 -53
  5. package/BarChart/seriesConfig/bar/seriesProcessor.js +3 -1
  6. package/BarChart/seriesConfig/bar/seriesProcessor.mjs +3 -1
  7. package/BarChart/seriesConfig/bar/tooltip.js +4 -27
  8. package/BarChart/seriesConfig/bar/tooltip.mjs +4 -27
  9. package/CHANGELOG.md +118 -0
  10. package/ChartsContainer/ChartsContainer.js +9 -9
  11. package/ChartsContainer/ChartsContainer.mjs +9 -9
  12. package/ChartsLabel/ChartsLabelMark.js +0 -2
  13. package/ChartsLabel/ChartsLabelMark.mjs +0 -2
  14. package/ChartsLabel/labelMarkClasses.d.mts +0 -1
  15. package/ChartsLabel/labelMarkClasses.d.ts +0 -1
  16. package/ChartsLabel/labelMarkClasses.js +1 -2
  17. package/ChartsLabel/labelMarkClasses.mjs +2 -2
  18. package/ChartsLayerContainer/ChartsLayerContainer.js +36 -30
  19. package/ChartsLayerContainer/ChartsLayerContainer.mjs +36 -30
  20. package/ChartsXAxis/ChartsXAxis.js +3 -1
  21. package/ChartsXAxis/ChartsXAxis.mjs +3 -1
  22. package/ChartsYAxis/ChartsYAxis.js +3 -1
  23. package/ChartsYAxis/ChartsYAxis.mjs +3 -1
  24. package/LineChart/LineChart.js +6 -6
  25. package/LineChart/LineChart.mjs +6 -6
  26. package/LineChart/seriesConfig/curveEvaluation.js +12 -1
  27. package/LineChart/seriesConfig/curveEvaluation.mjs +12 -1
  28. package/LineChart/seriesConfig/getColor.js +7 -54
  29. package/LineChart/seriesConfig/getColor.mjs +7 -54
  30. package/LineChart/seriesConfig/seriesProcessor.d.mts +2 -4
  31. package/LineChart/seriesConfig/seriesProcessor.d.ts +2 -4
  32. package/LineChart/seriesConfig/seriesProcessor.js +2 -139
  33. package/LineChart/seriesConfig/seriesProcessor.mjs +2 -138
  34. package/LineChart/seriesConfig/tooltip.js +4 -25
  35. package/LineChart/seriesConfig/tooltip.mjs +4 -25
  36. package/PieChart/PieChart.js +6 -6
  37. package/PieChart/PieChart.mjs +6 -6
  38. package/RadarChart/RadarAxis/useRadarAxis.js +1 -1
  39. package/RadarChart/RadarAxis/useRadarAxis.mjs +1 -1
  40. package/RadarChart/RadarChart.js +8 -8
  41. package/RadarChart/RadarChart.mjs +8 -8
  42. package/RadarChart/RadarSeriesPlot/RadarSeriesArea.js +3 -1
  43. package/RadarChart/RadarSeriesPlot/RadarSeriesArea.mjs +3 -1
  44. package/RadarChart/RadarSeriesPlot/RadarSeriesMarks.js +1 -0
  45. package/RadarChart/RadarSeriesPlot/RadarSeriesMarks.mjs +1 -0
  46. package/RadarChart/RadarSeriesPlot/RadarSeriesPlot.js +1 -0
  47. package/RadarChart/RadarSeriesPlot/RadarSeriesPlot.mjs +1 -0
  48. package/ScatterChart/ScatterChart.js +11 -11
  49. package/ScatterChart/ScatterChart.mjs +11 -11
  50. package/ScatterChart/seriesConfig/tooltip.js +2 -24
  51. package/ScatterChart/seriesConfig/tooltip.mjs +2 -24
  52. package/SparkLineChart/SparkLineChart.js +27 -27
  53. package/SparkLineChart/SparkLineChart.mjs +27 -27
  54. package/index.js +1 -1
  55. package/index.mjs +1 -1
  56. package/internals/components/ChartsAccessibilityProxy/ChartsAccessibilityProxy.js +1 -1
  57. package/internals/components/ChartsAccessibilityProxy/ChartsAccessibilityProxy.mjs +1 -1
  58. package/internals/getLineLikeTooltip.d.mts +9 -0
  59. package/internals/getLineLikeTooltip.d.ts +9 -0
  60. package/internals/getLineLikeTooltip.js +38 -0
  61. package/internals/getLineLikeTooltip.mjs +31 -0
  62. package/internals/index.d.mts +3 -0
  63. package/internals/index.d.ts +3 -0
  64. package/internals/index.js +24 -0
  65. package/internals/index.mjs +3 -0
  66. package/internals/plugins/corePlugins/useChartSeriesConfig/types/tooltipGetter.types.d.mts +4 -2
  67. package/internals/plugins/corePlugins/useChartSeriesConfig/types/tooltipGetter.types.d.ts +4 -2
  68. package/internals/plugins/featurePlugins/useChartHighlight/useChartHighlight.js +3 -0
  69. package/internals/plugins/featurePlugins/useChartHighlight/useChartHighlight.mjs +3 -0
  70. package/internals/processLineLikeSeries.d.mts +6 -0
  71. package/internals/processLineLikeSeries.d.ts +6 -0
  72. package/internals/processLineLikeSeries.js +145 -0
  73. package/internals/processLineLikeSeries.mjs +138 -0
  74. package/internals/resolveColorProcessor.d.mts +11 -0
  75. package/internals/resolveColorProcessor.d.ts +11 -0
  76. package/internals/resolveColorProcessor.js +62 -0
  77. package/internals/resolveColorProcessor.mjs +56 -0
  78. package/package.json +3 -3
@@ -172,11 +172,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
172
172
  hiddenItems: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.shape({
173
173
  dataIndex: _propTypes.default.number,
174
174
  seriesId: _propTypes.default.string.isRequired,
175
- type: _propTypes.default.oneOf(['bar'])
175
+ type: _propTypes.default.oneOf(['bar']).isRequired
176
176
  }), _propTypes.default.shape({
177
177
  dataIndex: _propTypes.default.number,
178
178
  seriesId: _propTypes.default.string.isRequired,
179
- type: _propTypes.default.oneOf(['bar']).isRequired
179
+ type: _propTypes.default.oneOf(['bar'])
180
180
  })]).isRequired),
181
181
  /**
182
182
  * If `true`, the legend is not rendered.
@@ -196,11 +196,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
196
196
  */
197
197
  highlightedItem: _propTypes.default.oneOfType([_propTypes.default.shape({
198
198
  dataIndex: _propTypes.default.number,
199
- seriesId: _propTypes.default.string.isRequired,
200
- type: _propTypes.default.oneOf(['bar']).isRequired
199
+ seriesId: _propTypes.default.string.isRequired
201
200
  }), _propTypes.default.shape({
202
201
  dataIndex: _propTypes.default.number,
203
- seriesId: _propTypes.default.string.isRequired
202
+ seriesId: _propTypes.default.string.isRequired,
203
+ type: _propTypes.default.oneOf(['bar']).isRequired
204
204
  })]),
205
205
  /**
206
206
  * This prop is used to help implement the accessibility logic.
@@ -231,11 +231,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
231
231
  initialHiddenItems: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.shape({
232
232
  dataIndex: _propTypes.default.number,
233
233
  seriesId: _propTypes.default.string.isRequired,
234
- type: _propTypes.default.oneOf(['bar'])
234
+ type: _propTypes.default.oneOf(['bar']).isRequired
235
235
  }), _propTypes.default.shape({
236
236
  dataIndex: _propTypes.default.number,
237
237
  seriesId: _propTypes.default.string.isRequired,
238
- type: _propTypes.default.oneOf(['bar']).isRequired
238
+ type: _propTypes.default.oneOf(['bar'])
239
239
  })]).isRequired),
240
240
  /**
241
241
  * The direction of the bar elements.
@@ -365,11 +365,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
365
365
  */
366
366
  tooltipItem: _propTypes.default.oneOfType([_propTypes.default.shape({
367
367
  dataIndex: _propTypes.default.number.isRequired,
368
- seriesId: _propTypes.default.string.isRequired,
369
- type: _propTypes.default.oneOf(['bar']).isRequired
368
+ seriesId: _propTypes.default.string.isRequired
370
369
  }), _propTypes.default.shape({
371
370
  dataIndex: _propTypes.default.number.isRequired,
372
- seriesId: _propTypes.default.string.isRequired
371
+ seriesId: _propTypes.default.string.isRequired,
372
+ type: _propTypes.default.oneOf(['bar']).isRequired
373
373
  })]),
374
374
  /**
375
375
  * The width of the chart in px. If not defined, it takes the width of the parent element.
@@ -165,11 +165,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
165
165
  hiddenItems: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.shape({
166
166
  dataIndex: PropTypes.number,
167
167
  seriesId: PropTypes.string.isRequired,
168
- type: PropTypes.oneOf(['bar'])
168
+ type: PropTypes.oneOf(['bar']).isRequired
169
169
  }), PropTypes.shape({
170
170
  dataIndex: PropTypes.number,
171
171
  seriesId: PropTypes.string.isRequired,
172
- type: PropTypes.oneOf(['bar']).isRequired
172
+ type: PropTypes.oneOf(['bar'])
173
173
  })]).isRequired),
174
174
  /**
175
175
  * If `true`, the legend is not rendered.
@@ -189,11 +189,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
189
189
  */
190
190
  highlightedItem: PropTypes.oneOfType([PropTypes.shape({
191
191
  dataIndex: PropTypes.number,
192
- seriesId: PropTypes.string.isRequired,
193
- type: PropTypes.oneOf(['bar']).isRequired
192
+ seriesId: PropTypes.string.isRequired
194
193
  }), PropTypes.shape({
195
194
  dataIndex: PropTypes.number,
196
- seriesId: PropTypes.string.isRequired
195
+ seriesId: PropTypes.string.isRequired,
196
+ type: PropTypes.oneOf(['bar']).isRequired
197
197
  })]),
198
198
  /**
199
199
  * This prop is used to help implement the accessibility logic.
@@ -224,11 +224,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
224
224
  initialHiddenItems: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.shape({
225
225
  dataIndex: PropTypes.number,
226
226
  seriesId: PropTypes.string.isRequired,
227
- type: PropTypes.oneOf(['bar'])
227
+ type: PropTypes.oneOf(['bar']).isRequired
228
228
  }), PropTypes.shape({
229
229
  dataIndex: PropTypes.number,
230
230
  seriesId: PropTypes.string.isRequired,
231
- type: PropTypes.oneOf(['bar']).isRequired
231
+ type: PropTypes.oneOf(['bar'])
232
232
  })]).isRequired),
233
233
  /**
234
234
  * The direction of the bar elements.
@@ -358,11 +358,11 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
358
358
  */
359
359
  tooltipItem: PropTypes.oneOfType([PropTypes.shape({
360
360
  dataIndex: PropTypes.number.isRequired,
361
- seriesId: PropTypes.string.isRequired,
362
- type: PropTypes.oneOf(['bar']).isRequired
361
+ seriesId: PropTypes.string.isRequired
363
362
  }), PropTypes.shape({
364
363
  dataIndex: PropTypes.number.isRequired,
365
- seriesId: PropTypes.string.isRequired
364
+ seriesId: PropTypes.string.isRequired,
365
+ type: PropTypes.oneOf(['bar']).isRequired
366
366
  })]),
367
367
  /**
368
368
  * The width of the chart in px. If not defined, it takes the width of the parent element.
@@ -4,60 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _getSeriesColorFn = require("../../../internals/getSeriesColorFn");
7
+ var _resolveColorProcessor = require("../../../internals/resolveColorProcessor");
8
8
  const getColor = (series, xAxis, yAxis) => {
9
9
  const verticalLayout = series.layout === 'vertical';
10
- const bandColorScale = verticalLayout ? xAxis?.colorScale : yAxis?.colorScale;
11
- const valueColorScale = verticalLayout ? yAxis?.colorScale : xAxis?.colorScale;
12
- const bandValues = verticalLayout ? xAxis?.data : yAxis?.data;
13
- const getSeriesColor = (0, _getSeriesColorFn.getSeriesColorFn)(series);
14
- if (valueColorScale) {
15
- return dataIndex => {
16
- if (dataIndex === undefined) {
17
- return series.color;
18
- }
19
- const value = series.data[dataIndex];
20
- const color = value === null ? getSeriesColor({
21
- value,
22
- dataIndex
23
- }) : valueColorScale(value);
24
- if (color === null) {
25
- return getSeriesColor({
26
- value,
27
- dataIndex
28
- });
29
- }
30
- return color;
31
- };
32
- }
33
- if (bandColorScale && bandValues) {
34
- return dataIndex => {
35
- if (dataIndex === undefined) {
36
- return series.color;
37
- }
38
- const value = bandValues[dataIndex];
39
- const color = value === null ? getSeriesColor({
40
- value,
41
- dataIndex
42
- }) : bandColorScale(value);
43
- if (color === null) {
44
- return getSeriesColor({
45
- value,
46
- dataIndex
47
- });
48
- }
49
- return color;
50
- };
51
- }
52
- return dataIndex => {
53
- if (dataIndex === undefined) {
54
- return series.color;
55
- }
56
- const value = series.data[dataIndex];
57
- return getSeriesColor({
58
- value,
59
- dataIndex
60
- });
61
- };
10
+ return (0, _resolveColorProcessor.resolveColorProcessor)({
11
+ series,
12
+ valueColorScale: verticalLayout ? yAxis?.colorScale : xAxis?.colorScale,
13
+ categoryColorScale: verticalLayout ? xAxis?.colorScale : yAxis?.colorScale,
14
+ categoryValues: verticalLayout ? xAxis?.data : yAxis?.data
15
+ });
62
16
  };
63
17
  var _default = exports.default = getColor;
@@ -1,57 +1,11 @@
1
- import { getSeriesColorFn } from "../../../internals/getSeriesColorFn.mjs";
1
+ import { resolveColorProcessor } from "../../../internals/resolveColorProcessor.mjs";
2
2
  const getColor = (series, xAxis, yAxis) => {
3
3
  const verticalLayout = series.layout === 'vertical';
4
- const bandColorScale = verticalLayout ? xAxis?.colorScale : yAxis?.colorScale;
5
- const valueColorScale = verticalLayout ? yAxis?.colorScale : xAxis?.colorScale;
6
- const bandValues = verticalLayout ? xAxis?.data : yAxis?.data;
7
- const getSeriesColor = getSeriesColorFn(series);
8
- if (valueColorScale) {
9
- return dataIndex => {
10
- if (dataIndex === undefined) {
11
- return series.color;
12
- }
13
- const value = series.data[dataIndex];
14
- const color = value === null ? getSeriesColor({
15
- value,
16
- dataIndex
17
- }) : valueColorScale(value);
18
- if (color === null) {
19
- return getSeriesColor({
20
- value,
21
- dataIndex
22
- });
23
- }
24
- return color;
25
- };
26
- }
27
- if (bandColorScale && bandValues) {
28
- return dataIndex => {
29
- if (dataIndex === undefined) {
30
- return series.color;
31
- }
32
- const value = bandValues[dataIndex];
33
- const color = value === null ? getSeriesColor({
34
- value,
35
- dataIndex
36
- }) : bandColorScale(value);
37
- if (color === null) {
38
- return getSeriesColor({
39
- value,
40
- dataIndex
41
- });
42
- }
43
- return color;
44
- };
45
- }
46
- return dataIndex => {
47
- if (dataIndex === undefined) {
48
- return series.color;
49
- }
50
- const value = series.data[dataIndex];
51
- return getSeriesColor({
52
- value,
53
- dataIndex
54
- });
55
- };
4
+ return resolveColorProcessor({
5
+ series,
6
+ valueColorScale: verticalLayout ? yAxis?.colorScale : xAxis?.colorScale,
7
+ categoryColorScale: verticalLayout ? xAxis?.colorScale : yAxis?.colorScale,
8
+ categoryValues: verticalLayout ? xAxis?.data : yAxis?.data
9
+ });
56
10
  };
57
11
  export default getColor;
@@ -44,7 +44,9 @@ const seriesProcessor = (params, dataset, isItemVisible) => {
44
44
  d3Dataset[index][id] = value;
45
45
  }
46
46
  });
47
- } else if (dataset === undefined) {
47
+ } else if (dataset === undefined && process.env.NODE_ENV !== 'production') {
48
+ // TODO: fix mui/no-guarded-throw
49
+ // eslint-disable-next-line mui/no-guarded-throw
48
50
  throw new Error(process.env.NODE_ENV !== "production" ? `MUI X Charts: Bar series with id="${id}" has no data. ` + 'The chart cannot render this series without data. ' + 'Provide a data property to the series or use the dataset prop.' : (0, _formatErrorMessage2.default)(33, id));
49
51
  }
50
52
  if (process.env.NODE_ENV !== 'production') {
@@ -37,7 +37,9 @@ const seriesProcessor = (params, dataset, isItemVisible) => {
37
37
  d3Dataset[index][id] = value;
38
38
  }
39
39
  });
40
- } else if (dataset === undefined) {
40
+ } else if (dataset === undefined && process.env.NODE_ENV !== 'production') {
41
+ // TODO: fix mui/no-guarded-throw
42
+ // eslint-disable-next-line mui/no-guarded-throw
41
43
  throw new Error(process.env.NODE_ENV !== "production" ? `MUI X Charts: Bar series with id="${id}" has no data. ` + 'The chart cannot render this series without data. ' + 'Provide a data property to the series or use the dataset prop.' : _formatErrorMessage(33, id));
42
44
  }
43
45
  if (process.env.NODE_ENV !== 'production') {
@@ -4,33 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.axisTooltipGetter = void 0;
7
- var _getLabel = require("../../../internals/getLabel");
8
- const tooltipGetter = params => {
9
- const {
10
- series,
11
- getColor,
12
- identifier
13
- } = params;
14
- if (!identifier || identifier.dataIndex === undefined) {
15
- return null;
16
- }
17
- const label = (0, _getLabel.getLabel)(series.label, 'tooltip');
18
- const value = series.data[identifier.dataIndex];
19
- if (value == null) {
20
- return null;
21
- }
22
- const formattedValue = series.valueFormatter(value, {
23
- dataIndex: identifier.dataIndex
24
- });
25
- return {
26
- identifier,
27
- color: getColor(identifier.dataIndex),
28
- label,
29
- value,
30
- formattedValue,
31
- markType: series.labelMarkType
32
- };
33
- };
7
+ var _getLineLikeTooltip = require("../../../internals/getLineLikeTooltip");
8
+ const tooltipGetter = params => (0, _getLineLikeTooltip.getLineLikeTooltip)(params, {
9
+ skipNullValues: true
10
+ });
34
11
  const axisTooltipGetter = series => {
35
12
  return Object.values(series).map(s => s.layout === 'horizontal' ? {
36
13
  direction: 'y',
@@ -1,30 +1,7 @@
1
- import { getLabel } from "../../../internals/getLabel.mjs";
2
- const tooltipGetter = params => {
3
- const {
4
- series,
5
- getColor,
6
- identifier
7
- } = params;
8
- if (!identifier || identifier.dataIndex === undefined) {
9
- return null;
10
- }
11
- const label = getLabel(series.label, 'tooltip');
12
- const value = series.data[identifier.dataIndex];
13
- if (value == null) {
14
- return null;
15
- }
16
- const formattedValue = series.valueFormatter(value, {
17
- dataIndex: identifier.dataIndex
18
- });
19
- return {
20
- identifier,
21
- color: getColor(identifier.dataIndex),
22
- label,
23
- value,
24
- formattedValue,
25
- markType: series.labelMarkType
26
- };
27
- };
1
+ import { getLineLikeTooltip } from "../../../internals/getLineLikeTooltip.mjs";
2
+ const tooltipGetter = params => getLineLikeTooltip(params, {
3
+ skipNullValues: true
4
+ });
28
5
  export const axisTooltipGetter = series => {
29
6
  return Object.values(series).map(s => s.layout === 'horizontal' ? {
30
7
  direction: 'y',
package/CHANGELOG.md CHANGED
@@ -1,5 +1,123 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.3.0
4
+
5
+ _May 21, 2026_
6
+
7
+ We'd like to extend a big thank you to the 16 contributors who made this release possible. Here are some highlights ✨:
8
+
9
+ - 📆 Refactor Calendar Range drag editing to use Pointer Events instead of drag and touch events combination (#22279)
10
+ - ✨ Apply lazy loading to `EventTimelinePremium` (#22308)
11
+ - 🐞 Bugfixes
12
+ - 📚 Documentation improvements
13
+ - 🌎 Added Norwegian bokmål (nb-NO) locale to the Scheduler
14
+ - 🌎 Improved Swedish (sv-SE) locale on the Data Grid
15
+
16
+ Special thanks go out to these community members for their valuable contributions:
17
+ @Anexus5919, @jvskriubakken, @oscar-b, @rin, @viktormelin
18
+
19
+ The following team members contributed to this release:
20
+ @aemartos, @alexfauquette, @arminmeh, @Janpot, @JCQuintas, @LukasTy, @mj12albert, @oliviertassinari, @rita-codes, @romgrk, @sai6855
21
+
22
+ ### Data Grid
23
+
24
+ #### `@mui/x-data-grid@9.3.0`
25
+
26
+ - [DataGrid] Fix scrollbar disappearing after multiple resizes (#22512) @LukasTy
27
+ - [DataGrid] Revert "Add support for pinned columns in `GridVirtualScroller`" (#22467) @oliviertassinari
28
+ - [l10n] Improve Swedish (svSE) locale (#21851) @viktormelin
29
+
30
+ #### `@mui/x-data-grid-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
31
+
32
+ Same changes as in `@mui/x-data-grid@9.3.0`.
33
+
34
+ #### `@mui/x-data-grid-premium@9.3.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
35
+
36
+ Same changes as in `@mui/x-data-grid-pro@9.3.0`.
37
+
38
+ ### Date and Time Pickers
39
+
40
+ #### `@mui/x-date-pickers@9.3.0`
41
+
42
+ - [pickers] Fix disabled state styling for `PickersTextField` standard and filled variants (#22189) @LukasTy
43
+ - [pickers] Fix previous month disabled state calculation (#22524) @mj12albert
44
+ - [pickers] Merge `slotProps.sectionContent` in `PickersInputBase` (#22324) @rin
45
+
46
+ #### `@mui/x-date-pickers-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
47
+
48
+ Same changes as in `@mui/x-date-pickers@9.3.0`, plus:
49
+
50
+ - [DateRangeCalendar] Use Pointer Events for drag editing (#22279) @LukasTy
51
+
52
+ ### Charts
53
+
54
+ #### `@mui/x-charts@9.3.0`
55
+
56
+ - [charts] Add `data-series` to elements of radar chart (#22523) @alexfauquette
57
+ - [charts] Add environment check for warning messages in axis and radar hooks (#22506) @sai6855
58
+ - [charts] Chart `seriesConfig` deduplication for lines and bars (#22257) @sai6855
59
+ - [charts] Fix highlighted item crash (#22539) @oscar-b
60
+ - [charts] Fix the line and mark class (#22526) @alexfauquette
61
+ - [charts] Fix use of deprecated API in docs (#22469) @oliviertassinari
62
+ - [charts] Improve performance of `evaluateCurveY` function (#22407) @sai6855
63
+
64
+ #### `@mui/x-charts-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
65
+
66
+ Same changes as in `@mui/x-charts@9.3.0`.
67
+
68
+ #### `@mui/x-charts-premium@9.3.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
69
+
70
+ Same changes as in `@mui/x-charts-pro@9.3.0`, plus:
71
+
72
+ - [charts-premium] Add `closePath` option to the radial line series (#22517) @alexfauquette
73
+
74
+ ### Tree View
75
+
76
+ #### `@mui/x-tree-view-pro@9.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
77
+
78
+ Internal changes.
79
+
80
+ ### Scheduler
81
+
82
+ #### `@mui/x-scheduler@9.0.0-alpha.7`
83
+
84
+ - [I10n] Add Norwegian bokmål (nb-NO) locale (#22415) @jvskriubakken
85
+
86
+ #### `@mui/x-scheduler-premium@9.0.0-alpha.7` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
87
+
88
+ Same changes as in `@mui/x-scheduler@9.0.0-alpha.7`, plus:
89
+
90
+ - [scheduler] Apply lazy loading to `EventTimelinePremium` (#22308) @rita-codes
91
+ - [scheduler] Deduplicate staged ranges within the debounce window (#22476) @Anexus5919
92
+ - [scheduler] Pass full event objects to `dataSource.updateEvents` (#22462) @rita-codes
93
+
94
+ ### Docs
95
+
96
+ - [docs] Automatically update supported versions (#21850) @arminmeh
97
+ - [docs] Fix `New` label on bar charts docs (#22473) @oliviertassinari
98
+ - [docs] Improve premium page header for charts (#22474) @oliviertassinari
99
+ - [docs] Sync `README` with licensing/licensing.md in scheduler (#22468) @oliviertassinari
100
+
101
+ ### Core
102
+
103
+ - [code-infra] Cover docs overview composites with Argos (#22283) @LukasTy
104
+ - [code-infra] Enable `mui/no-presentation-role` lint rule (#22360) @Janpot
105
+ - [code-infra] Make generated `propTypes` union order deterministic (#22521) @JCQuintas
106
+ - [code-infra] Make screenshots stable across different ordering of the tests (#22449) @Janpot
107
+ - [code-infra] Optimize visual regression testing (#22447) @Janpot
108
+ - [code-infra] Replace markdownlint with remark from code-infra (#22255) @Janpot
109
+
110
+ ### Miscellaneous
111
+
112
+ - [virtualizer] Improve `controlled` mode performance (#22123) @romgrk
113
+ - [data-grid-generator] Include `tree-data` params in `useDemoData` cache key (#22456) @Janpot
114
+ - [test] Fix flaky browser tests and optimize (#22431) @Janpot
115
+ - [test] Speed up `test_types` job (#22442) @Janpot
116
+ - [test] Trim ffmpeg install in `test_regressions` (#22459) @Janpot
117
+ - [test] Add WebGL performance benchmarks for charts (#22471) @JCQuintas
118
+ - [test] Expand chart performance benchmarks for charts (#22472) @JCQuintas
119
+ - [x-license] use workspace dep for v9 in cross-major compat tests (#22504) @aemartos
120
+
3
121
  ## 9.2.0
4
122
 
5
123
  _May 13, 2026_
@@ -136,11 +136,11 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
136
136
  hiddenItems: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.shape({
137
137
  dataIndex: _propTypes.default.number,
138
138
  seriesId: _propTypes.default.string.isRequired,
139
- type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
139
+ type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
140
140
  }), _propTypes.default.shape({
141
141
  dataIndex: _propTypes.default.number,
142
142
  seriesId: _propTypes.default.string.isRequired,
143
- type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
143
+ type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
144
144
  })]).isRequired),
145
145
  /**
146
146
  * The controlled axis highlight.
@@ -197,11 +197,11 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
197
197
  initialHiddenItems: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.shape({
198
198
  dataIndex: _propTypes.default.number,
199
199
  seriesId: _propTypes.default.string.isRequired,
200
- type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
200
+ type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
201
201
  }), _propTypes.default.shape({
202
202
  dataIndex: _propTypes.default.number,
203
203
  seriesId: _propTypes.default.string.isRequired,
204
- type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
204
+ type: _propTypes.default.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
205
205
  })]).isRequired),
206
206
  /**
207
207
  * Localized text for chart components.
@@ -345,11 +345,6 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
345
345
  */
346
346
  zAxis: _propTypes.default.arrayOf(_propTypes.default.shape({
347
347
  colorMap: _propTypes.default.oneOfType([_propTypes.default.shape({
348
- colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
349
- type: _propTypes.default.oneOf(['ordinal']).isRequired,
350
- unknownColor: _propTypes.default.string,
351
- values: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number, _propTypes.default.string]).isRequired)
352
- }), _propTypes.default.shape({
353
348
  color: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.string.isRequired), _propTypes.default.func]).isRequired,
354
349
  max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
355
350
  min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
@@ -358,6 +353,11 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
358
353
  colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
359
354
  thresholds: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]).isRequired).isRequired,
360
355
  type: _propTypes.default.oneOf(['piecewise']).isRequired
356
+ }), _propTypes.default.shape({
357
+ colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
358
+ type: _propTypes.default.oneOf(['ordinal']).isRequired,
359
+ unknownColor: _propTypes.default.string,
360
+ values: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number, _propTypes.default.string]).isRequired)
361
361
  })]),
362
362
  data: _propTypes.default.array,
363
363
  dataKey: _propTypes.default.string,
@@ -129,11 +129,11 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
129
129
  hiddenItems: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.shape({
130
130
  dataIndex: PropTypes.number,
131
131
  seriesId: PropTypes.string.isRequired,
132
- type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
132
+ type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
133
133
  }), PropTypes.shape({
134
134
  dataIndex: PropTypes.number,
135
135
  seriesId: PropTypes.string.isRequired,
136
- type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
136
+ type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
137
137
  })]).isRequired),
138
138
  /**
139
139
  * The controlled axis highlight.
@@ -190,11 +190,11 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
190
190
  initialHiddenItems: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.shape({
191
191
  dataIndex: PropTypes.number,
192
192
  seriesId: PropTypes.string.isRequired,
193
- type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
193
+ type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
194
194
  }), PropTypes.shape({
195
195
  dataIndex: PropTypes.number,
196
196
  seriesId: PropTypes.string.isRequired,
197
- type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter']).isRequired
197
+ type: PropTypes.oneOf(['bar', 'line', 'pie', 'radar', 'scatter'])
198
198
  })]).isRequired),
199
199
  /**
200
200
  * Localized text for chart components.
@@ -338,11 +338,6 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
338
338
  */
339
339
  zAxis: PropTypes.arrayOf(PropTypes.shape({
340
340
  colorMap: PropTypes.oneOfType([PropTypes.shape({
341
- colors: PropTypes.arrayOf(PropTypes.string).isRequired,
342
- type: PropTypes.oneOf(['ordinal']).isRequired,
343
- unknownColor: PropTypes.string,
344
- values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
345
- }), PropTypes.shape({
346
341
  color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
347
342
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
348
343
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
@@ -351,6 +346,11 @@ process.env.NODE_ENV !== "production" ? ChartsContainer.propTypes = {
351
346
  colors: PropTypes.arrayOf(PropTypes.string).isRequired,
352
347
  thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
353
348
  type: PropTypes.oneOf(['piecewise']).isRequired
349
+ }), PropTypes.shape({
350
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
351
+ type: PropTypes.oneOf(['ordinal']).isRequired,
352
+ unknownColor: PropTypes.string,
353
+ values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
354
354
  })]),
355
355
  data: PropTypes.array,
356
356
  dataKey: PropTypes.string,
@@ -37,8 +37,6 @@ const Root = (0, _styles.styled)('div', {
37
37
  alignItems: 'center'
38
38
  },
39
39
  [`&.${_labelMarkClasses.labelMarkClasses.lineAndMark}`]: {
40
- width: 16,
41
- height: 16,
42
40
  alignItems: 'center'
43
41
  },
44
42
  [`&.${_labelMarkClasses.labelMarkClasses.square}`]: {
@@ -30,8 +30,6 @@ const Root = styled('div', {
30
30
  alignItems: 'center'
31
31
  },
32
32
  [`&.${labelMarkClasses.lineAndMark}`]: {
33
- width: 16,
34
- height: 16,
35
33
  alignItems: 'center'
36
34
  },
37
35
  [`&.${labelMarkClasses.square}`]: {
@@ -13,6 +13,5 @@ export interface ChartsLabelMarkClasses {
13
13
  /** Styles applied to the element with fill={color} attribute. */
14
14
  fill: string;
15
15
  }
16
- export declare function getLabelMarkUtilityClass(slot: string): string;
17
16
  export declare const labelMarkClasses: ChartsLabelMarkClasses;
18
17
  export declare const useUtilityClasses: (props: ChartsLabelMarkProps) => Record<"root" | "fill", string>;
@@ -13,6 +13,5 @@ export interface ChartsLabelMarkClasses {
13
13
  /** Styles applied to the element with fill={color} attribute. */
14
14
  fill: string;
15
15
  }
16
- export declare function getLabelMarkUtilityClass(slot: string): string;
17
16
  export declare const labelMarkClasses: ChartsLabelMarkClasses;
18
17
  export declare const useUtilityClasses: (props: ChartsLabelMarkProps) => Record<"root" | "fill", string>;
@@ -4,7 +4,6 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getLabelMarkUtilityClass = getLabelMarkUtilityClass;
8
7
  exports.useUtilityClasses = exports.labelMarkClasses = void 0;
9
8
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
10
9
  var _generateUtilityClass = _interopRequireDefault(require("@mui/utils/generateUtilityClass"));
@@ -18,7 +17,7 @@ const useUtilityClasses = props => {
18
17
  type
19
18
  } = props;
20
19
  const slots = {
21
- root: typeof type === 'function' ? ['root'] : ['root', type],
20
+ root: typeof type === 'function' ? ['root'] : ['root', type === 'line+mark' ? 'lineAndMark' : type],
22
21
  fill: ['fill']
23
22
  };
24
23
  return (0, _composeClasses.default)(slots, getLabelMarkUtilityClass, props.classes);
@@ -1,7 +1,7 @@
1
1
  import composeClasses from '@mui/utils/composeClasses';
2
2
  import generateUtilityClass from '@mui/utils/generateUtilityClass';
3
3
  import generateUtilityClasses from '@mui/utils/generateUtilityClasses';
4
- export function getLabelMarkUtilityClass(slot) {
4
+ function getLabelMarkUtilityClass(slot) {
5
5
  return generateUtilityClass('MuiChartsLabelMark', slot);
6
6
  }
7
7
  export const labelMarkClasses = generateUtilityClasses('MuiChartsLabelMark', ['root', 'line', 'lineAndMark', 'square', 'circle', 'fill']);
@@ -10,7 +10,7 @@ export const useUtilityClasses = props => {
10
10
  type
11
11
  } = props;
12
12
  const slots = {
13
- root: typeof type === 'function' ? ['root'] : ['root', type],
13
+ root: typeof type === 'function' ? ['root'] : ['root', type === 'line+mark' ? 'lineAndMark' : type],
14
14
  fill: ['fill']
15
15
  };
16
16
  return composeClasses(slots, getLabelMarkUtilityClass, props.classes);