@coinbase/cds-mobile-visualization 3.4.0-beta.2 → 3.4.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/dts/chart/CartesianChart.d.ts +92 -34
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/ChartContextBridge.d.ts +28 -0
  5. package/dts/chart/ChartContextBridge.d.ts.map +1 -0
  6. package/dts/chart/ChartProvider.d.ts +3 -0
  7. package/dts/chart/ChartProvider.d.ts.map +1 -1
  8. package/dts/chart/Path.d.ts +97 -32
  9. package/dts/chart/Path.d.ts.map +1 -1
  10. package/dts/chart/PeriodSelector.d.ts +6 -13
  11. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  12. package/dts/chart/area/Area.d.ts +39 -28
  13. package/dts/chart/area/Area.d.ts.map +1 -1
  14. package/dts/chart/area/AreaChart.d.ts +51 -10
  15. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  16. package/dts/chart/area/DottedArea.d.ts +21 -2
  17. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  18. package/dts/chart/area/GradientArea.d.ts +19 -13
  19. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  20. package/dts/chart/area/SolidArea.d.ts +17 -2
  21. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  22. package/dts/chart/axis/Axis.d.ts +86 -118
  23. package/dts/chart/axis/Axis.d.ts.map +1 -1
  24. package/dts/chart/axis/DefaultAxisTickLabel.d.ts +8 -0
  25. package/dts/chart/axis/DefaultAxisTickLabel.d.ts.map +1 -0
  26. package/dts/chart/axis/XAxis.d.ts +1 -1
  27. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  28. package/dts/chart/axis/YAxis.d.ts +2 -2
  29. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  30. package/dts/chart/axis/index.d.ts +1 -0
  31. package/dts/chart/axis/index.d.ts.map +1 -1
  32. package/dts/chart/bar/Bar.d.ts +49 -12
  33. package/dts/chart/bar/Bar.d.ts.map +1 -1
  34. package/dts/chart/bar/BarChart.d.ts +40 -19
  35. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  36. package/dts/chart/bar/BarPlot.d.ts +3 -1
  37. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  38. package/dts/chart/bar/BarStack.d.ts +41 -46
  39. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  40. package/dts/chart/bar/BarStackGroup.d.ts +2 -0
  41. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  42. package/dts/chart/bar/DefaultBar.d.ts +1 -1
  43. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  44. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  45. package/dts/chart/gradient/Gradient.d.ts +25 -0
  46. package/dts/chart/gradient/Gradient.d.ts.map +1 -0
  47. package/dts/chart/gradient/index.d.ts +2 -0
  48. package/dts/chart/gradient/index.d.ts.map +1 -0
  49. package/dts/chart/index.d.ts +4 -1
  50. package/dts/chart/index.d.ts.map +1 -1
  51. package/dts/chart/legend/DefaultLegendEntry.d.ts +5 -0
  52. package/dts/chart/legend/DefaultLegendEntry.d.ts.map +1 -0
  53. package/dts/chart/legend/DefaultLegendShape.d.ts +5 -0
  54. package/dts/chart/legend/DefaultLegendShape.d.ts.map +1 -0
  55. package/dts/chart/legend/Legend.d.ts +168 -0
  56. package/dts/chart/legend/Legend.d.ts.map +1 -0
  57. package/dts/chart/legend/index.d.ts +4 -0
  58. package/dts/chart/legend/index.d.ts.map +1 -0
  59. package/dts/chart/line/DefaultReferenceLineLabel.d.ts +9 -0
  60. package/dts/chart/line/DefaultReferenceLineLabel.d.ts.map +1 -0
  61. package/dts/chart/line/DottedLine.d.ts +13 -5
  62. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  63. package/dts/chart/line/Line.d.ts +61 -27
  64. package/dts/chart/line/Line.d.ts.map +1 -1
  65. package/dts/chart/line/LineChart.d.ts +43 -9
  66. package/dts/chart/line/LineChart.d.ts.map +1 -1
  67. package/dts/chart/line/ReferenceLine.d.ts +68 -20
  68. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  69. package/dts/chart/line/SolidLine.d.ts +8 -5
  70. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  71. package/dts/chart/line/index.d.ts +1 -1
  72. package/dts/chart/line/index.d.ts.map +1 -1
  73. package/dts/chart/point/DefaultPointLabel.d.ts +10 -0
  74. package/dts/chart/point/DefaultPointLabel.d.ts.map +1 -0
  75. package/dts/chart/point/Point.d.ts +136 -0
  76. package/dts/chart/point/Point.d.ts.map +1 -0
  77. package/dts/chart/point/index.d.ts +3 -0
  78. package/dts/chart/point/index.d.ts.map +1 -0
  79. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +38 -0
  80. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -0
  81. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts +12 -0
  82. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts.map +1 -0
  83. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +11 -0
  84. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -0
  85. package/dts/chart/scrubber/Scrubber.d.ts +230 -42
  86. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  87. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +54 -0
  88. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -0
  89. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +46 -0
  90. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -0
  91. package/dts/chart/scrubber/ScrubberProvider.d.ts +6 -3
  92. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  93. package/dts/chart/scrubber/index.d.ts +3 -0
  94. package/dts/chart/scrubber/index.d.ts.map +1 -1
  95. package/dts/chart/text/ChartText.d.ts +151 -77
  96. package/dts/chart/text/ChartText.d.ts.map +1 -1
  97. package/dts/chart/text/{SmartChartTextGroup.d.ts → ChartTextGroup.d.ts} +9 -3
  98. package/dts/chart/text/ChartTextGroup.d.ts.map +1 -0
  99. package/dts/chart/text/index.d.ts +1 -1
  100. package/dts/chart/text/index.d.ts.map +1 -1
  101. package/dts/chart/utils/axis.d.ts +25 -1
  102. package/dts/chart/utils/axis.d.ts.map +1 -1
  103. package/dts/chart/utils/bar.d.ts +34 -0
  104. package/dts/chart/utils/bar.d.ts.map +1 -1
  105. package/dts/chart/utils/chart.d.ts +52 -7
  106. package/dts/chart/utils/chart.d.ts.map +1 -1
  107. package/dts/chart/utils/context.d.ts +28 -7
  108. package/dts/chart/utils/context.d.ts.map +1 -1
  109. package/dts/chart/utils/gradient.d.ts +117 -0
  110. package/dts/chart/utils/gradient.d.ts.map +1 -0
  111. package/dts/chart/utils/index.d.ts +3 -0
  112. package/dts/chart/utils/index.d.ts.map +1 -1
  113. package/dts/chart/utils/path.d.ts +59 -0
  114. package/dts/chart/utils/path.d.ts.map +1 -1
  115. package/dts/chart/utils/point.d.ts +71 -7
  116. package/dts/chart/utils/point.d.ts.map +1 -1
  117. package/dts/chart/utils/scale.d.ts +102 -0
  118. package/dts/chart/utils/scale.d.ts.map +1 -1
  119. package/dts/chart/utils/scrubber.d.ts +40 -0
  120. package/dts/chart/utils/scrubber.d.ts.map +1 -0
  121. package/dts/chart/utils/transition.d.ts +178 -0
  122. package/dts/chart/utils/transition.d.ts.map +1 -0
  123. package/esm/chart/CartesianChart.js +199 -75
  124. package/esm/chart/ChartContextBridge.js +159 -0
  125. package/esm/chart/ChartProvider.js +2 -2
  126. package/esm/chart/Path.js +200 -114
  127. package/esm/chart/PeriodSelector.js +7 -3
  128. package/esm/chart/__stories__/CartesianChart.stories.js +307 -134
  129. package/esm/chart/__stories__/ChartTransitions.stories.js +629 -0
  130. package/esm/chart/__stories__/PeriodSelector.stories.js +201 -75
  131. package/esm/chart/area/Area.js +27 -35
  132. package/esm/chart/area/AreaChart.js +17 -12
  133. package/esm/chart/area/DottedArea.js +64 -108
  134. package/esm/chart/area/GradientArea.js +37 -91
  135. package/esm/chart/area/SolidArea.js +24 -8
  136. package/esm/chart/area/__stories__/AreaChart.stories.js +1 -1
  137. package/esm/chart/axis/Axis.js +5 -39
  138. package/esm/chart/axis/DefaultAxisTickLabel.js +11 -0
  139. package/esm/chart/axis/XAxis.js +148 -66
  140. package/esm/chart/axis/YAxis.js +149 -65
  141. package/esm/chart/axis/__stories__/Axis.stories.js +259 -1
  142. package/esm/chart/axis/index.js +1 -0
  143. package/esm/chart/bar/Bar.js +7 -1
  144. package/esm/chart/bar/BarChart.js +17 -37
  145. package/esm/chart/bar/BarPlot.js +43 -35
  146. package/esm/chart/bar/BarStack.js +84 -37
  147. package/esm/chart/bar/BarStackGroup.js +7 -17
  148. package/esm/chart/bar/DefaultBar.js +29 -51
  149. package/esm/chart/bar/DefaultBarStack.js +34 -58
  150. package/esm/chart/bar/__stories__/BarChart.stories.js +948 -88
  151. package/esm/chart/gradient/Gradient.js +53 -0
  152. package/esm/chart/gradient/index.js +1 -0
  153. package/esm/chart/index.js +4 -1
  154. package/esm/chart/legend/DefaultLegendEntry.js +42 -0
  155. package/esm/chart/legend/DefaultLegendShape.js +64 -0
  156. package/esm/chart/legend/Legend.js +59 -0
  157. package/esm/chart/legend/__stories__/Legend.stories.js +574 -0
  158. package/esm/chart/legend/index.js +3 -0
  159. package/esm/chart/line/DefaultReferenceLineLabel.js +66 -0
  160. package/esm/chart/line/DottedLine.js +31 -14
  161. package/esm/chart/line/Line.js +96 -68
  162. package/esm/chart/line/LineChart.js +21 -14
  163. package/esm/chart/line/ReferenceLine.js +80 -63
  164. package/esm/chart/line/SolidLine.js +27 -10
  165. package/esm/chart/line/__stories__/LineChart.stories.js +1748 -2048
  166. package/esm/chart/line/__stories__/ReferenceLine.stories.js +177 -28
  167. package/esm/chart/line/index.js +1 -1
  168. package/esm/chart/point/DefaultPointLabel.js +39 -0
  169. package/esm/chart/point/Point.js +186 -0
  170. package/esm/chart/point/index.js +2 -0
  171. package/esm/chart/scrubber/DefaultScrubberBeacon.js +180 -0
  172. package/esm/chart/scrubber/DefaultScrubberBeaconLabel.js +43 -0
  173. package/esm/chart/scrubber/DefaultScrubberLabel.js +28 -0
  174. package/esm/chart/scrubber/Scrubber.js +130 -144
  175. package/esm/chart/scrubber/ScrubberBeaconGroup.js +165 -0
  176. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +208 -0
  177. package/esm/chart/scrubber/ScrubberProvider.js +46 -54
  178. package/esm/chart/scrubber/__stories__/Scrubber.stories.js +760 -0
  179. package/esm/chart/scrubber/index.js +3 -1
  180. package/esm/chart/text/ChartText.js +242 -174
  181. package/esm/chart/text/{SmartChartTextGroup.js → ChartTextGroup.js} +6 -5
  182. package/esm/chart/text/index.js +1 -1
  183. package/esm/chart/utils/axis.js +47 -31
  184. package/esm/chart/utils/bar.js +43 -0
  185. package/esm/chart/utils/chart.js +57 -3
  186. package/esm/chart/utils/gradient.js +305 -0
  187. package/esm/chart/utils/index.js +3 -0
  188. package/esm/chart/utils/path.js +84 -8
  189. package/esm/chart/utils/point.js +171 -17
  190. package/esm/chart/utils/scale.js +242 -2
  191. package/esm/chart/utils/scrubber.js +146 -0
  192. package/esm/chart/utils/transition.js +215 -0
  193. package/esm/sparkline/__figma__/Sparkline.figma.js +1 -1
  194. package/esm/sparkline/__stories__/Sparkline.stories.js +11 -7
  195. package/esm/sparkline/__stories__/SparklineGradient.stories.js +7 -4
  196. package/esm/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.js +1 -1
  197. package/esm/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.js +51 -26
  198. package/esm/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.js +1 -1
  199. package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +17 -9
  200. package/package.json +15 -10
  201. package/dts/chart/Point.d.ts +0 -103
  202. package/dts/chart/Point.d.ts.map +0 -1
  203. package/dts/chart/line/GradientLine.d.ts +0 -45
  204. package/dts/chart/line/GradientLine.d.ts.map +0 -1
  205. package/dts/chart/scrubber/ScrubberBeacon.d.ts +0 -75
  206. package/dts/chart/scrubber/ScrubberBeacon.d.ts.map +0 -1
  207. package/dts/chart/text/SmartChartTextGroup.d.ts.map +0 -1
  208. package/esm/chart/Point.js +0 -111
  209. package/esm/chart/__stories__/Chart.stories.js +0 -79
  210. package/esm/chart/line/GradientLine.js +0 -62
  211. package/esm/chart/scrubber/ScrubberBeacon.js +0 -199
@@ -1,199 +0,0 @@
1
- import { forwardRef, memo, useEffect, useImperativeHandle, useMemo } from 'react';
2
- import Reanimated, { cancelAnimation, useAnimatedProps, useSharedValue, withRepeat, withSequence, withTiming } from 'react-native-reanimated';
3
- import { Circle, G } from 'react-native-svg';
4
- import { usePreviousValue } from '@coinbase/cds-common/hooks/usePreviousValue';
5
- import { useTheme } from '@coinbase/cds-mobile';
6
- import { useCartesianChartContext } from '../ChartProvider';
7
- import { projectPoint, useScrubberContext } from '../utils';
8
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
- const AnimatedCircle = Reanimated.createAnimatedComponent(Circle);
10
- const radius = 5;
11
- const glowRadius = 10;
12
- const pulseRadius = 15;
13
- const pulseDuration = 2000; // 2 seconds
14
- const singlePulseDuration = 1000; // 1 second
15
-
16
- /**
17
- * The ScrubberBeacon is a special instance of a Point used to mark the scrubber's position on a specific series.
18
- */
19
- export const ScrubberBeacon = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, ref) => {
20
- var _pixelCoordinate$x, _pixelCoordinate$y, _ref2;
21
- let {
22
- seriesId,
23
- dataX: dataXProp,
24
- dataY: dataYProp,
25
- color,
26
- testID,
27
- idlePulse,
28
- opacity = 1
29
- } = _ref;
30
- const theme = useTheme();
31
- const {
32
- getSeries,
33
- getXScale,
34
- getYScale,
35
- getSeriesData,
36
- animate
37
- } = useCartesianChartContext();
38
- const {
39
- scrubberPosition
40
- } = useScrubberContext();
41
- const targetSeries = getSeries(seriesId);
42
- const sourceData = getSeriesData(seriesId);
43
- const xScale = getXScale();
44
- const yScale = getYScale(targetSeries == null ? void 0 : targetSeries.yAxisId);
45
- const isIdleState = scrubberPosition === undefined;
46
- const {
47
- dataX,
48
- dataY
49
- } = useMemo(() => {
50
- let x;
51
- let y;
52
- if (xScale && yScale) {
53
- if (dataXProp !== undefined && dataYProp !== undefined && !isNaN(dataYProp) && !isNaN(dataXProp)) {
54
- // Use direct coordinates if provided
55
- x = dataXProp;
56
- y = dataYProp;
57
- } else if (sourceData && scrubberPosition != null && scrubberPosition >= 0 && scrubberPosition < sourceData.length) {
58
- // Use series data at highlight index
59
- x = scrubberPosition;
60
- const dataValue = sourceData[scrubberPosition];
61
- if (typeof dataValue === 'number') {
62
- y = dataValue;
63
- } else if (Array.isArray(dataValue)) {
64
- const validValues = dataValue.filter(val => val !== null);
65
- if (validValues.length >= 2) {
66
- y = validValues[1];
67
- }
68
- }
69
- }
70
- }
71
- return {
72
- dataX: x,
73
- dataY: y
74
- };
75
- }, [dataXProp, dataYProp, sourceData, scrubberPosition, xScale, yScale]);
76
- const previousIdleState = usePreviousValue(!!isIdleState);
77
- const pixelCoordinate = useMemo(() => {
78
- if (!xScale || !yScale || dataX === undefined || dataY === undefined) return undefined;
79
- const point = projectPoint({
80
- x: dataX,
81
- y: dataY,
82
- xScale,
83
- yScale
84
- });
85
-
86
- // Return undefined if coordinates are invalid
87
- if (!point || isNaN(point.x) || isNaN(point.y)) return undefined;
88
- return point;
89
- }, [xScale, yScale, dataX, dataY]);
90
- const animatedX = useSharedValue((_pixelCoordinate$x = pixelCoordinate == null ? void 0 : pixelCoordinate.x) != null ? _pixelCoordinate$x : 0);
91
- const animatedY = useSharedValue((_pixelCoordinate$y = pixelCoordinate == null ? void 0 : pixelCoordinate.y) != null ? _pixelCoordinate$y : 0);
92
- const pulseOpacity = useSharedValue(0);
93
- useImperativeHandle(ref, () => ({
94
- pulse: () => {
95
- if (isIdleState && animate) {
96
- pulseOpacity.value = 0.1;
97
- pulseOpacity.value = withTiming(0, {
98
- duration: singlePulseDuration
99
- });
100
- }
101
- }
102
- }));
103
- useEffect(() => {
104
- const shouldPulse = animate && isIdleState && idlePulse;
105
- if (shouldPulse) {
106
- pulseOpacity.value = withRepeat(withSequence(withTiming(0.1, {
107
- duration: pulseDuration / 2
108
- }), withTiming(0, {
109
- duration: pulseDuration / 2
110
- })), -1,
111
- // loop
112
- false);
113
- } else {
114
- cancelAnimation(pulseOpacity);
115
- pulseOpacity.value = withTiming(0, {
116
- duration: 200
117
- });
118
- }
119
- }, [animate, isIdleState, idlePulse, pulseOpacity]);
120
-
121
- // Update position when data coordinates change
122
- useEffect(() => {
123
- if (!pixelCoordinate) return;
124
-
125
- // When scrubbing or animations disabled: snap immediately
126
- if (!isIdleState || !animate || !previousIdleState) {
127
- // Cancel any ongoing animations before snapping
128
- cancelAnimation(animatedX);
129
- cancelAnimation(animatedY);
130
- animatedX.value = pixelCoordinate.x;
131
- animatedY.value = pixelCoordinate.y;
132
- } else {
133
- // When idle with animations enabled: animate smoothly
134
- animatedX.value = withTiming(pixelCoordinate.x, {
135
- duration: 300
136
- });
137
- animatedY.value = withTiming(pixelCoordinate.y, {
138
- duration: 300
139
- });
140
- }
141
- }, [pixelCoordinate, isIdleState, animate, previousIdleState, animatedX, animatedY]);
142
-
143
- // Animated props for all circles in idle state
144
- const glowAnimatedProps = useAnimatedProps(() => ({
145
- cx: animatedX.value,
146
- cy: animatedY.value
147
- }));
148
- const pointAnimatedProps = useAnimatedProps(() => ({
149
- cx: animatedX.value,
150
- cy: animatedY.value
151
- }));
152
- const pulseAnimatedProps = useAnimatedProps(() => ({
153
- cx: animatedX.value,
154
- cy: animatedY.value,
155
- opacity: pulseOpacity.value
156
- }));
157
- if (!pixelCoordinate) return;
158
- const pointColor = (_ref2 = color != null ? color : targetSeries == null ? void 0 : targetSeries.color) != null ? _ref2 : theme.color.fgPrimary;
159
- if (!isIdleState) {
160
- return /*#__PURE__*/_jsxs(G, {
161
- opacity: opacity,
162
- testID: testID,
163
- children: [/*#__PURE__*/_jsx(Circle, {
164
- cx: pixelCoordinate.x,
165
- cy: pixelCoordinate.y,
166
- fill: pointColor,
167
- opacity: 0.15,
168
- r: glowRadius
169
- }), /*#__PURE__*/_jsx(Circle, {
170
- cx: pixelCoordinate.x,
171
- cy: pixelCoordinate.y,
172
- fill: pointColor,
173
- r: radius,
174
- stroke: theme.color.bg,
175
- strokeWidth: 2
176
- })]
177
- });
178
- }
179
- return /*#__PURE__*/_jsxs(G, {
180
- opacity: opacity,
181
- testID: testID,
182
- children: [/*#__PURE__*/_jsx(AnimatedCircle, {
183
- animatedProps: glowAnimatedProps,
184
- fill: pointColor,
185
- opacity: 0.15,
186
- r: glowRadius
187
- }), /*#__PURE__*/_jsx(AnimatedCircle, {
188
- animatedProps: pulseAnimatedProps,
189
- fill: pointColor,
190
- r: pulseRadius
191
- }), /*#__PURE__*/_jsx(AnimatedCircle, {
192
- animatedProps: pointAnimatedProps,
193
- fill: pointColor,
194
- r: radius,
195
- stroke: theme.color.bg,
196
- strokeWidth: 2
197
- })]
198
- });
199
- }));