@coinbase/cds-mobile-visualization 3.4.0-beta.21 → 3.4.0-beta.23
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 +14 -0
- package/dts/chart/CartesianChart.d.ts +39 -7
- package/dts/chart/CartesianChart.d.ts.map +1 -1
- package/dts/chart/Path.d.ts.map +1 -1
- package/dts/chart/PeriodSelector.d.ts +18 -6
- package/dts/chart/PeriodSelector.d.ts.map +1 -1
- package/dts/chart/area/Area.d.ts +7 -0
- package/dts/chart/area/Area.d.ts.map +1 -1
- package/dts/chart/area/AreaChart.d.ts +33 -9
- package/dts/chart/area/AreaChart.d.ts.map +1 -1
- package/dts/chart/area/DottedArea.d.ts.map +1 -1
- package/dts/chart/area/GradientArea.d.ts.map +1 -1
- package/dts/chart/area/SolidArea.d.ts.map +1 -1
- package/dts/chart/axis/Axis.d.ts +3 -1
- package/dts/chart/axis/Axis.d.ts.map +1 -1
- package/dts/chart/axis/XAxis.d.ts +6 -0
- package/dts/chart/axis/XAxis.d.ts.map +1 -1
- package/dts/chart/axis/YAxis.d.ts +1 -0
- package/dts/chart/axis/YAxis.d.ts.map +1 -1
- package/dts/chart/bar/Bar.d.ts +4 -2
- package/dts/chart/bar/Bar.d.ts.map +1 -1
- package/dts/chart/bar/BarChart.d.ts +49 -9
- package/dts/chart/bar/BarChart.d.ts.map +1 -1
- package/dts/chart/bar/BarPlot.d.ts.map +1 -1
- package/dts/chart/bar/BarStack.d.ts +30 -9
- package/dts/chart/bar/BarStack.d.ts.map +1 -1
- package/dts/chart/bar/BarStackGroup.d.ts +1 -1
- package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
- package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
- package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
- package/dts/chart/gradient/Gradient.d.ts +5 -0
- package/dts/chart/gradient/Gradient.d.ts.map +1 -1
- package/dts/chart/line/DottedLine.d.ts.map +1 -1
- package/dts/chart/line/Line.d.ts +7 -0
- package/dts/chart/line/Line.d.ts.map +1 -1
- package/dts/chart/line/LineChart.d.ts +8 -5
- package/dts/chart/line/LineChart.d.ts.map +1 -1
- package/dts/chart/line/ReferenceLine.d.ts +1 -0
- package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
- package/dts/chart/line/SolidLine.d.ts.map +1 -1
- package/dts/chart/point/Point.d.ts +7 -0
- package/dts/chart/point/Point.d.ts.map +1 -1
- package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -1
- package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +2 -1
- package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -1
- package/dts/chart/scrubber/Scrubber.d.ts +8 -0
- package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
- package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -1
- package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
- package/dts/chart/utils/axis.d.ts +20 -9
- package/dts/chart/utils/axis.d.ts.map +1 -1
- package/dts/chart/utils/bar.d.ts +6 -5
- package/dts/chart/utils/bar.d.ts.map +1 -1
- package/dts/chart/utils/chart.d.ts +13 -0
- package/dts/chart/utils/chart.d.ts.map +1 -1
- package/dts/chart/utils/context.d.ts +21 -6
- package/dts/chart/utils/context.d.ts.map +1 -1
- package/dts/chart/utils/gradient.d.ts +3 -1
- package/dts/chart/utils/gradient.d.ts.map +1 -1
- package/dts/chart/utils/path.d.ts +20 -0
- package/dts/chart/utils/path.d.ts.map +1 -1
- package/dts/chart/utils/point.d.ts +7 -0
- package/dts/chart/utils/point.d.ts.map +1 -1
- package/dts/chart/utils/transition.d.ts +7 -4
- package/dts/chart/utils/transition.d.ts.map +1 -1
- package/esm/chart/CartesianChart.js +107 -68
- package/esm/chart/Path.js +18 -14
- package/esm/chart/__stories__/ChartTransitions.stories.js +6 -10
- package/esm/chart/area/Area.js +19 -9
- package/esm/chart/area/AreaChart.js +18 -13
- package/esm/chart/area/DottedArea.js +23 -17
- package/esm/chart/area/GradientArea.js +11 -6
- package/esm/chart/area/SolidArea.js +3 -1
- package/esm/chart/area/__stories__/AreaChart.stories.js +30 -2
- package/esm/chart/axis/XAxis.js +14 -21
- package/esm/chart/axis/YAxis.js +4 -3
- package/esm/chart/bar/Bar.js +9 -5
- package/esm/chart/bar/BarChart.js +34 -31
- package/esm/chart/bar/BarPlot.js +7 -5
- package/esm/chart/bar/BarStack.js +176 -36
- package/esm/chart/bar/BarStackGroup.js +37 -27
- package/esm/chart/bar/DefaultBar.js +24 -8
- package/esm/chart/bar/DefaultBarStack.js +24 -10
- package/esm/chart/bar/__stories__/BarChart.stories.js +99 -3
- package/esm/chart/gradient/Gradient.js +2 -1
- package/esm/chart/line/DottedLine.js +3 -1
- package/esm/chart/line/Line.js +36 -21
- package/esm/chart/line/LineChart.js +13 -11
- package/esm/chart/line/SolidLine.js +3 -1
- package/esm/chart/line/__stories__/LineChart.stories.js +31 -0
- package/esm/chart/point/Point.js +2 -1
- package/esm/chart/scrubber/DefaultScrubberBeacon.js +1 -1
- package/esm/chart/scrubber/DefaultScrubberLabel.js +26 -10
- package/esm/chart/scrubber/Scrubber.js +47 -21
- package/esm/chart/scrubber/ScrubberBeaconGroup.js +24 -20
- package/esm/chart/scrubber/ScrubberProvider.js +29 -24
- package/esm/chart/scrubber/__stories__/Scrubber.stories.js +135 -1
- package/esm/chart/utils/axis.js +42 -14
- package/esm/chart/utils/bar.js +6 -4
- package/esm/chart/utils/chart.js +18 -5
- package/esm/chart/utils/context.js +7 -0
- package/esm/chart/utils/gradient.js +8 -4
- package/esm/chart/utils/path.js +90 -61
- package/esm/chart/utils/point.js +28 -18
- package/esm/chart/utils/transition.js +28 -10
- package/package.json +5 -5
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CartesianChartLayout } from './context';
|
|
1
2
|
import { type ChartScaleFunction } from './scale';
|
|
2
3
|
import type { Transition } from './transition';
|
|
3
4
|
/**
|
|
@@ -19,10 +20,12 @@ export type ChartPathCurveType =
|
|
|
19
20
|
* Get the d3 curve function for a path.
|
|
20
21
|
* See https://d3js.org/d3-shape/curve
|
|
21
22
|
* @param curve - The curve type. Defaults to 'linear'.
|
|
23
|
+
* @param layout - The chart layout. Defaults to 'vertical'.
|
|
22
24
|
* @returns The d3 curve function.
|
|
23
25
|
*/
|
|
24
26
|
export declare const getPathCurveFunction: (
|
|
25
27
|
curve?: ChartPathCurveType,
|
|
28
|
+
layout?: CartesianChartLayout,
|
|
26
29
|
) => import('d3-shape').CurveFactory;
|
|
27
30
|
/**
|
|
28
31
|
* Generates an SVG line path string from data using chart scale functions.
|
|
@@ -39,7 +42,9 @@ export declare const getLinePath: ({
|
|
|
39
42
|
xScale,
|
|
40
43
|
yScale,
|
|
41
44
|
xData,
|
|
45
|
+
yData,
|
|
42
46
|
connectNulls,
|
|
47
|
+
layout,
|
|
43
48
|
}: {
|
|
44
49
|
data: (
|
|
45
50
|
| number
|
|
@@ -53,12 +58,18 @@ export declare const getLinePath: ({
|
|
|
53
58
|
xScale: ChartScaleFunction;
|
|
54
59
|
yScale: ChartScaleFunction;
|
|
55
60
|
xData?: number[];
|
|
61
|
+
yData?: number[];
|
|
56
62
|
/**
|
|
57
63
|
* When true, null values are skipped and the line connects across gaps.
|
|
58
64
|
* When false, null values create gaps in the line.
|
|
59
65
|
* @default false
|
|
60
66
|
*/
|
|
61
67
|
connectNulls?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Chart layout.
|
|
70
|
+
* @default 'vertical'
|
|
71
|
+
*/
|
|
72
|
+
layout?: CartesianChartLayout;
|
|
62
73
|
}) => string;
|
|
63
74
|
/**
|
|
64
75
|
* Generates an SVG area path string from data using chart scale functions.
|
|
@@ -88,19 +99,27 @@ export declare const getAreaPath: ({
|
|
|
88
99
|
xScale,
|
|
89
100
|
yScale,
|
|
90
101
|
xData,
|
|
102
|
+
yData,
|
|
91
103
|
connectNulls,
|
|
104
|
+
layout,
|
|
92
105
|
}: {
|
|
93
106
|
data: (number | null)[] | Array<[number, number] | null>;
|
|
94
107
|
xScale: ChartScaleFunction;
|
|
95
108
|
yScale: ChartScaleFunction;
|
|
96
109
|
curve: ChartPathCurveType;
|
|
97
110
|
xData?: number[];
|
|
111
|
+
yData?: number[];
|
|
98
112
|
/**
|
|
99
113
|
* When true, null values are skipped and the area connects across gaps.
|
|
100
114
|
* When false, null values create gaps in the area.
|
|
101
115
|
* @default false
|
|
102
116
|
*/
|
|
103
117
|
connectNulls?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Chart layout.
|
|
120
|
+
* @default 'vertical'
|
|
121
|
+
*/
|
|
122
|
+
layout?: CartesianChartLayout;
|
|
104
123
|
}) => string;
|
|
105
124
|
/**
|
|
106
125
|
* Converts line coordinates to an SVG path string.
|
|
@@ -134,6 +153,7 @@ export declare const getBarPath: (
|
|
|
134
153
|
radius: number,
|
|
135
154
|
roundTop: boolean,
|
|
136
155
|
roundBottom: boolean,
|
|
156
|
+
layout?: CartesianChartLayout,
|
|
137
157
|
) => string;
|
|
138
158
|
/**
|
|
139
159
|
* Generates an SVG path string with circles arranged in a dotted pattern within a bounding area.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/path.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/path.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,UAGxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,cAAc,GACd,UAAU,GACV,SAAS,GACT,MAAM,GACN,YAAY,GACZ,WAAW,CAAC;AAEhB;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAO,kBAA6B,EACpC,SAAQ,oBAAiC,oCA2B1C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,sEASzB;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,KAAG,MAoBH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,WAAW,GAAI,sEASzB;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,KAAG,MAwFH,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,MAE3E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GACrB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,UAAU,OAAO,EACjB,aAAa,OAAO,EACpB,SAAQ,oBAAiC,KACxC,MAgCF,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC/D,aAAa,MAAM,EACnB,SAAS,MAAM,KACd,MAgCF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TextHorizontalAlignment, TextVerticalAlignment } from '../text';
|
|
2
|
+
import type { CartesianChartLayout } from './context';
|
|
2
3
|
import { type ChartScaleFunction, type PointAnchor, type SerializableScale } from './scale';
|
|
3
4
|
/**
|
|
4
5
|
* Position a label should be placed relative to the point
|
|
@@ -99,6 +100,7 @@ export declare const projectPoints: ({
|
|
|
99
100
|
yScale,
|
|
100
101
|
xData,
|
|
101
102
|
yData,
|
|
103
|
+
layout,
|
|
102
104
|
}: {
|
|
103
105
|
data: (
|
|
104
106
|
| number
|
|
@@ -112,6 +114,11 @@ export declare const projectPoints: ({
|
|
|
112
114
|
yData?: number[];
|
|
113
115
|
xScale: ChartScaleFunction;
|
|
114
116
|
yScale: ChartScaleFunction;
|
|
117
|
+
/**
|
|
118
|
+
* Chart layout.
|
|
119
|
+
* @default 'vertical'
|
|
120
|
+
*/
|
|
121
|
+
layout?: CartesianChartLayout;
|
|
115
122
|
}) => Array<{
|
|
116
123
|
x: number;
|
|
117
124
|
y: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/point.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE9E,OAAO,EAIL,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/point.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAIL,KAAK,kBAAkB,EAGvB,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,OAAO,kBAAkB,EACzB,SAAQ,WAAsB,KAC7B,MAgCF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,EACxB,MAAM,GAAE,WAAsB,GAC7B,MAAM,CAuCR;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,EAChD,CAAC,EACD,CAAC,EACD,MAAM,EACN,MAAM,GACP,EAAE;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAM3B;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GAAI,2BAK1B;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAEzB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,iDAO3B;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,KAAG,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4CxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,kBAAkB,KAC3B;IAAE,mBAAmB,EAAE,uBAAuB,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,CAAA;CAyB1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,GAAG,MAAM,EACT,GAAG,MAAM,EACT,UAAU,kBAAkB,EAC5B,QAAQ,MAAM,KACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CA0BxB,CAAC"}
|
|
@@ -67,7 +67,7 @@ export declare const getTransition: (
|
|
|
67
67
|
value: Transition | null | undefined,
|
|
68
68
|
animate: boolean,
|
|
69
69
|
defaultValue: Transition,
|
|
70
|
-
) => Transition;
|
|
70
|
+
) => Transition | null;
|
|
71
71
|
/**
|
|
72
72
|
* @worklet
|
|
73
73
|
*/
|
|
@@ -107,7 +107,10 @@ export declare const useInterpolator: <T>(
|
|
|
107
107
|
* // Timing animation
|
|
108
108
|
* progress.value = buildTransition(1, { type: 'timing', duration: 500 });
|
|
109
109
|
*/
|
|
110
|
-
export declare const buildTransition: (
|
|
110
|
+
export declare const buildTransition: (
|
|
111
|
+
targetValue: number,
|
|
112
|
+
transition: Transition | null,
|
|
113
|
+
) => number;
|
|
111
114
|
/**
|
|
112
115
|
* Hook for path animation state and transitions.
|
|
113
116
|
*
|
|
@@ -161,12 +164,12 @@ export declare const usePathTransition: ({
|
|
|
161
164
|
* Only used when `initialPath` is provided.
|
|
162
165
|
* If not provided, falls back to `update`.
|
|
163
166
|
*/
|
|
164
|
-
enter?: Transition;
|
|
167
|
+
enter?: Transition | null;
|
|
165
168
|
/**
|
|
166
169
|
* Transition for subsequent data update animations.
|
|
167
170
|
* @default defaultTransition
|
|
168
171
|
*/
|
|
169
|
-
update?: Transition;
|
|
172
|
+
update?: Transition | null;
|
|
170
173
|
};
|
|
171
174
|
/**
|
|
172
175
|
* Transition for updates.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/transition.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAKhB,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAG7E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAAG,CACrB,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACvC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAC1C,GAAG;IACF;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAI/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,UAI7C,CAAC;
|
|
1
|
+
{"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/transition.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAKhB,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAG7E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAAG,CACrB,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACvC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAC1C,GAAG;IACF;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAI/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,UAI7C,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,UAAU,GAAG,IAAI,GAAG,SAAS,EACpC,SAAS,OAAO,EAChB,cAAc,UAAU,KACvB,UAAU,GAAG,IAGf,CAAC;AAGF;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,IAAI,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,CAAC,EAAE,EACX,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,CAAC,KACN,CAAC,CAAC;AAEP,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,SAAS,MAAM,CAAC,EAChB,OAAO,WAAW,CAAC,MAAM,CAAC,EAC1B,cAAc,YAAY,CAAC,CAAC,CAAC,EAC7B,OAAO,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,EACX,UAAU,iBAAiB,mBAc5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,YAAY,UAAU,GAAG,IAAI,KAAG,MA4BpF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,iBAAiB,GAAI,wDAK/B;IACD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ;;;;WAIG;QACH,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;QAC1B;;;WAGG;QACH,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,WAAW,CAAC,MAAM,CAkFrB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const _excluded = ["series", "children", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "legend", "legendPosition", "legendAccessibilityLabel", "width", "height", "style", "styles", "allowOverflowGestures", "fontFamilies", "fontProvider", "collapsable"];
|
|
1
|
+
const _excluded = ["series", "children", "layout", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "legend", "legendPosition", "legendAccessibilityLabel", "width", "height", "style", "styles", "allowOverflowGestures", "fontFamilies", "fontProvider", "collapsable"];
|
|
2
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
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
4
|
import React, { forwardRef, memo, useCallback, useMemo } from 'react';
|
|
@@ -10,7 +10,7 @@ import { convertToSerializableScale } from './utils/scale';
|
|
|
10
10
|
import { useChartContextBridge } from './ChartContextBridge';
|
|
11
11
|
import { CartesianChartProvider } from './ChartProvider';
|
|
12
12
|
import { Legend } from './legend';
|
|
13
|
-
import { defaultAxisId,
|
|
13
|
+
import { defaultAxisId, defaultHorizontalLayoutChartInset, defaultVerticalLayoutChartInset, getAxisConfig, getAxisRange, getCartesianAxisDomain, getCartesianAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
|
|
14
14
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
15
|
const ChartCanvas = /*#__PURE__*/memo(_ref => {
|
|
16
16
|
let {
|
|
@@ -32,6 +32,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
32
32
|
let {
|
|
33
33
|
series,
|
|
34
34
|
children,
|
|
35
|
+
layout = 'vertical',
|
|
35
36
|
animate = true,
|
|
36
37
|
enableScrubbing,
|
|
37
38
|
xAxis: xAxisConfigProp,
|
|
@@ -57,11 +58,18 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
57
58
|
const [containerLayout, onContainerLayout] = useLayout();
|
|
58
59
|
const chartWidth = containerLayout.width;
|
|
59
60
|
const chartHeight = containerLayout.height;
|
|
60
|
-
const calculatedInset = useMemo(() => getChartInset(inset,
|
|
61
|
-
|
|
62
|
-
// there can only be one x axis but the helper function always returns an array
|
|
63
|
-
const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp)[0], [xAxisConfigProp]);
|
|
61
|
+
const calculatedInset = useMemo(() => getChartInset(inset, layout === 'horizontal' ? defaultHorizontalLayoutChartInset : defaultVerticalLayoutChartInset), [inset, layout]);
|
|
62
|
+
const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp), [xAxisConfigProp]);
|
|
64
63
|
const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigProp), [yAxisConfigProp]);
|
|
64
|
+
|
|
65
|
+
// Horizontal layout supports multiple value axes on x, but only a single category axis on y.
|
|
66
|
+
// Vertical layout keeps a single x-axis to preserve existing behavior.
|
|
67
|
+
if (layout === 'horizontal' && yAxisConfig.length > 1) {
|
|
68
|
+
throw new Error('When layout="horizontal", only one y-axis is supported. See https://cds.coinbase.com/components/charts/CartesianChart.');
|
|
69
|
+
}
|
|
70
|
+
if (layout !== 'horizontal' && xAxisConfig.length > 1) {
|
|
71
|
+
throw new Error('Multiple x-axes are only supported when layout="horizontal". See https://cds.coinbase.com/components/charts/CartesianChart.');
|
|
72
|
+
}
|
|
65
73
|
const {
|
|
66
74
|
renderedAxes,
|
|
67
75
|
registerAxis,
|
|
@@ -91,54 +99,76 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
91
99
|
};
|
|
92
100
|
}, [chartHeight, chartWidth, totalInset]);
|
|
93
101
|
const {
|
|
94
|
-
|
|
95
|
-
|
|
102
|
+
xAxes,
|
|
103
|
+
xScales
|
|
96
104
|
} = useMemo(() => {
|
|
105
|
+
const axes = new Map();
|
|
106
|
+
const scales = new Map();
|
|
97
107
|
if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
};
|
|
101
|
-
const domain = getAxisDomain(xAxisConfig, series != null ? series : [], 'x');
|
|
102
|
-
const range = getAxisRange(xAxisConfig, chartRect, 'x');
|
|
103
|
-
const axisConfig = {
|
|
104
|
-
scaleType: xAxisConfig.scaleType,
|
|
105
|
-
domain,
|
|
106
|
-
range,
|
|
107
|
-
data: xAxisConfig.data,
|
|
108
|
-
categoryPadding: xAxisConfig.categoryPadding,
|
|
109
|
-
domainLimit: xAxisConfig.domainLimit
|
|
108
|
+
xAxes: axes,
|
|
109
|
+
xScales: scales
|
|
110
110
|
};
|
|
111
|
+
xAxisConfig.forEach(axisParam => {
|
|
112
|
+
var _axisParam$id, _series$filter, _axisParam$domainLimi;
|
|
113
|
+
const axisId = (_axisParam$id = axisParam.id) != null ? _axisParam$id : defaultAxisId;
|
|
111
114
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
115
|
+
// Get relevant series data.
|
|
116
|
+
const relevantSeries = xAxisConfig.length > 1 ? (_series$filter = series == null ? void 0 : series.filter(s => {
|
|
117
|
+
var _s$xAxisId;
|
|
118
|
+
return ((_s$xAxisId = s.xAxisId) != null ? _s$xAxisId : defaultAxisId) === axisId;
|
|
119
|
+
})) != null ? _series$filter : [] : series != null ? series : [];
|
|
120
|
+
|
|
121
|
+
// Calculate domain and range.
|
|
122
|
+
const dataDomain = getCartesianAxisDomain(axisParam, relevantSeries, 'x', layout);
|
|
123
|
+
const range = getAxisRange(axisParam, chartRect, 'x');
|
|
124
|
+
const axisConfig = {
|
|
125
|
+
scaleType: axisParam.scaleType,
|
|
126
|
+
domain: dataDomain,
|
|
127
|
+
range,
|
|
128
|
+
data: axisParam.data,
|
|
129
|
+
categoryPadding: axisParam.categoryPadding,
|
|
130
|
+
domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) != null ? _axisParam$domainLimi : layout === 'horizontal' ? 'nice' : 'strict'
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Create the scale.
|
|
134
|
+
const scale = getCartesianAxisScale({
|
|
135
|
+
config: axisConfig,
|
|
136
|
+
type: 'x',
|
|
137
|
+
range: axisConfig.range,
|
|
138
|
+
dataDomain: axisConfig.domain,
|
|
139
|
+
layout
|
|
140
|
+
});
|
|
141
|
+
if (scale) {
|
|
142
|
+
scales.set(axisId, scale);
|
|
123
143
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
144
|
+
// Update axis config with actual scale domain (after .nice() or other adjustments).
|
|
145
|
+
const scaleDomain = scale.domain();
|
|
146
|
+
const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
|
|
147
|
+
min: scaleDomain[0],
|
|
148
|
+
max: scaleDomain[1]
|
|
149
|
+
} : axisConfig.domain;
|
|
150
|
+
axes.set(axisId, _extends({}, axisConfig, {
|
|
151
|
+
domain: actualDomain
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
132
154
|
});
|
|
133
155
|
return {
|
|
134
|
-
|
|
135
|
-
|
|
156
|
+
xAxes: axes,
|
|
157
|
+
xScales: scales
|
|
136
158
|
};
|
|
137
|
-
}, [xAxisConfig, series, chartRect]);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
159
|
+
}, [xAxisConfig, series, chartRect, layout]);
|
|
160
|
+
|
|
161
|
+
// We need a set of serialized scales usable in UI thread.
|
|
162
|
+
const xSerializableScales = useMemo(() => {
|
|
163
|
+
const serializableScales = new Map();
|
|
164
|
+
xScales.forEach((scale, id) => {
|
|
165
|
+
const serializableScale = convertToSerializableScale(scale);
|
|
166
|
+
if (serializableScale) {
|
|
167
|
+
serializableScales.set(id, serializableScale);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return serializableScales;
|
|
171
|
+
}, [xScales]);
|
|
142
172
|
const {
|
|
143
173
|
yAxes,
|
|
144
174
|
yScales
|
|
@@ -150,17 +180,17 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
150
180
|
yScales: scales
|
|
151
181
|
};
|
|
152
182
|
yAxisConfig.forEach(axisParam => {
|
|
153
|
-
var _axisParam$
|
|
154
|
-
const axisId = (_axisParam$
|
|
183
|
+
var _axisParam$id2, _series$filter2, _axisParam$domainLimi2;
|
|
184
|
+
const axisId = (_axisParam$id2 = axisParam.id) != null ? _axisParam$id2 : defaultAxisId;
|
|
155
185
|
|
|
156
|
-
// Get relevant series data
|
|
157
|
-
const relevantSeries = (_series$
|
|
186
|
+
// Get relevant series data.
|
|
187
|
+
const relevantSeries = yAxisConfig.length > 1 ? (_series$filter2 = series == null ? void 0 : series.filter(s => {
|
|
158
188
|
var _s$yAxisId;
|
|
159
189
|
return ((_s$yAxisId = s.yAxisId) != null ? _s$yAxisId : defaultAxisId) === axisId;
|
|
160
|
-
})) != null ? _series$
|
|
190
|
+
})) != null ? _series$filter2 : [] : series != null ? series : [];
|
|
161
191
|
|
|
162
|
-
// Calculate domain and range
|
|
163
|
-
const dataDomain =
|
|
192
|
+
// Calculate domain and range.
|
|
193
|
+
const dataDomain = getCartesianAxisDomain(axisParam, relevantSeries, 'y', layout);
|
|
164
194
|
const range = getAxisRange(axisParam, chartRect, 'y');
|
|
165
195
|
const axisConfig = {
|
|
166
196
|
scaleType: axisParam.scaleType,
|
|
@@ -168,20 +198,21 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
168
198
|
range,
|
|
169
199
|
data: axisParam.data,
|
|
170
200
|
categoryPadding: axisParam.categoryPadding,
|
|
171
|
-
domainLimit: (_axisParam$
|
|
201
|
+
domainLimit: (_axisParam$domainLimi2 = axisParam.domainLimit) != null ? _axisParam$domainLimi2 : layout === 'horizontal' ? 'strict' : 'nice'
|
|
172
202
|
};
|
|
173
203
|
|
|
174
|
-
// Create the scale
|
|
175
|
-
const scale =
|
|
204
|
+
// Create the scale.
|
|
205
|
+
const scale = getCartesianAxisScale({
|
|
176
206
|
config: axisConfig,
|
|
177
207
|
type: 'y',
|
|
178
208
|
range: axisConfig.range,
|
|
179
|
-
dataDomain: axisConfig.domain
|
|
209
|
+
dataDomain: axisConfig.domain,
|
|
210
|
+
layout
|
|
180
211
|
});
|
|
181
212
|
if (scale) {
|
|
182
213
|
scales.set(axisId, scale);
|
|
183
214
|
|
|
184
|
-
// Update axis config with actual scale domain (after .nice() or other adjustments)
|
|
215
|
+
// Update axis config with actual scale domain (after .nice() or other adjustments).
|
|
185
216
|
const scaleDomain = scale.domain();
|
|
186
217
|
const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
|
|
187
218
|
min: scaleDomain[0],
|
|
@@ -196,7 +227,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
196
227
|
yAxes: axes,
|
|
197
228
|
yScales: scales
|
|
198
229
|
};
|
|
199
|
-
}, [yAxisConfig, series, chartRect]);
|
|
230
|
+
}, [yAxisConfig, series, chartRect, layout]);
|
|
200
231
|
|
|
201
232
|
// We need a set of serialized scales usable in UI thread
|
|
202
233
|
const ySerializableScales = useMemo(() => {
|
|
@@ -209,11 +240,11 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
209
240
|
});
|
|
210
241
|
return serializableScales;
|
|
211
242
|
}, [yScales]);
|
|
212
|
-
const getXAxis = useCallback(
|
|
243
|
+
const getXAxis = useCallback(id => xAxes.get(id != null ? id : defaultAxisId), [xAxes]);
|
|
213
244
|
const getYAxis = useCallback(id => yAxes.get(id != null ? id : defaultAxisId), [yAxes]);
|
|
214
|
-
const getXScale = useCallback(
|
|
245
|
+
const getXScale = useCallback(id => xScales.get(id != null ? id : defaultAxisId), [xScales]);
|
|
215
246
|
const getYScale = useCallback(id => yScales.get(id != null ? id : defaultAxisId), [yScales]);
|
|
216
|
-
const getXSerializableScale = useCallback(
|
|
247
|
+
const getXSerializableScale = useCallback(id => xSerializableScales.get(id != null ? id : defaultAxisId), [xSerializableScales]);
|
|
217
248
|
const getYSerializableScale = useCallback(id => ySerializableScales.get(id != null ? id : defaultAxisId), [ySerializableScales]);
|
|
218
249
|
const getSeries = useCallback(seriesId => series == null ? void 0 : series.find(s => s.id === seriesId), [series]);
|
|
219
250
|
const stackedDataMap = useMemo(() => {
|
|
@@ -224,20 +255,27 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
224
255
|
if (!seriesId) return undefined;
|
|
225
256
|
return stackedDataMap.get(seriesId);
|
|
226
257
|
}, [stackedDataMap]);
|
|
258
|
+
const categoryAxisIsX = useMemo(() => {
|
|
259
|
+
return layout !== 'horizontal';
|
|
260
|
+
}, [layout]);
|
|
261
|
+
const categoryAxisConfig = useMemo(() => {
|
|
262
|
+
var _xAxisConfig$, _yAxisConfig$;
|
|
263
|
+
return categoryAxisIsX ? (_xAxisConfig$ = xAxisConfig[0]) != null ? _xAxisConfig$ : yAxisConfig[0] : (_yAxisConfig$ = yAxisConfig[0]) != null ? _yAxisConfig$ : xAxisConfig[0];
|
|
264
|
+
}, [categoryAxisIsX, xAxisConfig, yAxisConfig]);
|
|
227
265
|
const dataLength = useMemo(() => {
|
|
228
|
-
// If
|
|
229
|
-
if (
|
|
230
|
-
return
|
|
266
|
+
// If category axis has categorical data, use that length.
|
|
267
|
+
if (categoryAxisConfig.data && categoryAxisConfig.data.length > 0) {
|
|
268
|
+
return categoryAxisConfig.data.length;
|
|
231
269
|
}
|
|
232
270
|
|
|
233
|
-
// Otherwise, find the longest series
|
|
271
|
+
// Otherwise, find the longest series.
|
|
234
272
|
if (!series || series.length === 0) return 0;
|
|
235
273
|
return series.reduce((max, s) => {
|
|
236
274
|
var _seriesData$length;
|
|
237
275
|
const seriesData = getStackedSeriesData(s.id);
|
|
238
276
|
return Math.max(max, (_seriesData$length = seriesData == null ? void 0 : seriesData.length) != null ? _seriesData$length : 0);
|
|
239
277
|
}, 0);
|
|
240
|
-
}, [
|
|
278
|
+
}, [categoryAxisConfig, series, getStackedSeriesData]);
|
|
241
279
|
const getAxisBounds = useCallback(axisId => {
|
|
242
280
|
const axis = renderedAxes.get(axisId);
|
|
243
281
|
if (!axis || !chartRect) return;
|
|
@@ -290,6 +328,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
290
328
|
return Skia.TypefaceFontProvider.Make();
|
|
291
329
|
}, [fontProviderProp]);
|
|
292
330
|
const contextValue = useMemo(() => ({
|
|
331
|
+
layout,
|
|
293
332
|
series: series != null ? series : [],
|
|
294
333
|
getSeries,
|
|
295
334
|
getSeriesData: getStackedSeriesData,
|
|
@@ -309,7 +348,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
|
|
|
309
348
|
registerAxis,
|
|
310
349
|
unregisterAxis,
|
|
311
350
|
getAxisBounds
|
|
312
|
-
}), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, fontFamilies, fontProvider, getXAxis, getYAxis, getXScale, getYScale, getXSerializableScale, getYSerializableScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
|
|
351
|
+
}), [layout, series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, fontFamilies, fontProvider, getXAxis, getYAxis, getXScale, getYScale, getXSerializableScale, getYSerializableScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
|
|
313
352
|
const rootStyles = useMemo(() => {
|
|
314
353
|
return [style, styles == null ? void 0 : styles.root];
|
|
315
354
|
}, [style, styles == null ? void 0 : styles.root]);
|
package/esm/chart/Path.js
CHANGED
|
@@ -92,18 +92,19 @@ export const Path = /*#__PURE__*/memo(props => {
|
|
|
92
92
|
const isReady = !!context.getXScale();
|
|
93
93
|
const enterTransition = useMemo(() => getTransition(transitions == null ? void 0 : transitions.enter, animate, defaultPathEnterTransition), [animate, transitions == null ? void 0 : transitions.enter]);
|
|
94
94
|
const updateTransition = useMemo(() => getTransition((transitions == null ? void 0 : transitions.update) !== undefined ? transitions.update : transition, animate, defaultTransition), [animate, transitions == null ? void 0 : transitions.update, transition]);
|
|
95
|
+
const shouldAnimateClip = animate && enterTransition !== null;
|
|
95
96
|
|
|
96
97
|
// The clip offset provides extra padding to prevent path from being cut off
|
|
97
98
|
// Area charts typically use offset=0 for exact clipping, while lines use offset=2 for breathing room
|
|
98
99
|
const totalOffset = clipOffset * 2; // Applied on both sides
|
|
99
100
|
|
|
100
101
|
// Animation progress for clip path reveal
|
|
101
|
-
const clipProgress = useSharedValue(
|
|
102
|
+
const clipProgress = useSharedValue(shouldAnimateClip ? 0 : 1);
|
|
102
103
|
useEffect(() => {
|
|
103
|
-
if (
|
|
104
|
+
if (shouldAnimateClip && isReady) {
|
|
104
105
|
clipProgress.value = buildTransition(1, enterTransition);
|
|
105
106
|
}
|
|
106
|
-
}, [
|
|
107
|
+
}, [shouldAnimateClip, isReady, clipProgress, enterTransition]);
|
|
107
108
|
|
|
108
109
|
// Create initial and target clip paths for animation
|
|
109
110
|
const {
|
|
@@ -114,32 +115,35 @@ export const Path = /*#__PURE__*/memo(props => {
|
|
|
114
115
|
initialClipPath: null,
|
|
115
116
|
targetClipPath: null
|
|
116
117
|
};
|
|
118
|
+
const categoryAxisIsX = context.layout !== 'horizontal';
|
|
119
|
+
const fullWidth = rect.width + totalOffset;
|
|
120
|
+
const fullHeight = rect.height + totalOffset;
|
|
117
121
|
|
|
118
|
-
// Initial clip path
|
|
122
|
+
// Initial clip path starts collapsed on the category axis.
|
|
119
123
|
const initial = Skia.Path.Make();
|
|
120
124
|
initial.addRect({
|
|
121
125
|
x: rect.x - clipOffset,
|
|
122
126
|
y: rect.y - clipOffset,
|
|
123
|
-
width: 0,
|
|
124
|
-
height:
|
|
127
|
+
width: categoryAxisIsX ? 0 : fullWidth,
|
|
128
|
+
height: categoryAxisIsX ? fullHeight : 0
|
|
125
129
|
});
|
|
126
130
|
|
|
127
|
-
// Target clip path
|
|
131
|
+
// Target clip path is fully expanded.
|
|
128
132
|
const target = Skia.Path.Make();
|
|
129
133
|
target.addRect({
|
|
130
134
|
x: rect.x - clipOffset,
|
|
131
135
|
y: rect.y - clipOffset,
|
|
132
|
-
width:
|
|
133
|
-
height:
|
|
136
|
+
width: fullWidth,
|
|
137
|
+
height: fullHeight
|
|
134
138
|
});
|
|
135
139
|
return {
|
|
136
140
|
initialClipPath: initial,
|
|
137
141
|
targetClipPath: target
|
|
138
142
|
};
|
|
139
|
-
}, [rect, clipOffset, totalOffset]);
|
|
143
|
+
}, [rect, clipOffset, totalOffset, context.layout]);
|
|
140
144
|
|
|
141
145
|
// Use usePathInterpolation for animated clip path
|
|
142
|
-
const animatedClipPath = usePathInterpolation(clipProgress, [0, 1],
|
|
146
|
+
const animatedClipPath = usePathInterpolation(clipProgress, [0, 1], shouldAnimateClip && initialClipPath && targetClipPath ? [initialClipPath, targetClipPath] : targetClipPath ? [targetClipPath, targetClipPath] : [Skia.Path.Make(), Skia.Path.Make()]);
|
|
143
147
|
|
|
144
148
|
// Resolve the final clip path:
|
|
145
149
|
// 1. If clipPath prop was explicitly provided, use it (even if null = no clipping)
|
|
@@ -152,13 +156,13 @@ export const Path = /*#__PURE__*/memo(props => {
|
|
|
152
156
|
}
|
|
153
157
|
|
|
154
158
|
// If not animating or paths are null, return target clip path
|
|
155
|
-
if (!
|
|
159
|
+
if (!shouldAnimateClip || !targetClipPath) {
|
|
156
160
|
return targetClipPath;
|
|
157
161
|
}
|
|
158
162
|
|
|
159
163
|
// Return undefined here since we'll use animatedClipPath directly
|
|
160
164
|
return undefined;
|
|
161
|
-
}, [clipPathProp,
|
|
165
|
+
}, [clipPathProp, shouldAnimateClip, targetClipPath]);
|
|
162
166
|
|
|
163
167
|
// Convert SVG path string to SkPath for static rendering
|
|
164
168
|
const staticPath = useDerivedValue(() => {
|
|
@@ -206,7 +210,7 @@ export const Path = /*#__PURE__*/memo(props => {
|
|
|
206
210
|
});
|
|
207
211
|
|
|
208
212
|
// Determine which clip path to use
|
|
209
|
-
const finalClipPath =
|
|
213
|
+
const finalClipPath = shouldAnimateClip && resolvedClipPath === undefined ? animatedClipPath : resolvedClipPath;
|
|
210
214
|
|
|
211
215
|
// If finalClipPath is null, render without clipping
|
|
212
216
|
if (finalClipPath === null) {
|
|
@@ -5,7 +5,7 @@ import { IconButton } from '@coinbase/cds-mobile/buttons/IconButton';
|
|
|
5
5
|
import { ExampleScreen } from '@coinbase/cds-mobile/examples/ExampleScreen';
|
|
6
6
|
import { Box, HStack, VStack } from '@coinbase/cds-mobile/layout';
|
|
7
7
|
import { Text } from '@coinbase/cds-mobile/typography';
|
|
8
|
-
import {
|
|
8
|
+
import { AreaChart } from '../area/AreaChart';
|
|
9
9
|
import { BarChart } from '../bar/BarChart';
|
|
10
10
|
import { CartesianChart } from '../CartesianChart';
|
|
11
11
|
import { Line } from '../line/Line';
|
|
@@ -143,8 +143,9 @@ const TransitionAreaChart = /*#__PURE__*/memo(_ref2 => {
|
|
|
143
143
|
idlePulse,
|
|
144
144
|
scrubberRef
|
|
145
145
|
} = _ref2;
|
|
146
|
-
return /*#__PURE__*/
|
|
146
|
+
return /*#__PURE__*/_jsx(AreaChart, {
|
|
147
147
|
enableScrubbing: true,
|
|
148
|
+
showLines: true,
|
|
148
149
|
height: 200,
|
|
149
150
|
inset: {
|
|
150
151
|
top: 16,
|
|
@@ -156,18 +157,13 @@ const TransitionAreaChart = /*#__PURE__*/memo(_ref2 => {
|
|
|
156
157
|
id: 'values',
|
|
157
158
|
data
|
|
158
159
|
}],
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
transitions: transitions
|
|
162
|
-
}), /*#__PURE__*/_jsx(Line, {
|
|
163
|
-
seriesId: "values",
|
|
164
|
-
transitions: transitions
|
|
165
|
-
}), /*#__PURE__*/_jsx(Scrubber, {
|
|
160
|
+
transitions: transitions,
|
|
161
|
+
children: /*#__PURE__*/_jsx(Scrubber, {
|
|
166
162
|
ref: scrubberRef,
|
|
167
163
|
hideOverlay: true,
|
|
168
164
|
idlePulse: idlePulse,
|
|
169
165
|
transitions: transitions
|
|
170
|
-
})
|
|
166
|
+
})
|
|
171
167
|
});
|
|
172
168
|
});
|
|
173
169
|
const MultiLineChart = /*#__PURE__*/memo(_ref3 => {
|