@mui/x-charts-premium 9.4.0 → 9.6.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 (136) hide show
  1. package/BarChartPremium/BarChartPremium.js +5 -3
  2. package/BarChartPremium/BarChartPremium.mjs +5 -3
  3. package/BarChartPremium/BarPlotPremium.js +1 -1
  4. package/BarChartPremium/BarPlotPremium.mjs +1 -1
  5. package/BarChartPremium/RangeBar/RangeBarPlot.js +2 -2
  6. package/BarChartPremium/RangeBar/RangeBarPlot.mjs +2 -2
  7. package/BarChartPremium/RangeBar/seriesConfig/getColor.js +2 -5
  8. package/BarChartPremium/RangeBar/seriesConfig/getColor.mjs +2 -5
  9. package/BarChartPremium/webgl/useWebGLBarLikePlotData.d.mts +1 -0
  10. package/BarChartPremium/webgl/useWebGLBarLikePlotData.d.ts +1 -0
  11. package/BarChartPremium/webgl/useWebGLBarLikePlotData.js +66 -7
  12. package/BarChartPremium/webgl/useWebGLBarLikePlotData.mjs +66 -7
  13. package/CHANGELOG.md +251 -0
  14. package/CandlestickChart/CandlestickChart.js +1 -1
  15. package/CandlestickChart/CandlestickChart.mjs +1 -1
  16. package/CandlestickChart/index.d.mts +11 -2
  17. package/CandlestickChart/index.d.ts +11 -2
  18. package/CandlestickChart/index.js +15 -3
  19. package/CandlestickChart/index.mjs +16 -2
  20. package/CandlestickChart/seriesConfig/getColor.js +2 -5
  21. package/CandlestickChart/seriesConfig/getColor.mjs +2 -5
  22. package/ChartsDataProviderPremium/ChartsDataProviderPremium.js +7 -3
  23. package/ChartsDataProviderPremium/ChartsDataProviderPremium.mjs +7 -3
  24. package/ChartsGeoDataProviderPremium/ChartsGeoDataProviderPremium.js +11 -3
  25. package/ChartsGeoDataProviderPremium/ChartsGeoDataProviderPremium.mjs +11 -3
  26. package/ChartsGeoDataProviderPremium/ChartsGeoDataProviderPremium.plugins.d.mts +1 -1
  27. package/ChartsGeoDataProviderPremium/ChartsGeoDataProviderPremium.plugins.d.ts +1 -1
  28. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.js +11 -3
  29. package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.mjs +11 -3
  30. package/ChartsRenderer/ChartsRenderer.js +1 -1
  31. package/ChartsRenderer/ChartsRenderer.mjs +1 -1
  32. package/HeatmapPremium/HeatmapPremium.js +5 -3
  33. package/HeatmapPremium/HeatmapPremium.mjs +5 -3
  34. package/Map/GeoDataPlot.js +1 -1
  35. package/Map/GeoDataPlot.mjs +1 -1
  36. package/Map/MapShape.d.mts +3 -0
  37. package/Map/MapShape.d.ts +3 -0
  38. package/Map/MapShape.js +10 -1
  39. package/Map/MapShape.mjs +9 -0
  40. package/Map/MapShapePlot.d.mts +5 -1
  41. package/Map/MapShapePlot.d.ts +5 -1
  42. package/Map/MapShapePlot.js +27 -3
  43. package/Map/MapShapePlot.mjs +28 -4
  44. package/Map/index.d.mts +3 -1
  45. package/Map/index.d.ts +3 -1
  46. package/Map/seriesConfig/getColor.js +4 -9
  47. package/Map/seriesConfig/getColor.mjs +4 -9
  48. package/Map/seriesConfig/index.js +2 -0
  49. package/Map/seriesConfig/index.mjs +2 -0
  50. package/Map/seriesConfig/tooltip.js +5 -1
  51. package/Map/seriesConfig/tooltip.mjs +5 -1
  52. package/Map/seriesConfig/tooltipPosition.d.mts +3 -0
  53. package/Map/seriesConfig/tooltipPosition.d.ts +3 -0
  54. package/Map/seriesConfig/tooltipPosition.js +64 -0
  55. package/Map/seriesConfig/tooltipPosition.mjs +58 -0
  56. package/RadialBarChart/RadialBarChart.d.mts +1 -1
  57. package/RadialBarChart/RadialBarChart.d.ts +1 -1
  58. package/RadialBarChart/RadialBarChart.js +3 -3
  59. package/RadialBarChart/RadialBarChart.mjs +2 -2
  60. package/RadialBarChart/RadialBarPlot.js +1 -1
  61. package/RadialBarChart/RadialBarPlot.mjs +1 -1
  62. package/RadialBarChart/index.d.mts +4 -0
  63. package/RadialBarChart/index.d.ts +4 -0
  64. package/RadialBarChart/index.js +8 -1
  65. package/RadialBarChart/index.mjs +6 -0
  66. package/RadialLineChart/RadialAreaPlot.d.mts +5 -1
  67. package/RadialLineChart/RadialAreaPlot.d.ts +5 -1
  68. package/RadialLineChart/RadialAreaPlot.js +10 -1
  69. package/RadialLineChart/RadialAreaPlot.mjs +11 -2
  70. package/RadialLineChart/RadialLineChart.d.mts +1 -1
  71. package/RadialLineChart/RadialLineChart.d.ts +1 -1
  72. package/RadialLineChart/RadialLineChart.js +5 -5
  73. package/RadialLineChart/RadialLineChart.mjs +6 -6
  74. package/RadialLineChart/RadialLineHighlightElement.d.mts +3 -0
  75. package/RadialLineChart/RadialLineHighlightElement.d.ts +3 -0
  76. package/RadialLineChart/RadialLineHighlightElement.js +10 -1
  77. package/RadialLineChart/RadialLineHighlightElement.mjs +9 -0
  78. package/RadialLineChart/RadialLineHighlightPlot.d.mts +3 -0
  79. package/RadialLineChart/RadialLineHighlightPlot.d.ts +3 -0
  80. package/RadialLineChart/RadialLineHighlightPlot.js +18 -1
  81. package/RadialLineChart/RadialLineHighlightPlot.mjs +17 -0
  82. package/RadialLineChart/RadialLinePlot.d.mts +5 -1
  83. package/RadialLineChart/RadialLinePlot.d.ts +5 -1
  84. package/RadialLineChart/RadialLinePlot.js +10 -1
  85. package/RadialLineChart/RadialLinePlot.mjs +11 -2
  86. package/RadialLineChart/RadialMarkPlot.d.mts +5 -1
  87. package/RadialLineChart/RadialMarkPlot.d.ts +5 -1
  88. package/RadialLineChart/RadialMarkPlot.js +10 -1
  89. package/RadialLineChart/RadialMarkPlot.mjs +11 -2
  90. package/RadialLineChart/index.d.mts +4 -0
  91. package/RadialLineChart/index.d.ts +4 -0
  92. package/RadialLineChart/index.js +16 -1
  93. package/RadialLineChart/index.mjs +6 -0
  94. package/ScatterChartPremium/ScatterChartPremium.js +9 -5
  95. package/ScatterChartPremium/ScatterChartPremium.mjs +10 -6
  96. package/ScatterChartPremium/ScatterChartPremium.plugins.d.mts +1 -1
  97. package/ScatterChartPremium/ScatterChartPremium.plugins.d.ts +1 -1
  98. package/ScatterChartPremium/ScatterPlotPremium.d.mts +20 -4
  99. package/ScatterChartPremium/ScatterPlotPremium.d.ts +20 -4
  100. package/ScatterChartPremium/ScatterPlotPremium.js +34 -1
  101. package/ScatterChartPremium/ScatterPlotPremium.mjs +36 -2
  102. package/ScatterChartPremium/index.d.mts +1 -1
  103. package/ScatterChartPremium/index.d.ts +1 -1
  104. package/context/ChartPremiumApi.d.mts +4 -1
  105. package/context/ChartPremiumApi.d.ts +4 -1
  106. package/hooks/useGeoData.js +1 -1
  107. package/hooks/useGeoData.mjs +2 -2
  108. package/index.d.mts +1 -1
  109. package/index.d.ts +1 -1
  110. package/index.js +8 -1
  111. package/index.mjs +2 -2
  112. package/internals/plugins/allPlugins.d.mts +5 -5
  113. package/internals/plugins/allPlugins.d.ts +5 -5
  114. package/internals/plugins/allPlugins.js +2 -2
  115. package/internals/plugins/allPlugins.mjs +3 -3
  116. package/internals/plugins/useGeoProjection/useGeoProjection.d.mts +1 -1
  117. package/internals/plugins/useGeoProjection/useGeoProjection.d.ts +1 -1
  118. package/internals/plugins/useGeoProjection/useGeoProjection.js +32 -3
  119. package/internals/plugins/useGeoProjection/useGeoProjection.mjs +32 -3
  120. package/internals/plugins/useGeoProjection/useGeoProjection.selectors.d.mts +12 -34
  121. package/internals/plugins/useGeoProjection/useGeoProjection.selectors.d.ts +12 -34
  122. package/internals/plugins/useGeoProjection/useGeoProjection.selectors.js +8 -129
  123. package/internals/plugins/useGeoProjection/useGeoProjection.selectors.mjs +8 -128
  124. package/internals/plugins/useGeoProjection/useGeoProjection.types.d.mts +2 -55
  125. package/internals/plugins/useGeoProjection/useGeoProjection.types.d.ts +2 -55
  126. package/models/seriesType/mapShape.d.mts +1 -1
  127. package/models/seriesType/mapShape.d.ts +1 -1
  128. package/models/seriesType/ohlc.d.mts +1 -1
  129. package/models/seriesType/ohlc.d.ts +1 -1
  130. package/models/seriesType/radialBar.d.mts +1 -1
  131. package/models/seriesType/radialBar.d.ts +1 -1
  132. package/models/seriesType/radialLine.d.mts +1 -1
  133. package/models/seriesType/radialLine.d.ts +1 -1
  134. package/models/seriesType/rangeBar.d.mts +1 -1
  135. package/models/seriesType/rangeBar.d.ts +1 -1
  136. package/package.json +9 -6
@@ -107,7 +107,7 @@ const BarChartPremium = exports.BarChartPremium = /*#__PURE__*/React.forwardRef(
107
107
  }));
108
108
  });
109
109
  if (process.env.NODE_ENV !== "production") BarChartPremium.displayName = "BarChartPremium";
110
- process.env.NODE_ENV !== "production" ? BarChartPremium.propTypes = {
110
+ process.env.NODE_ENV !== "production" ? BarChartPremium.propTypes /* remove-proptypes */ = {
111
111
  // ----------------------------- Warning --------------------------------
112
112
  // | These PropTypes are generated from the TypeScript type definitions |
113
113
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -458,11 +458,13 @@ process.env.NODE_ENV !== "production" ? BarChartPremium.propTypes = {
458
458
  color: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.string.isRequired), _propTypes.default.func]).isRequired,
459
459
  max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
460
460
  min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
461
- type: _propTypes.default.oneOf(['continuous']).isRequired
461
+ type: _propTypes.default.oneOf(['continuous']).isRequired,
462
+ unknownColor: _propTypes.default.string
462
463
  }), _propTypes.default.shape({
463
464
  colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
464
465
  thresholds: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]).isRequired).isRequired,
465
- type: _propTypes.default.oneOf(['piecewise']).isRequired
466
+ type: _propTypes.default.oneOf(['piecewise']).isRequired,
467
+ unknownColor: _propTypes.default.string
466
468
  }), _propTypes.default.shape({
467
469
  colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
468
470
  type: _propTypes.default.oneOf(['ordinal']).isRequired,
@@ -100,7 +100,7 @@ const BarChartPremium = /*#__PURE__*/React.forwardRef(function BarChartPremium(i
100
100
  }));
101
101
  });
102
102
  if (process.env.NODE_ENV !== "production") BarChartPremium.displayName = "BarChartPremium";
103
- process.env.NODE_ENV !== "production" ? BarChartPremium.propTypes = {
103
+ process.env.NODE_ENV !== "production" ? BarChartPremium.propTypes /* remove-proptypes */ = {
104
104
  // ----------------------------- Warning --------------------------------
105
105
  // | These PropTypes are generated from the TypeScript type definitions |
106
106
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -451,11 +451,13 @@ process.env.NODE_ENV !== "production" ? BarChartPremium.propTypes = {
451
451
  color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
452
452
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
453
453
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
454
- type: PropTypes.oneOf(['continuous']).isRequired
454
+ type: PropTypes.oneOf(['continuous']).isRequired,
455
+ unknownColor: PropTypes.string
455
456
  }), PropTypes.shape({
456
457
  colors: PropTypes.arrayOf(PropTypes.string).isRequired,
457
458
  thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
458
- type: PropTypes.oneOf(['piecewise']).isRequired
459
+ type: PropTypes.oneOf(['piecewise']).isRequired,
460
+ unknownColor: PropTypes.string
459
461
  }), PropTypes.shape({
460
462
  colors: PropTypes.arrayOf(PropTypes.string).isRequired,
461
463
  type: PropTypes.oneOf(['ordinal']).isRequired,
@@ -31,7 +31,7 @@ function BarPlotPremium(_ref) {
31
31
  borderRadius: borderRadius
32
32
  }, other));
33
33
  }
34
- process.env.NODE_ENV !== "production" ? BarPlotPremium.propTypes = {
34
+ process.env.NODE_ENV !== "production" ? BarPlotPremium.propTypes /* remove-proptypes */ = {
35
35
  // ----------------------------- Warning --------------------------------
36
36
  // | These PropTypes are generated from the TypeScript type definitions |
37
37
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -24,7 +24,7 @@ function BarPlotPremium(_ref) {
24
24
  borderRadius: borderRadius
25
25
  }, other));
26
26
  }
27
- process.env.NODE_ENV !== "production" ? BarPlotPremium.propTypes = {
27
+ process.env.NODE_ENV !== "production" ? BarPlotPremium.propTypes /* remove-proptypes */ = {
28
28
  // ----------------------------- Warning --------------------------------
29
29
  // | These PropTypes are generated from the TypeScript type definitions |
30
30
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -127,7 +127,7 @@ function RangeBarSvgPlot(props) {
127
127
  })
128
128
  });
129
129
  }
130
- process.env.NODE_ENV !== "production" ? RangeBarSvgPlot.propTypes = {
130
+ process.env.NODE_ENV !== "production" ? RangeBarSvgPlot.propTypes /* remove-proptypes */ = {
131
131
  // ----------------------------- Warning --------------------------------
132
132
  // | These PropTypes are generated from the TypeScript type definitions |
133
133
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -158,7 +158,7 @@ process.env.NODE_ENV !== "production" ? RangeBarSvgPlot.propTypes = {
158
158
  */
159
159
  slots: _propTypes.default.object
160
160
  } : void 0;
161
- process.env.NODE_ENV !== "production" ? RangeBarPlot.propTypes = {
161
+ process.env.NODE_ENV !== "production" ? RangeBarPlot.propTypes /* remove-proptypes */ = {
162
162
  // ----------------------------- Warning --------------------------------
163
163
  // | These PropTypes are generated from the TypeScript type definitions |
164
164
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -120,7 +120,7 @@ function RangeBarSvgPlot(props) {
120
120
  })
121
121
  });
122
122
  }
123
- process.env.NODE_ENV !== "production" ? RangeBarSvgPlot.propTypes = {
123
+ process.env.NODE_ENV !== "production" ? RangeBarSvgPlot.propTypes /* remove-proptypes */ = {
124
124
  // ----------------------------- Warning --------------------------------
125
125
  // | These PropTypes are generated from the TypeScript type definitions |
126
126
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -151,7 +151,7 @@ process.env.NODE_ENV !== "production" ? RangeBarSvgPlot.propTypes = {
151
151
  */
152
152
  slots: PropTypes.object
153
153
  } : void 0;
154
- process.env.NODE_ENV !== "production" ? RangeBarPlot.propTypes = {
154
+ process.env.NODE_ENV !== "production" ? RangeBarPlot.propTypes /* remove-proptypes */ = {
155
155
  // ----------------------------- Warning --------------------------------
156
156
  // | These PropTypes are generated from the TypeScript type definitions |
157
157
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -16,11 +16,8 @@ const getColor = (series, xAxis, yAxis) => {
16
16
  return series.color;
17
17
  }
18
18
  const value = bandValues[dataIndex];
19
- const color = value === null ? getSeriesColor({
20
- value,
21
- dataIndex
22
- }) : bandColorScale(value);
23
- if (color === null) {
19
+ const color = bandColorScale(value);
20
+ if (typeof color !== 'string') {
24
21
  return getSeriesColor({
25
22
  value,
26
23
  dataIndex
@@ -10,11 +10,8 @@ const getColor = (series, xAxis, yAxis) => {
10
10
  return series.color;
11
11
  }
12
12
  const value = bandValues[dataIndex];
13
- const color = value === null ? getSeriesColor({
14
- value,
15
- dataIndex
16
- }) : bandColorScale(value);
17
- if (color === null) {
13
+ const color = bandColorScale(value);
14
+ if (typeof color !== 'string') {
18
15
  return getSeriesColor({
19
16
  value,
20
17
  dataIndex
@@ -15,6 +15,7 @@ export interface WebGLBarLikeItem {
15
15
  export interface WebGLBarLikeSeries<T extends WebGLBarLikeItem> {
16
16
  seriesId: SeriesId;
17
17
  data: readonly T[];
18
+ layout?: 'vertical' | 'horizontal';
18
19
  }
19
20
  export interface WebGLBarLikePlotData {
20
21
  centers: Float32Array;
@@ -15,6 +15,7 @@ export interface WebGLBarLikeItem {
15
15
  export interface WebGLBarLikeSeries<T extends WebGLBarLikeItem> {
16
16
  seriesId: SeriesId;
17
17
  data: readonly T[];
18
+ layout?: 'vertical' | 'horizontal';
18
19
  }
19
20
  export interface WebGLBarLikePlotData {
20
21
  centers: Float32Array;
@@ -35,6 +35,12 @@ function ensureCapacity(pool, maxCount) {
35
35
  // don't need a separate per-instance attribute on the GPU side.
36
36
  const HIGHLIGHTED_BRIGHTNESS = 1.2;
37
37
  const FADED_OPACITY = 0.3;
38
+ // Gaps below this (CSS px) get filled by expanding band half-size to half the
39
+ // step, avoiding sub-pixel hairlines from the rasterizer.
40
+ const GAP_FILL_THRESHOLD_PX = 1;
41
+ // Floor to keep thin quads from falling between pixel centers and getting
42
+ // culled at extreme zoom-out.
43
+ const MIN_BAND_HALF_SIZE_PX = 0.5;
38
44
  function setCornerRadii(radius, side, fullRounded, target, offset) {
39
45
  // CSS order: top-left, top-right, bottom-right, bottom-left.
40
46
  let tl = 0;
@@ -95,16 +101,66 @@ function useWebGLBarLikePlotData(drawingArea, completedData, borderRadius, optio
95
101
  const drawingAreaLeft = drawingArea.left;
96
102
  const drawingAreaTop = drawingArea.top;
97
103
  let cursor = 0;
98
- for (let s = 0; s < completedData.length; s += 1) {
99
- const processed = completedData[s];
104
+ for (let seriesIndex = 0; seriesIndex < completedData.length; seriesIndex += 1) {
105
+ const processed = completedData[seriesIndex];
100
106
  const seriesId = processed.seriesId;
101
107
  const data = processed.data;
102
108
  const dataLength = data.length;
109
+ const bandIsY = processed.layout === 'horizontal';
110
+
111
+ // `hidden` is series-level (mirrored onto every bar by useBarPlotData);
112
+ // peek at the first bar to skip the whole series.
113
+ if (dataLength === 0 || data[0].hidden) {
114
+ continue;
115
+ }
116
+
117
+ // Probe 1 = bar size; probe 2 = center-to-center step. Track dataIndex
118
+ // so null bars between probes don't inflate the step.
119
+ let probe = null;
120
+ let probeIndex = 0;
121
+ let probe2 = null;
122
+ let probe2Index = 0;
103
123
  for (let i = 0; i < dataLength; i += 1) {
104
- const bar = data[i];
105
- if (bar.hidden) {
106
- continue;
124
+ const candidate = data[i];
125
+ if (candidate.value != null && candidate.width > 0 && candidate.height > 0) {
126
+ if (probe === null) {
127
+ probe = candidate;
128
+ probeIndex = i;
129
+ } else {
130
+ probe2 = candidate;
131
+ probe2Index = i;
132
+ break;
133
+ }
107
134
  }
135
+ }
136
+ if (probe === null) {
137
+ continue;
138
+ }
139
+
140
+ // Round to whole pixels so the rendered half-size stays stable across
141
+ // zoom steps; sub-pixel jitter causes an "accordion" effect.
142
+ const rawBarSize = bandIsY ? probe.height : probe.width;
143
+ const barSize = Math.round(rawBarSize);
144
+ let step;
145
+ if (probe2 === null) {
146
+ step = barSize;
147
+ } else {
148
+ const indexGap = probe2Index - probeIndex;
149
+ const span = bandIsY ? probe2.y - probe.y : probe2.x - probe.x;
150
+ step = span / indexGap;
151
+ }
152
+ // Use the linear lower bound of the gap (`step - rawBarSize - 0.5`)
153
+ // rather than `step - barSize`: rounding makes the discrete gap jump by
154
+ // 1px at zoom boundaries, flipping `fillGap` and causing visible
155
+ // oscillation. The lower bound is continuous in zoom.
156
+ const gapLowerBound = step - rawBarSize - 0.5;
157
+ const fillGap = gapLowerBound > 0 && gapLowerBound < GAP_FILL_THRESHOLD_PX;
158
+ let bandHalfRender = fillGap ? step * 0.5 : barSize * 0.5;
159
+ if (bandHalfRender < MIN_BAND_HALF_SIZE_PX) {
160
+ bandHalfRender = MIN_BAND_HALF_SIZE_PX;
161
+ }
162
+ for (let i = 0; i < dataLength; i += 1) {
163
+ const bar = data[i];
108
164
  const value = bar.value;
109
165
  if (value == null) {
110
166
  continue;
@@ -116,11 +172,14 @@ function useWebGLBarLikePlotData(drawingArea, completedData, borderRadius, optio
116
172
  }
117
173
  const halfW = w * 0.5;
118
174
  const halfH = h * 0.5;
175
+ // Value axis stays exact; band axis uses the per-series override.
176
+ const renderHalfW = bandIsY ? halfW : bandHalfRender;
177
+ const renderHalfH = bandIsY ? bandHalfRender : halfH;
119
178
  const c2 = cursor * 2;
120
179
  centers[c2] = bar.x + halfW - drawingAreaLeft;
121
180
  centers[c2 + 1] = bar.y + halfH - drawingAreaTop;
122
- halfSizes[c2] = halfW;
123
- halfSizes[c2 + 1] = halfH;
181
+ halfSizes[c2] = renderHalfW;
182
+ halfSizes[c2 + 1] = renderHalfH;
124
183
  const rgba = (0, _parseColor.parseColor)(bar.color);
125
184
  const c4 = cursor * 4;
126
185
  let r = rgba[0];
@@ -29,6 +29,12 @@ function ensureCapacity(pool, maxCount) {
29
29
  // don't need a separate per-instance attribute on the GPU side.
30
30
  const HIGHLIGHTED_BRIGHTNESS = 1.2;
31
31
  const FADED_OPACITY = 0.3;
32
+ // Gaps below this (CSS px) get filled by expanding band half-size to half the
33
+ // step, avoiding sub-pixel hairlines from the rasterizer.
34
+ const GAP_FILL_THRESHOLD_PX = 1;
35
+ // Floor to keep thin quads from falling between pixel centers and getting
36
+ // culled at extreme zoom-out.
37
+ const MIN_BAND_HALF_SIZE_PX = 0.5;
32
38
  function setCornerRadii(radius, side, fullRounded, target, offset) {
33
39
  // CSS order: top-left, top-right, bottom-right, bottom-left.
34
40
  let tl = 0;
@@ -89,16 +95,66 @@ export function useWebGLBarLikePlotData(drawingArea, completedData, borderRadius
89
95
  const drawingAreaLeft = drawingArea.left;
90
96
  const drawingAreaTop = drawingArea.top;
91
97
  let cursor = 0;
92
- for (let s = 0; s < completedData.length; s += 1) {
93
- const processed = completedData[s];
98
+ for (let seriesIndex = 0; seriesIndex < completedData.length; seriesIndex += 1) {
99
+ const processed = completedData[seriesIndex];
94
100
  const seriesId = processed.seriesId;
95
101
  const data = processed.data;
96
102
  const dataLength = data.length;
103
+ const bandIsY = processed.layout === 'horizontal';
104
+
105
+ // `hidden` is series-level (mirrored onto every bar by useBarPlotData);
106
+ // peek at the first bar to skip the whole series.
107
+ if (dataLength === 0 || data[0].hidden) {
108
+ continue;
109
+ }
110
+
111
+ // Probe 1 = bar size; probe 2 = center-to-center step. Track dataIndex
112
+ // so null bars between probes don't inflate the step.
113
+ let probe = null;
114
+ let probeIndex = 0;
115
+ let probe2 = null;
116
+ let probe2Index = 0;
97
117
  for (let i = 0; i < dataLength; i += 1) {
98
- const bar = data[i];
99
- if (bar.hidden) {
100
- continue;
118
+ const candidate = data[i];
119
+ if (candidate.value != null && candidate.width > 0 && candidate.height > 0) {
120
+ if (probe === null) {
121
+ probe = candidate;
122
+ probeIndex = i;
123
+ } else {
124
+ probe2 = candidate;
125
+ probe2Index = i;
126
+ break;
127
+ }
101
128
  }
129
+ }
130
+ if (probe === null) {
131
+ continue;
132
+ }
133
+
134
+ // Round to whole pixels so the rendered half-size stays stable across
135
+ // zoom steps; sub-pixel jitter causes an "accordion" effect.
136
+ const rawBarSize = bandIsY ? probe.height : probe.width;
137
+ const barSize = Math.round(rawBarSize);
138
+ let step;
139
+ if (probe2 === null) {
140
+ step = barSize;
141
+ } else {
142
+ const indexGap = probe2Index - probeIndex;
143
+ const span = bandIsY ? probe2.y - probe.y : probe2.x - probe.x;
144
+ step = span / indexGap;
145
+ }
146
+ // Use the linear lower bound of the gap (`step - rawBarSize - 0.5`)
147
+ // rather than `step - barSize`: rounding makes the discrete gap jump by
148
+ // 1px at zoom boundaries, flipping `fillGap` and causing visible
149
+ // oscillation. The lower bound is continuous in zoom.
150
+ const gapLowerBound = step - rawBarSize - 0.5;
151
+ const fillGap = gapLowerBound > 0 && gapLowerBound < GAP_FILL_THRESHOLD_PX;
152
+ let bandHalfRender = fillGap ? step * 0.5 : barSize * 0.5;
153
+ if (bandHalfRender < MIN_BAND_HALF_SIZE_PX) {
154
+ bandHalfRender = MIN_BAND_HALF_SIZE_PX;
155
+ }
156
+ for (let i = 0; i < dataLength; i += 1) {
157
+ const bar = data[i];
102
158
  const value = bar.value;
103
159
  if (value == null) {
104
160
  continue;
@@ -110,11 +166,14 @@ export function useWebGLBarLikePlotData(drawingArea, completedData, borderRadius
110
166
  }
111
167
  const halfW = w * 0.5;
112
168
  const halfH = h * 0.5;
169
+ // Value axis stays exact; band axis uses the per-series override.
170
+ const renderHalfW = bandIsY ? halfW : bandHalfRender;
171
+ const renderHalfH = bandIsY ? bandHalfRender : halfH;
113
172
  const c2 = cursor * 2;
114
173
  centers[c2] = bar.x + halfW - drawingAreaLeft;
115
174
  centers[c2 + 1] = bar.y + halfH - drawingAreaTop;
116
- halfSizes[c2] = halfW;
117
- halfSizes[c2 + 1] = halfH;
175
+ halfSizes[c2] = renderHalfW;
176
+ halfSizes[c2 + 1] = renderHalfH;
118
177
  const rgba = parseColor(bar.color);
119
178
  const c4 = cursor * 4;
120
179
  let r = rgba[0];
package/CHANGELOG.md CHANGED
@@ -1,5 +1,256 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.6.0
4
+
5
+ _Jun 18, 2026_
6
+
7
+ We'd like to extend a big thank you to the 17 contributors who made this release possible. Here are some highlights ✨:
8
+
9
+ - 📊 New features for the radial bar charts, like percentage min radius and disabling tick labels.
10
+
11
+ Special thanks go out to these community members for their valuable contributions:
12
+ @adamowski10, @Anexus5919, @Morteza-hp, @mustafajw07, @TargiX
13
+
14
+ The following team members contributed to this release:
15
+ @alexfauquette, @arminmeh, @brijeshb42, @cherniavskii, @hasdfa, @Janpot, @JCQuintas, @michelengelen, @noraleonte, @oliviertassinari, @rita-codes, @sai6855
16
+
17
+ ### Data Grid
18
+
19
+ #### `@mui/x-data-grid@9.6.0`
20
+
21
+ - [DataGrid] Define `overflowAnchor` style at the right element (#22849) @arminmeh
22
+ - [DataGrid] Fix scrollbars not showing up on scroll on iOS (#22832) @cherniavskii
23
+
24
+ #### `@mui/x-data-grid-pro@9.6.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
25
+
26
+ Same changes as in `@mui/x-data-grid@9.6.0`, plus:
27
+
28
+ - [DataGridPro] Prevent incorrect row range capping on the first page with known `rowCount` (#22808) @michelengelen
29
+
30
+ #### `@mui/x-data-grid-premium@9.6.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
31
+
32
+ Same changes as in `@mui/x-data-grid-pro@9.6.0`.
33
+
34
+ ### Date and Time Pickers
35
+
36
+ #### `@mui/x-date-pickers@9.6.0`
37
+
38
+ - [pickers] Fix `AdapterMomentHijri.getDaysInMonth` returning the Gregorian month length (#22774) @Anexus5919
39
+ - [l10n] Improve Persian (fa-IR) locale (#22454) @Morteza-hp
40
+
41
+ #### `@mui/x-date-pickers-pro@9.6.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
42
+
43
+ Same changes as in `@mui/x-date-pickers@9.6.0`.
44
+
45
+ ### Charts
46
+
47
+ #### `@mui/x-charts@9.6.0`
48
+
49
+ - [charts] Add `disableTickLabel` prop to radial axes (#22801) @JCQuintas
50
+ - [charts] Fix bug when `min` is in axis domain (#22827) @alexfauquette
51
+ - [charts] Fix wheel zoom not centering on cursor position (#22811) @JCQuintas
52
+ - [charts] Remove zoom gesture registration from community package (#22753) @sai6855
53
+ - [charts] Support percentage values for radial axis `minRadius`/`maxRadius` (#22803) @JCQuintas
54
+ - [charts] Support `unknownColor` in color scale (#22813) @alexfauquette
55
+ - [charts] Document click listener for scatter composition (#22809) @sai6855
56
+
57
+ #### `@mui/x-charts-pro@9.6.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
58
+
59
+ Same changes as in `@mui/x-charts@9.6.0`.
60
+
61
+ #### `@mui/x-charts-premium@9.6.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
62
+
63
+ Same changes as in `@mui/x-charts-pro@9.6.0`, plus:
64
+
65
+ - [charts-premium] Add `geoFeatureKey` to transform features identifier (#22848) @alexfauquette
66
+ - [charts-premium] Allow to remove Antartica (#22815) @alexfauquette
67
+ - [charts-premium] Regenerate `ScatterPlotPremium` `propTypes` (#22829) @rita-codes
68
+ - [charts-premium] Support maps tooltip positioned on items (#22648) @alexfauquette
69
+ - [docs] Show how to export maps (#22837) @alexfauquette
70
+
71
+
72
+ ### Tree View
73
+
74
+ #### `@mui/x-tree-view@9.6.0`
75
+
76
+ Internal changes.
77
+
78
+ #### `@mui/x-tree-view-pro@9.6.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
79
+
80
+ Same changes as in `@mui/x-tree-view@9.6.0`.
81
+
82
+ ### Scheduler
83
+
84
+ #### `@mui/x-scheduler@9.0.0-beta.2`
85
+
86
+ - [scheduler] Add dispose lifecycle to `SchedulerLazyLoadingPlugin` (#22532) @rita-codes
87
+ - [scheduler] Add responsive mobile week view and responsive typography (#22593) @noraleonte
88
+ - [scheduler] Add stable weekday token to `recurrenceWeeklyPresetLabel` (#22733) @mustafajw07
89
+ - [scheduler] Create accessibility documentation section (#22557) @mustafajw07
90
+ - [scheduler] Decouple `MonthViewProps` from day time grid props (#22802) @mustafajw07
91
+ - [scheduler] Export missing public scheduler types (#22785) @mustafajw07
92
+ - [scheduler] Fix JSDoc defaults and improve public type readability (#22784) @mustafajw07
93
+ - [scheduler] Fix `aria-labelledby` on events referencing non-existent header IDs (#22778) @rita-codes
94
+ - [scheduler] Move `EventCalendarStyledContext` to internals (#22787) @mustafajw07
95
+ - [scheduler] Normalize all-day recurring occurrences to whole days (#22792) @Anexus5919
96
+ - [scheduler] Recalculate `DayTimeGrid` `hasScroll` on container resize (#22780) @Anexus5919
97
+ - [scheduler] Recompute `nowUpdatedEveryMinute` only on timezone change (#22793) @Anexus5919
98
+ - [scheduler] Register auto-scroll once instead of on every render (#22794) @Anexus5919
99
+ - [scheduler] Remove duplicate dividers in the day/time grid (#22795) @Anexus5919
100
+ - [scheduler] Remove unused `--has-scroll` CSS variable from `DayTimeGrid` (#22799) @Anexus5919
101
+ - [scheduler] Remove vestigial async from internal drop handler (#22781) @mustafajw07
102
+ - [scheduler] Return a primitive key from the Calendar lazy-loading selector (#22791) @Anexus5919
103
+ - [scheduler] Throw on invalid event dates instead of emitting `NaN` timestamps (#22740) @rita-codes
104
+ - [scheduler] Tighten `StandaloneEventProps` data typing (#22796) @mustafajw07
105
+ - [scheduler] Update feedback banner to say beta instead of alpha (#22804) @rita-codes
106
+ - [scheduler] Use `@base-ui` `generateId` for event ids in `createEventModel` (#22788) @rita-codes
107
+ - [scheduler] Clear clipboard after pasting a cut event (#22773) @Anexus5919
108
+ - [scheduler] Show drag placeholder when re-entering the same position (#22775) @Anexus5919
109
+ - [scheduler] Validate missing and duplicate event ids (#22790) @Anexus5919
110
+ - [l10n] Improve Polish (pl-PL) locale (#22612) @adamowski10
111
+
112
+ #### `@mui/x-scheduler-premium@9.0.0-beta.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
113
+
114
+ Same changes as in `@mui/x-scheduler@9.0.0-beta.2`, plus:
115
+
116
+ - [scheduler-premium] Expose premium model types through public API (#22798) @mustafajw07
117
+ - [scheduler-premium] Remove non-functional `onPreferencesChange` prop from `EventTimelinePremium` (#22777) @rita-codes
118
+ - [scheduler-premium] Validate the `FREQ` value in `parseRRule`] (#22786) @rita-codes
119
+
120
+ ### Codemod
121
+
122
+ #### `@mui/x-codemod@9.6.0`
123
+
124
+ Internal changes.
125
+
126
+ ### Docs
127
+
128
+ - [docs] Fix link-check build timeout by disabling serve directory listing (#22836) @Janpot
129
+ - [docs] Show how to export maps (#22837) @alexfauquette
130
+ - [docs] Add radial bar overview demo with custom overlays (#22776) @JCQuintas
131
+ - [docs] Add weather composition demo (#22723) @TargiX
132
+ - [docs] Add docs overview gallery and playground (#22488) @hasdfa
133
+ - [docs] Clarify 'Scrolling without render gaps' (#22629) @oliviertassinari
134
+ - [docs] Fix typo in release instructions (#22864) @brijeshb42
135
+
136
+ ### Core
137
+
138
+ - [code-infra] Fix lint issues (#22757) @brijeshb42
139
+ - [code-infra] Fix remaining Dependabot security alerts (#22761) @Janpot
140
+ - [code-infra] Remove release:build from docs:build script (#22852) @brijeshb42
141
+ - [code-infra] Unpin `@mui/utils` version to allow dedupe (#22828) @mustafajw07
142
+ - [docs-infra] Cap Netlify Next.js build parallelism to avoid OOM (#22847) @Janpot
143
+ - [docs-infra] Remove i18n codebase (#22591) @brijeshb42
144
+ - [internal] Fix failing React 18 unit tests (#22846) @brijeshb42
145
+
146
+ ### Miscellaneous
147
+
148
+ - [core] Add remove-proptypes markers to generated `propTypes` (#22850) @JCQuintas
149
+ - [core] Bump vitest packages to 4.1.8 to fix browser-test version skew (#22845) @Janpot
150
+ - [core] Reduce e2e build concurrency to avoid OOM (#22843) @Janpot
151
+ - [core] Strip proptypes from Production bundles (#22750) @sai6855
152
+ - [test] Wait for `GridToolbarCustom` rows before screenshot (#22844) @Janpot
153
+
154
+ ## 9.5.0
155
+
156
+ _Jun 11, 2026_
157
+
158
+ We'd like to extend a big thank you to the 9 contributors who made this release possible. Here are some highlights ✨:
159
+
160
+ - 🎁 New [`multiSelect` column type for Data Grid Pro](https://mui.com/x/react-data-grid/column-definition/#MultiSelectColumn)
161
+ - 🚀 New [renderer="svg-progressive"](https://mui.com/x/react-charts/scatter/#progressive-renderer) paints scatter points in batched frames so large datasets render smoothly without blocking the main thread.
162
+ - 🐞 Bugfixes
163
+ - 📚 Documentation improvements
164
+
165
+ Special thanks go out to community members @mustafajw07 and @Anexus5919 for their valuable contribution.
166
+
167
+ The following team members contributed to this release:
168
+ @alexfauquette, @JCQuintas, @rita-codes, @rluzists1, @sai6855, @siriwatknp, @arminmeh, @brijeshb42
169
+
170
+ ### Data Grid
171
+
172
+ #### `@mui/x-data-grid@9.5.0`
173
+
174
+ - [DataGrid] Restrict warning messages to non-production environments in various components (#22461) @sai6855
175
+ - [DataGrid] Prevent React state update before mount (#22374) @arminmeh
176
+
177
+ #### `@mui/x-data-grid-pro@9.5.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
178
+
179
+ Same changes as in `@mui/x-data-grid@9.5.0`, plus:
180
+
181
+ - [DataGridPro] Add new `multiSelect` column type (#21157) @siriwatknp
182
+
183
+ #### `@mui/x-data-grid-premium@9.5.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
184
+
185
+ Same changes as in `@mui/x-data-grid-pro@9.5.0`.
186
+
187
+ ### Date and Time Pickers
188
+
189
+ #### `@mui/x-date-pickers@9.5.0`
190
+
191
+ - [pickers] Fix missing export of `th-TH` (#22703) @alexfauquette
192
+
193
+ #### `@mui/x-date-pickers-pro@9.5.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
194
+
195
+ Same changes as in `@mui/x-date-pickers@9.5.0`.
196
+
197
+ ### Charts
198
+
199
+ #### `@mui/x-charts@9.5.0`
200
+
201
+ - [charts] Add `FocusedBar` component to `BarScatterComposition` demo (#22704) @sai6855
202
+ - [charts] Add dedicated Bubble Chart documentation page (#22688) @mustafajw07
203
+ - [charts] Add progressive scatter renderer (#22518) @JCQuintas
204
+ - [charts] Avoid full axis pipeline rebuild on resize (#22695) @JCQuintas
205
+ - [charts] Document focus indicator in composition page (#22712) @JCQuintas
206
+ - [charts] Fix `ChartsTooltip` `container` and `disablePortal` props being ignored (#22690) @JCQuintas
207
+ - [charts] Make ordinal scales O(1) to copy and re-range (#22691) @JCQuintas
208
+ - [charts] Stabilize WebGL bar rendering at sub-pixel widths (#22678) @JCQuintas
209
+ - [charts] Use the series config to define value types (#22693) @sai6855
210
+ - [charts] Decouple interaction hook from the cartesian zoom (#22708) @alexfauquette
211
+
212
+ #### `@mui/x-charts-pro@9.5.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
213
+
214
+ Same changes as in `@mui/x-charts@9.5.0`, plus:
215
+
216
+ - [charts-pro] Add missing focus highlight (#22689) @alexfauquette
217
+
218
+ #### `@mui/x-charts-premium@9.5.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
219
+
220
+ Same changes as in `@mui/x-charts-pro@9.5.0`, plus:
221
+
222
+ - [charts-premium] Set `Heatmap` WebGL render as stable (#22665) @alexfauquette
223
+ - [charts-premium] Stabilize candlestick charts (#22666) @alexfauquette
224
+ - [charts-premium] Stabilize the radial charts (#22655) @alexfauquette
225
+
226
+ ### Scheduler
227
+
228
+ #### `@mui/x-scheduler@9.0.0-beta.1`
229
+
230
+ Internal changes.
231
+
232
+ #### `@mui/x-scheduler-premium@9.0.0-beta.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
233
+
234
+ Same changes as in `@mui/x-scheduler@9.0.0-beta.1`, plus:
235
+
236
+ - [scheduler] Remove dead CSS variable writes in `EventTimelinePremiumContent` (#22720) @rita-codes
237
+ - [scheduler] Show scope dialog when deleting a recurring event (#22552) @Anexus5919
238
+
239
+ ### Core
240
+
241
+ - [docs-infra] Fix immutable cache headers for `/\_next/static` assets (#22747) @brijeshb42
242
+ - [docs-infra] Prefix `/\_next/static` cache header rule with `/x` basePath (#22748) @brijeshb42
243
+ - [code-infra] Update dependencies to resolve Dependabot security alerts (#22714) @Janpot
244
+
245
+ ### Docs
246
+
247
+ - [docs] Fix broken links checker crashing on 404 known-targets fetch (#22707) @sai6855
248
+ - [docs] Fix country data (#22716) @alexfauquette
249
+
250
+ ### Miscellaneous
251
+
252
+ - [legal] Update EULA links in docs (#22717) @rluzists1
253
+
3
254
  ## 9.4.0
4
255
 
5
256
  <!-- generated comparing v9.3.0..master -->
@@ -89,7 +89,7 @@ const CandlestickChart = exports.CandlestickChart = /*#__PURE__*/React.forwardRe
89
89
  }));
90
90
  });
91
91
  if (process.env.NODE_ENV !== "production") CandlestickChart.displayName = "CandlestickChart";
92
- process.env.NODE_ENV !== "production" ? CandlestickChart.propTypes = {
92
+ process.env.NODE_ENV !== "production" ? CandlestickChart.propTypes /* remove-proptypes */ = {
93
93
  // ----------------------------- Warning --------------------------------
94
94
  // | These PropTypes are generated from the TypeScript type definitions |
95
95
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -81,7 +81,7 @@ const CandlestickChart = /*#__PURE__*/React.forwardRef(function CandlestickChart
81
81
  }));
82
82
  });
83
83
  if (process.env.NODE_ENV !== "production") CandlestickChart.displayName = "CandlestickChart";
84
- process.env.NODE_ENV !== "production" ? CandlestickChart.propTypes = {
84
+ process.env.NODE_ENV !== "production" ? CandlestickChart.propTypes /* remove-proptypes */ = {
85
85
  // ----------------------------- Warning --------------------------------
86
86
  // | These PropTypes are generated from the TypeScript type definitions |
87
87
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
@@ -1,2 +1,11 @@
1
- export { CandlestickChart as Unstable_CandlestickChart, type CandlestickChartProps, type CandlestickChartSlots, type CandlestickChartSlotProps, type OHLCSeries } from "./CandlestickChart.mjs";
2
- export { CandlestickPlot as Unstable_CandlestickPlot, type CandlestickPlotProps } from "./CandlestickPlot.mjs";
1
+ import { CandlestickPlot } from "./CandlestickPlot.mjs";
2
+ /**
3
+ * @deprecated candlestick chart is now stable, import `ChartsCandlestickChart` instead
4
+ */
5
+ export declare const Unstable_CandlestickChart: import("react").ForwardRefExoticComponent<import("./CandlestickChart.mjs").CandlestickChartProps & import("react").RefAttributes<HTMLDivElement>>;
6
+ /**
7
+ * @deprecated candlestick plot is now stable, import `ChartsCandlestickPlot` instead
8
+ */
9
+ export declare const Unstable_CandlestickPlot: typeof CandlestickPlot;
10
+ export { CandlestickChart, type CandlestickChartProps, type CandlestickChartSlots, type CandlestickChartSlotProps, type OHLCSeries } from "./CandlestickChart.mjs";
11
+ export { CandlestickPlot, type CandlestickPlotProps } from "./CandlestickPlot.mjs";