@mui/x-charts-pro 8.4.0 → 8.5.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 (138) hide show
  1. package/BarChartPro/BarChartPro.d.ts +13 -5
  2. package/BarChartPro/BarChartPro.js +19 -1
  3. package/CHANGELOG.md +103 -0
  4. package/ChartContainerPro/ChartContainerPro.d.ts +0 -1
  5. package/ChartContainerPro/ChartProApi.d.ts +26 -0
  6. package/ChartContainerPro/ChartProApi.js +5 -0
  7. package/ChartContainerPro/index.d.ts +2 -1
  8. package/ChartContainerPro/index.js +11 -0
  9. package/ChartDataProviderPro/ChartDataProviderPro.d.ts +11 -1
  10. package/ChartDataProviderPro/ChartDataProviderPro.js +19 -3
  11. package/ChartDataProviderPro/useChartDataProviderProProps.d.ts +2 -0
  12. package/ChartDataProviderPro/useChartDataProviderProProps.js +5 -1
  13. package/ChartZoomSlider/internals/ChartAxisZoomSlider.d.ts +1 -3
  14. package/ChartZoomSlider/internals/ChartAxisZoomSlider.js +25 -315
  15. package/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.d.ts +24 -0
  16. package/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.js +251 -0
  17. package/ChartZoomSlider/internals/ChartAxisZoomSliderTrack.d.ts +18 -0
  18. package/ChartZoomSlider/internals/ChartAxisZoomSliderTrack.js +160 -0
  19. package/ChartZoomSlider/internals/constants.d.ts +5 -0
  20. package/ChartZoomSlider/internals/constants.js +11 -0
  21. package/ChartZoomSlider/internals/zoom-utils.d.ts +4 -0
  22. package/ChartZoomSlider/internals/zoom-utils.js +48 -0
  23. package/ChartsToolbarPro/ChartsToolbarPro.d.ts +8 -1
  24. package/ChartsToolbarPro/ChartsToolbarPro.js +42 -8
  25. package/ChartsToolbarPro/ChartsToolbarZoomInButton.d.ts +16 -0
  26. package/ChartsToolbarPro/ChartsToolbarZoomInButton.js +56 -0
  27. package/ChartsToolbarPro/ChartsToolbarZoomOutButton.d.ts +16 -0
  28. package/ChartsToolbarPro/ChartsToolbarZoomOutButton.js +56 -0
  29. package/ChartsToolbarPro/index.d.ts +3 -1
  30. package/ChartsToolbarPro/index.js +22 -0
  31. package/FunnelChart/FunnelChart.d.ts +2 -1
  32. package/FunnelChart/FunnelChart.js +2 -20
  33. package/FunnelChart/FunnelChart.plugins.d.ts +4 -0
  34. package/FunnelChart/FunnelChart.plugins.js +9 -0
  35. package/FunnelChart/funnelSlots.types.d.ts +4 -3
  36. package/FunnelChart/useFunnelChartProps.d.ts +2 -1
  37. package/FunnelChart/useFunnelChartProps.js +3 -1
  38. package/Heatmap/Heatmap.d.ts +17 -4
  39. package/Heatmap/Heatmap.js +56 -22
  40. package/Heatmap/Heatmap.plugins.d.ts +2 -1
  41. package/Heatmap/Heatmap.plugins.js +2 -1
  42. package/LineChartPro/LineChartPro.d.ts +13 -5
  43. package/LineChartPro/LineChartPro.js +19 -1
  44. package/RadarChartPro/RadarChartPro.d.ts +15 -0
  45. package/RadarChartPro/RadarChartPro.js +202 -0
  46. package/RadarChartPro/RadarChartPro.plugins.d.ts +4 -0
  47. package/RadarChartPro/RadarChartPro.plugins.js +9 -0
  48. package/RadarChartPro/index.d.ts +1 -0
  49. package/RadarChartPro/index.js +16 -0
  50. package/ScatterChartPro/ScatterChartPro.d.ts +13 -5
  51. package/ScatterChartPro/ScatterChartPro.js +19 -1
  52. package/context/index.d.ts +1 -0
  53. package/context/index.js +16 -0
  54. package/context/useChartApiContext.d.ts +9 -0
  55. package/context/useChartApiContext.js +17 -0
  56. package/esm/BarChartPro/BarChartPro.d.ts +13 -5
  57. package/esm/BarChartPro/BarChartPro.js +19 -1
  58. package/esm/ChartContainerPro/ChartContainerPro.d.ts +0 -1
  59. package/esm/ChartContainerPro/ChartProApi.d.ts +26 -0
  60. package/esm/ChartContainerPro/ChartProApi.js +1 -0
  61. package/esm/ChartContainerPro/index.d.ts +2 -1
  62. package/esm/ChartContainerPro/index.js +2 -1
  63. package/esm/ChartDataProviderPro/ChartDataProviderPro.d.ts +11 -1
  64. package/esm/ChartDataProviderPro/ChartDataProviderPro.js +20 -4
  65. package/esm/ChartDataProviderPro/useChartDataProviderProProps.d.ts +2 -0
  66. package/esm/ChartDataProviderPro/useChartDataProviderProProps.js +5 -1
  67. package/esm/ChartZoomSlider/internals/ChartAxisZoomSlider.d.ts +1 -3
  68. package/esm/ChartZoomSlider/internals/ChartAxisZoomSlider.js +19 -306
  69. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.d.ts +24 -0
  70. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.js +243 -0
  71. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderTrack.d.ts +18 -0
  72. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderTrack.js +152 -0
  73. package/esm/ChartZoomSlider/internals/constants.d.ts +5 -0
  74. package/esm/ChartZoomSlider/internals/constants.js +5 -0
  75. package/esm/ChartZoomSlider/internals/zoom-utils.d.ts +4 -0
  76. package/esm/ChartZoomSlider/internals/zoom-utils.js +40 -0
  77. package/esm/ChartsToolbarPro/ChartsToolbarPro.d.ts +8 -1
  78. package/esm/ChartsToolbarPro/ChartsToolbarPro.js +42 -9
  79. package/esm/ChartsToolbarPro/ChartsToolbarZoomInButton.d.ts +16 -0
  80. package/esm/ChartsToolbarPro/ChartsToolbarZoomInButton.js +50 -0
  81. package/esm/ChartsToolbarPro/ChartsToolbarZoomOutButton.d.ts +16 -0
  82. package/esm/ChartsToolbarPro/ChartsToolbarZoomOutButton.js +50 -0
  83. package/esm/ChartsToolbarPro/index.d.ts +3 -1
  84. package/esm/ChartsToolbarPro/index.js +3 -1
  85. package/esm/FunnelChart/FunnelChart.d.ts +2 -1
  86. package/esm/FunnelChart/FunnelChart.js +2 -20
  87. package/esm/FunnelChart/FunnelChart.plugins.d.ts +4 -0
  88. package/esm/FunnelChart/FunnelChart.plugins.js +3 -0
  89. package/esm/FunnelChart/funnelSlots.types.d.ts +4 -3
  90. package/esm/FunnelChart/useFunnelChartProps.d.ts +2 -1
  91. package/esm/FunnelChart/useFunnelChartProps.js +3 -1
  92. package/esm/Heatmap/Heatmap.d.ts +17 -4
  93. package/esm/Heatmap/Heatmap.js +56 -22
  94. package/esm/Heatmap/Heatmap.plugins.d.ts +2 -1
  95. package/esm/Heatmap/Heatmap.plugins.js +2 -1
  96. package/esm/LineChartPro/LineChartPro.d.ts +13 -5
  97. package/esm/LineChartPro/LineChartPro.js +19 -1
  98. package/esm/RadarChartPro/RadarChartPro.d.ts +15 -0
  99. package/esm/RadarChartPro/RadarChartPro.js +195 -0
  100. package/esm/RadarChartPro/RadarChartPro.plugins.d.ts +4 -0
  101. package/esm/RadarChartPro/RadarChartPro.plugins.js +3 -0
  102. package/esm/RadarChartPro/index.d.ts +1 -0
  103. package/esm/RadarChartPro/index.js +1 -0
  104. package/esm/ScatterChartPro/ScatterChartPro.d.ts +13 -5
  105. package/esm/ScatterChartPro/ScatterChartPro.js +19 -1
  106. package/esm/context/index.d.ts +1 -0
  107. package/esm/context/index.js +1 -0
  108. package/esm/context/useChartApiContext.d.ts +9 -0
  109. package/esm/context/useChartApiContext.js +11 -0
  110. package/esm/hooks/index.d.ts +2 -1
  111. package/esm/hooks/index.js +2 -1
  112. package/esm/index.d.ts +2 -1
  113. package/esm/index.js +2 -1
  114. package/esm/internals/material/index.d.ts +1 -0
  115. package/esm/internals/plugins/useChartProZoom/useChartProZoom.js +10 -0
  116. package/esm/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +358 -0
  117. package/esm/internals/plugins/useChartProZoom/useChartProZoom.selectors.js +15 -1
  118. package/esm/internals/plugins/useChartProZoom/useChartProZoom.types.d.ts +7 -0
  119. package/esm/models/index.d.ts +1 -1
  120. package/hooks/index.d.ts +2 -1
  121. package/hooks/index.js +21 -10
  122. package/index.d.ts +2 -1
  123. package/index.js +12 -1
  124. package/internals/material/index.d.ts +1 -0
  125. package/internals/plugins/useChartProZoom/useChartProZoom.js +10 -0
  126. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +358 -0
  127. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.js +16 -2
  128. package/internals/plugins/useChartProZoom/useChartProZoom.types.d.ts +7 -0
  129. package/models/index.d.ts +1 -1
  130. package/package.json +5 -5
  131. package/ChartsToolbarPro/internal/ChartsToolbarZoomInButton.d.ts +0 -13
  132. package/ChartsToolbarPro/internal/ChartsToolbarZoomInButton.js +0 -36
  133. package/ChartsToolbarPro/internal/ChartsToolbarZoomOutButton.d.ts +0 -13
  134. package/ChartsToolbarPro/internal/ChartsToolbarZoomOutButton.js +0 -36
  135. package/esm/ChartsToolbarPro/internal/ChartsToolbarZoomInButton.d.ts +0 -13
  136. package/esm/ChartsToolbarPro/internal/ChartsToolbarZoomInButton.js +0 -29
  137. package/esm/ChartsToolbarPro/internal/ChartsToolbarZoomOutButton.d.ts +0 -13
  138. package/esm/ChartsToolbarPro/internal/ChartsToolbarZoomOutButton.js +0 -29
@@ -2,44 +2,18 @@
2
2
  'use client';
3
3
 
4
4
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
6
5
  Object.defineProperty(exports, "__esModule", {
7
6
  value: true
8
7
  });
9
8
  exports.ChartAxisZoomSlider = ChartAxisZoomSlider;
10
- exports.calculateZoomEnd = calculateZoomEnd;
11
- exports.calculateZoomStart = calculateZoomStart;
12
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
9
  var React = _interopRequireWildcard(require("react"));
14
10
  var _internals = require("@mui/x-charts/internals");
15
- var _styles = require("@mui/material/styles");
16
11
  var _hooks = require("@mui/x-charts/hooks");
17
- var _rafThrottle = require("@mui/x-internals/rafThrottle");
18
- var _ChartsTooltipZoomSliderValue = require("./ChartsTooltipZoomSliderValue");
12
+ var _constants = require("./constants");
19
13
  var _useChartProZoom = require("../../internals/plugins/useChartProZoom");
20
- var _ChartAxisZoomSliderThumb = require("./ChartAxisZoomSliderThumb");
14
+ var _ChartAxisZoomSliderTrack = require("./ChartAxisZoomSliderTrack");
15
+ var _ChartAxisZoomSliderActiveTrack = require("./ChartAxisZoomSliderActiveTrack");
21
16
  var _jsxRuntime = require("react/jsx-runtime");
22
- const ZoomSliderTrack = (0, _styles.styled)('rect')(({
23
- theme
24
- }) => ({
25
- '&': {
26
- fill: theme.palette.mode === 'dark' ? (theme.vars || theme).palette.grey[800] : (theme.vars || theme).palette.grey[300]
27
- }
28
- }));
29
- const ZoomSliderActiveTrackRect = (0, _styles.styled)('rect')(({
30
- theme
31
- }) => ({
32
- '&': {
33
- fill: theme.palette.mode === 'dark' ? (theme.vars || theme).palette.grey[500] : (theme.vars || theme).palette.grey[600],
34
- cursor: 'grab'
35
- }
36
- }));
37
- const ZOOM_SLIDER_TRACK_SIZE = 8;
38
- const ZOOM_SLIDER_ACTIVE_TRACK_SIZE = 10;
39
- const ZOOM_SLIDER_THUMB_HEIGHT = 20;
40
- const ZOOM_SLIDER_THUMB_WIDTH = 10;
41
- const ZOOM_SLIDER_SIZE = Math.max(ZOOM_SLIDER_TRACK_SIZE, ZOOM_SLIDER_ACTIVE_TRACK_SIZE, ZOOM_SLIDER_THUMB_HEIGHT, ZOOM_SLIDER_THUMB_WIDTH);
42
-
43
17
  /**
44
18
  * Renders the zoom slider for a specific axis.
45
19
  * @internal
@@ -51,6 +25,7 @@ function ChartAxisZoomSlider({
51
25
  const store = (0, _internals.useStore)();
52
26
  const drawingArea = (0, _internals.useDrawingArea)();
53
27
  const zoomData = (0, _internals.useSelector)(store, _useChartProZoom.selectorChartAxisZoomData, axisId);
28
+ const [showTooltip, setShowTooltip] = React.useState(false);
54
29
  const {
55
30
  xAxis
56
31
  } = (0, _hooks.useXAxes)();
@@ -64,6 +39,7 @@ function ChartAxisZoomSlider({
64
39
  let y;
65
40
  let reverse;
66
41
  let axisPosition;
42
+ let tooltipConditions;
67
43
  if (axisDirection === 'x') {
68
44
  const axis = xAxis[axisId];
69
45
  if (!axis || axis.position === 'none') {
@@ -71,312 +47,46 @@ function ChartAxisZoomSlider({
71
47
  }
72
48
  const axisSize = axis.height;
73
49
  x = drawingArea.left;
74
- y = axis.position === 'bottom' ? drawingArea.top + drawingArea.height + axis.offset + axisSize + _internals.ZOOM_SLIDER_MARGIN : drawingArea.top - axis.offset - axisSize - ZOOM_SLIDER_SIZE - _internals.ZOOM_SLIDER_MARGIN;
50
+ y = axis.position === 'bottom' ? drawingArea.top + drawingArea.height + axis.offset + axisSize + _internals.ZOOM_SLIDER_MARGIN : drawingArea.top - axis.offset - axisSize - _constants.ZOOM_SLIDER_SIZE - _internals.ZOOM_SLIDER_MARGIN;
75
51
  reverse = axis.reverse ?? false;
76
52
  axisPosition = axis.position ?? 'bottom';
53
+ tooltipConditions = axis.zoom?.slider?.showTooltip ?? _internals.DEFAULT_ZOOM_SLIDER_SHOW_TOOLTIP;
77
54
  } else {
78
55
  const axis = yAxis[axisId];
79
56
  if (!axis || axis.position === 'none') {
80
57
  return null;
81
58
  }
82
59
  const axisSize = axis.width;
83
- x = axis.position === 'right' ? drawingArea.left + drawingArea.width + axis.offset + axisSize + _internals.ZOOM_SLIDER_MARGIN : drawingArea.left - axis.offset - axisSize - ZOOM_SLIDER_SIZE - _internals.ZOOM_SLIDER_MARGIN;
60
+ x = axis.position === 'right' ? drawingArea.left + drawingArea.width + axis.offset + axisSize + _internals.ZOOM_SLIDER_MARGIN : drawingArea.left - axis.offset - axisSize - _constants.ZOOM_SLIDER_SIZE - _internals.ZOOM_SLIDER_MARGIN;
84
61
  y = drawingArea.top;
85
62
  reverse = axis.reverse ?? false;
86
63
  axisPosition = axis.position ?? 'left';
64
+ tooltipConditions = axis.zoom?.slider?.showTooltip ?? _internals.DEFAULT_ZOOM_SLIDER_SHOW_TOOLTIP;
87
65
  }
88
- const backgroundRectOffset = (ZOOM_SLIDER_SIZE - ZOOM_SLIDER_TRACK_SIZE) / 2;
66
+ const backgroundRectOffset = (_constants.ZOOM_SLIDER_SIZE - _constants.ZOOM_SLIDER_TRACK_SIZE) / 2;
89
67
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("g", {
90
68
  transform: `translate(${x} ${y})`,
91
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(ZoomSliderTrack, {
69
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartAxisZoomSliderTrack.ChartAxisZoomSliderTrack, {
92
70
  x: axisDirection === 'x' ? 0 : backgroundRectOffset,
93
71
  y: axisDirection === 'x' ? backgroundRectOffset : 0,
94
- height: axisDirection === 'x' ? ZOOM_SLIDER_TRACK_SIZE : drawingArea.height,
95
- width: axisDirection === 'x' ? drawingArea.width : ZOOM_SLIDER_TRACK_SIZE,
96
- rx: ZOOM_SLIDER_TRACK_SIZE / 2,
97
- ry: ZOOM_SLIDER_TRACK_SIZE / 2
98
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(ChartAxisZoomSliderActiveTrack, {
72
+ height: axisDirection === 'x' ? _constants.ZOOM_SLIDER_TRACK_SIZE : drawingArea.height,
73
+ width: axisDirection === 'x' ? drawingArea.width : _constants.ZOOM_SLIDER_TRACK_SIZE,
74
+ rx: _constants.ZOOM_SLIDER_TRACK_SIZE / 2,
75
+ ry: _constants.ZOOM_SLIDER_TRACK_SIZE / 2,
76
+ axisId: axisId,
77
+ axisDirection: axisDirection,
78
+ reverse: reverse,
79
+ onSelectStart: tooltipConditions === 'hover' ? () => setShowTooltip(true) : undefined,
80
+ onSelectEnd: tooltipConditions === 'hover' ? () => setShowTooltip(false) : undefined
81
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartAxisZoomSliderActiveTrack.ChartAxisZoomSliderActiveTrack, {
99
82
  zoomData: zoomData,
100
83
  axisId: axisId,
101
84
  axisPosition: axisPosition,
102
85
  axisDirection: axisDirection,
103
- reverse: reverse
104
- })]
105
- });
106
- }
107
- const formatter = Intl.NumberFormat(undefined, {
108
- maximumFractionDigits: 0
109
- });
110
- const zoomValueFormatter = value => formatter.format(value);
111
- function ChartAxisZoomSliderActiveTrack({
112
- axisId,
113
- axisDirection,
114
- axisPosition,
115
- zoomData,
116
- reverse,
117
- valueFormatter = zoomValueFormatter
118
- }) {
119
- const {
120
- instance,
121
- svgRef
122
- } = (0, _internals.useChartContext)();
123
- const store = (0, _internals.useStore)();
124
- const drawingArea = (0, _internals.useDrawingArea)();
125
- const activePreviewRectRef = React.useRef(null);
126
- const [startThumbEl, setStartThumbEl] = React.useState(null);
127
- const [endThumbEl, setEndThumbEl] = React.useState(null);
128
- const [showTooltip, setShowTooltip] = React.useState(null);
129
- const previewThumbWidth = axisDirection === 'x' ? ZOOM_SLIDER_THUMB_WIDTH : ZOOM_SLIDER_THUMB_HEIGHT;
130
- const previewThumbHeight = axisDirection === 'x' ? ZOOM_SLIDER_THUMB_HEIGHT : ZOOM_SLIDER_THUMB_WIDTH;
131
- React.useEffect(() => {
132
- const activePreviewRect = activePreviewRectRef.current;
133
- if (!activePreviewRect) {
134
- return;
135
- }
136
-
137
- /* min and max values of zoom to ensure the pointer anchor in the slider is maintained */
138
- let pointerZoomMin;
139
- let pointerZoomMax;
140
- let prevPointerZoom = 0;
141
- const onPointerMove = (0, _rafThrottle.rafThrottle)(event => {
142
- const {
143
- left,
144
- top,
145
- height,
146
- width
147
- } = (0, _internals.selectorChartDrawingArea)(store.getSnapshot());
148
- const axisZoomData = (0, _useChartProZoom.selectorChartAxisZoomData)(store.getSnapshot(), axisId);
149
- const element = svgRef.current;
150
- if (!axisZoomData || !element) {
151
- return;
152
- }
153
- const point = (0, _internals.getSVGPoint)(element, event);
154
- let pointerZoom;
155
- if (axisDirection === 'x') {
156
- pointerZoom = (point.x - left) / width * 100;
157
- } else {
158
- pointerZoom = (top + height - point.y) / height * 100;
159
- }
160
- if (reverse) {
161
- pointerZoom = 100 - pointerZoom;
162
- }
163
- pointerZoom = Math.max(pointerZoomMin, Math.min(pointerZoomMax, pointerZoom));
164
- const deltaZoom = pointerZoom - prevPointerZoom;
165
- prevPointerZoom = pointerZoom;
166
- instance.moveZoomRange(axisId, deltaZoom);
167
- });
168
- const onPointerUp = () => {
169
- activePreviewRect.removeEventListener('pointermove', onPointerMove);
170
- activePreviewRect.removeEventListener('pointerup', onPointerUp);
171
- setShowTooltip(null);
172
- };
173
- const onPointerDown = event => {
174
- // Prevent text selection when dragging
175
- event.preventDefault();
176
- activePreviewRect.setPointerCapture(event.pointerId);
177
- const {
178
- left,
179
- top,
180
- height,
181
- width
182
- } = (0, _internals.selectorChartDrawingArea)(store.getSnapshot());
183
- const axisZoomData = (0, _useChartProZoom.selectorChartAxisZoomData)(store.getSnapshot(), axisId);
184
- const element = svgRef.current;
185
- if (!axisZoomData || !element) {
186
- return;
187
- }
188
- const point = (0, _internals.getSVGPoint)(element, event);
189
-
190
- // The corresponding value of zoom where the pointer was pressed
191
- let pointerDownZoom;
192
- if (axisDirection === 'x') {
193
- pointerDownZoom = (point.x - left) / width * 100;
194
- } else {
195
- pointerDownZoom = (top + height - point.y) / height * 100;
196
- }
197
- if (reverse) {
198
- pointerDownZoom = 100 - pointerDownZoom;
199
- }
200
- prevPointerZoom = pointerDownZoom;
201
- pointerZoomMin = pointerDownZoom - axisZoomData.start;
202
- pointerZoomMax = 100 - (axisZoomData.end - pointerDownZoom);
203
- setShowTooltip('both');
204
- activePreviewRect.addEventListener('pointerup', onPointerUp);
205
- activePreviewRect.addEventListener('pointermove', onPointerMove);
206
- };
207
- activePreviewRect.addEventListener('pointerdown', onPointerDown);
208
-
209
- // eslint-disable-next-line consistent-return
210
- return () => {
211
- activePreviewRect.removeEventListener('pointerdown', onPointerDown);
212
- onPointerMove.clear();
213
- };
214
- }, [axisDirection, axisId, instance, reverse, store, svgRef]);
215
- const onStartThumbMove = event => {
216
- const element = svgRef.current;
217
- if (!element) {
218
- return;
219
- }
220
- const point = (0, _internals.getSVGPoint)(element, event);
221
- instance.setZoomData(prevZoomData => {
222
- const {
223
- left,
224
- top,
225
- width,
226
- height
227
- } = (0, _internals.selectorChartDrawingArea)(store.value);
228
- const zoomOptions = (0, _internals.selectorChartAxisZoomOptionsLookup)(store.value, axisId);
229
- return prevZoomData.map(zoom => {
230
- if (zoom.axisId === axisId) {
231
- let newStart;
232
- if (axisDirection === 'x') {
233
- newStart = (point.x - left) / width * 100;
234
- } else {
235
- newStart = (top + height - point.y) / height * 100;
236
- }
237
- if (reverse) {
238
- newStart = 100 - newStart;
239
- }
240
- return (0, _extends2.default)({}, zoom, {
241
- start: calculateZoomStart(newStart, zoom, zoomOptions)
242
- });
243
- }
244
- return zoom;
245
- });
246
- });
247
- };
248
- const onEndThumbMove = event => {
249
- const element = svgRef.current;
250
- if (!element) {
251
- return;
252
- }
253
- const point = (0, _internals.getSVGPoint)(element, event);
254
- instance.setZoomData(prevZoomData => {
255
- const {
256
- left,
257
- top,
258
- width,
259
- height
260
- } = (0, _internals.selectorChartDrawingArea)(store.value);
261
- const zoomOptions = (0, _internals.selectorChartAxisZoomOptionsLookup)(store.value, axisId);
262
- return prevZoomData.map(zoom => {
263
- if (zoom.axisId === axisId) {
264
- let newEnd;
265
- if (axisDirection === 'x') {
266
- newEnd = (point.x - left) / width * 100;
267
- } else {
268
- newEnd = (top + height - point.y) / height * 100;
269
- }
270
- if (reverse) {
271
- newEnd = 100 - newEnd;
272
- }
273
- return (0, _extends2.default)({}, zoom, {
274
- end: calculateZoomEnd(newEnd, zoom, zoomOptions)
275
- });
276
- }
277
- return zoom;
278
- });
279
- });
280
- };
281
- let previewX;
282
- let previewY;
283
- let previewWidth;
284
- let previewHeight;
285
- let startThumbX;
286
- let startThumbY;
287
- let endThumbX;
288
- let endThumbY;
289
- if (axisDirection === 'x') {
290
- previewX = zoomData.start / 100 * drawingArea.width;
291
- previewY = 0;
292
- previewWidth = drawingArea.width * (zoomData.end - zoomData.start) / 100;
293
- previewHeight = ZOOM_SLIDER_ACTIVE_TRACK_SIZE;
294
- startThumbX = zoomData.start / 100 * drawingArea.width;
295
- startThumbY = 0;
296
- endThumbX = zoomData.end / 100 * drawingArea.width;
297
- endThumbY = 0;
298
- if (reverse) {
299
- previewX = drawingArea.width - previewX - previewWidth;
300
- startThumbX = drawingArea.width - startThumbX;
301
- endThumbX = drawingArea.width - endThumbX;
302
- }
303
- startThumbX -= previewThumbWidth / 2;
304
- endThumbX -= previewThumbWidth / 2;
305
- } else {
306
- previewX = 0;
307
- previewY = drawingArea.height - zoomData.end / 100 * drawingArea.height;
308
- previewWidth = ZOOM_SLIDER_ACTIVE_TRACK_SIZE;
309
- previewHeight = drawingArea.height * (zoomData.end - zoomData.start) / 100;
310
- startThumbX = 0;
311
- startThumbY = drawingArea.height - zoomData.start / 100 * drawingArea.height;
312
- endThumbX = 0;
313
- endThumbY = drawingArea.height - zoomData.end / 100 * drawingArea.height;
314
- if (reverse) {
315
- previewY = drawingArea.height - previewY - previewHeight;
316
- startThumbY = drawingArea.height - startThumbY;
317
- endThumbY = drawingArea.height - endThumbY;
318
- }
319
- startThumbY -= previewThumbHeight / 2;
320
- endThumbY -= previewThumbHeight / 2;
321
- }
322
- const previewOffset = (ZOOM_SLIDER_THUMB_HEIGHT - ZOOM_SLIDER_ACTIVE_TRACK_SIZE) / 2;
323
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
324
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(ZoomSliderActiveTrackRect, {
325
- ref: activePreviewRectRef,
326
- x: previewX + (axisDirection === 'x' ? 0 : previewOffset),
327
- y: previewY + (axisDirection === 'x' ? previewOffset : 0),
328
- width: previewWidth,
329
- height: previewHeight,
330
- onPointerEnter: () => setShowTooltip('both'),
331
- onPointerLeave: () => setShowTooltip(null)
332
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartAxisZoomSliderThumb.ChartAxisZoomSliderThumb, {
333
- ref: setStartThumbEl,
334
- x: startThumbX,
335
- y: startThumbY,
336
- width: previewThumbWidth,
337
- height: previewThumbHeight,
338
- orientation: axisDirection === 'x' ? 'horizontal' : 'vertical',
339
- onMove: onStartThumbMove,
340
- onPointerEnter: () => setShowTooltip('start'),
341
- onPointerLeave: () => setShowTooltip(null),
342
- placement: "start"
343
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartAxisZoomSliderThumb.ChartAxisZoomSliderThumb, {
344
- ref: setEndThumbEl,
345
- x: endThumbX,
346
- y: endThumbY,
347
- width: previewThumbWidth,
348
- height: previewThumbHeight,
349
- orientation: axisDirection === 'x' ? 'horizontal' : 'vertical',
350
- onMove: onEndThumbMove,
351
- onPointerEnter: () => setShowTooltip('end'),
352
- onPointerLeave: () => setShowTooltip(null),
353
- placement: "end"
354
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartsTooltipZoomSliderValue.ChartsTooltipZoomSliderValue, {
355
- anchorEl: startThumbEl,
356
- open: showTooltip === 'start' || showTooltip === 'both',
357
- placement: axisPosition,
358
- children: valueFormatter(zoomData.start)
359
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartsTooltipZoomSliderValue.ChartsTooltipZoomSliderValue, {
360
- anchorEl: endThumbEl,
361
- open: showTooltip === 'end' || showTooltip === 'both',
362
- placement: axisPosition,
363
- children: valueFormatter(zoomData.end)
86
+ reverse: reverse,
87
+ showTooltip: showTooltip && tooltipConditions !== 'never' || tooltipConditions === 'always',
88
+ onPointerEnter: tooltipConditions === 'hover' ? () => setShowTooltip(true) : undefined,
89
+ onPointerLeave: tooltipConditions === 'hover' ? () => setShowTooltip(false) : undefined
364
90
  })]
365
91
  });
366
- }
367
- function calculateZoomStart(newStart, currentZoom, options) {
368
- const {
369
- minStart,
370
- minSpan,
371
- maxSpan
372
- } = options;
373
- return Math.max(minStart, currentZoom.end - maxSpan, Math.min(currentZoom.end - minSpan, newStart));
374
- }
375
- function calculateZoomEnd(newEnd, currentZoom, options) {
376
- const {
377
- maxEnd,
378
- minSpan,
379
- maxSpan
380
- } = options;
381
- return Math.min(maxEnd, currentZoom.start + maxSpan, Math.max(currentZoom.start + minSpan, newEnd));
382
92
  }
@@ -0,0 +1,24 @@
1
+ import { AxisId, ZoomData } from '@mui/x-charts/internals';
2
+ import * as React from 'react';
3
+ export interface ChartAxisZoomSliderActiveTrackProps {
4
+ axisId: AxisId;
5
+ axisDirection: 'x' | 'y';
6
+ axisPosition: 'top' | 'bottom' | 'left' | 'right';
7
+ zoomData: ZoomData;
8
+ reverse?: boolean;
9
+ valueFormatter?: (value: number) => string;
10
+ showTooltip: boolean;
11
+ onPointerEnter?: () => void;
12
+ onPointerLeave?: () => void;
13
+ }
14
+ export declare function ChartAxisZoomSliderActiveTrack({
15
+ axisId,
16
+ axisDirection,
17
+ axisPosition,
18
+ zoomData,
19
+ reverse,
20
+ valueFormatter,
21
+ showTooltip,
22
+ onPointerEnter,
23
+ onPointerLeave
24
+ }: ChartAxisZoomSliderActiveTrackProps): React.JSX.Element;
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ChartAxisZoomSliderActiveTrack = ChartAxisZoomSliderActiveTrack;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _styles = require("@mui/material/styles");
11
+ var _internals = require("@mui/x-charts/internals");
12
+ var React = _interopRequireWildcard(require("react"));
13
+ var _rafThrottle = require("@mui/x-internals/rafThrottle");
14
+ var _useChartProZoom = require("../../internals/plugins/useChartProZoom");
15
+ var _ChartAxisZoomSliderThumb = require("./ChartAxisZoomSliderThumb");
16
+ var _ChartsTooltipZoomSliderValue = require("./ChartsTooltipZoomSliderValue");
17
+ var _zoomUtils = require("./zoom-utils");
18
+ var _constants = require("./constants");
19
+ var _jsxRuntime = require("react/jsx-runtime");
20
+ const ZoomSliderActiveTrackRect = (0, _styles.styled)('rect')(({
21
+ theme
22
+ }) => ({
23
+ '&': {
24
+ fill: theme.palette.mode === 'dark' ? (theme.vars || theme).palette.grey[500] : (theme.vars || theme).palette.grey[600],
25
+ cursor: 'grab'
26
+ }
27
+ }));
28
+ const formatter = Intl.NumberFormat(undefined, {
29
+ maximumFractionDigits: 0
30
+ });
31
+ const zoomValueFormatter = value => formatter.format(value);
32
+ function ChartAxisZoomSliderActiveTrack({
33
+ axisId,
34
+ axisDirection,
35
+ axisPosition,
36
+ zoomData,
37
+ reverse,
38
+ valueFormatter = zoomValueFormatter,
39
+ showTooltip,
40
+ onPointerEnter,
41
+ onPointerLeave
42
+ }) {
43
+ const {
44
+ instance,
45
+ svgRef
46
+ } = (0, _internals.useChartContext)();
47
+ const store = (0, _internals.useStore)();
48
+ const drawingArea = (0, _internals.useDrawingArea)();
49
+ const activePreviewRectRef = React.useRef(null);
50
+ const [startThumbEl, setStartThumbEl] = React.useState(null);
51
+ const [endThumbEl, setEndThumbEl] = React.useState(null);
52
+ const previewThumbWidth = axisDirection === 'x' ? _constants.ZOOM_SLIDER_THUMB_WIDTH : _constants.ZOOM_SLIDER_THUMB_HEIGHT;
53
+ const previewThumbHeight = axisDirection === 'x' ? _constants.ZOOM_SLIDER_THUMB_HEIGHT : _constants.ZOOM_SLIDER_THUMB_WIDTH;
54
+ React.useEffect(() => {
55
+ const activePreviewRect = activePreviewRectRef.current;
56
+ if (!activePreviewRect) {
57
+ return;
58
+ }
59
+
60
+ /* min and max values of zoom to ensure the pointer anchor in the slider is maintained */
61
+ let pointerZoomMin;
62
+ let pointerZoomMax;
63
+ let prevPointerZoom = 0;
64
+ const onPointerMove = (0, _rafThrottle.rafThrottle)(event => {
65
+ const element = svgRef.current;
66
+ if (!element) {
67
+ return;
68
+ }
69
+ const point = (0, _internals.getSVGPoint)(element, event);
70
+ let pointerZoom = (0, _zoomUtils.calculateZoomFromPoint)(store.getSnapshot(), axisId, point);
71
+ if (pointerZoom === null) {
72
+ return;
73
+ }
74
+ pointerZoom = Math.max(pointerZoomMin, Math.min(pointerZoomMax, pointerZoom));
75
+ const deltaZoom = pointerZoom - prevPointerZoom;
76
+ prevPointerZoom = pointerZoom;
77
+ instance.moveZoomRange(axisId, deltaZoom);
78
+ });
79
+ const onPointerUp = () => {
80
+ activePreviewRect.removeEventListener('pointermove', onPointerMove);
81
+ document.removeEventListener('pointerup', onPointerUp);
82
+ };
83
+ const onPointerDown = event => {
84
+ // Prevent text selection when dragging
85
+ event.preventDefault();
86
+ activePreviewRect.setPointerCapture(event.pointerId);
87
+ const axisZoomData = (0, _useChartProZoom.selectorChartAxisZoomData)(store.getSnapshot(), axisId);
88
+ const element = svgRef.current;
89
+ if (!axisZoomData || !element) {
90
+ return;
91
+ }
92
+ const point = (0, _internals.getSVGPoint)(element, event);
93
+ const pointerDownZoom = (0, _zoomUtils.calculateZoomFromPoint)(store.getSnapshot(), axisId, point);
94
+ if (pointerDownZoom === null) {
95
+ return;
96
+ }
97
+ prevPointerZoom = pointerDownZoom;
98
+ pointerZoomMin = pointerDownZoom - axisZoomData.start;
99
+ pointerZoomMax = 100 - (axisZoomData.end - pointerDownZoom);
100
+ document.addEventListener('pointerup', onPointerUp);
101
+ activePreviewRect.addEventListener('pointermove', onPointerMove);
102
+ };
103
+ activePreviewRect.addEventListener('pointerdown', onPointerDown);
104
+
105
+ // eslint-disable-next-line consistent-return
106
+ return () => {
107
+ activePreviewRect.removeEventListener('pointerdown', onPointerDown);
108
+ onPointerMove.clear();
109
+ };
110
+ }, [axisDirection, axisId, instance, reverse, store, svgRef]);
111
+ const onStartThumbMove = event => {
112
+ const element = svgRef.current;
113
+ if (!element) {
114
+ return;
115
+ }
116
+ const point = (0, _internals.getSVGPoint)(element, event);
117
+ instance.setZoomData(prevZoomData => {
118
+ const zoomOptions = (0, _internals.selectorChartAxisZoomOptionsLookup)(store.getSnapshot(), axisId);
119
+ return prevZoomData.map(zoom => {
120
+ if (zoom.axisId === axisId) {
121
+ const newStart = (0, _zoomUtils.calculateZoomFromPoint)(store.getSnapshot(), axisId, point);
122
+ if (newStart === null) {
123
+ return zoom;
124
+ }
125
+ return (0, _extends2.default)({}, zoom, {
126
+ start: (0, _zoomUtils.calculateZoomStart)(newStart, zoom, zoomOptions)
127
+ });
128
+ }
129
+ return zoom;
130
+ });
131
+ });
132
+ };
133
+ const onEndThumbMove = event => {
134
+ const element = svgRef.current;
135
+ if (!element) {
136
+ return;
137
+ }
138
+ const point = (0, _internals.getSVGPoint)(element, event);
139
+ instance.setZoomData(prevZoomData => {
140
+ const {
141
+ left,
142
+ top,
143
+ width,
144
+ height
145
+ } = (0, _internals.selectorChartDrawingArea)(store.getSnapshot());
146
+ const zoomOptions = (0, _internals.selectorChartAxisZoomOptionsLookup)(store.getSnapshot(), axisId);
147
+ return prevZoomData.map(zoom => {
148
+ if (zoom.axisId === axisId) {
149
+ let newEnd;
150
+ if (axisDirection === 'x') {
151
+ newEnd = (point.x - left) / width * 100;
152
+ } else {
153
+ newEnd = (top + height - point.y) / height * 100;
154
+ }
155
+ if (reverse) {
156
+ newEnd = 100 - newEnd;
157
+ }
158
+ return (0, _extends2.default)({}, zoom, {
159
+ end: (0, _zoomUtils.calculateZoomEnd)(newEnd, zoom, zoomOptions)
160
+ });
161
+ }
162
+ return zoom;
163
+ });
164
+ });
165
+ };
166
+ let previewX;
167
+ let previewY;
168
+ let previewWidth;
169
+ let previewHeight;
170
+ let startThumbX;
171
+ let startThumbY;
172
+ let endThumbX;
173
+ let endThumbY;
174
+ if (axisDirection === 'x') {
175
+ previewX = zoomData.start / 100 * drawingArea.width;
176
+ previewY = 0;
177
+ previewWidth = drawingArea.width * (zoomData.end - zoomData.start) / 100;
178
+ previewHeight = _constants.ZOOM_SLIDER_ACTIVE_TRACK_SIZE;
179
+ startThumbX = zoomData.start / 100 * drawingArea.width;
180
+ startThumbY = 0;
181
+ endThumbX = zoomData.end / 100 * drawingArea.width;
182
+ endThumbY = 0;
183
+ if (reverse) {
184
+ previewX = drawingArea.width - previewX - previewWidth;
185
+ startThumbX = drawingArea.width - startThumbX;
186
+ endThumbX = drawingArea.width - endThumbX;
187
+ }
188
+ startThumbX -= previewThumbWidth / 2;
189
+ endThumbX -= previewThumbWidth / 2;
190
+ } else {
191
+ previewX = 0;
192
+ previewY = drawingArea.height - zoomData.end / 100 * drawingArea.height;
193
+ previewWidth = _constants.ZOOM_SLIDER_ACTIVE_TRACK_SIZE;
194
+ previewHeight = drawingArea.height * (zoomData.end - zoomData.start) / 100;
195
+ startThumbX = 0;
196
+ startThumbY = drawingArea.height - zoomData.start / 100 * drawingArea.height;
197
+ endThumbX = 0;
198
+ endThumbY = drawingArea.height - zoomData.end / 100 * drawingArea.height;
199
+ if (reverse) {
200
+ previewY = drawingArea.height - previewY - previewHeight;
201
+ startThumbY = drawingArea.height - startThumbY;
202
+ endThumbY = drawingArea.height - endThumbY;
203
+ }
204
+ startThumbY -= previewThumbHeight / 2;
205
+ endThumbY -= previewThumbHeight / 2;
206
+ }
207
+ const previewOffset = (_constants.ZOOM_SLIDER_THUMB_HEIGHT - _constants.ZOOM_SLIDER_ACTIVE_TRACK_SIZE) / 2;
208
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
209
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(ZoomSliderActiveTrackRect, {
210
+ ref: activePreviewRectRef,
211
+ x: previewX + (axisDirection === 'x' ? 0 : previewOffset),
212
+ y: previewY + (axisDirection === 'x' ? previewOffset : 0),
213
+ width: previewWidth,
214
+ height: previewHeight,
215
+ onPointerEnter: onPointerEnter,
216
+ onPointerLeave: onPointerLeave
217
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartAxisZoomSliderThumb.ChartAxisZoomSliderThumb, {
218
+ ref: setStartThumbEl,
219
+ x: startThumbX,
220
+ y: startThumbY,
221
+ width: previewThumbWidth,
222
+ height: previewThumbHeight,
223
+ orientation: axisDirection === 'x' ? 'horizontal' : 'vertical',
224
+ onMove: onStartThumbMove,
225
+ onPointerEnter: onPointerEnter,
226
+ onPointerLeave: onPointerLeave,
227
+ placement: "start"
228
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartAxisZoomSliderThumb.ChartAxisZoomSliderThumb, {
229
+ ref: setEndThumbEl,
230
+ x: endThumbX,
231
+ y: endThumbY,
232
+ width: previewThumbWidth,
233
+ height: previewThumbHeight,
234
+ orientation: axisDirection === 'x' ? 'horizontal' : 'vertical',
235
+ onMove: onEndThumbMove,
236
+ onPointerEnter: onPointerEnter,
237
+ onPointerLeave: onPointerLeave,
238
+ placement: "end"
239
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartsTooltipZoomSliderValue.ChartsTooltipZoomSliderValue, {
240
+ anchorEl: startThumbEl,
241
+ open: showTooltip,
242
+ placement: axisPosition,
243
+ children: valueFormatter(zoomData.start)
244
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ChartsTooltipZoomSliderValue.ChartsTooltipZoomSliderValue, {
245
+ anchorEl: endThumbEl,
246
+ open: showTooltip,
247
+ placement: axisPosition,
248
+ children: valueFormatter(zoomData.end)
249
+ })]
250
+ });
251
+ }
@@ -0,0 +1,18 @@
1
+ import * as React from 'react';
2
+ import { AxisId } from '@mui/x-charts/internals';
3
+ interface ChartAxisZoomSliderTrackProps extends React.ComponentProps<'rect'> {
4
+ axisId: AxisId;
5
+ axisDirection: 'x' | 'y';
6
+ reverse: boolean;
7
+ onSelectStart?: () => void;
8
+ onSelectEnd?: () => void;
9
+ }
10
+ export declare function ChartAxisZoomSliderTrack({
11
+ axisId,
12
+ axisDirection,
13
+ reverse,
14
+ onSelectStart,
15
+ onSelectEnd,
16
+ ...other
17
+ }: ChartAxisZoomSliderTrackProps): React.JSX.Element;
18
+ export {};