@mui/x-charts-pro 8.5.3 → 8.7.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 (124) hide show
  1. package/CHANGELOG.md +210 -0
  2. package/ChartContainerPro/index.d.ts +7 -1
  3. package/ChartContainerPro/index.js +0 -11
  4. package/ChartDataProviderPro/ChartDataProviderPro.js +1 -1
  5. package/ChartZoomSlider/index.d.ts +2 -1
  6. package/ChartZoomSlider/index.js +10 -2
  7. package/ChartZoomSlider/internals/ChartAxisZoomSlider.js +4 -0
  8. package/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.js +7 -1
  9. package/ChartZoomSlider/internals/ChartAxisZoomSliderTrack.js +9 -1
  10. package/ChartZoomSlider/internals/chartAxisZoomSliderTrackClasses.d.ts +15 -0
  11. package/ChartZoomSlider/internals/chartAxisZoomSliderTrackClasses.js +31 -0
  12. package/ChartsToolbarPro/ChartsToolbarImageExportTrigger.d.ts +27 -0
  13. package/ChartsToolbarPro/ChartsToolbarImageExportTrigger.js +77 -0
  14. package/ChartsToolbarPro/ChartsToolbarPrintExportTrigger.d.ts +33 -0
  15. package/ChartsToolbarPro/ChartsToolbarPrintExportTrigger.js +75 -0
  16. package/ChartsToolbarPro/ChartsToolbarPro.d.ts +16 -3
  17. package/ChartsToolbarPro/ChartsToolbarPro.js +118 -8
  18. package/ChartsToolbarPro/index.d.ts +3 -1
  19. package/ChartsToolbarPro/index.js +22 -0
  20. package/ChartsToolbarPro/internals/ChartsMenu.d.ts +14 -0
  21. package/ChartsToolbarPro/internals/ChartsMenu.js +73 -0
  22. package/ChartsToolbarPro/internals/ChartsToolbarDivider.d.ts +5 -0
  23. package/ChartsToolbarPro/internals/ChartsToolbarDivider.js +47 -0
  24. package/FunnelChart/funnelAxisPlugin/useChartFunnelAxis.js +43 -33
  25. package/FunnelChart/funnelAxisPlugin/useChartFunnelAxisRendering.selectors.d.ts +3 -3
  26. package/{ChartContainerPro → context}/ChartProApi.d.ts +2 -3
  27. package/context/index.d.ts +2 -1
  28. package/context/index.js +4 -4
  29. package/context/useChartProApiContext.d.ts +9 -0
  30. package/context/{useChartApiContext.js → useChartProApiContext.js} +4 -4
  31. package/esm/ChartContainerPro/index.d.ts +7 -1
  32. package/esm/ChartContainerPro/index.js +4 -1
  33. package/esm/ChartDataProviderPro/ChartDataProviderPro.js +1 -1
  34. package/esm/ChartZoomSlider/index.d.ts +2 -1
  35. package/esm/ChartZoomSlider/index.js +2 -1
  36. package/esm/ChartZoomSlider/internals/ChartAxisZoomSlider.js +4 -0
  37. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderActiveTrack.js +8 -1
  38. package/esm/ChartZoomSlider/internals/ChartAxisZoomSliderTrack.js +10 -1
  39. package/esm/ChartZoomSlider/internals/chartAxisZoomSliderTrackClasses.d.ts +15 -0
  40. package/esm/ChartZoomSlider/internals/chartAxisZoomSliderTrackClasses.js +21 -0
  41. package/esm/ChartsToolbarPro/ChartsToolbarImageExportTrigger.d.ts +27 -0
  42. package/esm/ChartsToolbarPro/ChartsToolbarImageExportTrigger.js +70 -0
  43. package/esm/ChartsToolbarPro/ChartsToolbarPrintExportTrigger.d.ts +33 -0
  44. package/esm/ChartsToolbarPro/ChartsToolbarPrintExportTrigger.js +68 -0
  45. package/esm/ChartsToolbarPro/ChartsToolbarPro.d.ts +16 -3
  46. package/esm/ChartsToolbarPro/ChartsToolbarPro.js +120 -8
  47. package/esm/ChartsToolbarPro/index.d.ts +3 -1
  48. package/esm/ChartsToolbarPro/index.js +3 -1
  49. package/esm/ChartsToolbarPro/internals/ChartsMenu.d.ts +14 -0
  50. package/esm/ChartsToolbarPro/internals/ChartsMenu.js +67 -0
  51. package/esm/ChartsToolbarPro/internals/ChartsToolbarDivider.d.ts +5 -0
  52. package/esm/ChartsToolbarPro/internals/ChartsToolbarDivider.js +40 -0
  53. package/esm/FunnelChart/funnelAxisPlugin/useChartFunnelAxis.js +43 -33
  54. package/esm/FunnelChart/funnelAxisPlugin/useChartFunnelAxisRendering.selectors.d.ts +3 -3
  55. package/esm/{ChartContainerPro → context}/ChartProApi.d.ts +2 -3
  56. package/esm/context/index.d.ts +2 -1
  57. package/esm/context/index.js +2 -1
  58. package/esm/context/useChartProApiContext.d.ts +9 -0
  59. package/esm/context/{useChartApiContext.js → useChartProApiContext.js} +3 -3
  60. package/esm/hooks/index.d.ts +2 -1
  61. package/esm/hooks/index.js +2 -1
  62. package/esm/hooks/useChartProApiRef.d.ts +23 -0
  63. package/esm/hooks/useChartProApiRef.js +20 -0
  64. package/esm/index.d.ts +6 -3
  65. package/esm/index.js +3 -3
  66. package/esm/internals/material/components/BaseMenuItem.d.ts +3 -0
  67. package/esm/internals/material/components/BaseMenuItem.js +27 -0
  68. package/esm/internals/material/components/BasePopper.d.ts +3 -0
  69. package/esm/internals/material/components/BasePopper.js +122 -0
  70. package/esm/internals/material/icons.d.ts +2 -1
  71. package/esm/internals/material/icons.js +4 -1
  72. package/esm/internals/material/index.d.ts +1 -0
  73. package/esm/internals/material/index.js +12 -3
  74. package/esm/internals/plugins/allPlugins.d.ts +2 -2
  75. package/esm/internals/plugins/useChartProExport/print.js +1 -1
  76. package/esm/internals/plugins/useChartProExport/useChartProExport.types.d.ts +7 -6
  77. package/esm/internals/plugins/useChartProZoom/gestureHooks/usePanOnDrag.d.ts +8 -0
  78. package/esm/internals/plugins/useChartProZoom/gestureHooks/usePanOnDrag.js +58 -0
  79. package/esm/internals/plugins/useChartProZoom/{useChartProZoom.utils.d.ts → gestureHooks/useZoom.utils.d.ts} +14 -10
  80. package/esm/internals/plugins/useChartProZoom/{useChartProZoom.utils.js → gestureHooks/useZoom.utils.js} +41 -31
  81. package/esm/internals/plugins/useChartProZoom/gestureHooks/useZoomOnPinch.d.ts +8 -0
  82. package/esm/internals/plugins/useChartProZoom/gestureHooks/useZoomOnPinch.js +59 -0
  83. package/esm/internals/plugins/useChartProZoom/gestureHooks/useZoomOnWheel.d.ts +8 -0
  84. package/esm/internals/plugins/useChartProZoom/gestureHooks/useZoomOnWheel.js +79 -0
  85. package/esm/internals/plugins/useChartProZoom/useChartProZoom.js +15 -227
  86. package/esm/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +4 -4
  87. package/esm/internals/slots/chartBaseSlotProps.d.ts +50 -3
  88. package/esm/internals/slots/chartsBaseSlots.d.ts +5 -1
  89. package/esm/internals/slots/chartsIconSlots.d.ts +5 -0
  90. package/hooks/index.d.ts +2 -1
  91. package/hooks/index.js +11 -0
  92. package/hooks/useChartProApiRef.d.ts +23 -0
  93. package/hooks/useChartProApiRef.js +28 -0
  94. package/index.d.ts +6 -3
  95. package/index.js +58 -22
  96. package/internals/material/components/BaseMenuItem.d.ts +3 -0
  97. package/internals/material/components/BaseMenuItem.js +35 -0
  98. package/internals/material/components/BasePopper.d.ts +3 -0
  99. package/internals/material/components/BasePopper.js +130 -0
  100. package/internals/material/icons.d.ts +2 -1
  101. package/internals/material/icons.js +5 -2
  102. package/internals/material/index.d.ts +1 -0
  103. package/internals/material/index.js +11 -2
  104. package/internals/plugins/allPlugins.d.ts +2 -2
  105. package/internals/plugins/useChartProExport/print.js +1 -1
  106. package/internals/plugins/useChartProExport/useChartProExport.types.d.ts +7 -6
  107. package/internals/plugins/useChartProZoom/gestureHooks/usePanOnDrag.d.ts +8 -0
  108. package/internals/plugins/useChartProZoom/gestureHooks/usePanOnDrag.js +65 -0
  109. package/internals/plugins/useChartProZoom/{useChartProZoom.utils.d.ts → gestureHooks/useZoom.utils.d.ts} +14 -10
  110. package/internals/plugins/useChartProZoom/{useChartProZoom.utils.js → gestureHooks/useZoom.utils.js} +43 -34
  111. package/internals/plugins/useChartProZoom/gestureHooks/useZoomOnPinch.d.ts +8 -0
  112. package/internals/plugins/useChartProZoom/gestureHooks/useZoomOnPinch.js +66 -0
  113. package/internals/plugins/useChartProZoom/gestureHooks/useZoomOnWheel.d.ts +8 -0
  114. package/internals/plugins/useChartProZoom/gestureHooks/useZoomOnWheel.js +86 -0
  115. package/internals/plugins/useChartProZoom/useChartProZoom.js +14 -226
  116. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +4 -4
  117. package/internals/slots/chartBaseSlotProps.d.ts +50 -3
  118. package/internals/slots/chartsBaseSlots.d.ts +5 -1
  119. package/internals/slots/chartsIconSlots.d.ts +5 -0
  120. package/package.json +5 -4
  121. package/context/useChartApiContext.d.ts +0 -9
  122. package/esm/context/useChartApiContext.d.ts +0 -9
  123. /package/{ChartContainerPro → context}/ChartProApi.js +0 -0
  124. /package/esm/{ChartContainerPro → context}/ChartProApi.js +0 -0
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import _extends from "@babel/runtime/helpers/esm/extends";
2
4
  import { styled } from '@mui/material/styles';
3
5
  import { getSVGPoint, invertScale, selectorChartAxis, selectorChartAxisZoomOptionsLookup, useChartContext, useDrawingArea, useSelector, useStore } from '@mui/x-charts/internals';
@@ -8,6 +10,7 @@ import { ChartAxisZoomSliderThumb } from "./ChartAxisZoomSliderThumb.js";
8
10
  import { ChartsTooltipZoomSliderValue } from "./ChartsTooltipZoomSliderValue.js";
9
11
  import { calculateZoomEnd, calculateZoomFromPoint, calculateZoomStart } from "./zoom-utils.js";
10
12
  import { ZOOM_SLIDER_ACTIVE_TRACK_SIZE, ZOOM_SLIDER_THUMB_HEIGHT, ZOOM_SLIDER_THUMB_WIDTH } from "./constants.js";
13
+ import { useUtilityClasses } from "./chartAxisZoomSliderTrackClasses.js";
11
14
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
15
  const ZoomSliderActiveTrackRect = styled('rect')(({
13
16
  theme
@@ -41,6 +44,9 @@ export function ChartAxisZoomSliderActiveTrack({
41
44
  tooltipStart,
42
45
  tooltipEnd
43
46
  } = getZoomSliderTooltipsText(axis, drawingArea);
47
+ const classes = useUtilityClasses({
48
+ axisDirection
49
+ });
44
50
  const previewThumbWidth = axisDirection === 'x' ? ZOOM_SLIDER_THUMB_WIDTH : ZOOM_SLIDER_THUMB_HEIGHT;
45
51
  const previewThumbHeight = axisDirection === 'x' ? ZOOM_SLIDER_THUMB_HEIGHT : ZOOM_SLIDER_THUMB_WIDTH;
46
52
  React.useEffect(() => {
@@ -194,7 +200,8 @@ export function ChartAxisZoomSliderActiveTrack({
194
200
  width: previewWidth,
195
201
  height: previewHeight,
196
202
  onPointerEnter: onPointerEnter,
197
- onPointerLeave: onPointerLeave
203
+ onPointerLeave: onPointerLeave,
204
+ className: classes.active
198
205
  }), /*#__PURE__*/_jsx(ChartAxisZoomSliderThumb, {
199
206
  ref: setStartThumbEl,
200
207
  x: startThumbX,
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import _extends from "@babel/runtime/helpers/esm/extends";
2
4
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
5
  const _excluded = ["axisId", "axisDirection", "reverse", "onSelectStart", "onSelectEnd"];
@@ -6,7 +8,9 @@ import { useChartContext, getSVGPoint, selectorChartAxisZoomOptionsLookup, useSt
6
8
  import { styled } from '@mui/material/styles';
7
9
  import { rafThrottle } from '@mui/x-internals/rafThrottle';
8
10
  import { shouldForwardProp } from '@mui/system';
11
+ import clsx from 'clsx';
9
12
  import { calculateZoomEnd, calculateZoomFromPoint, calculateZoomStart } from "./zoom-utils.js";
13
+ import { useUtilityClasses } from "./chartAxisZoomSliderTrackClasses.js";
10
14
  import { jsx as _jsx } from "react/jsx-runtime";
11
15
  const ZoomSliderTrack = styled('rect', {
12
16
  shouldForwardProp: prop => shouldForwardProp(prop) && prop !== 'axisDirection' && prop !== 'isSelecting'
@@ -48,6 +52,9 @@ export function ChartAxisZoomSliderTrack(_ref) {
48
52
  } = useChartContext();
49
53
  const store = useStore();
50
54
  const [isSelecting, setIsSelecting] = React.useState(false);
55
+ const classes = useUtilityClasses({
56
+ axisDirection
57
+ });
51
58
  const onPointerDown = function onPointerDown(event) {
52
59
  const rect = ref.current;
53
60
  const element = svgRef.current;
@@ -119,5 +126,7 @@ export function ChartAxisZoomSliderTrack(_ref) {
119
126
  onPointerDown: onPointerDown,
120
127
  axisDirection: axisDirection,
121
128
  isSelecting: isSelecting
122
- }, other));
129
+ }, other, {
130
+ className: clsx(classes.background, other.className)
131
+ }));
123
132
  }
@@ -0,0 +1,15 @@
1
+ import type { ChartAxisZoomSliderActiveTrackProps } from "./ChartAxisZoomSliderActiveTrack.js";
2
+ export interface ChartAxisZoomSliderTrackClasses {
3
+ /** Styles applied to the root element when it is horizontal. */
4
+ horizontal: string;
5
+ /** Styles applied to the root element when it is vertical. */
6
+ vertical: string;
7
+ /** Styles applied to the root element to the active part of the track. */
8
+ active: string;
9
+ /** Styles applied to the root element to the background part of the track. */
10
+ background: string;
11
+ }
12
+ export type ChartAxisZoomSliderTrackClassKey = keyof ChartAxisZoomSliderTrackClasses;
13
+ export declare const chartAxisZoomSliderTrackClasses: ChartAxisZoomSliderTrackClasses;
14
+ export declare function getAxisZoomSliderTrackUtilityClass(slot: string): string;
15
+ export declare const useUtilityClasses: (props: Partial<ChartAxisZoomSliderActiveTrackProps>) => Record<"background" | "active", string>;
@@ -0,0 +1,21 @@
1
+ import composeClasses from '@mui/utils/composeClasses';
2
+ import ClassNameGenerator from '@mui/utils/ClassNameGenerator';
3
+ export const chartAxisZoomSliderTrackClasses = ['horizontal', 'vertical', 'background', 'active'].reduce((acc, slot) => {
4
+ acc[slot] = getAxisZoomSliderTrackUtilityClass(slot);
5
+ return acc;
6
+ }, {});
7
+ export function getAxisZoomSliderTrackUtilityClass(slot) {
8
+ // We use the `ClassNameGenerator` because the original `generateUtilityClass` function
9
+ // has a special case for the `active` slot.
10
+ return `${ClassNameGenerator.generate('MuiChartAxisZoomSliderTrack')}-${slot}`;
11
+ }
12
+ export const useUtilityClasses = props => {
13
+ const {
14
+ axisDirection
15
+ } = props;
16
+ const slots = {
17
+ background: [axisDirection === 'x' ? 'horizontal' : 'vertical', 'background'],
18
+ active: [axisDirection === 'x' ? 'horizontal' : 'vertical', 'active']
19
+ };
20
+ return composeClasses(slots, getAxisZoomSliderTrackUtilityClass);
21
+ };
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { RenderProp } from '@mui/x-internals/useComponentRenderer';
3
+ import { ChartImageExportOptions } from "../internals/plugins/useChartProExport/index.js";
4
+ import { ChartsSlotPropsPro } from "../internals/material/index.js";
5
+ export interface ChartsToolbarImageExportOptions extends Omit<ChartImageExportOptions, 'type'>, Required<Pick<ChartImageExportOptions, 'type'>> {}
6
+ export type ChartsToolbarImageExportTriggerProps = ChartsSlotPropsPro['baseButton'] & {
7
+ /**
8
+ * A function to customize the rendering of the component.
9
+ */
10
+ render?: RenderProp<ChartsSlotPropsPro['baseButton']>;
11
+ /**
12
+ * The options to apply on the image export.
13
+ * @demos
14
+ * - [Export as Image](https://mui.com/x/react-charts/export/#export-as-image)
15
+ */
16
+ options?: ChartsToolbarImageExportOptions;
17
+ };
18
+ /**
19
+ * A button that triggers an image export.
20
+ * It renders the `baseButton` slot.
21
+ *
22
+ * Demos:
23
+ *
24
+ * - [Export](https://mui.com/x/react-charts/export/)
25
+ */
26
+ declare const ChartsToolbarImageExportTrigger: React.ForwardRefExoticComponent<ChartsToolbarImageExportTriggerProps> | React.ForwardRefExoticComponent<Omit<ChartsToolbarImageExportTriggerProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
27
+ export { ChartsToolbarImageExportTrigger };
@@ -0,0 +1,70 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["render", "options", "onClick"];
4
+ import * as React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { forwardRef } from '@mui/x-internals/forwardRef';
7
+ import { useComponentRenderer } from '@mui/x-internals/useComponentRenderer';
8
+ import { useChartsSlots } from '@mui/x-charts/internals';
9
+ import { useChartProApiContext } from "../context/index.js";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ /**
12
+ * A button that triggers an image export.
13
+ * It renders the `baseButton` slot.
14
+ *
15
+ * Demos:
16
+ *
17
+ * - [Export](https://mui.com/x/react-charts/export/)
18
+ */
19
+ const ChartsToolbarImageExportTrigger = forwardRef(function ChartsToolbarImageExportTrigger(props, ref) {
20
+ const {
21
+ render,
22
+ options,
23
+ onClick
24
+ } = props,
25
+ other = _objectWithoutPropertiesLoose(props, _excluded);
26
+ const {
27
+ slots,
28
+ slotProps
29
+ } = useChartsSlots();
30
+ const apiRef = useChartProApiContext();
31
+ const handleClick = event => {
32
+ apiRef.current.exportAsImage(options);
33
+ onClick?.(event);
34
+ };
35
+ const element = useComponentRenderer(slots.baseButton, render, _extends({}, slotProps?.baseButton, {
36
+ onClick: handleClick
37
+ }, other, {
38
+ ref
39
+ }));
40
+ return /*#__PURE__*/_jsx(React.Fragment, {
41
+ children: element
42
+ });
43
+ });
44
+ if (process.env.NODE_ENV !== "production") ChartsToolbarImageExportTrigger.displayName = "ChartsToolbarImageExportTrigger";
45
+ process.env.NODE_ENV !== "production" ? ChartsToolbarImageExportTrigger.propTypes = {
46
+ // ----------------------------- Warning --------------------------------
47
+ // | These PropTypes are generated from the TypeScript type definitions |
48
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
49
+ // ----------------------------------------------------------------------
50
+ className: PropTypes.string,
51
+ disabled: PropTypes.bool,
52
+ id: PropTypes.string,
53
+ /**
54
+ * The options to apply on the image export.
55
+ * @demos
56
+ * - [Export as Image](https://mui.com/x/react-charts/export/#export-as-image)
57
+ */
58
+ options: PropTypes.shape({
59
+ fileName: PropTypes.string,
60
+ quality: PropTypes.number,
61
+ type: PropTypes.string.isRequired
62
+ }),
63
+ /**
64
+ * A function to customize the rendering of the component.
65
+ */
66
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
67
+ style: PropTypes.object,
68
+ tabIndex: PropTypes.number
69
+ } : void 0;
70
+ export { ChartsToolbarImageExportTrigger };
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import { RenderProp } from '@mui/x-internals/useComponentRenderer';
3
+ import { ChartPrintExportOptions } from "../internals/plugins/useChartProExport/index.js";
4
+ import { ChartsSlotPropsPro } from "../internals/material/index.js";
5
+ export interface ChartsToolbarPrintExportOptions extends ChartPrintExportOptions {
6
+ /**
7
+ * If `true`, this export option will be removed from the ChartsToolbarExport menu.
8
+ * @default false
9
+ */
10
+ disableToolbarButton?: boolean;
11
+ }
12
+ export type ChartsToolbarPrintExportTriggerProps = ChartsSlotPropsPro['baseButton'] & {
13
+ /**
14
+ * A function to customize the rendering of the component.
15
+ */
16
+ render?: RenderProp<ChartsSlotPropsPro['baseButton']>;
17
+ /**
18
+ * The options to apply on the Print export.
19
+ * @demos
20
+ * - [Print/Export as PDF](https://mui.com/x/react-charts/export/#print-export-as-pdf)
21
+ */
22
+ options?: ChartPrintExportOptions;
23
+ };
24
+ /**
25
+ * A button that triggers a print export.
26
+ * It renders the `baseButton` slot.
27
+ *
28
+ * Demos:
29
+ *
30
+ * - [Export](https://mui.com/x/react-charts/export/)
31
+ */
32
+ declare const ChartsToolbarPrintExportTrigger: React.ForwardRefExoticComponent<ChartsToolbarPrintExportTriggerProps> | React.ForwardRefExoticComponent<Omit<ChartsToolbarPrintExportTriggerProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
33
+ export { ChartsToolbarPrintExportTrigger };
@@ -0,0 +1,68 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["render", "options", "onClick"];
4
+ import * as React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { forwardRef } from '@mui/x-internals/forwardRef';
7
+ import { useComponentRenderer } from '@mui/x-internals/useComponentRenderer';
8
+ import { useChartsSlots } from '@mui/x-charts/internals';
9
+ import { useChartProApiContext } from "../context/index.js";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ /**
12
+ * A button that triggers a print export.
13
+ * It renders the `baseButton` slot.
14
+ *
15
+ * Demos:
16
+ *
17
+ * - [Export](https://mui.com/x/react-charts/export/)
18
+ */
19
+ const ChartsToolbarPrintExportTrigger = forwardRef(function ChartsToolbarPrintExportTrigger(props, ref) {
20
+ const {
21
+ render,
22
+ options,
23
+ onClick
24
+ } = props,
25
+ other = _objectWithoutPropertiesLoose(props, _excluded);
26
+ const {
27
+ slots,
28
+ slotProps
29
+ } = useChartsSlots();
30
+ const apiRef = useChartProApiContext();
31
+ const handleClick = event => {
32
+ apiRef.current.exportAsPrint(options);
33
+ onClick?.(event);
34
+ };
35
+ const element = useComponentRenderer(slots.baseButton, render, _extends({}, slotProps?.baseButton, {
36
+ onClick: handleClick
37
+ }, other, {
38
+ ref
39
+ }));
40
+ return /*#__PURE__*/_jsx(React.Fragment, {
41
+ children: element
42
+ });
43
+ });
44
+ if (process.env.NODE_ENV !== "production") ChartsToolbarPrintExportTrigger.displayName = "ChartsToolbarPrintExportTrigger";
45
+ process.env.NODE_ENV !== "production" ? ChartsToolbarPrintExportTrigger.propTypes = {
46
+ // ----------------------------- Warning --------------------------------
47
+ // | These PropTypes are generated from the TypeScript type definitions |
48
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
49
+ // ----------------------------------------------------------------------
50
+ className: PropTypes.string,
51
+ disabled: PropTypes.bool,
52
+ id: PropTypes.string,
53
+ /**
54
+ * The options to apply on the Print export.
55
+ * @demos
56
+ * - [Print/Export as PDF](https://mui.com/x/react-charts/export/#print-export-as-pdf)
57
+ */
58
+ options: PropTypes.shape({
59
+ fileName: PropTypes.string
60
+ }),
61
+ /**
62
+ * A function to customize the rendering of the component.
63
+ */
64
+ render: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
65
+ style: PropTypes.object,
66
+ tabIndex: PropTypes.number
67
+ } : void 0;
68
+ export { ChartsToolbarPrintExportTrigger };
@@ -1,7 +1,20 @@
1
- import { ChartsToolbarProps } from '@mui/x-charts/Toolbar';
2
1
  import * as React from 'react';
3
- export interface ChartsToolbarProProps extends ChartsToolbarProps {}
2
+ import { ChartsToolbarProps } from '@mui/x-charts/Toolbar';
3
+ import { ChartsToolbarPrintExportOptions } from "./ChartsToolbarPrintExportTrigger.js";
4
+ import { ChartsToolbarImageExportOptions } from "./ChartsToolbarImageExportTrigger.js";
5
+ export interface ChartsToolbarProProps extends ChartsToolbarProps {
6
+ printOptions?: ChartsToolbarPrintExportOptions;
7
+ imageExportOptions?: ChartsToolbarImageExportOptions[];
8
+ }
4
9
  /**
5
10
  * The chart toolbar component for the pro package.
6
11
  */
7
- export declare function ChartsToolbarPro(props: ChartsToolbarProProps): React.JSX.Element | null;
12
+ declare function ChartsToolbarPro({
13
+ printOptions,
14
+ imageExportOptions: rawImageExportOptions,
15
+ ...other
16
+ }: ChartsToolbarProProps): React.JSX.Element | null;
17
+ declare namespace ChartsToolbarPro {
18
+ var propTypes: any;
19
+ }
20
+ export { ChartsToolbarPro };
@@ -1,16 +1,35 @@
1
+ 'use client';
2
+
1
3
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { Toolbar, ToolbarButton } from '@mui/x-charts/Toolbar';
4
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
+ const _excluded = ["printOptions", "imageExportOptions"];
3
6
  import * as React from 'react';
7
+ import PropTypes from 'prop-types';
8
+ import { Toolbar, ToolbarButton } from '@mui/x-charts/Toolbar';
4
9
  import { useChartContext, useSelector, useChartsSlots } from '@mui/x-charts/internals';
5
10
  import { useChartsLocalization } from '@mui/x-charts/hooks';
11
+ import useId from '@mui/utils/useId';
12
+ import { ChartsToolbarDivider } from "./internals/ChartsToolbarDivider.js";
13
+ import { ChartsMenu } from "./internals/ChartsMenu.js";
6
14
  import { selectorChartZoomIsEnabled } from "../internals/plugins/useChartProZoom/index.js";
7
15
  import { ChartsToolbarZoomInTrigger } from "./ChartsToolbarZoomInTrigger.js";
8
16
  import { ChartsToolbarZoomOutTrigger } from "./ChartsToolbarZoomOutTrigger.js";
9
- import { jsx as _jsx } from "react/jsx-runtime";
17
+ import { ChartsToolbarPrintExportTrigger } from "./ChartsToolbarPrintExportTrigger.js";
18
+ import { ChartsToolbarImageExportTrigger } from "./ChartsToolbarImageExportTrigger.js";
19
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
20
+ const DEFAULT_IMAGE_EXPORT_OPTIONS = [{
21
+ type: 'image/png'
22
+ }];
23
+
10
24
  /**
11
25
  * The chart toolbar component for the pro package.
12
26
  */
13
- export function ChartsToolbarPro(props) {
27
+ function ChartsToolbarPro(_ref) {
28
+ let {
29
+ printOptions,
30
+ imageExportOptions: rawImageExportOptions
31
+ } = _ref,
32
+ other = _objectWithoutPropertiesLoose(_ref, _excluded);
14
33
  const {
15
34
  slots,
16
35
  slotProps
@@ -21,7 +40,13 @@ export function ChartsToolbarPro(props) {
21
40
  const {
22
41
  localeText
23
42
  } = useChartsLocalization();
43
+ const [exportMenuOpen, setExportMenuOpen] = React.useState(false);
44
+ const exportMenuTriggerRef = React.useRef(null);
45
+ const exportMenuId = useId();
46
+ const exportMenuTriggerId = useId();
24
47
  const isZoomEnabled = useSelector(store, selectorChartZoomIsEnabled);
48
+ const imageExportOptionList = rawImageExportOptions ?? DEFAULT_IMAGE_EXPORT_OPTIONS;
49
+ const showExportMenu = !printOptions?.disableToolbarButton || imageExportOptionList.length > 0;
25
50
  const children = [];
26
51
  if (isZoomEnabled) {
27
52
  const Tooltip = slots.baseTooltip;
@@ -30,22 +55,109 @@ export function ChartsToolbarPro(props) {
30
55
  children.push(/*#__PURE__*/_jsx(Tooltip, _extends({}, slotProps.baseTooltip, {
31
56
  title: localeText.zoomIn,
32
57
  children: /*#__PURE__*/_jsx(ChartsToolbarZoomInTrigger, {
33
- render: /*#__PURE__*/_jsx(ToolbarButton, {}),
34
- children: /*#__PURE__*/_jsx(ZoomInIcon, _extends({}, slotProps.zoomInIcon))
58
+ render: /*#__PURE__*/_jsx(ToolbarButton, {
59
+ size: "small"
60
+ }),
61
+ children: /*#__PURE__*/_jsx(ZoomInIcon, _extends({
62
+ fontSize: "small"
63
+ }, slotProps.zoomInIcon))
35
64
  })
36
65
  }), "zoom-in"));
37
66
  children.push(/*#__PURE__*/_jsx(Tooltip, _extends({}, slotProps.baseTooltip, {
38
67
  title: localeText.zoomOut,
39
68
  children: /*#__PURE__*/_jsx(ChartsToolbarZoomOutTrigger, {
40
- render: /*#__PURE__*/_jsx(ToolbarButton, {}),
41
- children: /*#__PURE__*/_jsx(ZoomOutIcon, _extends({}, slotProps.zoomOutIcon))
69
+ render: /*#__PURE__*/_jsx(ToolbarButton, {
70
+ size: "small"
71
+ }),
72
+ children: /*#__PURE__*/_jsx(ZoomOutIcon, _extends({
73
+ fontSize: "small"
74
+ }, slotProps.zoomOutIcon))
42
75
  })
43
76
  }), "zoom-out"));
44
77
  }
78
+ if (showExportMenu) {
79
+ const Tooltip = slots.baseTooltip;
80
+ const MenuList = slots.baseMenuList;
81
+ const MenuItem = slots.baseMenuItem;
82
+ const ExportIcon = slots.exportIcon;
83
+ const closeExportMenu = () => setExportMenuOpen(false);
84
+ const handleListKeyDown = event => {
85
+ if (event.key === 'Tab') {
86
+ event.preventDefault();
87
+ }
88
+ if (isHideMenuKey(event.key)) {
89
+ closeExportMenu();
90
+ }
91
+ };
92
+ if (children.length > 0) {
93
+ children.push(/*#__PURE__*/_jsx(ChartsToolbarDivider, {}, "divider"));
94
+ }
95
+ children.push(/*#__PURE__*/_jsxs(React.Fragment, {
96
+ children: [/*#__PURE__*/_jsx(Tooltip, {
97
+ title: localeText.toolbarExport,
98
+ disableInteractive: exportMenuOpen,
99
+ children: /*#__PURE__*/_jsx(ToolbarButton, {
100
+ ref: exportMenuTriggerRef,
101
+ id: exportMenuTriggerId,
102
+ "aria-controls": exportMenuId,
103
+ "aria-haspopup": "true",
104
+ "aria-expanded": exportMenuOpen ? 'true' : undefined,
105
+ onClick: () => setExportMenuOpen(!exportMenuOpen),
106
+ size: "small",
107
+ children: /*#__PURE__*/_jsx(ExportIcon, {
108
+ fontSize: "small"
109
+ })
110
+ })
111
+ }), /*#__PURE__*/_jsx(ChartsMenu, {
112
+ target: exportMenuTriggerRef.current,
113
+ open: exportMenuOpen,
114
+ onClose: closeExportMenu,
115
+ position: "bottom-end",
116
+ children: /*#__PURE__*/_jsxs(MenuList, _extends({
117
+ id: exportMenuId,
118
+ "aria-labelledby": exportMenuTriggerId,
119
+ onKeyDown: handleListKeyDown,
120
+ autoFocusItem: true
121
+ }, slotProps?.baseMenuList, {
122
+ children: [!printOptions?.disableToolbarButton && /*#__PURE__*/_jsx(ChartsToolbarPrintExportTrigger, {
123
+ render: /*#__PURE__*/_jsx(MenuItem, _extends({
124
+ dense: true
125
+ }, slotProps?.baseMenuItem)),
126
+ options: printOptions,
127
+ onClick: closeExportMenu,
128
+ children: localeText.toolbarExportPrint
129
+ }), imageExportOptionList.map(imageExportOptions => /*#__PURE__*/_jsx(ChartsToolbarImageExportTrigger, {
130
+ render: /*#__PURE__*/_jsx(MenuItem, _extends({
131
+ dense: true
132
+ }, slotProps?.baseMenuItem)),
133
+ options: imageExportOptions,
134
+ onClick: closeExportMenu,
135
+ children: localeText.toolbarExportImage(imageExportOptions.type)
136
+ }, imageExportOptions.type))]
137
+ }))
138
+ })]
139
+ }, "export-menu"));
140
+ }
45
141
  if (children.length === 0) {
46
142
  return null;
47
143
  }
48
- return /*#__PURE__*/_jsx(Toolbar, _extends({}, props, {
144
+ return /*#__PURE__*/_jsx(Toolbar, _extends({}, other, {
49
145
  children: children
50
146
  }));
147
+ }
148
+ process.env.NODE_ENV !== "production" ? ChartsToolbarPro.propTypes = {
149
+ // ----------------------------- Warning --------------------------------
150
+ // | These PropTypes are generated from the TypeScript type definitions |
151
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
152
+ // ----------------------------------------------------------------------
153
+ imageExportOptions: PropTypes.arrayOf(PropTypes.shape({
154
+ fileName: PropTypes.string,
155
+ quality: PropTypes.number,
156
+ type: PropTypes.string.isRequired
157
+ })),
158
+ printOptions: PropTypes.object
159
+ } : void 0;
160
+ export { ChartsToolbarPro };
161
+ function isHideMenuKey(key) {
162
+ return key === 'Tab' || key === 'Escape';
51
163
  }
@@ -1,3 +1,5 @@
1
1
  export * from "./ChartsToolbarPro.js";
2
2
  export * from "./ChartsToolbarZoomInTrigger.js";
3
- export * from "./ChartsToolbarZoomOutTrigger.js";
3
+ export * from "./ChartsToolbarZoomOutTrigger.js";
4
+ export * from "./ChartsToolbarPrintExportTrigger.js";
5
+ export * from "./ChartsToolbarImageExportTrigger.js";
@@ -1,3 +1,5 @@
1
1
  export * from "./ChartsToolbarPro.js";
2
2
  export * from "./ChartsToolbarZoomInTrigger.js";
3
- export * from "./ChartsToolbarZoomOutTrigger.js";
3
+ export * from "./ChartsToolbarZoomOutTrigger.js";
4
+ export * from "./ChartsToolbarPrintExportTrigger.js";
5
+ export * from "./ChartsToolbarImageExportTrigger.js";
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { ChartBasePopperProps, Placement } from "../../internals/slots/chartBaseSlotProps.js";
3
+ export interface ChartsMenuProps extends Pick<ChartBasePopperProps, 'className' | 'onExited'> {
4
+ open: boolean;
5
+ target: HTMLElement | null;
6
+ onClose: (event?: Event) => void;
7
+ position?: Placement;
8
+ children: React.ReactNode;
9
+ }
10
+ declare function ChartsMenu(props: ChartsMenuProps): React.JSX.Element;
11
+ declare namespace ChartsMenu {
12
+ var propTypes: any;
13
+ }
14
+ export { ChartsMenu };
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+
3
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
+ const _excluded = ["open", "target", "onClose", "children", "position", "className", "onExited"];
6
+ import * as React from 'react';
7
+ import PropTypes from 'prop-types';
8
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
9
+ import HTMLElementType from '@mui/utils/HTMLElementType';
10
+ import { useChartsSlots } from '@mui/x-charts/internals';
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ function ChartsMenu(props) {
13
+ const {
14
+ open,
15
+ target,
16
+ onClose,
17
+ children,
18
+ position,
19
+ onExited
20
+ } = props,
21
+ other = _objectWithoutPropertiesLoose(props, _excluded);
22
+ const {
23
+ slots,
24
+ slotProps
25
+ } = useChartsSlots();
26
+ const Popper = slots.basePopper;
27
+ const savedFocusRef = React.useRef(null);
28
+ useEnhancedEffect(() => {
29
+ if (open) {
30
+ savedFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
31
+ } else {
32
+ savedFocusRef.current?.focus?.();
33
+ savedFocusRef.current = null;
34
+ }
35
+ }, [open]);
36
+ const handleClickAway = event => {
37
+ if (event.target && (target === event.target || target?.contains(event.target))) {
38
+ return;
39
+ }
40
+ onClose(event);
41
+ };
42
+ return /*#__PURE__*/_jsx(Popper, _extends({
43
+ open: open,
44
+ target: target,
45
+ transition: true,
46
+ placement: position,
47
+ onClickAway: handleClickAway,
48
+ onExited: onExited,
49
+ clickAwayMouseEvent: "onMouseDown"
50
+ }, other, slotProps?.basePopper, {
51
+ children: children
52
+ }));
53
+ }
54
+ process.env.NODE_ENV !== "production" ? ChartsMenu.propTypes = {
55
+ // ----------------------------- Warning --------------------------------
56
+ // | These PropTypes are generated from the TypeScript type definitions |
57
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
58
+ // ----------------------------------------------------------------------
59
+ children: PropTypes.node,
60
+ className: PropTypes.string,
61
+ onClose: PropTypes.func.isRequired,
62
+ onExited: PropTypes.func,
63
+ open: PropTypes.bool.isRequired,
64
+ position: PropTypes.oneOf(['bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),
65
+ target: HTMLElementType
66
+ } : void 0;
67
+ export { ChartsMenu };
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ import { ChartBaseDividerProps } from "../../internals/slots/chartBaseSlotProps.js";
3
+ export interface ChartsToolbarDividerProps extends ChartBaseDividerProps {}
4
+ declare const ChartsToolbarDivider: React.ForwardRefExoticComponent<Omit<ChartsToolbarDividerProps, "ref"> & React.RefAttributes<HTMLHRElement>>;
5
+ export { ChartsToolbarDivider };
@@ -0,0 +1,40 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import { styled } from '@mui/system';
5
+ import { NotRendered, useChartsSlots } from '@mui/x-charts/internals';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ // This is workaround because api-docs-builder does not support the `NotRendered<ChartBaseDividerProps>` syntax.
8
+ const NotRenderedDivider = NotRendered;
9
+ const Divider = styled(NotRenderedDivider, {
10
+ name: 'MuiChartsToolbar',
11
+ slot: 'Divider'
12
+ })(({
13
+ theme
14
+ }) => ({
15
+ margin: theme.spacing(0, 0.5),
16
+ height: '50%'
17
+ }));
18
+ const ChartsToolbarDivider = /*#__PURE__*/React.forwardRef(function ChartsToolbarDivider(props, ref) {
19
+ const {
20
+ slots,
21
+ slotProps
22
+ } = useChartsSlots();
23
+ return /*#__PURE__*/_jsx(Divider, _extends({
24
+ as: slots.baseDivider,
25
+ orientation: "vertical"
26
+ }, slotProps.baseDivider, props, {
27
+ ref: ref
28
+ }));
29
+ });
30
+ if (process.env.NODE_ENV !== "production") ChartsToolbarDivider.displayName = "ChartsToolbarDivider";
31
+ process.env.NODE_ENV !== "production" ? ChartsToolbarDivider.propTypes = {
32
+ // ----------------------------- Warning --------------------------------
33
+ // | These PropTypes are generated from the TypeScript type definitions |
34
+ // | To update them edit the TypeScript types and run "pnpm proptypes" |
35
+ // ----------------------------------------------------------------------
36
+ className: PropTypes.string,
37
+ orientation: PropTypes.oneOf(['horizontal', 'vertical']),
38
+ style: PropTypes.object
39
+ } : void 0;
40
+ export { ChartsToolbarDivider };