@mui/x-charts 7.1.1 → 7.3.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 (192) hide show
  1. package/BarChart/BarChart.js +32 -2
  2. package/BarChart/BarPlot.js +12 -5
  3. package/BarChart/extremums.js +1 -1
  4. package/BarChart/getColor.d.ts +3 -0
  5. package/BarChart/getColor.js +33 -0
  6. package/CHANGELOG.md +211 -0
  7. package/ChartContainer/ChartContainer.js +35 -4
  8. package/ChartsAxis/ChartsAxis.js +4 -4
  9. package/ChartsClipPath/ChartsClipPath.js +2 -2
  10. package/ChartsLegend/ChartsLegend.js +2 -2
  11. package/ChartsTooltip/ChartsAxisTooltipContent.d.ts +4 -1
  12. package/ChartsTooltip/ChartsAxisTooltipContent.js +7 -2
  13. package/ChartsTooltip/ChartsItemTooltipContent.d.ts +6 -0
  14. package/ChartsTooltip/ChartsItemTooltipContent.js +15 -1
  15. package/ChartsTooltip/DefaultChartsAxisTooltipContent.js +6 -3
  16. package/ChartsTooltip/DefaultChartsItemTooltipContent.js +13 -4
  17. package/ChartsTooltip/utils.d.ts +5 -1
  18. package/ChartsVoronoiHandler/ChartsVoronoiHandler.js +6 -6
  19. package/ChartsXAxis/ChartsXAxis.js +7 -7
  20. package/ChartsYAxis/ChartsYAxis.js +9 -6
  21. package/Gauge/GaugeProvider.js +5 -5
  22. package/LineChart/AnimatedArea.js +6 -5
  23. package/LineChart/AnimatedLine.js +7 -5
  24. package/LineChart/AreaElement.d.ts +1 -0
  25. package/LineChart/AreaElement.js +4 -1
  26. package/LineChart/AreaPlot.js +7 -1
  27. package/LineChart/LineChart.js +32 -2
  28. package/LineChart/LineElement.d.ts +1 -0
  29. package/LineChart/LineElement.js +4 -1
  30. package/LineChart/LineHighlightPlot.js +4 -1
  31. package/LineChart/LinePlot.js +7 -1
  32. package/LineChart/MarkPlot.js +5 -5
  33. package/LineChart/getColor.d.ts +3 -0
  34. package/LineChart/getColor.js +31 -0
  35. package/PieChart/PieChart.js +32 -2
  36. package/PieChart/PiePlot.js +26 -6
  37. package/PieChart/formatter.js +4 -2
  38. package/PieChart/getColor.d.ts +2 -0
  39. package/PieChart/getColor.js +11 -0
  40. package/PieChart/getPieCoordinates.d.ts +7 -0
  41. package/PieChart/getPieCoordinates.js +25 -0
  42. package/PieChart/index.d.ts +1 -0
  43. package/PieChart/index.js +11 -0
  44. package/ResponsiveChartContainer/ResponsiveChartContainer.js +32 -2
  45. package/ScatterChart/Scatter.d.ts +1 -0
  46. package/ScatterChart/Scatter.js +6 -3
  47. package/ScatterChart/ScatterChart.js +32 -2
  48. package/ScatterChart/ScatterPlot.js +3 -0
  49. package/ScatterChart/getColor.d.ts +3 -0
  50. package/ScatterChart/getColor.js +31 -0
  51. package/SparkLineChart/SparkLineChart.js +15 -0
  52. package/context/CartesianContextProvider.d.ts +2 -2
  53. package/context/CartesianContextProvider.js +23 -8
  54. package/esm/BarChart/BarChart.js +32 -2
  55. package/esm/BarChart/BarPlot.js +13 -5
  56. package/esm/BarChart/extremums.js +1 -1
  57. package/esm/BarChart/getColor.js +27 -0
  58. package/esm/ChartContainer/ChartContainer.js +36 -4
  59. package/esm/ChartsAxis/ChartsAxis.js +4 -4
  60. package/esm/ChartsClipPath/ChartsClipPath.js +2 -2
  61. package/esm/ChartsLegend/ChartsLegend.js +2 -2
  62. package/esm/ChartsTooltip/ChartsAxisTooltipContent.js +7 -2
  63. package/esm/ChartsTooltip/ChartsItemTooltipContent.js +15 -1
  64. package/esm/ChartsTooltip/DefaultChartsAxisTooltipContent.js +6 -3
  65. package/esm/ChartsTooltip/DefaultChartsItemTooltipContent.js +13 -4
  66. package/esm/ChartsVoronoiHandler/ChartsVoronoiHandler.js +6 -6
  67. package/esm/ChartsXAxis/ChartsXAxis.js +7 -7
  68. package/esm/ChartsYAxis/ChartsYAxis.js +9 -6
  69. package/esm/Gauge/GaugeProvider.js +5 -5
  70. package/esm/LineChart/AnimatedArea.js +6 -5
  71. package/esm/LineChart/AnimatedLine.js +7 -5
  72. package/esm/LineChart/AreaElement.js +4 -1
  73. package/esm/LineChart/AreaPlot.js +7 -1
  74. package/esm/LineChart/LineChart.js +32 -2
  75. package/esm/LineChart/LineElement.js +4 -1
  76. package/esm/LineChart/LineHighlightPlot.js +4 -1
  77. package/esm/LineChart/LinePlot.js +7 -1
  78. package/esm/LineChart/MarkPlot.js +5 -5
  79. package/esm/LineChart/getColor.js +25 -0
  80. package/esm/PieChart/PieChart.js +32 -2
  81. package/esm/PieChart/PiePlot.js +26 -6
  82. package/esm/PieChart/formatter.js +4 -2
  83. package/esm/PieChart/getColor.js +5 -0
  84. package/esm/PieChart/getPieCoordinates.js +19 -0
  85. package/esm/PieChart/index.js +2 -1
  86. package/esm/ResponsiveChartContainer/ResponsiveChartContainer.js +32 -2
  87. package/esm/ScatterChart/Scatter.js +6 -3
  88. package/esm/ScatterChart/ScatterChart.js +32 -2
  89. package/esm/ScatterChart/ScatterPlot.js +3 -0
  90. package/esm/ScatterChart/getColor.js +25 -0
  91. package/esm/SparkLineChart/SparkLineChart.js +15 -0
  92. package/esm/context/CartesianContextProvider.js +23 -8
  93. package/esm/hooks/index.js +4 -1
  94. package/esm/hooks/useAxisEvents.js +7 -6
  95. package/esm/hooks/useChartId.js +8 -0
  96. package/esm/hooks/useSeries.js +64 -0
  97. package/esm/hooks/useSvgRef.js +9 -0
  98. package/esm/internals/colorGetter.js +22 -0
  99. package/esm/internals/colorScale.js +16 -0
  100. package/esm/internals/components/ChartsAxesGradients/ChartsAxesGradients.js +96 -0
  101. package/esm/internals/components/ChartsAxesGradients/ChartsContinuousGradient.js +55 -0
  102. package/esm/internals/components/ChartsAxesGradients/ChartsPiecewiseGradient.js +41 -0
  103. package/esm/internals/components/ChartsAxesGradients/index.js +1 -0
  104. package/esm/models/colorMapping.js +1 -0
  105. package/esm/models/seriesType/index.js +6 -1
  106. package/hooks/index.d.ts +3 -0
  107. package/hooks/index.js +65 -1
  108. package/hooks/useAxisEvents.js +7 -6
  109. package/hooks/useChartId.d.ts +1 -0
  110. package/hooks/useChartId.js +16 -0
  111. package/hooks/useSeries.d.ts +45 -0
  112. package/hooks/useSeries.js +75 -0
  113. package/hooks/useSvgRef.d.ts +2 -0
  114. package/hooks/useSvgRef.js +17 -0
  115. package/hooks/useTicks.d.ts +1 -1
  116. package/index.js +1 -1
  117. package/internals/colorGetter.d.ts +5 -0
  118. package/internals/colorGetter.js +29 -0
  119. package/internals/colorScale.d.ts +5 -0
  120. package/internals/colorScale.js +24 -0
  121. package/internals/components/ChartsAxesGradients/ChartsAxesGradients.d.ts +3 -0
  122. package/internals/components/ChartsAxesGradients/ChartsAxesGradients.js +105 -0
  123. package/internals/components/ChartsAxesGradients/ChartsContinuousGradient.d.ts +13 -0
  124. package/internals/components/ChartsAxesGradients/ChartsContinuousGradient.js +63 -0
  125. package/internals/components/ChartsAxesGradients/ChartsPiecewiseGradient.d.ts +12 -0
  126. package/internals/components/ChartsAxesGradients/ChartsPiecewiseGradient.js +48 -0
  127. package/internals/components/ChartsAxesGradients/index.d.ts +1 -0
  128. package/internals/components/ChartsAxesGradients/index.js +16 -0
  129. package/internals/defaultizeColor.d.ts +4 -4
  130. package/internals/defaultizeValueFormatter.d.ts +5 -5
  131. package/internals/getScale.d.ts +2 -2
  132. package/models/axis.d.ts +44 -4
  133. package/models/colorMapping.d.ts +45 -0
  134. package/models/colorMapping.js +5 -0
  135. package/models/index.d.ts +1 -1
  136. package/models/seriesType/common.d.ts +10 -2
  137. package/models/seriesType/index.d.ts +2 -0
  138. package/models/seriesType/index.js +17 -1
  139. package/modern/BarChart/BarChart.js +32 -2
  140. package/modern/BarChart/BarPlot.js +13 -5
  141. package/modern/BarChart/extremums.js +1 -1
  142. package/modern/BarChart/getColor.js +27 -0
  143. package/modern/ChartContainer/ChartContainer.js +36 -4
  144. package/modern/ChartsAxis/ChartsAxis.js +4 -4
  145. package/modern/ChartsClipPath/ChartsClipPath.js +2 -2
  146. package/modern/ChartsLegend/ChartsLegend.js +2 -2
  147. package/modern/ChartsTooltip/ChartsAxisTooltipContent.js +7 -2
  148. package/modern/ChartsTooltip/ChartsItemTooltipContent.js +15 -1
  149. package/modern/ChartsTooltip/DefaultChartsAxisTooltipContent.js +6 -3
  150. package/modern/ChartsTooltip/DefaultChartsItemTooltipContent.js +13 -4
  151. package/modern/ChartsVoronoiHandler/ChartsVoronoiHandler.js +6 -6
  152. package/modern/ChartsXAxis/ChartsXAxis.js +7 -7
  153. package/modern/ChartsYAxis/ChartsYAxis.js +9 -6
  154. package/modern/Gauge/GaugeProvider.js +5 -5
  155. package/modern/LineChart/AnimatedArea.js +6 -5
  156. package/modern/LineChart/AnimatedLine.js +7 -5
  157. package/modern/LineChart/AreaElement.js +4 -1
  158. package/modern/LineChart/AreaPlot.js +7 -1
  159. package/modern/LineChart/LineChart.js +32 -2
  160. package/modern/LineChart/LineElement.js +4 -1
  161. package/modern/LineChart/LineHighlightPlot.js +4 -1
  162. package/modern/LineChart/LinePlot.js +7 -1
  163. package/modern/LineChart/MarkPlot.js +5 -5
  164. package/modern/LineChart/getColor.js +25 -0
  165. package/modern/PieChart/PieChart.js +32 -2
  166. package/modern/PieChart/PiePlot.js +26 -6
  167. package/modern/PieChart/formatter.js +4 -2
  168. package/modern/PieChart/getColor.js +5 -0
  169. package/modern/PieChart/getPieCoordinates.js +19 -0
  170. package/modern/PieChart/index.js +2 -1
  171. package/modern/ResponsiveChartContainer/ResponsiveChartContainer.js +32 -2
  172. package/modern/ScatterChart/Scatter.js +6 -3
  173. package/modern/ScatterChart/ScatterChart.js +32 -2
  174. package/modern/ScatterChart/ScatterPlot.js +3 -0
  175. package/modern/ScatterChart/getColor.js +25 -0
  176. package/modern/SparkLineChart/SparkLineChart.js +15 -0
  177. package/modern/context/CartesianContextProvider.js +23 -8
  178. package/modern/hooks/index.js +4 -1
  179. package/modern/hooks/useAxisEvents.js +7 -6
  180. package/modern/hooks/useChartId.js +8 -0
  181. package/modern/hooks/useSeries.js +64 -0
  182. package/modern/hooks/useSvgRef.js +9 -0
  183. package/modern/index.js +1 -1
  184. package/modern/internals/colorGetter.js +22 -0
  185. package/modern/internals/colorScale.js +16 -0
  186. package/modern/internals/components/ChartsAxesGradients/ChartsAxesGradients.js +96 -0
  187. package/modern/internals/components/ChartsAxesGradients/ChartsContinuousGradient.js +55 -0
  188. package/modern/internals/components/ChartsAxesGradients/ChartsPiecewiseGradient.js +41 -0
  189. package/modern/internals/components/ChartsAxesGradients/index.js +1 -0
  190. package/modern/models/colorMapping.js +1 -0
  191. package/modern/models/seriesType/index.js +6 -1
  192. package/package.json +1 -1
@@ -328,11 +328,26 @@ process.env.NODE_ENV !== "production" ? ScatterChart.propTypes = {
328
328
  width: PropTypes.number,
329
329
  /**
330
330
  * The configuration of the x-axes.
331
- * If not provided, a default axis config is used with id set to `DEFAULT_X_AXIS_KEY`.
331
+ * If not provided, a default axis config is used.
332
332
  */
333
333
  xAxis: PropTypes.arrayOf(PropTypes.shape({
334
334
  axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
335
335
  classes: PropTypes.object,
336
+ colorMap: PropTypes.oneOfType([PropTypes.shape({
337
+ color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
338
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
339
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
340
+ type: PropTypes.oneOf(['continuous']).isRequired
341
+ }), PropTypes.shape({
342
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
343
+ thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
344
+ type: PropTypes.oneOf(['piecewise']).isRequired
345
+ }), PropTypes.shape({
346
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
347
+ type: PropTypes.oneOf(['ordinal']).isRequired,
348
+ unknownColor: PropTypes.string,
349
+ values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
350
+ })]),
336
351
  data: PropTypes.array,
337
352
  dataKey: PropTypes.string,
338
353
  disableLine: PropTypes.bool,
@@ -365,11 +380,26 @@ process.env.NODE_ENV !== "production" ? ScatterChart.propTypes = {
365
380
  })),
366
381
  /**
367
382
  * The configuration of the y-axes.
368
- * If not provided, a default axis config is used with id set to `DEFAULT_Y_AXIS_KEY`.
383
+ * If not provided, a default axis config is used.
369
384
  */
370
385
  yAxis: PropTypes.arrayOf(PropTypes.shape({
371
386
  axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
372
387
  classes: PropTypes.object,
388
+ colorMap: PropTypes.oneOfType([PropTypes.shape({
389
+ color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
390
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
391
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
392
+ type: PropTypes.oneOf(['continuous']).isRequired
393
+ }), PropTypes.shape({
394
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
395
+ thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
396
+ type: PropTypes.oneOf(['piecewise']).isRequired
397
+ }), PropTypes.shape({
398
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
399
+ type: PropTypes.oneOf(['ordinal']).isRequired,
400
+ unknownColor: PropTypes.string,
401
+ values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
402
+ })]),
373
403
  data: PropTypes.array,
374
404
  dataKey: PropTypes.string,
375
405
  disableLine: PropTypes.bool,
@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
4
4
  import { Scatter } from './Scatter';
5
5
  import { SeriesContext } from '../context/SeriesContextProvider';
6
6
  import { CartesianContext } from '../context/CartesianContextProvider';
7
+ import getColor from './getColor';
7
8
  import { jsx as _jsx } from "react/jsx-runtime";
8
9
  /**
9
10
  * Demos:
@@ -48,12 +49,14 @@ function ScatterPlot(props) {
48
49
  markerSize,
49
50
  color
50
51
  } = series[seriesId];
52
+ const colorGetter = getColor(series[seriesId], xAxis[xAxisKey ?? defaultXAxisId], yAxis[yAxisKey ?? defaultYAxisId]);
51
53
  const xScale = xAxis[xAxisKey ?? defaultXAxisId].scale;
52
54
  const yScale = yAxis[yAxisKey ?? defaultYAxisId].scale;
53
55
  return /*#__PURE__*/_jsx(ScatterItems, _extends({
54
56
  xScale: xScale,
55
57
  yScale: yScale,
56
58
  color: color,
59
+ colorGetter: colorGetter,
57
60
  markerSize: markerSize ?? 4,
58
61
  series: series[seriesId],
59
62
  onItemClick: onItemClick
@@ -0,0 +1,25 @@
1
+ export default function getColor(series, xAxis, yAxis) {
2
+ const yColorScale = yAxis.colorScale;
3
+ const xColorScale = xAxis.colorScale;
4
+ if (yColorScale) {
5
+ return dataIndex => {
6
+ const value = series.data[dataIndex];
7
+ const color = value === null ? series.color : yColorScale(value.y);
8
+ if (color === null) {
9
+ return series.color;
10
+ }
11
+ return color;
12
+ };
13
+ }
14
+ if (xColorScale) {
15
+ return dataIndex => {
16
+ const value = series.data[dataIndex];
17
+ const color = value === null ? series.color : xColorScale(value.x);
18
+ if (color === null) {
19
+ return series.color;
20
+ }
21
+ return color;
22
+ };
23
+ }
24
+ return () => series.color;
25
+ }
@@ -226,6 +226,21 @@ process.env.NODE_ENV !== "production" ? SparkLineChart.propTypes = {
226
226
  xAxis: PropTypes.shape({
227
227
  axisId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
228
228
  classes: PropTypes.object,
229
+ colorMap: PropTypes.oneOfType([PropTypes.shape({
230
+ color: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string.isRequired), PropTypes.func]).isRequired,
231
+ max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
232
+ min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]),
233
+ type: PropTypes.oneOf(['continuous']).isRequired
234
+ }), PropTypes.shape({
235
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
236
+ thresholds: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]).isRequired).isRequired,
237
+ type: PropTypes.oneOf(['piecewise']).isRequired
238
+ }), PropTypes.shape({
239
+ colors: PropTypes.arrayOf(PropTypes.string).isRequired,
240
+ type: PropTypes.oneOf(['ordinal']).isRequired,
241
+ unknownColor: PropTypes.string,
242
+ values: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number, PropTypes.string]).isRequired)
243
+ })]),
229
244
  data: PropTypes.array,
230
245
  dataKey: PropTypes.string,
231
246
  disableLine: PropTypes.bool,
@@ -6,10 +6,11 @@ import { getExtremumX as getScatterExtremumX, getExtremumY as getScatterExtremum
6
6
  import { getExtremumX as getLineExtremumX, getExtremumY as getLineExtremumY } from '../LineChart/extremums';
7
7
  import { isBandScaleConfig, isPointScaleConfig } from '../models/axis';
8
8
  import { getScale } from '../internals/getScale';
9
- import { DrawingContext } from './DrawingProvider';
10
9
  import { SeriesContext } from './SeriesContextProvider';
11
10
  import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants';
12
11
  import { getTickNumber } from '../hooks/useTicks';
12
+ import { useDrawingArea } from '../hooks/useDrawingArea';
13
+ import { getColorScale, getOrdinalColorScale } from '../internals/colorScale';
13
14
  import { jsx as _jsx } from "react/jsx-runtime";
14
15
  const DEFAULT_CATEGORY_GAP_RATIO = 0.2;
15
16
  const DEFAULT_BAR_GAP_RATIO = 0.1;
@@ -42,7 +43,7 @@ function CartesianContextProvider(props) {
42
43
  children
43
44
  } = props;
44
45
  const formattedSeries = React.useContext(SeriesContext);
45
- const drawingArea = React.useContext(DrawingContext);
46
+ const drawingArea = useDrawingArea();
46
47
  const xAxis = React.useMemo(() => inXAxis?.map(axisConfig => {
47
48
  const dataKey = axisConfig.dataKey;
48
49
  if (dataKey === undefined || axisConfig.data !== undefined) {
@@ -112,13 +113,19 @@ function CartesianContextProvider(props) {
112
113
  barGapRatio
113
114
  }, axis, {
114
115
  scale: scaleBand(axis.data, range).paddingInner(categoryGapRatio).paddingOuter(categoryGapRatio / 2),
115
- tickNumber: axis.data.length
116
+ tickNumber: axis.data.length,
117
+ colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({
118
+ values: axis.data
119
+ }, axis.colorMap)) : getColorScale(axis.colorMap))
116
120
  });
117
121
  }
118
122
  if (isPointScaleConfig(axis)) {
119
123
  completedXAxis[axis.id] = _extends({}, axis, {
120
124
  scale: scalePoint(axis.data, range),
121
- tickNumber: axis.data.length
125
+ tickNumber: axis.data.length,
126
+ colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({
127
+ values: axis.data
128
+ }, axis.colorMap)) : getColorScale(axis.colorMap))
122
129
  });
123
130
  }
124
131
  if (axis.scaleType === 'band' || axis.scaleType === 'point') {
@@ -137,7 +144,8 @@ function CartesianContextProvider(props) {
137
144
  completedXAxis[axis.id] = _extends({}, axis, {
138
145
  scaleType,
139
146
  scale: niceScale.domain(domain),
140
- tickNumber
147
+ tickNumber,
148
+ colorScale: axis.colorMap && getColorScale(axis.colorMap)
141
149
  });
142
150
  });
143
151
  const allYAxis = [...(yAxis?.map((axis, index) => _extends({
@@ -160,13 +168,19 @@ function CartesianContextProvider(props) {
160
168
  barGapRatio: 0
161
169
  }, axis, {
162
170
  scale: scaleBand(axis.data, [range[1], range[0]]).paddingInner(categoryGapRatio).paddingOuter(categoryGapRatio / 2),
163
- tickNumber: axis.data.length
171
+ tickNumber: axis.data.length,
172
+ colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({
173
+ values: axis.data
174
+ }, axis.colorMap)) : getColorScale(axis.colorMap))
164
175
  });
165
176
  }
166
177
  if (isPointScaleConfig(axis)) {
167
178
  completedYAxis[axis.id] = _extends({}, axis, {
168
179
  scale: scalePoint(axis.data, [range[1], range[0]]),
169
- tickNumber: axis.data.length
180
+ tickNumber: axis.data.length,
181
+ colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({
182
+ values: axis.data
183
+ }, axis.colorMap)) : getColorScale(axis.colorMap))
170
184
  });
171
185
  }
172
186
  if (axis.scaleType === 'band' || axis.scaleType === 'point') {
@@ -185,7 +199,8 @@ function CartesianContextProvider(props) {
185
199
  completedYAxis[axis.id] = _extends({}, axis, {
186
200
  scaleType,
187
201
  scale: niceScale.domain(domain),
188
- tickNumber
202
+ tickNumber,
203
+ colorScale: axis.colorMap && getColorScale(axis.colorMap)
189
204
  });
190
205
  });
191
206
  return {
@@ -1,2 +1,5 @@
1
1
  export * from './useDrawingArea';
2
- export * from './useScale';
2
+ export * from './useChartId';
3
+ export * from './useScale';
4
+ export * from './useSvgRef';
5
+ export { useSeries as unstable_useSeries, usePieSeries as unstable_usePieSeries, useLineSeries as unstable_useLineSeries, useBarSeries as unstable_useBarSeries, useScatterSeries as unstable_useScatterSeries } from './useSeries';
@@ -1,20 +1,21 @@
1
1
  import * as React from 'react';
2
2
  import { InteractionContext } from '../context/InteractionProvider';
3
3
  import { CartesianContext } from '../context/CartesianContextProvider';
4
- import { SvgContext, DrawingContext } from '../context/DrawingProvider';
5
4
  import { isBandScale } from '../internals/isBandScale';
6
5
  import { getSVGPoint } from '../internals/utils';
6
+ import { useSvgRef } from './useSvgRef';
7
+ import { useDrawingArea } from './useDrawingArea';
7
8
  function getAsANumber(value) {
8
9
  return value instanceof Date ? value.getTime() : value;
9
10
  }
10
11
  export const useAxisEvents = disableAxisListener => {
11
- const svgRef = React.useContext(SvgContext);
12
+ const svgRef = useSvgRef();
12
13
  const {
13
- width,
14
- height,
14
+ left,
15
15
  top,
16
- left
17
- } = React.useContext(DrawingContext);
16
+ width,
17
+ height
18
+ } = useDrawingArea();
18
19
  const {
19
20
  xAxis,
20
21
  yAxis,
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ import { DrawingContext } from '../context/DrawingProvider';
3
+ export function useChartId() {
4
+ const {
5
+ chartId
6
+ } = React.useContext(DrawingContext);
7
+ return React.useMemo(() => chartId, [chartId]);
8
+ }
@@ -0,0 +1,64 @@
1
+ import * as React from 'react';
2
+ import { SeriesContext } from '../context/SeriesContextProvider';
3
+
4
+ /**
5
+ * Get access to the internal state of series.
6
+ * Structured by type of series:
7
+ * { seriesType?: { series: { id1: precessedValue, ... }, seriesOrder: [id1, ...] } }
8
+ * @returns FormattedSeries series
9
+ */
10
+ export function useSeries() {
11
+ const series = React.useContext(SeriesContext);
12
+ if (series === undefined) {
13
+ throw new Error(['MUI X: Could not find the series ref context.', 'It looks like you rendered your component outside of a ChartsContainer parent component.'].join('\n'));
14
+ }
15
+ return series;
16
+ }
17
+
18
+ /**
19
+ * Get access to the internal state of pie series.
20
+ * The returned object contains:
21
+ * - series: a mapping from ids to series attributes.
22
+ * - seriesOrder: the array of series ids.
23
+ * @returns { series: Record<SeriesId, DefaultizedPieSeriesType>; seriesOrder: SeriesId[]; } | undefined pieSeries
24
+ */
25
+ export function usePieSeries() {
26
+ const series = useSeries();
27
+ return React.useMemo(() => series.pie, [series.pie]);
28
+ }
29
+
30
+ /**
31
+ * Get access to the internal state of line series.
32
+ * The returned object contains:
33
+ * - series: a mapping from ids to series attributes.
34
+ * - seriesOrder: the array of series ids.
35
+ * @returns { series: Record<SeriesId, DefaultizedLineSeriesType>; seriesOrder: SeriesId[]; } | undefined lineSeries
36
+ */
37
+ export function useLineSeries() {
38
+ const series = useSeries();
39
+ return React.useMemo(() => series.line, [series.line]);
40
+ }
41
+
42
+ /**
43
+ * Get access to the internal state of bar series.
44
+ * The returned object contains:
45
+ * - series: a mapping from ids to series attributes.
46
+ * - seriesOrder: the array of series ids.
47
+ * @returns { series: Record<SeriesId, DefaultizedBarSeriesType>; seriesOrder: SeriesId[]; } | undefined barSeries
48
+ */
49
+ export function useBarSeries() {
50
+ const series = useSeries();
51
+ return React.useMemo(() => series.bar, [series.bar]);
52
+ }
53
+
54
+ /**
55
+ * Get access to the internal state of scatter series.
56
+ * The returned object contains:
57
+ * - series: a mapping from ids to series attributes.
58
+ * - seriesOrder: the array of series ids.
59
+ * @returns { series: Record<SeriesId, DefaultizedScatterSeriesType>; seriesOrder: SeriesId[]; } | undefined scatterSeries
60
+ */
61
+ export function useScatterSeries() {
62
+ const series = useSeries();
63
+ return React.useMemo(() => series.scatter, [series.scatter]);
64
+ }
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import { SvgContext } from '../context/DrawingProvider';
3
+ export function useSvgRef() {
4
+ const svgRef = React.useContext(SvgContext);
5
+ if (svgRef === undefined) {
6
+ throw new Error(['MUI X: Could not find the svg ref context.', 'It looks like you rendered your component outside of a ChartsContainer parent component.'].join('\n'));
7
+ }
8
+ return svgRef;
9
+ }
@@ -0,0 +1,22 @@
1
+ import getBarColor from '../BarChart/getColor';
2
+ import getLineColor from '../LineChart/getColor';
3
+ import getScatterColor from '../ScatterChart/getColor';
4
+ import getPieColor from '../PieChart/getColor';
5
+ function getColor(series, xAxis, yAxis) {
6
+ if (xAxis !== undefined && yAxis !== undefined) {
7
+ if (series.type === 'bar') {
8
+ return getBarColor(series, xAxis, yAxis);
9
+ }
10
+ if (series.type === 'line') {
11
+ return getLineColor(series, xAxis, yAxis);
12
+ }
13
+ if (series.type === 'scatter') {
14
+ return getScatterColor(series, xAxis, yAxis);
15
+ }
16
+ }
17
+ if (series.type === 'pie') {
18
+ return getPieColor(series);
19
+ }
20
+ throw Error(`MUI X Charts: getColor called with unexpected arguments for series with id "${series.id}"`);
21
+ }
22
+ export default getColor;
@@ -0,0 +1,16 @@
1
+ import { scaleOrdinal, scaleThreshold, scaleSequential } from 'd3-scale';
2
+ export function getSequentialColorScale(config) {
3
+ if (config.type === 'piecewise') {
4
+ return scaleThreshold(config.thresholds, config.colors);
5
+ }
6
+ return scaleSequential([config.min ?? 0, config.max ?? 100], config.color);
7
+ }
8
+ export function getOrdinalColorScale(config) {
9
+ if (config.values) {
10
+ return scaleOrdinal(config.values, config.colors).unknown(config.unknownColor ?? null);
11
+ }
12
+ return scaleOrdinal(config.colors.map((_, index) => index), config.colors).unknown(config.unknownColor ?? null);
13
+ }
14
+ export function getColorScale(config) {
15
+ return config.type === 'ordinal' ? getOrdinalColorScale(config) : getSequentialColorScale(config);
16
+ }
@@ -0,0 +1,96 @@
1
+ import * as React from 'react';
2
+ import { CartesianContext } from '../../../context/CartesianContextProvider';
3
+ import { DrawingContext } from '../../../context/DrawingProvider';
4
+ import { useDrawingArea } from '../../../hooks';
5
+ import ChartsPiecewiseGradient from './ChartsPiecewiseGradient';
6
+ import ChartsContinuousGradient from './ChartsContinuousGradient';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ import { jsxs as _jsxs } from "react/jsx-runtime";
9
+ export function useChartGradient() {
10
+ const {
11
+ chartId
12
+ } = React.useContext(DrawingContext);
13
+ return React.useCallback((axisId, direction) => `${chartId}-graient-${direction}-${axisId}`, [chartId]);
14
+ }
15
+ export function ChartsAxesGradients() {
16
+ const {
17
+ top,
18
+ height,
19
+ bottom,
20
+ left,
21
+ width,
22
+ right
23
+ } = useDrawingArea();
24
+ const svgHeight = top + height + bottom;
25
+ const svgWidth = left + width + right;
26
+ const getGradientId = useChartGradient();
27
+ const {
28
+ xAxisIds,
29
+ xAxis,
30
+ yAxisIds,
31
+ yAxis
32
+ } = React.useContext(CartesianContext);
33
+ return /*#__PURE__*/_jsxs("defs", {
34
+ children: [yAxisIds.filter(axisId => yAxis[axisId].colorMap !== undefined).map(axisId => {
35
+ const gradientId = getGradientId(axisId, 'y');
36
+ const {
37
+ colorMap,
38
+ scale,
39
+ colorScale,
40
+ reverse
41
+ } = yAxis[axisId];
42
+ if (colorMap?.type === 'piecewise') {
43
+ return /*#__PURE__*/_jsx(ChartsPiecewiseGradient, {
44
+ isReveresed: !reverse,
45
+ scale: scale,
46
+ colorMap: colorMap,
47
+ size: svgHeight,
48
+ gradientId: gradientId,
49
+ direction: "y"
50
+ }, gradientId);
51
+ }
52
+ if (colorMap?.type === 'continuous') {
53
+ return /*#__PURE__*/_jsx(ChartsContinuousGradient, {
54
+ isReveresed: !reverse,
55
+ scale: scale,
56
+ colorScale: colorScale,
57
+ colorMap: colorMap,
58
+ size: svgHeight,
59
+ gradientId: gradientId,
60
+ direction: "y"
61
+ }, gradientId);
62
+ }
63
+ return null;
64
+ }), xAxisIds.filter(axisId => xAxis[axisId].colorMap !== undefined).map(axisId => {
65
+ const gradientId = getGradientId(axisId, 'x');
66
+ const {
67
+ colorMap,
68
+ scale,
69
+ reverse,
70
+ colorScale
71
+ } = xAxis[axisId];
72
+ if (colorMap?.type === 'piecewise') {
73
+ return /*#__PURE__*/_jsx(ChartsPiecewiseGradient, {
74
+ isReveresed: reverse,
75
+ scale: scale,
76
+ colorMap: colorMap,
77
+ size: svgWidth,
78
+ gradientId: gradientId,
79
+ direction: "x"
80
+ }, gradientId);
81
+ }
82
+ if (colorMap?.type === 'continuous') {
83
+ return /*#__PURE__*/_jsx(ChartsContinuousGradient, {
84
+ isReveresed: reverse,
85
+ scale: scale,
86
+ colorScale: colorScale,
87
+ colorMap: colorMap,
88
+ size: svgWidth,
89
+ gradientId: gradientId,
90
+ direction: "x"
91
+ }, gradientId);
92
+ }
93
+ return null;
94
+ })]
95
+ });
96
+ }
@@ -0,0 +1,55 @@
1
+ import * as React from 'react';
2
+ import { interpolateDate, interpolateNumber } from 'd3-interpolate';
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ const PX_PRECISION = 10;
5
+ export default function ChartsContinuousGradient(props) {
6
+ const {
7
+ isReveresed,
8
+ gradientId,
9
+ size,
10
+ direction,
11
+ scale,
12
+ colorScale,
13
+ colorMap
14
+ } = props;
15
+ const extremValues = [colorMap.min ?? 0, colorMap.max ?? 100];
16
+ const extremPositions = extremValues.map(scale).filter(p => p !== undefined);
17
+ if (extremPositions.length !== 2) {
18
+ return null;
19
+ }
20
+ const interpolator = typeof extremValues[0] === 'number' ? interpolateNumber(extremValues[0], extremValues[1]) : interpolateDate(extremValues[0], extremValues[1]);
21
+ const numberOfPoints = Math.round((Math.max(...extremPositions) - Math.min(...extremPositions)) / PX_PRECISION);
22
+ const keyPrefix = `${extremValues[0]}-${extremValues[1]}-`;
23
+ return /*#__PURE__*/_jsx("linearGradient", {
24
+ id: gradientId,
25
+ x1: "0",
26
+ x2: "0",
27
+ y1: "0",
28
+ y2: "0",
29
+ [`${direction}${isReveresed ? 1 : 2}`]: `${size}px`,
30
+ gradientUnits: "userSpaceOnUse" // Use the SVG coordinate instead of the component ones.
31
+ ,
32
+ children: Array.from({
33
+ length: numberOfPoints + 1
34
+ }, (_, index) => {
35
+ const value = interpolator(index / numberOfPoints);
36
+ if (value === undefined) {
37
+ return null;
38
+ }
39
+ const x = scale(value);
40
+ if (x === undefined) {
41
+ return null;
42
+ }
43
+ const offset = isReveresed ? 1 - x / size : x / size;
44
+ const color = colorScale(value);
45
+ if (color === null) {
46
+ return null;
47
+ }
48
+ return /*#__PURE__*/_jsx("stop", {
49
+ offset: offset,
50
+ stopColor: color,
51
+ stopOpacity: 1
52
+ }, keyPrefix + index);
53
+ })
54
+ });
55
+ }
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { jsxs as _jsxs } from "react/jsx-runtime";
4
+ export default function ChartsPiecewiseGradient(props) {
5
+ const {
6
+ isReveresed,
7
+ gradientId,
8
+ size,
9
+ direction,
10
+ scale,
11
+ colorMap
12
+ } = props;
13
+ return /*#__PURE__*/_jsx("linearGradient", {
14
+ id: gradientId,
15
+ x1: "0",
16
+ x2: "0",
17
+ y1: "0",
18
+ y2: "0",
19
+ [`${direction}${isReveresed ? 1 : 2}`]: `${size}px`,
20
+ gradientUnits: "userSpaceOnUse" // Use the SVG coordinate instead of the component ones.
21
+ ,
22
+ children: colorMap.thresholds.map((threshold, index) => {
23
+ const x = scale(threshold);
24
+ if (x === undefined) {
25
+ return null;
26
+ }
27
+ const offset = isReveresed ? 1 - x / size : x / size;
28
+ return /*#__PURE__*/_jsxs(React.Fragment, {
29
+ children: [/*#__PURE__*/_jsx("stop", {
30
+ offset: offset,
31
+ stopColor: colorMap.colors[index],
32
+ stopOpacity: 1
33
+ }), /*#__PURE__*/_jsx("stop", {
34
+ offset: offset,
35
+ stopColor: colorMap.colors[index + 1],
36
+ stopOpacity: 1
37
+ })]
38
+ }, threshold.toString() + index);
39
+ })
40
+ });
41
+ }
@@ -0,0 +1 @@
1
+ export * from './ChartsAxesGradients';
@@ -0,0 +1 @@
1
+ export {};
@@ -2,4 +2,9 @@ export * from './line';
2
2
  export * from './bar';
3
3
  export * from './scatter';
4
4
  export * from './pie';
5
- export {};
5
+ export function isDefaultizedBarSeries(series) {
6
+ return series.type === 'bar';
7
+ }
8
+ export function isBarSeries(series) {
9
+ return series.type === 'bar';
10
+ }
package/hooks/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  export * from './useDrawingArea';
2
+ export * from './useChartId';
2
3
  export * from './useScale';
4
+ export * from './useSvgRef';
5
+ export { useSeries as unstable_useSeries, usePieSeries as unstable_usePieSeries, useLineSeries as unstable_useLineSeries, useBarSeries as unstable_useBarSeries, useScatterSeries as unstable_useScatterSeries, } from './useSeries';