@coinbase/cds-mobile-visualization 3.3.0 → 3.4.0-beta.10
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/CHANGELOG.md +80 -0
- package/dts/chart/CartesianChart.d.ts +125 -0
- package/dts/chart/CartesianChart.d.ts.map +1 -0
- package/dts/chart/ChartContextBridge.d.ts +28 -0
- package/dts/chart/ChartContextBridge.d.ts.map +1 -0
- package/dts/chart/ChartProvider.d.ts +6 -0
- package/dts/chart/ChartProvider.d.ts.map +1 -0
- package/dts/chart/Path.d.ts +91 -0
- package/dts/chart/Path.d.ts.map +1 -0
- package/dts/chart/PeriodSelector.d.ts +85 -0
- package/dts/chart/PeriodSelector.d.ts.map +1 -0
- package/dts/chart/area/Area.d.ts +77 -0
- package/dts/chart/area/Area.d.ts.map +1 -0
- package/dts/chart/area/AreaChart.d.ts +131 -0
- package/dts/chart/area/AreaChart.d.ts.map +1 -0
- package/dts/chart/area/DottedArea.d.ts +46 -0
- package/dts/chart/area/DottedArea.d.ts.map +1 -0
- package/dts/chart/area/GradientArea.d.ts +36 -0
- package/dts/chart/area/GradientArea.d.ts.map +1 -0
- package/dts/chart/area/SolidArea.d.ts +23 -0
- package/dts/chart/area/SolidArea.d.ts.map +1 -0
- package/dts/chart/area/index.d.ts +6 -0
- package/dts/chart/area/index.d.ts.map +1 -0
- package/dts/chart/axis/Axis.d.ts +194 -0
- package/dts/chart/axis/Axis.d.ts.map +1 -0
- package/dts/chart/axis/DefaultAxisTickLabel.d.ts +8 -0
- package/dts/chart/axis/DefaultAxisTickLabel.d.ts.map +1 -0
- package/dts/chart/axis/XAxis.d.ts +16 -0
- package/dts/chart/axis/XAxis.d.ts.map +1 -0
- package/dts/chart/axis/YAxis.d.ts +21 -0
- package/dts/chart/axis/YAxis.d.ts.map +1 -0
- package/dts/chart/axis/index.d.ts +5 -0
- package/dts/chart/axis/index.d.ts.map +1 -0
- package/dts/chart/bar/Bar.d.ts +92 -0
- package/dts/chart/bar/Bar.d.ts.map +1 -0
- package/dts/chart/bar/BarChart.d.ts +113 -0
- package/dts/chart/bar/BarChart.d.ts.map +1 -0
- package/dts/chart/bar/BarPlot.d.ts +30 -0
- package/dts/chart/bar/BarPlot.d.ts.map +1 -0
- package/dts/chart/bar/BarStack.d.ts +102 -0
- package/dts/chart/bar/BarStack.d.ts.map +1 -0
- package/dts/chart/bar/BarStackGroup.d.ts +36 -0
- package/dts/chart/bar/BarStackGroup.d.ts.map +1 -0
- package/dts/chart/bar/DefaultBar.d.ts +7 -0
- package/dts/chart/bar/DefaultBar.d.ts.map +1 -0
- package/dts/chart/bar/DefaultBarStack.d.ts +7 -0
- package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -0
- package/dts/chart/bar/index.d.ts +8 -0
- package/dts/chart/bar/index.d.ts.map +1 -0
- package/dts/chart/gradient/Gradient.d.ts +25 -0
- package/dts/chart/gradient/Gradient.d.ts.map +1 -0
- package/dts/chart/gradient/index.d.ts +2 -0
- package/dts/chart/gradient/index.d.ts.map +1 -0
- package/dts/chart/index.d.ts +15 -0
- package/dts/chart/index.d.ts.map +1 -0
- package/dts/chart/line/DefaultReferenceLineLabel.d.ts +9 -0
- package/dts/chart/line/DefaultReferenceLineLabel.d.ts.map +1 -0
- package/dts/chart/line/DottedLine.d.ts +20 -0
- package/dts/chart/line/DottedLine.d.ts.map +1 -0
- package/dts/chart/line/Line.d.ts +115 -0
- package/dts/chart/line/Line.d.ts.map +1 -0
- package/dts/chart/line/LineChart.d.ts +118 -0
- package/dts/chart/line/LineChart.d.ts.map +1 -0
- package/dts/chart/line/ReferenceLine.d.ts +139 -0
- package/dts/chart/line/ReferenceLine.d.ts.map +1 -0
- package/dts/chart/line/SolidLine.d.ts +15 -0
- package/dts/chart/line/SolidLine.d.ts.map +1 -0
- package/dts/chart/line/index.d.ts +7 -0
- package/dts/chart/line/index.d.ts.map +1 -0
- package/dts/chart/point/DefaultPointLabel.d.ts +10 -0
- package/dts/chart/point/DefaultPointLabel.d.ts.map +1 -0
- package/dts/chart/point/Point.d.ts +120 -0
- package/dts/chart/point/Point.d.ts.map +1 -0
- package/dts/chart/point/index.d.ts +3 -0
- package/dts/chart/point/index.d.ts.map +1 -0
- package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +8 -0
- package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -0
- package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts +12 -0
- package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts.map +1 -0
- package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +11 -0
- package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -0
- package/dts/chart/scrubber/Scrubber.d.ts +233 -0
- package/dts/chart/scrubber/Scrubber.d.ts.map +1 -0
- package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +44 -0
- package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -0
- package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +31 -0
- package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -0
- package/dts/chart/scrubber/ScrubberProvider.d.ts +20 -0
- package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -0
- package/dts/chart/scrubber/index.d.ts +5 -0
- package/dts/chart/scrubber/index.d.ts.map +1 -0
- package/dts/chart/text/ChartText.d.ts +164 -0
- package/dts/chart/text/ChartText.d.ts.map +1 -0
- package/dts/chart/text/ChartTextGroup.d.ts +61 -0
- package/dts/chart/text/ChartTextGroup.d.ts.map +1 -0
- package/dts/chart/text/index.d.ts +3 -0
- package/dts/chart/text/index.d.ts.map +1 -0
- package/dts/chart/utils/axis.d.ts +342 -0
- package/dts/chart/utils/axis.d.ts.map +1 -0
- package/dts/chart/utils/bar.d.ts +20 -0
- package/dts/chart/utils/bar.d.ts.map +1 -0
- package/dts/chart/utils/chart.d.ts +124 -0
- package/dts/chart/utils/chart.d.ts.map +1 -0
- package/dts/chart/utils/context.d.ts +116 -0
- package/dts/chart/utils/context.d.ts.map +1 -0
- package/dts/chart/utils/gradient.d.ts +117 -0
- package/dts/chart/utils/gradient.d.ts.map +1 -0
- package/dts/chart/utils/index.d.ts +11 -0
- package/dts/chart/utils/index.d.ts.map +1 -0
- package/dts/chart/utils/path.d.ts +160 -0
- package/dts/chart/utils/path.d.ts.map +1 -0
- package/dts/chart/utils/point.d.ts +134 -0
- package/dts/chart/utils/point.d.ts.map +1 -0
- package/dts/chart/utils/scale.d.ts +134 -0
- package/dts/chart/utils/scale.d.ts.map +1 -0
- package/dts/chart/utils/scrubber.d.ts +39 -0
- package/dts/chart/utils/scrubber.d.ts.map +1 -0
- package/dts/chart/utils/transition.d.ts +140 -0
- package/dts/chart/utils/transition.d.ts.map +1 -0
- package/dts/index.d.ts +2 -1
- package/dts/index.d.ts.map +1 -1
- package/dts/sparkline/Counter.d.ts +7 -2
- package/dts/sparkline/Sparkline.d.ts +67 -16
- package/dts/sparkline/Sparkline.d.ts.map +1 -1
- package/dts/sparkline/SparklineArea.d.ts +10 -4
- package/dts/sparkline/SparklineArea.d.ts.map +1 -1
- package/dts/sparkline/SparklineAreaPattern.d.ts +12 -4
- package/dts/sparkline/SparklineAreaPattern.d.ts.map +1 -1
- package/dts/sparkline/SparklineGradient.d.ts +21 -10
- package/dts/sparkline/SparklineGradient.d.ts.map +1 -1
- package/dts/sparkline/__figma__/Sparkline.figma.d.ts +1 -1
- package/dts/sparkline/generateSparklineWithId.d.ts +8 -2
- package/dts/sparkline/generateSparklineWithId.d.ts.map +1 -1
- package/dts/sparkline/index.d.ts +1 -1
- package/dts/sparkline/sparkline-interactive/SparklineAccessibleView.d.ts +8 -3
- package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts +132 -110
- package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts.map +1 -1
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveAnimatedPath.d.ts +22 -9
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveAnimatedPath.d.ts.map +1 -1
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveHoverDate.d.ts +18 -7
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveLineVertical.d.ts +9 -4
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveMarkerDates.d.ts +11 -6
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveMinMax.d.ts +7 -5
- package/dts/sparkline/sparkline-interactive/SparklineInteractivePanGestureHandler.d.ts +22 -10
- package/dts/sparkline/sparkline-interactive/SparklineInteractivePaths.d.ts +21 -7
- package/dts/sparkline/sparkline-interactive/SparklineInteractivePaths.d.ts.map +1 -1
- package/dts/sparkline/sparkline-interactive/SparklineInteractivePeriodSelector.d.ts +21 -16
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveProvider.d.ts +29 -23
- package/dts/sparkline/sparkline-interactive/SparklineInteractiveTimeseriesPaths.d.ts +22 -14
- package/dts/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.d.ts +1 -1
- package/dts/sparkline/sparkline-interactive/useInterruptiblePathAnimation.d.ts +9 -5
- package/dts/sparkline/sparkline-interactive/useMinMaxTransform.d.ts +11 -6
- package/dts/sparkline/sparkline-interactive/useOpacityAnimation.d.ts +5 -2
- package/dts/sparkline/sparkline-interactive/useSparklineInteractiveConstants.d.ts +17 -17
- package/dts/sparkline/sparkline-interactive/useSparklineInteractiveLineStyles.d.ts +16 -13
- package/dts/sparkline/sparkline-interactive-header/SparklineInteractiveHeader.d.ts +106 -98
- package/dts/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.d.ts +1 -1
- package/dts/sparkline/sparkline-interactive-header/useSparklineInteractiveHeaderStyles.d.ts +22 -19
- package/esm/chart/CartesianChart.js +335 -0
- package/esm/chart/ChartContextBridge.js +148 -0
- package/esm/chart/ChartProvider.js +10 -0
- package/esm/chart/Path.js +218 -0
- package/esm/chart/PeriodSelector.js +136 -0
- package/esm/chart/__stories__/CartesianChart.stories.js +723 -0
- package/esm/chart/__stories__/Chart.stories.js +77 -0
- package/esm/chart/__stories__/PeriodSelector.stories.js +322 -0
- package/esm/chart/area/Area.js +75 -0
- package/esm/chart/area/AreaChart.js +151 -0
- package/esm/chart/area/DottedArea.js +80 -0
- package/esm/chart/area/GradientArea.js +54 -0
- package/esm/chart/area/SolidArea.js +38 -0
- package/esm/chart/area/__stories__/AreaChart.stories.js +100 -0
- package/esm/chart/area/index.js +7 -0
- package/esm/chart/axis/Axis.js +45 -0
- package/esm/chart/axis/DefaultAxisTickLabel.js +11 -0
- package/esm/chart/axis/XAxis.js +188 -0
- package/esm/chart/axis/YAxis.js +177 -0
- package/esm/chart/axis/__stories__/Axis.stories.js +276 -0
- package/esm/chart/axis/index.js +6 -0
- package/esm/chart/bar/Bar.js +69 -0
- package/esm/chart/bar/BarChart.js +125 -0
- package/esm/chart/bar/BarPlot.js +102 -0
- package/esm/chart/bar/BarStack.js +551 -0
- package/esm/chart/bar/BarStackGroup.js +79 -0
- package/esm/chart/bar/DefaultBar.js +56 -0
- package/esm/chart/bar/DefaultBarStack.js +47 -0
- package/esm/chart/bar/__stories__/BarChart.stories.js +668 -0
- package/esm/chart/bar/index.js +9 -0
- package/esm/chart/gradient/Gradient.js +53 -0
- package/esm/chart/gradient/index.js +1 -0
- package/esm/chart/index.js +16 -0
- package/esm/chart/line/DefaultReferenceLineLabel.js +66 -0
- package/esm/chart/line/DottedLine.js +50 -0
- package/esm/chart/line/Line.js +178 -0
- package/esm/chart/line/LineChart.js +121 -0
- package/esm/chart/line/ReferenceLine.js +132 -0
- package/esm/chart/line/SolidLine.js +46 -0
- package/esm/chart/line/__stories__/LineChart.stories.js +2372 -0
- package/esm/chart/line/__stories__/ReferenceLine.stories.js +132 -0
- package/esm/chart/line/index.js +8 -0
- package/esm/chart/point/DefaultPointLabel.js +39 -0
- package/esm/chart/point/Point.js +188 -0
- package/esm/chart/point/index.js +2 -0
- package/esm/chart/scrubber/DefaultScrubberBeacon.js +179 -0
- package/esm/chart/scrubber/DefaultScrubberBeaconLabel.js +43 -0
- package/esm/chart/scrubber/DefaultScrubberLabel.js +28 -0
- package/esm/chart/scrubber/Scrubber.js +166 -0
- package/esm/chart/scrubber/ScrubberBeaconGroup.js +161 -0
- package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +185 -0
- package/esm/chart/scrubber/ScrubberProvider.js +135 -0
- package/esm/chart/scrubber/index.js +4 -0
- package/esm/chart/text/ChartText.js +305 -0
- package/esm/chart/text/ChartTextGroup.js +211 -0
- package/esm/chart/text/index.js +4 -0
- package/esm/chart/utils/axis.js +592 -0
- package/esm/chart/utils/bar.js +24 -0
- package/esm/chart/utils/chart.js +270 -0
- package/esm/chart/utils/context.js +15 -0
- package/esm/chart/utils/gradient.js +305 -0
- package/esm/chart/utils/index.js +12 -0
- package/esm/chart/utils/path.js +274 -0
- package/esm/chart/utils/point.js +229 -0
- package/esm/chart/utils/scale.js +277 -0
- package/esm/chart/utils/scrubber.js +139 -0
- package/esm/chart/utils/transition.js +185 -0
- package/esm/index.js +4 -1
- package/esm/sparkline/Sparkline.js +129 -16
- package/esm/sparkline/SparklineArea.js +7 -2
- package/esm/sparkline/SparklineAreaPattern.js +4 -2
- package/esm/sparkline/SparklineGradient.js +4 -0
- package/esm/sparkline/__stories__/Sparkline.stories.js +11 -7
- package/esm/sparkline/__stories__/SparklineGradient.stories.js +7 -4
- package/esm/sparkline/generateSparklineWithId.js +3 -2
- package/esm/sparkline/sparkline-interactive/SparklineInteractive.js +5 -1
- package/esm/sparkline/sparkline-interactive/SparklineInteractiveAnimatedPath.js +5 -2
- package/esm/sparkline/sparkline-interactive/SparklineInteractivePaths.js +4 -0
- package/esm/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.js +76 -24
- package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +17 -9
- package/package.json +17 -11
- package/dts/sparkline/__stories__/Sparkline.stories.d.ts +0 -3
- package/dts/sparkline/__stories__/Sparkline.stories.d.ts.map +0 -1
- package/dts/sparkline/__stories__/SparklineGradient.stories.d.ts +0 -3
- package/dts/sparkline/__stories__/SparklineGradient.stories.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.d.ts +0 -3
- package/dts/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractive.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractive.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractiveHoverDate.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractiveHoverDate.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractivePanGestureHandler.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractivePanGestureHandler.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractivePeriodSelector.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractivePeriodSelector.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractiveTimeseriesPaths.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/__tests__/SparklineInteractiveTimeseriesPaths.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/__tests__/useMinMaxTransform.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/__tests__/useMinMaxTransform.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive/useInterruptiblePathAnimation.test.disable.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive/useInterruptiblePathAnimation.test.disable.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.d.ts +0 -4
- package/dts/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive-header/__tests__/SparklineInteractiveHeader.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive-header/__tests__/SparklineInteractiveHeader.test.d.ts.map +0 -1
- package/dts/sparkline/sparkline-interactive-header/__tests__/useSparklineInteractiveHeaderStyles.test.d.ts +0 -2
- package/dts/sparkline/sparkline-interactive-header/__tests__/useSparklineInteractiveHeaderStyles.test.d.ts.map +0 -1
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
const _excluded = ["series", "children", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "width", "height", "style", "styles", "allowOverflowGestures", "fontFamilies", "fontProvider", "collapsable"];
|
|
2
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
3
|
+
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
4
|
+
import React, { forwardRef, memo, useCallback, useMemo } from 'react';
|
|
5
|
+
import { useLayout } from '@coinbase/cds-mobile/hooks/useLayout';
|
|
6
|
+
import { Box } from '@coinbase/cds-mobile/layout';
|
|
7
|
+
import { Canvas, Skia } from '@shopify/react-native-skia';
|
|
8
|
+
import { ScrubberProvider } from './scrubber/ScrubberProvider';
|
|
9
|
+
import { convertToSerializableScale } from './utils/scale';
|
|
10
|
+
import { useChartContextBridge } from './ChartContextBridge';
|
|
11
|
+
import { CartesianChartProvider } from './ChartProvider';
|
|
12
|
+
import { defaultAxisId, defaultChartInset, getAxisConfig, getAxisDomain, getAxisRange, getAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
|
|
13
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
+
const ChartCanvas = /*#__PURE__*/memo(_ref => {
|
|
15
|
+
let {
|
|
16
|
+
children,
|
|
17
|
+
style
|
|
18
|
+
} = _ref;
|
|
19
|
+
const ContextBridge = useChartContextBridge();
|
|
20
|
+
return /*#__PURE__*/_jsx(Canvas, {
|
|
21
|
+
style: [{
|
|
22
|
+
width: '100%',
|
|
23
|
+
height: '100%'
|
|
24
|
+
}, style],
|
|
25
|
+
children: /*#__PURE__*/_jsx(ContextBridge, {
|
|
26
|
+
children: children
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2, ref) => {
|
|
31
|
+
let {
|
|
32
|
+
series,
|
|
33
|
+
children,
|
|
34
|
+
animate = true,
|
|
35
|
+
enableScrubbing,
|
|
36
|
+
xAxis: xAxisConfigProp,
|
|
37
|
+
yAxis: yAxisConfigProp,
|
|
38
|
+
inset,
|
|
39
|
+
onScrubberPositionChange,
|
|
40
|
+
width = '100%',
|
|
41
|
+
height = '100%',
|
|
42
|
+
style,
|
|
43
|
+
styles,
|
|
44
|
+
allowOverflowGestures,
|
|
45
|
+
fontFamilies,
|
|
46
|
+
fontProvider: fontProviderProp,
|
|
47
|
+
// React Native will collapse views by default when only used
|
|
48
|
+
// to group children, which interferes with gesture-handler
|
|
49
|
+
// https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/gesture-detector/#:~:text=%7B%0A%20%20return%20%3C-,View,-collapsable%3D%7B
|
|
50
|
+
collapsable = false
|
|
51
|
+
} = _ref2,
|
|
52
|
+
props = _objectWithoutPropertiesLoose(_ref2, _excluded);
|
|
53
|
+
const [containerLayout, onContainerLayout] = useLayout();
|
|
54
|
+
const chartWidth = containerLayout.width;
|
|
55
|
+
const chartHeight = containerLayout.height;
|
|
56
|
+
const calculatedInset = useMemo(() => getChartInset(inset, defaultChartInset), [inset]);
|
|
57
|
+
|
|
58
|
+
// there can only be one x axis but the helper function always returns an array
|
|
59
|
+
const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp)[0], [xAxisConfigProp]);
|
|
60
|
+
const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigProp), [yAxisConfigProp]);
|
|
61
|
+
const {
|
|
62
|
+
renderedAxes,
|
|
63
|
+
registerAxis,
|
|
64
|
+
unregisterAxis,
|
|
65
|
+
axisPadding
|
|
66
|
+
} = useTotalAxisPadding();
|
|
67
|
+
const totalInset = useMemo(() => ({
|
|
68
|
+
top: calculatedInset.top + axisPadding.top,
|
|
69
|
+
right: calculatedInset.right + axisPadding.right,
|
|
70
|
+
bottom: calculatedInset.bottom + axisPadding.bottom,
|
|
71
|
+
left: calculatedInset.left + axisPadding.left
|
|
72
|
+
}), [calculatedInset, axisPadding]);
|
|
73
|
+
const chartRect = useMemo(() => {
|
|
74
|
+
if (chartWidth <= 0 || chartHeight <= 0) return {
|
|
75
|
+
x: 0,
|
|
76
|
+
y: 0,
|
|
77
|
+
width: 0,
|
|
78
|
+
height: 0
|
|
79
|
+
};
|
|
80
|
+
const availableWidth = chartWidth - totalInset.left - totalInset.right;
|
|
81
|
+
const availableHeight = chartHeight - totalInset.top - totalInset.bottom;
|
|
82
|
+
return {
|
|
83
|
+
x: totalInset.left,
|
|
84
|
+
y: totalInset.top,
|
|
85
|
+
width: availableWidth > 0 ? availableWidth : 0,
|
|
86
|
+
height: availableHeight > 0 ? availableHeight : 0
|
|
87
|
+
};
|
|
88
|
+
}, [chartHeight, chartWidth, totalInset]);
|
|
89
|
+
const {
|
|
90
|
+
xAxis,
|
|
91
|
+
xScale
|
|
92
|
+
} = useMemo(() => {
|
|
93
|
+
if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
|
|
94
|
+
xAxis: undefined,
|
|
95
|
+
xScale: undefined
|
|
96
|
+
};
|
|
97
|
+
const domain = getAxisDomain(xAxisConfig, series != null ? series : [], 'x');
|
|
98
|
+
const range = getAxisRange(xAxisConfig, chartRect, 'x');
|
|
99
|
+
const axisConfig = {
|
|
100
|
+
scaleType: xAxisConfig.scaleType,
|
|
101
|
+
domain,
|
|
102
|
+
range,
|
|
103
|
+
data: xAxisConfig.data,
|
|
104
|
+
categoryPadding: xAxisConfig.categoryPadding,
|
|
105
|
+
domainLimit: xAxisConfig.domainLimit
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Create the scale
|
|
109
|
+
const scale = getAxisScale({
|
|
110
|
+
config: axisConfig,
|
|
111
|
+
type: 'x',
|
|
112
|
+
range: axisConfig.range,
|
|
113
|
+
dataDomain: axisConfig.domain
|
|
114
|
+
});
|
|
115
|
+
if (!scale) return {
|
|
116
|
+
xAxis: undefined,
|
|
117
|
+
xScale: undefined
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Update axis config with actual scale domain (after .nice() or other adjustments)
|
|
121
|
+
const scaleDomain = scale.domain();
|
|
122
|
+
const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
|
|
123
|
+
min: scaleDomain[0],
|
|
124
|
+
max: scaleDomain[1]
|
|
125
|
+
} : axisConfig.domain;
|
|
126
|
+
const finalAxisConfig = _extends({}, axisConfig, {
|
|
127
|
+
domain: actualDomain
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
xAxis: finalAxisConfig,
|
|
131
|
+
xScale: scale
|
|
132
|
+
};
|
|
133
|
+
}, [xAxisConfig, series, chartRect]);
|
|
134
|
+
const xSerializableScale = useMemo(() => {
|
|
135
|
+
if (!xScale) return;
|
|
136
|
+
return convertToSerializableScale(xScale);
|
|
137
|
+
}, [xScale]);
|
|
138
|
+
const {
|
|
139
|
+
yAxes,
|
|
140
|
+
yScales
|
|
141
|
+
} = useMemo(() => {
|
|
142
|
+
const axes = new Map();
|
|
143
|
+
const scales = new Map();
|
|
144
|
+
if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
|
|
145
|
+
yAxes: axes,
|
|
146
|
+
yScales: scales
|
|
147
|
+
};
|
|
148
|
+
yAxisConfig.forEach(axisParam => {
|
|
149
|
+
var _axisParam$id, _series$filter, _axisParam$domainLimi;
|
|
150
|
+
const axisId = (_axisParam$id = axisParam.id) != null ? _axisParam$id : defaultAxisId;
|
|
151
|
+
|
|
152
|
+
// Get relevant series data
|
|
153
|
+
const relevantSeries = (_series$filter = series == null ? void 0 : series.filter(s => {
|
|
154
|
+
var _s$yAxisId;
|
|
155
|
+
return ((_s$yAxisId = s.yAxisId) != null ? _s$yAxisId : defaultAxisId) === axisId;
|
|
156
|
+
})) != null ? _series$filter : [];
|
|
157
|
+
|
|
158
|
+
// Calculate domain and range
|
|
159
|
+
const dataDomain = getAxisDomain(axisParam, relevantSeries, 'y');
|
|
160
|
+
const range = getAxisRange(axisParam, chartRect, 'y');
|
|
161
|
+
const axisConfig = {
|
|
162
|
+
scaleType: axisParam.scaleType,
|
|
163
|
+
domain: dataDomain,
|
|
164
|
+
range,
|
|
165
|
+
data: axisParam.data,
|
|
166
|
+
categoryPadding: axisParam.categoryPadding,
|
|
167
|
+
domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) != null ? _axisParam$domainLimi : 'nice'
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Create the scale
|
|
171
|
+
const scale = getAxisScale({
|
|
172
|
+
config: axisConfig,
|
|
173
|
+
type: 'y',
|
|
174
|
+
range: axisConfig.range,
|
|
175
|
+
dataDomain: axisConfig.domain
|
|
176
|
+
});
|
|
177
|
+
if (scale) {
|
|
178
|
+
scales.set(axisId, scale);
|
|
179
|
+
|
|
180
|
+
// Update axis config with actual scale domain (after .nice() or other adjustments)
|
|
181
|
+
const scaleDomain = scale.domain();
|
|
182
|
+
const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
|
|
183
|
+
min: scaleDomain[0],
|
|
184
|
+
max: scaleDomain[1]
|
|
185
|
+
} : axisConfig.domain;
|
|
186
|
+
axes.set(axisId, _extends({}, axisConfig, {
|
|
187
|
+
domain: actualDomain
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
yAxes: axes,
|
|
193
|
+
yScales: scales
|
|
194
|
+
};
|
|
195
|
+
}, [yAxisConfig, series, chartRect]);
|
|
196
|
+
|
|
197
|
+
// We need a set of serialized scales usable in UI thread
|
|
198
|
+
const ySerializableScales = useMemo(() => {
|
|
199
|
+
const serializableScales = new Map();
|
|
200
|
+
yScales.forEach((scale, id) => {
|
|
201
|
+
const serializableScale = convertToSerializableScale(scale);
|
|
202
|
+
if (serializableScale) {
|
|
203
|
+
serializableScales.set(id, serializableScale);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
return serializableScales;
|
|
207
|
+
}, [yScales]);
|
|
208
|
+
const getXAxis = useCallback(() => xAxis, [xAxis]);
|
|
209
|
+
const getYAxis = useCallback(id => yAxes.get(id != null ? id : defaultAxisId), [yAxes]);
|
|
210
|
+
const getXScale = useCallback(() => xScale, [xScale]);
|
|
211
|
+
const getYScale = useCallback(id => yScales.get(id != null ? id : defaultAxisId), [yScales]);
|
|
212
|
+
const getXSerializableScale = useCallback(() => xSerializableScale, [xSerializableScale]);
|
|
213
|
+
const getYSerializableScale = useCallback(id => ySerializableScales.get(id != null ? id : defaultAxisId), [ySerializableScales]);
|
|
214
|
+
const getSeries = useCallback(seriesId => series == null ? void 0 : series.find(s => s.id === seriesId), [series]);
|
|
215
|
+
const stackedDataMap = useMemo(() => {
|
|
216
|
+
if (!series) return new Map();
|
|
217
|
+
return calculateStackedSeriesData(series);
|
|
218
|
+
}, [series]);
|
|
219
|
+
const getStackedSeriesData = useCallback(seriesId => {
|
|
220
|
+
if (!seriesId) return undefined;
|
|
221
|
+
return stackedDataMap.get(seriesId);
|
|
222
|
+
}, [stackedDataMap]);
|
|
223
|
+
const dataLength = useMemo(() => {
|
|
224
|
+
// If xAxis has categorical data, use that length
|
|
225
|
+
if (xAxisConfig.data && xAxisConfig.data.length > 0) {
|
|
226
|
+
return xAxisConfig.data.length;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Otherwise, find the longest series
|
|
230
|
+
if (!series || series.length === 0) return 0;
|
|
231
|
+
return series.reduce((max, s) => {
|
|
232
|
+
var _seriesData$length;
|
|
233
|
+
const seriesData = getStackedSeriesData(s.id);
|
|
234
|
+
return Math.max(max, (_seriesData$length = seriesData == null ? void 0 : seriesData.length) != null ? _seriesData$length : 0);
|
|
235
|
+
}, 0);
|
|
236
|
+
}, [xAxisConfig.data, series, getStackedSeriesData]);
|
|
237
|
+
const getAxisBounds = useCallback(axisId => {
|
|
238
|
+
const axis = renderedAxes.get(axisId);
|
|
239
|
+
if (!axis || !chartRect) return;
|
|
240
|
+
const axesAtPosition = Array.from(renderedAxes.values()).filter(a => a.position === axis.position).sort((a, b) => a.id.localeCompare(b.id));
|
|
241
|
+
const axisIndex = axesAtPosition.findIndex(a => a.id === axisId);
|
|
242
|
+
if (axisIndex === -1) return;
|
|
243
|
+
|
|
244
|
+
// Calculate offset from previous axes at the same position
|
|
245
|
+
const offsetFromPreviousAxes = axesAtPosition.slice(0, axisIndex).reduce((sum, a) => sum + a.size, 0);
|
|
246
|
+
if (axis.position === 'top') {
|
|
247
|
+
// Position above the chart rect, accounting for user inset
|
|
248
|
+
const startY = calculatedInset.top + offsetFromPreviousAxes;
|
|
249
|
+
return {
|
|
250
|
+
x: chartRect.x,
|
|
251
|
+
y: startY,
|
|
252
|
+
width: chartRect.width,
|
|
253
|
+
height: axis.size
|
|
254
|
+
};
|
|
255
|
+
} else if (axis.position === 'bottom') {
|
|
256
|
+
// Position below the chart rect, accounting for user inset
|
|
257
|
+
const startY = chartRect.y + chartRect.height + offsetFromPreviousAxes;
|
|
258
|
+
return {
|
|
259
|
+
x: chartRect.x,
|
|
260
|
+
y: startY,
|
|
261
|
+
width: chartRect.width,
|
|
262
|
+
height: axis.size
|
|
263
|
+
};
|
|
264
|
+
} else if (axis.position === 'left') {
|
|
265
|
+
// Position to the left of the chart rect, accounting for user inset
|
|
266
|
+
const startX = calculatedInset.left + offsetFromPreviousAxes;
|
|
267
|
+
return {
|
|
268
|
+
x: startX,
|
|
269
|
+
y: chartRect.y,
|
|
270
|
+
width: axis.size,
|
|
271
|
+
height: chartRect.height
|
|
272
|
+
};
|
|
273
|
+
} else {
|
|
274
|
+
// right - position to the right of the chart rect, accounting for user inset
|
|
275
|
+
const startX = chartRect.x + chartRect.width + offsetFromPreviousAxes;
|
|
276
|
+
return {
|
|
277
|
+
x: startX,
|
|
278
|
+
y: chartRect.y,
|
|
279
|
+
width: axis.size,
|
|
280
|
+
height: chartRect.height
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}, [renderedAxes, chartRect, calculatedInset]);
|
|
284
|
+
const fontProvider = useMemo(() => {
|
|
285
|
+
if (fontProviderProp) return fontProviderProp;
|
|
286
|
+
return Skia.TypefaceFontProvider.Make();
|
|
287
|
+
}, [fontProviderProp]);
|
|
288
|
+
const contextValue = useMemo(() => ({
|
|
289
|
+
series: series != null ? series : [],
|
|
290
|
+
getSeries,
|
|
291
|
+
getSeriesData: getStackedSeriesData,
|
|
292
|
+
animate,
|
|
293
|
+
width: chartWidth,
|
|
294
|
+
height: chartHeight,
|
|
295
|
+
fontFamilies,
|
|
296
|
+
fontProvider,
|
|
297
|
+
getXAxis,
|
|
298
|
+
getYAxis,
|
|
299
|
+
getXScale,
|
|
300
|
+
getYScale,
|
|
301
|
+
getXSerializableScale,
|
|
302
|
+
getYSerializableScale,
|
|
303
|
+
drawingArea: chartRect,
|
|
304
|
+
dataLength,
|
|
305
|
+
registerAxis,
|
|
306
|
+
unregisterAxis,
|
|
307
|
+
getAxisBounds
|
|
308
|
+
}), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, fontFamilies, fontProvider, getXAxis, getYAxis, getXScale, getYScale, getXSerializableScale, getYSerializableScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
|
|
309
|
+
const rootStyles = useMemo(() => {
|
|
310
|
+
return [style, styles == null ? void 0 : styles.root];
|
|
311
|
+
}, [style, styles == null ? void 0 : styles.root]);
|
|
312
|
+
return /*#__PURE__*/_jsx(CartesianChartProvider, {
|
|
313
|
+
value: contextValue,
|
|
314
|
+
children: /*#__PURE__*/_jsx(ScrubberProvider, {
|
|
315
|
+
allowOverflowGestures: allowOverflowGestures,
|
|
316
|
+
enableScrubbing: enableScrubbing,
|
|
317
|
+
onScrubberPositionChange: onScrubberPositionChange,
|
|
318
|
+
children: /*#__PURE__*/_jsx(Box, _extends({
|
|
319
|
+
ref: ref,
|
|
320
|
+
accessibilityLiveRegion: "polite",
|
|
321
|
+
accessibilityRole: "image",
|
|
322
|
+
collapsable: collapsable,
|
|
323
|
+
height: height,
|
|
324
|
+
onLayout: onContainerLayout,
|
|
325
|
+
style: rootStyles,
|
|
326
|
+
width: width
|
|
327
|
+
}, props, {
|
|
328
|
+
children: /*#__PURE__*/_jsx(ChartCanvas, {
|
|
329
|
+
style: styles == null ? void 0 : styles.chart,
|
|
330
|
+
children: children
|
|
331
|
+
})
|
|
332
|
+
}))
|
|
333
|
+
})
|
|
334
|
+
});
|
|
335
|
+
}));
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
/**
|
|
3
|
+
* Simplified context bridge utilities for React Native.
|
|
4
|
+
* Adapted from its-fine to enable context sharing across React renderers
|
|
5
|
+
* https://github.com/pmndrs/its-fine/blob/598b81f02778c22ed21121c2b1a786bdefb14e23/src/index.tsx
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Represents a react-internal tree node.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Represents a tree node selector for traversal.
|
|
16
|
+
*/
|
|
17
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
|
+
/**
|
|
19
|
+
* Traverses up or down a React tree, return `true` to stop and select a node.
|
|
20
|
+
*/
|
|
21
|
+
function traverseTreeNode(node, ascending, selector) {
|
|
22
|
+
if (!node) return;
|
|
23
|
+
if (selector(node) === true) return node;
|
|
24
|
+
let child = ascending ? node.return : node.child;
|
|
25
|
+
while (child) {
|
|
26
|
+
const match = traverseTreeNode(child, ascending, selector);
|
|
27
|
+
if (match) return match;
|
|
28
|
+
child = ascending ? null : child.sibling;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Wraps context to hide React development warnings about using contexts between renderers.
|
|
34
|
+
*/
|
|
35
|
+
function wrapContext(context) {
|
|
36
|
+
try {
|
|
37
|
+
return Object.defineProperties(context, {
|
|
38
|
+
_currentRenderer: {
|
|
39
|
+
get() {
|
|
40
|
+
return null;
|
|
41
|
+
},
|
|
42
|
+
set() {}
|
|
43
|
+
},
|
|
44
|
+
_currentRenderer2: {
|
|
45
|
+
get() {
|
|
46
|
+
return null;
|
|
47
|
+
},
|
|
48
|
+
set() {}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
} catch (_) {
|
|
52
|
+
return context;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// In development, React will warn about using contexts between renderers.
|
|
57
|
+
// Suppress the warning because our context bridge fixes this issue
|
|
58
|
+
const error = console.error;
|
|
59
|
+
console.error = function () {
|
|
60
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
61
|
+
args[_key] = arguments[_key];
|
|
62
|
+
}
|
|
63
|
+
const message = args.join('');
|
|
64
|
+
if (message != null && message.startsWith('Warning:') && message.includes('useContext')) {
|
|
65
|
+
console.error = error;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
return error.apply(this, args);
|
|
69
|
+
};
|
|
70
|
+
const TreeNodeContext = wrapContext(/*#__PURE__*/React.createContext(null));
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A react-internal tree node provider that binds React children to the React tree for chart context bridging.
|
|
74
|
+
*/
|
|
75
|
+
export class ChartBridgeProvider extends React.Component {
|
|
76
|
+
render() {
|
|
77
|
+
return /*#__PURE__*/_jsx(TreeNodeContext.Provider, {
|
|
78
|
+
value: this._reactInternals,
|
|
79
|
+
children: this.props.children
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Returns the current react-internal tree node.
|
|
86
|
+
*/
|
|
87
|
+
function useTreeNode() {
|
|
88
|
+
const root = React.useContext(TreeNodeContext);
|
|
89
|
+
if (root === null) throw new Error('useTreeNode must be called within a <ChartBridgeProvider />!');
|
|
90
|
+
const id = React.useId();
|
|
91
|
+
const treeNode = React.useMemo(() => {
|
|
92
|
+
for (const maybeNode of [root, root == null ? void 0 : root.alternate]) {
|
|
93
|
+
if (!maybeNode) continue;
|
|
94
|
+
const node = traverseTreeNode(maybeNode, false, node => {
|
|
95
|
+
let state = node.memoizedState;
|
|
96
|
+
while (state) {
|
|
97
|
+
if (state.memoizedState === id) return true;
|
|
98
|
+
state = state.next;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (node) return node;
|
|
102
|
+
}
|
|
103
|
+
}, [root, id]);
|
|
104
|
+
return treeNode;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Returns a map of all contexts and their values.
|
|
108
|
+
*/
|
|
109
|
+
function useContextMap() {
|
|
110
|
+
const treeNode = useTreeNode();
|
|
111
|
+
const [contextMap] = React.useState(() => new Map());
|
|
112
|
+
|
|
113
|
+
// Collect live context
|
|
114
|
+
contextMap.clear();
|
|
115
|
+
let node = treeNode;
|
|
116
|
+
while (node) {
|
|
117
|
+
if (node.type && typeof node.type === 'object') {
|
|
118
|
+
// https://github.com/facebook/react/pull/28226
|
|
119
|
+
const enableRenderableContext = node.type._context === undefined && node.type.Provider === node.type;
|
|
120
|
+
const context = enableRenderableContext ? node.type : node.type._context;
|
|
121
|
+
if (context && context !== TreeNodeContext && !contextMap.has(context)) {
|
|
122
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
123
|
+
contextMap.set(context, React.useContext(wrapContext(context)));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
node = node.return;
|
|
127
|
+
}
|
|
128
|
+
return contextMap;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Represents a chart context bridge provider component.
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Returns a ChartContextBridge of live context providers to pierce Context across renderers.
|
|
137
|
+
* Pass ChartContextBridge as a component to a secondary renderer (e.g., Skia Canvas) to enable context-sharing in charts.
|
|
138
|
+
*/
|
|
139
|
+
export function useChartContextBridge() {
|
|
140
|
+
const contextMap = useContextMap();
|
|
141
|
+
|
|
142
|
+
// Flatten context and their memoized values into a `ChartContextBridge` provider
|
|
143
|
+
return React.useMemo(() => Array.from(contextMap.keys()).reduce((Prev, context) => props => /*#__PURE__*/_jsx(Prev, {
|
|
144
|
+
children: /*#__PURE__*/_jsx(context.Provider, _extends({}, props, {
|
|
145
|
+
value: contextMap.get(context)
|
|
146
|
+
}))
|
|
147
|
+
}), props => /*#__PURE__*/_jsx(ChartBridgeProvider, _extends({}, props))), [contextMap]);
|
|
148
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
const CartesianChartContext = /*#__PURE__*/createContext(undefined);
|
|
3
|
+
export const useCartesianChartContext = () => {
|
|
4
|
+
const context = useContext(CartesianChartContext);
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error('useCartesianChartContext must be used within a CartesianChart component. See http://cds.coinbase.com/components/graphs/CartesianChart.');
|
|
7
|
+
}
|
|
8
|
+
return context;
|
|
9
|
+
};
|
|
10
|
+
export const CartesianChartProvider = CartesianChartContext.Provider;
|