@mui/x-charts 9.0.0-alpha.4 → 9.0.0-beta.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 (242) hide show
  1. package/BarChart/BarChart.js +19 -28
  2. package/BarChart/BarChart.mjs +19 -28
  3. package/BarChart/BarElement.js +3 -5
  4. package/BarChart/BarElement.mjs +3 -5
  5. package/BarChart/BarLabel/BarLabelPlot.d.mts +0 -2
  6. package/BarChart/BarLabel/BarLabelPlot.d.ts +0 -2
  7. package/BarChart/BarLabel/BarLabelPlot.js +2 -3
  8. package/BarChart/BarLabel/BarLabelPlot.mjs +2 -3
  9. package/BarChart/BarPlot.d.mts +2 -12
  10. package/BarChart/BarPlot.d.ts +2 -12
  11. package/BarChart/BarPlot.js +4 -18
  12. package/BarChart/BarPlot.mjs +4 -18
  13. package/BarChart/BatchBarPlot/BatchBarPlot.js +0 -27
  14. package/BarChart/BatchBarPlot/BatchBarPlot.mjs +0 -27
  15. package/BarChart/IndividualBarPlot.d.mts +1 -2
  16. package/BarChart/IndividualBarPlot.d.ts +1 -2
  17. package/BarChart/IndividualBarPlot.js +5 -10
  18. package/BarChart/IndividualBarPlot.mjs +5 -10
  19. package/BarChart/seriesConfig/bar/descriptionGetter.d.mts +3 -0
  20. package/BarChart/seriesConfig/bar/descriptionGetter.d.ts +3 -0
  21. package/BarChart/seriesConfig/bar/descriptionGetter.js +36 -0
  22. package/BarChart/seriesConfig/bar/descriptionGetter.mjs +30 -0
  23. package/BarChart/seriesConfig/index.js +5 -1
  24. package/BarChart/seriesConfig/index.mjs +5 -1
  25. package/BarChart/useBarChartProps.js +2 -4
  26. package/BarChart/useBarChartProps.mjs +2 -4
  27. package/CHANGELOG.md +107 -1
  28. package/ChartsContainer/ChartsContainer.js +29 -29
  29. package/ChartsContainer/ChartsContainer.mjs +29 -29
  30. package/ChartsLayerContainer/ChartsLayerContainer.js +6 -2
  31. package/ChartsLayerContainer/ChartsLayerContainer.mjs +7 -2
  32. package/ChartsSvgLayer/ChartsSvgLayer.js +2 -2
  33. package/ChartsSvgLayer/ChartsSvgLayer.mjs +2 -2
  34. package/ChartsXAxis/ChartsGroupedXAxisTicks.js +12 -3
  35. package/ChartsXAxis/ChartsGroupedXAxisTicks.mjs +12 -3
  36. package/ChartsXAxis/useAxisTicksProps.d.mts +89 -89
  37. package/ChartsXAxis/useAxisTicksProps.d.ts +89 -89
  38. package/ChartsYAxis/ChartsGroupedYAxisTicks.js +12 -3
  39. package/ChartsYAxis/ChartsGroupedYAxisTicks.mjs +12 -3
  40. package/ChartsYAxis/useAxisTicksProps.d.mts +89 -89
  41. package/ChartsYAxis/useAxisTicksProps.d.ts +89 -89
  42. package/Gauge/Gauge.js +0 -4
  43. package/Gauge/Gauge.mjs +0 -4
  44. package/Gauge/GaugeContainer.d.mts +1 -1
  45. package/Gauge/GaugeContainer.d.ts +1 -1
  46. package/Gauge/GaugeContainer.js +0 -4
  47. package/Gauge/GaugeContainer.mjs +0 -4
  48. package/LineChart/AreaElement.js +5 -1
  49. package/LineChart/AreaElement.mjs +5 -1
  50. package/LineChart/CircleMarkElement.js +8 -5
  51. package/LineChart/CircleMarkElement.mjs +8 -5
  52. package/LineChart/LineChart.js +21 -19
  53. package/LineChart/LineChart.mjs +21 -19
  54. package/LineChart/LineElement.js +5 -1
  55. package/LineChart/LineElement.mjs +5 -1
  56. package/LineChart/MarkElement.js +7 -4
  57. package/LineChart/MarkElement.mjs +7 -4
  58. package/LineChart/seriesConfig/curveEvaluation.d.mts +11 -0
  59. package/LineChart/seriesConfig/curveEvaluation.d.ts +11 -0
  60. package/LineChart/seriesConfig/curveEvaluation.js +134 -0
  61. package/LineChart/seriesConfig/curveEvaluation.mjs +129 -0
  62. package/LineChart/seriesConfig/descriptionGetter.d.mts +3 -0
  63. package/LineChart/seriesConfig/descriptionGetter.d.ts +3 -0
  64. package/LineChart/seriesConfig/descriptionGetter.js +37 -0
  65. package/LineChart/seriesConfig/descriptionGetter.mjs +31 -0
  66. package/LineChart/seriesConfig/getItemAtPosition.d.mts +7 -0
  67. package/LineChart/seriesConfig/getItemAtPosition.d.ts +7 -0
  68. package/LineChart/seriesConfig/getItemAtPosition.js +356 -0
  69. package/LineChart/seriesConfig/getItemAtPosition.mjs +351 -0
  70. package/LineChart/seriesConfig/index.js +4 -0
  71. package/LineChart/seriesConfig/index.mjs +4 -0
  72. package/PieChart/PieArc.js +2 -3
  73. package/PieChart/PieArc.mjs +2 -3
  74. package/PieChart/seriesConfig/descriptionGetter.d.mts +3 -0
  75. package/PieChart/seriesConfig/descriptionGetter.d.ts +3 -0
  76. package/PieChart/seriesConfig/descriptionGetter.js +26 -0
  77. package/PieChart/seriesConfig/descriptionGetter.mjs +20 -0
  78. package/PieChart/seriesConfig/index.js +2 -0
  79. package/PieChart/seriesConfig/index.mjs +2 -0
  80. package/RadarChart/seriesConfig/descriptionGetter.d.mts +3 -0
  81. package/RadarChart/seriesConfig/descriptionGetter.d.ts +3 -0
  82. package/RadarChart/seriesConfig/descriptionGetter.js +37 -0
  83. package/RadarChart/seriesConfig/descriptionGetter.mjs +31 -0
  84. package/RadarChart/seriesConfig/index.js +2 -0
  85. package/RadarChart/seriesConfig/index.mjs +2 -0
  86. package/ScatterChart/ScatterChart.js +18 -18
  87. package/ScatterChart/ScatterChart.mjs +18 -18
  88. package/ScatterChart/seriesConfig/descriptionGetter.d.mts +3 -0
  89. package/ScatterChart/seriesConfig/descriptionGetter.d.ts +3 -0
  90. package/ScatterChart/seriesConfig/descriptionGetter.js +34 -0
  91. package/ScatterChart/seriesConfig/descriptionGetter.mjs +28 -0
  92. package/ScatterChart/seriesConfig/index.js +2 -0
  93. package/ScatterChart/seriesConfig/index.mjs +2 -0
  94. package/SparkLineChart/SparkLineChart.js +21 -19
  95. package/SparkLineChart/SparkLineChart.mjs +21 -19
  96. package/constants/index.js +0 -2
  97. package/constants/index.mjs +0 -2
  98. package/hooks/useInteractionItemProps.d.mts +1 -1
  99. package/hooks/useInteractionItemProps.d.ts +1 -1
  100. package/hooks/useInteractionItemProps.js +3 -3
  101. package/hooks/useInteractionItemProps.mjs +3 -3
  102. package/index.js +1 -1
  103. package/index.mjs +1 -1
  104. package/internals/components/ChartsAccessibilityProxy/ChartsAccessibilityProxy.d.mts +5 -0
  105. package/internals/components/ChartsAccessibilityProxy/ChartsAccessibilityProxy.d.ts +5 -0
  106. package/internals/components/ChartsAccessibilityProxy/ChartsAccessibilityProxy.js +100 -0
  107. package/internals/components/ChartsAccessibilityProxy/ChartsAccessibilityProxy.mjs +96 -0
  108. package/internals/components/ChartsAccessibilityProxy/index.d.mts +1 -0
  109. package/internals/components/ChartsAccessibilityProxy/index.d.ts +1 -0
  110. package/internals/components/ChartsAccessibilityProxy/index.js +16 -0
  111. package/internals/components/ChartsAccessibilityProxy/index.mjs +1 -0
  112. package/internals/components/ChartsAccessibilityProxy/useDescription.d.mts +5 -0
  113. package/internals/components/ChartsAccessibilityProxy/useDescription.d.ts +5 -0
  114. package/internals/components/ChartsAccessibilityProxy/useDescription.js +71 -0
  115. package/internals/components/ChartsAccessibilityProxy/useDescription.mjs +66 -0
  116. package/internals/getChartPoint.js +18 -1
  117. package/internals/getChartPoint.mjs +18 -1
  118. package/internals/plugins/corePlugins/corePlugins.d.mts +2 -2
  119. package/internals/plugins/corePlugins/corePlugins.d.ts +2 -2
  120. package/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.d.mts +2 -1
  121. package/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.d.ts +2 -1
  122. package/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.selectors.d.mts +2 -1
  123. package/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.selectors.d.ts +2 -1
  124. package/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.types.d.mts +22 -7
  125. package/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.types.d.ts +22 -7
  126. package/internals/plugins/corePlugins/useChartSeries/index.d.mts +2 -1
  127. package/internals/plugins/corePlugins/useChartSeries/index.d.ts +2 -1
  128. package/internals/plugins/corePlugins/useChartSeries/index.js +12 -0
  129. package/internals/plugins/corePlugins/useChartSeries/index.mjs +2 -1
  130. package/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.d.mts +1 -8
  131. package/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.d.ts +1 -8
  132. package/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.js +1 -11
  133. package/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.mjs +1 -11
  134. package/internals/plugins/corePlugins/useChartSeries/useChartSeriesLayout.selectors.d.mts +8 -0
  135. package/internals/plugins/corePlugins/useChartSeries/useChartSeriesLayout.selectors.d.ts +8 -0
  136. package/internals/plugins/corePlugins/useChartSeries/useChartSeriesLayout.selectors.js +19 -0
  137. package/internals/plugins/corePlugins/useChartSeries/useChartSeriesLayout.selectors.mjs +14 -0
  138. package/internals/plugins/corePlugins/useChartSeriesConfig/types/descriptionGetter.types.d.mts +5 -0
  139. package/internals/plugins/corePlugins/useChartSeriesConfig/types/descriptionGetter.types.d.ts +5 -0
  140. package/internals/plugins/corePlugins/useChartSeriesConfig/types/descriptionGetter.types.js +5 -0
  141. package/internals/plugins/corePlugins/useChartSeriesConfig/types/descriptionGetter.types.mjs +1 -0
  142. package/internals/plugins/corePlugins/useChartSeriesConfig/types/index.d.mts +1 -0
  143. package/internals/plugins/corePlugins/useChartSeriesConfig/types/index.d.ts +1 -0
  144. package/internals/plugins/corePlugins/useChartSeriesConfig/types/index.js +11 -0
  145. package/internals/plugins/corePlugins/useChartSeriesConfig/types/index.mjs +1 -0
  146. package/internals/plugins/corePlugins/useChartSeriesConfig/types/seriesConfig.types.d.mts +2 -0
  147. package/internals/plugins/corePlugins/useChartSeriesConfig/types/seriesConfig.types.d.ts +2 -0
  148. package/internals/plugins/featurePlugins/shared/useRegisterPointerInteractions.d.mts +4 -10
  149. package/internals/plugins/featurePlugins/shared/useRegisterPointerInteractions.d.ts +4 -10
  150. package/internals/plugins/featurePlugins/shared/useRegisterPointerInteractions.js +28 -19
  151. package/internals/plugins/featurePlugins/shared/useRegisterPointerInteractions.mjs +28 -18
  152. package/internals/plugins/featurePlugins/useChartCartesianAxis/autoSizeConstants.d.mts +5 -0
  153. package/internals/plugins/featurePlugins/useChartCartesianAxis/autoSizeConstants.d.ts +5 -0
  154. package/internals/plugins/featurePlugins/useChartCartesianAxis/autoSizeConstants.js +11 -0
  155. package/internals/plugins/featurePlugins/useChartCartesianAxis/autoSizeConstants.mjs +5 -0
  156. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisAutoSize.d.mts +33 -0
  157. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisAutoSize.d.ts +33 -0
  158. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisAutoSize.js +318 -0
  159. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisAutoSize.mjs +311 -0
  160. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.d.mts +5 -1
  161. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.d.ts +5 -1
  162. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.js +63 -8
  163. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.mjs +62 -8
  164. package/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeAxis.js +12 -4
  165. package/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeAxis.mjs +12 -4
  166. package/internals/plugins/featurePlugins/useChartCartesianAxis/domain.d.mts +12 -2
  167. package/internals/plugins/featurePlugins/useChartCartesianAxis/domain.d.ts +12 -2
  168. package/internals/plugins/featurePlugins/useChartCartesianAxis/domain.js +28 -0
  169. package/internals/plugins/featurePlugins/useChartCartesianAxis/domain.mjs +27 -0
  170. package/internals/plugins/featurePlugins/useChartCartesianAxis/index.d.mts +3 -1
  171. package/internals/plugins/featurePlugins/useChartCartesianAxis/index.d.ts +3 -1
  172. package/internals/plugins/featurePlugins/useChartCartesianAxis/index.js +22 -2
  173. package/internals/plugins/featurePlugins/useChartCartesianAxis/index.mjs +3 -1
  174. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisAutoSize.selectors.d.mts +30 -0
  175. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisAutoSize.selectors.d.ts +30 -0
  176. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisAutoSize.selectors.js +96 -0
  177. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisAutoSize.selectors.mjs +91 -0
  178. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisDomains.selectors.d.mts +16 -0
  179. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisDomains.selectors.d.ts +16 -0
  180. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisDomains.selectors.js +36 -0
  181. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisDomains.selectors.mjs +31 -0
  182. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisExtrema.selectors.d.mts +15 -0
  183. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisExtrema.selectors.d.ts +15 -0
  184. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisExtrema.selectors.js +45 -0
  185. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisExtrema.selectors.mjs +39 -0
  186. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisSize.selectors.d.mts +11 -0
  187. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisSize.selectors.d.ts +11 -0
  188. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisSize.selectors.js +53 -11
  189. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartAxisSize.selectors.mjs +52 -11
  190. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors.d.mts +4 -9
  191. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors.d.ts +4 -9
  192. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors.js +16 -40
  193. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors.mjs +19 -43
  194. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianTooltip.selectors.js +20 -2
  195. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianTooltip.selectors.mjs +20 -2
  196. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.js +36 -30
  197. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.mjs +36 -30
  198. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.selectors.d.mts +8 -0
  199. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.selectors.d.ts +8 -0
  200. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.selectors.js +9 -2
  201. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.selectors.mjs +9 -2
  202. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.types.d.mts +6 -0
  203. package/internals/plugins/featurePlugins/useChartKeyboardNavigation/useChartKeyboardNavigation.types.d.ts +6 -0
  204. package/internals/store/useCharts.d.mts +1 -1
  205. package/internals/store/useCharts.d.ts +1 -1
  206. package/locales/elGR.d.mts +76 -0
  207. package/locales/elGR.d.ts +76 -0
  208. package/locales/elGR.js +89 -0
  209. package/locales/elGR.mjs +89 -0
  210. package/locales/enUS.d.mts +76 -0
  211. package/locales/enUS.d.ts +76 -0
  212. package/locales/enUS.js +89 -1
  213. package/locales/enUS.mjs +89 -1
  214. package/locales/frFR.d.mts +76 -0
  215. package/locales/frFR.d.ts +76 -0
  216. package/locales/frFR.js +89 -0
  217. package/locales/frFR.mjs +89 -0
  218. package/locales/nbNO.d.mts +76 -0
  219. package/locales/nbNO.d.ts +76 -0
  220. package/locales/nbNO.js +89 -0
  221. package/locales/nbNO.mjs +89 -0
  222. package/locales/ptBR.d.mts +76 -0
  223. package/locales/ptBR.d.ts +76 -0
  224. package/locales/ptBR.js +89 -0
  225. package/locales/ptBR.mjs +89 -0
  226. package/locales/ptPT.d.mts +76 -0
  227. package/locales/ptPT.d.ts +76 -0
  228. package/locales/ptPT.js +89 -0
  229. package/locales/ptPT.mjs +89 -0
  230. package/locales/svSE.d.mts +76 -0
  231. package/locales/svSE.d.ts +76 -0
  232. package/locales/svSE.js +89 -0
  233. package/locales/svSE.mjs +89 -0
  234. package/locales/utils/chartsLocaleTextApi.d.mts +189 -0
  235. package/locales/utils/chartsLocaleTextApi.d.ts +189 -0
  236. package/locales/utils/getChartsLocalization.d.mts +76 -0
  237. package/locales/utils/getChartsLocalization.d.ts +76 -0
  238. package/models/axis.d.mts +11 -5
  239. package/models/axis.d.ts +11 -5
  240. package/models/seriesType/config.d.mts +29 -0
  241. package/models/seriesType/config.d.ts +29 -0
  242. package/package.json +85 -85
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = getItemAtPosition;
7
+ var _useChartCartesianAxisRendering = require("../../internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors");
8
+ var _seriesSelectorOfType = require("../../internals/seriesSelectorOfType");
9
+ var _getAxisValue = require("../../internals/plugins/featurePlugins/useChartCartesianAxis/getAxisValue");
10
+ var _scaleGuards = require("../../internals/scaleGuards");
11
+ var _getValueToPositionMapper = require("../../hooks/getValueToPositionMapper");
12
+ var _curveEvaluation = require("./curveEvaluation");
13
+ /**
14
+ * For a continuous x-axis, find the two data indices that bracket the pointer's x position.
15
+ * For ordinal axes, returns the single matching index (left === right).
16
+ * Returns null if the pointer is outside the data range.
17
+ */
18
+ function getBracketIndices(xAxis, pointX) {
19
+ const {
20
+ scale,
21
+ data: axisData
22
+ } = xAxis;
23
+ if (!axisData || axisData.length === 0) {
24
+ return null;
25
+ }
26
+ if ((0, _scaleGuards.isOrdinalScale)(scale)) {
27
+ const index = (0, _getAxisValue.getAxisIndex)(xAxis, pointX);
28
+ if (index === -1) {
29
+ return null;
30
+ }
31
+ return {
32
+ left: index,
33
+ right: index
34
+ };
35
+ }
36
+
37
+ // For continuous axes, find the two adjacent data points surrounding pointX.
38
+ const xValue = scale.invert(pointX);
39
+ const xAsNumber = xValue instanceof Date ? xValue.getTime() : xValue;
40
+ const getAsNumber = v => v instanceof Date ? v.getTime() : v;
41
+
42
+ // Find the rightmost index where data[i] <= xValue.
43
+ let leftIndex = -1;
44
+ for (let i = 0; i < axisData.length; i += 1) {
45
+ if (getAsNumber(axisData[i]) <= xAsNumber) {
46
+ leftIndex = i;
47
+ } else {
48
+ break;
49
+ }
50
+ }
51
+ if (leftIndex === -1) {
52
+ // Pointer is before the first data point.
53
+ return null;
54
+ }
55
+ if (leftIndex === axisData.length - 1) {
56
+ // Pointer is at or after the last data point — check if it's close enough.
57
+ return {
58
+ left: leftIndex,
59
+ right: leftIndex
60
+ };
61
+ }
62
+ return {
63
+ left: leftIndex,
64
+ right: leftIndex + 1
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Compute the pixel y0 (baseline) for a given data point,
70
+ * replicating the logic from useAreaPlotData.
71
+ */
72
+ function getBaselinePixelY(baseline, yScale, stackedY0) {
73
+ if (typeof baseline === 'number') {
74
+ return yScale(baseline);
75
+ }
76
+ if (baseline === 'max') {
77
+ return yScale.range()[1];
78
+ }
79
+ if (baseline === 'min') {
80
+ return yScale.range()[0];
81
+ }
82
+ // Default: use the stacked baseline value.
83
+ const value = yScale(stackedY0);
84
+ if (Number.isNaN(value)) {
85
+ return yScale.range()[0];
86
+ }
87
+ return value;
88
+ }
89
+
90
+ // Collect the pixel-coordinate points for a contiguous (non-null) segment
91
+ // of a series that contains the bracket indices.
92
+ //
93
+ // When connectNulls is true, all non-null points are returned.
94
+ // When connectNulls is false, only the contiguous run containing [left, right] is returned.
95
+ function collectCurvePoints(data, getPixelX, getPixelY, left, right, connectNulls) {
96
+ const points = [];
97
+ if (connectNulls) {
98
+ // All non-null points form one continuous curve.
99
+ for (let i = 0; i < data.length; i += 1) {
100
+ if (data[i] != null) {
101
+ const y = getPixelY(i);
102
+ if (y != null && !Number.isNaN(y)) {
103
+ points.push({
104
+ x: getPixelX(i),
105
+ y
106
+ });
107
+ }
108
+ }
109
+ }
110
+ return points;
111
+ }
112
+
113
+ // Find the contiguous non-null run containing [left, right].
114
+ let start = left;
115
+ while (start > 0 && data[start - 1] != null) {
116
+ start -= 1;
117
+ }
118
+ let end = right;
119
+ while (end < data.length - 1 && data[end + 1] != null) {
120
+ end += 1;
121
+ }
122
+ for (let i = start; i <= end; i += 1) {
123
+ const y = getPixelY(i);
124
+ if (y != null && !Number.isNaN(y)) {
125
+ points.push({
126
+ x: getPixelX(i),
127
+ y
128
+ });
129
+ }
130
+ }
131
+ return points;
132
+ }
133
+
134
+ /**
135
+ * The maximum pixel distance from a line curve at which the line is still
136
+ * considered "close enough" to be selected over an area.
137
+ */
138
+ const LINE_PROXIMITY_THRESHOLD = 15;
139
+ function getItemAtPosition(state, point) {
140
+ if (!state.experimentalFeatures?.enablePositionBasedPointerInteraction) {
141
+ return undefined;
142
+ }
143
+ const {
144
+ axis: xAxes,
145
+ axisIds: xAxisIds
146
+ } = (0, _useChartCartesianAxisRendering.selectorChartXAxis)(state);
147
+ const {
148
+ axis: yAxes,
149
+ axisIds: yAxisIds
150
+ } = (0, _useChartCartesianAxisRendering.selectorChartYAxis)(state);
151
+ const series = (0, _seriesSelectorOfType.selectorAllSeriesOfType)(state, 'line');
152
+ if (!series || series.seriesOrder.length === 0) {
153
+ return undefined;
154
+ }
155
+ const defaultXAxisId = xAxisIds[0];
156
+ const defaultYAxisId = yAxisIds[0];
157
+
158
+ // Step 1: Find the closest line (curve) across all series.
159
+ let closestDistance = Infinity;
160
+ let closestItem;
161
+ for (const seriesId of series.seriesOrder) {
162
+ const seriesItem = series.series[seriesId];
163
+ if (seriesItem.hidden) {
164
+ continue;
165
+ }
166
+ const xAxisId = seriesItem.xAxisId ?? defaultXAxisId;
167
+ const yAxisId = seriesItem.yAxisId ?? defaultYAxisId;
168
+ const xAxis = xAxes[xAxisId];
169
+ const yAxis = yAxes[yAxisId];
170
+ const bracket = getBracketIndices(xAxis, point.x);
171
+ if (!bracket) {
172
+ continue;
173
+ }
174
+ const {
175
+ left,
176
+ right
177
+ } = bracket;
178
+ const {
179
+ visibleStackedData,
180
+ data,
181
+ connectNulls,
182
+ curve
183
+ } = seriesItem;
184
+ const dataIndex = (0, _getAxisValue.getAxisIndex)(xAxis, point.x);
185
+ if (dataIndex === -1) {
186
+ continue;
187
+ }
188
+
189
+ // For ordinal or pointer exactly on a data point, use the data point directly.
190
+ if (left === right) {
191
+ const yValue = visibleStackedData[left]?.[1];
192
+ if (yValue == null) {
193
+ continue;
194
+ }
195
+ const yPosition = yAxis.scale(yValue);
196
+ if (yPosition == null) {
197
+ continue;
198
+ }
199
+ const distance = Math.abs(point.y - yPosition);
200
+ if (distance < closestDistance) {
201
+ closestDistance = distance;
202
+ closestItem = {
203
+ type: 'line',
204
+ seriesId,
205
+ dataIndex
206
+ };
207
+ }
208
+ continue;
209
+ }
210
+
211
+ // Evaluate the actual curve at the pointer's x for precise distance.
212
+ const xData = xAxis.data;
213
+ if (!xData) {
214
+ continue;
215
+ }
216
+ const xPosition = (0, _getValueToPositionMapper.getValueToPositionMapper)(xAxis.scale);
217
+ const getPixelX = idx => xPosition(xData[idx]);
218
+ const curvePoints = collectCurvePoints(data, getPixelX, idx => {
219
+ const stacked = visibleStackedData[idx];
220
+ return stacked ? yAxis.scale(stacked[1]) : null;
221
+ }, left, right, connectNulls);
222
+ if (curvePoints.length < 2) {
223
+ continue;
224
+ }
225
+ const yPosition = (0, _curveEvaluation.evaluateCurveY)(curvePoints, point.x, curve);
226
+ if (yPosition == null) {
227
+ continue;
228
+ }
229
+ const distance = Math.abs(point.y - yPosition);
230
+ if (distance < closestDistance) {
231
+ closestDistance = distance;
232
+ closestItem = {
233
+ type: 'line',
234
+ seriesId,
235
+ dataIndex
236
+ };
237
+ }
238
+ }
239
+
240
+ // Step 2: If the closest line is within the proximity threshold, pick it.
241
+ if (closestItem && closestDistance <= LINE_PROXIMITY_THRESHOLD) {
242
+ return closestItem;
243
+ }
244
+
245
+ // Step 3: Check area series — iterate stacking groups in reverse
246
+ // so that topmost (last rendered) area is checked first.
247
+ const {
248
+ stackingGroups
249
+ } = series;
250
+ for (let g = stackingGroups.length - 1; g >= 0; g -= 1) {
251
+ const groupIds = stackingGroups[g].ids;
252
+
253
+ // Iterate in reverse so the topmost stacked area is checked first.
254
+ for (let i = groupIds.length - 1; i >= 0; i -= 1) {
255
+ const seriesId = groupIds[i];
256
+ const seriesItem = series.series[seriesId];
257
+ if (seriesItem.hidden || !seriesItem.area) {
258
+ continue;
259
+ }
260
+ const xAxisId = seriesItem.xAxisId ?? defaultXAxisId;
261
+ const yAxisId = seriesItem.yAxisId ?? defaultYAxisId;
262
+ const xAxis = xAxes[xAxisId];
263
+ const yAxis = yAxes[yAxisId];
264
+ if (!xAxis || !yAxis) {
265
+ continue;
266
+ }
267
+ const bracket = getBracketIndices(xAxis, point.x);
268
+ if (!bracket) {
269
+ continue;
270
+ }
271
+ const {
272
+ left,
273
+ right
274
+ } = bracket;
275
+ const {
276
+ visibleStackedData,
277
+ data,
278
+ connectNulls,
279
+ baseline,
280
+ curve
281
+ } = seriesItem;
282
+
283
+ // 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) {
290
+ continue;
291
+ }
292
+ const xScale = xAxis.scale;
293
+ const yScale = yAxis.scale;
294
+ const xPosition = (0, _getValueToPositionMapper.getValueToPositionMapper)(xScale);
295
+ const xData = xAxis.data;
296
+ if (!xData) {
297
+ continue;
298
+ }
299
+ 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
+
323
+ // Build pixel-coordinate points for the top and bottom curves,
324
+ // then evaluate them at the pointer's x using the actual d3 curve.
325
+ const topPoints = collectCurvePoints(data, getPixelX, idx => {
326
+ const stacked = visibleStackedData[idx];
327
+ return stacked ? yScale(stacked[1]) : null;
328
+ }, left, right, connectNulls);
329
+ const bottomPoints = collectCurvePoints(data, getPixelX, idx => {
330
+ const stacked = visibleStackedData[idx];
331
+ return stacked ? getBaselinePixelY(baseline, yScale, stacked[0]) : null;
332
+ }, left, right, connectNulls);
333
+ if (topPoints.length < 2 || bottomPoints.length < 2) {
334
+ continue;
335
+ }
336
+ const yTop = (0, _curveEvaluation.evaluateCurveY)(topPoints, point.x, curve);
337
+ const yBottom = (0, _curveEvaluation.evaluateCurveY)(bottomPoints, point.x, curve);
338
+ if (yTop == null || yBottom == null) {
339
+ continue;
340
+ }
341
+ const yMin = Math.min(yBottom, yTop);
342
+ const yMax = Math.max(yBottom, yTop);
343
+ if (point.y >= yMin && point.y <= yMax) {
344
+ const dataIndex = (0, _getAxisValue.getAxisIndex)(xAxis, point.x);
345
+ return {
346
+ type: 'line',
347
+ seriesId,
348
+ dataIndex: dataIndex === -1 ? left : dataIndex
349
+ };
350
+ }
351
+ }
352
+ }
353
+
354
+ // Step 4: No area matched — return the closest line regardless of threshold.
355
+ return closestItem;
356
+ }
@@ -0,0 +1,351 @@
1
+ import { selectorChartXAxis, selectorChartYAxis } from "../../internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxisRendering.selectors.mjs";
2
+ import { selectorAllSeriesOfType } from "../../internals/seriesSelectorOfType.mjs";
3
+ import { getAxisIndex } from "../../internals/plugins/featurePlugins/useChartCartesianAxis/getAxisValue.mjs";
4
+ import { isOrdinalScale } from "../../internals/scaleGuards.mjs";
5
+ import { getValueToPositionMapper } from "../../hooks/getValueToPositionMapper.mjs";
6
+ import { evaluateCurveY } from "./curveEvaluation.mjs";
7
+
8
+ /**
9
+ * For a continuous x-axis, find the two data indices that bracket the pointer's x position.
10
+ * For ordinal axes, returns the single matching index (left === right).
11
+ * Returns null if the pointer is outside the data range.
12
+ */
13
+ function getBracketIndices(xAxis, pointX) {
14
+ const {
15
+ scale,
16
+ data: axisData
17
+ } = xAxis;
18
+ if (!axisData || axisData.length === 0) {
19
+ return null;
20
+ }
21
+ if (isOrdinalScale(scale)) {
22
+ const index = getAxisIndex(xAxis, pointX);
23
+ if (index === -1) {
24
+ return null;
25
+ }
26
+ return {
27
+ left: index,
28
+ right: index
29
+ };
30
+ }
31
+
32
+ // For continuous axes, find the two adjacent data points surrounding pointX.
33
+ const xValue = scale.invert(pointX);
34
+ const xAsNumber = xValue instanceof Date ? xValue.getTime() : xValue;
35
+ const getAsNumber = v => v instanceof Date ? v.getTime() : v;
36
+
37
+ // Find the rightmost index where data[i] <= xValue.
38
+ let leftIndex = -1;
39
+ for (let i = 0; i < axisData.length; i += 1) {
40
+ if (getAsNumber(axisData[i]) <= xAsNumber) {
41
+ leftIndex = i;
42
+ } else {
43
+ break;
44
+ }
45
+ }
46
+ if (leftIndex === -1) {
47
+ // Pointer is before the first data point.
48
+ return null;
49
+ }
50
+ if (leftIndex === axisData.length - 1) {
51
+ // Pointer is at or after the last data point — check if it's close enough.
52
+ return {
53
+ left: leftIndex,
54
+ right: leftIndex
55
+ };
56
+ }
57
+ return {
58
+ left: leftIndex,
59
+ right: leftIndex + 1
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Compute the pixel y0 (baseline) for a given data point,
65
+ * replicating the logic from useAreaPlotData.
66
+ */
67
+ function getBaselinePixelY(baseline, yScale, stackedY0) {
68
+ if (typeof baseline === 'number') {
69
+ return yScale(baseline);
70
+ }
71
+ if (baseline === 'max') {
72
+ return yScale.range()[1];
73
+ }
74
+ if (baseline === 'min') {
75
+ return yScale.range()[0];
76
+ }
77
+ // Default: use the stacked baseline value.
78
+ const value = yScale(stackedY0);
79
+ if (Number.isNaN(value)) {
80
+ return yScale.range()[0];
81
+ }
82
+ return value;
83
+ }
84
+
85
+ // Collect the pixel-coordinate points for a contiguous (non-null) segment
86
+ // of a series that contains the bracket indices.
87
+ //
88
+ // When connectNulls is true, all non-null points are returned.
89
+ // When connectNulls is false, only the contiguous run containing [left, right] is returned.
90
+ function collectCurvePoints(data, getPixelX, getPixelY, left, right, connectNulls) {
91
+ const points = [];
92
+ if (connectNulls) {
93
+ // All non-null points form one continuous curve.
94
+ for (let i = 0; i < data.length; i += 1) {
95
+ if (data[i] != null) {
96
+ const y = getPixelY(i);
97
+ if (y != null && !Number.isNaN(y)) {
98
+ points.push({
99
+ x: getPixelX(i),
100
+ y
101
+ });
102
+ }
103
+ }
104
+ }
105
+ return points;
106
+ }
107
+
108
+ // Find the contiguous non-null run containing [left, right].
109
+ let start = left;
110
+ while (start > 0 && data[start - 1] != null) {
111
+ start -= 1;
112
+ }
113
+ let end = right;
114
+ while (end < data.length - 1 && data[end + 1] != null) {
115
+ end += 1;
116
+ }
117
+ for (let i = start; i <= end; i += 1) {
118
+ const y = getPixelY(i);
119
+ if (y != null && !Number.isNaN(y)) {
120
+ points.push({
121
+ x: getPixelX(i),
122
+ y
123
+ });
124
+ }
125
+ }
126
+ return points;
127
+ }
128
+
129
+ /**
130
+ * The maximum pixel distance from a line curve at which the line is still
131
+ * considered "close enough" to be selected over an area.
132
+ */
133
+ const LINE_PROXIMITY_THRESHOLD = 15;
134
+ export default function getItemAtPosition(state, point) {
135
+ if (!state.experimentalFeatures?.enablePositionBasedPointerInteraction) {
136
+ return undefined;
137
+ }
138
+ const {
139
+ axis: xAxes,
140
+ axisIds: xAxisIds
141
+ } = selectorChartXAxis(state);
142
+ const {
143
+ axis: yAxes,
144
+ axisIds: yAxisIds
145
+ } = selectorChartYAxis(state);
146
+ const series = selectorAllSeriesOfType(state, 'line');
147
+ if (!series || series.seriesOrder.length === 0) {
148
+ return undefined;
149
+ }
150
+ const defaultXAxisId = xAxisIds[0];
151
+ const defaultYAxisId = yAxisIds[0];
152
+
153
+ // Step 1: Find the closest line (curve) across all series.
154
+ let closestDistance = Infinity;
155
+ let closestItem;
156
+ for (const seriesId of series.seriesOrder) {
157
+ const seriesItem = series.series[seriesId];
158
+ if (seriesItem.hidden) {
159
+ continue;
160
+ }
161
+ const xAxisId = seriesItem.xAxisId ?? defaultXAxisId;
162
+ const yAxisId = seriesItem.yAxisId ?? defaultYAxisId;
163
+ const xAxis = xAxes[xAxisId];
164
+ const yAxis = yAxes[yAxisId];
165
+ const bracket = getBracketIndices(xAxis, point.x);
166
+ if (!bracket) {
167
+ continue;
168
+ }
169
+ const {
170
+ left,
171
+ right
172
+ } = bracket;
173
+ const {
174
+ visibleStackedData,
175
+ data,
176
+ connectNulls,
177
+ curve
178
+ } = seriesItem;
179
+ const dataIndex = getAxisIndex(xAxis, point.x);
180
+ if (dataIndex === -1) {
181
+ continue;
182
+ }
183
+
184
+ // For ordinal or pointer exactly on a data point, use the data point directly.
185
+ if (left === right) {
186
+ const yValue = visibleStackedData[left]?.[1];
187
+ if (yValue == null) {
188
+ continue;
189
+ }
190
+ const yPosition = yAxis.scale(yValue);
191
+ if (yPosition == null) {
192
+ continue;
193
+ }
194
+ const distance = Math.abs(point.y - yPosition);
195
+ if (distance < closestDistance) {
196
+ closestDistance = distance;
197
+ closestItem = {
198
+ type: 'line',
199
+ seriesId,
200
+ dataIndex
201
+ };
202
+ }
203
+ continue;
204
+ }
205
+
206
+ // Evaluate the actual curve at the pointer's x for precise distance.
207
+ const xData = xAxis.data;
208
+ if (!xData) {
209
+ continue;
210
+ }
211
+ const xPosition = getValueToPositionMapper(xAxis.scale);
212
+ const getPixelX = idx => xPosition(xData[idx]);
213
+ const curvePoints = collectCurvePoints(data, getPixelX, idx => {
214
+ const stacked = visibleStackedData[idx];
215
+ return stacked ? yAxis.scale(stacked[1]) : null;
216
+ }, left, right, connectNulls);
217
+ if (curvePoints.length < 2) {
218
+ continue;
219
+ }
220
+ const yPosition = evaluateCurveY(curvePoints, point.x, curve);
221
+ if (yPosition == null) {
222
+ continue;
223
+ }
224
+ const distance = Math.abs(point.y - yPosition);
225
+ if (distance < closestDistance) {
226
+ closestDistance = distance;
227
+ closestItem = {
228
+ type: 'line',
229
+ seriesId,
230
+ dataIndex
231
+ };
232
+ }
233
+ }
234
+
235
+ // Step 2: If the closest line is within the proximity threshold, pick it.
236
+ if (closestItem && closestDistance <= LINE_PROXIMITY_THRESHOLD) {
237
+ return closestItem;
238
+ }
239
+
240
+ // Step 3: Check area series — iterate stacking groups in reverse
241
+ // so that topmost (last rendered) area is checked first.
242
+ const {
243
+ stackingGroups
244
+ } = series;
245
+ for (let g = stackingGroups.length - 1; g >= 0; g -= 1) {
246
+ const groupIds = stackingGroups[g].ids;
247
+
248
+ // Iterate in reverse so the topmost stacked area is checked first.
249
+ for (let i = groupIds.length - 1; i >= 0; i -= 1) {
250
+ const seriesId = groupIds[i];
251
+ const seriesItem = series.series[seriesId];
252
+ if (seriesItem.hidden || !seriesItem.area) {
253
+ continue;
254
+ }
255
+ const xAxisId = seriesItem.xAxisId ?? defaultXAxisId;
256
+ const yAxisId = seriesItem.yAxisId ?? defaultYAxisId;
257
+ const xAxis = xAxes[xAxisId];
258
+ const yAxis = yAxes[yAxisId];
259
+ if (!xAxis || !yAxis) {
260
+ continue;
261
+ }
262
+ const bracket = getBracketIndices(xAxis, point.x);
263
+ if (!bracket) {
264
+ continue;
265
+ }
266
+ const {
267
+ left,
268
+ right
269
+ } = bracket;
270
+ const {
271
+ visibleStackedData,
272
+ data,
273
+ connectNulls,
274
+ baseline,
275
+ curve
276
+ } = seriesItem;
277
+
278
+ // 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) {
285
+ continue;
286
+ }
287
+ const xScale = xAxis.scale;
288
+ const yScale = yAxis.scale;
289
+ const xPosition = getValueToPositionMapper(xScale);
290
+ const xData = xAxis.data;
291
+ if (!xData) {
292
+ continue;
293
+ }
294
+ 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
+
318
+ // Build pixel-coordinate points for the top and bottom curves,
319
+ // then evaluate them at the pointer's x using the actual d3 curve.
320
+ const topPoints = collectCurvePoints(data, getPixelX, idx => {
321
+ const stacked = visibleStackedData[idx];
322
+ return stacked ? yScale(stacked[1]) : null;
323
+ }, left, right, connectNulls);
324
+ const bottomPoints = collectCurvePoints(data, getPixelX, idx => {
325
+ const stacked = visibleStackedData[idx];
326
+ return stacked ? getBaselinePixelY(baseline, yScale, stacked[0]) : null;
327
+ }, left, right, connectNulls);
328
+ if (topPoints.length < 2 || bottomPoints.length < 2) {
329
+ continue;
330
+ }
331
+ const yTop = evaluateCurveY(topPoints, point.x, curve);
332
+ const yBottom = evaluateCurveY(bottomPoints, point.x, curve);
333
+ if (yTop == null || yBottom == null) {
334
+ continue;
335
+ }
336
+ const yMin = Math.min(yBottom, yTop);
337
+ const yMax = Math.max(yBottom, yTop);
338
+ if (point.y >= yMin && point.y <= yMax) {
339
+ const dataIndex = getAxisIndex(xAxis, point.x);
340
+ return {
341
+ type: 'line',
342
+ seriesId,
343
+ dataIndex: dataIndex === -1 ? left : dataIndex
344
+ };
345
+ }
346
+ }
347
+ }
348
+
349
+ // Step 4: No area matched — return the closest line regardless of threshold.
350
+ return closestItem;
351
+ }