@coinbase/cds-mobile-visualization 3.4.0-beta.5 → 3.4.0-beta.7

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 (179) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dts/chart/CartesianChart.d.ts +57 -33
  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/Path.d.ts +77 -34
  7. package/dts/chart/Path.d.ts.map +1 -1
  8. package/dts/chart/PeriodSelector.d.ts +1 -1
  9. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  10. package/dts/chart/area/Area.d.ts +42 -27
  11. package/dts/chart/area/Area.d.ts.map +1 -1
  12. package/dts/chart/area/AreaChart.d.ts +51 -10
  13. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  14. package/dts/chart/area/DottedArea.d.ts +21 -2
  15. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  16. package/dts/chart/area/GradientArea.d.ts +19 -13
  17. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  18. package/dts/chart/area/SolidArea.d.ts +17 -2
  19. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  20. package/dts/chart/axis/Axis.d.ts +68 -78
  21. package/dts/chart/axis/Axis.d.ts.map +1 -1
  22. package/dts/chart/axis/DefaultAxisTickLabel.d.ts +8 -0
  23. package/dts/chart/axis/DefaultAxisTickLabel.d.ts.map +1 -0
  24. package/dts/chart/axis/XAxis.d.ts +1 -1
  25. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  26. package/dts/chart/axis/YAxis.d.ts +2 -2
  27. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  28. package/dts/chart/axis/index.d.ts +1 -0
  29. package/dts/chart/axis/index.d.ts.map +1 -1
  30. package/dts/chart/bar/Bar.d.ts +16 -13
  31. package/dts/chart/bar/Bar.d.ts.map +1 -1
  32. package/dts/chart/bar/BarChart.d.ts +36 -20
  33. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  34. package/dts/chart/bar/BarPlot.d.ts +2 -1
  35. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  36. package/dts/chart/bar/BarStack.d.ts +39 -48
  37. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  38. package/dts/chart/bar/BarStackGroup.d.ts +1 -0
  39. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  40. package/dts/chart/bar/DefaultBar.d.ts +1 -1
  41. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  42. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  43. package/dts/chart/gradient/Gradient.d.ts +25 -0
  44. package/dts/chart/gradient/Gradient.d.ts.map +1 -0
  45. package/dts/chart/gradient/index.d.ts +2 -0
  46. package/dts/chart/gradient/index.d.ts.map +1 -0
  47. package/dts/chart/index.d.ts +3 -1
  48. package/dts/chart/index.d.ts.map +1 -1
  49. package/dts/chart/line/DefaultReferenceLineLabel.d.ts +9 -0
  50. package/dts/chart/line/DefaultReferenceLineLabel.d.ts.map +1 -0
  51. package/dts/chart/line/DottedLine.d.ts +13 -5
  52. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  53. package/dts/chart/line/Line.d.ts +62 -25
  54. package/dts/chart/line/Line.d.ts.map +1 -1
  55. package/dts/chart/line/LineChart.d.ts +43 -9
  56. package/dts/chart/line/LineChart.d.ts.map +1 -1
  57. package/dts/chart/line/ReferenceLine.d.ts +68 -20
  58. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  59. package/dts/chart/line/SolidLine.d.ts +8 -5
  60. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  61. package/dts/chart/line/index.d.ts +1 -1
  62. package/dts/chart/line/index.d.ts.map +1 -1
  63. package/dts/chart/point/DefaultPointLabel.d.ts +10 -0
  64. package/dts/chart/point/DefaultPointLabel.d.ts.map +1 -0
  65. package/dts/chart/point/Point.d.ts +120 -0
  66. package/dts/chart/point/Point.d.ts.map +1 -0
  67. package/dts/chart/point/index.d.ts +3 -0
  68. package/dts/chart/point/index.d.ts.map +1 -0
  69. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +8 -0
  70. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -0
  71. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts +12 -0
  72. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts.map +1 -0
  73. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +11 -0
  74. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -0
  75. package/dts/chart/scrubber/Scrubber.d.ts +172 -43
  76. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  77. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +44 -0
  78. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -0
  79. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +31 -0
  80. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -0
  81. package/dts/chart/scrubber/ScrubberProvider.d.ts +6 -3
  82. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  83. package/dts/chart/scrubber/index.d.ts +3 -0
  84. package/dts/chart/scrubber/index.d.ts.map +1 -1
  85. package/dts/chart/text/ChartText.d.ts +151 -77
  86. package/dts/chart/text/ChartText.d.ts.map +1 -1
  87. package/dts/chart/text/{SmartChartTextGroup.d.ts → ChartTextGroup.d.ts} +9 -3
  88. package/dts/chart/text/ChartTextGroup.d.ts.map +1 -0
  89. package/dts/chart/text/index.d.ts +1 -1
  90. package/dts/chart/text/index.d.ts.map +1 -1
  91. package/dts/chart/utils/chart.d.ts +34 -7
  92. package/dts/chart/utils/chart.d.ts.map +1 -1
  93. package/dts/chart/utils/context.d.ts +28 -7
  94. package/dts/chart/utils/context.d.ts.map +1 -1
  95. package/dts/chart/utils/gradient.d.ts +117 -0
  96. package/dts/chart/utils/gradient.d.ts.map +1 -0
  97. package/dts/chart/utils/index.d.ts +3 -0
  98. package/dts/chart/utils/index.d.ts.map +1 -1
  99. package/dts/chart/utils/path.d.ts +53 -0
  100. package/dts/chart/utils/path.d.ts.map +1 -1
  101. package/dts/chart/utils/point.d.ts +60 -1
  102. package/dts/chart/utils/point.d.ts.map +1 -1
  103. package/dts/chart/utils/scale.d.ts +91 -0
  104. package/dts/chart/utils/scale.d.ts.map +1 -1
  105. package/dts/chart/utils/scrubber.d.ts +39 -0
  106. package/dts/chart/utils/scrubber.d.ts.map +1 -0
  107. package/dts/chart/utils/transition.d.ts +140 -0
  108. package/dts/chart/utils/transition.d.ts.map +1 -0
  109. package/esm/chart/CartesianChart.js +164 -70
  110. package/esm/chart/ChartContextBridge.js +148 -0
  111. package/esm/chart/Path.js +196 -113
  112. package/esm/chart/PeriodSelector.js +1 -1
  113. package/esm/chart/__stories__/CartesianChart.stories.js +371 -129
  114. package/esm/chart/__stories__/Chart.stories.js +2 -4
  115. package/esm/chart/area/Area.js +25 -35
  116. package/esm/chart/area/AreaChart.js +17 -12
  117. package/esm/chart/area/DottedArea.js +61 -109
  118. package/esm/chart/area/GradientArea.js +35 -91
  119. package/esm/chart/area/SolidArea.js +22 -8
  120. package/esm/chart/area/__stories__/AreaChart.stories.js +1 -1
  121. package/esm/chart/axis/Axis.js +2 -0
  122. package/esm/chart/axis/DefaultAxisTickLabel.js +11 -0
  123. package/esm/chart/axis/XAxis.js +62 -56
  124. package/esm/chart/axis/YAxis.js +58 -52
  125. package/esm/chart/axis/__stories__/Axis.stories.js +0 -1
  126. package/esm/chart/axis/index.js +1 -0
  127. package/esm/chart/bar/Bar.js +3 -1
  128. package/esm/chart/bar/BarChart.js +15 -37
  129. package/esm/chart/bar/BarPlot.js +41 -35
  130. package/esm/chart/bar/BarStack.js +75 -38
  131. package/esm/chart/bar/BarStackGroup.js +6 -16
  132. package/esm/chart/bar/DefaultBar.js +26 -48
  133. package/esm/chart/bar/DefaultBarStack.js +23 -58
  134. package/esm/chart/bar/__stories__/BarChart.stories.js +463 -77
  135. package/esm/chart/gradient/Gradient.js +53 -0
  136. package/esm/chart/gradient/index.js +1 -0
  137. package/esm/chart/index.js +3 -1
  138. package/esm/chart/line/DefaultReferenceLineLabel.js +66 -0
  139. package/esm/chart/line/DottedLine.js +29 -14
  140. package/esm/chart/line/Line.js +106 -67
  141. package/esm/chart/line/LineChart.js +20 -14
  142. package/esm/chart/line/ReferenceLine.js +80 -63
  143. package/esm/chart/line/SolidLine.js +25 -10
  144. package/esm/chart/line/__stories__/LineChart.stories.js +2098 -1975
  145. package/esm/chart/line/__stories__/ReferenceLine.stories.js +83 -28
  146. package/esm/chart/line/index.js +1 -1
  147. package/esm/chart/point/DefaultPointLabel.js +39 -0
  148. package/esm/chart/point/Point.js +188 -0
  149. package/esm/chart/point/index.js +2 -0
  150. package/esm/chart/scrubber/DefaultScrubberBeacon.js +179 -0
  151. package/esm/chart/scrubber/DefaultScrubberBeaconLabel.js +43 -0
  152. package/esm/chart/scrubber/DefaultScrubberLabel.js +28 -0
  153. package/esm/chart/scrubber/Scrubber.js +126 -146
  154. package/esm/chart/scrubber/ScrubberBeaconGroup.js +161 -0
  155. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +185 -0
  156. package/esm/chart/scrubber/ScrubberProvider.js +46 -54
  157. package/esm/chart/scrubber/index.js +3 -1
  158. package/esm/chart/text/ChartText.js +242 -174
  159. package/esm/chart/text/{SmartChartTextGroup.js → ChartTextGroup.js} +6 -5
  160. package/esm/chart/text/index.js +1 -1
  161. package/esm/chart/utils/chart.js +44 -3
  162. package/esm/chart/utils/gradient.js +305 -0
  163. package/esm/chart/utils/index.js +3 -0
  164. package/esm/chart/utils/path.js +76 -8
  165. package/esm/chart/utils/point.js +116 -5
  166. package/esm/chart/utils/scale.js +230 -1
  167. package/esm/chart/utils/scrubber.js +139 -0
  168. package/esm/chart/utils/transition.js +214 -0
  169. package/package.json +7 -5
  170. package/dts/chart/Point.d.ts +0 -103
  171. package/dts/chart/Point.d.ts.map +0 -1
  172. package/dts/chart/line/GradientLine.d.ts +0 -45
  173. package/dts/chart/line/GradientLine.d.ts.map +0 -1
  174. package/dts/chart/scrubber/ScrubberBeacon.d.ts +0 -75
  175. package/dts/chart/scrubber/ScrubberBeacon.d.ts.map +0 -1
  176. package/dts/chart/text/SmartChartTextGroup.d.ts.map +0 -1
  177. package/esm/chart/Point.js +0 -111
  178. package/esm/chart/line/GradientLine.js +0 -62
  179. 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
- }));