@mui/x-charts 8.14.1 → 8.15.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 (125) hide show
  1. package/BarChart/BarChart.js +8 -0
  2. package/BarChart/BarChart.plugins.d.ts +2 -1
  3. package/BarChart/BarChart.plugins.js +2 -1
  4. package/BarChart/useBarChartProps.js +4 -2
  5. package/CHANGELOG.md +107 -0
  6. package/ChartContainer/ChartContainer.js +8 -0
  7. package/ChartContainer/useChartContainerProps.js +4 -2
  8. package/ChartsBrushOverlay/ChartsBrushOverlay.classes.d.ts +12 -0
  9. package/ChartsBrushOverlay/ChartsBrushOverlay.classes.js +9 -0
  10. package/ChartsBrushOverlay/ChartsBrushOverlay.d.ts +6 -0
  11. package/ChartsBrushOverlay/ChartsBrushOverlay.js +102 -0
  12. package/ChartsBrushOverlay/index.d.ts +4 -0
  13. package/ChartsBrushOverlay/index.js +19 -0
  14. package/ChartsReferenceLine/ChartsReferenceLine.js +1 -1
  15. package/ChartsReferenceLine/ChartsXReferenceLine.js +13 -8
  16. package/ChartsReferenceLine/ChartsYReferenceLine.js +13 -8
  17. package/ChartsReferenceLine/common.d.ts +3 -1
  18. package/ChartsReferenceLine/common.js +3 -1
  19. package/ChartsTooltip/ChartsTooltipContainer.js +20 -2
  20. package/ChartsXAxis/getVisibleLabels.js +45 -25
  21. package/LineChart/LineChart.js +8 -0
  22. package/LineChart/LineChart.plugins.d.ts +2 -1
  23. package/LineChart/LineChart.plugins.js +2 -1
  24. package/LineChart/useLineChartProps.js +4 -2
  25. package/ScatterChart/ScatterChart.js +8 -0
  26. package/ScatterChart/ScatterChart.plugins.d.ts +2 -1
  27. package/ScatterChart/ScatterChart.plugins.js +2 -1
  28. package/ScatterChart/useScatterChartProps.js +5 -3
  29. package/SparkLineChart/SparkLineChart.js +8 -0
  30. package/esm/BarChart/BarChart.js +8 -0
  31. package/esm/BarChart/BarChart.plugins.d.ts +2 -1
  32. package/esm/BarChart/BarChart.plugins.js +2 -1
  33. package/esm/BarChart/useBarChartProps.js +4 -2
  34. package/esm/ChartContainer/ChartContainer.js +8 -0
  35. package/esm/ChartContainer/useChartContainerProps.js +4 -2
  36. package/esm/ChartsBrushOverlay/ChartsBrushOverlay.classes.d.ts +12 -0
  37. package/esm/ChartsBrushOverlay/ChartsBrushOverlay.classes.js +2 -0
  38. package/esm/ChartsBrushOverlay/ChartsBrushOverlay.d.ts +6 -0
  39. package/esm/ChartsBrushOverlay/ChartsBrushOverlay.js +95 -0
  40. package/esm/ChartsBrushOverlay/index.d.ts +4 -0
  41. package/esm/ChartsBrushOverlay/index.js +2 -0
  42. package/esm/ChartsReferenceLine/ChartsReferenceLine.js +1 -1
  43. package/esm/ChartsReferenceLine/ChartsXReferenceLine.js +14 -9
  44. package/esm/ChartsReferenceLine/ChartsYReferenceLine.js +14 -9
  45. package/esm/ChartsReferenceLine/common.d.ts +3 -1
  46. package/esm/ChartsReferenceLine/common.js +2 -0
  47. package/esm/ChartsTooltip/ChartsTooltipContainer.js +20 -2
  48. package/esm/ChartsXAxis/getVisibleLabels.js +45 -25
  49. package/esm/LineChart/LineChart.js +8 -0
  50. package/esm/LineChart/LineChart.plugins.d.ts +2 -1
  51. package/esm/LineChart/LineChart.plugins.js +2 -1
  52. package/esm/LineChart/useLineChartProps.js +4 -2
  53. package/esm/ScatterChart/ScatterChart.js +8 -0
  54. package/esm/ScatterChart/ScatterChart.plugins.d.ts +2 -1
  55. package/esm/ScatterChart/ScatterChart.plugins.js +2 -1
  56. package/esm/ScatterChart/useScatterChartProps.js +5 -3
  57. package/esm/SparkLineChart/SparkLineChart.js +8 -0
  58. package/esm/hooks/index.d.ts +2 -1
  59. package/esm/hooks/index.js +2 -1
  60. package/esm/hooks/useBrush.d.ts +18 -0
  61. package/esm/hooks/useBrush.js +16 -0
  62. package/esm/index.d.ts +2 -1
  63. package/esm/index.js +2 -1
  64. package/esm/internals/domUtils.d.ts +9 -4
  65. package/esm/internals/domUtils.js +115 -52
  66. package/esm/internals/index.d.ts +1 -0
  67. package/esm/internals/index.js +1 -0
  68. package/esm/internals/plugins/allPlugins.d.ts +4 -3
  69. package/esm/internals/plugins/allPlugins.js +2 -1
  70. package/esm/internals/plugins/corePlugins/useChartInteractionListener/useChartInteractionListener.js +16 -10
  71. package/esm/internals/plugins/corePlugins/useChartInteractionListener/useChartInteractionListener.types.d.ts +2 -2
  72. package/esm/internals/plugins/featurePlugins/useChartBrush/index.d.ts +3 -0
  73. package/esm/internals/plugins/featurePlugins/useChartBrush/index.js +3 -0
  74. package/esm/internals/plugins/featurePlugins/useChartBrush/useChartBrush.d.ts +3 -0
  75. package/esm/internals/plugins/featurePlugins/useChartBrush/useChartBrush.js +109 -0
  76. package/esm/internals/plugins/featurePlugins/useChartBrush/useChartBrush.selectors.d.ts +82 -0
  77. package/esm/internals/plugins/featurePlugins/useChartBrush/useChartBrush.selectors.js +75 -0
  78. package/esm/internals/plugins/featurePlugins/useChartBrush/useChartBrush.types.d.ts +72 -0
  79. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/createZoomLookup.js +3 -2
  80. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeAxis.js +2 -2
  81. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeZoom.d.ts +2 -1
  82. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeZoom.js +8 -3
  83. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxis.types.d.ts +3 -1
  84. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianHighlight.selectors.d.ts +4 -4
  85. package/esm/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianHighlight.selectors.js +13 -6
  86. package/esm/internals/plugins/utils/selectors.d.ts +1 -1
  87. package/esm/locales/elGR.js +97 -99
  88. package/esm/tests/constants.js +1 -0
  89. package/hooks/index.d.ts +2 -1
  90. package/hooks/index.js +12 -0
  91. package/hooks/useBrush.d.ts +18 -0
  92. package/hooks/useBrush.js +21 -0
  93. package/index.d.ts +2 -1
  94. package/index.js +13 -1
  95. package/internals/domUtils.d.ts +9 -4
  96. package/internals/domUtils.js +119 -54
  97. package/internals/index.d.ts +1 -0
  98. package/internals/index.js +12 -0
  99. package/internals/plugins/allPlugins.d.ts +4 -3
  100. package/internals/plugins/allPlugins.js +2 -1
  101. package/internals/plugins/corePlugins/useChartInteractionListener/useChartInteractionListener.js +16 -10
  102. package/internals/plugins/corePlugins/useChartInteractionListener/useChartInteractionListener.types.d.ts +2 -2
  103. package/internals/plugins/featurePlugins/useChartBrush/index.d.ts +3 -0
  104. package/internals/plugins/featurePlugins/useChartBrush/index.js +38 -0
  105. package/internals/plugins/featurePlugins/useChartBrush/useChartBrush.d.ts +3 -0
  106. package/internals/plugins/featurePlugins/useChartBrush/useChartBrush.js +117 -0
  107. package/internals/plugins/featurePlugins/useChartBrush/useChartBrush.selectors.d.ts +82 -0
  108. package/internals/plugins/featurePlugins/useChartBrush/useChartBrush.selectors.js +82 -0
  109. package/internals/plugins/featurePlugins/useChartBrush/useChartBrush.types.d.ts +72 -0
  110. package/internals/plugins/featurePlugins/useChartBrush/useChartBrush.types.js +5 -0
  111. package/internals/plugins/featurePlugins/useChartCartesianAxis/createZoomLookup.js +3 -2
  112. package/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeAxis.js +2 -2
  113. package/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeZoom.d.ts +2 -1
  114. package/internals/plugins/featurePlugins/useChartCartesianAxis/defaultizeZoom.js +8 -3
  115. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianAxis.types.d.ts +3 -1
  116. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianHighlight.selectors.d.ts +4 -4
  117. package/internals/plugins/featurePlugins/useChartCartesianAxis/useChartCartesianHighlight.selectors.js +13 -6
  118. package/internals/plugins/utils/selectors.d.ts +1 -1
  119. package/locales/elGR.js +97 -99
  120. package/package.json +3 -3
  121. package/tests/constants.js +7 -0
  122. package/esm/internals/Flatbush.bench.js +0 -42
  123. package/internals/Flatbush.bench.d.ts +0 -1
  124. package/internals/Flatbush.bench.js +0 -44
  125. /package/esm/internals/{Flatbush.bench.d.ts → plugins/featurePlugins/useChartBrush/useChartBrush.types.js} +0 -0
@@ -4,8 +4,12 @@ import { selectorChartXAxis, selectorChartYAxis } from "./useChartCartesianAxisR
4
4
  import { selectorChartsInteractionXAxisIndex, selectorChartsInteractionXAxisValue, selectorChartsInteractionYAxisIndex, selectorChartsInteractionYAxisValue } from "./useChartCartesianInteraction.selectors.js";
5
5
  import { selectorChartsKeyboardXAxisIndex, selectorChartsKeyboardYAxisIndex } from "../useChartKeyboardNavigation/useChartKeyboardNavigation.selectors.js";
6
6
  import { selectorChartsLastInteraction } from "../useChartInteraction/useChartInteraction.selectors.js";
7
+ import { selectorBrushShouldPreventAxisHighlight } from "../useChartBrush/index.js";
7
8
  const selectorChartControlledCartesianAxisHighlight = state => state.controlledCartesianAxisHighlight;
8
- const selectAxisHighlight = (computedIndex, axis, axisItems) => {
9
+ const selectAxisHighlight = (computedIndex, axis, axisItems, isBrushSelectionActive) => {
10
+ if (isBrushSelectionActive) {
11
+ return [];
12
+ }
9
13
  if (axisItems !== undefined) {
10
14
  return axisItems.filter(item => axis.axis[item.axisId] !== undefined).map(item => item);
11
15
  }
@@ -14,9 +18,12 @@ const selectAxisHighlight = (computedIndex, axis, axisItems) => {
14
18
  dataIndex: computedIndex
15
19
  }];
16
20
  };
17
- export const selectorChartsHighlightXAxisIndex = createSelector([selectorChartsInteractionXAxisIndex, selectorChartXAxis, selectorChartControlledCartesianAxisHighlight], selectAxisHighlight);
18
- export const selectorChartsHighlightYAxisIndex = createSelector([selectorChartsInteractionYAxisIndex, selectorChartYAxis, selectorChartControlledCartesianAxisHighlight], selectAxisHighlight);
19
- const selectAxisHighlightWithValue = (computedIndex, computedValue, axis, controlledAxisItems, keyboardAxisItem, lastInteractionUpdate) => {
21
+ export const selectorChartsHighlightXAxisIndex = createSelector([selectorChartsInteractionXAxisIndex, selectorChartXAxis, selectorChartControlledCartesianAxisHighlight, selectorBrushShouldPreventAxisHighlight], selectAxisHighlight);
22
+ export const selectorChartsHighlightYAxisIndex = createSelector([selectorChartsInteractionYAxisIndex, selectorChartYAxis, selectorChartControlledCartesianAxisHighlight, selectorBrushShouldPreventAxisHighlight], selectAxisHighlight);
23
+ const selectAxisHighlightWithValue = (computedIndex, computedValue, axis, controlledAxisItems, keyboardAxisItem, lastInteractionUpdate, isBrushSelectionActive) => {
24
+ if (isBrushSelectionActive) {
25
+ return [];
26
+ }
20
27
  if (controlledAxisItems !== undefined) {
21
28
  return controlledAxisItems.map(item => _extends({}, item, {
22
29
  value: axis.axis[item.axisId]?.data?.[item.dataIndex]
@@ -51,8 +58,8 @@ const selectAxisHighlightWithValue = (computedIndex, computedValue, axis, contro
51
58
  }
52
59
  return [];
53
60
  };
54
- export const selectorChartsHighlightXAxisValue = createSelector([selectorChartsInteractionXAxisIndex, selectorChartsInteractionXAxisValue, selectorChartXAxis, selectorChartControlledCartesianAxisHighlight, selectorChartsKeyboardXAxisIndex, selectorChartsLastInteraction], selectAxisHighlightWithValue);
55
- export const selectorChartsHighlightYAxisValue = createSelector([selectorChartsInteractionYAxisIndex, selectorChartsInteractionYAxisValue, selectorChartYAxis, selectorChartControlledCartesianAxisHighlight, selectorChartsKeyboardYAxisIndex, selectorChartsLastInteraction], selectAxisHighlightWithValue);
61
+ export const selectorChartsHighlightXAxisValue = createSelector([selectorChartsInteractionXAxisIndex, selectorChartsInteractionXAxisValue, selectorChartXAxis, selectorChartControlledCartesianAxisHighlight, selectorChartsKeyboardXAxisIndex, selectorChartsLastInteraction, selectorBrushShouldPreventAxisHighlight], selectAxisHighlightWithValue);
62
+ export const selectorChartsHighlightYAxisValue = createSelector([selectorChartsInteractionYAxisIndex, selectorChartsInteractionYAxisValue, selectorChartYAxis, selectorChartControlledCartesianAxisHighlight, selectorChartsKeyboardYAxisIndex, selectorChartsLastInteraction, selectorBrushShouldPreventAxisHighlight], selectAxisHighlightWithValue);
56
63
 
57
64
  /**
58
65
  * Get the scale of the axis with highlight if controlled. The default axis otherwise.
@@ -1,6 +1,6 @@
1
1
  import { SelectorArray, Combiner, Selector, GetStateFromSelectors, GetParamsFromSelectors, CreateSelectorOptions } from 'reselect';
2
2
  import { ChartAnyPluginSignature, ChartState, ChartStateCacheKey } from "../models/index.js";
3
- export type ChartRootSelector<TSignature extends ChartAnyPluginSignature> = Selector<ChartState<[TSignature]>, TSignature['state'][keyof TSignature['state']]>;
3
+ export type ChartRootSelector<TSignature extends ChartAnyPluginSignature, T extends keyof TSignature['state'] = keyof TSignature['state']> = Selector<ChartState<[TSignature]>, TSignature['state'][T]>;
4
4
  export type ChartOptionalRootSelector<TSignature extends ChartAnyPluginSignature> = Selector<ChartState<[], [TSignature]>, TSignature['state'][keyof TSignature['state']] | undefined>;
5
5
  export type ChartsSelector<Signatures extends readonly ChartAnyPluginSignature[] = [], OptionalSignatures extends readonly ChartAnyPluginSignature[] = [], Result = unknown, Args extends readonly any[] = []> = Selector<ChartState<Signatures, OptionalSignatures>, Result, Args>;
6
6
  type InterruptRecursion = NonNullable<unknown>;
@@ -10,106 +10,104 @@ export const elGRLocaleText = {
10
10
  toolbarExport: 'Εξαγωγή',
11
11
  // Toolbar Export Menu
12
12
  toolbarExportPrint: 'Εκτύπωση',
13
- toolbarExportImage: mimeType => `Εξαγωγή ως ${imageMimeTypes[mimeType] ?? mimeType}`
14
-
13
+ toolbarExportImage: mimeType => `Εξαγωγή ως ${imageMimeTypes[mimeType] ?? mimeType}`,
15
14
  // Charts renderer configuration
16
- // chartTypeBar: 'Bar',
17
- // chartTypeColumn: 'Column',
18
- // chartTypeLine: 'Line',
19
- // chartTypeArea: 'Area',
20
- // chartTypePie: 'Pie',
21
- // chartPaletteLabel: 'Color palette',
22
- // chartPaletteNameRainbowSurge: 'Rainbow Surge',
23
- // chartPaletteNameBlueberryTwilight: 'Blueberry Twilight',
24
- // chartPaletteNameMangoFusion: 'Mango Fusion',
25
- // chartPaletteNameCheerfulFiesta: 'Cheerful Fiesta',
26
- // chartPaletteNameStrawberrySky: 'Strawberry Sky',
27
- // chartPaletteNameBlue: 'Blue',
28
- // chartPaletteNameGreen: 'Green',
29
- // chartPaletteNamePurple: 'Purple',
30
- // chartPaletteNameRed: 'Red',
31
- // chartPaletteNameOrange: 'Orange',
32
- // chartPaletteNameYellow: 'Yellow',
33
- // chartPaletteNameCyan: 'Cyan',
34
- // chartPaletteNamePink: 'Pink',
35
- // chartConfigurationSectionChart: 'Chart',
36
- // chartConfigurationSectionColumns: 'Columns',
37
- // chartConfigurationSectionBars: 'Bars',
38
- // chartConfigurationSectionAxes: 'Axes',
39
- // chartConfigurationGrid: 'Grid',
40
- // chartConfigurationBorderRadius: 'Border radius',
41
- // chartConfigurationCategoryGapRatio: 'Category gap ratio',
42
- // chartConfigurationBarGapRatio: 'Series gap ratio',
43
- // chartConfigurationStacked: 'Stacked',
44
- // chartConfigurationShowToolbar: 'Show toolbar',
45
- // chartConfigurationSkipAnimation: 'Skip animation',
46
- // chartConfigurationInnerRadius: 'Inner radius',
47
- // chartConfigurationOuterRadius: 'Outer radius',
48
- // chartConfigurationColors: 'Colors',
49
- // chartConfigurationHideLegend: 'Hide legend',
50
- // chartConfigurationShowMark: 'Show mark',
51
- // chartConfigurationHeight: 'Height',
52
- // chartConfigurationWidth: 'Width',
53
- // chartConfigurationSeriesGap: 'Series gap',
54
- // chartConfigurationTickPlacement: 'Tick placement',
55
- // chartConfigurationTickLabelPlacement: 'Tick label placement',
56
- // chartConfigurationCategoriesAxisLabel: 'Categories axis label',
57
- // chartConfigurationSeriesAxisLabel: 'Series axis label',
58
- // chartConfigurationXAxisPosition: 'X-axis position',
59
- // chartConfigurationYAxisPosition: 'Y-axis position',
60
- // chartConfigurationSeriesAxisReverse: 'Reverse series axis',
61
- // chartConfigurationTooltipPlacement: 'Placement',
62
- // chartConfigurationTooltipTrigger: 'Trigger',
63
- // chartConfigurationLegendPosition: 'Position',
64
- // chartConfigurationLegendDirection: 'Direction',
65
- // chartConfigurationBarLabels: 'Bar labels',
66
- // chartConfigurationColumnLabels: 'Column labels',
67
- // chartConfigurationInterpolation: 'Interpolation',
68
- // chartConfigurationSectionTooltip: 'Tooltip',
69
- // chartConfigurationSectionLegend: 'Legend',
70
- // chartConfigurationSectionLines: 'Lines',
71
- // chartConfigurationSectionAreas: 'Areas',
72
- // chartConfigurationSectionArcs: 'Arcs',
73
- // chartConfigurationPaddingAngle: 'Padding angle',
74
- // chartConfigurationCornerRadius: 'Corner radius',
75
- // chartConfigurationArcLabels: 'Arc labels',
76
- // chartConfigurationStartAngle: 'Start angle',
77
- // chartConfigurationEndAngle: 'End angle',
78
- // chartConfigurationPieTooltipTrigger: 'Trigger',
79
- // chartConfigurationPieLegendPosition: 'Position',
80
- // chartConfigurationPieLegendDirection: 'Direction',
81
-
15
+ chartTypeBar: 'Μπάρα',
16
+ chartTypeColumn: 'Στήλη',
17
+ chartTypeLine: 'Γραμμή',
18
+ chartTypeArea: 'Περιοχή',
19
+ chartTypePie: 'Πίτα',
20
+ chartPaletteLabel: 'Παλέτα χρωμάτων',
21
+ chartPaletteNameRainbowSurge: 'Έκρηξη Ουράνιου Τόξου',
22
+ chartPaletteNameBlueberryTwilight: 'Λυκόφως Μύρτιλου',
23
+ chartPaletteNameMangoFusion: 'Ένωση Μάνγκο',
24
+ chartPaletteNameCheerfulFiesta: 'Χαρούμενη Γιορτή',
25
+ chartPaletteNameStrawberrySky: 'Φραουλένιος Ουρανός',
26
+ chartPaletteNameBlue: 'Μπλέ',
27
+ chartPaletteNameGreen: 'Πράσινο',
28
+ chartPaletteNamePurple: 'Μώβ',
29
+ chartPaletteNameRed: 'Κόκκινο',
30
+ chartPaletteNameOrange: 'Πορτοκαλί',
31
+ chartPaletteNameYellow: 'Κίτρινο',
32
+ chartPaletteNameCyan: 'Κυανό',
33
+ chartPaletteNamePink: 'Ρόζ',
34
+ chartConfigurationSectionChart: 'Γράφημα',
35
+ chartConfigurationSectionColumns: 'Στήλες',
36
+ chartConfigurationSectionBars: 'Μπάρες',
37
+ chartConfigurationSectionAxes: 'Άξονες',
38
+ chartConfigurationGrid: 'Πλέγμα',
39
+ chartConfigurationBorderRadius: 'Ακτίνα περιγράμματος',
40
+ chartConfigurationCategoryGapRatio: 'Λόγος κενών κατηγορίας',
41
+ chartConfigurationBarGapRatio: 'Λόγος κενών Σειράς',
42
+ chartConfigurationStacked: 'Στοίβαγμα',
43
+ chartConfigurationShowToolbar: 'Εμφάνιση γραμμής εργαλείων',
44
+ chartConfigurationSkipAnimation: 'Παράξειψη Animation',
45
+ chartConfigurationInnerRadius: 'Εσωτερική ακτίνα',
46
+ chartConfigurationOuterRadius: 'Εξωτερική ακτίνα',
47
+ chartConfigurationColors: 'Χρώματα',
48
+ chartConfigurationHideLegend: 'Απόκρυψη Υπομνήματος',
49
+ chartConfigurationShowMark: 'Εμφάνιση Σημείωσης',
50
+ chartConfigurationHeight: 'Ύψος',
51
+ chartConfigurationWidth: 'Πλάτος',
52
+ chartConfigurationSeriesGap: 'Κενό Σειράς',
53
+ chartConfigurationTickPlacement: 'Τοποθέτηση Σημείων',
54
+ chartConfigurationTickLabelPlacement: 'Τοποθέτηση Ετικετών Σημείων',
55
+ chartConfigurationCategoriesAxisLabel: 'Ετικέτα άξονα κατηγοριών',
56
+ chartConfigurationSeriesAxisLabel: 'Ετικέτα άξονα σειρών',
57
+ chartConfigurationXAxisPosition: 'Θέση άξονα Χ',
58
+ chartConfigurationYAxisPosition: 'Θέση άξονα Υ',
59
+ chartConfigurationSeriesAxisReverse: 'Αντιστροφή άξονα σειρών',
60
+ chartConfigurationTooltipPlacement: 'Τοποθέτηση',
61
+ chartConfigurationTooltipTrigger: 'Τρόπος ενεργοποίησης του tooltip',
62
+ chartConfigurationLegendPosition: 'Θέση',
63
+ chartConfigurationLegendDirection: 'Κατεύθυνση',
64
+ chartConfigurationBarLabels: 'Ετικέτες μπαρών',
65
+ chartConfigurationColumnLabels: 'Ετικέτες στηλών',
66
+ chartConfigurationInterpolation: 'Διαμεσολάβηση',
67
+ chartConfigurationSectionTooltip: 'Tooltip',
68
+ chartConfigurationSectionLegend: 'Υπόμνημα',
69
+ chartConfigurationSectionLines: 'Γραμμές',
70
+ chartConfigurationSectionAreas: 'Περιοχές',
71
+ chartConfigurationSectionArcs: 'Τόξα',
72
+ chartConfigurationPaddingAngle: 'Γωνία περιθωρίου',
73
+ chartConfigurationCornerRadius: 'Ακτίνα γωνίας',
74
+ chartConfigurationArcLabels: 'Ετικέτες τόξων',
75
+ chartConfigurationStartAngle: 'Γωνία εκκίνησης',
76
+ chartConfigurationEndAngle: 'Γωνία λήξης',
77
+ chartConfigurationPieTooltipTrigger: 'Τρόπος ενεργοποίησης του tooltip',
78
+ chartConfigurationPieLegendPosition: 'Θέση',
79
+ chartConfigurationPieLegendDirection: 'Κατεύθυνση',
82
80
  // Common option labels
83
- // chartConfigurationOptionNone: 'None',
84
- // chartConfigurationOptionValue: 'Value',
85
- // chartConfigurationOptionAuto: 'Auto',
86
- // chartConfigurationOptionTop: 'Top',
87
- // chartConfigurationOptionTopLeft: 'Top Left',
88
- // chartConfigurationOptionTopRight: 'Top Right',
89
- // chartConfigurationOptionBottom: 'Bottom',
90
- // chartConfigurationOptionBottomLeft: 'Bottom Left',
91
- // chartConfigurationOptionBottomRight: 'Bottom Right',
92
- // chartConfigurationOptionLeft: 'Left',
93
- // chartConfigurationOptionRight: 'Right',
94
- // chartConfigurationOptionAxis: 'Axis',
95
- // chartConfigurationOptionItem: 'Item',
96
- // chartConfigurationOptionHorizontal: 'Horizontal',
97
- // chartConfigurationOptionVertical: 'Vertical',
98
- // chartConfigurationOptionBoth: 'Both',
99
- // chartConfigurationOptionStart: 'Start',
100
- // chartConfigurationOptionMiddle: 'Middle',
101
- // chartConfigurationOptionEnd: 'End',
102
- // chartConfigurationOptionExtremities: 'Extremities',
103
- // chartConfigurationOptionTick: 'Tick',
104
- // chartConfigurationOptionMonotoneX: 'Monotone X',
105
- // chartConfigurationOptionMonotoneY: 'Monotone Y',
106
- // chartConfigurationOptionCatmullRom: 'Catmull-Rom',
107
- // chartConfigurationOptionLinear: 'Linear',
108
- // chartConfigurationOptionNatural: 'Natural',
109
- // chartConfigurationOptionStep: 'Step',
110
- // chartConfigurationOptionStepBefore: 'Step Before',
111
- // chartConfigurationOptionStepAfter: 'Step After',
112
- // chartConfigurationOptionBumpX: 'Bump X',
113
- // chartConfigurationOptionBumpY: 'Bump Y',
81
+ chartConfigurationOptionNone: 'Κανένα',
82
+ chartConfigurationOptionValue: 'Τιμή',
83
+ chartConfigurationOptionAuto: 'Αυτόματο',
84
+ chartConfigurationOptionTop: 'Πάνω',
85
+ chartConfigurationOptionTopLeft: 'Πάνω Αριστερά',
86
+ chartConfigurationOptionTopRight: 'Πάνω Δεξιά',
87
+ chartConfigurationOptionBottom: 'Κάτω',
88
+ chartConfigurationOptionBottomLeft: 'Κάτω Αριστερά',
89
+ chartConfigurationOptionBottomRight: 'Κάτω Δεξιά',
90
+ chartConfigurationOptionLeft: 'Αριστερά',
91
+ chartConfigurationOptionRight: 'Δεξιά',
92
+ chartConfigurationOptionAxis: 'Άξονας',
93
+ chartConfigurationOptionItem: 'Στοιχείο',
94
+ chartConfigurationOptionHorizontal: 'Οριζόντιο',
95
+ chartConfigurationOptionVertical: 'Κάθετο',
96
+ chartConfigurationOptionBoth: 'Και τα δύο',
97
+ chartConfigurationOptionStart: 'Αρχή',
98
+ chartConfigurationOptionMiddle: 'Κέντρο',
99
+ chartConfigurationOptionEnd: 'Τέλος',
100
+ chartConfigurationOptionExtremities: 'Ακρότατα',
101
+ chartConfigurationOptionTick: 'Σημείο',
102
+ chartConfigurationOptionMonotoneX: 'Μονοτονικό Χ',
103
+ chartConfigurationOptionMonotoneY: 'Μονοτονικό Υ',
104
+ chartConfigurationOptionCatmullRom: 'Catmull-Rom',
105
+ chartConfigurationOptionLinear: 'Γραμμικό',
106
+ chartConfigurationOptionNatural: 'Φυσικό',
107
+ chartConfigurationOptionStep: 'Βήμα',
108
+ chartConfigurationOptionStepBefore: 'Βήμα Πριν',
109
+ chartConfigurationOptionStepAfter: 'Βήμα Μετά',
110
+ chartConfigurationOptionBumpX: 'Κυρτότητα Χ',
111
+ chartConfigurationOptionBumpY: 'Κυρτότητα Υ'
114
112
  };
115
113
  export const elGR = getChartsLocalization(elGRLocaleText);
@@ -0,0 +1 @@
1
+ export const CHART_SELECTOR = 'svg:not([aria-hidden="true"])';
package/hooks/index.d.ts CHANGED
@@ -17,4 +17,5 @@ export * from "./useLegend.js";
17
17
  export { useChartGradientId, useChartGradientIdObjectBound } from "./useChartGradientId.js";
18
18
  export * from "./animation/index.js";
19
19
  export * from "./useChartRootRef.js";
20
- export * from "./useChartsLocalization.js";
20
+ export * from "./useChartsLocalization.js";
21
+ export * from "./useBrush.js";
package/hooks/index.js CHANGED
@@ -247,4 +247,16 @@ Object.keys(_useChartsLocalization).forEach(function (key) {
247
247
  return _useChartsLocalization[key];
248
248
  }
249
249
  });
250
+ });
251
+ var _useBrush = require("./useBrush");
252
+ Object.keys(_useBrush).forEach(function (key) {
253
+ if (key === "default" || key === "__esModule") return;
254
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
255
+ if (key in exports && exports[key] === _useBrush[key]) return;
256
+ Object.defineProperty(exports, key, {
257
+ enumerable: true,
258
+ get: function () {
259
+ return _useBrush[key];
260
+ }
261
+ });
250
262
  });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Get the current brush state.
3
+ *
4
+ * - `start` is the starting point of the brush selection.
5
+ * - `current` is the current point of the brush selection.
6
+ *
7
+ * @returns `{ start, current }` - The brush state.
8
+ */
9
+ export declare function useBrush(): {
10
+ start: {
11
+ x: number;
12
+ y: number;
13
+ };
14
+ current: {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ } | null;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useBrush = useBrush;
7
+ var _useChartBrush = require("../internals/plugins/featurePlugins/useChartBrush");
8
+ var _useSelector = require("../internals/store/useSelector");
9
+ var _useStore = require("../internals/store/useStore");
10
+ /**
11
+ * Get the current brush state.
12
+ *
13
+ * - `start` is the starting point of the brush selection.
14
+ * - `current` is the current point of the brush selection.
15
+ *
16
+ * @returns `{ start, current }` - The brush state.
17
+ */
18
+ function useBrush() {
19
+ const store = (0, _useStore.useStore)();
20
+ return (0, _useSelector.useSelector)(store, _useChartBrush.selectorBrushState);
21
+ }
package/index.d.ts CHANGED
@@ -28,4 +28,5 @@ export { ChartContainer } from "./ChartContainer/index.js";
28
28
  export type { ChartContainerProps } from "./ChartContainer/index.js";
29
29
  export * from "./ChartDataProvider/index.js";
30
30
  export * from "./Toolbar/index.js";
31
- export * from "./ChartsWrapper/index.js";
31
+ export * from "./ChartsWrapper/index.js";
32
+ export * from "./ChartsBrushOverlay/index.js";
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-charts v8.14.1
2
+ * @mui/x-charts v8.15.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -367,4 +367,16 @@ Object.keys(_ChartsWrapper).forEach(function (key) {
367
367
  return _ChartsWrapper[key];
368
368
  }
369
369
  });
370
+ });
371
+ var _ChartsBrushOverlay = require("./ChartsBrushOverlay");
372
+ Object.keys(_ChartsBrushOverlay).forEach(function (key) {
373
+ if (key === "default" || key === "__esModule") return;
374
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
375
+ if (key in exports && exports[key] === _ChartsBrushOverlay[key]) return;
376
+ Object.defineProperty(exports, key, {
377
+ enumerable: true,
378
+ get: function () {
379
+ return _ChartsBrushOverlay[key];
380
+ }
381
+ });
370
382
  });
@@ -1,10 +1,11 @@
1
- export declare const MEASUREMENT_SPAN_ID = "mui_measurement_span";
1
+ import * as React from 'react';
2
+ export declare function clearStringMeasurementCache(): void;
2
3
  /**
3
- *
4
+ * Converts a style object into a string to be used as a cache key
4
5
  * @param style React style object
5
6
  * @returns CSS styling string
6
7
  */
7
- export declare const getStyleString: (style: React.CSSProperties) => string;
8
+ export declare function getStyleString(style: React.CSSProperties): string;
8
9
  /**
9
10
  *
10
11
  * @param text The string to estimate
@@ -14,4 +15,8 @@ export declare const getStyleString: (style: React.CSSProperties) => string;
14
15
  export declare const getStringSize: (text: string | number, style?: React.CSSProperties) => {
15
16
  width: number;
16
17
  height: number;
17
- };
18
+ };
19
+ export declare function batchMeasureStrings(texts: Iterable<string | number>, style?: React.CSSProperties): Map<string | number, {
20
+ width: number;
21
+ height: number;
22
+ }>;
@@ -4,65 +4,65 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getStyleString = exports.getStringSize = exports.MEASUREMENT_SPAN_ID = void 0;
7
+ exports.batchMeasureStrings = batchMeasureStrings;
8
+ exports.clearStringMeasurementCache = clearStringMeasurementCache;
9
+ exports.getStringSize = void 0;
10
+ exports.getStyleString = getStyleString;
8
11
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- // DOM utils taken from
12
+ // DOM utils adapted from
10
13
  // https://github.com/recharts/recharts/blob/master/src/util/DOMUtils.ts
11
14
 
12
15
  function isSsr() {
13
16
  return typeof window === 'undefined';
14
17
  }
15
18
  const stringCache = new Map();
19
+ function clearStringMeasurementCache() {
20
+ stringCache.clear();
21
+ }
16
22
  const MAX_CACHE_NUM = 2000;
17
- const SPAN_STYLE = {
18
- position: 'absolute',
19
- top: '-20000px',
20
- left: 0,
21
- padding: 0,
22
- margin: 0,
23
- border: 'none',
24
- whiteSpace: 'pre'
25
- };
26
- const STYLE_LIST = ['minWidth', 'maxWidth', 'width', 'minHeight', 'maxHeight', 'height', 'top', 'left', 'fontSize', 'padding', 'margin', 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom'];
27
- const MEASUREMENT_SPAN_ID = exports.MEASUREMENT_SPAN_ID = 'mui_measurement_span';
23
+ const PIXEL_STYLES = new Set(['minWidth', 'maxWidth', 'width', 'minHeight', 'maxHeight', 'height', 'top', 'left', 'fontSize', 'padding', 'margin', 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom']);
28
24
 
29
25
  /**
30
- *
26
+ * Convert number value to pixel value for certain CSS properties
31
27
  * @param name CSS property name
32
28
  * @param value
33
29
  * @returns add 'px' for distance properties
34
30
  */
35
- function autoCompleteStyle(name, value) {
36
- if (STYLE_LIST.indexOf(name) >= 0 && value === +value) {
31
+ function convertPixelValue(name, value) {
32
+ if (PIXEL_STYLES.has(name) && value === +value) {
37
33
  return `${value}px`;
38
34
  }
39
35
  return value;
40
36
  }
41
37
 
42
38
  /**
43
- *
39
+ * Converts camelcase to dash-case
44
40
  * @param text camelcase css property
45
- * @returns css property
46
41
  */
47
- function camelToMiddleLine(text) {
48
- const strs = text.split('');
49
- const formatStrs = strs.reduce((result, entry) => {
50
- if (entry === entry.toUpperCase()) {
51
- return [...result, '-', entry.toLowerCase()];
52
- }
53
- return [...result, entry];
54
- }, []);
55
- return formatStrs.join('');
42
+ const AZ = /([A-Z])/g;
43
+ function camelCaseToDashCase(text) {
44
+ return String(text).replace(AZ, match => `-${match.toLowerCase()}`);
56
45
  }
57
46
 
58
47
  /**
59
- *
48
+ * Converts a style object into a string to be used as a cache key
60
49
  * @param style React style object
61
50
  * @returns CSS styling string
62
51
  */
63
- const getStyleString = style => Object.keys(style).sort().reduce((result, s) => `${result}${camelToMiddleLine(s)}:${autoCompleteStyle(s, style[s])};`, '');
64
- exports.getStyleString = getStyleString;
65
- let domCleanTimeout;
52
+ function getStyleString(style) {
53
+ let result = '';
54
+ for (const key in style) {
55
+ if (Object.hasOwn(style, key)) {
56
+ const k = key;
57
+ const value = style[k];
58
+ if (value === undefined) {
59
+ continue;
60
+ }
61
+ result += `${camelCaseToDashCase(k)}:${convertPixelValue(k, value)};`;
62
+ }
63
+ }
64
+ return result;
65
+ }
66
66
 
67
67
  /**
68
68
  *
@@ -77,7 +77,7 @@ const getStringSize = (text, style = {}) => {
77
77
  height: 0
78
78
  };
79
79
  }
80
- const str = `${text}`;
80
+ const str = String(text);
81
81
  const styleString = getStyleString(style);
82
82
  const cacheKey = `${str}-${styleString}`;
83
83
  const size = stringCache.get(cacheKey);
@@ -85,22 +85,18 @@ const getStringSize = (text, style = {}) => {
85
85
  return size;
86
86
  }
87
87
  try {
88
- let measurementSpan = document.getElementById(MEASUREMENT_SPAN_ID);
89
- if (measurementSpan === null) {
90
- measurementSpan = document.createElement('span');
91
- measurementSpan.setAttribute('id', MEASUREMENT_SPAN_ID);
92
- measurementSpan.setAttribute('aria-hidden', 'true');
93
- document.body.appendChild(measurementSpan);
94
- }
88
+ const measurementSpanContainer = getMeasurementContainer();
89
+ const measurementElem = document.createElementNS('http://www.w3.org/2000/svg', 'text');
90
+
95
91
  // Need to use CSS Object Model (CSSOM) to be able to comply with Content Security Policy (CSP)
96
92
  // https://en.wikipedia.org/wiki/Content_Security_Policy
97
- const measurementSpanStyle = (0, _extends2.default)({}, SPAN_STYLE, style);
98
- Object.keys(measurementSpanStyle).map(styleKey => {
99
- measurementSpan.style[camelToMiddleLine(styleKey)] = autoCompleteStyle(styleKey, measurementSpanStyle[styleKey]);
93
+ Object.keys(style).map(styleKey => {
94
+ measurementElem.style[camelCaseToDashCase(styleKey)] = convertPixelValue(styleKey, style[styleKey]);
100
95
  return styleKey;
101
96
  });
102
- measurementSpan.textContent = str;
103
- const rect = measurementSpan.getBoundingClientRect();
97
+ measurementElem.textContent = str;
98
+ measurementSpanContainer.replaceChildren(measurementElem);
99
+ const rect = measurementElem.getBoundingClientRect();
104
100
  const result = {
105
101
  width: rect.width,
106
102
  height: rect.height
@@ -111,15 +107,7 @@ const getStringSize = (text, style = {}) => {
111
107
  }
112
108
  if (process.env.NODE_ENV === 'test') {
113
109
  // In test environment, we clean the measurement span immediately
114
- measurementSpan.textContent = '';
115
- } else {
116
- if (domCleanTimeout) {
117
- clearTimeout(domCleanTimeout);
118
- }
119
- domCleanTimeout = setTimeout(() => {
120
- // Limit node cleaning to once per render cycle
121
- measurementSpan.textContent = '';
122
- }, 0);
110
+ measurementSpanContainer.replaceChildren();
123
111
  }
124
112
  return result;
125
113
  } catch {
@@ -129,4 +117,81 @@ const getStringSize = (text, style = {}) => {
129
117
  };
130
118
  }
131
119
  };
132
- exports.getStringSize = getStringSize;
120
+ exports.getStringSize = getStringSize;
121
+ function batchMeasureStrings(texts, style = {}) {
122
+ if (isSsr()) {
123
+ return new Map(Array.from(texts).map(text => [text, {
124
+ width: 0,
125
+ height: 0
126
+ }]));
127
+ }
128
+ const sizeMap = new Map();
129
+ const textToMeasure = [];
130
+ const styleString = getStyleString(style);
131
+ for (const text of texts) {
132
+ const cacheKey = `${text}-${styleString}`;
133
+ const size = stringCache.get(cacheKey);
134
+ if (size) {
135
+ sizeMap.set(text, size);
136
+ } else {
137
+ textToMeasure.push(text);
138
+ }
139
+ }
140
+ const measurementContainer = getMeasurementContainer();
141
+ // Need to use CSS Object Model (CSSOM) to be able to comply with Content Security Policy (CSP)
142
+ // https://en.wikipedia.org/wiki/Content_Security_Policy
143
+ const measurementSpanStyle = (0, _extends2.default)({}, style);
144
+ Object.keys(measurementSpanStyle).map(styleKey => {
145
+ measurementContainer.style[camelCaseToDashCase(styleKey)] = convertPixelValue(styleKey, measurementSpanStyle[styleKey]);
146
+ return styleKey;
147
+ });
148
+ const measurementElems = [];
149
+ for (const string of textToMeasure) {
150
+ const measurementElem = document.createElementNS('http://www.w3.org/2000/svg', 'text');
151
+ measurementElem.textContent = `${string}`;
152
+ measurementElems.push(measurementElem);
153
+ }
154
+ measurementContainer.replaceChildren(...measurementElems);
155
+ for (let i = 0; i < textToMeasure.length; i += 1) {
156
+ const text = textToMeasure[i];
157
+ const measurementSpan = measurementContainer.children[i];
158
+ const rect = measurementSpan.getBoundingClientRect();
159
+ const result = {
160
+ width: rect.width,
161
+ height: rect.height
162
+ };
163
+ const cacheKey = `${text}-${styleString}`;
164
+ stringCache.set(cacheKey, result);
165
+ sizeMap.set(text, result);
166
+ }
167
+ if (stringCache.size + 1 > MAX_CACHE_NUM) {
168
+ stringCache.clear();
169
+ }
170
+ if (process.env.NODE_ENV === 'test') {
171
+ // In test environment, we clean the measurement span immediately
172
+ measurementContainer.replaceChildren();
173
+ }
174
+ return sizeMap;
175
+ }
176
+ let measurementContainer = null;
177
+
178
+ /**
179
+ * Get (or create) a hidden span element to measure text size.
180
+ */
181
+ function getMeasurementContainer() {
182
+ if (measurementContainer === null) {
183
+ measurementContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
184
+ measurementContainer.setAttribute('aria-hidden', 'true');
185
+ measurementContainer.style.position = 'absolute';
186
+ measurementContainer.style.top = '-20000px';
187
+ measurementContainer.style.left = '0';
188
+ measurementContainer.style.padding = '0';
189
+ measurementContainer.style.margin = '0';
190
+ measurementContainer.style.border = 'none';
191
+ measurementContainer.style.pointerEvents = 'none';
192
+ measurementContainer.style.visibility = 'hidden';
193
+ measurementContainer.style.contain = 'strict';
194
+ document.body.appendChild(measurementContainer);
195
+ }
196
+ return measurementContainer;
197
+ }
@@ -27,6 +27,7 @@ export * from "./plugins/featurePlugins/useChartInteraction/index.js";
27
27
  export * from "./plugins/featurePlugins/useChartHighlight/index.js";
28
28
  export * from "./plugins/featurePlugins/useChartKeyboardNavigation/index.js";
29
29
  export * from "./plugins/featurePlugins/useChartClosestPoint/index.js";
30
+ export * from "./plugins/featurePlugins/useChartBrush/index.js";
30
31
  export * from "./plugins/utils/selectors.js";
31
32
  export { getAxisTriggerTooltip as getCartesianAxisTriggerTooltip } from "./plugins/featurePlugins/useChartCartesianAxis/getAxisTriggerTooltip.js";
32
33
  export { getAxisIndex as getCartesianAxisIndex } from "./plugins/featurePlugins/useChartCartesianAxis/getAxisValue.js";