@mui/x-charts-pro 8.4.0 → 8.5.1

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