@mui/x-charts 7.0.0-beta.0 → 7.0.0-beta.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 (185) hide show
  1. package/BarChart/BarChart.d.ts +2 -1
  2. package/BarChart/BarChart.js +23 -4
  3. package/BarChart/BarElement.d.ts +1 -1
  4. package/BarChart/BarElement.js +6 -3
  5. package/BarChart/BarPlot.d.ts +8 -1
  6. package/BarChart/BarPlot.js +19 -5
  7. package/BarChart/formatter.js +1 -1
  8. package/CHANGELOG.md +247 -0
  9. package/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.d.ts +20 -0
  10. package/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.js +83 -0
  11. package/ChartsOnAxisClickHandler/index.d.ts +1 -0
  12. package/ChartsOnAxisClickHandler/index.js +16 -0
  13. package/ChartsOnAxisClickHandler/package.json +6 -0
  14. package/ChartsReferenceLine/ChartsXReferenceLine.js +1 -1
  15. package/ChartsReferenceLine/ChartsYReferenceLine.js +1 -1
  16. package/ChartsTooltip/ChartsAxisTooltipContent.js +6 -5
  17. package/ChartsTooltip/DefaultChartsAxisTooltipContent.js +6 -4
  18. package/ChartsTooltip/utils.d.ts +3 -1
  19. package/ChartsTooltip/utils.js +8 -0
  20. package/ChartsVoronoiHandler/ChartsVoronoiHandler.d.ts +7 -0
  21. package/ChartsVoronoiHandler/ChartsVoronoiHandler.js +92 -44
  22. package/LineChart/AnimatedArea.d.ts +1361 -0
  23. package/LineChart/AnimatedArea.js +111 -0
  24. package/LineChart/AnimatedLine.d.ts +1361 -0
  25. package/LineChart/AnimatedLine.js +113 -0
  26. package/LineChart/AreaElement.d.ts +17 -17
  27. package/LineChart/AreaElement.js +17 -34
  28. package/LineChart/AreaPlot.d.ts +12 -7
  29. package/LineChart/AreaPlot.js +91 -58
  30. package/LineChart/LineChart.d.ts +13 -4
  31. package/LineChart/LineChart.js +35 -6
  32. package/LineChart/LineElement.d.ts +17 -17
  33. package/LineChart/LineElement.js +16 -36
  34. package/LineChart/LineHighlightElement.js +3 -2
  35. package/LineChart/LinePlot.d.ts +12 -7
  36. package/LineChart/LinePlot.js +89 -56
  37. package/LineChart/MarkElement.d.ts +5 -2
  38. package/LineChart/MarkElement.js +26 -13
  39. package/LineChart/MarkPlot.d.ts +8 -1
  40. package/LineChart/MarkPlot.js +80 -51
  41. package/LineChart/formatter.js +1 -1
  42. package/LineChart/index.d.ts +2 -0
  43. package/LineChart/index.js +22 -0
  44. package/PieChart/PieArcLabelPlot.d.ts +1 -1
  45. package/PieChart/PieArcLabelPlot.js +1 -1
  46. package/PieChart/PieArcPlot.d.ts +2 -2
  47. package/PieChart/PieArcPlot.js +6 -6
  48. package/PieChart/PieChart.d.ts +1 -1
  49. package/PieChart/PieChart.js +4 -4
  50. package/PieChart/PiePlot.d.ts +1 -1
  51. package/PieChart/PiePlot.js +4 -4
  52. package/ScatterChart/Scatter.d.ts +7 -1
  53. package/ScatterChart/Scatter.js +17 -3
  54. package/ScatterChart/ScatterChart.d.ts +8 -2
  55. package/ScatterChart/ScatterChart.js +11 -2
  56. package/ScatterChart/ScatterPlot.d.ts +1 -1
  57. package/ScatterChart/ScatterPlot.js +10 -2
  58. package/SparkLineChart/SparkLineChart.js +2 -0
  59. package/context/DrawingProvider.d.ts +6 -1
  60. package/context/DrawingProvider.js +9 -2
  61. package/context/InteractionProvider.d.ts +3 -3
  62. package/esm/BarChart/BarChart.js +23 -4
  63. package/esm/BarChart/BarElement.js +6 -3
  64. package/esm/BarChart/BarPlot.js +19 -5
  65. package/esm/BarChart/formatter.js +1 -1
  66. package/esm/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.js +77 -0
  67. package/esm/ChartsOnAxisClickHandler/index.js +1 -0
  68. package/esm/ChartsReferenceLine/ChartsXReferenceLine.js +1 -1
  69. package/esm/ChartsReferenceLine/ChartsYReferenceLine.js +1 -1
  70. package/esm/ChartsTooltip/ChartsAxisTooltipContent.js +6 -5
  71. package/esm/ChartsTooltip/DefaultChartsAxisTooltipContent.js +7 -4
  72. package/esm/ChartsTooltip/utils.js +6 -0
  73. package/esm/ChartsVoronoiHandler/ChartsVoronoiHandler.js +92 -44
  74. package/esm/LineChart/AnimatedArea.js +103 -0
  75. package/esm/LineChart/AnimatedLine.js +105 -0
  76. package/esm/LineChart/AreaElement.js +16 -33
  77. package/esm/LineChart/AreaPlot.js +92 -59
  78. package/esm/LineChart/LineChart.js +35 -6
  79. package/esm/LineChart/LineElement.js +16 -35
  80. package/esm/LineChart/LineHighlightElement.js +3 -2
  81. package/esm/LineChart/LinePlot.js +90 -57
  82. package/esm/LineChart/MarkElement.js +26 -13
  83. package/esm/LineChart/MarkPlot.js +80 -51
  84. package/esm/LineChart/formatter.js +1 -1
  85. package/esm/LineChart/index.js +2 -0
  86. package/esm/PieChart/PieArcLabelPlot.js +1 -1
  87. package/esm/PieChart/PieArcPlot.js +6 -6
  88. package/esm/PieChart/PieChart.js +4 -4
  89. package/esm/PieChart/PiePlot.js +4 -4
  90. package/esm/ScatterChart/Scatter.js +17 -3
  91. package/esm/ScatterChart/ScatterChart.js +11 -2
  92. package/esm/ScatterChart/ScatterPlot.js +10 -2
  93. package/esm/SparkLineChart/SparkLineChart.js +2 -0
  94. package/esm/context/DrawingProvider.js +9 -2
  95. package/esm/hooks/useDrawingArea.js +7 -3
  96. package/esm/index.js +1 -0
  97. package/esm/internals/geometry.js +1 -1
  98. package/esm/internals/useAnimatedPath.js +29 -0
  99. package/esm/internals/utils.js +7 -0
  100. package/hooks/useDrawingArea.d.ts +2 -0
  101. package/hooks/useDrawingArea.js +7 -3
  102. package/index.d.ts +1 -0
  103. package/index.js +12 -1
  104. package/internals/geometry.js +1 -1
  105. package/internals/useAnimatedPath.d.ts +1 -0
  106. package/internals/useAnimatedPath.js +38 -0
  107. package/internals/utils.d.ts +4 -0
  108. package/internals/utils.js +8 -0
  109. package/legacy/BarChart/BarChart.js +23 -4
  110. package/legacy/BarChart/BarElement.js +5 -2
  111. package/legacy/BarChart/BarPlot.js +18 -4
  112. package/legacy/BarChart/formatter.js +1 -1
  113. package/legacy/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.js +75 -0
  114. package/legacy/ChartsOnAxisClickHandler/index.js +1 -0
  115. package/legacy/ChartsReferenceLine/ChartsXReferenceLine.js +1 -1
  116. package/legacy/ChartsReferenceLine/ChartsYReferenceLine.js +1 -1
  117. package/legacy/ChartsTooltip/ChartsAxisTooltipContent.js +6 -7
  118. package/legacy/ChartsTooltip/DefaultChartsAxisTooltipContent.js +7 -4
  119. package/legacy/ChartsTooltip/utils.js +6 -0
  120. package/legacy/ChartsVoronoiHandler/ChartsVoronoiHandler.js +88 -44
  121. package/legacy/LineChart/AnimatedArea.js +102 -0
  122. package/legacy/LineChart/AnimatedLine.js +104 -0
  123. package/legacy/LineChart/AreaElement.js +15 -35
  124. package/legacy/LineChart/AreaPlot.js +102 -66
  125. package/legacy/LineChart/LineChart.js +35 -6
  126. package/legacy/LineChart/LineElement.js +15 -37
  127. package/legacy/LineChart/LineHighlightElement.js +3 -2
  128. package/legacy/LineChart/LinePlot.js +97 -63
  129. package/legacy/LineChart/MarkElement.js +29 -12
  130. package/legacy/LineChart/MarkPlot.js +83 -53
  131. package/legacy/LineChart/formatter.js +1 -1
  132. package/legacy/LineChart/index.js +2 -0
  133. package/legacy/PieChart/PieArcLabelPlot.js +1 -1
  134. package/legacy/PieChart/PieArcPlot.js +6 -6
  135. package/legacy/PieChart/PieChart.js +4 -4
  136. package/legacy/PieChart/PiePlot.js +4 -4
  137. package/legacy/ScatterChart/Scatter.js +19 -3
  138. package/legacy/ScatterChart/ScatterChart.js +11 -2
  139. package/legacy/ScatterChart/ScatterPlot.js +10 -2
  140. package/legacy/SparkLineChart/SparkLineChart.js +2 -0
  141. package/legacy/context/DrawingProvider.js +11 -2
  142. package/legacy/hooks/useDrawingArea.js +7 -3
  143. package/legacy/index.js +2 -1
  144. package/legacy/internals/geometry.js +1 -1
  145. package/legacy/internals/useAnimatedPath.js +32 -0
  146. package/legacy/internals/utils.js +7 -0
  147. package/modern/BarChart/BarChart.js +23 -4
  148. package/modern/BarChart/BarElement.js +6 -3
  149. package/modern/BarChart/BarPlot.js +19 -5
  150. package/modern/BarChart/formatter.js +1 -1
  151. package/modern/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.js +75 -0
  152. package/modern/ChartsOnAxisClickHandler/index.js +1 -0
  153. package/modern/ChartsReferenceLine/ChartsXReferenceLine.js +1 -1
  154. package/modern/ChartsReferenceLine/ChartsYReferenceLine.js +1 -1
  155. package/modern/ChartsTooltip/ChartsAxisTooltipContent.js +6 -5
  156. package/modern/ChartsTooltip/DefaultChartsAxisTooltipContent.js +6 -4
  157. package/modern/ChartsTooltip/utils.js +6 -0
  158. package/modern/ChartsVoronoiHandler/ChartsVoronoiHandler.js +92 -44
  159. package/modern/LineChart/AnimatedArea.js +103 -0
  160. package/modern/LineChart/AnimatedLine.js +105 -0
  161. package/modern/LineChart/AreaElement.js +16 -33
  162. package/modern/LineChart/AreaPlot.js +91 -58
  163. package/modern/LineChart/LineChart.js +35 -6
  164. package/modern/LineChart/LineElement.js +16 -35
  165. package/modern/LineChart/LineHighlightElement.js +3 -2
  166. package/modern/LineChart/LinePlot.js +89 -56
  167. package/modern/LineChart/MarkElement.js +26 -13
  168. package/modern/LineChart/MarkPlot.js +80 -51
  169. package/modern/LineChart/formatter.js +1 -1
  170. package/modern/LineChart/index.js +2 -0
  171. package/modern/PieChart/PieArcLabelPlot.js +1 -1
  172. package/modern/PieChart/PieArcPlot.js +6 -6
  173. package/modern/PieChart/PieChart.js +4 -4
  174. package/modern/PieChart/PiePlot.js +4 -4
  175. package/modern/ScatterChart/Scatter.js +17 -3
  176. package/modern/ScatterChart/ScatterChart.js +11 -2
  177. package/modern/ScatterChart/ScatterPlot.js +10 -2
  178. package/modern/SparkLineChart/SparkLineChart.js +2 -0
  179. package/modern/context/DrawingProvider.js +9 -2
  180. package/modern/hooks/useDrawingArea.js +7 -3
  181. package/modern/index.js +2 -1
  182. package/modern/internals/geometry.js +1 -1
  183. package/modern/internals/useAnimatedPath.js +29 -0
  184. package/modern/internals/utils.js +7 -0
  185. package/package.json +6 -5
@@ -1,16 +1,15 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["id", "classes", "color", "highlightScope", "slots", "slotProps"];
3
+ const _excluded = ["id", "classes", "color", "highlightScope", "slots", "slotProps", "onClick"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
- import { color as d3Color } from 'd3-color';
7
6
  import composeClasses from '@mui/utils/composeClasses';
8
7
  import { useSlotProps } from '@mui/base/utils';
9
8
  import generateUtilityClass from '@mui/utils/generateUtilityClass';
10
- import { styled } from '@mui/material/styles';
11
9
  import generateUtilityClasses from '@mui/utils/generateUtilityClasses';
12
10
  import { InteractionContext } from '../context/InteractionProvider';
13
11
  import { getIsFaded, getIsHighlighted, useInteractionItemProps } from '../hooks/useInteractionItemProps';
12
+ import { AnimatedLine } from './AnimatedLine';
14
13
  import { jsx as _jsx } from "react/jsx-runtime";
15
14
  export function getLineElementUtilityClass(slot) {
16
15
  return generateUtilityClass('MuiLineElement', slot);
@@ -28,35 +27,6 @@ const useUtilityClasses = ownerState => {
28
27
  };
29
28
  return composeClasses(slots, getLineElementUtilityClass, classes);
30
29
  };
31
- export const LineElementPath = styled('path', {
32
- name: 'MuiLineElement',
33
- slot: 'Root',
34
- overridesResolver: (_, styles) => styles.root
35
- })(({
36
- ownerState
37
- }) => ({
38
- strokeWidth: 2,
39
- strokeLinejoin: 'round',
40
- fill: 'none',
41
- stroke: ownerState.isHighlighted ? d3Color(ownerState.color).brighter(0.5).formatHex() : ownerState.color,
42
- transition: 'opacity 0.2s ease-in, stroke 0.2s ease-in',
43
- opacity: ownerState.isFaded ? 0.3 : 1
44
- }));
45
- LineElementPath.propTypes = {
46
- // ----------------------------- Warning --------------------------------
47
- // | These PropTypes are generated from the TypeScript type definitions |
48
- // | To update them edit the TypeScript types and run "yarn proptypes" |
49
- // ----------------------------------------------------------------------
50
- as: PropTypes.elementType,
51
- ownerState: PropTypes.shape({
52
- classes: PropTypes.object,
53
- color: PropTypes.string.isRequired,
54
- id: PropTypes.string.isRequired,
55
- isFaded: PropTypes.bool.isRequired,
56
- isHighlighted: PropTypes.bool.isRequired
57
- }).isRequired,
58
- sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])
59
- };
60
30
  /**
61
31
  * Demos:
62
32
  *
@@ -75,7 +45,8 @@ function LineElement(props) {
75
45
  color,
76
46
  highlightScope,
77
47
  slots,
78
- slotProps
48
+ slotProps,
49
+ onClick
79
50
  } = props,
80
51
  other = _objectWithoutPropertiesLoose(props, _excluded);
81
52
  const getInteractionItemProps = useInteractionItemProps(highlightScope);
@@ -98,7 +69,7 @@ function LineElement(props) {
98
69
  isHighlighted
99
70
  };
100
71
  const classes = useUtilityClasses(ownerState);
101
- const Line = (_slots$line = slots == null ? void 0 : slots.line) != null ? _slots$line : LineElementPath;
72
+ const Line = (_slots$line = slots == null ? void 0 : slots.line) != null ? _slots$line : AnimatedLine;
102
73
  const lineProps = useSlotProps({
103
74
  elementType: Line,
104
75
  externalSlotProps: slotProps == null ? void 0 : slotProps.line,
@@ -106,7 +77,9 @@ function LineElement(props) {
106
77
  type: 'line',
107
78
  seriesId: id
108
79
  }), {
109
- className: classes.root
80
+ className: classes.root,
81
+ onClick,
82
+ cursor: onClick ? 'pointer' : 'unset'
110
83
  }),
111
84
  ownerState
112
85
  });
@@ -118,10 +91,18 @@ process.env.NODE_ENV !== "production" ? LineElement.propTypes = {
118
91
  // | To update them edit the TypeScript types and run "yarn proptypes" |
119
92
  // ----------------------------------------------------------------------
120
93
  classes: PropTypes.object,
94
+ color: PropTypes.string.isRequired,
95
+ d: PropTypes.string.isRequired,
121
96
  highlightScope: PropTypes.shape({
122
97
  faded: PropTypes.oneOf(['global', 'none', 'series']),
123
98
  highlighted: PropTypes.oneOf(['item', 'none', 'series'])
124
99
  }),
100
+ id: PropTypes.string.isRequired,
101
+ /**
102
+ * If `true`, animations are skipped.
103
+ * @default false
104
+ */
105
+ skipAnimation: PropTypes.bool,
125
106
  /**
126
107
  * The props used for each component slot.
127
108
  * @default {}
@@ -60,13 +60,14 @@ function LineHighlightElement(props) {
60
60
  y
61
61
  };
62
62
  const classes = useUtilityClasses(ownerState);
63
- return /*#__PURE__*/_jsx(HighlightElement, _extends({}, other, {
63
+ return /*#__PURE__*/_jsx(HighlightElement, _extends({
64
+ pointerEvents: "none",
64
65
  ownerState: ownerState,
65
66
  className: classes.root,
66
67
  cx: 0,
67
68
  cy: 0,
68
69
  r: other.r === undefined ? 5 : other.r
69
- }));
70
+ }, other));
70
71
  }
71
72
  process.env.NODE_ENV !== "production" ? LineHighlightElement.propTypes = {
72
73
  // ----------------------------- Warning --------------------------------
@@ -1,6 +1,6 @@
1
- import _extends from "@babel/runtime/helpers/esm/extends";
2
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["slots", "slotProps"];
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ const _excluded = ["slots", "slotProps", "skipAnimation", "onItemClick"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import { line as d3Line } from 'd3-shape';
@@ -11,26 +11,11 @@ import { getValueToPositionMapper } from '../hooks/useScale';
11
11
  import getCurveFactory from '../internals/getCurve';
12
12
  import { DEFAULT_X_AXIS_KEY } from '../constants';
13
13
  import { jsx as _jsx } from "react/jsx-runtime";
14
- /**
15
- * Demos:
16
- *
17
- * - [Lines](https://mui.com/x/react-charts/lines/)
18
- * - [Line demonstration](https://mui.com/x/react-charts/line-demo/)
19
- *
20
- * API:
21
- *
22
- * - [LinePlot API](https://mui.com/x/api/charts/line-plot/)
23
- */
24
- function LinePlot(props) {
25
- const {
26
- slots,
27
- slotProps
28
- } = props,
29
- other = _objectWithoutPropertiesLoose(props, _excluded);
14
+ const useAggregatedData = () => {
30
15
  const seriesData = React.useContext(SeriesContext).line;
31
16
  const axisData = React.useContext(CartesianContext);
32
17
  if (seriesData === undefined) {
33
- return null;
18
+ return [];
34
19
  }
35
20
  const {
36
21
  series,
@@ -44,46 +29,83 @@ function LinePlot(props) {
44
29
  } = axisData;
45
30
  const defaultXAxisId = xAxisIds[0];
46
31
  const defaultYAxisId = yAxisIds[0];
47
- return /*#__PURE__*/_jsx("g", _extends({}, other, {
48
- children: stackingGroups.flatMap(({
49
- ids: groupIds
50
- }) => {
51
- return groupIds.flatMap(seriesId => {
52
- var _xData$map;
53
- const {
54
- xAxisKey = defaultXAxisId,
55
- yAxisKey = defaultYAxisId,
56
- stackedData,
57
- data,
58
- connectNulls
59
- } = series[seriesId];
60
- const xScale = getValueToPositionMapper(xAxis[xAxisKey].scale);
61
- const yScale = yAxis[yAxisKey].scale;
62
- const xData = xAxis[xAxisKey].data;
63
- if (process.env.NODE_ENV !== 'production') {
64
- if (xData === undefined) {
65
- throw new Error(`MUI X Charts: ${xAxisKey === DEFAULT_X_AXIS_KEY ? 'The first `xAxis`' : `The x-axis with id "${xAxisKey}"`} should have data property to be able to display a line plot.`);
66
- }
67
- if (xData.length < stackedData.length) {
68
- throw new Error(`MUI X Charts: The data length of the x axis (${xData.length} items) is lower than the length of series (${stackedData.length} items).`);
69
- }
32
+ return stackingGroups.flatMap(({
33
+ ids: groupIds
34
+ }) => {
35
+ return groupIds.flatMap(seriesId => {
36
+ var _xData$map;
37
+ const {
38
+ xAxisKey = defaultXAxisId,
39
+ yAxisKey = defaultYAxisId,
40
+ stackedData,
41
+ data,
42
+ connectNulls
43
+ } = series[seriesId];
44
+ const xScale = getValueToPositionMapper(xAxis[xAxisKey].scale);
45
+ const yScale = yAxis[yAxisKey].scale;
46
+ const xData = xAxis[xAxisKey].data;
47
+ if (process.env.NODE_ENV !== 'production') {
48
+ if (xData === undefined) {
49
+ throw new Error(`MUI X Charts: ${xAxisKey === DEFAULT_X_AXIS_KEY ? 'The first `xAxis`' : `The x-axis with id "${xAxisKey}"`} should have data property to be able to display a line plot.`);
70
50
  }
71
- const linePath = d3Line().x(d => xScale(d.x)).defined((_, i) => connectNulls || data[i] != null).y(d => yScale(d.y[1]));
72
- const curve = getCurveFactory(series[seriesId].curve);
73
- const formattedData = (_xData$map = xData == null ? void 0 : xData.map((x, index) => ({
74
- x,
75
- y: stackedData[index]
76
- }))) != null ? _xData$map : [];
77
- const d3Data = connectNulls ? formattedData.filter((_, i) => data[i] != null) : formattedData;
78
- return /*#__PURE__*/_jsx(LineElement, {
79
- id: seriesId,
80
- d: linePath.curve(curve)(d3Data) || undefined,
81
- color: series[seriesId].color,
82
- highlightScope: series[seriesId].highlightScope,
83
- slots: slots,
84
- slotProps: slotProps
85
- }, seriesId);
51
+ if (xData.length < stackedData.length) {
52
+ throw new Error(`MUI X Charts: The data length of the x axis (${xData.length} items) is lower than the length of series (${stackedData.length} items).`);
53
+ }
54
+ }
55
+ const linePath = d3Line().x(d => xScale(d.x)).defined((_, i) => connectNulls || data[i] != null).y(d => yScale(d.y[1]));
56
+ const formattedData = (_xData$map = xData == null ? void 0 : xData.map((x, index) => ({
57
+ x,
58
+ y: stackedData[index]
59
+ }))) != null ? _xData$map : [];
60
+ const d3Data = connectNulls ? formattedData.filter((_, i) => data[i] != null) : formattedData;
61
+ const d = linePath.curve(getCurveFactory(series[seriesId].curve))(d3Data) || '';
62
+ return _extends({}, series[seriesId], {
63
+ d,
64
+ seriesId
86
65
  });
66
+ });
67
+ });
68
+ };
69
+
70
+ /**
71
+ * Demos:
72
+ *
73
+ * - [Lines](https://mui.com/x/react-charts/lines/)
74
+ * - [Line demonstration](https://mui.com/x/react-charts/line-demo/)
75
+ *
76
+ * API:
77
+ *
78
+ * - [LinePlot API](https://mui.com/x/api/charts/line-plot/)
79
+ */
80
+ function LinePlot(props) {
81
+ const {
82
+ slots,
83
+ slotProps,
84
+ skipAnimation,
85
+ onItemClick
86
+ } = props,
87
+ other = _objectWithoutPropertiesLoose(props, _excluded);
88
+ const completedData = useAggregatedData();
89
+ return /*#__PURE__*/_jsx("g", _extends({}, other, {
90
+ children: completedData.map(({
91
+ d,
92
+ seriesId,
93
+ color,
94
+ highlightScope
95
+ }) => {
96
+ return /*#__PURE__*/_jsx(LineElement, {
97
+ id: seriesId,
98
+ d: d,
99
+ color: color,
100
+ highlightScope: highlightScope,
101
+ skipAnimation: skipAnimation,
102
+ slots: slots,
103
+ slotProps: slotProps,
104
+ onClick: onItemClick && (event => onItemClick(event, {
105
+ type: 'line',
106
+ seriesId
107
+ }))
108
+ }, seriesId);
87
109
  })
88
110
  }));
89
111
  }
@@ -92,6 +114,17 @@ process.env.NODE_ENV !== "production" ? LinePlot.propTypes = {
92
114
  // | These PropTypes are generated from the TypeScript type definitions |
93
115
  // | To update them edit the TypeScript types and run "yarn proptypes" |
94
116
  // ----------------------------------------------------------------------
117
+ /**
118
+ * Callback fired when a line item is clicked.
119
+ * @param {React.MouseEvent<SVGPathElement, MouseEvent>} event The event source of the callback.
120
+ * @param {LineItemIdentifier} lineItemIdentifier The line item identifier.
121
+ */
122
+ onItemClick: PropTypes.func,
123
+ /**
124
+ * If `true`, animations are skipped.
125
+ * @default false
126
+ */
127
+ skipAnimation: PropTypes.bool,
95
128
  /**
96
129
  * The props used for each component slot.
97
130
  * @default {}
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["x", "y", "id", "classes", "color", "shape", "dataIndex", "highlightScope"];
3
+ const _excluded = ["x", "y", "id", "classes", "color", "shape", "dataIndex", "highlightScope", "onClick", "skipAnimation"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import composeClasses from '@mui/utils/composeClasses';
@@ -8,6 +8,7 @@ import generateUtilityClass from '@mui/utils/generateUtilityClass';
8
8
  import { styled } from '@mui/material/styles';
9
9
  import generateUtilityClasses from '@mui/utils/generateUtilityClasses';
10
10
  import { symbol as d3Symbol, symbolsFill as d3SymbolsFill } from 'd3-shape';
11
+ import { animated, to, useSpring } from '@react-spring/web';
11
12
  import { getSymbol } from '../internals/utils';
12
13
  import { InteractionContext } from '../context/InteractionProvider';
13
14
  import { getIsFaded, getIsHighlighted, useInteractionItemProps } from '../hooks/useInteractionItemProps';
@@ -28,7 +29,7 @@ const useUtilityClasses = ownerState => {
28
29
  };
29
30
  return composeClasses(slots, getMarkElementUtilityClass, classes);
30
31
  };
31
- const MarkElementPath = styled('path', {
32
+ const MarkElementPath = styled(animated.path, {
32
33
  name: 'MuiMarkElement',
33
34
  slot: 'Root',
34
35
  overridesResolver: (_, styles) => styles.root
@@ -36,8 +37,6 @@ const MarkElementPath = styled('path', {
36
37
  ownerState,
37
38
  theme
38
39
  }) => ({
39
- transform: `translate(${ownerState.x}px, ${ownerState.y}px)`,
40
- transformOrigin: `${ownerState.x}px ${ownerState.y}px`,
41
40
  fill: (theme.vars || theme).palette.background.paper,
42
41
  stroke: ownerState.color,
43
42
  strokeWidth: 2
@@ -53,9 +52,7 @@ MarkElementPath.propTypes = {
53
52
  color: PropTypes.string.isRequired,
54
53
  id: PropTypes.string.isRequired,
55
54
  isFaded: PropTypes.bool.isRequired,
56
- isHighlighted: PropTypes.bool.isRequired,
57
- x: PropTypes.number.isRequired,
58
- y: PropTypes.number.isRequired
55
+ isHighlighted: PropTypes.bool.isRequired
59
56
  }).isRequired,
60
57
  sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object])
61
58
  };
@@ -79,7 +76,9 @@ function MarkElement(props) {
79
76
  color,
80
77
  shape,
81
78
  dataIndex,
82
- highlightScope
79
+ highlightScope,
80
+ onClick,
81
+ skipAnimation
83
82
  } = props,
84
83
  other = _objectWithoutPropertiesLoose(props, _excluded);
85
84
  const getInteractionItemProps = useInteractionItemProps(highlightScope);
@@ -95,20 +94,29 @@ function MarkElement(props) {
95
94
  type: 'line',
96
95
  seriesId: id
97
96
  }, highlightScope);
97
+ const position = useSpring({
98
+ x,
99
+ y,
100
+ immediate: skipAnimation
101
+ });
98
102
  const ownerState = {
99
103
  id,
100
104
  classes: innerClasses,
101
105
  isHighlighted,
102
106
  isFaded,
103
- color,
104
- x,
105
- y
107
+ color
106
108
  };
107
109
  const classes = useUtilityClasses(ownerState);
108
110
  return /*#__PURE__*/_jsx(MarkElementPath, _extends({}, other, {
111
+ style: {
112
+ transform: to([position.x, position.y], (pX, pY) => `translate(${pX}px, ${pY}px)`),
113
+ transformOrigin: to([position.x, position.y], (pX, pY) => `${pX}px ${pY}px`)
114
+ },
109
115
  ownerState: ownerState,
110
116
  className: classes.root,
111
- d: d3Symbol(d3SymbolsFill[getSymbol(shape)])()
117
+ d: d3Symbol(d3SymbolsFill[getSymbol(shape)])(),
118
+ onClick: onClick,
119
+ cursor: onClick ? 'pointer' : 'unset'
112
120
  }, getInteractionItemProps({
113
121
  type: 'line',
114
122
  seriesId: id,
@@ -132,6 +140,11 @@ process.env.NODE_ENV !== "production" ? MarkElement.propTypes = {
132
140
  /**
133
141
  * The shape of the marker.
134
142
  */
135
- shape: PropTypes.oneOf(['circle', 'cross', 'diamond', 'square', 'star', 'triangle', 'wye']).isRequired
143
+ shape: PropTypes.oneOf(['circle', 'cross', 'diamond', 'square', 'star', 'triangle', 'wye']).isRequired,
144
+ /**
145
+ * If `true`, animations are skipped.
146
+ * @default false
147
+ */
148
+ skipAnimation: PropTypes.bool
136
149
  } : void 0;
137
150
  export { MarkElement };
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["slots", "slotProps"];
3
+ const _excluded = ["slots", "slotProps", "skipAnimation", "onItemClick"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import { SeriesContext } from '../context/SeriesContextProvider';
@@ -8,6 +8,8 @@ import { CartesianContext } from '../context/CartesianContextProvider';
8
8
  import { MarkElement } from './MarkElement';
9
9
  import { getValueToPositionMapper } from '../hooks/useScale';
10
10
  import { DEFAULT_X_AXIS_KEY } from '../constants';
11
+ import { DrawingContext } from '../context/DrawingProvider';
12
+ import { cleanId } from '../internals/utils';
11
13
  import { jsx as _jsx } from "react/jsx-runtime";
12
14
  /**
13
15
  * Demos:
@@ -23,11 +25,16 @@ function MarkPlot(props) {
23
25
  var _slots$mark;
24
26
  const {
25
27
  slots,
26
- slotProps
28
+ slotProps,
29
+ skipAnimation,
30
+ onItemClick
27
31
  } = props,
28
32
  other = _objectWithoutPropertiesLoose(props, _excluded);
29
33
  const seriesData = React.useContext(SeriesContext).line;
30
34
  const axisData = React.useContext(CartesianContext);
35
+ const {
36
+ chartId
37
+ } = React.useContext(DrawingContext);
31
38
  const Mark = (_slots$mark = slots == null ? void 0 : slots.mark) != null ? _slots$mark : MarkElement;
32
39
  if (seriesData === undefined) {
33
40
  return null;
@@ -48,7 +55,7 @@ function MarkPlot(props) {
48
55
  children: stackingGroups.flatMap(({
49
56
  ids: groupIds
50
57
  }) => {
51
- return groupIds.flatMap(seriesId => {
58
+ return groupIds.map(seriesId => {
52
59
  const {
53
60
  xAxisKey = defaultXAxisId,
54
61
  yAxisKey = defaultYAxisId,
@@ -79,59 +86,70 @@ function MarkPlot(props) {
79
86
  if (xData === undefined) {
80
87
  throw new Error(`MUI X Charts: ${xAxisKey === DEFAULT_X_AXIS_KEY ? 'The first `xAxis`' : `The x-axis with id "${xAxisKey}"`} should have data property to be able to display a line plot.`);
81
88
  }
82
- return xData == null ? void 0 : xData.map((x, index) => {
83
- const value = data[index] == null ? null : stackedData[index][1];
84
- return {
85
- x: xScale(x),
86
- y: value === null ? null : yScale(value),
87
- position: x,
88
- value,
89
- index
90
- };
91
- }).filter(({
92
- x,
93
- y,
94
- index,
95
- position,
96
- value
97
- }) => {
98
- if (value === null || y === null) {
99
- // Remove missing data point
100
- return false;
101
- }
102
- if (!isInRange({
103
- x,
104
- y
105
- })) {
106
- // Remove out of range
107
- return false;
108
- }
109
- if (showMark === true) {
110
- return true;
111
- }
112
- return showMark({
89
+ const clipId = cleanId(`${chartId}-${seriesId}-line-clip`); // We assume that if displaying line mark, the line will also be rendered
90
+
91
+ return /*#__PURE__*/_jsx("g", {
92
+ clipPath: `url(#${clipId})`,
93
+ children: xData == null ? void 0 : xData.map((x, index) => {
94
+ const value = data[index] == null ? null : stackedData[index][1];
95
+ return {
96
+ x: xScale(x),
97
+ y: value === null ? null : yScale(value),
98
+ position: x,
99
+ value,
100
+ index
101
+ };
102
+ }).filter(({
113
103
  x,
114
104
  y,
115
105
  index,
116
106
  position,
117
107
  value
118
- });
119
- }).map(({
120
- x,
121
- y,
122
- index
123
- }) => {
124
- return /*#__PURE__*/_jsx(Mark, _extends({
125
- id: seriesId,
126
- dataIndex: index,
127
- shape: "circle",
128
- color: series[seriesId].color,
129
- x: x,
130
- y: y // Don't knwo why TS don't get from the filter that y can't be null
131
- ,
132
- highlightScope: series[seriesId].highlightScope
133
- }, slotProps == null ? void 0 : slotProps.mark), `${seriesId}-${index}`);
134
- });
108
+ }) => {
109
+ if (value === null || y === null) {
110
+ // Remove missing data point
111
+ return false;
112
+ }
113
+ if (!isInRange({
114
+ x,
115
+ y
116
+ })) {
117
+ // Remove out of range
118
+ return false;
119
+ }
120
+ if (showMark === true) {
121
+ return true;
122
+ }
123
+ return showMark({
124
+ x,
125
+ y,
126
+ index,
127
+ position,
128
+ value
129
+ });
130
+ }).map(({
131
+ x,
132
+ y,
133
+ index
134
+ }) => {
135
+ return /*#__PURE__*/_jsx(Mark, _extends({
136
+ id: seriesId,
137
+ dataIndex: index,
138
+ shape: "circle",
139
+ color: series[seriesId].color,
140
+ x: x,
141
+ y: y // Don't know why TS doesn't get from the filter that y can't be null
142
+ ,
143
+ highlightScope: series[seriesId].highlightScope,
144
+ skipAnimation: skipAnimation,
145
+ onClick: onItemClick && (event => onItemClick(event, {
146
+ type: 'line',
147
+ seriesId,
148
+ dataIndex: index
149
+ }))
150
+ }, slotProps == null ? void 0 : slotProps.mark), `${seriesId}-${index}`);
151
+ })
152
+ }, seriesId);
135
153
  });
136
154
  })
137
155
  }));
@@ -141,6 +159,17 @@ process.env.NODE_ENV !== "production" ? MarkPlot.propTypes = {
141
159
  // | These PropTypes are generated from the TypeScript type definitions |
142
160
  // | To update them edit the TypeScript types and run "yarn proptypes" |
143
161
  // ----------------------------------------------------------------------
162
+ /**
163
+ * Callback fired when a line mark item is clicked.
164
+ * @param {React.MouseEvent<SVGPathElement, MouseEvent>} event The event source of the callback.
165
+ * @param {LineItemIdentifier} lineItemIdentifier The line mark item identifier.
166
+ */
167
+ onItemClick: PropTypes.func,
168
+ /**
169
+ * If `true`, animations are skipped.
170
+ * @default false
171
+ */
172
+ skipAnimation: PropTypes.bool,
144
173
  /**
145
174
  * The props used for each component slot.
146
175
  * @default {}
@@ -73,7 +73,7 @@ const formatter = (params, dataset) => {
73
73
  return {
74
74
  seriesOrder,
75
75
  stackingGroups,
76
- series: defaultizeValueFormatter(completedSeries, v => v === null ? '' : v.toLocaleString())
76
+ series: defaultizeValueFormatter(completedSeries, v => v == null ? '' : v.toLocaleString())
77
77
  };
78
78
  };
79
79
  export default formatter;
@@ -4,6 +4,8 @@ export * from './AreaPlot';
4
4
  export * from './MarkPlot';
5
5
  export * from './LineHighlightPlot';
6
6
  export * from './AreaElement';
7
+ export * from './AnimatedArea';
7
8
  export * from './LineElement';
9
+ export * from './AnimatedLine';
8
10
  export * from './MarkElement';
9
11
  export * from './LineHighlightElement';
@@ -175,7 +175,7 @@ process.env.NODE_ENV !== "production" ? PieArcLabelPlot.propTypes = {
175
175
  */
176
176
  paddingAngle: PropTypes.number,
177
177
  /**
178
- * If `true`, animations are skiped.
178
+ * If `true`, animations are skipped.
179
179
  * @default false
180
180
  */
181
181
  skipAnimation: PropTypes.bool,
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["slots", "slotProps", "innerRadius", "outerRadius", "cornerRadius", "paddingAngle", "id", "highlightScope", "highlighted", "faded", "data", "onClick", "skipAnimation"],
3
+ const _excluded = ["slots", "slotProps", "innerRadius", "outerRadius", "cornerRadius", "paddingAngle", "id", "highlightScope", "highlighted", "faded", "data", "onItemClick", "skipAnimation"],
4
4
  _excluded2 = ["startAngle", "endAngle", "paddingAngle", "innerRadius", "arcLabelRadius", "outerRadius", "cornerRadius"];
5
5
  import * as React from 'react';
6
6
  import PropTypes from 'prop-types';
@@ -25,7 +25,7 @@ function PieArcPlot(props) {
25
25
  additionalRadius: -5
26
26
  },
27
27
  data,
28
- onClick,
28
+ onItemClick,
29
29
  skipAnimation
30
30
  } = props,
31
31
  other = _objectWithoutPropertiesLoose(props, _excluded);
@@ -72,8 +72,8 @@ function PieArcPlot(props) {
72
72
  highlightScope: highlightScope,
73
73
  isFaded: item.isFaded,
74
74
  isHighlighted: item.isHighlighted,
75
- onClick: onClick && (event => {
76
- onClick(event, {
75
+ onClick: onItemClick && (event => {
76
+ onItemClick(event, {
77
77
  type: 'pie',
78
78
  seriesId: id,
79
79
  dataIndex: index
@@ -150,7 +150,7 @@ process.env.NODE_ENV !== "production" ? PieArcPlot.propTypes = {
150
150
  * @param {PieItemIdentifier} pieItemIdentifier The pie item identifier.
151
151
  * @param {DefaultizedPieValueType} item The pie item.
152
152
  */
153
- onClick: PropTypes.func,
153
+ onItemClick: PropTypes.func,
154
154
  /**
155
155
  * The radius between circle center and the end of the arc.
156
156
  */
@@ -161,7 +161,7 @@ process.env.NODE_ENV !== "production" ? PieArcPlot.propTypes = {
161
161
  */
162
162
  paddingAngle: PropTypes.number,
163
163
  /**
164
- * If `true`, animations are skiped.
164
+ * If `true`, animations are skipped.
165
165
  * @default false
166
166
  */
167
167
  skipAnimation: PropTypes.bool,