@mui/x-charts 9.0.2 → 9.0.4

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 (150) hide show
  1. package/BarChart/BarChart.js +2 -1
  2. package/BarChart/BarChart.mjs +2 -1
  3. package/BarChart/BarPlot.js +2 -1
  4. package/BarChart/BarPlot.mjs +2 -1
  5. package/BarChart/FocusedBar.js +3 -0
  6. package/BarChart/FocusedBar.mjs +3 -0
  7. package/BarChart/seriesConfig/bar/getSeriesWithDefaultValues.d.mts +8 -8
  8. package/BarChart/seriesConfig/bar/getSeriesWithDefaultValues.d.ts +8 -8
  9. package/CHANGELOG.md +223 -0
  10. package/ChartsRadialGrid/ChartsRadialGrid.js +2 -0
  11. package/ChartsRadialGrid/ChartsRadialGrid.mjs +2 -0
  12. package/ChartsRadialGrid/ChartsRadiusGrid.d.mts +1 -0
  13. package/ChartsRadialGrid/ChartsRadiusGrid.d.ts +1 -0
  14. package/ChartsRadialGrid/ChartsRadiusGrid.js +1 -2
  15. package/ChartsRadialGrid/ChartsRadiusGrid.mjs +1 -2
  16. package/ChartsRadiusAxis/ChartsRadiusAxis.d.mts +48 -0
  17. package/ChartsRadiusAxis/ChartsRadiusAxis.d.ts +48 -0
  18. package/ChartsRadiusAxis/ChartsRadiusAxis.js +147 -0
  19. package/ChartsRadiusAxis/ChartsRadiusAxis.mjs +141 -0
  20. package/ChartsRadiusAxis/chartsRadiusAxisClasses.d.mts +6 -0
  21. package/ChartsRadiusAxis/chartsRadiusAxisClasses.d.ts +6 -0
  22. package/ChartsRadiusAxis/chartsRadiusAxisClasses.js +30 -0
  23. package/ChartsRadiusAxis/chartsRadiusAxisClasses.mjs +17 -0
  24. package/ChartsRadiusAxis/createGetLabelTextAnchors.d.mts +10 -0
  25. package/ChartsRadiusAxis/createGetLabelTextAnchors.d.ts +10 -0
  26. package/ChartsRadiusAxis/createGetLabelTextAnchors.js +46 -0
  27. package/ChartsRadiusAxis/createGetLabelTextAnchors.mjs +39 -0
  28. package/ChartsRadiusAxis/getLabelTransform.d.mts +11 -0
  29. package/ChartsRadiusAxis/getLabelTransform.d.ts +11 -0
  30. package/ChartsRadiusAxis/getLabelTransform.js +37 -0
  31. package/ChartsRadiusAxis/getLabelTransform.mjs +31 -0
  32. package/ChartsRadiusAxis/index.d.mts +3 -0
  33. package/ChartsRadiusAxis/index.d.ts +3 -0
  34. package/ChartsRadiusAxis/index.js +19 -0
  35. package/ChartsRadiusAxis/index.mjs +2 -0
  36. package/ChartsRadiusAxis/sharedRadialAxisClasses.d.mts +21 -0
  37. package/ChartsRadiusAxis/sharedRadialAxisClasses.d.ts +21 -0
  38. package/ChartsRadiusAxis/sharedRadialAxisClasses.js +14 -0
  39. package/ChartsRadiusAxis/sharedRadialAxisClasses.mjs +6 -0
  40. package/ChartsRotationAxis/ChartsRotationAxis.d.mts +48 -0
  41. package/ChartsRotationAxis/ChartsRotationAxis.d.ts +48 -0
  42. package/ChartsRotationAxis/ChartsRotationAxis.js +141 -0
  43. package/ChartsRotationAxis/ChartsRotationAxis.mjs +135 -0
  44. package/ChartsRotationAxis/chartsRotationAxisClasses.d.mts +5 -0
  45. package/ChartsRotationAxis/chartsRotationAxisClasses.d.ts +5 -0
  46. package/ChartsRotationAxis/chartsRotationAxisClasses.js +29 -0
  47. package/ChartsRotationAxis/chartsRotationAxisClasses.mjs +16 -0
  48. package/ChartsRotationAxis/getLabelTransform.d.mts +11 -0
  49. package/ChartsRotationAxis/getLabelTransform.d.ts +11 -0
  50. package/ChartsRotationAxis/getLabelTransform.js +37 -0
  51. package/ChartsRotationAxis/getLabelTransform.mjs +31 -0
  52. package/ChartsRotationAxis/index.d.mts +2 -0
  53. package/ChartsRotationAxis/index.d.ts +2 -0
  54. package/ChartsRotationAxis/index.js +19 -0
  55. package/ChartsRotationAxis/index.mjs +2 -0
  56. package/ChartsTooltip/useAxesTooltip.js +18 -7
  57. package/ChartsTooltip/useAxesTooltip.mjs +19 -8
  58. package/ChartsTooltip/useItemTooltip.d.mts +1 -1
  59. package/ChartsTooltip/useItemTooltip.d.ts +1 -1
  60. package/ChartsTooltip/useItemTooltip.js +17 -2
  61. package/ChartsTooltip/useItemTooltip.mjs +18 -3
  62. package/ChartsXAxis/useAxisTicksProps.d.mts +245 -164
  63. package/ChartsXAxis/useAxisTicksProps.d.ts +245 -164
  64. package/ChartsYAxis/useAxisTicksProps.d.mts +245 -164
  65. package/ChartsYAxis/useAxisTicksProps.d.ts +245 -164
  66. package/LineChart/FocusedLineMark.js +3 -0
  67. package/LineChart/FocusedLineMark.mjs +3 -0
  68. package/LineChart/seriesConfig/curveEvaluation.js +24 -19
  69. package/LineChart/seriesConfig/curveEvaluation.mjs +24 -19
  70. package/LineChart/seriesConfig/getItemAtPosition.js +25 -37
  71. package/LineChart/seriesConfig/getItemAtPosition.mjs +24 -36
  72. package/LineChart/seriesConfig/getSeriesWithDefaultValues.js +4 -6
  73. package/LineChart/seriesConfig/getSeriesWithDefaultValues.mjs +4 -6
  74. package/LineChart/seriesConfig/seriesProcessor.d.mts +4 -2
  75. package/LineChart/seriesConfig/seriesProcessor.d.ts +4 -2
  76. package/LineChart/seriesConfig/seriesProcessor.js +2 -2
  77. package/LineChart/seriesConfig/seriesProcessor.mjs +2 -2
  78. package/PieChart/FocusedPieArc.js +3 -0
  79. package/PieChart/FocusedPieArc.mjs +3 -0
  80. package/RadarChart/FocusedRadarMark.js +3 -0
  81. package/RadarChart/FocusedRadarMark.mjs +3 -0
  82. package/RadarChart/RadarSeriesPlot/useRadarSeriesData.d.mts +2 -2
  83. package/RadarChart/RadarSeriesPlot/useRadarSeriesData.d.ts +2 -2
  84. package/ScatterChart/FocusedScatterMark.js +3 -0
  85. package/ScatterChart/FocusedScatterMark.mjs +3 -0
  86. package/hooks/useAxis.d.mts +2 -2
  87. package/hooks/useAxis.d.ts +2 -2
  88. package/index.d.mts +2 -0
  89. package/index.d.ts +2 -0
  90. package/index.js +22 -2
  91. package/index.mjs +3 -1
  92. package/internals/commonNextFocusItem.js +62 -8
  93. package/internals/commonNextFocusItem.mjs +62 -8
  94. package/internals/cubiqSolver.d.mts +5 -0
  95. package/internals/cubiqSolver.d.ts +5 -0
  96. package/internals/cubiqSolver.js +62 -0
  97. package/internals/cubiqSolver.mjs +56 -0
  98. package/internals/findClosestIndex.d.mts +5 -0
  99. package/internals/findClosestIndex.d.ts +5 -0
  100. package/internals/findClosestIndex.js +27 -0
  101. package/internals/findClosestIndex.mjs +22 -0
  102. package/internals/getAsNumber.d.mts +1 -0
  103. package/internals/getAsNumber.d.ts +1 -0
  104. package/internals/getAsNumber.js +9 -0
  105. package/internals/getAsNumber.mjs +3 -0
  106. package/internals/index.d.mts +6 -1
  107. package/internals/index.d.ts +6 -1
  108. package/internals/index.js +59 -2
  109. package/internals/index.mjs +6 -1
  110. package/internals/isPolar.d.mts +3 -2
  111. package/internals/isPolar.d.ts +3 -2
  112. package/internals/isPolar.js +4 -0
  113. package/internals/isPolar.mjs +3 -0
  114. package/internals/plugins/corePlugins/useChartSeriesConfig/types/colorProcessor.types.d.mts +8 -9
  115. package/internals/plugins/corePlugins/useChartSeriesConfig/types/colorProcessor.types.d.ts +8 -9
  116. package/internals/plugins/featurePlugins/useChartCartesianAxis/getAxisValue.js +4 -21
  117. package/internals/plugins/featurePlugins/useChartCartesianAxis/getAxisValue.mjs +4 -21
  118. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/findVisibleDataIndex.d.mts +30 -0
  119. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/findVisibleDataIndex.d.ts +30 -0
  120. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/findVisibleDataIndex.js +57 -0
  121. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/findVisibleDataIndex.mjs +51 -0
  122. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/getMaxSeriesLength.js +7 -1
  123. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/getMaxSeriesLength.mjs +7 -1
  124. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/getNonEmptySeriesArray.js +7 -1
  125. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/utils/getNonEmptySeriesArray.mjs +7 -1
  126. package/internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.d.mts +3 -2
  127. package/internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.d.ts +3 -2
  128. package/internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.js +25 -14
  129. package/internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.mjs +25 -14
  130. package/internals/plugins/featurePlugins/useChartPolarAxis/getAxisIndex.js +9 -4
  131. package/internals/plugins/featurePlugins/useChartPolarAxis/getAxisIndex.mjs +9 -3
  132. package/internals/plugins/featurePlugins/useChartTooltip/useChartTooltip.selectors.d.mts +2 -2
  133. package/internals/plugins/featurePlugins/useChartTooltip/useChartTooltip.selectors.d.ts +2 -2
  134. package/models/axis.d.mts +2 -0
  135. package/models/axis.d.ts +2 -0
  136. package/models/seriesType/bar.d.mts +12 -7
  137. package/models/seriesType/bar.d.ts +12 -7
  138. package/models/seriesType/common.d.mts +10 -0
  139. package/models/seriesType/common.d.ts +10 -0
  140. package/models/seriesType/composition.d.mts +3 -1
  141. package/models/seriesType/composition.d.ts +3 -1
  142. package/models/seriesType/composition.js +6 -2
  143. package/models/seriesType/composition.mjs +5 -1
  144. package/models/seriesType/index.d.mts +3 -3
  145. package/models/seriesType/index.d.ts +3 -3
  146. package/models/seriesType/index.js +0 -22
  147. package/models/seriesType/index.mjs +0 -2
  148. package/models/seriesType/line.d.mts +13 -8
  149. package/models/seriesType/line.d.ts +13 -8
  150. package/package.json +32 -4
@@ -26,6 +26,9 @@ function FocusedLineMark() {
26
26
  return null;
27
27
  }
28
28
  const series = lineSeries.series[focusedItem.seriesId];
29
+ if (!series || series.hidden) {
30
+ return null;
31
+ }
29
32
  if (series.data[focusedItem.dataIndex] == null) {
30
33
  // Handle missing data
31
34
  return null;
@@ -21,6 +21,9 @@ export function FocusedLineMark() {
21
21
  return null;
22
22
  }
23
23
  const series = lineSeries.series[focusedItem.seriesId];
24
+ if (!series || series.hidden) {
25
+ return null;
26
+ }
24
27
  if (series.data[focusedItem.dataIndex] == null) {
25
28
  // Handle missing data
26
29
  return null;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.evaluateCurveY = evaluateCurveY;
7
7
  var _getCurve = require("../../internals/getCurve");
8
+ var _cubiqSolver = require("../../internals/cubiqSolver");
8
9
  /**
9
10
  * A straight line segment.
10
11
  */
@@ -63,8 +64,15 @@ function cubicBezier(t, p0, p1, p2, p3) {
63
64
  }
64
65
 
65
66
  /**
66
- * Find parameter t such that the segment's x(t) ≈ targetX using bisection.
67
- * 20 iterations gives ~1e-6 precision relative to the segment's x range.
67
+ * Get polynomials coefficient of a cubic Bezier curve.
68
+ * P(t) = rep[0] * t**3 + rep[1] * t**2 + rep[2] * t + rep[3]
69
+ */
70
+ function cubicBezierCoeffs(p0, p1, p2, p3) {
71
+ return [-p0 + 3 * p1 - 3 * p2 + p3, 3 * p0 - 6 * p1 + 3 * p2, -3 * p0 + 3 * p1, p0];
72
+ }
73
+
74
+ /**
75
+ * Find parameter t such that the segment's x(t) ≈ targetX
68
76
  */
69
77
  function findTForX(segment, targetX) {
70
78
  if (!isBezierSegment(segment)) {
@@ -72,23 +80,14 @@ function findTForX(segment, targetX) {
72
80
  const dx = segment.x1 - segment.x0;
73
81
  return dx === 0 ? 0 : (targetX - segment.x0) / dx;
74
82
  }
75
-
76
- // Cubic bezier — bisect.
77
- let lo = 0;
78
- let hi = 1;
79
- for (let iter = 0; iter < 20; iter += 1) {
80
- const mid = (lo + hi) / 2;
81
- const x = cubicBezier(mid, segment.x0, segment.cpx1, segment.cpx2, segment.x1);
82
- if (x < targetX) {
83
- lo = mid;
84
- } else {
85
- hi = mid;
86
- }
87
- if (Math.abs(x - targetX) < 1) {
88
- return (lo + hi) / 2;
89
- }
83
+ const xBezierCoeffs = cubicBezierCoeffs(segment.x0, segment.cpx1, segment.cpx2, segment.x1);
84
+ const polyToSolve = [...xBezierCoeffs];
85
+ polyToSolve[3] -= targetX;
86
+ const roots = (0, _cubiqSolver.cubicRoots)(polyToSolve);
87
+ if (roots.length > 0) {
88
+ return roots[0];
90
89
  }
91
- return (lo + hi) / 2;
90
+ return -1;
92
91
  }
93
92
 
94
93
  /** Evaluate the segment's y at parameter t. */
@@ -123,9 +122,15 @@ function evaluateCurveY(points, targetX, curveType) {
123
122
 
124
123
  // Find the segment containing targetX.
125
124
  for (const segment of capture.segments) {
125
+ if (targetX < segment.x0 + 0.5 && targetX > segment.x0 - 0.5) {
126
+ return segment.y0;
127
+ }
128
+ if (targetX < segment.x1 + 0.5 && targetX > segment.x1 - 0.5) {
129
+ return segment.y1;
130
+ }
126
131
  const xMin = Math.min(segment.x0, segment.x1);
127
132
  const xMax = Math.max(segment.x0, segment.x1);
128
- if (targetX >= xMin - 0.5 && targetX <= xMax + 0.5) {
133
+ if (targetX >= xMin && targetX <= xMax) {
129
134
  const t = findTForX(segment, targetX);
130
135
  return evaluateSegmentY(segment, t);
131
136
  }
@@ -1,4 +1,5 @@
1
1
  import { getCurveFactory } from "../../internals/getCurve.mjs";
2
+ import { cubicRoots } from "../../internals/cubiqSolver.mjs";
2
3
 
3
4
  /**
4
5
  * A straight line segment.
@@ -58,8 +59,15 @@ function cubicBezier(t, p0, p1, p2, p3) {
58
59
  }
59
60
 
60
61
  /**
61
- * Find parameter t such that the segment's x(t) ≈ targetX using bisection.
62
- * 20 iterations gives ~1e-6 precision relative to the segment's x range.
62
+ * Get polynomials coefficient of a cubic Bezier curve.
63
+ * P(t) = rep[0] * t**3 + rep[1] * t**2 + rep[2] * t + rep[3]
64
+ */
65
+ function cubicBezierCoeffs(p0, p1, p2, p3) {
66
+ return [-p0 + 3 * p1 - 3 * p2 + p3, 3 * p0 - 6 * p1 + 3 * p2, -3 * p0 + 3 * p1, p0];
67
+ }
68
+
69
+ /**
70
+ * Find parameter t such that the segment's x(t) ≈ targetX
63
71
  */
64
72
  function findTForX(segment, targetX) {
65
73
  if (!isBezierSegment(segment)) {
@@ -67,23 +75,14 @@ function findTForX(segment, targetX) {
67
75
  const dx = segment.x1 - segment.x0;
68
76
  return dx === 0 ? 0 : (targetX - segment.x0) / dx;
69
77
  }
70
-
71
- // Cubic bezier — bisect.
72
- let lo = 0;
73
- let hi = 1;
74
- for (let iter = 0; iter < 20; iter += 1) {
75
- const mid = (lo + hi) / 2;
76
- const x = cubicBezier(mid, segment.x0, segment.cpx1, segment.cpx2, segment.x1);
77
- if (x < targetX) {
78
- lo = mid;
79
- } else {
80
- hi = mid;
81
- }
82
- if (Math.abs(x - targetX) < 1) {
83
- return (lo + hi) / 2;
84
- }
78
+ const xBezierCoeffs = cubicBezierCoeffs(segment.x0, segment.cpx1, segment.cpx2, segment.x1);
79
+ const polyToSolve = [...xBezierCoeffs];
80
+ polyToSolve[3] -= targetX;
81
+ const roots = cubicRoots(polyToSolve);
82
+ if (roots.length > 0) {
83
+ return roots[0];
85
84
  }
86
- return (lo + hi) / 2;
85
+ return -1;
87
86
  }
88
87
 
89
88
  /** Evaluate the segment's y at parameter t. */
@@ -118,9 +117,15 @@ export function evaluateCurveY(points, targetX, curveType) {
118
117
 
119
118
  // Find the segment containing targetX.
120
119
  for (const segment of capture.segments) {
120
+ if (targetX < segment.x0 + 0.5 && targetX > segment.x0 - 0.5) {
121
+ return segment.y0;
122
+ }
123
+ if (targetX < segment.x1 + 0.5 && targetX > segment.x1 - 0.5) {
124
+ return segment.y1;
125
+ }
121
126
  const xMin = Math.min(segment.x0, segment.x1);
122
127
  const xMax = Math.max(segment.x0, segment.x1);
123
- if (targetX >= xMin - 0.5 && targetX <= xMax + 0.5) {
128
+ if (targetX >= xMin && targetX <= xMax) {
124
129
  const t = findTForX(segment, targetX);
125
130
  return evaluateSegmentY(segment, t);
126
131
  }
@@ -8,6 +8,7 @@ var _useChartCartesianAxisRendering = require("../../internals/plugins/featurePl
8
8
  var _seriesSelectorOfType = require("../../internals/seriesSelectorOfType");
9
9
  var _getAxisValue = require("../../internals/plugins/featurePlugins/useChartCartesianAxis/getAxisValue");
10
10
  var _scaleGuards = require("../../internals/scaleGuards");
11
+ var _getAsNumber = require("../../internals/getAsNumber");
11
12
  var _getValueToPositionMapper = require("../../hooks/getValueToPositionMapper");
12
13
  var _curveEvaluation = require("./curveEvaluation");
13
14
  /**
@@ -28,21 +29,27 @@ function getBracketIndices(xAxis, pointX) {
28
29
  if (index === -1) {
29
30
  return null;
30
31
  }
31
- return {
32
- left: index,
32
+ const axisPointValue = (0, _getValueToPositionMapper.getValueToPositionMapper)(xAxis.scale)(axisData[index]);
33
+ if (axisPointValue <= pointX) {
34
+ return index === axisData.length - 1 ? null : {
35
+ left: index,
36
+ right: index + 1
37
+ };
38
+ }
39
+ return index === 0 ? null : {
40
+ left: index - 1,
33
41
  right: index
34
42
  };
35
43
  }
36
44
 
37
45
  // For continuous axes, find the two adjacent data points surrounding pointX.
38
46
  const xValue = scale.invert(pointX);
39
- const xAsNumber = xValue instanceof Date ? xValue.getTime() : xValue;
40
- const getAsNumber = v => v instanceof Date ? v.getTime() : v;
47
+ const xAsNumber = (0, _getAsNumber.getAsNumber)(xValue);
41
48
 
42
49
  // Find the rightmost index where data[i] <= xValue.
43
50
  let leftIndex = -1;
44
51
  for (let i = 0; i < axisData.length; i += 1) {
45
- if (getAsNumber(axisData[i]) <= xAsNumber) {
52
+ if ((0, _getAsNumber.getAsNumber)(axisData[i]) <= xAsNumber) {
46
53
  leftIndex = i;
47
54
  } else {
48
55
  break;
@@ -53,7 +60,11 @@ function getBracketIndices(xAxis, pointX) {
53
60
  return null;
54
61
  }
55
62
  if (leftIndex === axisData.length - 1) {
56
- // Pointer is at or after the last data point — check if it's close enough.
63
+ if ((0, _getAsNumber.getAsNumber)(axisData[leftIndex]) < xAsNumber) {
64
+ // Pointer is strictly past the last data point — out of range.
65
+ return null;
66
+ }
67
+ // Pointer is exactly on the last data point.
57
68
  return {
58
69
  left: leftIndex,
59
70
  right: leftIndex
@@ -79,6 +90,7 @@ function getBaselinePixelY(baseline, yScale, stackedY0) {
79
90
  if (baseline === 'min') {
80
91
  return yScale.range()[0];
81
92
  }
93
+
82
94
  // Default: use the stacked baseline value.
83
95
  const value = yScale(stackedY0);
84
96
  if (Number.isNaN(value)) {
@@ -181,6 +193,9 @@ function getItemAtPosition(state, point) {
181
193
  connectNulls,
182
194
  curve
183
195
  } = seriesItem;
196
+ if (!connectNulls && (data[left] == null || data[right] == null)) {
197
+ continue;
198
+ }
184
199
  const dataIndex = (0, _getAxisValue.getAxisIndex)(xAxis, point.x);
185
200
  if (dataIndex === -1) {
186
201
  continue;
@@ -238,7 +253,7 @@ function getItemAtPosition(state, point) {
238
253
  }
239
254
 
240
255
  // Step 2: If the closest line is within the proximity threshold, pick it.
241
- if (closestItem && closestDistance <= LINE_PROXIMITY_THRESHOLD) {
256
+ if (closestItem && closestDistance <= LINE_PROXIMITY_THRESHOLD && !series.series[closestItem.seriesId].area) {
242
257
  return closestItem;
243
258
  }
244
259
 
@@ -250,8 +265,8 @@ function getItemAtPosition(state, point) {
250
265
  for (let g = stackingGroups.length - 1; g >= 0; g -= 1) {
251
266
  const groupIds = stackingGroups[g].ids;
252
267
 
253
- // Iterate in reverse so the topmost stacked area is checked first.
254
- for (let i = groupIds.length - 1; i >= 0; i -= 1) {
268
+ // Iterate in direct order cause the `useAreaPlotData` is already doing a reverse order.
269
+ for (let i = 0; i < groupIds.length; i += 1) {
255
270
  const seriesId = groupIds[i];
256
271
  const seriesItem = series.series[seriesId];
257
272
  if (seriesItem.hidden || !seriesItem.area) {
@@ -281,12 +296,7 @@ function getItemAtPosition(state, point) {
281
296
  } = seriesItem;
282
297
 
283
298
  // Check for null gaps at bracket points.
284
- const leftIsNull = data[left] == null;
285
- const rightIsNull = data[right] == null;
286
- if (leftIsNull && rightIsNull) {
287
- continue;
288
- }
289
- if ((leftIsNull || rightIsNull) && !connectNulls) {
299
+ if ((data[left] == null || data[right] == null) && !connectNulls) {
290
300
  continue;
291
301
  }
292
302
  const xScale = xAxis.scale;
@@ -297,28 +307,6 @@ function getItemAtPosition(state, point) {
297
307
  continue;
298
308
  }
299
309
  const getPixelX = idx => xPosition(xData[idx]);
300
- if (left === right) {
301
- // Ordinal axis or pointer exactly on a data point.
302
- const stacked = visibleStackedData[left];
303
- if (!stacked) {
304
- continue;
305
- }
306
- const yBottom = getBaselinePixelY(baseline, yScale, stacked[0]);
307
- const yTop = yScale(stacked[1]);
308
- if ([yBottom, yTop].some(v => v == null || Number.isNaN(v))) {
309
- continue;
310
- }
311
- const yMin = Math.min(yBottom, yTop);
312
- const yMax = Math.max(yBottom, yTop);
313
- if (point.y >= yMin && point.y <= yMax) {
314
- return {
315
- type: 'line',
316
- seriesId,
317
- dataIndex: left
318
- };
319
- }
320
- continue;
321
- }
322
310
 
323
311
  // Build pixel-coordinate points for the top and bottom curves,
324
312
  // then evaluate them at the pointer's x using the actual d3 curve.
@@ -2,6 +2,7 @@ import { selectorChartXAxis, selectorChartYAxis } from "../../internals/plugins/
2
2
  import { selectorAllSeriesOfType } from "../../internals/seriesSelectorOfType.mjs";
3
3
  import { getAxisIndex } from "../../internals/plugins/featurePlugins/useChartCartesianAxis/getAxisValue.mjs";
4
4
  import { isOrdinalScale } from "../../internals/scaleGuards.mjs";
5
+ import { getAsNumber } from "../../internals/getAsNumber.mjs";
5
6
  import { getValueToPositionMapper } from "../../hooks/getValueToPositionMapper.mjs";
6
7
  import { evaluateCurveY } from "./curveEvaluation.mjs";
7
8
 
@@ -23,16 +24,22 @@ function getBracketIndices(xAxis, pointX) {
23
24
  if (index === -1) {
24
25
  return null;
25
26
  }
26
- return {
27
- left: index,
27
+ const axisPointValue = getValueToPositionMapper(xAxis.scale)(axisData[index]);
28
+ if (axisPointValue <= pointX) {
29
+ return index === axisData.length - 1 ? null : {
30
+ left: index,
31
+ right: index + 1
32
+ };
33
+ }
34
+ return index === 0 ? null : {
35
+ left: index - 1,
28
36
  right: index
29
37
  };
30
38
  }
31
39
 
32
40
  // For continuous axes, find the two adjacent data points surrounding pointX.
33
41
  const xValue = scale.invert(pointX);
34
- const xAsNumber = xValue instanceof Date ? xValue.getTime() : xValue;
35
- const getAsNumber = v => v instanceof Date ? v.getTime() : v;
42
+ const xAsNumber = getAsNumber(xValue);
36
43
 
37
44
  // Find the rightmost index where data[i] <= xValue.
38
45
  let leftIndex = -1;
@@ -48,7 +55,11 @@ function getBracketIndices(xAxis, pointX) {
48
55
  return null;
49
56
  }
50
57
  if (leftIndex === axisData.length - 1) {
51
- // Pointer is at or after the last data point — check if it's close enough.
58
+ if (getAsNumber(axisData[leftIndex]) < xAsNumber) {
59
+ // Pointer is strictly past the last data point — out of range.
60
+ return null;
61
+ }
62
+ // Pointer is exactly on the last data point.
52
63
  return {
53
64
  left: leftIndex,
54
65
  right: leftIndex
@@ -74,6 +85,7 @@ function getBaselinePixelY(baseline, yScale, stackedY0) {
74
85
  if (baseline === 'min') {
75
86
  return yScale.range()[0];
76
87
  }
88
+
77
89
  // Default: use the stacked baseline value.
78
90
  const value = yScale(stackedY0);
79
91
  if (Number.isNaN(value)) {
@@ -176,6 +188,9 @@ export default function getItemAtPosition(state, point) {
176
188
  connectNulls,
177
189
  curve
178
190
  } = seriesItem;
191
+ if (!connectNulls && (data[left] == null || data[right] == null)) {
192
+ continue;
193
+ }
179
194
  const dataIndex = getAxisIndex(xAxis, point.x);
180
195
  if (dataIndex === -1) {
181
196
  continue;
@@ -233,7 +248,7 @@ export default function getItemAtPosition(state, point) {
233
248
  }
234
249
 
235
250
  // Step 2: If the closest line is within the proximity threshold, pick it.
236
- if (closestItem && closestDistance <= LINE_PROXIMITY_THRESHOLD) {
251
+ if (closestItem && closestDistance <= LINE_PROXIMITY_THRESHOLD && !series.series[closestItem.seriesId].area) {
237
252
  return closestItem;
238
253
  }
239
254
 
@@ -245,8 +260,8 @@ export default function getItemAtPosition(state, point) {
245
260
  for (let g = stackingGroups.length - 1; g >= 0; g -= 1) {
246
261
  const groupIds = stackingGroups[g].ids;
247
262
 
248
- // Iterate in reverse so the topmost stacked area is checked first.
249
- for (let i = groupIds.length - 1; i >= 0; i -= 1) {
263
+ // Iterate in direct order cause the `useAreaPlotData` is already doing a reverse order.
264
+ for (let i = 0; i < groupIds.length; i += 1) {
250
265
  const seriesId = groupIds[i];
251
266
  const seriesItem = series.series[seriesId];
252
267
  if (seriesItem.hidden || !seriesItem.area) {
@@ -276,12 +291,7 @@ export default function getItemAtPosition(state, point) {
276
291
  } = seriesItem;
277
292
 
278
293
  // Check for null gaps at bracket points.
279
- const leftIsNull = data[left] == null;
280
- const rightIsNull = data[right] == null;
281
- if (leftIsNull && rightIsNull) {
282
- continue;
283
- }
284
- if ((leftIsNull || rightIsNull) && !connectNulls) {
294
+ if ((data[left] == null || data[right] == null) && !connectNulls) {
285
295
  continue;
286
296
  }
287
297
  const xScale = xAxis.scale;
@@ -292,28 +302,6 @@ export default function getItemAtPosition(state, point) {
292
302
  continue;
293
303
  }
294
304
  const getPixelX = idx => xPosition(xData[idx]);
295
- if (left === right) {
296
- // Ordinal axis or pointer exactly on a data point.
297
- const stacked = visibleStackedData[left];
298
- if (!stacked) {
299
- continue;
300
- }
301
- const yBottom = getBaselinePixelY(baseline, yScale, stacked[0]);
302
- const yTop = yScale(stacked[1]);
303
- if ([yBottom, yTop].some(v => v == null || Number.isNaN(v))) {
304
- continue;
305
- }
306
- const yMin = Math.min(yBottom, yTop);
307
- const yMax = Math.max(yBottom, yTop);
308
- if (point.y >= yMin && point.y <= yMax) {
309
- return {
310
- type: 'line',
311
- seriesId,
312
- dataIndex: left
313
- };
314
- }
315
- continue;
316
- }
317
305
 
318
306
  // Build pixel-coordinate points for the top and bottom curves,
319
307
  // then evaluate them at the pointer's x using the actual d3 curve.
@@ -6,10 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- const getSeriesWithDefaultValues = (seriesData, seriesIndex, colors) => {
10
- return (0, _extends2.default)({}, seriesData, {
11
- id: seriesData.id ?? `auto-generated-id-${seriesIndex}`,
12
- color: seriesData.color ?? colors[seriesIndex % colors.length]
13
- });
14
- };
9
+ const getSeriesWithDefaultValues = (seriesData, seriesIndex, colors) => (0, _extends2.default)({}, seriesData, {
10
+ id: seriesData.id ?? `auto-generated-id-${seriesIndex}`,
11
+ color: seriesData.color ?? colors[seriesIndex % colors.length]
12
+ });
15
13
  var _default = exports.default = getSeriesWithDefaultValues;
@@ -1,8 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- const getSeriesWithDefaultValues = (seriesData, seriesIndex, colors) => {
3
- return _extends({}, seriesData, {
4
- id: seriesData.id ?? `auto-generated-id-${seriesIndex}`,
5
- color: seriesData.color ?? colors[seriesIndex % colors.length]
6
- });
7
- };
2
+ const getSeriesWithDefaultValues = (seriesData, seriesIndex, colors) => _extends({}, seriesData, {
3
+ id: seriesData.id ?? `auto-generated-id-${seriesIndex}`,
4
+ color: seriesData.color ?? colors[seriesIndex % colors.length]
5
+ });
8
6
  export default getSeriesWithDefaultValues;
@@ -1,3 +1,5 @@
1
- import { type SeriesProcessor } from "../../internals/plugins/corePlugins/useChartSeriesConfig/index.mjs";
2
- declare const seriesProcessor: SeriesProcessor<'line'>;
1
+ import { type DatasetType } from "../../models/seriesType/config.mjs";
2
+ import type { SeriesProcessorParams, SeriesProcessorResult } from "../../internals/plugins/corePlugins/useChartSeriesConfig/index.mjs";
3
+ import type { IsItemVisibleFunction } from "../../internals/plugins/featurePlugins/useChartVisibilityManager/index.mjs";
4
+ declare function seriesProcessor(params: SeriesProcessorParams<'line'>, dataset?: Readonly<DatasetType>, isItemVisible?: IsItemVisibleFunction): SeriesProcessorResult<'line'>;
3
5
  export default seriesProcessor;
@@ -1,3 +1,5 @@
1
- import { type SeriesProcessor } from "../../internals/plugins/corePlugins/useChartSeriesConfig/index.js";
2
- declare const seriesProcessor: SeriesProcessor<'line'>;
1
+ import { type DatasetType } from "../../models/seriesType/config.js";
2
+ import type { SeriesProcessorParams, SeriesProcessorResult } from "../../internals/plugins/corePlugins/useChartSeriesConfig/index.js";
3
+ import type { IsItemVisibleFunction } from "../../internals/plugins/featurePlugins/useChartVisibilityManager/index.js";
4
+ declare function seriesProcessor(params: SeriesProcessorParams<'line'>, dataset?: Readonly<DatasetType>, isItemVisible?: IsItemVisibleFunction): SeriesProcessorResult<'line'>;
3
5
  export default seriesProcessor;
@@ -12,7 +12,7 @@ var _warning = require("@mui/x-internals/warning");
12
12
  var _stacking = require("../../internals/stacking");
13
13
  const defaultShapes = ['circle', 'square', 'diamond', 'cross', 'star', 'triangle', 'wye'];
14
14
  const lineValueFormatter = v => v == null ? '' : v.toLocaleString();
15
- const seriesProcessor = (params, dataset, isItemVisible) => {
15
+ function seriesProcessor(params, dataset, isItemVisible) {
16
16
  const {
17
17
  seriesOrder,
18
18
  series
@@ -138,5 +138,5 @@ Line plots only support numeric and null values.`);
138
138
  stackingGroups,
139
139
  series: completedSeries
140
140
  };
141
- };
141
+ }
142
142
  var _default = exports.default = seriesProcessor;
@@ -5,7 +5,7 @@ import { warnOnce } from '@mui/x-internals/warning';
5
5
  import { getStackingGroups } from "../../internals/stacking/index.mjs";
6
6
  const defaultShapes = ['circle', 'square', 'diamond', 'cross', 'star', 'triangle', 'wye'];
7
7
  const lineValueFormatter = v => v == null ? '' : v.toLocaleString();
8
- const seriesProcessor = (params, dataset, isItemVisible) => {
8
+ function seriesProcessor(params, dataset, isItemVisible) {
9
9
  const {
10
10
  seriesOrder,
11
11
  series
@@ -131,5 +131,5 @@ Line plots only support numeric and null values.`);
131
131
  stackingGroups,
132
132
  series: completedSeries
133
133
  };
134
- };
134
+ }
135
135
  export default seriesProcessor;
@@ -38,6 +38,9 @@ function FocusedPieArc(props) {
38
38
  return null;
39
39
  }
40
40
  const item = series.data[focusedItem.dataIndex];
41
+ if (!item || item.hidden) {
42
+ return null;
43
+ }
41
44
  const _getModifiedArcProper = (0, _getModifiedArcProperties.getModifiedArcProperties)(series, pieSeriesLayout[focusedItem.seriesId], isHighlighted, isFaded),
42
45
  arcSizes = (0, _objectWithoutPropertiesLoose2.default)(_getModifiedArcProper, _excluded);
43
46
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PieArc.PieArc, (0, _extends2.default)({
@@ -32,6 +32,9 @@ export function FocusedPieArc(props) {
32
32
  return null;
33
33
  }
34
34
  const item = series.data[focusedItem.dataIndex];
35
+ if (!item || item.hidden) {
36
+ return null;
37
+ }
35
38
  const _getModifiedArcProper = getModifiedArcProperties(series, pieSeriesLayout[focusedItem.seriesId], isHighlighted, isFaded),
36
39
  arcSizes = _objectWithoutPropertiesLoose(_getModifiedArcProper, _excluded);
37
40
  return /*#__PURE__*/_jsx(PieArc, _extends({
@@ -20,6 +20,9 @@ function FocusedRadarMark(props) {
20
20
  if (!focusedItem || focusedItem.type !== 'radar' || seriesCoordinates.length === 0) {
21
21
  return null;
22
22
  }
23
+ if (seriesCoordinates[0].hidden) {
24
+ return null;
25
+ }
23
26
  const point = seriesCoordinates[0].points[focusedItem.dataIndex];
24
27
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("rect", (0, _extends2.default)({
25
28
  fill: "none",
@@ -13,6 +13,9 @@ export function FocusedRadarMark(props) {
13
13
  if (!focusedItem || focusedItem.type !== 'radar' || seriesCoordinates.length === 0) {
14
14
  return null;
15
15
  }
16
+ if (seriesCoordinates[0].hidden) {
17
+ return null;
18
+ }
16
19
  const point = seriesCoordinates[0].points[focusedItem.dataIndex];
17
20
  return /*#__PURE__*/_jsx("rect", _extends({
18
21
  fill: "none",
@@ -19,14 +19,14 @@ export declare function useRadarSeriesData(querySeriesId?: SeriesId): {
19
19
  }[];
20
20
  hidden: boolean;
21
21
  type: "radar";
22
- label?: string | ((location: "tooltip" | "legend") => string) | undefined;
23
22
  highlightScope?: import("../../internals/index.mjs").CommonHighlightScope | undefined;
24
23
  labelMarkType?: import("../../internals/index.mjs").ChartsLabelMarkType | undefined;
25
24
  colorGetter?: ((data: import("../../internals/index.mjs").ColorCallbackValue<number>) => string) | undefined;
25
+ label?: string | ((location: "tooltip" | "legend") => string) | undefined;
26
26
  hideMark?: boolean | undefined;
27
27
  fillArea?: boolean | undefined;
28
- data: number[];
29
28
  id: SeriesId;
30
29
  valueFormatter: import("../../internals/index.mjs").SeriesValueFormatter<number>;
31
30
  color: string;
31
+ data: number[];
32
32
  }[];
@@ -19,14 +19,14 @@ export declare function useRadarSeriesData(querySeriesId?: SeriesId): {
19
19
  }[];
20
20
  hidden: boolean;
21
21
  type: "radar";
22
- label?: string | ((location: "tooltip" | "legend") => string) | undefined;
23
22
  highlightScope?: import("../../internals/index.js").CommonHighlightScope | undefined;
24
23
  labelMarkType?: import("../../internals/index.js").ChartsLabelMarkType | undefined;
25
24
  colorGetter?: ((data: import("../../internals/index.js").ColorCallbackValue<number>) => string) | undefined;
25
+ label?: string | ((location: "tooltip" | "legend") => string) | undefined;
26
26
  hideMark?: boolean | undefined;
27
27
  fillArea?: boolean | undefined;
28
- data: number[];
29
28
  id: SeriesId;
30
29
  valueFormatter: import("../../internals/index.js").SeriesValueFormatter<number>;
31
30
  color: string;
31
+ data: number[];
32
32
  }[];
@@ -38,6 +38,9 @@ function FocusedScatterMark(_ref) {
38
38
  return null;
39
39
  }
40
40
  const series = scatterSeries?.series[focusedItem.seriesId];
41
+ if (!series || series.hidden) {
42
+ return null;
43
+ }
41
44
  const xAxisId = series.xAxisId ?? xAxisIds[0];
42
45
  const yAxisId = series.yAxisId ?? yAxisIds[0];
43
46
  const getXPosition = (0, _hooks.getValueToPositionMapper)(xAxis[xAxisId].scale);
@@ -31,6 +31,9 @@ export function FocusedScatterMark(_ref) {
31
31
  return null;
32
32
  }
33
33
  const series = scatterSeries?.series[focusedItem.seriesId];
34
+ if (!series || series.hidden) {
35
+ return null;
36
+ }
34
37
  const xAxisId = series.xAxisId ?? xAxisIds[0];
35
38
  const yAxisId = series.yAxisId ?? yAxisIds[0];
36
39
  const getXPosition = getValueToPositionMapper(xAxis[xAxisId].scale);
@@ -87,7 +87,7 @@ export declare function useYAxis<T extends keyof AxisScaleConfig>(axisId?: AxisI
87
87
  * @see `useRotationAxis` for accessing a single rotation axis
88
88
  */
89
89
  export declare function useRotationAxes(): {
90
- rotationAxis: import("../internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.mjs").DefaultizedAxisConfig<ChartsRotationAxisProps>;
90
+ rotationAxis: import("../internals/index.mjs").ComputedAxisConfig<ChartsRotationAxisProps>;
91
91
  rotationAxisIds: string[];
92
92
  };
93
93
  /**
@@ -106,7 +106,7 @@ export declare function useRotationAxes(): {
106
106
  * @see `useRadiusAxis` for accessing a single radius axis
107
107
  */
108
108
  export declare function useRadiusAxes(): {
109
- radiusAxis: import("../internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.mjs").DefaultizedAxisConfig<ChartsRadiusAxisProps>;
109
+ radiusAxis: import("../internals/index.mjs").ComputedAxisConfig<ChartsRadiusAxisProps>;
110
110
  radiusAxisIds: string[];
111
111
  };
112
112
  /**
@@ -87,7 +87,7 @@ export declare function useYAxis<T extends keyof AxisScaleConfig>(axisId?: AxisI
87
87
  * @see `useRotationAxis` for accessing a single rotation axis
88
88
  */
89
89
  export declare function useRotationAxes(): {
90
- rotationAxis: import("../internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.js").DefaultizedAxisConfig<ChartsRotationAxisProps>;
90
+ rotationAxis: import("../internals/index.js").ComputedAxisConfig<ChartsRotationAxisProps>;
91
91
  rotationAxisIds: string[];
92
92
  };
93
93
  /**
@@ -106,7 +106,7 @@ export declare function useRotationAxes(): {
106
106
  * @see `useRadiusAxis` for accessing a single radius axis
107
107
  */
108
108
  export declare function useRadiusAxes(): {
109
- radiusAxis: import("../internals/plugins/featurePlugins/useChartPolarAxis/computeAxisValue.js").DefaultizedAxisConfig<ChartsRadiusAxisProps>;
109
+ radiusAxis: import("../internals/index.js").ComputedAxisConfig<ChartsRadiusAxisProps>;
110
110
  radiusAxisIds: string[];
111
111
  };
112
112
  /**