@mui/x-charts 6.0.0-alpha.8 → 6.18.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 (286) hide show
  1. package/BarChart/BarChart.d.ts +19 -5
  2. package/BarChart/BarChart.js +52 -13
  3. package/BarChart/BarElement.d.ts +1319 -4
  4. package/BarChart/BarElement.js +10 -10
  5. package/BarChart/BarPlot.d.ts +17 -1
  6. package/BarChart/BarPlot.js +152 -66
  7. package/BarChart/formatter.js +2 -3
  8. package/BarChart/legend.js +1 -2
  9. package/CHANGELOG.md +786 -48
  10. package/ChartContainer/index.js +7 -5
  11. package/ChartsAxis/ChartsAxis.d.ts +9 -0
  12. package/ChartsAxis/ChartsAxis.js +28 -2
  13. package/ChartsAxis/axisClasses.d.ts +1 -1
  14. package/ChartsAxis/axisClasses.js +1 -2
  15. package/ChartsAxisHighlight/ChartsAxisHighlight.d.ts +21 -0
  16. package/ChartsAxisHighlight/ChartsAxisHighlight.js +61 -22
  17. package/ChartsClipPath/ChartsClipPath.d.ts +5 -0
  18. package/ChartsClipPath/ChartsClipPath.js +7 -2
  19. package/ChartsLegend/ChartsLegend.d.ts +44 -24
  20. package/ChartsLegend/ChartsLegend.js +192 -150
  21. package/ChartsLegend/chartsLegendClasses.js +1 -2
  22. package/ChartsLegend/utils.d.ts +1 -6
  23. package/ChartsSurface.d.ts +1 -1
  24. package/ChartsSurface.js +9 -18
  25. package/ChartsTooltip/ChartsAxisTooltipContent.d.ts +1 -0
  26. package/ChartsTooltip/ChartsAxisTooltipContent.js +46 -32
  27. package/ChartsTooltip/ChartsItemTooltipContent.d.ts +3 -2
  28. package/ChartsTooltip/ChartsItemTooltipContent.js +18 -9
  29. package/ChartsTooltip/ChartsTooltip.d.ts +32 -0
  30. package/ChartsTooltip/ChartsTooltip.js +62 -18
  31. package/ChartsTooltip/ChartsTooltipTable.d.ts +3 -10
  32. package/ChartsTooltip/ChartsTooltipTable.js +22 -20
  33. package/ChartsTooltip/tooltipClasses.js +1 -2
  34. package/ChartsTooltip/utils.js +2 -2
  35. package/ChartsXAxis/ChartsXAxis.d.ts +9 -0
  36. package/ChartsXAxis/ChartsXAxis.js +161 -40
  37. package/ChartsYAxis/ChartsYAxis.d.ts +9 -0
  38. package/ChartsYAxis/ChartsYAxis.js +86 -33
  39. package/LineChart/AreaElement.d.ts +12 -2
  40. package/LineChart/AreaElement.js +14 -6
  41. package/LineChart/AreaPlot.d.ts +11 -0
  42. package/LineChart/AreaPlot.js +27 -8
  43. package/LineChart/LineChart.d.ts +21 -3
  44. package/LineChart/LineChart.js +61 -14
  45. package/LineChart/LineElement.d.ts +12 -2
  46. package/LineChart/LineElement.js +14 -6
  47. package/LineChart/LineHighlightElement.d.ts +31 -0
  48. package/LineChart/LineHighlightElement.js +88 -0
  49. package/LineChart/LineHighlightPlot.d.ts +35 -0
  50. package/LineChart/LineHighlightPlot.js +110 -0
  51. package/LineChart/LinePlot.d.ts +10 -0
  52. package/LineChart/LinePlot.js +25 -12
  53. package/LineChart/MarkElement.d.ts +11 -1
  54. package/LineChart/MarkElement.js +15 -9
  55. package/LineChart/MarkPlot.d.ts +10 -0
  56. package/LineChart/MarkPlot.js +62 -15
  57. package/LineChart/formatter.js +5 -5
  58. package/LineChart/index.d.ts +2 -0
  59. package/LineChart/index.js +20 -0
  60. package/LineChart/legend.js +1 -2
  61. package/PieChart/PieArc.d.ts +12 -14
  62. package/PieChart/PieArc.js +28 -60
  63. package/PieChart/PieArcLabel.d.ts +9 -10
  64. package/PieChart/PieArcLabel.js +46 -38
  65. package/PieChart/PieArcLabelPlot.d.ts +28 -0
  66. package/PieChart/PieArcLabelPlot.js +99 -0
  67. package/PieChart/PieArcPlot.d.ts +35 -0
  68. package/PieChart/PieArcPlot.js +92 -0
  69. package/PieChart/PieChart.d.ts +19 -5
  70. package/PieChart/PieChart.js +61 -14
  71. package/PieChart/PiePlot.d.ts +15 -9
  72. package/PieChart/PiePlot.js +77 -55
  73. package/PieChart/dataTransform/transition.d.ts +4 -0
  74. package/PieChart/dataTransform/transition.js +136 -0
  75. package/PieChart/dataTransform/useTransformData.d.ts +15 -0
  76. package/PieChart/dataTransform/useTransformData.js +67 -0
  77. package/PieChart/formatter.js +1 -2
  78. package/PieChart/legend.js +1 -2
  79. package/README.md +8 -14
  80. package/ResponsiveChartContainer/index.js +7 -8
  81. package/ScatterChart/Scatter.d.ts +10 -0
  82. package/ScatterChart/Scatter.js +12 -2
  83. package/ScatterChart/ScatterChart.d.ts +16 -3
  84. package/ScatterChart/ScatterChart.js +43 -12
  85. package/ScatterChart/ScatterPlot.d.ts +10 -0
  86. package/ScatterChart/ScatterPlot.js +12 -2
  87. package/ScatterChart/formatter.js +1 -2
  88. package/ScatterChart/legend.js +1 -2
  89. package/SparkLineChart/SparkLineChart.d.ts +13 -3
  90. package/SparkLineChart/SparkLineChart.js +34 -18
  91. package/colorPalettes/colorPalettes.js +6 -12
  92. package/constants.js +5 -8
  93. package/context/CartesianContextProvider.d.ts +5 -0
  94. package/context/CartesianContextProvider.js +31 -16
  95. package/context/DrawingProvider.d.ts +7 -0
  96. package/context/DrawingProvider.js +12 -6
  97. package/context/HighlightProvider.js +3 -4
  98. package/context/InteractionProvider.js +3 -4
  99. package/context/SeriesContextProvider.js +3 -4
  100. package/esm/BarChart/BarChart.js +49 -9
  101. package/esm/BarChart/BarElement.js +7 -4
  102. package/esm/BarChart/BarPlot.js +152 -67
  103. package/esm/BarChart/formatter.js +1 -1
  104. package/esm/ChartContainer/index.js +3 -0
  105. package/esm/ChartsAxis/ChartsAxis.js +26 -0
  106. package/esm/ChartsAxisHighlight/ChartsAxisHighlight.js +57 -20
  107. package/esm/ChartsClipPath/ChartsClipPath.js +5 -0
  108. package/esm/ChartsLegend/ChartsLegend.js +188 -142
  109. package/esm/ChartsSurface.js +4 -12
  110. package/esm/ChartsTooltip/ChartsAxisTooltipContent.js +44 -30
  111. package/esm/ChartsTooltip/ChartsItemTooltipContent.js +15 -7
  112. package/esm/ChartsTooltip/ChartsTooltip.js +59 -14
  113. package/esm/ChartsTooltip/ChartsTooltipTable.js +17 -10
  114. package/esm/ChartsXAxis/ChartsXAxis.js +158 -37
  115. package/esm/ChartsYAxis/ChartsYAxis.js +83 -30
  116. package/esm/LineChart/AreaElement.js +10 -0
  117. package/esm/LineChart/AreaPlot.js +26 -6
  118. package/esm/LineChart/LineChart.js +58 -10
  119. package/esm/LineChart/LineElement.js +10 -0
  120. package/esm/LineChart/LineHighlightElement.js +78 -0
  121. package/esm/LineChart/LineHighlightPlot.js +103 -0
  122. package/esm/LineChart/LinePlot.js +25 -14
  123. package/esm/LineChart/MarkElement.js +12 -5
  124. package/esm/LineChart/MarkPlot.js +60 -13
  125. package/esm/LineChart/formatter.js +7 -3
  126. package/esm/LineChart/index.js +3 -1
  127. package/esm/PieChart/PieArc.js +26 -58
  128. package/esm/PieChart/PieArcLabel.js +43 -34
  129. package/esm/PieChart/PieArcLabelPlot.js +92 -0
  130. package/esm/PieChart/PieArcPlot.js +84 -0
  131. package/esm/PieChart/PieChart.js +59 -12
  132. package/esm/PieChart/PiePlot.js +76 -57
  133. package/esm/PieChart/dataTransform/transition.js +130 -0
  134. package/esm/PieChart/dataTransform/useTransformData.js +59 -0
  135. package/esm/ResponsiveChartContainer/index.js +3 -3
  136. package/esm/ScatterChart/Scatter.js +10 -0
  137. package/esm/ScatterChart/ScatterChart.js +40 -8
  138. package/esm/ScatterChart/ScatterPlot.js +10 -0
  139. package/esm/SparkLineChart/SparkLineChart.js +32 -15
  140. package/esm/constants.js +1 -1
  141. package/esm/context/CartesianContextProvider.js +30 -14
  142. package/esm/context/DrawingProvider.js +8 -0
  143. package/esm/hooks/useChartDimensions.js +2 -0
  144. package/esm/hooks/useMounted.js +16 -0
  145. package/esm/hooks/useReducedMotion.js +27 -0
  146. package/esm/hooks/useTicks.js +15 -9
  147. package/esm/internals/components/AxisSharedComponents.js +15 -70
  148. package/esm/internals/components/ChartsText.js +77 -0
  149. package/esm/internals/domUtils.js +113 -0
  150. package/esm/internals/geometry.js +36 -0
  151. package/hooks/useAxisEvents.js +2 -2
  152. package/hooks/useChartDimensions.d.ts +2 -0
  153. package/hooks/useChartDimensions.js +5 -4
  154. package/hooks/useDrawingArea.js +2 -2
  155. package/hooks/useInteractionItemProps.js +2 -2
  156. package/hooks/useMounted.d.ts +1 -0
  157. package/hooks/useMounted.js +25 -0
  158. package/hooks/useReducedMotion.d.ts +8 -0
  159. package/hooks/useReducedMotion.js +33 -0
  160. package/hooks/useScale.d.ts +2 -2
  161. package/hooks/useScale.js +2 -2
  162. package/hooks/useTicks.d.ts +19 -11
  163. package/hooks/useTicks.js +19 -14
  164. package/index.js +1 -1
  165. package/internals/components/AxisSharedComponents.d.ts +0 -4
  166. package/internals/components/AxisSharedComponents.js +18 -78
  167. package/internals/components/ChartsText.d.ts +35 -0
  168. package/internals/components/ChartsText.js +87 -0
  169. package/internals/defaultizeColor.d.ts +8 -1
  170. package/internals/defaultizeValueFormatter.js +1 -2
  171. package/internals/domUtils.d.ts +13 -0
  172. package/internals/domUtils.js +122 -0
  173. package/internals/geometry.d.ts +9 -0
  174. package/internals/geometry.js +42 -0
  175. package/internals/stackSeries.js +2 -4
  176. package/legacy/BarChart/BarChart.js +49 -9
  177. package/legacy/BarChart/BarElement.js +6 -3
  178. package/legacy/BarChart/BarPlot.js +151 -63
  179. package/legacy/BarChart/formatter.js +1 -1
  180. package/legacy/ChartContainer/index.js +3 -0
  181. package/legacy/ChartsAxis/ChartsAxis.js +26 -0
  182. package/legacy/ChartsAxisHighlight/ChartsAxisHighlight.js +60 -20
  183. package/legacy/ChartsClipPath/ChartsClipPath.js +5 -0
  184. package/legacy/ChartsLegend/ChartsLegend.js +203 -140
  185. package/legacy/ChartsSurface.js +3 -12
  186. package/legacy/ChartsTooltip/ChartsAxisTooltipContent.js +22 -10
  187. package/legacy/ChartsTooltip/ChartsItemTooltipContent.js +15 -7
  188. package/legacy/ChartsTooltip/ChartsTooltip.js +62 -14
  189. package/legacy/ChartsTooltip/ChartsTooltipTable.js +34 -26
  190. package/legacy/ChartsXAxis/ChartsXAxis.js +162 -39
  191. package/legacy/ChartsYAxis/ChartsYAxis.js +83 -30
  192. package/legacy/LineChart/AreaElement.js +10 -0
  193. package/legacy/LineChart/AreaPlot.js +31 -7
  194. package/legacy/LineChart/LineChart.js +58 -10
  195. package/legacy/LineChart/LineElement.js +10 -0
  196. package/legacy/LineChart/LineHighlightElement.js +77 -0
  197. package/legacy/LineChart/LineHighlightPlot.js +96 -0
  198. package/legacy/LineChart/LinePlot.js +29 -12
  199. package/legacy/LineChart/MarkElement.js +12 -5
  200. package/legacy/LineChart/MarkPlot.js +50 -5
  201. package/legacy/LineChart/formatter.js +7 -3
  202. package/legacy/LineChart/index.js +3 -1
  203. package/legacy/PieChart/PieArc.js +30 -62
  204. package/legacy/PieChart/PieArcLabel.js +48 -34
  205. package/legacy/PieChart/PieArcLabelPlot.js +93 -0
  206. package/legacy/PieChart/PieArcPlot.js +84 -0
  207. package/legacy/PieChart/PieChart.js +59 -12
  208. package/legacy/PieChart/PiePlot.js +76 -59
  209. package/legacy/PieChart/dataTransform/transition.js +142 -0
  210. package/legacy/PieChart/dataTransform/useTransformData.js +60 -0
  211. package/legacy/ResponsiveChartContainer/index.js +3 -3
  212. package/legacy/ScatterChart/Scatter.js +10 -0
  213. package/legacy/ScatterChart/ScatterChart.js +40 -8
  214. package/legacy/ScatterChart/ScatterPlot.js +10 -0
  215. package/legacy/SparkLineChart/SparkLineChart.js +32 -13
  216. package/legacy/constants.js +1 -1
  217. package/legacy/context/CartesianContextProvider.js +30 -14
  218. package/legacy/context/DrawingProvider.js +8 -0
  219. package/legacy/hooks/useChartDimensions.js +2 -0
  220. package/legacy/hooks/useMounted.js +21 -0
  221. package/legacy/hooks/useReducedMotion.js +27 -0
  222. package/legacy/hooks/useTicks.js +16 -9
  223. package/legacy/index.js +1 -1
  224. package/legacy/internals/components/AxisSharedComponents.js +11 -65
  225. package/legacy/internals/components/ChartsText.js +79 -0
  226. package/legacy/internals/domUtils.js +121 -0
  227. package/legacy/internals/geometry.js +37 -0
  228. package/models/axis.d.ts +27 -9
  229. package/models/layout.d.ts +7 -6
  230. package/models/seriesType/line.d.ts +39 -1
  231. package/models/seriesType/pie.d.ts +5 -1
  232. package/modern/BarChart/BarChart.js +49 -9
  233. package/modern/BarChart/BarElement.js +7 -4
  234. package/modern/BarChart/BarPlot.js +149 -65
  235. package/modern/BarChart/formatter.js +1 -1
  236. package/modern/ChartContainer/index.js +3 -0
  237. package/modern/ChartsAxis/ChartsAxis.js +26 -0
  238. package/modern/ChartsAxisHighlight/ChartsAxisHighlight.js +57 -20
  239. package/modern/ChartsClipPath/ChartsClipPath.js +5 -0
  240. package/modern/ChartsLegend/ChartsLegend.js +188 -142
  241. package/modern/ChartsSurface.js +4 -12
  242. package/modern/ChartsTooltip/ChartsAxisTooltipContent.js +44 -30
  243. package/modern/ChartsTooltip/ChartsItemTooltipContent.js +15 -7
  244. package/modern/ChartsTooltip/ChartsTooltip.js +58 -14
  245. package/modern/ChartsTooltip/ChartsTooltipTable.js +17 -10
  246. package/modern/ChartsXAxis/ChartsXAxis.js +158 -37
  247. package/modern/ChartsYAxis/ChartsYAxis.js +83 -30
  248. package/modern/LineChart/AreaElement.js +10 -0
  249. package/modern/LineChart/AreaPlot.js +25 -6
  250. package/modern/LineChart/LineChart.js +58 -10
  251. package/modern/LineChart/LineElement.js +10 -0
  252. package/modern/LineChart/LineHighlightElement.js +78 -0
  253. package/modern/LineChart/LineHighlightPlot.js +102 -0
  254. package/modern/LineChart/LinePlot.js +23 -10
  255. package/modern/LineChart/MarkElement.js +12 -5
  256. package/modern/LineChart/MarkPlot.js +60 -13
  257. package/modern/LineChart/formatter.js +4 -3
  258. package/modern/LineChart/index.js +3 -1
  259. package/modern/PieChart/PieArc.js +26 -57
  260. package/modern/PieChart/PieArcLabel.js +43 -34
  261. package/modern/PieChart/PieArcLabelPlot.js +90 -0
  262. package/modern/PieChart/PieArcPlot.js +83 -0
  263. package/modern/PieChart/PieChart.js +59 -12
  264. package/modern/PieChart/PiePlot.js +76 -55
  265. package/modern/PieChart/dataTransform/transition.js +130 -0
  266. package/modern/PieChart/dataTransform/useTransformData.js +58 -0
  267. package/modern/ResponsiveChartContainer/index.js +3 -3
  268. package/modern/ScatterChart/Scatter.js +10 -0
  269. package/modern/ScatterChart/ScatterChart.js +40 -8
  270. package/modern/ScatterChart/ScatterPlot.js +10 -0
  271. package/modern/SparkLineChart/SparkLineChart.js +32 -15
  272. package/modern/constants.js +1 -1
  273. package/modern/context/CartesianContextProvider.js +29 -13
  274. package/modern/context/DrawingProvider.js +8 -0
  275. package/modern/hooks/useChartDimensions.js +2 -0
  276. package/modern/hooks/useMounted.js +16 -0
  277. package/modern/hooks/useReducedMotion.js +27 -0
  278. package/modern/hooks/useTicks.js +15 -9
  279. package/modern/index.js +1 -1
  280. package/modern/internals/components/AxisSharedComponents.js +15 -70
  281. package/modern/internals/components/ChartsText.js +77 -0
  282. package/modern/internals/domUtils.js +113 -0
  283. package/modern/internals/geometry.js +36 -0
  284. package/package.json +9 -6
  285. package/themeAugmentation/components.d.ts +1 -0
  286. package/themeAugmentation/overrides.d.ts +2 -0
@@ -10,9 +10,10 @@ import { getScale } from '../internals/getScale';
10
10
  import { DrawingContext } from './DrawingProvider';
11
11
  import { SeriesContext } from './SeriesContextProvider';
12
12
  import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants';
13
- import { getTicksNumber } from '../hooks/useTicks';
13
+ import { getTickNumber } from '../hooks/useTicks';
14
14
  import { jsx as _jsx } from "react/jsx-runtime";
15
- const DEFAULT_CATEGORY_GAP_RATIO = 0.1;
15
+ const DEFAULT_CATEGORY_GAP_RATIO = 0.2;
16
+ const DEFAULT_BAR_GAP_RATIO = 0.1;
16
17
 
17
18
  // TODO: those might be better placed in a distinct file
18
19
  const xExtremumGetters = {
@@ -31,6 +32,12 @@ export const CartesianContext = /*#__PURE__*/React.createContext({
31
32
  xAxisIds: [],
32
33
  yAxisIds: []
33
34
  });
35
+
36
+ /**
37
+ * API:
38
+ *
39
+ * - [CartesianContextProvider API](https://mui.com/x/api/charts/cartesian-context-provider/)
40
+ */
34
41
  function CartesianContextProvider({
35
42
  xAxis: inXAxis,
36
43
  yAxis: inYAxis,
@@ -102,18 +109,19 @@ function CartesianContextProvider({
102
109
  const range = [drawingArea.left, drawingArea.left + drawingArea.width];
103
110
  if (isBandScaleConfig(axis)) {
104
111
  const categoryGapRatio = axis.categoryGapRatio ?? DEFAULT_CATEGORY_GAP_RATIO;
112
+ const barGapRatio = axis.barGapRatio ?? DEFAULT_BAR_GAP_RATIO;
105
113
  completedXAxis[axis.id] = _extends({
106
114
  categoryGapRatio,
107
- barGapRatio: 0
115
+ barGapRatio
108
116
  }, axis, {
109
117
  scale: scaleBand(axis.data, range).paddingInner(categoryGapRatio).paddingOuter(categoryGapRatio / 2),
110
- ticksNumber: axis.data.length
118
+ tickNumber: axis.data.length
111
119
  });
112
120
  }
113
121
  if (isPointScaleConfig(axis)) {
114
122
  completedXAxis[axis.id] = _extends({}, axis, {
115
123
  scale: scalePoint(axis.data, range),
116
- ticksNumber: axis.data.length
124
+ tickNumber: axis.data.length
117
125
  });
118
126
  }
119
127
  if (axis.scaleType === 'band' || axis.scaleType === 'point') {
@@ -122,17 +130,17 @@ function CartesianContextProvider({
122
130
  }
123
131
  const scaleType = axis.scaleType ?? 'linear';
124
132
  const extremums = [axis.min ?? minData, axis.max ?? maxData];
125
- const ticksNumber = getTicksNumber(_extends({}, axis, {
133
+ const tickNumber = getTickNumber(_extends({}, axis, {
126
134
  range,
127
135
  domain: extremums
128
136
  }));
129
- const niceScale = getScale(scaleType, extremums, range).nice(ticksNumber);
137
+ const niceScale = getScale(scaleType, extremums, range).nice(tickNumber);
130
138
  const niceDomain = niceScale.domain();
131
139
  const domain = [axis.min ?? niceDomain[0], axis.max ?? niceDomain[1]];
132
140
  completedXAxis[axis.id] = _extends({}, axis, {
133
141
  scaleType,
134
142
  scale: niceScale.domain(domain),
135
- ticksNumber
143
+ tickNumber
136
144
  });
137
145
  });
138
146
  const allYAxis = [...(yAxis?.map((axis, index) => _extends({
@@ -155,13 +163,13 @@ function CartesianContextProvider({
155
163
  barGapRatio: 0
156
164
  }, axis, {
157
165
  scale: scaleBand(axis.data, [range[1], range[0]]).paddingInner(categoryGapRatio).paddingOuter(categoryGapRatio / 2),
158
- ticksNumber: axis.data.length
166
+ tickNumber: axis.data.length
159
167
  });
160
168
  }
161
169
  if (isPointScaleConfig(axis)) {
162
170
  completedYAxis[axis.id] = _extends({}, axis, {
163
171
  scale: scalePoint(axis.data, [range[1], range[0]]),
164
- ticksNumber: axis.data.length
172
+ tickNumber: axis.data.length
165
173
  });
166
174
  }
167
175
  if (axis.scaleType === 'band' || axis.scaleType === 'point') {
@@ -170,17 +178,17 @@ function CartesianContextProvider({
170
178
  }
171
179
  const scaleType = axis.scaleType ?? 'linear';
172
180
  const extremums = [axis.min ?? minData, axis.max ?? maxData];
173
- const ticksNumber = getTicksNumber(_extends({}, axis, {
181
+ const tickNumber = getTickNumber(_extends({}, axis, {
174
182
  range,
175
183
  domain: extremums
176
184
  }));
177
- const niceScale = getScale(scaleType, extremums, range).nice(ticksNumber);
185
+ const niceScale = getScale(scaleType, extremums, range).nice(tickNumber);
178
186
  const niceDomain = niceScale.domain();
179
187
  const domain = [axis.min ?? niceDomain[0], axis.max ?? niceDomain[1]];
180
188
  completedYAxis[axis.id] = _extends({}, axis, {
181
189
  scaleType,
182
190
  scale: niceScale.domain(domain),
183
- ticksNumber
191
+ tickNumber
184
192
  });
185
193
  });
186
194
  return {
@@ -220,6 +228,7 @@ process.env.NODE_ENV !== "production" ? CartesianContextProvider.propTypes = {
220
228
  id: PropTypes.string,
221
229
  label: PropTypes.string,
222
230
  labelFontSize: PropTypes.number,
231
+ labelStyle: PropTypes.object,
223
232
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
224
233
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
225
234
  position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']),
@@ -228,6 +237,9 @@ process.env.NODE_ENV !== "production" ? CartesianContextProvider.propTypes = {
228
237
  slots: PropTypes.object,
229
238
  stroke: PropTypes.string,
230
239
  tickFontSize: PropTypes.number,
240
+ tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]),
241
+ tickLabelInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.func]),
242
+ tickLabelStyle: PropTypes.object,
231
243
  tickMaxStep: PropTypes.number,
232
244
  tickMinStep: PropTypes.number,
233
245
  tickNumber: PropTypes.number,
@@ -246,6 +258,7 @@ process.env.NODE_ENV !== "production" ? CartesianContextProvider.propTypes = {
246
258
  id: PropTypes.string,
247
259
  label: PropTypes.string,
248
260
  labelFontSize: PropTypes.number,
261
+ labelStyle: PropTypes.object,
249
262
  max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
250
263
  min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
251
264
  position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']),
@@ -254,6 +267,9 @@ process.env.NODE_ENV !== "production" ? CartesianContextProvider.propTypes = {
254
267
  slots: PropTypes.object,
255
268
  stroke: PropTypes.string,
256
269
  tickFontSize: PropTypes.number,
270
+ tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]),
271
+ tickLabelInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.func]),
272
+ tickLabelStyle: PropTypes.object,
257
273
  tickMaxStep: PropTypes.number,
258
274
  tickMinStep: PropTypes.number,
259
275
  tickNumber: PropTypes.number,
@@ -9,12 +9,20 @@ import { jsx as _jsx } from "react/jsx-runtime";
9
9
  export const DrawingContext = /*#__PURE__*/React.createContext({
10
10
  top: 0,
11
11
  left: 0,
12
+ bottom: 0,
13
+ right: 0,
12
14
  height: 300,
13
15
  width: 400
14
16
  });
15
17
  export const SVGContext = /*#__PURE__*/React.createContext({
16
18
  current: null
17
19
  });
20
+
21
+ /**
22
+ * API:
23
+ *
24
+ * - [DrawingProvider API](https://mui.com/x/api/charts/drawing-provider/)
25
+ */
18
26
  function DrawingProvider({
19
27
  width,
20
28
  height,
@@ -6,6 +6,8 @@ const useChartDimensions = (width, height, margin) => {
6
6
  const drawingArea = React.useMemo(() => ({
7
7
  left: defaultizedMargin.left,
8
8
  top: defaultizedMargin.top,
9
+ right: defaultizedMargin.right,
10
+ bottom: defaultizedMargin.bottom,
9
11
  width: Math.max(0, width - defaultizedMargin.left - defaultizedMargin.right),
10
12
  height: Math.max(0, height - defaultizedMargin.top - defaultizedMargin.bottom)
11
13
  }), [width, height, defaultizedMargin.top, defaultizedMargin.bottom, defaultizedMargin.left, defaultizedMargin.right]);
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
3
+ export function useMounted(defer = false) {
4
+ const [mountedState, setMountedState] = React.useState(false);
5
+ useEnhancedEffect(() => {
6
+ if (!defer) {
7
+ setMountedState(true);
8
+ }
9
+ }, [defer]);
10
+ React.useEffect(() => {
11
+ if (defer) {
12
+ setMountedState(true);
13
+ }
14
+ }, [defer]);
15
+ return mountedState;
16
+ }
@@ -0,0 +1,27 @@
1
+ import { useIsomorphicLayoutEffect, Globals } from '@react-spring/web';
2
+
3
+ /**
4
+ * Returns `boolean` or `null`, used to automatically
5
+ * set skipAnimations to the value of the user's
6
+ * `prefers-reduced-motion` query.
7
+ *
8
+ * The return value, post-effect, is the value of their prefered setting
9
+ */
10
+ export const useReducedMotion = () => {
11
+ // Taken from: https://github.com/pmndrs/react-spring/blob/02ec877bbfab0df46da0e4a47d5f68d3e731206a/packages/shared/src/hooks/useReducedMotion.ts#L13
12
+
13
+ useIsomorphicLayoutEffect(() => {
14
+ const mql = window.matchMedia('(prefers-reduced-motion)');
15
+ const handleMediaChange = e => {
16
+ Globals.assign({
17
+ // Modification such the react-spring implementation such that this hook can remove animation but never activate animation.
18
+ skipAnimation: e.matches || undefined
19
+ });
20
+ };
21
+ handleMediaChange(mql);
22
+ mql.addEventListener('change', handleMediaChange);
23
+ return () => {
24
+ mql.removeEventListener('change', handleMediaChange);
25
+ };
26
+ }, []);
27
+ };
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { isBandScale } from '../internals/isBandScale';
3
- export function getTicksNumber(params) {
3
+ export function getTickNumber(params) {
4
4
  const {
5
5
  tickMaxStep,
6
6
  tickMinStep,
@@ -16,8 +16,9 @@ export function getTicksNumber(params) {
16
16
  function useTicks(options) {
17
17
  const {
18
18
  scale,
19
- ticksNumber,
20
- valueFormatter
19
+ tickNumber,
20
+ valueFormatter,
21
+ tickInterval
21
22
  } = options;
22
23
  return React.useMemo(() => {
23
24
  // band scale
@@ -26,7 +27,8 @@ function useTicks(options) {
26
27
  if (scale.bandwidth() > 0) {
27
28
  // scale type = 'band'
28
29
  return [...domain.map(value => ({
29
- formattedValue: valueFormatter?.(value) ?? value,
30
+ value,
31
+ formattedValue: valueFormatter?.(value) ?? `${value}`,
30
32
  offset: scale(value) - (scale.step() - scale.bandwidth()) / 2,
31
33
  labelOffset: scale.step() / 2
32
34
  })), {
@@ -37,17 +39,21 @@ function useTicks(options) {
37
39
  }
38
40
 
39
41
  // scale type = 'point'
40
- return domain.map(value => ({
41
- formattedValue: valueFormatter?.(value) ?? value,
42
+ const filteredDomain = typeof tickInterval === 'function' && domain.filter(tickInterval) || typeof tickInterval === 'object' && tickInterval || domain;
43
+ return filteredDomain.map(value => ({
44
+ value,
45
+ formattedValue: valueFormatter?.(value) ?? `${value}`,
42
46
  offset: scale(value),
43
47
  labelOffset: 0
44
48
  }));
45
49
  }
46
- return scale.ticks(ticksNumber).map(value => ({
47
- formattedValue: valueFormatter?.(value) ?? scale.tickFormat(ticksNumber)(value),
50
+ const ticks = typeof tickInterval === 'object' ? tickInterval : scale.ticks(tickNumber);
51
+ return ticks.map(value => ({
52
+ value,
53
+ formattedValue: valueFormatter?.(value) ?? scale.tickFormat(tickNumber)(value),
48
54
  offset: scale(value),
49
55
  labelOffset: 0
50
56
  }));
51
- }, [ticksNumber, scale, valueFormatter]);
57
+ }, [tickNumber, scale, valueFormatter, tickInterval]);
52
58
  }
53
59
  export default useTicks;
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-charts v6.0.0-alpha.8
2
+ * @mui/x-charts v6.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -5,77 +5,22 @@ export const AxisRoot = styled('g', {
5
5
  name: 'MuiChartsAxis',
6
6
  slot: 'Root',
7
7
  overridesResolver: (props, styles) => styles.root
8
- })({
9
- [`&.${axisClasses.directionY}`]: {
10
- [`.${axisClasses.tickLabel}`]: {
11
- dominantBaseline: 'middle'
12
- },
13
- [`.${axisClasses.label}`]: {
14
- dominantBaseline: 'auto',
15
- textAnchor: 'middle'
16
- }
17
- },
18
- [`&.${axisClasses.left}`]: {
19
- [`.${axisClasses.tickLabel}`]: {
20
- dominantBaseline: 'central',
21
- textAnchor: 'end'
22
- }
23
- },
24
- [`&.${axisClasses.right}`]: {
25
- [`.${axisClasses.tickLabel}`]: {
26
- dominantBaseline: 'central',
27
- textAnchor: 'start'
28
- }
29
- },
30
- [`&.${axisClasses.bottom}`]: {
31
- [`.${axisClasses.tickLabel}, .${axisClasses.label}`]: {
32
- dominantBaseline: 'hanging',
33
- textAnchor: 'middle'
34
- }
35
- },
36
- [`&.${axisClasses.top}`]: {
37
- [`.${axisClasses.tickLabel}, .${axisClasses.label}`]: {
38
- dominantBaseline: 'baseline',
39
- textAnchor: 'middle'
40
- }
41
- }
42
- });
43
- export const ChartsLine = styled('line', {
44
- name: 'MuiChartsAxis',
45
- slot: 'Line',
46
- overridesResolver: (props, styles) => styles.line
47
- })(({
48
- theme
49
- }) => ({
50
- stroke: theme.palette.text.primary,
51
- shapeRendering: 'crispEdges',
52
- strokeWidth: 1
53
- }));
54
- export const ChartsTick = styled('line', {
55
- name: 'MuiChartsAxis',
56
- slot: 'Tick',
57
- overridesResolver: (props, styles) => styles.tick
58
8
  })(({
59
9
  theme
60
10
  }) => ({
61
- stroke: theme.palette.text.primary,
62
- shapeRendering: 'crispEdges'
63
- }));
64
- export const ChartsTickLabel = styled('text', {
65
- name: 'MuiChartsAxis',
66
- slot: 'TickLabel',
67
- overridesResolver: (props, styles) => styles.tickLabel
68
- })(({
69
- theme
70
- }) => _extends({}, theme.typography.caption, {
71
- fill: theme.palette.text.primary
72
- }));
73
- export const ChartsLabel = styled('text', {
74
- name: 'MuiChartsAxis',
75
- slot: 'Label',
76
- overridesResolver: (props, styles) => styles.label
77
- })(({
78
- theme
79
- }) => _extends({}, theme.typography.body1, {
80
- fill: theme.palette.text.primary
11
+ [`& .${axisClasses.tickLabel}`]: _extends({}, theme.typography.caption, {
12
+ fill: (theme.vars || theme).palette.text.primary
13
+ }),
14
+ [`& .${axisClasses.label}`]: _extends({}, theme.typography.body1, {
15
+ fill: (theme.vars || theme).palette.text.primary
16
+ }),
17
+ [`& .${axisClasses.line}`]: {
18
+ stroke: (theme.vars || theme).palette.text.primary,
19
+ shapeRendering: 'crispEdges',
20
+ strokeWidth: 1
21
+ },
22
+ [`& .${axisClasses.tick}`]: {
23
+ stroke: (theme.vars || theme).palette.text.primary,
24
+ shapeRendering: 'crispEdges'
25
+ }
81
26
  }));
@@ -0,0 +1,77 @@
1
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ const _excluded = ["x", "y", "style", "text", "ownerState"],
4
+ _excluded2 = ["angle", "textAnchor", "dominantBaseline"];
5
+ import * as React from 'react';
6
+ import { getStringSize } from '../domUtils';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ export function getWordsByLines({
9
+ style,
10
+ needsComputation,
11
+ text
12
+ }) {
13
+ return text.split('\n').map(subText => _extends({
14
+ text: subText
15
+ }, needsComputation ? getStringSize(subText, style) : {
16
+ width: 0,
17
+ height: 0
18
+ }));
19
+ }
20
+ export function ChartsText(props) {
21
+ const {
22
+ x,
23
+ y,
24
+ style: styleProps,
25
+ text
26
+ } = props,
27
+ textProps = _objectWithoutPropertiesLoose(props, _excluded);
28
+ const _ref = styleProps ?? {},
29
+ {
30
+ angle,
31
+ textAnchor,
32
+ dominantBaseline
33
+ } = _ref,
34
+ style = _objectWithoutPropertiesLoose(_ref, _excluded2);
35
+ const wordsByLines = React.useMemo(() => getWordsByLines({
36
+ style,
37
+ needsComputation: text.includes('\n'),
38
+ text
39
+ }), [style, text]);
40
+ let startDy;
41
+ switch (dominantBaseline) {
42
+ case 'hanging':
43
+ startDy = 0;
44
+ break;
45
+ case 'central':
46
+ startDy = (wordsByLines.length - 1) / 2 * -wordsByLines[0].height;
47
+ break;
48
+ default:
49
+ startDy = (wordsByLines.length - 1) * -wordsByLines[0].height;
50
+ break;
51
+ }
52
+ const transforms = [];
53
+ // if (scaleToFit) {
54
+ // const lineWidth = wordsByLines[0].width;
55
+ // transforms.push(`scale(${(isNumber(width as number) ? (width as number) / lineWidth : 1) / lineWidth})`);
56
+ // }
57
+ if (angle) {
58
+ transforms.push(`rotate(${angle}, ${x}, ${y})`);
59
+ }
60
+ if (transforms.length) {
61
+ textProps.transform = transforms.join(' ');
62
+ }
63
+ return /*#__PURE__*/_jsx("text", _extends({}, textProps, {
64
+ x: x,
65
+ y: y,
66
+ textAnchor: textAnchor,
67
+ dominantBaseline: dominantBaseline,
68
+ style: style,
69
+ children: wordsByLines.map((line, index) => /*#__PURE__*/_jsx("tspan", {
70
+ x: x,
71
+ dy: `${index === 0 ? startDy : wordsByLines[0].height}px`,
72
+ dominantBaseline: dominantBaseline // Propagated to fix Safari issue: https://github.com/mui/mui-x/issues/10808
73
+ ,
74
+ children: line.text
75
+ }, index))
76
+ }));
77
+ }
@@ -0,0 +1,113 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ // DOM utils taken from
3
+ // https://github.com/recharts/recharts/blob/master/src/util/DOMUtils.ts
4
+
5
+ const isSsr = () => !(typeof window !== 'undefined' && window.document && window.setTimeout);
6
+ const stringCache = {
7
+ widthCache: {},
8
+ cacheCount: 0
9
+ };
10
+ const MAX_CACHE_NUM = 2000;
11
+ const SPAN_STYLE = {
12
+ position: 'absolute',
13
+ top: '-20000px',
14
+ left: 0,
15
+ padding: 0,
16
+ margin: 0,
17
+ border: 'none',
18
+ whiteSpace: 'pre'
19
+ };
20
+ const STYLE_LIST = ['minWidth', 'maxWidth', 'width', 'minHeight', 'maxHeight', 'height', 'top', 'left', 'fontSize', 'padding', 'margin', 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom'];
21
+ const MEASUREMENT_SPAN_ID = 'mui_measurement_span';
22
+
23
+ /**
24
+ *
25
+ * @param name CSS property name
26
+ * @param value
27
+ * @returns add 'px' for distance properties
28
+ */
29
+ function autoCompleteStyle(name, value) {
30
+ if (STYLE_LIST.indexOf(name) >= 0 && value === +value) {
31
+ return `${value}px`;
32
+ }
33
+ return value;
34
+ }
35
+
36
+ /**
37
+ *
38
+ * @param text camelcase css property
39
+ * @returns css property
40
+ */
41
+ function camelToMiddleLine(text) {
42
+ const strs = text.split('');
43
+ const formatStrs = strs.reduce((result, entry) => {
44
+ if (entry === entry.toUpperCase()) {
45
+ return [...result, '-', entry.toLowerCase()];
46
+ }
47
+ return [...result, entry];
48
+ }, []);
49
+ return formatStrs.join('');
50
+ }
51
+
52
+ /**
53
+ *
54
+ * @param style React style object
55
+ * @returns CSS styling string
56
+ */
57
+ export const getStyleString = style => Object.keys(style).sort().reduce((result, s) => `${result}${camelToMiddleLine(s)}:${autoCompleteStyle(s, style[s])};`, '');
58
+
59
+ /**
60
+ *
61
+ * @param text The string to estimate
62
+ * @param style The style applied
63
+ * @returns width and height of the text
64
+ */
65
+ export const getStringSize = (text, style = {}) => {
66
+ if (text === undefined || text === null || isSsr()) {
67
+ return {
68
+ width: 0,
69
+ height: 0
70
+ };
71
+ }
72
+ const str = `${text}`;
73
+ const styleString = getStyleString(style);
74
+ const cacheKey = `${str}-${styleString}`;
75
+ if (stringCache.widthCache[cacheKey]) {
76
+ return stringCache.widthCache[cacheKey];
77
+ }
78
+ try {
79
+ let measurementSpan = document.getElementById(MEASUREMENT_SPAN_ID);
80
+ if (measurementSpan === null) {
81
+ measurementSpan = document.createElement('span');
82
+ measurementSpan.setAttribute('id', MEASUREMENT_SPAN_ID);
83
+ measurementSpan.setAttribute('aria-hidden', 'true');
84
+ document.body.appendChild(measurementSpan);
85
+ }
86
+ // Need to use CSS Object Model (CSSOM) to be able to comply with Content Security Policy (CSP)
87
+ // https://en.wikipedia.org/wiki/Content_Security_Policy
88
+ const measurementSpanStyle = _extends({}, SPAN_STYLE, style);
89
+ Object.keys(measurementSpanStyle).map(styleKey => {
90
+ measurementSpan.style[camelToMiddleLine(styleKey)] = autoCompleteStyle(styleKey, measurementSpanStyle[styleKey]);
91
+ return styleKey;
92
+ });
93
+ measurementSpan.textContent = str;
94
+ const rect = measurementSpan.getBoundingClientRect();
95
+ const result = {
96
+ width: rect.width,
97
+ height: rect.height
98
+ };
99
+ stringCache.widthCache[cacheKey] = result;
100
+ if (stringCache.cacheCount + 1 > MAX_CACHE_NUM) {
101
+ stringCache.cacheCount = 0;
102
+ stringCache.widthCache = {};
103
+ } else {
104
+ stringCache.cacheCount += 1;
105
+ }
106
+ return result;
107
+ } catch (e) {
108
+ return {
109
+ width: 0,
110
+ height: 0
111
+ };
112
+ }
113
+ };
@@ -0,0 +1,36 @@
1
+ const ANGLE_APPROX = 5; // Angle (in deg) for which we approximate the rectangle as perfectly horizontal/vertical
2
+
3
+ let warnedOnce = false;
4
+
5
+ /**
6
+ * Return the minimal translation along the x-axis to avoid overflow of a rectangle of a given width, height, and rotation.
7
+ * This assumes that all rectangles have the same height and angle between -90 and 90.
8
+ * Otherwise it would be problematic because you need the height/width of the next rectangle to do the correct computation.
9
+ * @param width the side along the x axis.
10
+ * @param height the side along the y axis.
11
+ * @param angle the rotation in degrees.
12
+ */
13
+ export function getMinXTranslation(width, height, angle = 0) {
14
+ if (process.env.NODE_ENV !== 'production') {
15
+ if (!warnedOnce && angle > 90 && angle < -90) {
16
+ warnedOnce = true;
17
+ console.warn([`MUI X: It seems you applied an angle larger than 90° or smaller than -90° to an axis text.`, `This could cause some text overlapping.`, `If you encounter a use case where it's needed, please open an issue.`].join('\n'));
18
+ }
19
+ }
20
+ const standardAngle = Math.min(Math.abs(angle) % 180, Math.abs(Math.abs(angle) % 180 - 180) % 180); // Map from R to [0, 90]
21
+
22
+ if (standardAngle < ANGLE_APPROX) {
23
+ // It's nearly horizontal
24
+ return width;
25
+ }
26
+ if (standardAngle > 90 - ANGLE_APPROX) {
27
+ // It's nearly vertical
28
+ return height;
29
+ }
30
+ const radAngle = standardAngle * Math.PI / 180;
31
+ const angleSwich = Math.atan2(height, width);
32
+ if (radAngle < angleSwich) {
33
+ return width / Math.cos(radAngle);
34
+ }
35
+ return height / Math.sin(radAngle);
36
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-charts",
3
- "version": "6.0.0-alpha.8",
3
+ "version": "6.18.0",
4
4
  "description": "The community edition of the charts components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./index.js",
@@ -27,7 +27,10 @@
27
27
  "directory": "packages/x-charts"
28
28
  },
29
29
  "dependencies": {
30
- "@babel/runtime": "^7.22.11",
30
+ "@babel/runtime": "^7.23.2",
31
+ "@mui/base": "^5.0.0-beta.22",
32
+ "@react-spring/rafz": "^9.7.3",
33
+ "@react-spring/web": "^9.7.3",
31
34
  "clsx": "^2.0.0",
32
35
  "d3-color": "^3.1.0",
33
36
  "d3-scale": "^4.0.2",
@@ -53,13 +56,13 @@
53
56
  "exports": {
54
57
  ".": {
55
58
  "types": "./index.d.ts",
56
- "require": "./index.js",
57
- "import": "./esm/index.js"
59
+ "import": "./esm/index.js",
60
+ "default": "./esm/index.js"
58
61
  },
59
62
  "./*": {
60
63
  "types": "./*/index.d.ts",
61
- "require": "./*/index.js",
62
- "import": "./esm/*/index.js"
64
+ "import": "./esm/*/index.js",
65
+ "default": "./esm/*/index.js"
63
66
  }
64
67
  },
65
68
  "setupFiles": [
@@ -13,6 +13,7 @@ export interface ChartsComponents {
13
13
  };
14
14
  MuiChartsAxisHighlight?: {
15
15
  defaultProps?: ComponentsProps['MuiChartsAxisHighlight'];
16
+ styleOverrides?: ComponentsOverrides['MuiChartsAxisHighlight'];
16
17
  };
17
18
  MuiChartsClipPath?: {
18
19
  defaultProps?: ComponentsProps['MuiChartsClipPath'];
@@ -1,11 +1,13 @@
1
1
  import { BarElementClassKey } from '../BarChart/BarElement';
2
2
  import { ChartsAxisClassKey } from '../ChartsAxis';
3
+ import { ChartsAxisHighlightClassKey } from '../ChartsAxisHighlight';
3
4
  import { ChartsLegendClassKey } from '../ChartsLegend';
4
5
  import { AreaElementClassKey, LineElementClassKey, MarkElementClassKey } from '../LineChart';
5
6
 
6
7
  // prettier-ignore
7
8
  export interface PickersComponentNameToClassKey {
8
9
  MuiChartsAxis: ChartsAxisClassKey;
10
+ MuiChartsAxisHighlight: ChartsAxisHighlightClassKey;
9
11
  MuiChartsLegend: ChartsLegendClassKey;
10
12
 
11
13
  // BarChart components