@mui/x-charts 7.8.0 → 7.9.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.
- package/BarChart/BarChart.d.ts +3 -3
- package/BarChart/useBarChartProps.d.ts +1 -1
- package/CHANGELOG.md +66 -0
- package/ChartContainer/ChartContainer.js +3 -1
- package/ChartsAxisHighlight/ChartsAxisHighlight.js +1 -1
- package/ChartsSurface.js +5 -1
- package/ChartsTooltip/ChartsAxisTooltipContent.d.ts +3 -3
- package/ChartsTooltip/ChartsAxisTooltipContent.js +4 -39
- package/ChartsTooltip/ChartsItemTooltipContent.d.ts +7 -6
- package/ChartsTooltip/ChartsItemTooltipContent.js +4 -27
- package/ChartsTooltip/ChartsTooltip.d.ts +10 -9
- package/ChartsTooltip/ChartsTooltip.js +8 -2
- package/ChartsTooltip/ChartsTooltipTable.d.ts +15 -0
- package/ChartsTooltip/ChartsTooltipTable.js +19 -0
- package/ChartsTooltip/index.d.ts +1 -0
- package/ChartsTooltip/index.js +11 -0
- package/ChartsTooltip/utils.d.ts +7 -6
- package/ChartsTooltip/utils.js +24 -30
- package/ChartsVoronoiHandler/ChartsVoronoiHandler.js +5 -5
- package/ChartsXAxis/ChartsXAxis.js +7 -5
- package/LineChart/LineChart.d.ts +3 -3
- package/LineChart/MarkPlot.js +6 -2
- package/LineChart/useLineChartProps.d.ts +1 -1
- package/PieChart/PieChart.d.ts +3 -3
- package/ResponsiveChartContainer/ResponsiveChartContainer.js +3 -1
- package/ScatterChart/Scatter.js +7 -5
- package/ScatterChart/ScatterChart.d.ts +3 -3
- package/ScatterChart/ScatterChart.js +3 -1
- package/ScatterChart/useScatterChartProps.d.ts +1 -1
- package/SparkLineChart/SparkLineChart.d.ts +3 -3
- package/context/CartesianProvider/computeValue.d.ts +2 -2
- package/context/CartesianProvider/computeValue.js +21 -5
- package/context/ZAxisContextProvider.js +7 -2
- package/esm/ChartContainer/ChartContainer.js +3 -1
- package/esm/ChartsAxisHighlight/ChartsAxisHighlight.js +1 -1
- package/esm/ChartsSurface.js +5 -1
- package/esm/ChartsTooltip/ChartsAxisTooltipContent.js +3 -38
- package/esm/ChartsTooltip/ChartsItemTooltipContent.js +3 -26
- package/esm/ChartsTooltip/ChartsTooltip.js +8 -2
- package/esm/ChartsTooltip/ChartsTooltipTable.js +20 -0
- package/esm/ChartsTooltip/index.js +2 -1
- package/esm/ChartsTooltip/utils.js +23 -30
- package/esm/ChartsVoronoiHandler/ChartsVoronoiHandler.js +5 -5
- package/esm/ChartsXAxis/ChartsXAxis.js +7 -5
- package/esm/LineChart/MarkPlot.js +6 -2
- package/esm/ResponsiveChartContainer/ResponsiveChartContainer.js +3 -1
- package/esm/ScatterChart/Scatter.js +7 -5
- package/esm/ScatterChart/ScatterChart.js +3 -1
- package/esm/context/CartesianProvider/computeValue.js +21 -5
- package/esm/context/ZAxisContextProvider.js +7 -2
- package/esm/hooks/index.js +1 -0
- package/esm/hooks/useAxis.js +17 -0
- package/esm/hooks/useAxisEvents.js +20 -9
- package/esm/hooks/useInteractionItemProps.js +11 -4
- package/esm/hooks/useScale.js +6 -13
- package/esm/internals/index.js +2 -0
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +12 -0
- package/hooks/useAxis.d.ts +2 -0
- package/hooks/useAxis.js +24 -0
- package/hooks/useAxisEvents.js +20 -9
- package/hooks/useInteractionItemProps.d.ts +4 -2
- package/hooks/useInteractionItemProps.js +11 -4
- package/hooks/useScale.js +5 -13
- package/index.js +1 -1
- package/internals/index.d.ts +2 -0
- package/internals/index.js +20 -0
- package/models/colorMapping.d.ts +1 -1
- package/models/z-axis.d.ts +8 -0
- package/modern/ChartContainer/ChartContainer.js +3 -1
- package/modern/ChartsAxisHighlight/ChartsAxisHighlight.js +1 -1
- package/modern/ChartsSurface.js +5 -1
- package/modern/ChartsTooltip/ChartsAxisTooltipContent.js +3 -38
- package/modern/ChartsTooltip/ChartsItemTooltipContent.js +3 -26
- package/modern/ChartsTooltip/ChartsTooltip.js +8 -2
- package/modern/ChartsTooltip/ChartsTooltipTable.js +20 -0
- package/modern/ChartsTooltip/index.js +2 -1
- package/modern/ChartsTooltip/utils.js +23 -30
- package/modern/ChartsVoronoiHandler/ChartsVoronoiHandler.js +5 -5
- package/modern/ChartsXAxis/ChartsXAxis.js +7 -5
- package/modern/LineChart/MarkPlot.js +6 -2
- package/modern/ResponsiveChartContainer/ResponsiveChartContainer.js +3 -1
- package/modern/ScatterChart/Scatter.js +7 -5
- package/modern/ScatterChart/ScatterChart.js +3 -1
- package/modern/context/CartesianProvider/computeValue.js +21 -5
- package/modern/context/ZAxisContextProvider.js +7 -2
- package/modern/hooks/index.js +1 -0
- package/modern/hooks/useAxis.js +17 -0
- package/modern/hooks/useAxisEvents.js +20 -9
- package/modern/hooks/useInteractionItemProps.js +11 -4
- package/modern/hooks/useScale.js +6 -13
- package/modern/index.js +1 -1
- package/modern/internals/index.js +2 -0
- package/package.json +3 -3
- package/themeAugmentation/props.d.ts +2 -1
|
@@ -209,10 +209,10 @@ function ChartsXAxis(inProps) {
|
|
|
209
209
|
transform: `translate(0, ${position === 'bottom' ? top + height : top})`,
|
|
210
210
|
className: classes.root,
|
|
211
211
|
children: [!disableLine && /*#__PURE__*/_jsx(Line, _extends({
|
|
212
|
-
x1:
|
|
213
|
-
x2:
|
|
212
|
+
x1: left,
|
|
213
|
+
x2: left + width,
|
|
214
214
|
className: classes.line
|
|
215
|
-
}, slotProps?.axisLine)), xTicksWithDimension.map(({
|
|
215
|
+
}, slotProps?.axisLine)), xTicksWithDimension.filter(tick => tick.offset >= left - 1 && tick.offset <= left + width + 1).map(({
|
|
216
216
|
formattedValue,
|
|
217
217
|
offset,
|
|
218
218
|
labelOffset,
|
|
@@ -220,13 +220,15 @@ function ChartsXAxis(inProps) {
|
|
|
220
220
|
}, index) => {
|
|
221
221
|
const xTickLabel = labelOffset ?? 0;
|
|
222
222
|
const yTickLabel = positionSign * (tickSize + 3);
|
|
223
|
+
const showTick = offset >= left - 1 && offset <= left + width + 1;
|
|
224
|
+
const showTickLabel = offset + xTickLabel >= left - 1 && offset + xTickLabel <= left + width + 1;
|
|
223
225
|
return /*#__PURE__*/_jsxs("g", {
|
|
224
226
|
transform: `translate(${offset}, 0)`,
|
|
225
227
|
className: classes.tickContainer,
|
|
226
|
-
children: [!disableTicks && /*#__PURE__*/_jsx(Tick, _extends({
|
|
228
|
+
children: [!disableTicks && showTick && /*#__PURE__*/_jsx(Tick, _extends({
|
|
227
229
|
y2: positionSign * tickSize,
|
|
228
230
|
className: classes.tick
|
|
229
|
-
}, slotProps?.axisTick)), formattedValue !== undefined && !skipLabel && /*#__PURE__*/_jsx(TickLabel, _extends({
|
|
231
|
+
}, slotProps?.axisTick)), formattedValue !== undefined && !skipLabel && showTickLabel && /*#__PURE__*/_jsx(TickLabel, _extends({
|
|
230
232
|
x: xTickLabel,
|
|
231
233
|
y: yTickLabel
|
|
232
234
|
}, axisTickLabelProps, {
|
|
@@ -11,6 +11,7 @@ import { DEFAULT_X_AXIS_KEY } from '../constants';
|
|
|
11
11
|
import { cleanId } from '../internals/utils';
|
|
12
12
|
import getColor from './getColor';
|
|
13
13
|
import { useLineSeries } from '../hooks/useSeries';
|
|
14
|
+
import { useDrawingArea } from '../hooks/useDrawingArea';
|
|
14
15
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
15
16
|
/**
|
|
16
17
|
* Demos:
|
|
@@ -33,6 +34,10 @@ function MarkPlot(props) {
|
|
|
33
34
|
const seriesData = useLineSeries();
|
|
34
35
|
const axisData = useCartesianContext();
|
|
35
36
|
const chartId = useChartId();
|
|
37
|
+
const {
|
|
38
|
+
left,
|
|
39
|
+
width
|
|
40
|
+
} = useDrawingArea();
|
|
36
41
|
const Mark = slots?.mark ?? MarkElement;
|
|
37
42
|
if (seriesData === undefined) {
|
|
38
43
|
return null;
|
|
@@ -67,13 +72,12 @@ function MarkPlot(props) {
|
|
|
67
72
|
const xScale = getValueToPositionMapper(xAxis[xAxisKey].scale);
|
|
68
73
|
const yScale = yAxis[yAxisKey].scale;
|
|
69
74
|
const xData = xAxis[xAxisKey].data;
|
|
70
|
-
const xRange = xAxis[xAxisKey].scale.range();
|
|
71
75
|
const yRange = yScale.range();
|
|
72
76
|
const isInRange = ({
|
|
73
77
|
x,
|
|
74
78
|
y
|
|
75
79
|
}) => {
|
|
76
|
-
if (x <
|
|
80
|
+
if (x < left || x > left + width) {
|
|
77
81
|
return false;
|
|
78
82
|
}
|
|
79
83
|
if (y < Math.min(...yRange) || y > Math.max(...yRange)) {
|
|
@@ -229,7 +229,9 @@ process.env.NODE_ENV !== "production" ? ResponsiveChartContainer.propTypes = {
|
|
|
229
229
|
})]),
|
|
230
230
|
data: PropTypes.array,
|
|
231
231
|
dataKey: PropTypes.string,
|
|
232
|
-
id: PropTypes.string
|
|
232
|
+
id: PropTypes.string,
|
|
233
|
+
max: PropTypes.number,
|
|
234
|
+
min: PropTypes.number
|
|
233
235
|
}))
|
|
234
236
|
} : void 0;
|
|
235
237
|
export { ResponsiveChartContainer };
|
|
@@ -5,6 +5,7 @@ import { getValueToPositionMapper } from '../hooks/useScale';
|
|
|
5
5
|
import { useInteractionItemProps } from '../hooks/useInteractionItemProps';
|
|
6
6
|
import { InteractionContext } from '../context/InteractionProvider';
|
|
7
7
|
import { useHighlighted } from '../context';
|
|
8
|
+
import { useDrawingArea } from '../hooks/useDrawingArea';
|
|
8
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
10
|
/**
|
|
10
11
|
* Demos:
|
|
@@ -26,6 +27,10 @@ function Scatter(props) {
|
|
|
26
27
|
markerSize,
|
|
27
28
|
onItemClick
|
|
28
29
|
} = props;
|
|
30
|
+
const {
|
|
31
|
+
left,
|
|
32
|
+
width
|
|
33
|
+
} = useDrawingArea();
|
|
29
34
|
const {
|
|
30
35
|
useVoronoiInteraction
|
|
31
36
|
} = React.useContext(InteractionContext);
|
|
@@ -38,10 +43,7 @@ function Scatter(props) {
|
|
|
38
43
|
const cleanData = React.useMemo(() => {
|
|
39
44
|
const getXPosition = getValueToPositionMapper(xScale);
|
|
40
45
|
const getYPosition = getValueToPositionMapper(yScale);
|
|
41
|
-
const xRange = xScale.range();
|
|
42
46
|
const yRange = yScale.range();
|
|
43
|
-
const minXRange = Math.min(...xRange);
|
|
44
|
-
const maxXRange = Math.max(...xRange);
|
|
45
47
|
const minYRange = Math.min(...yRange);
|
|
46
48
|
const maxYRange = Math.max(...yRange);
|
|
47
49
|
const temp = [];
|
|
@@ -49,7 +51,7 @@ function Scatter(props) {
|
|
|
49
51
|
const scatterPoint = series.data[i];
|
|
50
52
|
const x = getXPosition(scatterPoint.x);
|
|
51
53
|
const y = getYPosition(scatterPoint.y);
|
|
52
|
-
const isInRange = x >=
|
|
54
|
+
const isInRange = x >= left && x <= left + width && y >= minYRange && y <= maxYRange;
|
|
53
55
|
const pointCtx = {
|
|
54
56
|
type: 'scatter',
|
|
55
57
|
seriesId: series.id,
|
|
@@ -74,7 +76,7 @@ function Scatter(props) {
|
|
|
74
76
|
}
|
|
75
77
|
}
|
|
76
78
|
return temp;
|
|
77
|
-
}, [xScale, yScale, series.data, series.id,
|
|
79
|
+
}, [xScale, yScale, left, width, series.data, series.id, isHighlighted, isFaded, getInteractionItemProps, colorGetter, color]);
|
|
78
80
|
return /*#__PURE__*/_jsx("g", {
|
|
79
81
|
children: cleanData.map(dataPoint => /*#__PURE__*/_jsx("circle", _extends({
|
|
80
82
|
cx: 0,
|
|
@@ -339,7 +339,9 @@ process.env.NODE_ENV !== "production" ? ScatterChart.propTypes = {
|
|
|
339
339
|
})]),
|
|
340
340
|
data: PropTypes.array,
|
|
341
341
|
dataKey: PropTypes.string,
|
|
342
|
-
id: PropTypes.string
|
|
342
|
+
id: PropTypes.string,
|
|
343
|
+
max: PropTypes.number,
|
|
344
|
+
min: PropTypes.number
|
|
343
345
|
}))
|
|
344
346
|
} : void 0;
|
|
345
347
|
export { ScatterChart };
|
|
@@ -10,6 +10,16 @@ const getRange = (drawingArea, axisName, isReverse) => {
|
|
|
10
10
|
const range = axisName === 'x' ? [drawingArea.left, drawingArea.left + drawingArea.width] : [drawingArea.top + drawingArea.height, drawingArea.top];
|
|
11
11
|
return isReverse ? range.reverse() : range;
|
|
12
12
|
};
|
|
13
|
+
const zoomedScaleRange = (scaleRange, zoomRange) => {
|
|
14
|
+
const rangeGap = scaleRange[1] - scaleRange[0];
|
|
15
|
+
const zoomGap = zoomRange[1] - zoomRange[0];
|
|
16
|
+
|
|
17
|
+
// If current zoom show the scale between p1 and p2 percents
|
|
18
|
+
// The range should be extended by adding [0, p1] and [p2, 100] segments
|
|
19
|
+
const min = scaleRange[0] - zoomRange[0] * rangeGap / zoomGap;
|
|
20
|
+
const max = scaleRange[1] + (100 - zoomRange[1]) * rangeGap / zoomGap;
|
|
21
|
+
return [min, max];
|
|
22
|
+
};
|
|
13
23
|
const isDateData = data => data?.[0] instanceof Date;
|
|
14
24
|
function createDateFormatter(axis, range) {
|
|
15
25
|
const timeScale = scaleTime(axis.data, range);
|
|
@@ -19,7 +29,7 @@ function createDateFormatter(axis, range) {
|
|
|
19
29
|
}
|
|
20
30
|
const DEFAULT_CATEGORY_GAP_RATIO = 0.2;
|
|
21
31
|
const DEFAULT_BAR_GAP_RATIO = 0.1;
|
|
22
|
-
export function computeValue(drawingArea, formattedSeries, inAxis, extremumGetters, axisName) {
|
|
32
|
+
export function computeValue(drawingArea, formattedSeries, inAxis, extremumGetters, axisName, zoomRange = [0, 100]) {
|
|
23
33
|
const DEFAULT_AXIS_KEY = axisName === 'x' ? DEFAULT_X_AXIS_KEY : DEFAULT_Y_AXIS_KEY;
|
|
24
34
|
const allAxis = [...(inAxis?.map((axis, index) => _extends({
|
|
25
35
|
id: `defaultized-${axisName}-axis-${index}`
|
|
@@ -39,11 +49,12 @@ export function computeValue(drawingArea, formattedSeries, inAxis, extremumGette
|
|
|
39
49
|
const barGapRatio = axis.barGapRatio ?? DEFAULT_BAR_GAP_RATIO;
|
|
40
50
|
// Reverse range because ordinal scales are presented from top to bottom on y-axis
|
|
41
51
|
const scaleRange = axisName === 'x' ? range : [range[1], range[0]];
|
|
52
|
+
const zoomedRange = zoomedScaleRange(scaleRange, zoomRange);
|
|
42
53
|
completeAxis[axis.id] = _extends({
|
|
43
54
|
categoryGapRatio,
|
|
44
55
|
barGapRatio
|
|
45
56
|
}, axis, {
|
|
46
|
-
scale: scaleBand(axis.data,
|
|
57
|
+
scale: scaleBand(axis.data, zoomedRange).paddingInner(categoryGapRatio).paddingOuter(categoryGapRatio / 2),
|
|
47
58
|
tickNumber: axis.data.length,
|
|
48
59
|
colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({
|
|
49
60
|
values: axis.data
|
|
@@ -56,8 +67,9 @@ export function computeValue(drawingArea, formattedSeries, inAxis, extremumGette
|
|
|
56
67
|
}
|
|
57
68
|
if (isPointScaleConfig(axis)) {
|
|
58
69
|
const scaleRange = axisName === 'x' ? range : [...range].reverse();
|
|
70
|
+
const zoomedRange = zoomedScaleRange(scaleRange, zoomRange);
|
|
59
71
|
completeAxis[axis.id] = _extends({}, axis, {
|
|
60
|
-
scale: scalePoint(axis.data,
|
|
72
|
+
scale: scalePoint(axis.data, zoomedRange),
|
|
61
73
|
tickNumber: axis.data.length,
|
|
62
74
|
colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' ? getOrdinalColorScale(_extends({
|
|
63
75
|
values: axis.data
|
|
@@ -74,11 +86,15 @@ export function computeValue(drawingArea, formattedSeries, inAxis, extremumGette
|
|
|
74
86
|
}
|
|
75
87
|
const scaleType = axis.scaleType ?? 'linear';
|
|
76
88
|
const extremums = [axis.min ?? minData, axis.max ?? maxData];
|
|
77
|
-
const
|
|
89
|
+
const rawTickNumber = getTickNumber(_extends({}, axis, {
|
|
78
90
|
range,
|
|
79
91
|
domain: extremums
|
|
80
92
|
}));
|
|
81
|
-
const
|
|
93
|
+
const tickNumber = rawTickNumber / ((zoomRange[1] - zoomRange[0]) / 100);
|
|
94
|
+
const zoomedRange = zoomedScaleRange(range, zoomRange);
|
|
95
|
+
|
|
96
|
+
// TODO: move nice to prop? Disable when there is zoom?
|
|
97
|
+
const scale = getScale(scaleType, extremums, zoomedRange).nice(rawTickNumber);
|
|
82
98
|
const [minDomain, maxDomain] = scale.domain();
|
|
83
99
|
const domain = [axis.min ?? minDomain, axis.max ?? maxDomain];
|
|
84
100
|
completeAxis[axis.id] = _extends({}, axis, {
|
|
@@ -37,7 +37,10 @@ function ZAxisContextProvider(props) {
|
|
|
37
37
|
completedZAxis[axis.id] = _extends({}, axis, {
|
|
38
38
|
colorScale: axis.colorMap && (axis.colorMap.type === 'ordinal' && axis.data ? getOrdinalColorScale(_extends({
|
|
39
39
|
values: axis.data
|
|
40
|
-
}, axis.colorMap)) : getColorScale(axis.colorMap
|
|
40
|
+
}, axis.colorMap)) : getColorScale(axis.colorMap.type === 'continuous' ? _extends({
|
|
41
|
+
min: axis.min,
|
|
42
|
+
max: axis.max
|
|
43
|
+
}, axis.colorMap) : axis.colorMap))
|
|
41
44
|
});
|
|
42
45
|
});
|
|
43
46
|
return {
|
|
@@ -83,7 +86,9 @@ process.env.NODE_ENV !== "production" ? ZAxisContextProvider.propTypes = {
|
|
|
83
86
|
})]),
|
|
84
87
|
data: PropTypes.array,
|
|
85
88
|
dataKey: PropTypes.string,
|
|
86
|
-
id: PropTypes.string
|
|
89
|
+
id: PropTypes.string,
|
|
90
|
+
max: PropTypes.number,
|
|
91
|
+
min: PropTypes.number
|
|
87
92
|
}))
|
|
88
93
|
} : void 0;
|
|
89
94
|
export { ZAxisContextProvider };
|
package/esm/hooks/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './useDrawingArea';
|
|
2
2
|
export * from './useChartId';
|
|
3
3
|
export * from './useScale';
|
|
4
|
+
export * from './useAxis';
|
|
4
5
|
export * from './useColorScale';
|
|
5
6
|
export * from './useSvgRef';
|
|
6
7
|
export { useSeries as unstable_useSeries, usePieSeries as unstable_usePieSeries, useLineSeries as unstable_useLineSeries, useBarSeries as unstable_useBarSeries, useScatterSeries as unstable_useScatterSeries } from './useSeries';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useCartesianContext } from '../context/CartesianProvider';
|
|
2
|
+
export function useXAxis(identifier) {
|
|
3
|
+
const {
|
|
4
|
+
xAxis,
|
|
5
|
+
xAxisIds
|
|
6
|
+
} = useCartesianContext();
|
|
7
|
+
const id = typeof identifier === 'string' ? identifier : xAxisIds[identifier ?? 0];
|
|
8
|
+
return xAxis[id];
|
|
9
|
+
}
|
|
10
|
+
export function useYAxis(identifier) {
|
|
11
|
+
const {
|
|
12
|
+
yAxis,
|
|
13
|
+
yAxisIds
|
|
14
|
+
} = useCartesianContext();
|
|
15
|
+
const id = typeof identifier === 'string' ? identifier : yAxisIds[identifier ?? 0];
|
|
16
|
+
return yAxis[id];
|
|
17
|
+
}
|
|
@@ -98,7 +98,7 @@ export const useAxisEvents = disableAxisListener => {
|
|
|
98
98
|
};
|
|
99
99
|
const handleMove = event => {
|
|
100
100
|
const target = 'targetTouches' in event ? event.targetTouches[0] : event;
|
|
101
|
-
const svgPoint = getSVGPoint(
|
|
101
|
+
const svgPoint = getSVGPoint(element, target);
|
|
102
102
|
mousePosition.current = {
|
|
103
103
|
x: svgPoint.x,
|
|
104
104
|
y: svgPoint.y
|
|
@@ -121,15 +121,26 @@ export const useAxisEvents = disableAxisListener => {
|
|
|
121
121
|
}
|
|
122
122
|
});
|
|
123
123
|
};
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
const handleDown = event => {
|
|
125
|
+
const target = event.currentTarget;
|
|
126
|
+
if (!target) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (target.hasPointerCapture(event.pointerId)) {
|
|
130
|
+
target.releasePointerCapture(event.pointerId);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
element.addEventListener('pointerdown', handleDown);
|
|
134
|
+
element.addEventListener('pointermove', handleMove);
|
|
135
|
+
element.addEventListener('pointerout', handleOut);
|
|
136
|
+
element.addEventListener('pointercancel', handleOut);
|
|
137
|
+
element.addEventListener('pointerleave', handleOut);
|
|
128
138
|
return () => {
|
|
129
|
-
element.removeEventListener('
|
|
130
|
-
element.removeEventListener('
|
|
131
|
-
element.removeEventListener('
|
|
132
|
-
element.removeEventListener('
|
|
139
|
+
element.removeEventListener('pointerdown', handleDown);
|
|
140
|
+
element.removeEventListener('pointermove', handleMove);
|
|
141
|
+
element.removeEventListener('pointerout', handleOut);
|
|
142
|
+
element.removeEventListener('pointercancel', handleOut);
|
|
143
|
+
element.removeEventListener('pointerleave', handleOut);
|
|
133
144
|
};
|
|
134
145
|
}, [svgRef, dispatch, left, width, top, height, usedYAxis, yAxis, usedXAxis, xAxis, disableAxisListener]);
|
|
135
146
|
};
|
|
@@ -13,7 +13,12 @@ export const useInteractionItemProps = skip => {
|
|
|
13
13
|
return () => ({});
|
|
14
14
|
}
|
|
15
15
|
const getInteractionItemProps = data => {
|
|
16
|
-
const
|
|
16
|
+
const onPointerDown = event => {
|
|
17
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
18
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const onPointerEnter = () => {
|
|
17
22
|
dispatchInteraction({
|
|
18
23
|
type: 'enterItem',
|
|
19
24
|
data
|
|
@@ -23,7 +28,8 @@ export const useInteractionItemProps = skip => {
|
|
|
23
28
|
dataIndex: data.dataIndex
|
|
24
29
|
});
|
|
25
30
|
};
|
|
26
|
-
const
|
|
31
|
+
const onPointerLeave = event => {
|
|
32
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
27
33
|
dispatchInteraction({
|
|
28
34
|
type: 'leaveItem',
|
|
29
35
|
data
|
|
@@ -31,8 +37,9 @@ export const useInteractionItemProps = skip => {
|
|
|
31
37
|
clearHighlighted();
|
|
32
38
|
};
|
|
33
39
|
return {
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
onPointerEnter,
|
|
41
|
+
onPointerLeave,
|
|
42
|
+
onPointerDown
|
|
36
43
|
};
|
|
37
44
|
};
|
|
38
45
|
return getInteractionItemProps;
|
package/esm/hooks/useScale.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { useCartesianContext } from '../context/CartesianProvider';
|
|
2
1
|
import { isBandScale } from '../internals/isBandScale';
|
|
2
|
+
import { useXAxis, useYAxis } from './useAxis';
|
|
3
|
+
|
|
3
4
|
/**
|
|
4
5
|
* For a given scale return a function that map value to their position.
|
|
5
6
|
* Useful when dealing with specific scale such as band.
|
|
@@ -13,18 +14,10 @@ export function getValueToPositionMapper(scale) {
|
|
|
13
14
|
return value => scale(value);
|
|
14
15
|
}
|
|
15
16
|
export function useXScale(identifier) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
xAxisIds
|
|
19
|
-
} = useCartesianContext();
|
|
20
|
-
const id = typeof identifier === 'string' ? identifier : xAxisIds[identifier ?? 0];
|
|
21
|
-
return xAxis[id].scale;
|
|
17
|
+
const axis = useXAxis(identifier);
|
|
18
|
+
return axis.scale;
|
|
22
19
|
}
|
|
23
20
|
export function useYScale(identifier) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
yAxisIds
|
|
27
|
-
} = useCartesianContext();
|
|
28
|
-
const id = typeof identifier === 'string' ? identifier : yAxisIds[identifier ?? 0];
|
|
29
|
-
return yAxis[id].scale;
|
|
21
|
+
const axis = useYAxis(identifier);
|
|
22
|
+
return axis.scale;
|
|
30
23
|
}
|
package/esm/internals/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from '../ResponsiveChartContainer/ResizableContainer';
|
|
|
6
6
|
// hooks
|
|
7
7
|
export { useReducedMotion } from '../hooks/useReducedMotion';
|
|
8
8
|
export { useSeries } from '../hooks/useSeries';
|
|
9
|
+
export { useInteractionItemProps } from '../hooks/useInteractionItemProps';
|
|
9
10
|
export { useDrawingArea } from '../hooks/useDrawingArea';
|
|
10
11
|
export { useChartContainerHooks } from '../ChartContainer/useChartContainerHooks';
|
|
11
12
|
export { useScatterChartProps } from '../ScatterChart/useScatterChartProps';
|
|
@@ -15,6 +16,7 @@ export { useBarChartProps } from '../BarChart/useBarChartProps';
|
|
|
15
16
|
// utils
|
|
16
17
|
export * from './defaultizeValueFormatter';
|
|
17
18
|
export * from './configInit';
|
|
19
|
+
export * from './getLabel';
|
|
18
20
|
export * from './getSVGPoint';
|
|
19
21
|
|
|
20
22
|
// contexts
|
package/hooks/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './useDrawingArea';
|
|
2
2
|
export * from './useChartId';
|
|
3
3
|
export * from './useScale';
|
|
4
|
+
export * from './useAxis';
|
|
4
5
|
export * from './useColorScale';
|
|
5
6
|
export * from './useSvgRef';
|
|
6
7
|
export { useSeries as unstable_useSeries, usePieSeries as unstable_usePieSeries, useLineSeries as unstable_useLineSeries, useBarSeries as unstable_useBarSeries, useScatterSeries as unstable_useScatterSeries, } from './useSeries';
|
package/hooks/index.js
CHANGED
|
@@ -76,6 +76,18 @@ Object.keys(_useScale).forEach(function (key) {
|
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
78
|
});
|
|
79
|
+
var _useAxis = require("./useAxis");
|
|
80
|
+
Object.keys(_useAxis).forEach(function (key) {
|
|
81
|
+
if (key === "default" || key === "__esModule") return;
|
|
82
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
83
|
+
if (key in exports && exports[key] === _useAxis[key]) return;
|
|
84
|
+
Object.defineProperty(exports, key, {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () {
|
|
87
|
+
return _useAxis[key];
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
79
91
|
var _useColorScale = require("./useColorScale");
|
|
80
92
|
Object.keys(_useColorScale).forEach(function (key) {
|
|
81
93
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare function useXAxis(identifier?: number | string): import("../internals").AxisDefaultized<keyof import("../internals").AxisScaleConfig, any, import("..").ChartsXAxisProps>;
|
|
2
|
+
export declare function useYAxis(identifier?: number | string): import("../internals").AxisDefaultized<keyof import("../internals").AxisScaleConfig, any, import("..").ChartsYAxisProps>;
|
package/hooks/useAxis.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useXAxis = useXAxis;
|
|
7
|
+
exports.useYAxis = useYAxis;
|
|
8
|
+
var _CartesianProvider = require("../context/CartesianProvider");
|
|
9
|
+
function useXAxis(identifier) {
|
|
10
|
+
const {
|
|
11
|
+
xAxis,
|
|
12
|
+
xAxisIds
|
|
13
|
+
} = (0, _CartesianProvider.useCartesianContext)();
|
|
14
|
+
const id = typeof identifier === 'string' ? identifier : xAxisIds[identifier ?? 0];
|
|
15
|
+
return xAxis[id];
|
|
16
|
+
}
|
|
17
|
+
function useYAxis(identifier) {
|
|
18
|
+
const {
|
|
19
|
+
yAxis,
|
|
20
|
+
yAxisIds
|
|
21
|
+
} = (0, _CartesianProvider.useCartesianContext)();
|
|
22
|
+
const id = typeof identifier === 'string' ? identifier : yAxisIds[identifier ?? 0];
|
|
23
|
+
return yAxis[id];
|
|
24
|
+
}
|
package/hooks/useAxisEvents.js
CHANGED
|
@@ -106,7 +106,7 @@ const useAxisEvents = disableAxisListener => {
|
|
|
106
106
|
};
|
|
107
107
|
const handleMove = event => {
|
|
108
108
|
const target = 'targetTouches' in event ? event.targetTouches[0] : event;
|
|
109
|
-
const svgPoint = (0, _getSVGPoint.getSVGPoint)(
|
|
109
|
+
const svgPoint = (0, _getSVGPoint.getSVGPoint)(element, target);
|
|
110
110
|
mousePosition.current = {
|
|
111
111
|
x: svgPoint.x,
|
|
112
112
|
y: svgPoint.y
|
|
@@ -129,15 +129,26 @@ const useAxisEvents = disableAxisListener => {
|
|
|
129
129
|
}
|
|
130
130
|
});
|
|
131
131
|
};
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
const handleDown = event => {
|
|
133
|
+
const target = event.currentTarget;
|
|
134
|
+
if (!target) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (target.hasPointerCapture(event.pointerId)) {
|
|
138
|
+
target.releasePointerCapture(event.pointerId);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
element.addEventListener('pointerdown', handleDown);
|
|
142
|
+
element.addEventListener('pointermove', handleMove);
|
|
143
|
+
element.addEventListener('pointerout', handleOut);
|
|
144
|
+
element.addEventListener('pointercancel', handleOut);
|
|
145
|
+
element.addEventListener('pointerleave', handleOut);
|
|
136
146
|
return () => {
|
|
137
|
-
element.removeEventListener('
|
|
138
|
-
element.removeEventListener('
|
|
139
|
-
element.removeEventListener('
|
|
140
|
-
element.removeEventListener('
|
|
147
|
+
element.removeEventListener('pointerdown', handleDown);
|
|
148
|
+
element.removeEventListener('pointermove', handleMove);
|
|
149
|
+
element.removeEventListener('pointerout', handleOut);
|
|
150
|
+
element.removeEventListener('pointercancel', handleOut);
|
|
151
|
+
element.removeEventListener('pointerleave', handleOut);
|
|
141
152
|
};
|
|
142
153
|
}, [svgRef, dispatch, left, width, top, height, usedYAxis, yAxis, usedXAxis, xAxis, disableAxisListener]);
|
|
143
154
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import { SeriesItemIdentifier } from '../models';
|
|
2
3
|
export declare const useInteractionItemProps: (skip?: boolean) => (() => {}) | ((data: SeriesItemIdentifier) => {
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
onPointerEnter: () => void;
|
|
5
|
+
onPointerLeave: (event: React.PointerEvent) => void;
|
|
6
|
+
onPointerDown: (event: React.PointerEvent) => void;
|
|
5
7
|
});
|
|
@@ -21,7 +21,12 @@ const useInteractionItemProps = skip => {
|
|
|
21
21
|
return () => ({});
|
|
22
22
|
}
|
|
23
23
|
const getInteractionItemProps = data => {
|
|
24
|
-
const
|
|
24
|
+
const onPointerDown = event => {
|
|
25
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
26
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const onPointerEnter = () => {
|
|
25
30
|
dispatchInteraction({
|
|
26
31
|
type: 'enterItem',
|
|
27
32
|
data
|
|
@@ -31,7 +36,8 @@ const useInteractionItemProps = skip => {
|
|
|
31
36
|
dataIndex: data.dataIndex
|
|
32
37
|
});
|
|
33
38
|
};
|
|
34
|
-
const
|
|
39
|
+
const onPointerLeave = event => {
|
|
40
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
35
41
|
dispatchInteraction({
|
|
36
42
|
type: 'leaveItem',
|
|
37
43
|
data
|
|
@@ -39,8 +45,9 @@ const useInteractionItemProps = skip => {
|
|
|
39
45
|
clearHighlighted();
|
|
40
46
|
};
|
|
41
47
|
return {
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
onPointerEnter,
|
|
49
|
+
onPointerLeave,
|
|
50
|
+
onPointerDown
|
|
44
51
|
};
|
|
45
52
|
};
|
|
46
53
|
return getInteractionItemProps;
|
package/hooks/useScale.js
CHANGED
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.getValueToPositionMapper = getValueToPositionMapper;
|
|
7
7
|
exports.useXScale = useXScale;
|
|
8
8
|
exports.useYScale = useYScale;
|
|
9
|
-
var _CartesianProvider = require("../context/CartesianProvider");
|
|
10
9
|
var _isBandScale = require("../internals/isBandScale");
|
|
10
|
+
var _useAxis = require("./useAxis");
|
|
11
11
|
/**
|
|
12
12
|
* For a given scale return a function that map value to their position.
|
|
13
13
|
* Useful when dealing with specific scale such as band.
|
|
@@ -21,18 +21,10 @@ function getValueToPositionMapper(scale) {
|
|
|
21
21
|
return value => scale(value);
|
|
22
22
|
}
|
|
23
23
|
function useXScale(identifier) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
xAxisIds
|
|
27
|
-
} = (0, _CartesianProvider.useCartesianContext)();
|
|
28
|
-
const id = typeof identifier === 'string' ? identifier : xAxisIds[identifier ?? 0];
|
|
29
|
-
return xAxis[id].scale;
|
|
24
|
+
const axis = (0, _useAxis.useXAxis)(identifier);
|
|
25
|
+
return axis.scale;
|
|
30
26
|
}
|
|
31
27
|
function useYScale(identifier) {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
yAxisIds
|
|
35
|
-
} = (0, _CartesianProvider.useCartesianContext)();
|
|
36
|
-
const id = typeof identifier === 'string' ? identifier : yAxisIds[identifier ?? 0];
|
|
37
|
-
return yAxis[id].scale;
|
|
28
|
+
const axis = (0, _useAxis.useYAxis)(identifier);
|
|
29
|
+
return axis.scale;
|
|
38
30
|
}
|
package/index.js
CHANGED
package/internals/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from '../ResponsiveChartContainer/useChartContainerDimensions';
|
|
|
3
3
|
export * from '../ResponsiveChartContainer/ResizableContainer';
|
|
4
4
|
export { useReducedMotion } from '../hooks/useReducedMotion';
|
|
5
5
|
export { useSeries } from '../hooks/useSeries';
|
|
6
|
+
export { useInteractionItemProps } from '../hooks/useInteractionItemProps';
|
|
6
7
|
export { useDrawingArea } from '../hooks/useDrawingArea';
|
|
7
8
|
export { useChartContainerHooks } from '../ChartContainer/useChartContainerHooks';
|
|
8
9
|
export { useScatterChartProps } from '../ScatterChart/useScatterChartProps';
|
|
@@ -10,6 +11,7 @@ export { useLineChartProps } from '../LineChart/useLineChartProps';
|
|
|
10
11
|
export { useBarChartProps } from '../BarChart/useBarChartProps';
|
|
11
12
|
export * from './defaultizeValueFormatter';
|
|
12
13
|
export * from './configInit';
|
|
14
|
+
export * from './getLabel';
|
|
13
15
|
export * from './getSVGPoint';
|
|
14
16
|
export * from '../context/CartesianProvider';
|
|
15
17
|
export * from '../context/DrawingProvider';
|
package/internals/index.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
var _exportNames = {
|
|
7
7
|
useReducedMotion: true,
|
|
8
8
|
useSeries: true,
|
|
9
|
+
useInteractionItemProps: true,
|
|
9
10
|
useDrawingArea: true,
|
|
10
11
|
useChartContainerHooks: true,
|
|
11
12
|
useScatterChartProps: true,
|
|
@@ -30,6 +31,12 @@ Object.defineProperty(exports, "useDrawingArea", {
|
|
|
30
31
|
return _useDrawingArea.useDrawingArea;
|
|
31
32
|
}
|
|
32
33
|
});
|
|
34
|
+
Object.defineProperty(exports, "useInteractionItemProps", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: function () {
|
|
37
|
+
return _useInteractionItemProps.useInteractionItemProps;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
33
40
|
Object.defineProperty(exports, "useLineChartProps", {
|
|
34
41
|
enumerable: true,
|
|
35
42
|
get: function () {
|
|
@@ -92,6 +99,7 @@ Object.keys(_ResizableContainer).forEach(function (key) {
|
|
|
92
99
|
});
|
|
93
100
|
var _useReducedMotion = require("../hooks/useReducedMotion");
|
|
94
101
|
var _useSeries = require("../hooks/useSeries");
|
|
102
|
+
var _useInteractionItemProps = require("../hooks/useInteractionItemProps");
|
|
95
103
|
var _useDrawingArea = require("../hooks/useDrawingArea");
|
|
96
104
|
var _useChartContainerHooks = require("../ChartContainer/useChartContainerHooks");
|
|
97
105
|
var _useScatterChartProps = require("../ScatterChart/useScatterChartProps");
|
|
@@ -121,6 +129,18 @@ Object.keys(_configInit).forEach(function (key) {
|
|
|
121
129
|
}
|
|
122
130
|
});
|
|
123
131
|
});
|
|
132
|
+
var _getLabel = require("./getLabel");
|
|
133
|
+
Object.keys(_getLabel).forEach(function (key) {
|
|
134
|
+
if (key === "default" || key === "__esModule") return;
|
|
135
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
136
|
+
if (key in exports && exports[key] === _getLabel[key]) return;
|
|
137
|
+
Object.defineProperty(exports, key, {
|
|
138
|
+
enumerable: true,
|
|
139
|
+
get: function () {
|
|
140
|
+
return _getLabel[key];
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
124
144
|
var _getSVGPoint = require("./getSVGPoint");
|
|
125
145
|
Object.keys(_getSVGPoint).forEach(function (key) {
|
|
126
146
|
if (key === "default" || key === "__esModule") return;
|
package/models/colorMapping.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export interface ContinuousColorConfig<Value = number | Date> {
|
|
|
13
13
|
/**
|
|
14
14
|
* The colors to render. It can be an array with the extremum colors, or an interpolation function.
|
|
15
15
|
*/
|
|
16
|
-
color: [string, string] | ((t: number) => string);
|
|
16
|
+
color: readonly [string, string] | ((t: number) => string);
|
|
17
17
|
}
|
|
18
18
|
export interface PiecewiseColorConfig<Value = number | Date> {
|
|
19
19
|
type: 'piecewise';
|