@mui/x-charts 8.9.0 → 8.10.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 (128) hide show
  1. package/BarChart/BarChart.js +110 -1
  2. package/BarChart/BarClipPath.d.ts +17 -12
  3. package/BarChart/BarClipPath.js +70 -57
  4. package/BarChart/BarPlot.js +4 -0
  5. package/BarChart/seriesConfig/extremums.js +2 -3
  6. package/BarChart/useBarChartProps.d.ts +1 -1
  7. package/CHANGELOG.md +245 -6
  8. package/ChartContainer/ChartContainer.js +165 -0
  9. package/ChartsAxisHighlight/ChartsXAxisHighlight.js +1 -3
  10. package/ChartsAxisHighlight/ChartsYAxisHighlight.js +1 -3
  11. package/ChartsTooltip/ChartsTooltip.d.ts +2 -1
  12. package/ChartsTooltip/ChartsTooltip.js +3 -3
  13. package/ChartsTooltip/ChartsTooltipContainer.d.ts +5 -5
  14. package/ChartsTooltip/ChartsTooltipContainer.js +3 -3
  15. package/{internals/components/ChartsWrapper → ChartsWrapper}/ChartsWrapper.d.ts +13 -4
  16. package/{internals/components/ChartsWrapper → ChartsWrapper}/ChartsWrapper.js +33 -7
  17. package/ChartsXAxis/ChartsGroupedXAxis.d.ts +7 -0
  18. package/ChartsXAxis/ChartsGroupedXAxis.js +142 -0
  19. package/ChartsXAxis/ChartsSingleXAxis.d.ts +7 -0
  20. package/ChartsXAxis/ChartsSingleXAxis.js +144 -0
  21. package/ChartsXAxis/ChartsXAxis.d.ts +1 -1
  22. package/ChartsXAxis/ChartsXAxis.js +8 -210
  23. package/ChartsXAxis/getVisibleLabels.d.ts +2 -2
  24. package/ChartsXAxis/useAxisProps.d.ts +4526 -0
  25. package/ChartsXAxis/useAxisProps.js +105 -0
  26. package/ChartsXAxis/utilities.d.ts +11 -0
  27. package/ChartsXAxis/utilities.js +43 -0
  28. package/LineChart/LineChart.js +110 -1
  29. package/LineChart/seriesConfig/extremums.js +2 -3
  30. package/LineChart/useLineChartProps.d.ts +1 -1
  31. package/PieChart/PieChart.js +1 -1
  32. package/RadarChart/RadarChart.d.ts +1 -1
  33. package/RadarChart/RadarChart.js +1 -1
  34. package/RadarChart/index.d.ts +9 -2
  35. package/RadarChart/index.js +13 -14
  36. package/RadarChart/useRadarChartProps.d.ts +1 -1
  37. package/ScatterChart/ScatterChart.d.ts +8 -1
  38. package/ScatterChart/ScatterChart.js +110 -1
  39. package/ScatterChart/seriesConfig/extremums.js +50 -23
  40. package/ScatterChart/useScatterChartProps.d.ts +1 -1
  41. package/SparkLineChart/SparkLineChart.js +109 -0
  42. package/esm/BarChart/BarChart.js +110 -1
  43. package/esm/BarChart/BarClipPath.d.ts +17 -12
  44. package/esm/BarChart/BarClipPath.js +69 -55
  45. package/esm/BarChart/BarPlot.js +4 -0
  46. package/esm/BarChart/seriesConfig/extremums.js +2 -3
  47. package/esm/BarChart/useBarChartProps.d.ts +1 -1
  48. package/esm/ChartContainer/ChartContainer.js +165 -0
  49. package/esm/ChartsAxisHighlight/ChartsXAxisHighlight.js +1 -3
  50. package/esm/ChartsAxisHighlight/ChartsYAxisHighlight.js +1 -3
  51. package/esm/ChartsTooltip/ChartsTooltip.d.ts +2 -1
  52. package/esm/ChartsTooltip/ChartsTooltip.js +3 -3
  53. package/esm/ChartsTooltip/ChartsTooltipContainer.d.ts +5 -5
  54. package/esm/ChartsTooltip/ChartsTooltipContainer.js +3 -3
  55. package/esm/{internals/components/ChartsWrapper → ChartsWrapper}/ChartsWrapper.d.ts +13 -4
  56. package/esm/{internals/components/ChartsWrapper → ChartsWrapper}/ChartsWrapper.js +31 -6
  57. package/esm/ChartsXAxis/ChartsGroupedXAxis.d.ts +7 -0
  58. package/esm/ChartsXAxis/ChartsGroupedXAxis.js +136 -0
  59. package/esm/ChartsXAxis/ChartsSingleXAxis.d.ts +7 -0
  60. package/esm/ChartsXAxis/ChartsSingleXAxis.js +140 -0
  61. package/esm/ChartsXAxis/ChartsXAxis.d.ts +1 -1
  62. package/esm/ChartsXAxis/ChartsXAxis.js +7 -207
  63. package/esm/ChartsXAxis/getVisibleLabels.d.ts +2 -2
  64. package/esm/ChartsXAxis/useAxisProps.d.ts +4526 -0
  65. package/esm/ChartsXAxis/useAxisProps.js +98 -0
  66. package/esm/ChartsXAxis/utilities.d.ts +11 -0
  67. package/esm/ChartsXAxis/utilities.js +35 -0
  68. package/esm/LineChart/LineChart.js +110 -1
  69. package/esm/LineChart/seriesConfig/extremums.js +2 -3
  70. package/esm/LineChart/useLineChartProps.d.ts +1 -1
  71. package/esm/PieChart/PieChart.js +1 -1
  72. package/esm/RadarChart/RadarChart.d.ts +1 -1
  73. package/esm/RadarChart/RadarChart.js +1 -1
  74. package/esm/RadarChart/index.d.ts +9 -2
  75. package/esm/RadarChart/index.js +12 -2
  76. package/esm/RadarChart/useRadarChartProps.d.ts +1 -1
  77. package/esm/ScatterChart/ScatterChart.d.ts +8 -1
  78. package/esm/ScatterChart/ScatterChart.js +110 -1
  79. package/esm/ScatterChart/seriesConfig/extremums.js +50 -23
  80. package/esm/ScatterChart/useScatterChartProps.d.ts +1 -1
  81. package/esm/SparkLineChart/SparkLineChart.js +109 -0
  82. package/esm/hooks/useTicksGrouped.d.ts +28 -0
  83. package/esm/hooks/useTicksGrouped.js +98 -0
  84. package/esm/index.d.ts +2 -1
  85. package/esm/index.js +6 -2
  86. package/esm/internals/findMinMax.d.ts +1 -0
  87. package/esm/internals/findMinMax.js +13 -0
  88. package/esm/internals/getScale.d.ts +1 -1
  89. package/esm/internals/getScale.js +3 -0
  90. package/esm/internals/index.d.ts +1 -1
  91. package/esm/internals/index.js +1 -1
  92. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.js +4 -1
  93. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/createAxisFilterMapper.d.ts +3 -1
  94. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/createAxisFilterMapper.js +32 -23
  95. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/getAxisExtremum.d.ts +1 -1
  96. package/esm/internals/plugins/featurePlugins/useChartVoronoi/useChartVoronoi.js +17 -12
  97. package/esm/internals/symlogScale.d.ts +2 -0
  98. package/esm/internals/symlogScale.js +94 -0
  99. package/esm/models/axis.d.ts +81 -4
  100. package/esm/models/axis.js +3 -0
  101. package/hooks/useTicksGrouped.d.ts +28 -0
  102. package/hooks/useTicksGrouped.js +104 -0
  103. package/index.d.ts +2 -1
  104. package/index.js +13 -1
  105. package/internals/findMinMax.d.ts +1 -0
  106. package/internals/findMinMax.js +19 -0
  107. package/internals/getScale.d.ts +1 -1
  108. package/internals/getScale.js +3 -0
  109. package/internals/index.d.ts +1 -1
  110. package/internals/index.js +12 -12
  111. package/internals/plugins/featurePlugins/useChartCartesianAxis/computeAxisValue.js +3 -0
  112. package/internals/plugins/featurePlugins/useChartCartesianAxis/createAxisFilterMapper.d.ts +3 -1
  113. package/internals/plugins/featurePlugins/useChartCartesianAxis/createAxisFilterMapper.js +34 -23
  114. package/internals/plugins/featurePlugins/useChartCartesianAxis/getAxisExtremum.d.ts +1 -1
  115. package/internals/plugins/featurePlugins/useChartVoronoi/useChartVoronoi.js +17 -12
  116. package/internals/symlogScale.d.ts +2 -0
  117. package/internals/symlogScale.js +100 -0
  118. package/models/axis.d.ts +81 -4
  119. package/models/axis.js +4 -0
  120. package/package.json +5 -7
  121. package/BarChart/getRadius.d.ts +0 -20
  122. package/BarChart/getRadius.js +0 -37
  123. package/esm/BarChart/getRadius.d.ts +0 -20
  124. package/esm/BarChart/getRadius.js +0 -30
  125. /package/{esm/internals/components/ChartsWrapper → ChartsWrapper}/index.d.ts +0 -0
  126. /package/{internals/components/ChartsWrapper → ChartsWrapper}/index.js +0 -0
  127. /package/{internals/components → esm}/ChartsWrapper/index.d.ts +0 -0
  128. /package/esm/{internals/components/ChartsWrapper → ChartsWrapper}/index.js +0 -0
@@ -4,9 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getExtremumY = exports.getExtremumX = void 0;
7
- const mergeMinMax = (acc, val) => {
8
- return [val[0] === null ? acc[0] : Math.min(acc[0], val[0]), val[1] === null ? acc[1] : Math.max(acc[1], val[1])];
9
- };
10
7
  const getExtremumX = params => {
11
8
  const {
12
9
  series,
@@ -14,24 +11,39 @@ const getExtremumX = params => {
14
11
  isDefaultAxis,
15
12
  getFilters
16
13
  } = params;
17
- return Object.keys(series).filter(seriesId => {
14
+ let min = Infinity;
15
+ let max = -Infinity;
16
+ for (const seriesId in series) {
17
+ if (!Object.hasOwn(series, seriesId)) {
18
+ continue;
19
+ }
18
20
  const axisId = series[seriesId].xAxisId;
19
- return axisId === axis.id || axisId === undefined && isDefaultAxis;
20
- }).reduce((acc, seriesId) => {
21
+ if (!(axisId === axis.id || axisId === undefined && isDefaultAxis)) {
22
+ continue;
23
+ }
21
24
  const filter = getFilters?.({
22
25
  currentAxisId: axis.id,
23
26
  isDefaultAxis,
24
27
  seriesXAxisId: series[seriesId].xAxisId,
25
28
  seriesYAxisId: series[seriesId].yAxisId
26
29
  });
27
- const seriesMinMax = series[seriesId].data?.reduce((accSeries, d, dataIndex) => {
28
- if (filter && !filter(d, dataIndex)) {
29
- return accSeries;
30
+ const seriesData = series[seriesId].data ?? [];
31
+ for (let i = 0; i < seriesData.length; i += 1) {
32
+ const d = seriesData[i];
33
+ if (filter && !filter(d, i)) {
34
+ continue;
35
+ }
36
+ if (d.x !== null) {
37
+ if (d.x < min) {
38
+ min = d.x;
39
+ }
40
+ if (d.x > max) {
41
+ max = d.x;
42
+ }
30
43
  }
31
- return mergeMinMax(accSeries, [d.x, d.x]);
32
- }, [Infinity, -Infinity]);
33
- return mergeMinMax(acc, seriesMinMax ?? [Infinity, -Infinity]);
34
- }, [Infinity, -Infinity]);
44
+ }
45
+ }
46
+ return [min, max];
35
47
  };
36
48
  exports.getExtremumX = getExtremumX;
37
49
  const getExtremumY = params => {
@@ -41,23 +53,38 @@ const getExtremumY = params => {
41
53
  isDefaultAxis,
42
54
  getFilters
43
55
  } = params;
44
- return Object.keys(series).filter(seriesId => {
56
+ let min = Infinity;
57
+ let max = -Infinity;
58
+ for (const seriesId in series) {
59
+ if (!Object.hasOwn(series, seriesId)) {
60
+ continue;
61
+ }
45
62
  const axisId = series[seriesId].yAxisId;
46
- return axisId === axis.id || axisId === undefined && isDefaultAxis;
47
- }).reduce((acc, seriesId) => {
63
+ if (!(axisId === axis.id || axisId === undefined && isDefaultAxis)) {
64
+ continue;
65
+ }
48
66
  const filter = getFilters?.({
49
67
  currentAxisId: axis.id,
50
68
  isDefaultAxis,
51
69
  seriesXAxisId: series[seriesId].xAxisId,
52
70
  seriesYAxisId: series[seriesId].yAxisId
53
71
  });
54
- const seriesMinMax = series[seriesId].data?.reduce((accSeries, d, dataIndex) => {
55
- if (filter && !filter(d, dataIndex)) {
56
- return accSeries;
72
+ const seriesData = series[seriesId].data ?? [];
73
+ for (let i = 0; i < seriesData.length; i += 1) {
74
+ const d = seriesData[i];
75
+ if (filter && !filter(d, i)) {
76
+ continue;
77
+ }
78
+ if (d.y !== null) {
79
+ if (d.y < min) {
80
+ min = d.y;
81
+ }
82
+ if (d.y > max) {
83
+ max = d.y;
84
+ }
57
85
  }
58
- return mergeMinMax(accSeries, [d.y, d.y]);
59
- }, [Infinity, -Infinity]);
60
- return mergeMinMax(acc, seriesMinMax ?? [Infinity, -Infinity]);
61
- }, [Infinity, -Infinity]);
86
+ }
87
+ }
88
+ return [min, max];
62
89
  };
63
90
  exports.getExtremumY = getExtremumY;
@@ -7,7 +7,7 @@ import { ChartsOverlayProps } from "../ChartsOverlay/index.js";
7
7
  import { ChartContainerProps } from "../ChartContainer/index.js";
8
8
  import type { ScatterChartProps } from "./ScatterChart.js";
9
9
  import type { ScatterPlotProps } from "./ScatterPlot.js";
10
- import type { ChartsWrapperProps } from "../internals/components/ChartsWrapper/index.js";
10
+ import type { ChartsWrapperProps } from "../ChartsWrapper/index.js";
11
11
  import { ScatterChartPluginsSignatures } from "./ScatterChart.plugins.js";
12
12
  /**
13
13
  * A helper function that extracts ScatterChartProps from the input props
@@ -360,6 +360,10 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
360
360
  disableTicks: _propTypes.default.bool,
361
361
  domainLimit: _propTypes.default.oneOfType([_propTypes.default.oneOf(['nice', 'strict']), _propTypes.default.func]),
362
362
  fill: _propTypes.default.string,
363
+ groups: _propTypes.default.arrayOf(_propTypes.default.shape({
364
+ getValue: _propTypes.default.func.isRequired,
365
+ tickSize: _propTypes.default.number
366
+ })),
363
367
  height: _propTypes.default.number,
364
368
  hideTooltip: _propTypes.default.bool,
365
369
  id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
@@ -411,6 +415,10 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
411
415
  disableTicks: _propTypes.default.bool,
412
416
  domainLimit: _propTypes.default.oneOfType([_propTypes.default.oneOf(['nice', 'strict']), _propTypes.default.func]),
413
417
  fill: _propTypes.default.string,
418
+ groups: _propTypes.default.arrayOf(_propTypes.default.shape({
419
+ getValue: _propTypes.default.func.isRequired,
420
+ tickSize: _propTypes.default.number
421
+ })),
414
422
  height: _propTypes.default.number,
415
423
  hideTooltip: _propTypes.default.bool,
416
424
  id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
@@ -484,6 +492,53 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
484
492
  tickPlacement: _propTypes.default.oneOf(['end', 'extremities', 'middle', 'start']),
485
493
  tickSize: _propTypes.default.number,
486
494
  valueFormatter: _propTypes.default.func
495
+ }), _propTypes.default.shape({
496
+ axis: _propTypes.default.oneOf(['x']),
497
+ classes: _propTypes.default.object,
498
+ colorMap: _propTypes.default.oneOfType([_propTypes.default.shape({
499
+ color: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.string.isRequired), _propTypes.default.func]).isRequired,
500
+ max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
501
+ min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
502
+ type: _propTypes.default.oneOf(['continuous']).isRequired
503
+ }), _propTypes.default.shape({
504
+ colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
505
+ thresholds: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]).isRequired).isRequired,
506
+ type: _propTypes.default.oneOf(['piecewise']).isRequired
507
+ })]),
508
+ constant: _propTypes.default.number,
509
+ data: _propTypes.default.array,
510
+ dataKey: _propTypes.default.string,
511
+ disableLine: _propTypes.default.bool,
512
+ disableTicks: _propTypes.default.bool,
513
+ domainLimit: _propTypes.default.oneOfType([_propTypes.default.oneOf(['nice', 'strict']), _propTypes.default.func]),
514
+ fill: _propTypes.default.string,
515
+ height: _propTypes.default.number,
516
+ hideTooltip: _propTypes.default.bool,
517
+ id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
518
+ ignoreTooltip: _propTypes.default.bool,
519
+ label: _propTypes.default.string,
520
+ labelStyle: _propTypes.default.object,
521
+ max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
522
+ min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
523
+ offset: _propTypes.default.number,
524
+ position: _propTypes.default.oneOf(['bottom', 'none', 'top']),
525
+ reverse: _propTypes.default.bool,
526
+ scaleType: _propTypes.default.oneOf(['symlog']),
527
+ slotProps: _propTypes.default.object,
528
+ slots: _propTypes.default.object,
529
+ stroke: _propTypes.default.string,
530
+ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
531
+ tickInterval: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.array, _propTypes.default.func]),
532
+ tickLabelInterval: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.func]),
533
+ tickLabelMinGap: _propTypes.default.number,
534
+ tickLabelPlacement: _propTypes.default.oneOf(['middle', 'tick']),
535
+ tickLabelStyle: _propTypes.default.object,
536
+ tickMaxStep: _propTypes.default.number,
537
+ tickMinStep: _propTypes.default.number,
538
+ tickNumber: _propTypes.default.number,
539
+ tickPlacement: _propTypes.default.oneOf(['end', 'extremities', 'middle', 'start']),
540
+ tickSize: _propTypes.default.number,
541
+ valueFormatter: _propTypes.default.func
487
542
  }), _propTypes.default.shape({
488
543
  axis: _propTypes.default.oneOf(['x']),
489
544
  classes: _propTypes.default.object,
@@ -745,6 +800,10 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
745
800
  disableTicks: _propTypes.default.bool,
746
801
  domainLimit: _propTypes.default.oneOfType([_propTypes.default.oneOf(['nice', 'strict']), _propTypes.default.func]),
747
802
  fill: _propTypes.default.string,
803
+ groups: _propTypes.default.arrayOf(_propTypes.default.shape({
804
+ getValue: _propTypes.default.func.isRequired,
805
+ tickSize: _propTypes.default.number
806
+ })),
748
807
  hideTooltip: _propTypes.default.bool,
749
808
  id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
750
809
  ignoreTooltip: _propTypes.default.bool,
@@ -795,6 +854,10 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
795
854
  disableTicks: _propTypes.default.bool,
796
855
  domainLimit: _propTypes.default.oneOfType([_propTypes.default.oneOf(['nice', 'strict']), _propTypes.default.func]),
797
856
  fill: _propTypes.default.string,
857
+ groups: _propTypes.default.arrayOf(_propTypes.default.shape({
858
+ getValue: _propTypes.default.func.isRequired,
859
+ tickSize: _propTypes.default.number
860
+ })),
798
861
  hideTooltip: _propTypes.default.bool,
799
862
  id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
800
863
  ignoreTooltip: _propTypes.default.bool,
@@ -866,6 +929,52 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
866
929
  tickSize: _propTypes.default.number,
867
930
  valueFormatter: _propTypes.default.func,
868
931
  width: _propTypes.default.number
932
+ }), _propTypes.default.shape({
933
+ axis: _propTypes.default.oneOf(['y']),
934
+ classes: _propTypes.default.object,
935
+ colorMap: _propTypes.default.oneOfType([_propTypes.default.shape({
936
+ color: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.string.isRequired), _propTypes.default.func]).isRequired,
937
+ max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
938
+ min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
939
+ type: _propTypes.default.oneOf(['continuous']).isRequired
940
+ }), _propTypes.default.shape({
941
+ colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
942
+ thresholds: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]).isRequired).isRequired,
943
+ type: _propTypes.default.oneOf(['piecewise']).isRequired
944
+ })]),
945
+ constant: _propTypes.default.number,
946
+ data: _propTypes.default.array,
947
+ dataKey: _propTypes.default.string,
948
+ disableLine: _propTypes.default.bool,
949
+ disableTicks: _propTypes.default.bool,
950
+ domainLimit: _propTypes.default.oneOfType([_propTypes.default.oneOf(['nice', 'strict']), _propTypes.default.func]),
951
+ fill: _propTypes.default.string,
952
+ hideTooltip: _propTypes.default.bool,
953
+ id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
954
+ ignoreTooltip: _propTypes.default.bool,
955
+ label: _propTypes.default.string,
956
+ labelStyle: _propTypes.default.object,
957
+ max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
958
+ min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
959
+ offset: _propTypes.default.number,
960
+ position: _propTypes.default.oneOf(['left', 'none', 'right']),
961
+ reverse: _propTypes.default.bool,
962
+ scaleType: _propTypes.default.oneOf(['symlog']),
963
+ slotProps: _propTypes.default.object,
964
+ slots: _propTypes.default.object,
965
+ stroke: _propTypes.default.string,
966
+ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
967
+ tickInterval: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.array, _propTypes.default.func]),
968
+ tickLabelInterval: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.func]),
969
+ tickLabelPlacement: _propTypes.default.oneOf(['middle', 'tick']),
970
+ tickLabelStyle: _propTypes.default.object,
971
+ tickMaxStep: _propTypes.default.number,
972
+ tickMinStep: _propTypes.default.number,
973
+ tickNumber: _propTypes.default.number,
974
+ tickPlacement: _propTypes.default.oneOf(['end', 'extremities', 'middle', 'start']),
975
+ tickSize: _propTypes.default.number,
976
+ valueFormatter: _propTypes.default.func,
977
+ width: _propTypes.default.number
869
978
  }), _propTypes.default.shape({
870
979
  axis: _propTypes.default.oneOf(['y']),
871
980
  classes: _propTypes.default.object,
@@ -16,7 +16,7 @@ import { useBarChartProps } from "./useBarChartProps.js";
16
16
  import { ChartDataProvider } from "../ChartDataProvider/index.js";
17
17
  import { ChartsSurface } from "../ChartsSurface/index.js";
18
18
  import { useChartContainerProps } from "../ChartContainer/useChartContainerProps.js";
19
- import { ChartsWrapper } from "../internals/components/ChartsWrapper/index.js";
19
+ import { ChartsWrapper } from "../ChartsWrapper/index.js";
20
20
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
21
21
  /**
22
22
  * Demos:
@@ -264,6 +264,10 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
264
264
  disableTicks: PropTypes.bool,
265
265
  domainLimit: PropTypes.oneOfType([PropTypes.oneOf(['nice', 'strict']), PropTypes.func]),
266
266
  fill: PropTypes.string,
267
+ groups: PropTypes.arrayOf(PropTypes.shape({
268
+ getValue: PropTypes.func.isRequired,
269
+ tickSize: PropTypes.number
270
+ })),
267
271
  height: PropTypes.number,
268
272
  hideTooltip: PropTypes.bool,
269
273
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
@@ -315,6 +319,10 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
315
319
  disableTicks: PropTypes.bool,
316
320
  domainLimit: PropTypes.oneOfType([PropTypes.oneOf(['nice', 'strict']), PropTypes.func]),
317
321
  fill: PropTypes.string,
322
+ groups: PropTypes.arrayOf(PropTypes.shape({
323
+ getValue: PropTypes.func.isRequired,
324
+ tickSize: PropTypes.number
325
+ })),
318
326
  height: PropTypes.number,
319
327
  hideTooltip: PropTypes.bool,
320
328
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
@@ -388,6 +396,53 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
388
396
  tickPlacement: PropTypes.oneOf(['end', 'extremities', 'middle', 'start']),
389
397
  tickSize: PropTypes.number,
390
398
  valueFormatter: PropTypes.func
399
+ }), PropTypes.shape({
400
+ axis: PropTypes.oneOf(['x']),
401
+ classes: PropTypes.object,
402
+ colorMap: PropTypes.oneOfType([PropTypes.shape({
403
+ color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
404
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
405
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
406
+ type: PropTypes.oneOf(['continuous']).isRequired
407
+ }), PropTypes.shape({
408
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
409
+ thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
410
+ type: PropTypes.oneOf(['piecewise']).isRequired
411
+ })]),
412
+ constant: PropTypes.number,
413
+ data: PropTypes.array,
414
+ dataKey: PropTypes.string,
415
+ disableLine: PropTypes.bool,
416
+ disableTicks: PropTypes.bool,
417
+ domainLimit: PropTypes.oneOfType([PropTypes.oneOf(['nice', 'strict']), PropTypes.func]),
418
+ fill: PropTypes.string,
419
+ height: PropTypes.number,
420
+ hideTooltip: PropTypes.bool,
421
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
422
+ ignoreTooltip: PropTypes.bool,
423
+ label: PropTypes.string,
424
+ labelStyle: PropTypes.object,
425
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
426
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
427
+ offset: PropTypes.number,
428
+ position: PropTypes.oneOf(['bottom', 'none', 'top']),
429
+ reverse: PropTypes.bool,
430
+ scaleType: PropTypes.oneOf(['symlog']),
431
+ slotProps: PropTypes.object,
432
+ slots: PropTypes.object,
433
+ stroke: PropTypes.string,
434
+ sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
435
+ tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]),
436
+ tickLabelInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.func]),
437
+ tickLabelMinGap: PropTypes.number,
438
+ tickLabelPlacement: PropTypes.oneOf(['middle', 'tick']),
439
+ tickLabelStyle: PropTypes.object,
440
+ tickMaxStep: PropTypes.number,
441
+ tickMinStep: PropTypes.number,
442
+ tickNumber: PropTypes.number,
443
+ tickPlacement: PropTypes.oneOf(['end', 'extremities', 'middle', 'start']),
444
+ tickSize: PropTypes.number,
445
+ valueFormatter: PropTypes.func
391
446
  }), PropTypes.shape({
392
447
  axis: PropTypes.oneOf(['x']),
393
448
  classes: PropTypes.object,
@@ -650,6 +705,10 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
650
705
  disableTicks: PropTypes.bool,
651
706
  domainLimit: PropTypes.oneOfType([PropTypes.oneOf(['nice', 'strict']), PropTypes.func]),
652
707
  fill: PropTypes.string,
708
+ groups: PropTypes.arrayOf(PropTypes.shape({
709
+ getValue: PropTypes.func.isRequired,
710
+ tickSize: PropTypes.number
711
+ })),
653
712
  hideTooltip: PropTypes.bool,
654
713
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
655
714
  ignoreTooltip: PropTypes.bool,
@@ -700,6 +759,10 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
700
759
  disableTicks: PropTypes.bool,
701
760
  domainLimit: PropTypes.oneOfType([PropTypes.oneOf(['nice', 'strict']), PropTypes.func]),
702
761
  fill: PropTypes.string,
762
+ groups: PropTypes.arrayOf(PropTypes.shape({
763
+ getValue: PropTypes.func.isRequired,
764
+ tickSize: PropTypes.number
765
+ })),
703
766
  hideTooltip: PropTypes.bool,
704
767
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
705
768
  ignoreTooltip: PropTypes.bool,
@@ -771,6 +834,52 @@ process.env.NODE_ENV !== "production" ? BarChart.propTypes = {
771
834
  tickSize: PropTypes.number,
772
835
  valueFormatter: PropTypes.func,
773
836
  width: PropTypes.number
837
+ }), PropTypes.shape({
838
+ axis: PropTypes.oneOf(['y']),
839
+ classes: PropTypes.object,
840
+ colorMap: PropTypes.oneOfType([PropTypes.shape({
841
+ color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
842
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
843
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
844
+ type: PropTypes.oneOf(['continuous']).isRequired
845
+ }), PropTypes.shape({
846
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
847
+ thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
848
+ type: PropTypes.oneOf(['piecewise']).isRequired
849
+ })]),
850
+ constant: PropTypes.number,
851
+ data: PropTypes.array,
852
+ dataKey: PropTypes.string,
853
+ disableLine: PropTypes.bool,
854
+ disableTicks: PropTypes.bool,
855
+ domainLimit: PropTypes.oneOfType([PropTypes.oneOf(['nice', 'strict']), PropTypes.func]),
856
+ fill: PropTypes.string,
857
+ hideTooltip: PropTypes.bool,
858
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
859
+ ignoreTooltip: PropTypes.bool,
860
+ label: PropTypes.string,
861
+ labelStyle: PropTypes.object,
862
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
863
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
864
+ offset: PropTypes.number,
865
+ position: PropTypes.oneOf(['left', 'none', 'right']),
866
+ reverse: PropTypes.bool,
867
+ scaleType: PropTypes.oneOf(['symlog']),
868
+ slotProps: PropTypes.object,
869
+ slots: PropTypes.object,
870
+ stroke: PropTypes.string,
871
+ sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
872
+ tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]),
873
+ tickLabelInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.func]),
874
+ tickLabelPlacement: PropTypes.oneOf(['middle', 'tick']),
875
+ tickLabelStyle: PropTypes.object,
876
+ tickMaxStep: PropTypes.number,
877
+ tickMinStep: PropTypes.number,
878
+ tickNumber: PropTypes.number,
879
+ tickPlacement: PropTypes.oneOf(['end', 'extremities', 'middle', 'start']),
880
+ tickSize: PropTypes.number,
881
+ valueFormatter: PropTypes.func,
882
+ width: PropTypes.number
774
883
  }), PropTypes.shape({
775
884
  axis: PropTypes.oneOf(['y']),
776
885
  classes: PropTypes.object,
@@ -1,18 +1,21 @@
1
1
  import * as React from 'react';
2
- import { GetRadiusData } from "./getRadius.js";
3
- type UseAnimateBarClipRectParams = Pick<BarClipRectProps, 'x' | 'y' | 'width' | 'height' | 'skipAnimation'> & {
4
- ref?: React.Ref<SVGRectElement>;
2
+ interface UseAnimateBarClipPathParams {
3
+ ref?: React.Ref<SVGPathElement>;
4
+ layout: 'vertical' | 'horizontal';
5
+ hasNegative: boolean;
6
+ hasPositive: boolean;
7
+ xOrigin: number;
8
+ yOrigin: number;
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
5
13
  borderRadius: number;
6
- ownerState: Omit<GetRadiusData, 'borderRadius'>;
7
- };
8
- type UseAnimateBarClipRectReturn = {
9
- ref: React.Ref<SVGRectElement>;
10
- style: React.CSSProperties;
11
- } & Pick<BarClipRectProps, 'x' | 'y' | 'width' | 'height'>;
12
- export declare function useAnimateBarClipRect(props: UseAnimateBarClipRectParams): UseAnimateBarClipRectReturn;
13
- interface BarClipRectProps extends Pick<BarClipPathProps, 'x' | 'y' | 'width' | 'height' | 'skipAnimation'> {
14
- ownerState: GetRadiusData;
14
+ skipAnimation: boolean;
15
15
  }
16
+ export declare function useAnimateBarClipPath(props: UseAnimateBarClipPathParams): import("../index.js").UseAnimateReturn<SVGPathElement, {
17
+ d: string | undefined;
18
+ }>;
16
19
  export interface BarClipPathProps {
17
20
  maskId: string;
18
21
  borderRadius?: number;
@@ -21,6 +24,8 @@ export interface BarClipPathProps {
21
24
  layout?: 'vertical' | 'horizontal';
22
25
  x: number;
23
26
  y: number;
27
+ xOrigin: number;
28
+ yOrigin: number;
24
29
  width: number;
25
30
  height: number;
26
31
  skipAnimation: boolean;
@@ -1,24 +1,10 @@
1
1
  'use client';
2
2
 
3
- import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import _extends from "@babel/runtime/helpers/esm/extends";
5
- const _excluded = ["maskId", "x", "y", "width", "height", "skipAnimation"];
6
3
  import * as React from 'react';
7
4
  import { interpolateNumber } from '@mui/x-charts-vendor/d3-interpolate';
8
5
  import { useAnimate } from "../hooks/animation/index.js";
9
- import { getRadius } from "./getRadius.js";
10
6
  import { jsx as _jsx } from "react/jsx-runtime";
11
- function buildClipPath(size, borderRadius, ownerState) {
12
- const radiusData = _extends({}, ownerState, {
13
- borderRadius
14
- });
15
- const topLeft = Math.min(size, getRadius('top-left', radiusData));
16
- const topRight = Math.min(size, getRadius('top-right', radiusData));
17
- const bottomRight = Math.min(size, getRadius('bottom-right', radiusData));
18
- const bottomLeft = Math.min(size, getRadius('bottom-left', radiusData));
19
- return `inset(0px round ${topLeft}px ${topRight}px ${bottomRight}px ${bottomLeft}px)`;
20
- }
21
- function barClipRectPropsInterpolator(from, to) {
7
+ function barClipPathPropsInterpolator(from, to) {
22
8
  const interpolateX = interpolateNumber(from.x, to.x);
23
9
  const interpolateY = interpolateNumber(from.y, to.y);
24
10
  const interpolateWidth = interpolateNumber(from.width, to.width);
@@ -34,12 +20,12 @@ function barClipRectPropsInterpolator(from, to) {
34
20
  };
35
21
  };
36
22
  }
37
- export function useAnimateBarClipRect(props) {
23
+ export function useAnimateBarClipPath(props) {
38
24
  const initialProps = {
39
- x: props.x,
40
- y: props.y + (props.ownerState.layout === 'vertical' ? props.height : 0),
41
- width: props.ownerState.layout === 'vertical' ? props.width : 0,
42
- height: props.ownerState.layout === 'vertical' ? 0 : props.height,
25
+ x: props.layout === 'vertical' ? props.x : props.xOrigin,
26
+ y: props.layout === 'vertical' ? props.yOrigin : props.y,
27
+ width: props.layout === 'vertical' ? props.width : 0,
28
+ height: props.layout === 'vertical' ? 0 : props.height,
43
29
  borderRadius: props.borderRadius
44
30
  };
45
31
  return useAnimate({
@@ -49,60 +35,88 @@ export function useAnimateBarClipRect(props) {
49
35
  height: props.height,
50
36
  borderRadius: props.borderRadius
51
37
  }, {
52
- createInterpolator: barClipRectPropsInterpolator,
38
+ createInterpolator: barClipPathPropsInterpolator,
53
39
  transformProps: p => ({
54
- x: p.x,
55
- y: p.y,
56
- width: p.width,
57
- height: p.height,
58
- style: {
59
- clipPath: buildClipPath(props.ownerState.layout === 'vertical' ? p.height : p.width, p.borderRadius, props.ownerState)
60
- }
40
+ d: generateClipPath(props.hasNegative, props.hasPositive, props.layout, p.x, p.y, p.width, p.height, props.xOrigin, props.yOrigin, p.borderRadius)
61
41
  }),
62
- applyProps(element, animatedProps) {
63
- element.setAttribute('x', animatedProps.x.toString());
64
- element.setAttribute('y', animatedProps.y.toString());
65
- element.setAttribute('width', animatedProps.width.toString());
66
- element.setAttribute('height', animatedProps.height.toString());
67
- element.style.clipPath = animatedProps.style.clipPath;
42
+ applyProps(element, {
43
+ d
44
+ }) {
45
+ if (d) {
46
+ element.setAttribute('d', d);
47
+ }
68
48
  },
69
49
  initialProps,
70
50
  skip: props.skipAnimation,
71
51
  ref: props.ref
72
52
  });
73
53
  }
74
- function BarClipRect(props) {
75
- const animatedProps = useAnimateBarClipRect(_extends({}, props, {
76
- borderRadius: props.ownerState.borderRadius ?? 0
77
- }));
78
- return /*#__PURE__*/_jsx("rect", _extends({}, animatedProps));
79
- }
80
54
  /**
81
55
  * @ignore - internal component.
82
56
  */
83
57
  function BarClipPath(props) {
84
58
  const {
85
- maskId,
86
- x,
87
- y,
88
- width,
89
- height,
90
- skipAnimation
91
- } = props,
92
- rest = _objectWithoutPropertiesLoose(props, _excluded);
59
+ maskId,
60
+ x,
61
+ y,
62
+ width,
63
+ height,
64
+ skipAnimation
65
+ } = props;
66
+ const {
67
+ ref,
68
+ d
69
+ } = useAnimateBarClipPath({
70
+ layout: props.layout ?? 'vertical',
71
+ hasNegative: props.hasNegative,
72
+ hasPositive: props.hasPositive,
73
+ xOrigin: props.xOrigin,
74
+ yOrigin: props.yOrigin,
75
+ x,
76
+ y,
77
+ width,
78
+ height,
79
+ borderRadius: props.borderRadius ?? 0,
80
+ skipAnimation
81
+ });
93
82
  if (!props.borderRadius || props.borderRadius <= 0) {
94
83
  return null;
95
84
  }
96
85
  return /*#__PURE__*/_jsx("clipPath", {
97
86
  id: maskId,
98
- children: /*#__PURE__*/_jsx(BarClipRect, {
99
- ownerState: rest,
100
- x: x,
101
- y: y,
102
- width: width,
103
- height: height,
104
- skipAnimation: skipAnimation
87
+ children: /*#__PURE__*/_jsx("path", {
88
+ ref: ref,
89
+ d: d
105
90
  })
106
91
  });
107
92
  }
93
+ function generateClipPath(hasNegative, hasPositive, layout, x, y, width, height, xOrigin, yOrigin, borderRadius) {
94
+ if (layout === 'vertical') {
95
+ if (hasPositive && hasNegative) {
96
+ const bR = Math.min(borderRadius, width / 2, height / 2);
97
+ return `M${x},${y + height / 2} v${-(height / 2 - bR)} a${bR},${bR} 0 0 1 ${bR},${-bR} h${width - bR * 2} a${bR},${bR} 0 0 1 ${bR},${bR} v${height - 2 * bR} a${bR},${bR} 0 0 1 ${-bR},${bR} h${-(width - bR * 2)} a${bR},${bR} 0 0 1 ${-bR},${-bR} v${-(height / 2 - bR)}`;
98
+ }
99
+ const bR = Math.min(borderRadius, width / 2);
100
+ if (hasPositive) {
101
+ return `M${x},${Math.max(yOrigin, y + bR)} v${Math.min(0, -(yOrigin - y - bR))} a${bR},${bR} 0 0 1 ${bR},${-bR} h${width - bR * 2} a${bR},${bR} 0 0 1 ${bR},${bR} v${Math.max(0, yOrigin - y - bR)} Z`;
102
+ }
103
+ if (hasNegative) {
104
+ return `M${x},${Math.min(yOrigin, y + height - bR)} v${Math.max(0, height - bR)} a${bR},${bR} 0 0 0 ${bR},${bR} h${width - bR * 2} a${bR},${bR} 0 0 0 ${bR},${-bR} v${-Math.max(0, height - bR)} Z`;
105
+ }
106
+ }
107
+ if (layout === 'horizontal') {
108
+ if (hasPositive && hasNegative) {
109
+ const bR = Math.min(borderRadius, width / 2, height / 2);
110
+ return `M${x + width / 2},${y} h${width / 2 - bR} a${bR},${bR} 0 0 1 ${bR},${bR} v${height - bR * 2} a${bR},${bR} 0 0 1 ${-bR},${bR} h${-(width - 2 * bR)} a${bR},${bR} 0 0 1 ${-bR},${-bR} v${-(height - bR * 2)} a${bR},${bR} 0 0 1 ${bR},${-bR} h${width / 2 - bR}`;
111
+ }
112
+ const bR = Math.min(borderRadius, height / 2);
113
+ if (hasPositive) {
114
+ return `M${Math.min(xOrigin, x - bR)},${y} h${width} a${bR},${bR} 0 0 1 ${bR},${bR} v${height - bR * 2} a${bR},${bR} 0 0 1 ${-bR},${bR} h${-width} Z`;
115
+ }
116
+ if (hasNegative) {
117
+ return `M${Math.max(xOrigin, x + width + bR)},${y} h${-width} a${bR},${bR} 0 0 0 ${-bR},${bR} v${height - bR * 2} a${bR},${bR} 0 0 0 ${bR},${bR} h${width} Z`;
118
+ }
119
+ }
120
+ return undefined;
121
+ }
108
122
  export { BarClipPath };
@@ -64,6 +64,8 @@ function BarPlot(props) {
64
64
  id,
65
65
  x,
66
66
  y,
67
+ xOrigin,
68
+ yOrigin,
67
69
  width,
68
70
  height,
69
71
  hasPositive,
@@ -78,6 +80,8 @@ function BarPlot(props) {
78
80
  layout: layout,
79
81
  x: x,
80
82
  y: y,
83
+ xOrigin: xOrigin,
84
+ yOrigin: yOrigin,
81
85
  width: width,
82
86
  height: height,
83
87
  skipAnimation: skipAnimation ?? false
@@ -1,3 +1,4 @@
1
+ import { findMinMax } from "../../internals/findMinMax.js";
1
2
  const createResult = (data, direction) => {
2
3
  if (direction === 'x') {
3
4
  return {
@@ -24,9 +25,7 @@ const getBaseExtremum = params => {
24
25
  x: null,
25
26
  y: null
26
27
  }, i)) : axis.data;
27
- const minX = Math.min(...(data ?? []));
28
- const maxX = Math.max(...(data ?? []));
29
- return [minX, maxX];
28
+ return findMinMax(data ?? []);
30
29
  };
31
30
  const getValueExtremum = direction => params => {
32
31
  const {