@mui/x-charts-pro 9.2.0 → 9.4.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 (78) hide show
  1. package/BarChartPro/BarChartPro.js +62 -32
  2. package/BarChartPro/BarChartPro.mjs +62 -32
  3. package/CHANGELOG.md +314 -0
  4. package/ChartsDataProviderPro/ChartsDataProviderPro.js +2 -2
  5. package/ChartsDataProviderPro/ChartsDataProviderPro.mjs +2 -2
  6. package/ChartsToolbarPro/ChartsToolbarImageExportTrigger.js +1 -0
  7. package/ChartsToolbarPro/ChartsToolbarImageExportTrigger.mjs +1 -0
  8. package/ChartsToolbarPro/ChartsToolbarPro.d.mts +1 -1
  9. package/ChartsToolbarPro/ChartsToolbarPro.d.ts +1 -1
  10. package/ChartsToolbarPro/ChartsToolbarRangeButtonTrigger.d.mts +1 -1
  11. package/ChartsToolbarPro/ChartsToolbarRangeButtonTrigger.d.ts +1 -1
  12. package/ChartsToolbarPro/ChartsToolbarRangeButtonTrigger.js +35 -38
  13. package/ChartsToolbarPro/ChartsToolbarRangeButtonTrigger.mjs +37 -40
  14. package/ChartsToolbarPro/Toolbar.types.d.mts +3 -2
  15. package/ChartsToolbarPro/Toolbar.types.d.ts +3 -2
  16. package/ChartsToolbarPro/rangeButtonValueToZoom.d.mts +18 -2
  17. package/ChartsToolbarPro/rangeButtonValueToZoom.d.ts +18 -2
  18. package/ChartsToolbarPro/rangeButtonValueToZoom.js +73 -10
  19. package/ChartsToolbarPro/rangeButtonValueToZoom.mjs +72 -10
  20. package/ChartsZoomSlider/internals/chartsAxisZoomSliderThumbClasses.js +9 -2
  21. package/ChartsZoomSlider/internals/chartsAxisZoomSliderThumbClasses.mjs +9 -2
  22. package/ChartsZoomSlider/internals/previews/ScatterPreviewPlot.js +2 -1
  23. package/ChartsZoomSlider/internals/previews/ScatterPreviewPlot.mjs +2 -1
  24. package/FunnelChart/FunnelChart.js +15 -15
  25. package/FunnelChart/FunnelChart.mjs +15 -15
  26. package/FunnelChart/funnelPlotSlots.types.d.mts +5 -4
  27. package/FunnelChart/funnelPlotSlots.types.d.ts +5 -4
  28. package/Heatmap/Heatmap.d.mts +3 -2
  29. package/Heatmap/Heatmap.d.ts +3 -2
  30. package/Heatmap/Heatmap.js +52 -22
  31. package/Heatmap/Heatmap.mjs +52 -22
  32. package/Heatmap/HeatmapItem.d.mts +3 -2
  33. package/Heatmap/HeatmapItem.d.ts +3 -2
  34. package/Heatmap/HeatmapItem.js +2 -0
  35. package/Heatmap/HeatmapItem.mjs +2 -0
  36. package/Heatmap/HeatmapTooltip/HeatmapTooltip.types.d.mts +3 -2
  37. package/Heatmap/HeatmapTooltip/HeatmapTooltip.types.d.ts +3 -2
  38. package/LineChartPro/LineChartPro.js +58 -28
  39. package/LineChartPro/LineChartPro.mjs +58 -28
  40. package/PieChartPro/PieChartPro.js +6 -6
  41. package/PieChartPro/PieChartPro.mjs +6 -6
  42. package/RadarChartPro/RadarChartPro.js +8 -8
  43. package/RadarChartPro/RadarChartPro.mjs +8 -8
  44. package/SankeyChart/SankeyChart.js +16 -16
  45. package/SankeyChart/SankeyChart.mjs +16 -16
  46. package/ScatterChartPro/ScatterChartPro.d.mts +2 -1
  47. package/ScatterChartPro/ScatterChartPro.d.ts +2 -1
  48. package/ScatterChartPro/ScatterChartPro.js +58 -28
  49. package/ScatterChartPro/ScatterChartPro.mjs +58 -28
  50. package/index.js +1 -1
  51. package/index.mjs +1 -1
  52. package/internals/plugins/useChartProExport/exportImage.js +8 -2
  53. package/internals/plugins/useChartProExport/exportImage.mjs +8 -2
  54. package/internals/plugins/useChartProExport/print.js +1 -0
  55. package/internals/plugins/useChartProExport/print.mjs +1 -0
  56. package/internals/plugins/useChartProExport/useChartProExport.types.d.mts +6 -0
  57. package/internals/plugins/useChartProExport/useChartProExport.types.d.ts +6 -0
  58. package/internals/plugins/useChartProZoom/useChartProZoom.js +77 -14
  59. package/internals/plugins/useChartProZoom/useChartProZoom.mjs +79 -15
  60. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.mts +0 -3
  61. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.d.ts +0 -3
  62. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.js +1 -2
  63. package/internals/plugins/useChartProZoom/useChartProZoom.selectors.mjs +0 -1
  64. package/internals/plugins/useChartProZoom/useChartProZoom.types.d.mts +28 -11
  65. package/internals/plugins/useChartProZoom/useChartProZoom.types.d.ts +28 -11
  66. package/internals/slots/chartsBaseSlots.d.mts +6 -5
  67. package/internals/slots/chartsBaseSlots.d.ts +6 -5
  68. package/internals/slots/chartsIconSlots.d.mts +4 -3
  69. package/internals/slots/chartsIconSlots.d.ts +4 -3
  70. package/models/chartsSlotsComponentsPropsPro.d.mts +11 -0
  71. package/models/chartsSlotsComponentsPropsPro.d.ts +11 -0
  72. package/models/chartsSlotsComponentsPropsPro.js +5 -0
  73. package/models/chartsSlotsComponentsPropsPro.mjs +1 -0
  74. package/models/index.d.mts +1 -0
  75. package/models/index.d.ts +1 -0
  76. package/models/index.js +12 -0
  77. package/models/index.mjs +1 -0
  78. package/package.json +6 -6
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { type ScatterChartProps, type ScatterChartSlotProps, type ScatterChartSlots } from '@mui/x-charts/ScatterChart';
3
3
  import { type ChartsTooltipProps } from '@mui/x-charts/ChartsTooltip';
4
+ import type { TooltipPropsOverrides } from '@mui/x-charts/models';
4
5
  import { type ChartsSlotPropsPro, type ChartsSlotsPro } from "../internals/material/index.js";
5
6
  import { type ChartsContainerProProps } from "../ChartsContainerPro/ChartsContainerPro.js";
6
7
  import { type ScatterChartProPluginSignatures } from "./ScatterChartPro.plugins.js";
@@ -11,7 +12,7 @@ export interface ScatterChartProSlotProps extends Omit<ScatterChartSlotProps, 't
11
12
  * Slot props for the tooltip component.
12
13
  * @default {}
13
14
  */
14
- tooltip?: Partial<ChartsTooltipProps<'item' | 'none'>>;
15
+ tooltip?: Partial<ChartsTooltipProps<'item' | 'none'>> & TooltipPropsOverrides;
15
16
  }
16
17
  export interface ScatterChartProProps extends Omit<ScatterChartProps, 'apiRef' | 'slots' | 'slotProps' | 'plugins' | 'seriesConfig'>, Omit<ChartsContainerProProps<'scatter', ScatterChartProPluginSignatures>, 'series' | 'onItemClick' | 'slots' | 'slotProps' | 'highlightedAxis' | 'onHighlightedAxisChange'> {
17
18
  /**
@@ -223,11 +223,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
223
223
  */
224
224
  highlightedItem: _propTypes.default.oneOfType([_propTypes.default.shape({
225
225
  dataIndex: _propTypes.default.number,
226
- seriesId: _propTypes.default.string.isRequired,
227
- type: _propTypes.default.oneOf(['scatter']).isRequired
226
+ seriesId: _propTypes.default.string.isRequired
228
227
  }), _propTypes.default.shape({
229
228
  dataIndex: _propTypes.default.number,
230
- seriesId: _propTypes.default.string.isRequired
229
+ seriesId: _propTypes.default.string.isRequired,
230
+ type: _propTypes.default.oneOf(['scatter']).isRequired
231
231
  })]),
232
232
  /**
233
233
  * Defines the maximum distance between a scatter point and the pointer that triggers the interaction.
@@ -273,12 +273,21 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
273
273
  /**
274
274
  * The list of zoom data related to each axis.
275
275
  * Used to initialize the zoom in a specific configuration without controlling it.
276
+ *
277
+ * Each entry is either explicit zoom percentages (`{ axisId, start, end }`) or a
278
+ * range value (`{ axisId, value }`) resolved against the axis domain.
276
279
  */
277
- initialZoom: _propTypes.default.arrayOf(_propTypes.default.shape({
280
+ initialZoom: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.shape({
278
281
  axisId: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]).isRequired,
279
282
  end: _propTypes.default.number.isRequired,
280
283
  start: _propTypes.default.number.isRequired
281
- })),
284
+ }), _propTypes.default.shape({
285
+ axisId: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]).isRequired,
286
+ value: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.instanceOf(Date).isRequired), _propTypes.default.arrayOf(_propTypes.default.string.isRequired), _propTypes.default.func, _propTypes.default.shape({
287
+ step: _propTypes.default.number,
288
+ unit: _propTypes.default.oneOf(['day', 'hour', 'microsecond', 'millisecond', 'minute', 'month', 'second', 'week', 'year']).isRequired
289
+ })])
290
+ })]).isRequired),
282
291
  /**
283
292
  * If `true`, a loading overlay is displayed.
284
293
  * @default false
@@ -399,11 +408,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
399
408
  */
400
409
  tooltipItem: _propTypes.default.oneOfType([_propTypes.default.shape({
401
410
  dataIndex: _propTypes.default.number.isRequired,
402
- seriesId: _propTypes.default.string.isRequired,
403
- type: _propTypes.default.oneOf(['scatter']).isRequired
411
+ seriesId: _propTypes.default.string.isRequired
404
412
  }), _propTypes.default.shape({
405
413
  dataIndex: _propTypes.default.number.isRequired,
406
- seriesId: _propTypes.default.string.isRequired
414
+ seriesId: _propTypes.default.string.isRequired,
415
+ type: _propTypes.default.oneOf(['scatter']).isRequired
407
416
  })]),
408
417
  /**
409
418
  * The width of the chart in px. If not defined, it takes the width of the parent element.
@@ -426,11 +435,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
426
435
  */
427
436
  zAxis: _propTypes.default.arrayOf(_propTypes.default.shape({
428
437
  colorMap: _propTypes.default.oneOfType([_propTypes.default.shape({
429
- colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
430
- type: _propTypes.default.oneOf(['ordinal']).isRequired,
431
- unknownColor: _propTypes.default.string,
432
- values: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number, _propTypes.default.string]).isRequired)
433
- }), _propTypes.default.shape({
434
438
  color: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.string.isRequired), _propTypes.default.func]).isRequired,
435
439
  max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
436
440
  min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
@@ -439,12 +443,38 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
439
443
  colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
440
444
  thresholds: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]).isRequired).isRequired,
441
445
  type: _propTypes.default.oneOf(['piecewise']).isRequired
446
+ }), _propTypes.default.shape({
447
+ colors: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
448
+ type: _propTypes.default.oneOf(['ordinal']).isRequired,
449
+ unknownColor: _propTypes.default.string,
450
+ values: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number, _propTypes.default.string]).isRequired)
442
451
  })]),
443
452
  data: _propTypes.default.array,
444
453
  dataKey: _propTypes.default.string,
445
454
  id: _propTypes.default.string,
446
455
  max: _propTypes.default.number,
447
456
  min: _propTypes.default.number,
457
+ sizeMap: _propTypes.default.oneOfType([_propTypes.default.shape({
458
+ interpolator: _propTypes.default.oneOf(['linear', 'log', 'sqrt']),
459
+ max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
460
+ min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
461
+ size: _propTypes.default.arrayOf(_propTypes.default.number.isRequired).isRequired,
462
+ type: _propTypes.default.oneOf(['continuous']).isRequired
463
+ }), _propTypes.default.shape({
464
+ max: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
465
+ min: _propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]),
466
+ size: _propTypes.default.func.isRequired,
467
+ type: _propTypes.default.oneOf(['continuous']).isRequired
468
+ }), _propTypes.default.shape({
469
+ sizes: _propTypes.default.arrayOf(_propTypes.default.number).isRequired,
470
+ thresholds: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number]).isRequired).isRequired,
471
+ type: _propTypes.default.oneOf(['piecewise']).isRequired
472
+ }), _propTypes.default.shape({
473
+ sizes: _propTypes.default.arrayOf(_propTypes.default.number).isRequired,
474
+ type: _propTypes.default.oneOf(['ordinal']).isRequired,
475
+ unknownSize: _propTypes.default.number,
476
+ values: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.instanceOf(Date), _propTypes.default.number, _propTypes.default.string]).isRequired)
477
+ })]),
448
478
  valueGetter: _propTypes.default.func
449
479
  })),
450
480
  /**
@@ -460,6 +490,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
460
490
  */
461
491
  zoomInteractionConfig: _propTypes.default.shape({
462
492
  pan: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf(['drag', 'pressAndDrag', 'wheel']), _propTypes.default.shape({
493
+ allowedDirection: _propTypes.default.oneOf(['x', 'xy', 'y']),
494
+ pointerMode: _propTypes.default.any,
495
+ requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
496
+ type: _propTypes.default.oneOf(['wheel']).isRequired
497
+ }), _propTypes.default.shape({
463
498
  pointerMode: _propTypes.default.oneOf(['mouse', 'touch']),
464
499
  requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
465
500
  type: _propTypes.default.oneOf(['drag']).isRequired
@@ -467,24 +502,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
467
502
  pointerMode: _propTypes.default.oneOf(['mouse', 'touch']),
468
503
  requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
469
504
  type: _propTypes.default.oneOf(['pressAndDrag']).isRequired
470
- }), _propTypes.default.shape({
471
- allowedDirection: _propTypes.default.oneOf(['x', 'xy', 'y']),
472
- pointerMode: _propTypes.default.any,
473
- requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
474
- type: _propTypes.default.oneOf(['wheel']).isRequired
475
505
  })]).isRequired),
476
506
  zoom: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf(['brush', 'doubleTapReset', 'pinch', 'tapAndDrag', 'wheel']), _propTypes.default.shape({
477
- pointerMode: _propTypes.default.any,
478
- requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
479
- type: _propTypes.default.oneOf(['wheel']).isRequired
480
- }), _propTypes.default.shape({
481
- pointerMode: _propTypes.default.any,
482
- requiredKeys: _propTypes.default.array,
483
- type: _propTypes.default.oneOf(['pinch']).isRequired
484
- }), _propTypes.default.shape({
485
507
  pointerMode: _propTypes.default.oneOf(['mouse', 'touch']),
486
508
  requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
487
- type: _propTypes.default.oneOf(['tapAndDrag']).isRequired
509
+ type: _propTypes.default.oneOf(['brush']).isRequired
488
510
  }), _propTypes.default.shape({
489
511
  pointerMode: _propTypes.default.oneOf(['mouse', 'touch']),
490
512
  requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
@@ -492,7 +514,15 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
492
514
  }), _propTypes.default.shape({
493
515
  pointerMode: _propTypes.default.oneOf(['mouse', 'touch']),
494
516
  requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
495
- type: _propTypes.default.oneOf(['brush']).isRequired
517
+ type: _propTypes.default.oneOf(['tapAndDrag']).isRequired
518
+ }), _propTypes.default.shape({
519
+ pointerMode: _propTypes.default.any,
520
+ requiredKeys: _propTypes.default.array,
521
+ type: _propTypes.default.oneOf(['pinch']).isRequired
522
+ }), _propTypes.default.shape({
523
+ pointerMode: _propTypes.default.any,
524
+ requiredKeys: _propTypes.default.arrayOf(_propTypes.default.string),
525
+ type: _propTypes.default.oneOf(['wheel']).isRequired
496
526
  })]).isRequired)
497
527
  })
498
528
  } : void 0;
@@ -216,11 +216,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
216
216
  */
217
217
  highlightedItem: PropTypes.oneOfType([PropTypes.shape({
218
218
  dataIndex: PropTypes.number,
219
- seriesId: PropTypes.string.isRequired,
220
- type: PropTypes.oneOf(['scatter']).isRequired
219
+ seriesId: PropTypes.string.isRequired
221
220
  }), PropTypes.shape({
222
221
  dataIndex: PropTypes.number,
223
- seriesId: PropTypes.string.isRequired
222
+ seriesId: PropTypes.string.isRequired,
223
+ type: PropTypes.oneOf(['scatter']).isRequired
224
224
  })]),
225
225
  /**
226
226
  * Defines the maximum distance between a scatter point and the pointer that triggers the interaction.
@@ -266,12 +266,21 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
266
266
  /**
267
267
  * The list of zoom data related to each axis.
268
268
  * Used to initialize the zoom in a specific configuration without controlling it.
269
+ *
270
+ * Each entry is either explicit zoom percentages (`{ axisId, start, end }`) or a
271
+ * range value (`{ axisId, value }`) resolved against the axis domain.
269
272
  */
270
- initialZoom: PropTypes.arrayOf(PropTypes.shape({
273
+ initialZoom: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.shape({
271
274
  axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
272
275
  end: PropTypes.number.isRequired,
273
276
  start: PropTypes.number.isRequired
274
- })),
277
+ }), PropTypes.shape({
278
+ axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
279
+ value: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.instanceOf(Date).isRequired), PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func, PropTypes.shape({
280
+ step: PropTypes.number,
281
+ unit: PropTypes.oneOf(['day', 'hour', 'microsecond', 'millisecond', 'minute', 'month', 'second', 'week', 'year']).isRequired
282
+ })])
283
+ })]).isRequired),
275
284
  /**
276
285
  * If `true`, a loading overlay is displayed.
277
286
  * @default false
@@ -392,11 +401,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
392
401
  */
393
402
  tooltipItem: PropTypes.oneOfType([PropTypes.shape({
394
403
  dataIndex: PropTypes.number.isRequired,
395
- seriesId: PropTypes.string.isRequired,
396
- type: PropTypes.oneOf(['scatter']).isRequired
404
+ seriesId: PropTypes.string.isRequired
397
405
  }), PropTypes.shape({
398
406
  dataIndex: PropTypes.number.isRequired,
399
- seriesId: PropTypes.string.isRequired
407
+ seriesId: PropTypes.string.isRequired,
408
+ type: PropTypes.oneOf(['scatter']).isRequired
400
409
  })]),
401
410
  /**
402
411
  * The width of the chart in px. If not defined, it takes the width of the parent element.
@@ -419,11 +428,6 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
419
428
  */
420
429
  zAxis: PropTypes.arrayOf(PropTypes.shape({
421
430
  colorMap: PropTypes.oneOfType([PropTypes.shape({
422
- colors: PropTypes.arrayOf(PropTypes.string).isRequired,
423
- type: PropTypes.oneOf(['ordinal']).isRequired,
424
- unknownColor: PropTypes.string,
425
- values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
426
- }), PropTypes.shape({
427
431
  color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
428
432
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
429
433
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
@@ -432,12 +436,38 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
432
436
  colors: PropTypes.arrayOf(PropTypes.string).isRequired,
433
437
  thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
434
438
  type: PropTypes.oneOf(['piecewise']).isRequired
439
+ }), PropTypes.shape({
440
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
441
+ type: PropTypes.oneOf(['ordinal']).isRequired,
442
+ unknownColor: PropTypes.string,
443
+ values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
435
444
  })]),
436
445
  data: PropTypes.array,
437
446
  dataKey: PropTypes.string,
438
447
  id: PropTypes.string,
439
448
  max: PropTypes.number,
440
449
  min: PropTypes.number,
450
+ sizeMap: PropTypes.oneOfType([PropTypes.shape({
451
+ interpolator: PropTypes.oneOf(['linear', 'log', 'sqrt']),
452
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
453
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
454
+ size: PropTypes.arrayOf(PropTypes.number.isRequired).isRequired,
455
+ type: PropTypes.oneOf(['continuous']).isRequired
456
+ }), PropTypes.shape({
457
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
458
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
459
+ size: PropTypes.func.isRequired,
460
+ type: PropTypes.oneOf(['continuous']).isRequired
461
+ }), PropTypes.shape({
462
+ sizes: PropTypes.arrayOf(PropTypes.number).isRequired,
463
+ thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
464
+ type: PropTypes.oneOf(['piecewise']).isRequired
465
+ }), PropTypes.shape({
466
+ sizes: PropTypes.arrayOf(PropTypes.number).isRequired,
467
+ type: PropTypes.oneOf(['ordinal']).isRequired,
468
+ unknownSize: PropTypes.number,
469
+ values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
470
+ })]),
441
471
  valueGetter: PropTypes.func
442
472
  })),
443
473
  /**
@@ -453,6 +483,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
453
483
  */
454
484
  zoomInteractionConfig: PropTypes.shape({
455
485
  pan: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf(['drag', 'pressAndDrag', 'wheel']), PropTypes.shape({
486
+ allowedDirection: PropTypes.oneOf(['x', 'xy', 'y']),
487
+ pointerMode: PropTypes.any,
488
+ requiredKeys: PropTypes.arrayOf(PropTypes.string),
489
+ type: PropTypes.oneOf(['wheel']).isRequired
490
+ }), PropTypes.shape({
456
491
  pointerMode: PropTypes.oneOf(['mouse', 'touch']),
457
492
  requiredKeys: PropTypes.arrayOf(PropTypes.string),
458
493
  type: PropTypes.oneOf(['drag']).isRequired
@@ -460,24 +495,11 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
460
495
  pointerMode: PropTypes.oneOf(['mouse', 'touch']),
461
496
  requiredKeys: PropTypes.arrayOf(PropTypes.string),
462
497
  type: PropTypes.oneOf(['pressAndDrag']).isRequired
463
- }), PropTypes.shape({
464
- allowedDirection: PropTypes.oneOf(['x', 'xy', 'y']),
465
- pointerMode: PropTypes.any,
466
- requiredKeys: PropTypes.arrayOf(PropTypes.string),
467
- type: PropTypes.oneOf(['wheel']).isRequired
468
498
  })]).isRequired),
469
499
  zoom: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf(['brush', 'doubleTapReset', 'pinch', 'tapAndDrag', 'wheel']), PropTypes.shape({
470
- pointerMode: PropTypes.any,
471
- requiredKeys: PropTypes.arrayOf(PropTypes.string),
472
- type: PropTypes.oneOf(['wheel']).isRequired
473
- }), PropTypes.shape({
474
- pointerMode: PropTypes.any,
475
- requiredKeys: PropTypes.array,
476
- type: PropTypes.oneOf(['pinch']).isRequired
477
- }), PropTypes.shape({
478
500
  pointerMode: PropTypes.oneOf(['mouse', 'touch']),
479
501
  requiredKeys: PropTypes.arrayOf(PropTypes.string),
480
- type: PropTypes.oneOf(['tapAndDrag']).isRequired
502
+ type: PropTypes.oneOf(['brush']).isRequired
481
503
  }), PropTypes.shape({
482
504
  pointerMode: PropTypes.oneOf(['mouse', 'touch']),
483
505
  requiredKeys: PropTypes.arrayOf(PropTypes.string),
@@ -485,7 +507,15 @@ process.env.NODE_ENV !== "production" ? ScatterChartPro.propTypes = {
485
507
  }), PropTypes.shape({
486
508
  pointerMode: PropTypes.oneOf(['mouse', 'touch']),
487
509
  requiredKeys: PropTypes.arrayOf(PropTypes.string),
488
- type: PropTypes.oneOf(['brush']).isRequired
510
+ type: PropTypes.oneOf(['tapAndDrag']).isRequired
511
+ }), PropTypes.shape({
512
+ pointerMode: PropTypes.any,
513
+ requiredKeys: PropTypes.array,
514
+ type: PropTypes.oneOf(['pinch']).isRequired
515
+ }), PropTypes.shape({
516
+ pointerMode: PropTypes.any,
517
+ requiredKeys: PropTypes.arrayOf(PropTypes.string),
518
+ type: PropTypes.oneOf(['wheel']).isRequired
489
519
  })]).isRequired)
490
520
  })
491
521
  } : void 0;
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-charts-pro v9.2.0
2
+ * @mui/x-charts-pro v9.4.0
3
3
  *
4
4
  * @license SEE LICENSE IN LICENSE
5
5
  * This source code is licensed under the SEE LICENSE IN LICENSE license found in the
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-charts-pro v9.2.0
2
+ * @mui/x-charts-pro v9.4.0
3
3
  *
4
4
  * @license SEE LICENSE IN LICENSE
5
5
  * This source code is licensed under the SEE LICENSE IN LICENSE license found in the
@@ -10,6 +10,7 @@ var _formatErrorMessage2 = _interopRequireDefault(require("@mui/x-internals/form
10
10
  var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime/helpers/interopRequireWildcard"));
11
11
  var _ownerDocument = _interopRequireDefault(require("@mui/utils/ownerDocument"));
12
12
  var _export = require("@mui/x-internals/export");
13
+ var _warning = require("@mui/x-internals/warning");
13
14
  var _common = require("./common");
14
15
  var _defaults = require("./defaults");
15
16
  const getDrawDocument = async () => {
@@ -30,11 +31,15 @@ async function exportImage(element, svg, params) {
30
31
  quality = 0.9,
31
32
  onBeforeExport = _defaults.defaultOnBeforeExport,
32
33
  copyStyles = true,
33
- nonce
34
+ nonce,
35
+ pixelRatio
34
36
  } = params ?? {};
37
+ if (process.env.NODE_ENV !== 'production' && pixelRatio !== undefined && (!Number.isFinite(pixelRatio) || pixelRatio <= 0)) {
38
+ (0, _warning.warnOnce)('MUI X Charts: `pixelRatio` must be a finite number greater than 0 when exporting a chart as an image.', 'error');
39
+ }
35
40
  const drawDocumentPromise = getDrawDocument();
36
41
  const doc = (0, _ownerDocument.default)(element);
37
- const ratio = Math.max(window.devicePixelRatio || 1, 1);
42
+ const ratio = pixelRatio ?? Math.max(window.devicePixelRatio || 1, 1);
38
43
  const iframe = (0, _common.createExportIframe)(fileName);
39
44
  /* We apply the min/max width and height to ensure the SVG doesn't resize in the export.
40
45
  * We apply to the original SVG so that the cloned tree will contain the styles and revert these
@@ -49,6 +54,7 @@ async function exportImage(element, svg, params) {
49
54
  iframe.onload = async () => {
50
55
  const exportDoc = iframe.contentDocument;
51
56
  const elementClone = element.cloneNode(true);
57
+ elementClone.querySelectorAll('[data-hide-on-export]').forEach(el => el.remove());
52
58
  (0, _common.applyStyles)(svg, previousStyles);
53
59
  exportDoc.body.replaceChildren(elementClone);
54
60
  exportDoc.body.style.margin = '0px';
@@ -1,6 +1,7 @@
1
1
  import _formatErrorMessage from "@mui/x-internals/formatErrorMessage";
2
2
  import ownerDocument from '@mui/utils/ownerDocument';
3
3
  import { loadStyleSheets } from '@mui/x-internals/export';
4
+ import { warnOnce } from '@mui/x-internals/warning';
4
5
  import { applyStyles, copyCanvasesContent, createExportIframe } from "./common.mjs";
5
6
  import { defaultOnBeforeExport } from "./defaults.mjs";
6
7
  export const getDrawDocument = async () => {
@@ -20,11 +21,15 @@ export async function exportImage(element, svg, params) {
20
21
  quality = 0.9,
21
22
  onBeforeExport = defaultOnBeforeExport,
22
23
  copyStyles = true,
23
- nonce
24
+ nonce,
25
+ pixelRatio
24
26
  } = params ?? {};
27
+ if (process.env.NODE_ENV !== 'production' && pixelRatio !== undefined && (!Number.isFinite(pixelRatio) || pixelRatio <= 0)) {
28
+ warnOnce('MUI X Charts: `pixelRatio` must be a finite number greater than 0 when exporting a chart as an image.', 'error');
29
+ }
25
30
  const drawDocumentPromise = getDrawDocument();
26
31
  const doc = ownerDocument(element);
27
- const ratio = Math.max(window.devicePixelRatio || 1, 1);
32
+ const ratio = pixelRatio ?? Math.max(window.devicePixelRatio || 1, 1);
28
33
  const iframe = createExportIframe(fileName);
29
34
  /* We apply the min/max width and height to ensure the SVG doesn't resize in the export.
30
35
  * We apply to the original SVG so that the cloned tree will contain the styles and revert these
@@ -39,6 +44,7 @@ export async function exportImage(element, svg, params) {
39
44
  iframe.onload = async () => {
40
45
  const exportDoc = iframe.contentDocument;
41
46
  const elementClone = element.cloneNode(true);
47
+ elementClone.querySelectorAll('[data-hide-on-export]').forEach(el => el.remove());
42
48
  applyStyles(svg, previousStyles);
43
49
  exportDoc.body.replaceChildren(elementClone);
44
50
  exportDoc.body.style.margin = '0px';
@@ -20,6 +20,7 @@ function printChart(element, {
20
20
  printWindow.onload = async () => {
21
21
  const printDoc = printWindow.contentDocument;
22
22
  const elementClone = element.cloneNode(true);
23
+ elementClone.querySelectorAll('[data-hide-on-export]').forEach(el => el.remove());
23
24
  printDoc.body.replaceChildren(elementClone);
24
25
  printDoc.body.style.margin = '0px';
25
26
  const rootCandidate = element.getRootNode();
@@ -13,6 +13,7 @@ export function printChart(element, {
13
13
  printWindow.onload = async () => {
14
14
  const printDoc = printWindow.contentDocument;
15
15
  const elementClone = element.cloneNode(true);
16
+ elementClone.querySelectorAll('[data-hide-on-export]').forEach(el => el.remove());
16
17
  printDoc.body.replaceChildren(elementClone);
17
18
  printDoc.body.style.margin = '0px';
18
19
  const rootCandidate = element.getRootNode();
@@ -55,6 +55,12 @@ export interface ChartImageExportOptions extends ChartExportOptions {
55
55
  * @default 0.9
56
56
  */
57
57
  quality?: number;
58
+ /**
59
+ * The pixel ratio used when rasterizing the chart to a canvas. Higher values produce
60
+ * sharper images at the cost of a larger file size.
61
+ * @default The larger of `window.devicePixelRatio` and `1`
62
+ */
63
+ pixelRatio?: number;
58
64
  }
59
65
  export interface UseChartProExportPublicApi {
60
66
  /**
@@ -55,6 +55,12 @@ export interface ChartImageExportOptions extends ChartExportOptions {
55
55
  * @default 0.9
56
56
  */
57
57
  quality?: number;
58
+ /**
59
+ * The pixel ratio used when rasterizing the chart to a canvas. Higher values produce
60
+ * sharper images at the cost of a larger file size.
61
+ * @default The larger of `window.devicePixelRatio` and `1`
62
+ */
63
+ pixelRatio?: number;
58
64
  }
59
65
  export interface UseChartProExportPublicApi {
60
66
  /**
@@ -11,9 +11,11 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _internals = require("@mui/x-charts/internals");
13
13
  var _debounce = _interopRequireDefault(require("@mui/utils/debounce"));
14
+ var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
14
15
  var _useEffectAfterFirstRender = require("@mui/x-internals/useEffectAfterFirstRender");
15
16
  var _utils = require("@mui/material/utils");
16
17
  var _isDeepEqual = require("@mui/x-internals/isDeepEqual");
18
+ var _rangeButtonValueToZoom = require("../../../ChartsToolbarPro/rangeButtonValueToZoom");
17
19
  var _calculateZoom = require("./calculateZoom");
18
20
  var _useZoomOnWheel = require("./gestureHooks/useZoomOnWheel");
19
21
  var _useZoomOnPinch = require("./gestureHooks/useZoomOnPinch");
@@ -25,6 +27,12 @@ var _useZoomOnBrush = require("./gestureHooks/useZoomOnBrush");
25
27
  var _useZoomOnDoubleTapReset = require("./gestureHooks/useZoomOnDoubleTapReset");
26
28
  var _initializeZoomInteractionConfig = require("./initializeZoomInteractionConfig");
27
29
  var _initializeZoomData = require("./initializeZoomData");
30
+ /**
31
+ * Type guard for `initialZoom` entries provided as a range value.
32
+ */
33
+ function isInitialZoomRange(entry) {
34
+ return 'value' in entry;
35
+ }
28
36
  const useChartProZoom = pluginData => {
29
37
  const {
30
38
  store,
@@ -62,6 +70,68 @@ const useChartProZoom = pluginData => {
62
70
  }));
63
71
  removeIsInteracting();
64
72
  }, [store, paramsZoomData, removeIsInteracting]);
73
+
74
+ // Resolve `initialZoom` entries provided as range values (e.g. `{ axisId, value: { unit: 'month' } }`).
75
+ // These depend on the computed axis domains, which are only available after the first render
76
+ // (unless the user provides explicit `width`/`height`), so they are resolved once on mount.
77
+ // A layout effect avoids a visible unzoomed frame.
78
+ const hasResolvedInitialZoomRanges = React.useRef(false);
79
+ (0, _useEnhancedEffect.default)(() => {
80
+ if (hasResolvedInitialZoomRanges.current) {
81
+ // `initialZoom` is only read on mount, like the rest of the initial zoom state.
82
+ return;
83
+ }
84
+ hasResolvedInitialZoomRanges.current = true;
85
+ if (paramsZoomData !== undefined) {
86
+ // The zoom is controlled, `initialZoom` is ignored.
87
+ return;
88
+ }
89
+ const rangeEntries = (params.initialZoom ?? []).filter(isInitialZoomRange);
90
+ if (rangeEntries.length === 0) {
91
+ return;
92
+ }
93
+ const {
94
+ axes: xAxes,
95
+ domains: xDomains
96
+ } = (0, _internals.selectorChartXAxisWithDomains)(store.state);
97
+ const {
98
+ axes: yAxes,
99
+ domains: yDomains
100
+ } = (0, _internals.selectorChartYAxisWithDomains)(store.state);
101
+ const resolvedZoom = new Map();
102
+ rangeEntries.forEach(entry => {
103
+ const xAxis = xAxes?.find(axis => axis.id === entry.axisId);
104
+ const axis = xAxis ?? yAxes?.find(candidate => candidate.id === entry.axisId);
105
+ if (!axis) {
106
+ if (process.env.NODE_ENV !== 'production') {
107
+ console.error(`MUI X Charts: \`initialZoom\` references the axis with id "${entry.axisId}", which does not exist.\n` + 'The range cannot be resolved. Provide an `axisId` that matches a chart axis.');
108
+ }
109
+ return;
110
+ }
111
+ const domain = (xAxis ? xDomains : yDomains)[entry.axisId]?.domain;
112
+ const domainParams = (0, _rangeButtonValueToZoom.getRangeButtonDomainParams)(axis, domain);
113
+ if (!domainParams) {
114
+ return;
115
+ }
116
+ const {
117
+ start,
118
+ end
119
+ } = (0, _rangeButtonValueToZoom.rangeButtonValueToZoom)(entry.value, domainParams);
120
+ resolvedZoom.set(entry.axisId, {
121
+ axisId: entry.axisId,
122
+ start,
123
+ end
124
+ });
125
+ });
126
+ if (resolvedZoom.size === 0) {
127
+ return;
128
+ }
129
+ store.set('zoom', (0, _extends2.default)({}, store.state.zoom, {
130
+ isInteracting: true,
131
+ zoomData: store.state.zoom.zoomData.map(zoom => resolvedZoom.get(zoom.axisId) ?? zoom)
132
+ }));
133
+ removeIsInteracting();
134
+ }, [store, paramsZoomData, params.initialZoom, removeIsInteracting]);
65
135
  const setZoomDataCallback = React.useCallback(zoomData => {
66
136
  const newZoomData = typeof zoomData === 'function' ? zoomData([...store.state.zoom.zoomData]) : zoomData;
67
137
  if ((0, _isDeepEqual.isDeepEqual)(store.state.zoom.zoomData, newZoomData)) {
@@ -70,14 +140,12 @@ const useChartProZoom = pluginData => {
70
140
  onZoomChange(newZoomData);
71
141
  if (store.state.zoom.isControlled) {
72
142
  store.set('zoom', (0, _extends2.default)({}, store.state.zoom, {
73
- isInteracting: true,
74
- activeRangeButtonKey: null
143
+ isInteracting: true
75
144
  }));
76
145
  } else {
77
146
  store.set('zoom', (0, _extends2.default)({}, store.state.zoom, {
78
147
  isInteracting: true,
79
- zoomData: newZoomData,
80
- activeRangeButtonKey: null
148
+ zoomData: newZoomData
81
149
  }));
82
150
  removeIsInteracting();
83
151
  }
@@ -141,11 +209,6 @@ const useChartProZoom = pluginData => {
141
209
  }, [setZoomDataCallback, store]);
142
210
  const zoomIn = React.useCallback(() => zoom(0.1), [zoom]);
143
211
  const zoomOut = React.useCallback(() => zoom(-0.1), [zoom]);
144
- const setActiveRangeButtonKey = React.useCallback(key => {
145
- store.set('zoom', (0, _extends2.default)({}, store.state.zoom, {
146
- activeRangeButtonKey: key
147
- }));
148
- }, [store]);
149
212
  return {
150
213
  publicAPI: {
151
214
  setZoomData: setZoomDataCallback,
@@ -158,8 +221,7 @@ const useChartProZoom = pluginData => {
158
221
  setAxisZoomData,
159
222
  moveZoomRange,
160
223
  zoomIn,
161
- zoomOut,
162
- setActiveRangeButtonKey
224
+ zoomOut
163
225
  }
164
226
  };
165
227
  };
@@ -178,16 +240,17 @@ useChartProZoom.getInitialState = params => {
178
240
  defaultizedYAxis
179
241
  } = params;
180
242
  const optionsLookup = (0, _extends2.default)({}, (0, _internals.createZoomLookup)('x')(defaultizedXAxis), (0, _internals.createZoomLookup)('y')(defaultizedYAxis));
243
+ // Range-value entries of `initialZoom` are resolved after the first render, once the axis
244
+ // domains are computed. Only the explicit `ZoomData` entries are applied to the initial state.
181
245
  const userZoomData =
182
246
  // eslint-disable-next-line no-nested-ternary
183
- zoomData !== undefined ? zoomData : initialZoom !== undefined ? initialZoom : undefined;
247
+ zoomData !== undefined ? zoomData : initialZoom !== undefined ? initialZoom.filter(entry => !isInitialZoomRange(entry)) : undefined;
184
248
  return {
185
249
  zoom: {
186
250
  zoomData: (0, _initializeZoomData.initializeZoomData)(optionsLookup, userZoomData),
187
251
  isInteracting: false,
188
252
  isControlled: zoomData !== undefined,
189
- zoomInteractionConfig: (0, _initializeZoomInteractionConfig.initializeZoomInteractionConfig)(params.zoomInteractionConfig, optionsLookup),
190
- activeRangeButtonKey: null
253
+ zoomInteractionConfig: (0, _initializeZoomInteractionConfig.initializeZoomInteractionConfig)(params.zoomInteractionConfig, optionsLookup)
191
254
  }
192
255
  };
193
256
  };