@mui/x-charts-pro 8.0.0-alpha.0 → 8.0.0-alpha.10

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 (188) hide show
  1. package/BarChartPro/BarChartPro.d.ts +2 -2
  2. package/BarChartPro/BarChartPro.js +74 -61
  3. package/CHANGELOG.md +2215 -119
  4. package/ChartContainerPro/ChartContainerPro.d.ts +33 -4
  5. package/ChartContainerPro/ChartContainerPro.js +59 -51
  6. package/ChartContainerPro/useChartContainerProProps.d.ts +7 -43
  7. package/ChartContainerPro/useChartContainerProProps.js +15 -9
  8. package/ChartDataProviderPro/ChartDataProviderPro.d.ts +37 -0
  9. package/{context/ChartDataProviderPro → ChartDataProviderPro}/ChartDataProviderPro.js +71 -80
  10. package/{context → ChartDataProviderPro}/package.json +1 -1
  11. package/ChartDataProviderPro/useChartDataProviderProProps.d.ts +8 -0
  12. package/ChartDataProviderPro/useChartDataProviderProProps.js +15 -0
  13. package/Heatmap/Heatmap.d.ts +11 -4
  14. package/Heatmap/Heatmap.js +35 -43
  15. package/Heatmap/HeatmapItem.js +1 -1
  16. package/Heatmap/HeatmapTooltip.d.ts +9 -0
  17. package/Heatmap/HeatmapTooltip.js +274 -0
  18. package/Heatmap/extremums.d.ts +2 -2
  19. package/Heatmap/formatter.d.ts +2 -2
  20. package/Heatmap/formatter.js +2 -1
  21. package/Heatmap/heatmapClasses.js +2 -1
  22. package/Heatmap/index.d.ts +1 -1
  23. package/Heatmap/index.js +1 -1
  24. package/Heatmap/plugin.d.ts +2 -2
  25. package/Heatmap/plugin.js +4 -2
  26. package/Heatmap/tooltip.d.ts +3 -0
  27. package/Heatmap/tooltip.js +25 -0
  28. package/LineChartPro/LineChartPro.d.ts +2 -2
  29. package/LineChartPro/LineChartPro.js +80 -82
  30. package/README.md +3 -3
  31. package/ScatterChartPro/ScatterChartPro.d.ts +2 -2
  32. package/ScatterChartPro/ScatterChartPro.js +51 -64
  33. package/hooks/index.d.ts +1 -0
  34. package/hooks/index.js +2 -1
  35. package/hooks/useSeries.d.ts +2 -4
  36. package/hooks/zoom/index.d.ts +1 -0
  37. package/hooks/zoom/index.js +1 -0
  38. package/hooks/zoom/useIsZoomInteracting.d.ts +6 -0
  39. package/hooks/zoom/useIsZoomInteracting.js +14 -0
  40. package/index.d.ts +3 -1
  41. package/index.js +5 -5
  42. package/internals/plugins/allPlugins.d.ts +11 -0
  43. package/internals/plugins/allPlugins.js +5 -0
  44. package/internals/plugins/useChartProZoom/creatZoomLookup.d.ts +3 -0
  45. package/internals/plugins/useChartProZoom/creatZoomLookup.js +12 -0
  46. package/internals/plugins/useChartProZoom/defaultizeZoom.d.ts +2 -0
  47. package/internals/plugins/useChartProZoom/defaultizeZoom.js +25 -0
  48. package/internals/plugins/useChartProZoom/index.d.ts +3 -0
  49. package/internals/plugins/useChartProZoom/index.js +3 -0
  50. package/internals/plugins/useChartProZoom/useChartProZoom.d.ts +3 -0
  51. package/internals/plugins/useChartProZoom/useChartProZoom.js +303 -0
  52. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +377 -0
  53. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.js +10 -0
  54. package/internals/plugins/useChartProZoom/useChartProZoom.types.d.ts +50 -0
  55. package/internals/plugins/useChartProZoom/useChartProZoom.utils.d.ts +45 -0
  56. package/internals/plugins/useChartProZoom/useChartProZoom.utils.js +126 -0
  57. package/internals/plugins/useChartProZoom/zoom.types.d.ts +53 -0
  58. package/internals/utils/releaseInfo.js +2 -2
  59. package/models/index.d.ts +1 -0
  60. package/models/index.js +2 -1
  61. package/modern/BarChartPro/BarChartPro.js +74 -61
  62. package/modern/ChartContainerPro/ChartContainerPro.js +59 -51
  63. package/modern/ChartContainerPro/useChartContainerProProps.js +15 -9
  64. package/modern/{context/ChartDataProviderPro → ChartDataProviderPro}/ChartDataProviderPro.js +71 -80
  65. package/modern/ChartDataProviderPro/useChartDataProviderProProps.js +15 -0
  66. package/modern/Heatmap/Heatmap.js +35 -43
  67. package/modern/Heatmap/HeatmapItem.js +1 -1
  68. package/modern/Heatmap/HeatmapTooltip.js +274 -0
  69. package/modern/Heatmap/formatter.js +2 -1
  70. package/modern/Heatmap/heatmapClasses.js +2 -1
  71. package/modern/Heatmap/index.js +1 -1
  72. package/modern/Heatmap/plugin.js +4 -2
  73. package/modern/Heatmap/tooltip.js +25 -0
  74. package/modern/LineChartPro/LineChartPro.js +80 -82
  75. package/modern/ScatterChartPro/ScatterChartPro.js +51 -64
  76. package/modern/hooks/index.js +2 -1
  77. package/modern/hooks/zoom/index.js +1 -0
  78. package/modern/hooks/zoom/useIsZoomInteracting.js +14 -0
  79. package/modern/index.js +5 -5
  80. package/modern/internals/plugins/allPlugins.js +5 -0
  81. package/modern/internals/plugins/useChartProZoom/creatZoomLookup.js +12 -0
  82. package/modern/internals/plugins/useChartProZoom/defaultizeZoom.js +25 -0
  83. package/modern/internals/plugins/useChartProZoom/index.js +3 -0
  84. package/modern/internals/plugins/useChartProZoom/useChartProZoom.js +303 -0
  85. package/modern/internals/plugins/useChartProZoom/useChartProZoom.selectors.js +10 -0
  86. package/modern/internals/plugins/useChartProZoom/useChartProZoom.types.js +1 -0
  87. package/modern/internals/plugins/useChartProZoom/useChartProZoom.utils.js +126 -0
  88. package/modern/internals/plugins/useChartProZoom/zoom.types.js +1 -0
  89. package/modern/internals/utils/releaseInfo.js +2 -2
  90. package/modern/models/index.js +2 -1
  91. package/node/BarChartPro/BarChartPro.js +73 -60
  92. package/node/ChartContainerPro/ChartContainerPro.js +58 -50
  93. package/node/ChartContainerPro/useChartContainerProProps.js +15 -9
  94. package/node/{context/ChartDataProviderPro → ChartDataProviderPro}/ChartDataProviderPro.js +70 -79
  95. package/node/ChartDataProviderPro/useChartDataProviderProProps.js +21 -0
  96. package/node/Heatmap/Heatmap.js +35 -43
  97. package/node/Heatmap/HeatmapItem.js +2 -2
  98. package/node/Heatmap/HeatmapTooltip.js +280 -0
  99. package/node/Heatmap/formatter.js +2 -1
  100. package/node/Heatmap/heatmapClasses.js +5 -4
  101. package/node/Heatmap/index.js +4 -4
  102. package/node/Heatmap/plugin.js +4 -2
  103. package/node/Heatmap/tooltip.js +31 -0
  104. package/node/LineChartPro/LineChartPro.js +79 -81
  105. package/node/ScatterChartPro/ScatterChartPro.js +50 -63
  106. package/node/hooks/index.js +16 -1
  107. package/node/{context/CartesianProviderPro → hooks/zoom}/index.js +4 -4
  108. package/node/hooks/zoom/useIsZoomInteracting.js +19 -0
  109. package/node/index.js +34 -12
  110. package/node/internals/plugins/allPlugins.js +11 -0
  111. package/node/internals/plugins/useChartProZoom/creatZoomLookup.js +19 -0
  112. package/node/internals/plugins/useChartProZoom/defaultizeZoom.js +33 -0
  113. package/node/internals/plugins/useChartProZoom/index.js +38 -0
  114. package/node/internals/plugins/useChartProZoom/useChartProZoom.js +310 -0
  115. package/node/internals/plugins/useChartProZoom/useChartProZoom.selectors.js +18 -0
  116. package/node/internals/plugins/useChartProZoom/useChartProZoom.utils.js +140 -0
  117. package/node/internals/plugins/useChartProZoom/zoom.types.js +5 -0
  118. package/node/internals/utils/releaseInfo.js +4 -3
  119. package/package.json +8 -8
  120. package/typeOverloads/modules.d.ts +8 -1
  121. package/Heatmap/DefaultHeatmapTooltip.d.ts +0 -7
  122. package/Heatmap/DefaultHeatmapTooltip.js +0 -99
  123. package/context/CartesianProviderPro/CartesianProviderPro.d.ts +0 -6
  124. package/context/CartesianProviderPro/CartesianProviderPro.js +0 -89
  125. package/context/CartesianProviderPro/createAxisFilterMapper.d.ts +0 -12
  126. package/context/CartesianProviderPro/createAxisFilterMapper.js +0 -60
  127. package/context/CartesianProviderPro/index.d.ts +0 -1
  128. package/context/CartesianProviderPro/index.js +0 -1
  129. package/context/ChartDataProviderPro/ChartDataProviderPro.d.ts +0 -7
  130. package/context/ChartDataProviderPro/useChartDataProviderProProps.d.ts +0 -16
  131. package/context/ChartDataProviderPro/useChartDataProviderProProps.js +0 -43
  132. package/context/ZoomProvider/Zoom.types.d.ts +0 -144
  133. package/context/ZoomProvider/ZoomContext.d.ts +0 -4
  134. package/context/ZoomProvider/ZoomContext.js +0 -16
  135. package/context/ZoomProvider/ZoomProvider.d.ts +0 -3
  136. package/context/ZoomProvider/ZoomProvider.js +0 -56
  137. package/context/ZoomProvider/ZoomSetup.d.ts +0 -9
  138. package/context/ZoomProvider/ZoomSetup.js +0 -16
  139. package/context/ZoomProvider/defaultizeZoom.d.ts +0 -2
  140. package/context/ZoomProvider/defaultizeZoom.js +0 -32
  141. package/context/ZoomProvider/index.d.ts +0 -3
  142. package/context/ZoomProvider/index.js +0 -3
  143. package/context/ZoomProvider/initializeZoomData.d.ts +0 -6
  144. package/context/ZoomProvider/initializeZoomData.js +0 -13
  145. package/context/ZoomProvider/useSetupPan.d.ts +0 -1
  146. package/context/ZoomProvider/useSetupPan.js +0 -106
  147. package/context/ZoomProvider/useSetupZoom.d.ts +0 -1
  148. package/context/ZoomProvider/useSetupZoom.js +0 -274
  149. package/context/ZoomProvider/useZoom.d.ts +0 -7
  150. package/context/ZoomProvider/useZoom.js +0 -19
  151. package/context/index.d.ts +0 -3
  152. package/context/index.js +0 -5
  153. package/modern/Heatmap/DefaultHeatmapTooltip.js +0 -99
  154. package/modern/context/CartesianProviderPro/CartesianProviderPro.js +0 -89
  155. package/modern/context/CartesianProviderPro/createAxisFilterMapper.js +0 -60
  156. package/modern/context/CartesianProviderPro/index.js +0 -1
  157. package/modern/context/ChartDataProviderPro/useChartDataProviderProProps.js +0 -43
  158. package/modern/context/ZoomProvider/ZoomContext.js +0 -16
  159. package/modern/context/ZoomProvider/ZoomProvider.js +0 -56
  160. package/modern/context/ZoomProvider/ZoomSetup.js +0 -16
  161. package/modern/context/ZoomProvider/defaultizeZoom.js +0 -32
  162. package/modern/context/ZoomProvider/index.js +0 -3
  163. package/modern/context/ZoomProvider/initializeZoomData.js +0 -13
  164. package/modern/context/ZoomProvider/useSetupPan.js +0 -106
  165. package/modern/context/ZoomProvider/useSetupZoom.js +0 -274
  166. package/modern/context/ZoomProvider/useZoom.js +0 -19
  167. package/modern/context/index.js +0 -5
  168. package/node/Heatmap/DefaultHeatmapTooltip.js +0 -105
  169. package/node/context/CartesianProviderPro/CartesianProviderPro.js +0 -95
  170. package/node/context/CartesianProviderPro/createAxisFilterMapper.js +0 -68
  171. package/node/context/ChartDataProviderPro/useChartDataProviderProProps.js +0 -50
  172. package/node/context/ZoomProvider/ZoomContext.js +0 -23
  173. package/node/context/ZoomProvider/ZoomProvider.js +0 -63
  174. package/node/context/ZoomProvider/ZoomSetup.js +0 -20
  175. package/node/context/ZoomProvider/defaultizeZoom.js +0 -40
  176. package/node/context/ZoomProvider/index.js +0 -38
  177. package/node/context/ZoomProvider/initializeZoomData.js +0 -20
  178. package/node/context/ZoomProvider/useSetupPan.js +0 -114
  179. package/node/context/ZoomProvider/useSetupZoom.js +0 -281
  180. package/node/context/ZoomProvider/useZoom.js +0 -25
  181. package/node/context/index.js +0 -27
  182. /package/{context/ChartDataProviderPro → ChartDataProviderPro}/index.d.ts +0 -0
  183. /package/{context/ChartDataProviderPro → ChartDataProviderPro}/index.js +0 -0
  184. /package/{context/ZoomProvider/Zoom.types.js → internals/plugins/useChartProZoom/useChartProZoom.types.js} +0 -0
  185. /package/{modern/context/ZoomProvider/Zoom.types.js → internals/plugins/useChartProZoom/zoom.types.js} +0 -0
  186. /package/modern/{context/ChartDataProviderPro → ChartDataProviderPro}/index.js +0 -0
  187. /package/node/{context/ChartDataProviderPro → ChartDataProviderPro}/index.js +0 -0
  188. /package/node/{context/ZoomProvider/Zoom.types.js → internals/plugins/useChartProZoom/useChartProZoom.types.js} +0 -0
@@ -2,22 +2,22 @@
2
2
 
3
3
  import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
- const _excluded = ["zoom", "onZoomChange"];
5
+ const _excluded = ["initialZoom", "onZoomChange", "apiRef"];
6
6
  import * as React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import { useThemeProps } from '@mui/material/styles';
9
9
  import { ChartsOverlay } from '@mui/x-charts/ChartsOverlay';
10
10
  import { ScatterPlot } from '@mui/x-charts/ScatterChart';
11
- import { ZAxisContextProvider } from '@mui/x-charts/context';
12
11
  import { ChartsVoronoiHandler } from '@mui/x-charts/ChartsVoronoiHandler';
13
12
  import { ChartsAxis } from '@mui/x-charts/ChartsAxis';
14
13
  import { ChartsGrid } from '@mui/x-charts/ChartsGrid';
15
14
  import { ChartsLegend } from '@mui/x-charts/ChartsLegend';
15
+ import { ChartsSurface } from '@mui/x-charts/ChartsSurface';
16
16
  import { ChartsAxisHighlight } from '@mui/x-charts/ChartsAxisHighlight';
17
17
  import { ChartsTooltip } from '@mui/x-charts/ChartsTooltip';
18
- import { useScatterChartProps } from '@mui/x-charts/internals';
19
- import { ChartContainerPro } from "../ChartContainerPro/index.js";
20
- import { ZoomSetup } from "../context/ZoomProvider/ZoomSetup.js";
18
+ import { useScatterChartProps, ChartsWrapper } from '@mui/x-charts/internals';
19
+ import { useChartContainerProProps } from "../ChartContainerPro/useChartContainerProProps.js";
20
+ import { ChartDataProviderPro } from "../ChartDataProviderPro/index.js";
21
21
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
22
22
  /**
23
23
  * Demos:
@@ -35,13 +35,14 @@ const ScatterChartPro = /*#__PURE__*/React.forwardRef(function ScatterChartPro(i
35
35
  name: 'MuiScatterChartPro'
36
36
  });
37
37
  const {
38
- zoom,
39
- onZoomChange
38
+ initialZoom,
39
+ onZoomChange,
40
+ apiRef
40
41
  } = props,
41
42
  other = _objectWithoutPropertiesLoose(props, _excluded);
42
43
  const {
44
+ chartsWrapperProps,
43
45
  chartContainerProps,
44
- zAxisProps,
45
46
  voronoiHandlerProps,
46
47
  chartsAxisProps,
47
48
  gridProps,
@@ -49,19 +50,27 @@ const ScatterChartPro = /*#__PURE__*/React.forwardRef(function ScatterChartPro(i
49
50
  overlayProps,
50
51
  legendProps,
51
52
  axisHighlightProps,
52
- tooltipProps,
53
53
  children
54
54
  } = useScatterChartProps(other);
55
- return /*#__PURE__*/_jsx(ChartContainerPro, _extends({
56
- ref: ref
57
- }, chartContainerProps, {
58
- zoom: zoom,
59
- onZoomChange: onZoomChange,
60
- children: /*#__PURE__*/_jsxs(ZAxisContextProvider, _extends({}, zAxisProps, {
61
- children: [!props.disableVoronoi && /*#__PURE__*/_jsx(ChartsVoronoiHandler, _extends({}, voronoiHandlerProps)), /*#__PURE__*/_jsx(ChartsAxis, _extends({}, chartsAxisProps)), /*#__PURE__*/_jsx(ChartsGrid, _extends({}, gridProps)), /*#__PURE__*/_jsx("g", {
62
- "data-drawing-container": true,
63
- children: /*#__PURE__*/_jsx(ScatterPlot, _extends({}, scatterPlotProps))
64
- }), /*#__PURE__*/_jsx(ChartsOverlay, _extends({}, overlayProps)), !props.hideLegend && /*#__PURE__*/_jsx(ChartsLegend, _extends({}, legendProps)), /*#__PURE__*/_jsx(ChartsAxisHighlight, _extends({}, axisHighlightProps)), !props.loading && /*#__PURE__*/_jsx(ChartsTooltip, _extends({}, tooltipProps)), /*#__PURE__*/_jsx(ZoomSetup, {}), children]
55
+ const {
56
+ chartDataProviderProProps,
57
+ chartsSurfaceProps
58
+ } = useChartContainerProProps(_extends({}, chartContainerProps, {
59
+ initialZoom,
60
+ onZoomChange,
61
+ apiRef
62
+ }), ref);
63
+ const Tooltip = props.slots?.tooltip ?? ChartsTooltip;
64
+ return /*#__PURE__*/_jsx(ChartDataProviderPro, _extends({}, chartDataProviderProProps, {
65
+ children: /*#__PURE__*/_jsxs(ChartsWrapper, _extends({}, chartsWrapperProps, {
66
+ children: [!props.hideLegend && /*#__PURE__*/_jsx(ChartsLegend, _extends({}, legendProps)), /*#__PURE__*/_jsxs(ChartsSurface, _extends({}, chartsSurfaceProps, {
67
+ children: [!props.disableVoronoi && /*#__PURE__*/_jsx(ChartsVoronoiHandler, _extends({}, voronoiHandlerProps)), /*#__PURE__*/_jsx(ChartsAxis, _extends({}, chartsAxisProps)), /*#__PURE__*/_jsx(ChartsGrid, _extends({}, gridProps)), /*#__PURE__*/_jsx("g", {
68
+ "data-drawing-container": true,
69
+ children: /*#__PURE__*/_jsx(ScatterPlot, _extends({}, scatterPlotProps))
70
+ }), /*#__PURE__*/_jsx(ChartsOverlay, _extends({}, overlayProps)), /*#__PURE__*/_jsx(ChartsAxisHighlight, _extends({}, axisHighlightProps)), !props.loading && /*#__PURE__*/_jsx(Tooltip, _extends({}, props?.slotProps?.tooltip, {
71
+ trigger: "item"
72
+ })), children]
73
+ }))]
65
74
  }))
66
75
  }));
67
76
  });
@@ -70,9 +79,14 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
70
79
  // | These PropTypes are generated from the TypeScript type definitions |
71
80
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
72
81
  // ----------------------------------------------------------------------
82
+ apiRef: PropTypes.shape({
83
+ current: PropTypes.shape({
84
+ setZoomData: PropTypes.func.isRequired
85
+ })
86
+ }),
73
87
  /**
74
88
  * The configuration of axes highlight.
75
- * @see See {@link https://mui.com/x/react-charts/highlighting highlighting docs} for more details.
89
+ * @see See {@link https://mui.com/x/react-charts/highlighting/ highlighting docs} for more details.
76
90
  * @default { x: 'none', y: 'none' }
77
91
  */
78
92
  axisHighlight: PropTypes.shape({
@@ -124,12 +138,26 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
124
138
  */
125
139
  hideLegend: PropTypes.bool,
126
140
  /**
127
- * The item currently highlighted. Turns highlighting into a controlled prop.
141
+ * The highlighted item.
142
+ * Used when the highlight is controlled.
128
143
  */
129
144
  highlightedItem: PropTypes.shape({
130
145
  dataIndex: PropTypes.number,
131
- seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string])
146
+ seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
132
147
  }),
148
+ /**
149
+ * This prop is used to help implement the accessibility logic.
150
+ * If you don't provide this prop. It falls back to a randomly generated id.
151
+ */
152
+ id: PropTypes.string,
153
+ /**
154
+ * The list of zoom data related to each axis.
155
+ */
156
+ initialZoom: PropTypes.arrayOf(PropTypes.shape({
157
+ axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
158
+ end: PropTypes.number.isRequired,
159
+ start: PropTypes.number.isRequired
160
+ })),
133
161
  /**
134
162
  * Indicate which axis to display the left of the charts.
135
163
  * Can be a string (the id of the axis) or an object `ChartsYAxisProps`.
@@ -145,7 +173,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
145
173
  * The margin between the SVG and the drawing area.
146
174
  * It's used for leaving some space for extra information such as the x- and y-axis or legend.
147
175
  * Accepts an object with the optional properties: `top`, `bottom`, `left`, and `right`.
148
- * @default object Depends on the charts type.
149
176
  */
150
177
  margin: PropTypes.shape({
151
178
  bottom: PropTypes.number,
@@ -171,16 +198,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
171
198
  * @param {ZoomData[]} zoomData Updated zoom data.
172
199
  */
173
200
  onZoomChange: PropTypes.func,
174
- /**
175
- * The chart will try to wait for the parent container to resolve its size
176
- * before it renders for the first time.
177
- *
178
- * This can be useful in some scenarios where the chart appear to grow after
179
- * the first render, like when used inside a grid.
180
- *
181
- * @default false
182
- */
183
- resolveSizeBeforeRender: PropTypes.bool,
184
201
  /**
185
202
  * Indicate which axis to display the right of the charts.
186
203
  * Can be a string (the id of the axis) or an object `ChartsYAxisProps`.
@@ -208,32 +225,14 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
208
225
  */
209
226
  slots: PropTypes.object,
210
227
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
228
+ theme: PropTypes.oneOf(['dark', 'light']),
211
229
  title: PropTypes.string,
212
- /**
213
- * The configuration of the tooltip.
214
- * @see See {@link https://mui.com/x/react-charts/tooltip/ tooltip docs} for more details.
215
- * @default { trigger: 'item' }
216
- */
217
- tooltip: PropTypes.shape({
218
- axisContent: PropTypes.elementType,
219
- classes: PropTypes.object,
220
- itemContent: PropTypes.elementType,
221
- slotProps: PropTypes.object,
222
- slots: PropTypes.object,
223
- trigger: PropTypes.oneOf(['axis', 'item', 'none'])
224
- }),
225
230
  /**
226
231
  * Indicate which axis to display the top of the charts.
227
232
  * Can be a string (the id of the axis) or an object `ChartsXAxisProps`.
228
233
  * @default null
229
234
  */
230
235
  topAxis: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
231
- viewBox: PropTypes.shape({
232
- height: PropTypes.number,
233
- width: PropTypes.number,
234
- x: PropTypes.number,
235
- y: PropTypes.number
236
- }),
237
236
  /**
238
237
  * Defines the maximal distance between a scatter point and the pointer that triggers the interaction.
239
238
  * If `undefined`, the radius is assumed to be infinite.
@@ -274,7 +273,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
274
273
  hideTooltip: PropTypes.bool,
275
274
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
276
275
  label: PropTypes.string,
277
- labelFontSize: PropTypes.number,
278
276
  labelStyle: PropTypes.object,
279
277
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
280
278
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
@@ -285,7 +283,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
285
283
  slots: PropTypes.object,
286
284
  stroke: PropTypes.string,
287
285
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
288
- tickFontSize: PropTypes.number,
289
286
  tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]),
290
287
  tickLabelInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.func]),
291
288
  tickLabelPlacement: PropTypes.oneOf(['middle', 'tick']),
@@ -337,7 +334,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
337
334
  hideTooltip: PropTypes.bool,
338
335
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
339
336
  label: PropTypes.string,
340
- labelFontSize: PropTypes.number,
341
337
  labelStyle: PropTypes.object,
342
338
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
343
339
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
@@ -348,7 +344,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
348
344
  slots: PropTypes.object,
349
345
  stroke: PropTypes.string,
350
346
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
351
- tickFontSize: PropTypes.number,
352
347
  tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]),
353
348
  tickLabelInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.func]),
354
349
  tickLabelPlacement: PropTypes.oneOf(['middle', 'tick']),
@@ -393,14 +388,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
393
388
  id: PropTypes.string,
394
389
  max: PropTypes.number,
395
390
  min: PropTypes.number
396
- })),
397
- /**
398
- * The list of zoom data related to each axis.
399
- */
400
- zoom: PropTypes.arrayOf(PropTypes.shape({
401
- axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
402
- end: PropTypes.number.isRequired,
403
- start: PropTypes.number.isRequired
404
391
  }))
405
392
  } : void 0;
406
393
  export { ScatterChartPro };
@@ -1 +1,2 @@
1
- export { useHeatmapSeries as unstable_useHeatmapSeries } from "./useSeries.js";
1
+ export { useHeatmapSeries as unstable_useHeatmapSeries } from "./useSeries.js";
2
+ export * from "./zoom/index.js";
@@ -0,0 +1 @@
1
+ export * from "./useIsZoomInteracting.js";
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+
3
+ import { useSelector, useStore } from '@mui/x-charts/internals';
4
+ import { selectorChartZoomIsInteracting } from "../../internals/plugins/useChartProZoom/index.js";
5
+ /**
6
+ * Get access to the zoom state.
7
+ *
8
+ * @returns {boolean} Inform the zoom is interacting.
9
+ */
10
+ export function useIsZoomInteracting() {
11
+ const store = useStore();
12
+ const isInteracting = useSelector(store, selectorChartZoomIsInteracting);
13
+ return isInteracting;
14
+ }
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-charts-pro v8.0.0-alpha.0
2
+ * @mui/x-charts-pro v8.0.0-alpha.10
3
3
  *
4
4
  * @license MUI X Commercial
5
5
  * This source code is licensed under the commercial license found in the
@@ -32,13 +32,13 @@ export * from '@mui/x-charts/ScatterChart';
32
32
  export * from '@mui/x-charts/SparkLineChart';
33
33
  export * from '@mui/x-charts/Gauge';
34
34
  export * from '@mui/x-charts/ChartsSurface';
35
+ export * from '@mui/x-charts/ChartDataProvider';
36
+ export * from '@mui/x-charts/ChartsLabel';
35
37
 
36
38
  // Pro components
37
39
  export * from "./Heatmap/index.js";
38
40
  export * from "./ChartContainerPro/index.js";
41
+ export * from "./ChartDataProviderPro/index.js";
39
42
  export * from "./ScatterChartPro/index.js";
40
43
  export * from "./BarChartPro/index.js";
41
- export * from "./LineChartPro/index.js";
42
-
43
- // Pro context
44
- export * from "./context/index.js";
44
+ export * from "./LineChartPro/index.js";
@@ -0,0 +1,5 @@
1
+ // This file should be removed after creating all plugins in favor of a file per chart type.
2
+
3
+ import { useChartCartesianAxis, useChartInteraction, useChartZAxis, useChartHighlight } from '@mui/x-charts/internals';
4
+ import { useChartProZoom } from "./useChartProZoom/index.js";
5
+ export const ALL_PLUGINS = [useChartZAxis, useChartCartesianAxis, useChartInteraction, useChartHighlight, useChartProZoom];
@@ -0,0 +1,12 @@
1
+ import { defaultizeZoom } from "./defaultizeZoom.js";
2
+ export const creatZoomLookup = axisDirection => axes => axes.reduce((acc, v) => {
3
+ const {
4
+ zoom,
5
+ id: axisId
6
+ } = v;
7
+ const defaultizedZoom = defaultizeZoom(zoom, axisId, axisDirection);
8
+ if (defaultizedZoom) {
9
+ acc[axisId] = defaultizedZoom;
10
+ }
11
+ return acc;
12
+ }, {});
@@ -0,0 +1,25 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ const defaultZoomOptions = {
3
+ minStart: 0,
4
+ maxEnd: 100,
5
+ step: 5,
6
+ minSpan: 10,
7
+ maxSpan: 100,
8
+ panning: true,
9
+ filterMode: 'keep'
10
+ };
11
+ export const defaultizeZoom = (zoom, axisId, axisDirection) => {
12
+ if (!zoom) {
13
+ return undefined;
14
+ }
15
+ if (zoom === true) {
16
+ return _extends({
17
+ axisId,
18
+ axisDirection
19
+ }, defaultZoomOptions);
20
+ }
21
+ return _extends({
22
+ axisId,
23
+ axisDirection
24
+ }, defaultZoomOptions, zoom);
25
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./useChartProZoom.selectors.js";
2
+ export * from "./useChartProZoom.js";
3
+ export * from "./useChartProZoom.types.js";
@@ -0,0 +1,303 @@
1
+ 'use client';
2
+
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import * as React from 'react';
5
+ import { useSelector, getSVGPoint, selectorChartDrawingArea } from '@mui/x-charts/internals';
6
+ import { creatZoomLookup } from "./creatZoomLookup.js";
7
+ import { getDiff, getHorizontalCenterRatio, getPinchScaleRatio, getVerticalCenterRatio, getWheelScaleRatio, isSpanValid, preventDefault, zoomAtPoint } from "./useChartProZoom.utils.js";
8
+ import { selectorChartZoomOptionsLookup } from "./useChartProZoom.selectors.js";
9
+
10
+ // It is helpful to avoid the need to provide the possibly auto-generated id for each axis.
11
+ function initializeZoomData(options) {
12
+ return Object.values(options).map(({
13
+ axisId,
14
+ minStart: start,
15
+ maxEnd: end
16
+ }) => ({
17
+ axisId,
18
+ start,
19
+ end
20
+ }));
21
+ }
22
+ export const useChartProZoom = ({
23
+ store,
24
+ instance,
25
+ svgRef,
26
+ params
27
+ }) => {
28
+ const drawingArea = useSelector(store, selectorChartDrawingArea);
29
+ const optionsLookup = useSelector(store, selectorChartZoomOptionsLookup);
30
+ const isZoomEnabled = Object.keys(optionsLookup).length > 0;
31
+
32
+ // Add events
33
+ const panningEventCacheRef = React.useRef([]);
34
+ const zoomEventCacheRef = React.useRef([]);
35
+ const eventPrevDiff = React.useRef(0);
36
+ const interactionTimeoutRef = React.useRef(undefined);
37
+ const setIsInteracting = React.useCallback(isInteracting => {
38
+ store.update(prev => _extends({}, prev, {
39
+ zoom: _extends({}, prev.zoom, {
40
+ isInteracting
41
+ })
42
+ }));
43
+ }, [store]);
44
+ const setZoomDataCallback = React.useCallback(zoomData => {
45
+ store.update(prevState => {
46
+ const newZoomData = typeof zoomData === 'function' ? zoomData(prevState.zoom.zoomData) : zoomData;
47
+ params.onZoomChange?.(newZoomData);
48
+ return _extends({}, prevState, {
49
+ zoom: _extends({}, prevState.zoom, {
50
+ zoomData: newZoomData
51
+ })
52
+ });
53
+ });
54
+ }, [params, store]);
55
+
56
+ // Add event for chart panning
57
+ const isPanEnabled = React.useMemo(() => Object.values(optionsLookup).some(v => v.panning) || false, [optionsLookup]);
58
+ const isDraggingRef = React.useRef(false);
59
+ const touchStartRef = React.useRef(null);
60
+ React.useEffect(() => {
61
+ const element = svgRef.current;
62
+ if (element === null || !isPanEnabled) {
63
+ return () => {};
64
+ }
65
+ const handlePan = event => {
66
+ if (element === null || !isDraggingRef.current || panningEventCacheRef.current.length > 1) {
67
+ return;
68
+ }
69
+ if (touchStartRef.current == null) {
70
+ return;
71
+ }
72
+ const point = getSVGPoint(element, event);
73
+ const movementX = point.x - touchStartRef.current.x;
74
+ const movementY = (point.y - touchStartRef.current.y) * -1;
75
+ const newZoomData = touchStartRef.current.zoomData.map(zoom => {
76
+ const options = optionsLookup[zoom.axisId];
77
+ if (!options || !options.panning) {
78
+ return zoom;
79
+ }
80
+ const min = zoom.start;
81
+ const max = zoom.end;
82
+ const span = max - min;
83
+ const MIN_PERCENT = options.minStart;
84
+ const MAX_PERCENT = options.maxEnd;
85
+ const movement = options.axisDirection === 'x' ? movementX : movementY;
86
+ const dimension = options.axisDirection === 'x' ? drawingArea.width : drawingArea.height;
87
+ let newMinPercent = min - movement / dimension * span;
88
+ let newMaxPercent = max - movement / dimension * span;
89
+ if (newMinPercent < MIN_PERCENT) {
90
+ newMinPercent = MIN_PERCENT;
91
+ newMaxPercent = newMinPercent + span;
92
+ }
93
+ if (newMaxPercent > MAX_PERCENT) {
94
+ newMaxPercent = MAX_PERCENT;
95
+ newMinPercent = newMaxPercent - span;
96
+ }
97
+ if (newMinPercent < MIN_PERCENT || newMaxPercent > MAX_PERCENT || span < options.minSpan || span > options.maxSpan) {
98
+ return zoom;
99
+ }
100
+ return _extends({}, zoom, {
101
+ start: newMinPercent,
102
+ end: newMaxPercent
103
+ });
104
+ });
105
+ setZoomDataCallback(newZoomData);
106
+ };
107
+ const handleDown = event => {
108
+ panningEventCacheRef.current.push(event);
109
+ const point = getSVGPoint(element, event);
110
+ if (!instance.isPointInside(point)) {
111
+ return;
112
+ }
113
+ // If there is only one pointer, prevent selecting text
114
+ if (panningEventCacheRef.current.length === 1) {
115
+ event.preventDefault();
116
+ }
117
+ isDraggingRef.current = true;
118
+ setIsInteracting(true);
119
+ touchStartRef.current = {
120
+ x: point.x,
121
+ y: point.y,
122
+ zoomData: store.getSnapshot().zoom.zoomData
123
+ };
124
+ };
125
+ const handleUp = event => {
126
+ panningEventCacheRef.current.splice(panningEventCacheRef.current.findIndex(cachedEvent => cachedEvent.pointerId === event.pointerId), 1);
127
+ setIsInteracting(false);
128
+ isDraggingRef.current = false;
129
+ touchStartRef.current = null;
130
+ };
131
+ element.addEventListener('pointerdown', handleDown);
132
+ document.addEventListener('pointermove', handlePan);
133
+ document.addEventListener('pointerup', handleUp);
134
+ document.addEventListener('pointercancel', handleUp);
135
+ document.addEventListener('pointerleave', handleUp);
136
+ return () => {
137
+ element.removeEventListener('pointerdown', handleDown);
138
+ document.removeEventListener('pointermove', handlePan);
139
+ document.removeEventListener('pointerup', handleUp);
140
+ document.removeEventListener('pointercancel', handleUp);
141
+ document.removeEventListener('pointerleave', handleUp);
142
+ };
143
+ }, [instance, svgRef, isDraggingRef, setIsInteracting, isPanEnabled, optionsLookup, drawingArea.width, drawingArea.height, setZoomDataCallback, store]);
144
+
145
+ // Add event for chart zoom in/out
146
+ React.useEffect(() => {
147
+ const element = svgRef.current;
148
+ if (element === null || !isZoomEnabled) {
149
+ return () => {};
150
+ }
151
+ const wheelHandler = event => {
152
+ if (element === null) {
153
+ return;
154
+ }
155
+ const point = getSVGPoint(element, event);
156
+ if (!instance.isPointInside(point)) {
157
+ return;
158
+ }
159
+ event.preventDefault();
160
+ if (interactionTimeoutRef.current) {
161
+ clearTimeout(interactionTimeoutRef.current);
162
+ }
163
+ setIsInteracting(true);
164
+ // Debounce transition to `isInteractive=false`.
165
+ // Useful because wheel events don't have an "end" event.
166
+ interactionTimeoutRef.current = window.setTimeout(() => {
167
+ setIsInteracting(false);
168
+ }, 166);
169
+ setZoomDataCallback(prevZoomData => {
170
+ return prevZoomData.map(zoom => {
171
+ const option = optionsLookup[zoom.axisId];
172
+ if (!option) {
173
+ return zoom;
174
+ }
175
+ const centerRatio = option.axisDirection === 'x' ? getHorizontalCenterRatio(point, drawingArea) : getVerticalCenterRatio(point, drawingArea);
176
+ const {
177
+ scaleRatio,
178
+ isZoomIn
179
+ } = getWheelScaleRatio(event, option.step);
180
+ const [newMinRange, newMaxRange] = zoomAtPoint(centerRatio, scaleRatio, zoom, option);
181
+ if (!isSpanValid(newMinRange, newMaxRange, isZoomIn, option)) {
182
+ return zoom;
183
+ }
184
+ return {
185
+ axisId: zoom.axisId,
186
+ start: newMinRange,
187
+ end: newMaxRange
188
+ };
189
+ });
190
+ });
191
+ };
192
+ function pointerDownHandler(event) {
193
+ zoomEventCacheRef.current.push(event);
194
+ setIsInteracting(true);
195
+ }
196
+ function pointerMoveHandler(event) {
197
+ if (element === null) {
198
+ return;
199
+ }
200
+ const index = zoomEventCacheRef.current.findIndex(cachedEv => cachedEv.pointerId === event.pointerId);
201
+ zoomEventCacheRef.current[index] = event;
202
+
203
+ // Not a pinch gesture
204
+ if (zoomEventCacheRef.current.length !== 2) {
205
+ return;
206
+ }
207
+ const firstEvent = zoomEventCacheRef.current[0];
208
+ const curDiff = getDiff(zoomEventCacheRef.current);
209
+ setZoomDataCallback(prevZoomData => {
210
+ const newZoomData = prevZoomData.map(zoom => {
211
+ const option = optionsLookup[zoom.axisId];
212
+ if (!option) {
213
+ return zoom;
214
+ }
215
+ const {
216
+ scaleRatio,
217
+ isZoomIn
218
+ } = getPinchScaleRatio(curDiff, eventPrevDiff.current, option.step);
219
+
220
+ // If the scale ratio is 0, it means the pinch gesture is not valid.
221
+ if (scaleRatio === 0) {
222
+ return zoom;
223
+ }
224
+ const point = getSVGPoint(element, firstEvent);
225
+ const centerRatio = option.axisDirection === 'x' ? getHorizontalCenterRatio(point, drawingArea) : getVerticalCenterRatio(point, drawingArea);
226
+ const [newMinRange, newMaxRange] = zoomAtPoint(centerRatio, scaleRatio, zoom, option);
227
+ if (!isSpanValid(newMinRange, newMaxRange, isZoomIn, option)) {
228
+ return zoom;
229
+ }
230
+ return {
231
+ axisId: zoom.axisId,
232
+ start: newMinRange,
233
+ end: newMaxRange
234
+ };
235
+ });
236
+ eventPrevDiff.current = curDiff;
237
+ return newZoomData;
238
+ });
239
+ }
240
+ function pointerUpHandler(event) {
241
+ zoomEventCacheRef.current.splice(zoomEventCacheRef.current.findIndex(cachedEvent => cachedEvent.pointerId === event.pointerId), 1);
242
+ if (zoomEventCacheRef.current.length < 2) {
243
+ eventPrevDiff.current = 0;
244
+ }
245
+ if (event.type === 'pointerup' || event.type === 'pointercancel') {
246
+ setIsInteracting(false);
247
+ }
248
+ }
249
+ element.addEventListener('wheel', wheelHandler);
250
+ element.addEventListener('pointerdown', pointerDownHandler);
251
+ element.addEventListener('pointermove', pointerMoveHandler);
252
+ element.addEventListener('pointerup', pointerUpHandler);
253
+ element.addEventListener('pointercancel', pointerUpHandler);
254
+ element.addEventListener('pointerout', pointerUpHandler);
255
+ element.addEventListener('pointerleave', pointerUpHandler);
256
+
257
+ // Prevent zooming the entire page on touch devices
258
+ element.addEventListener('touchstart', preventDefault);
259
+ element.addEventListener('touchmove', preventDefault);
260
+ return () => {
261
+ element.removeEventListener('wheel', wheelHandler);
262
+ element.removeEventListener('pointerdown', pointerDownHandler);
263
+ element.removeEventListener('pointermove', pointerMoveHandler);
264
+ element.removeEventListener('pointerup', pointerUpHandler);
265
+ element.removeEventListener('pointercancel', pointerUpHandler);
266
+ element.removeEventListener('pointerout', pointerUpHandler);
267
+ element.removeEventListener('pointerleave', pointerUpHandler);
268
+ element.removeEventListener('touchstart', preventDefault);
269
+ element.removeEventListener('touchmove', preventDefault);
270
+ if (interactionTimeoutRef.current) {
271
+ clearTimeout(interactionTimeoutRef.current);
272
+ }
273
+ };
274
+ }, [svgRef, drawingArea, isZoomEnabled, optionsLookup, setIsInteracting, instance, setZoomDataCallback]);
275
+ return {
276
+ publicAPI: {
277
+ setZoomData: setZoomDataCallback
278
+ },
279
+ instance: {
280
+ setZoomData: setZoomDataCallback
281
+ }
282
+ };
283
+ };
284
+ useChartProZoom.params = {
285
+ initialZoom: true,
286
+ onZoomChange: true
287
+ };
288
+ useChartProZoom.getDefaultizedParams = ({
289
+ params
290
+ }) => {
291
+ const optionsLookup = _extends({}, creatZoomLookup('x')(params.defaultizedXAxis), creatZoomLookup('y')(params.defaultizedYAxis));
292
+ return _extends({}, params, {
293
+ optionsLookup
294
+ });
295
+ };
296
+ useChartProZoom.getInitialState = params => {
297
+ return {
298
+ zoom: {
299
+ zoomData: params.initialZoom === undefined ? initializeZoomData(params.optionsLookup) : params.initialZoom,
300
+ isInteracting: false
301
+ }
302
+ };
303
+ };
@@ -0,0 +1,10 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import { createSelector, selectorChartRawXAxis, selectorChartRawYAxis } from '@mui/x-charts/internals';
3
+ import { creatZoomLookup } from "./creatZoomLookup.js";
4
+ export const selectorChartZoomState = state => state.zoom;
5
+ const selectorChartXZoomOptionsLookup = createSelector(selectorChartRawXAxis, creatZoomLookup('x'));
6
+ const selectorChartYZoomOptionsLookup = createSelector(selectorChartRawYAxis, creatZoomLookup('y'));
7
+ export const selectorChartZoomOptionsLookup = createSelector([selectorChartXZoomOptionsLookup, selectorChartYZoomOptionsLookup], (xLookup, yLookup) => _extends({}, xLookup, yLookup));
8
+ export const selectorChartZoomData = createSelector(selectorChartZoomState, zoom => zoom.zoomData);
9
+ export const selectorChartZoomIsInteracting = createSelector(selectorChartZoomState, zoom => zoom.isInteracting);
10
+ export const selectorChartZoomIsEnabled = createSelector(selectorChartZoomOptionsLookup, optionsLookup => Object.keys(optionsLookup).length > 0);