@mui/x-charts-pro 8.7.0 → 8.8.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 (84) hide show
  1. package/BarChartPro/BarChartPro.d.ts +1 -1
  2. package/BarChartPro/BarChartPro.js +32 -0
  3. package/CHANGELOG.md +98 -0
  4. package/ChartDataProviderPro/ChartDataProviderPro.js +7 -1
  5. package/ChartZoomSlider/internals/ChartAxisZoomSlider.js +31 -16
  6. package/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.d.ts +4 -0
  7. package/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.js +27 -12
  8. package/ChartZoomSlider/internals/ChartAxisZoomSliderPreview.d.ts +18 -0
  9. package/ChartZoomSlider/internals/ChartAxisZoomSliderPreview.js +102 -0
  10. package/ChartZoomSlider/internals/ChartAxisZoomSliderPreviewContent.d.ts +11 -0
  11. package/ChartZoomSlider/internals/ChartAxisZoomSliderPreviewContent.js +62 -0
  12. package/ChartZoomSlider/internals/previews/AreaPreviewPlot.d.ts +14 -0
  13. package/ChartZoomSlider/internals/previews/AreaPreviewPlot.js +61 -0
  14. package/ChartZoomSlider/internals/previews/BarPreviewPlot.d.ts +10 -0
  15. package/ChartZoomSlider/internals/previews/BarPreviewPlot.js +62 -0
  16. package/ChartZoomSlider/internals/previews/LinePreviewPlot.d.ts +14 -0
  17. package/ChartZoomSlider/internals/previews/LinePreviewPlot.js +59 -0
  18. package/ChartZoomSlider/internals/previews/PreviewPlot.types.d.ts +4 -0
  19. package/ChartZoomSlider/internals/previews/PreviewPlot.types.js +5 -0
  20. package/ChartZoomSlider/internals/previews/ScatterPreviewPlot.d.ts +16 -0
  21. package/ChartZoomSlider/internals/previews/ScatterPreviewPlot.js +93 -0
  22. package/ChartsToolbarPro/ChartsToolbarImageExportTrigger.js +2 -0
  23. package/ChartsToolbarPro/ChartsToolbarPrintExportTrigger.js +3 -1
  24. package/ChartsToolbarPro/ChartsToolbarPro.js +2 -0
  25. package/FunnelChart/FunnelChart.d.ts +1 -1
  26. package/FunnelChart/FunnelPlot.js +1 -1
  27. package/FunnelChart/funnel.types.d.ts +14 -9
  28. package/FunnelChart/funnelAxisPlugin/useChartFunnelAxis.types.d.ts +1 -1
  29. package/FunnelChart/funnelAxisPlugin/useChartFunnelAxisRendering.selectors.d.ts +3 -3
  30. package/FunnelChart/seriesConfig/seriesProcessor.js +24 -48
  31. package/Heatmap/Heatmap.d.ts +1 -1
  32. package/LineChartPro/LineChartPro.js +38 -0
  33. package/PieChartPro/PieChartPro.d.ts +1 -1
  34. package/RadarChartPro/RadarChartPro.d.ts +1 -1
  35. package/ScatterChartPro/ScatterChartPro.d.ts +1 -1
  36. package/ScatterChartPro/ScatterChartPro.js +16 -0
  37. package/esm/BarChartPro/BarChartPro.d.ts +1 -1
  38. package/esm/BarChartPro/BarChartPro.js +32 -0
  39. package/esm/ChartDataProviderPro/ChartDataProviderPro.js +7 -1
  40. package/esm/ChartZoomSlider/internals/ChartAxisZoomSlider.js +33 -18
  41. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.d.ts +4 -0
  42. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.js +28 -13
  43. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderPreview.d.ts +18 -0
  44. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderPreview.js +94 -0
  45. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderPreviewContent.d.ts +11 -0
  46. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderPreviewContent.js +54 -0
  47. package/esm/ChartZoomSlider/internals/previews/AreaPreviewPlot.d.ts +14 -0
  48. package/esm/ChartZoomSlider/internals/previews/AreaPreviewPlot.js +53 -0
  49. package/esm/ChartZoomSlider/internals/previews/BarPreviewPlot.d.ts +10 -0
  50. package/esm/ChartZoomSlider/internals/previews/BarPreviewPlot.js +55 -0
  51. package/esm/ChartZoomSlider/internals/previews/LinePreviewPlot.d.ts +14 -0
  52. package/esm/ChartZoomSlider/internals/previews/LinePreviewPlot.js +51 -0
  53. package/esm/ChartZoomSlider/internals/previews/PreviewPlot.types.d.ts +4 -0
  54. package/esm/ChartZoomSlider/internals/previews/PreviewPlot.types.js +1 -0
  55. package/esm/ChartZoomSlider/internals/previews/ScatterPreviewPlot.d.ts +16 -0
  56. package/esm/ChartZoomSlider/internals/previews/ScatterPreviewPlot.js +86 -0
  57. package/esm/ChartsToolbarPro/ChartsToolbarImageExportTrigger.js +2 -0
  58. package/esm/ChartsToolbarPro/ChartsToolbarPrintExportTrigger.js +3 -1
  59. package/esm/ChartsToolbarPro/ChartsToolbarPro.js +2 -0
  60. package/esm/FunnelChart/FunnelChart.d.ts +1 -1
  61. package/esm/FunnelChart/FunnelPlot.js +1 -1
  62. package/esm/FunnelChart/funnel.types.d.ts +14 -9
  63. package/esm/FunnelChart/funnelAxisPlugin/useChartFunnelAxis.types.d.ts +1 -1
  64. package/esm/FunnelChart/funnelAxisPlugin/useChartFunnelAxisRendering.selectors.d.ts +3 -3
  65. package/esm/FunnelChart/seriesConfig/seriesProcessor.js +24 -48
  66. package/esm/Heatmap/Heatmap.d.ts +1 -1
  67. package/esm/LineChartPro/LineChartPro.js +38 -0
  68. package/esm/PieChartPro/PieChartPro.d.ts +1 -1
  69. package/esm/RadarChartPro/RadarChartPro.d.ts +1 -1
  70. package/esm/ScatterChartPro/ScatterChartPro.d.ts +1 -1
  71. package/esm/ScatterChartPro/ScatterChartPro.js +16 -0
  72. package/esm/index.js +1 -1
  73. package/esm/internals/plugins/useChartProExport/exportImage.js +9 -3
  74. package/esm/internals/plugins/useChartProExport/print.d.ts +3 -1
  75. package/esm/internals/plugins/useChartProExport/print.js +7 -2
  76. package/esm/internals/plugins/useChartProExport/useChartProExport.types.d.ts +22 -12
  77. package/esm/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +4 -4
  78. package/index.js +1 -1
  79. package/internals/plugins/useChartProExport/exportImage.js +9 -3
  80. package/internals/plugins/useChartProExport/print.d.ts +3 -1
  81. package/internals/plugins/useChartProExport/print.js +7 -2
  82. package/internals/plugins/useChartProExport/useChartProExport.types.d.ts +22 -12
  83. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +4 -4
  84. package/package.json +6 -6
@@ -0,0 +1,86 @@
1
+ import * as React from 'react';
2
+ import { useSelector, useStore, useScatterPlotData, scatterSeriesConfig, selectorChartPreviewComputedXAxis, selectorChartPreviewComputedYAxis } from '@mui/x-charts/internals';
3
+ import { useScatterSeriesContext, useXAxes, useYAxes, useZAxes } from '@mui/x-charts/hooks';
4
+ import { ScatterMarker } from '@mui/x-charts/ScatterChart';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export function ScatterPreviewPlot({
7
+ axisId,
8
+ x,
9
+ y,
10
+ height,
11
+ width
12
+ }) {
13
+ const store = useStore();
14
+ const seriesData = useScatterSeriesContext();
15
+ const xAxes = useSelector(store, selectorChartPreviewComputedXAxis, [axisId]);
16
+ const yAxes = useSelector(store, selectorChartPreviewComputedYAxis, [axisId]);
17
+ const defaultXAxisId = useXAxes().xAxisIds[0];
18
+ const defaultYAxisId = useYAxes().yAxisIds[0];
19
+ const {
20
+ zAxis: zAxes,
21
+ zAxisIds
22
+ } = useZAxes();
23
+ const defaultZAxisId = zAxisIds[0];
24
+ if (seriesData === undefined) {
25
+ return null;
26
+ }
27
+ const {
28
+ series,
29
+ seriesOrder
30
+ } = seriesData;
31
+ return /*#__PURE__*/_jsx(React.Fragment, {
32
+ children: seriesOrder.map(seriesId => {
33
+ const {
34
+ id,
35
+ xAxisId,
36
+ yAxisId,
37
+ zAxisId,
38
+ color
39
+ } = series[seriesId];
40
+ const colorGetter = scatterSeriesConfig.colorProcessor(series[seriesId], xAxes[xAxisId ?? defaultXAxisId], yAxes[yAxisId ?? defaultYAxisId], zAxes[zAxisId ?? defaultZAxisId]);
41
+ const xScale = xAxes[xAxisId ?? defaultXAxisId].scale;
42
+ const yScale = yAxes[yAxisId ?? defaultYAxisId].scale;
43
+ return /*#__PURE__*/_jsx(ScatterPreviewItems, {
44
+ xScale: xScale,
45
+ yScale: yScale,
46
+ color: color,
47
+ colorGetter: colorGetter,
48
+ series: series[seriesId],
49
+ x: x,
50
+ y: y,
51
+ height: height,
52
+ width: width
53
+ }, id);
54
+ })
55
+ });
56
+ }
57
+ function ScatterPreviewItems(props) {
58
+ const {
59
+ series,
60
+ xScale,
61
+ yScale,
62
+ color,
63
+ colorGetter,
64
+ x,
65
+ y,
66
+ width,
67
+ height
68
+ } = props;
69
+ const isPointInside = React.useCallback((px, py) => px >= x && px <= x + width && py >= y && py <= y + height, [height, width, x, y]);
70
+ const scatterPlotData = useScatterPlotData(series, xScale, yScale, isPointInside);
71
+ return /*#__PURE__*/_jsx("g", {
72
+ "data-series": series.id,
73
+ children: scatterPlotData.map((dataPoint, i) => {
74
+ return /*#__PURE__*/_jsx(ScatterMarker, {
75
+ dataIndex: dataPoint.dataIndex,
76
+ color: colorGetter ? colorGetter(i) : color,
77
+ x: dataPoint.x,
78
+ y: dataPoint.y,
79
+ seriesId: series.id,
80
+ size: series.preview.markerSize,
81
+ isHighlighted: false,
82
+ isFaded: false
83
+ }, dataPoint.id ?? dataPoint.dataIndex);
84
+ })
85
+ });
86
+ }
@@ -56,7 +56,9 @@ process.env.NODE_ENV !== "production" ? ChartsToolbarImageExportTrigger.propType
56
56
  * - [Export as Image](https://mui.com/x/react-charts/export/#export-as-image)
57
57
  */
58
58
  options: PropTypes.shape({
59
+ copyStyles: PropTypes.bool,
59
60
  fileName: PropTypes.string,
61
+ onBeforeExport: PropTypes.func,
60
62
  quality: PropTypes.number,
61
63
  type: PropTypes.string.isRequired
62
64
  }),
@@ -56,7 +56,9 @@ process.env.NODE_ENV !== "production" ? ChartsToolbarPrintExportTrigger.propType
56
56
  * - [Print/Export as PDF](https://mui.com/x/react-charts/export/#print-export-as-pdf)
57
57
  */
58
58
  options: PropTypes.shape({
59
- fileName: PropTypes.string
59
+ copyStyles: PropTypes.bool,
60
+ fileName: PropTypes.string,
61
+ onBeforeExport: PropTypes.func
60
62
  }),
61
63
  /**
62
64
  * A function to customize the rendering of the component.
@@ -151,7 +151,9 @@ process.env.NODE_ENV !== "production" ? ChartsToolbarPro.propTypes = {
151
151
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
152
152
  // ----------------------------------------------------------------------
153
153
  imageExportOptions: PropTypes.arrayOf(PropTypes.shape({
154
+ copyStyles: PropTypes.bool,
154
155
  fileName: PropTypes.string,
156
+ onBeforeExport: PropTypes.func,
155
157
  quality: PropTypes.number,
156
158
  type: PropTypes.string.isRequired
157
159
  })),
@@ -8,7 +8,7 @@ import { ChartContainerProProps } from "../ChartContainerPro/index.js";
8
8
  import { FunnelChartSlotExtension } from "./funnelSlots.types.js";
9
9
  import { CategoryAxis } from "./categoryAxis.types.js";
10
10
  import { FunnelChartPluginsSignatures } from "./FunnelChart.plugins.js";
11
- export interface FunnelChartProps extends Omit<ChartContainerProProps<'funnel', FunnelChartPluginsSignatures>, 'series' | 'plugins' | 'zAxis' | 'zoom' | 'onZoomChange' | 'dataset' | 'yAxis' | 'xAxis' | 'rotationAxis' | 'radiusAxis' | 'slots' | 'slotProps'>, Omit<FunnelPlotProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'>, FunnelChartSlotExtension {
11
+ export interface FunnelChartProps extends Omit<ChartContainerProProps<'funnel', FunnelChartPluginsSignatures>, 'series' | 'plugins' | 'zAxis' | 'zoom' | 'onZoomChange' | 'dataset' | 'yAxis' | 'xAxis' | 'rotationAxis' | 'radiusAxis' | 'slots' | 'slotProps' | 'experimentalFeatures'>, Omit<FunnelPlotProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'>, FunnelChartSlotExtension {
12
12
  /**
13
13
  * The series to display in the funnel chart.
14
14
  * An array of [[FunnelSeriesType]] objects.
@@ -86,7 +86,7 @@ const useAggregatedData = () => {
86
86
  seriesId,
87
87
  value: currentSeries.data[dataIndex].value
88
88
  }) : currentSeries.sectionLabel;
89
- const isIncreasing = currentSeries.dataDirection === 'increasing';
89
+ const isIncreasing = currentSeries.funnelDirection === 'increasing';
90
90
  const curve = getFunnelCurve(currentSeries.curve, {
91
91
  isHorizontal,
92
92
  gap,
@@ -16,7 +16,7 @@ export type FunnelValueType = {
16
16
  /**
17
17
  * The label to display on the tooltip, funnel section, or the legend. It can be a string or a function.
18
18
  */
19
- label?: string | ((location: 'tooltip' | 'legend' | 'section') => string);
19
+ label?: string | ((location: 'tooltip' | 'legend' | 'section') => string | undefined);
20
20
  /**
21
21
  * The color of the funnel section
22
22
  */
@@ -78,6 +78,17 @@ export interface FunnelSeriesType extends Omit<CommonSeriesType<FunnelValueType>
78
78
  * @default 'filled'
79
79
  */
80
80
  variant?: 'filled' | 'outlined';
81
+ /**
82
+ * Controls how the funnel is drawn.
83
+ * Ignored on `step` and `linear-sharp` curves.
84
+ *
85
+ * This affects different curves in different ways:
86
+ * - `bump` & `linear`: Controls which section is the "starting" point of the funnel. This section has straight edges.
87
+ * - `pyramid` & `step-pyramid`: Fully changes the direction of the shape.
88
+ *
89
+ * @default 'auto'
90
+ */
91
+ funnelDirection?: 'increasing' | 'decreasing' | 'auto';
81
92
  }
82
93
  /**
83
94
  * An object that allows to identify a funnel item.
@@ -108,16 +119,10 @@ export type FunnelItem = {
108
119
  */
109
120
  value: number;
110
121
  };
111
- export interface DefaultizedFunnelSeriesType extends DefaultizedProps<FunnelSeriesType, CommonDefaultizedProps | 'layout'> {
122
+ export interface DefaultizedFunnelSeriesType extends Omit<DefaultizedProps<FunnelSeriesType, CommonDefaultizedProps | 'layout'>, 'funnelDirection'> {
112
123
  dataPoints: FunnelDataPoints[][];
113
124
  data: Readonly<MakeRequired<FunnelValueType, 'id' | 'color'>[]>;
114
- /**
115
- * Denotes if the data is increasing, first data point is less than the last data point.
116
- * While the data is decreasing if the first data point is greater than the last data point.
117
- *
118
- * This is used to determine the direction of the funnel.
119
- */
120
- dataDirection: 'increasing' | 'decreasing';
125
+ funnelDirection: 'increasing' | 'decreasing';
121
126
  }
122
127
  export type FunnelDataPoints = Record<'x' | 'y', number> & {
123
128
  useBandWidth: boolean;
@@ -1,6 +1,6 @@
1
1
  import { ChartPluginSignature, UseChartCartesianAxisDefaultizedParameters, UseChartCartesianAxisParameters, UseChartCartesianAxisState, UseChartInteractionSignature, UseChartSeriesSignature, ChartsAxisData } from '@mui/x-charts/internals';
2
2
  export type UseChartFunnelAxisSignature = ChartPluginSignature<{
3
- params: Omit<UseChartCartesianAxisParameters, 'onAxisClick'> & {
3
+ params: Omit<UseChartCartesianAxisParameters, 'onAxisClick' | 'onHighlightedAxisChange' | 'highlightedAxis'> & {
4
4
  /**
5
5
  * The gap, in pixels, between funnel sections.
6
6
  * @default 0
@@ -3,7 +3,7 @@ import { UseChartFunnelAxisSignature } from "./useChartFunnelAxis.types.js";
3
3
  export declare const selectorFunnel: (state: ChartState<[], [UseChartFunnelAxisSignature]>) => {
4
4
  gap: number;
5
5
  } | undefined;
6
- export declare const selectorFunnelGap: import("reselect").Selector<import("@mui/x-charts/internals/plugins/corePlugins/useChartId/useChartId.types").UseChartIdState & import("@mui/x-charts/internals/plugins/corePlugins/useChartDimensions/useChartDimensions.types").UseChartDimensionsState & import("@mui/x-charts/internals/plugins/corePlugins/useChartSeries/useChartSeries.types").UseChartSeriesState<keyof import("@mui/x-charts/internals").ChartsSeriesConfig> & import("@mui/x-charts/internals/plugins/corePlugins/useChartAnimation/useChartAnimation.types").UseChartAnimationState & import("@mui/x-charts/internals").UseChartInteractionListenerState & Partial<Pick<import("@mui/x-charts/internals").UseChartCartesianAxisState, "cartesianAxis"> & {
6
+ export declare const selectorFunnelGap: import("reselect").Selector<import("@mui/x-charts/internals/plugins/corePlugins/useChartId/useChartId.types").UseChartIdState & import("@mui/x-charts/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.types").UseChartExperimentalFeaturesState & import("@mui/x-charts/internals/plugins/corePlugins/useChartDimensions/useChartDimensions.types").UseChartDimensionsState & import("@mui/x-charts/internals/plugins/corePlugins/useChartSeries/useChartSeries.types").UseChartSeriesState<keyof import("@mui/x-charts/internals").ChartsSeriesConfig> & import("@mui/x-charts/internals/plugins/corePlugins/useChartAnimation/useChartAnimation.types").UseChartAnimationState & import("@mui/x-charts/internals").UseChartInteractionListenerState & Partial<Pick<import("@mui/x-charts/internals").UseChartCartesianAxisState, "cartesianAxis"> & {
7
7
  funnel: {
8
8
  gap: number;
9
9
  };
@@ -12,7 +12,7 @@ export declare const selectorFunnelGap: import("reselect").Selector<import("@mui
12
12
  } & {
13
13
  cacheKey: import("@mui/x-charts/internals").ChartStateCacheKey;
14
14
  }, number, []>;
15
- export declare const selectorChartXAxis: import("reselect").Selector<import("@mui/x-charts/internals/plugins/corePlugins/useChartId/useChartId.types").UseChartIdState & import("@mui/x-charts/internals/plugins/corePlugins/useChartDimensions/useChartDimensions.types").UseChartDimensionsState & import("@mui/x-charts/internals/plugins/corePlugins/useChartSeries/useChartSeries.types").UseChartSeriesState<keyof import("@mui/x-charts/internals").ChartsSeriesConfig> & import("@mui/x-charts/internals/plugins/corePlugins/useChartAnimation/useChartAnimation.types").UseChartAnimationState & import("@mui/x-charts/internals").UseChartInteractionListenerState & Partial<import("@mui/x-charts/internals").UseChartCartesianAxisState> & {
15
+ export declare const selectorChartXAxis: import("reselect").Selector<import("@mui/x-charts/internals/plugins/corePlugins/useChartId/useChartId.types").UseChartIdState & import("@mui/x-charts/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.types").UseChartExperimentalFeaturesState & import("@mui/x-charts/internals/plugins/corePlugins/useChartDimensions/useChartDimensions.types").UseChartDimensionsState & import("@mui/x-charts/internals/plugins/corePlugins/useChartSeries/useChartSeries.types").UseChartSeriesState<keyof import("@mui/x-charts/internals").ChartsSeriesConfig> & import("@mui/x-charts/internals/plugins/corePlugins/useChartAnimation/useChartAnimation.types").UseChartAnimationState & import("@mui/x-charts/internals").UseChartInteractionListenerState & Partial<import("@mui/x-charts/internals").UseChartCartesianAxisState> & {
16
16
  cacheKey: import("@mui/x-charts/internals").ChartStateCacheKey;
17
17
  } & Partial<{}> & {
18
18
  cacheKey: import("@mui/x-charts/internals").ChartStateCacheKey;
@@ -33,7 +33,7 @@ export declare const selectorChartXAxis: import("reselect").Selector<import("@mu
33
33
  }> & {
34
34
  cacheKey: import("@mui/x-charts/internals").ChartStateCacheKey;
35
35
  }, import("./computeAxisValue.js").ComputeResult<import("@mui/x-charts").ChartsXAxisProps>, []>;
36
- export declare const selectorChartYAxis: import("reselect").Selector<import("@mui/x-charts/internals/plugins/corePlugins/useChartId/useChartId.types").UseChartIdState & import("@mui/x-charts/internals/plugins/corePlugins/useChartDimensions/useChartDimensions.types").UseChartDimensionsState & import("@mui/x-charts/internals/plugins/corePlugins/useChartSeries/useChartSeries.types").UseChartSeriesState<keyof import("@mui/x-charts/internals").ChartsSeriesConfig> & import("@mui/x-charts/internals/plugins/corePlugins/useChartAnimation/useChartAnimation.types").UseChartAnimationState & import("@mui/x-charts/internals").UseChartInteractionListenerState & Partial<import("@mui/x-charts/internals").UseChartCartesianAxisState> & {
36
+ export declare const selectorChartYAxis: import("reselect").Selector<import("@mui/x-charts/internals/plugins/corePlugins/useChartId/useChartId.types").UseChartIdState & import("@mui/x-charts/internals/plugins/corePlugins/useChartExperimentalFeature/useChartExperimentalFeature.types").UseChartExperimentalFeaturesState & import("@mui/x-charts/internals/plugins/corePlugins/useChartDimensions/useChartDimensions.types").UseChartDimensionsState & import("@mui/x-charts/internals/plugins/corePlugins/useChartSeries/useChartSeries.types").UseChartSeriesState<keyof import("@mui/x-charts/internals").ChartsSeriesConfig> & import("@mui/x-charts/internals/plugins/corePlugins/useChartAnimation/useChartAnimation.types").UseChartAnimationState & import("@mui/x-charts/internals").UseChartInteractionListenerState & Partial<import("@mui/x-charts/internals").UseChartCartesianAxisState> & {
37
37
  cacheKey: import("@mui/x-charts/internals").ChartStateCacheKey;
38
38
  } & Partial<{}> & {
39
39
  cacheKey: import("@mui/x-charts/internals").ChartStateCacheKey;
@@ -16,6 +16,14 @@ const createPoint = ({
16
16
  useBandWidth,
17
17
  stackOffset
18
18
  };
19
+ const getFunnelDirection = (funnelDirection, curve, firstValue, lastValue) => {
20
+ if (curve !== 'step' && curve !== 'linear-sharp' && (funnelDirection === 'increasing' || funnelDirection === 'decreasing')) {
21
+ return funnelDirection;
22
+ }
23
+
24
+ // Implicit check for null or undefined values
25
+ return firstValue != null && lastValue != null && firstValue < lastValue ? 'increasing' : 'decreasing';
26
+ };
19
27
  const seriesProcessor = params => {
20
28
  const {
21
29
  seriesOrder,
@@ -27,7 +35,7 @@ const seriesProcessor = params => {
27
35
  const currentSeries = series[seriesId];
28
36
  const firstDataPoint = currentSeries.data.at(0);
29
37
  const lastDataPoint = currentSeries.data.at(-1);
30
- const dataDirection = firstDataPoint !== undefined && lastDataPoint !== undefined && firstDataPoint.value < lastDataPoint.value ? 'increasing' : 'decreasing';
38
+ const funnelDirection = getFunnelDirection(currentSeries.funnelDirection, currentSeries.curve, firstDataPoint?.value, lastDataPoint?.value);
31
39
  completedSeries[seriesId] = _extends({
32
40
  labelMarkType: 'square',
33
41
  layout: isHorizontal ? 'horizontal' : 'vertical',
@@ -36,7 +44,7 @@ const seriesProcessor = params => {
36
44
  data: currentSeries.data.map((v, i) => _extends({
37
45
  id: `${seriesId}-funnel-item-${v.id ?? i}`
38
46
  }, v)),
39
- dataDirection,
47
+ funnelDirection,
40
48
  dataPoints: []
41
49
  });
42
50
  const stackOffsets = completedSeries[seriesId].data.toReversed().map((_, i, array) => array.slice(0, i).reduce((acc, item) => acc + item.value, 0)).toReversed();
@@ -44,54 +52,22 @@ const seriesProcessor = params => {
44
52
  // Main = main axis, Other = other axis
45
53
  // For horizontal layout, main is y, other is x
46
54
  // For vertical layout, main is x, other is y
47
- const isIncreasing = completedSeries[seriesId].dataDirection === 'increasing';
48
- const currentMaxMain = item.value;
49
- const getNextDataIndex = () => {
50
- if (isIncreasing) {
51
- return dataIndex === 0 ? dataIndex : dataIndex - 1;
52
- }
53
- return dataIndex === array.length - 1 ? dataIndex : dataIndex + 1;
54
- };
55
- const nextDataIndex = getNextDataIndex();
56
- const nextMaxMain = array[nextDataIndex].value ?? 0;
57
- const nextMaxOther = 0;
58
- const currentMaxOther = completedSeries[seriesId].data[dataIndex].value;
59
- const stackOffset = stackOffsets[dataIndex];
55
+ const isIncreasing = completedSeries[seriesId].funnelDirection === 'increasing';
56
+ let currentMaxMain = 0;
57
+ let nextMaxMain = 0;
58
+ let nextDataIndex = 0;
60
59
  if (isIncreasing) {
61
- return [
62
- // Top right (vertical) or Top left (horizontal)
63
- createPoint({
64
- main: nextMaxMain,
65
- other: nextMaxOther,
66
- inverse: isHorizontal,
67
- useBandWidth: false,
68
- stackOffset
69
- }),
70
- // Bottom right (vertical) or Top right (horizontal)
71
- createPoint({
72
- main: currentMaxMain,
73
- other: currentMaxOther,
74
- inverse: isHorizontal,
75
- useBandWidth: true,
76
- stackOffset
77
- }),
78
- // Bottom left (vertical) or Bottom right (horizontal)
79
- createPoint({
80
- main: -currentMaxMain,
81
- other: currentMaxOther,
82
- inverse: isHorizontal,
83
- useBandWidth: true,
84
- stackOffset
85
- }),
86
- // Top left (vertical) or Bottom left (horizontal)
87
- createPoint({
88
- main: -nextMaxMain,
89
- other: nextMaxOther,
90
- inverse: isHorizontal,
91
- useBandWidth: false,
92
- stackOffset
93
- })];
60
+ nextDataIndex = dataIndex === 0 ? dataIndex : dataIndex - 1;
61
+ currentMaxMain = array[nextDataIndex].value ?? 0;
62
+ nextMaxMain = item.value;
63
+ } else {
64
+ nextDataIndex = dataIndex === array.length - 1 ? dataIndex : dataIndex + 1;
65
+ currentMaxMain = item.value;
66
+ nextMaxMain = array[nextDataIndex].value ?? 0;
94
67
  }
68
+ const stackOffset = stackOffsets[dataIndex];
69
+ const nextMaxOther = 0;
70
+ const currentMaxOther = completedSeries[seriesId].data[dataIndex].value;
95
71
  return [
96
72
  // Top right (vertical) or Top left (horizontal)
97
73
  createPoint({
@@ -27,7 +27,7 @@ export interface HeatmapSlots extends ChartsAxisSlots, ChartsOverlaySlots, Heatm
27
27
  export interface HeatmapSlotProps extends ChartsAxisSlotProps, ChartsOverlaySlotProps, HeatmapItemSlotProps, ChartsLegendSlotProps, ChartsToolbarProSlotProps, Partial<ChartsSlotPropsPro> {
28
28
  tooltip?: Partial<HeatmapTooltipProps>;
29
29
  }
30
- export interface HeatmapProps extends Omit<ChartContainerProProps<'heatmap', HeatmapPluginsSignatures>, 'series' | 'plugins' | 'xAxis' | 'yAxis' | 'skipAnimation' | 'slots' | 'slotProps'>, Omit<ChartsAxisProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'> {
30
+ export interface HeatmapProps extends Omit<ChartContainerProProps<'heatmap', HeatmapPluginsSignatures>, 'series' | 'plugins' | 'xAxis' | 'yAxis' | 'skipAnimation' | 'slots' | 'slotProps' | 'experimentalFeatures' | 'highlightedAxis' | 'onHighlightedAxisChange'>, Omit<ChartsAxisProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'> {
31
31
  /**
32
32
  * The configuration of the x-axes.
33
33
  * If not provided, a default axis config is used.
@@ -131,6 +131,12 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
131
131
  * If `true`, render the line highlight item.
132
132
  */
133
133
  disableLineItemHighlight: PropTypes.bool,
134
+ /**
135
+ * Options to enable features planned for the next major.
136
+ */
137
+ experimentalFeatures: PropTypes.shape({
138
+ preferStrictDomainInLineCharts: PropTypes.bool
139
+ }),
134
140
  /**
135
141
  * Option to display a cartesian grid in the background.
136
142
  */
@@ -146,6 +152,14 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
146
152
  * If `true`, the legend is not rendered.
147
153
  */
148
154
  hideLegend: PropTypes.bool,
155
+ /**
156
+ * The controlled axis highlight.
157
+ * Identified by the axis id, and data index.
158
+ */
159
+ highlightedAxis: PropTypes.arrayOf(PropTypes.shape({
160
+ axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
161
+ dataIndex: PropTypes.number.isRequired
162
+ })),
149
163
  /**
150
164
  * The highlighted item.
151
165
  * Used when the highlight is controlled.
@@ -206,6 +220,14 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
206
220
  * @param {HighlightItemData | null} highlightedItem The newly highlighted item.
207
221
  */
208
222
  onHighlightChange: PropTypes.func,
223
+ /**
224
+ * The function called when the pointer position corresponds to a new axis data item.
225
+ * This update can either be caused by a pointer movement, or an axis update.
226
+ * In case of multiple axes, the function is called if at least one axis is updated.
227
+ * The argument contains the identifier for all axes with a `data` property.
228
+ * @param {AxisItemIdentifier[]} axisItems The array of axes item identifiers.
229
+ */
230
+ onHighlightedAxisChange: PropTypes.func,
209
231
  /**
210
232
  * Callback fired when a line element is clicked.
211
233
  */
@@ -319,6 +341,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
319
341
  panning: PropTypes.bool,
320
342
  slider: PropTypes.shape({
321
343
  enabled: PropTypes.bool,
344
+ preview: PropTypes.bool,
322
345
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
323
346
  size: PropTypes.number
324
347
  }),
@@ -384,6 +407,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
384
407
  panning: PropTypes.bool,
385
408
  slider: PropTypes.shape({
386
409
  enabled: PropTypes.bool,
410
+ preview: PropTypes.bool,
387
411
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
388
412
  size: PropTypes.number
389
413
  }),
@@ -444,6 +468,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
444
468
  panning: PropTypes.bool,
445
469
  slider: PropTypes.shape({
446
470
  enabled: PropTypes.bool,
471
+ preview: PropTypes.bool,
447
472
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
448
473
  size: PropTypes.number
449
474
  }),
@@ -504,6 +529,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
504
529
  panning: PropTypes.bool,
505
530
  slider: PropTypes.shape({
506
531
  enabled: PropTypes.bool,
532
+ preview: PropTypes.bool,
507
533
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
508
534
  size: PropTypes.number
509
535
  }),
@@ -564,6 +590,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
564
590
  panning: PropTypes.bool,
565
591
  slider: PropTypes.shape({
566
592
  enabled: PropTypes.bool,
593
+ preview: PropTypes.bool,
567
594
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
568
595
  size: PropTypes.number
569
596
  }),
@@ -624,6 +651,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
624
651
  panning: PropTypes.bool,
625
652
  slider: PropTypes.shape({
626
653
  enabled: PropTypes.bool,
654
+ preview: PropTypes.bool,
627
655
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
628
656
  size: PropTypes.number
629
657
  }),
@@ -684,6 +712,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
684
712
  panning: PropTypes.bool,
685
713
  slider: PropTypes.shape({
686
714
  enabled: PropTypes.bool,
715
+ preview: PropTypes.bool,
687
716
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
688
717
  size: PropTypes.number
689
718
  }),
@@ -744,6 +773,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
744
773
  panning: PropTypes.bool,
745
774
  slider: PropTypes.shape({
746
775
  enabled: PropTypes.bool,
776
+ preview: PropTypes.bool,
747
777
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
748
778
  size: PropTypes.number
749
779
  }),
@@ -816,6 +846,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
816
846
  panning: PropTypes.bool,
817
847
  slider: PropTypes.shape({
818
848
  enabled: PropTypes.bool,
849
+ preview: PropTypes.bool,
819
850
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
820
851
  size: PropTypes.number
821
852
  }),
@@ -880,6 +911,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
880
911
  panning: PropTypes.bool,
881
912
  slider: PropTypes.shape({
882
913
  enabled: PropTypes.bool,
914
+ preview: PropTypes.bool,
883
915
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
884
916
  size: PropTypes.number
885
917
  }),
@@ -939,6 +971,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
939
971
  panning: PropTypes.bool,
940
972
  slider: PropTypes.shape({
941
973
  enabled: PropTypes.bool,
974
+ preview: PropTypes.bool,
942
975
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
943
976
  size: PropTypes.number
944
977
  }),
@@ -998,6 +1031,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
998
1031
  panning: PropTypes.bool,
999
1032
  slider: PropTypes.shape({
1000
1033
  enabled: PropTypes.bool,
1034
+ preview: PropTypes.bool,
1001
1035
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
1002
1036
  size: PropTypes.number
1003
1037
  }),
@@ -1057,6 +1091,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
1057
1091
  panning: PropTypes.bool,
1058
1092
  slider: PropTypes.shape({
1059
1093
  enabled: PropTypes.bool,
1094
+ preview: PropTypes.bool,
1060
1095
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
1061
1096
  size: PropTypes.number
1062
1097
  }),
@@ -1116,6 +1151,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
1116
1151
  panning: PropTypes.bool,
1117
1152
  slider: PropTypes.shape({
1118
1153
  enabled: PropTypes.bool,
1154
+ preview: PropTypes.bool,
1119
1155
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
1120
1156
  size: PropTypes.number
1121
1157
  }),
@@ -1175,6 +1211,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
1175
1211
  panning: PropTypes.bool,
1176
1212
  slider: PropTypes.shape({
1177
1213
  enabled: PropTypes.bool,
1214
+ preview: PropTypes.bool,
1178
1215
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
1179
1216
  size: PropTypes.number
1180
1217
  }),
@@ -1234,6 +1271,7 @@ process.env.NODE_ENV !== "production" ? LineChartPro.propTypes = {
1234
1271
  panning: PropTypes.bool,
1235
1272
  slider: PropTypes.shape({
1236
1273
  enabled: PropTypes.bool,
1274
+ preview: PropTypes.bool,
1237
1275
  showTooltip: PropTypes.oneOf(['always', 'hover', 'never']),
1238
1276
  size: PropTypes.number
1239
1277
  }),
@@ -6,7 +6,7 @@ import { PieChartProPluginSignatures } from "./PieChartPro.plugins.js";
6
6
  import { ChartsToolbarProSlotProps, ChartsToolbarProSlots } from "../ChartsToolbarPro/Toolbar.types.js";
7
7
  export interface PieChartProSlots extends Omit<PieChartSlots, 'toolbar'>, ChartsToolbarProSlots, Partial<ChartsSlotsPro> {}
8
8
  export interface PieChartProSlotProps extends Omit<PieChartSlotProps, 'toolbar'>, ChartsToolbarProSlotProps, Partial<ChartsSlotPropsPro> {}
9
- export interface PieChartProProps extends Omit<PieChartProps, 'apiRef' | 'slots' | 'slotProps'>, Omit<ChartContainerProProps<'pie', PieChartProPluginSignatures>, 'series' | 'plugins' | 'seriesConfig' | 'slots' | 'slotProps'> {
9
+ export interface PieChartProProps extends Omit<PieChartProps, 'apiRef' | 'slots' | 'slotProps'>, Omit<ChartContainerProProps<'pie', PieChartProPluginSignatures>, 'series' | 'plugins' | 'seriesConfig' | 'slots' | 'slotProps' | 'experimentalFeatures'> {
10
10
  /**
11
11
  * Overridable component slots.
12
12
  * @default {}
@@ -5,7 +5,7 @@ import { ChartsToolbarProSlotProps, ChartsToolbarProSlots } from "../ChartsToolb
5
5
  import { ChartsSlotPropsPro, ChartsSlotsPro } from "../internals/material/index.js";
6
6
  export interface RadarChartProSlots extends Omit<RadarChartSlots, 'toolbar'>, ChartsToolbarProSlots, Partial<ChartsSlotsPro> {}
7
7
  export interface RadarChartProSlotProps extends Omit<RadarChartSlotProps, 'toolbar'>, ChartsToolbarProSlotProps, Partial<ChartsSlotPropsPro> {}
8
- export interface RadarChartProProps extends Omit<RadarChartProps, 'apiRef' | 'slots' | 'slotProps'>, Omit<RadarDataProviderProps<RadarChartProPluginsSignatures>, 'plugins' | 'seriesConfig' | 'slots' | 'slotProps'> {
8
+ export interface RadarChartProProps extends Omit<RadarChartProps, 'apiRef' | 'slots' | 'slotProps'>, Omit<RadarDataProviderProps<RadarChartProPluginsSignatures>, 'plugins' | 'seriesConfig' | 'slots' | 'slotProps' | 'experimentalFeatures'> {
9
9
  /**
10
10
  * Overridable component slots.
11
11
  * @default {}
@@ -6,7 +6,7 @@ import { ScatterChartProPluginsSignatures } from "./ScatterChartPro.plugins.js";
6
6
  import { ChartsToolbarProSlots, ChartsToolbarProSlotProps } from "../ChartsToolbarPro/Toolbar.types.js";
7
7
  export interface ScatterChartProSlots extends Omit<ScatterChartSlots, 'toolbar'>, ChartsToolbarProSlots, Partial<ChartsSlotsPro> {}
8
8
  export interface ScatterChartProSlotProps extends Omit<ScatterChartSlotProps, 'toolbar'>, ChartsToolbarProSlotProps, Partial<ChartsSlotPropsPro> {}
9
- export interface ScatterChartProProps extends Omit<ScatterChartProps, 'apiRef' | 'slots' | 'slotProps'>, Omit<ChartContainerProProps<'scatter', ScatterChartProPluginsSignatures>, 'series' | 'plugins' | 'seriesConfig' | 'onItemClick' | 'slots' | 'slotProps'> {
9
+ export interface ScatterChartProProps extends Omit<ScatterChartProps, 'apiRef' | 'slots' | 'slotProps'>, Omit<ChartContainerProProps<'scatter', ScatterChartProPluginsSignatures>, 'series' | 'plugins' | 'seriesConfig' | 'onItemClick' | 'slots' | 'slotProps' | 'experimentalFeatures' | 'highlightedAxis' | 'onHighlightedAxisChange'> {
10
10
  /**
11
11
  * Overridable component slots.
12
12
  * @default {}