@coinbase/cds-mobile-visualization 0.0.0 → 3.4.0-beta.1

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 (245) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +3 -0
  3. package/dts/chart/CartesianChart.d.ts +101 -0
  4. package/dts/chart/CartesianChart.d.ts.map +1 -0
  5. package/dts/chart/ChartProvider.d.ts +6 -0
  6. package/dts/chart/ChartProvider.d.ts.map +1 -0
  7. package/dts/chart/Path.d.ts +48 -0
  8. package/dts/chart/Path.d.ts.map +1 -0
  9. package/dts/chart/PeriodSelector.d.ts +85 -0
  10. package/dts/chart/PeriodSelector.d.ts.map +1 -0
  11. package/dts/chart/Point.d.ts +103 -0
  12. package/dts/chart/Point.d.ts.map +1 -0
  13. package/dts/chart/area/Area.d.ts +62 -0
  14. package/dts/chart/area/Area.d.ts.map +1 -0
  15. package/dts/chart/area/AreaChart.d.ts +90 -0
  16. package/dts/chart/area/AreaChart.d.ts.map +1 -0
  17. package/dts/chart/area/DottedArea.d.ts +27 -0
  18. package/dts/chart/area/DottedArea.d.ts.map +1 -0
  19. package/dts/chart/area/GradientArea.d.ts +30 -0
  20. package/dts/chart/area/GradientArea.d.ts.map +1 -0
  21. package/dts/chart/area/SolidArea.d.ts +8 -0
  22. package/dts/chart/area/SolidArea.d.ts.map +1 -0
  23. package/dts/chart/area/index.d.ts +6 -0
  24. package/dts/chart/area/index.d.ts.map +1 -0
  25. package/dts/chart/axis/Axis.d.ts +204 -0
  26. package/dts/chart/axis/Axis.d.ts.map +1 -0
  27. package/dts/chart/axis/XAxis.d.ts +16 -0
  28. package/dts/chart/axis/XAxis.d.ts.map +1 -0
  29. package/dts/chart/axis/YAxis.d.ts +21 -0
  30. package/dts/chart/axis/YAxis.d.ts.map +1 -0
  31. package/dts/chart/axis/index.d.ts +4 -0
  32. package/dts/chart/axis/index.d.ts.map +1 -0
  33. package/dts/chart/bar/Bar.d.ts +89 -0
  34. package/dts/chart/bar/Bar.d.ts.map +1 -0
  35. package/dts/chart/bar/BarChart.d.ts +97 -0
  36. package/dts/chart/bar/BarChart.d.ts.map +1 -0
  37. package/dts/chart/bar/BarPlot.d.ts +29 -0
  38. package/dts/chart/bar/BarPlot.d.ts.map +1 -0
  39. package/dts/chart/bar/BarStack.d.ts +111 -0
  40. package/dts/chart/bar/BarStack.d.ts.map +1 -0
  41. package/dts/chart/bar/BarStackGroup.d.ts +35 -0
  42. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -0
  43. package/dts/chart/bar/DefaultBar.d.ts +7 -0
  44. package/dts/chart/bar/DefaultBar.d.ts.map +1 -0
  45. package/dts/chart/bar/DefaultBarStack.d.ts +7 -0
  46. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -0
  47. package/dts/chart/bar/index.d.ts +8 -0
  48. package/dts/chart/bar/index.d.ts.map +1 -0
  49. package/dts/chart/index.d.ts +13 -0
  50. package/dts/chart/index.d.ts.map +1 -0
  51. package/dts/chart/line/DottedLine.d.ts +12 -0
  52. package/dts/chart/line/DottedLine.d.ts.map +1 -0
  53. package/dts/chart/line/GradientLine.d.ts +45 -0
  54. package/dts/chart/line/GradientLine.d.ts.map +1 -0
  55. package/dts/chart/line/Line.d.ts +78 -0
  56. package/dts/chart/line/Line.d.ts.map +1 -0
  57. package/dts/chart/line/LineChart.d.ts +84 -0
  58. package/dts/chart/line/LineChart.d.ts.map +1 -0
  59. package/dts/chart/line/ReferenceLine.d.ts +91 -0
  60. package/dts/chart/line/ReferenceLine.d.ts.map +1 -0
  61. package/dts/chart/line/SolidLine.d.ts +12 -0
  62. package/dts/chart/line/SolidLine.d.ts.map +1 -0
  63. package/dts/chart/line/index.d.ts +7 -0
  64. package/dts/chart/line/index.d.ts.map +1 -0
  65. package/dts/chart/scrubber/Scrubber.d.ts +104 -0
  66. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -0
  67. package/dts/chart/scrubber/ScrubberBeacon.d.ts +75 -0
  68. package/dts/chart/scrubber/ScrubberBeacon.d.ts.map +1 -0
  69. package/dts/chart/scrubber/ScrubberProvider.d.ts +17 -0
  70. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -0
  71. package/dts/chart/scrubber/index.d.ts +2 -0
  72. package/dts/chart/scrubber/index.d.ts.map +1 -0
  73. package/dts/chart/text/ChartText.d.ts +90 -0
  74. package/dts/chart/text/ChartText.d.ts.map +1 -0
  75. package/dts/chart/text/SmartChartTextGroup.d.ts +55 -0
  76. package/dts/chart/text/SmartChartTextGroup.d.ts.map +1 -0
  77. package/dts/chart/text/index.d.ts +3 -0
  78. package/dts/chart/text/index.d.ts.map +1 -0
  79. package/dts/chart/utils/axis.d.ts +342 -0
  80. package/dts/chart/utils/axis.d.ts.map +1 -0
  81. package/dts/chart/utils/bar.d.ts +20 -0
  82. package/dts/chart/utils/bar.d.ts.map +1 -0
  83. package/dts/chart/utils/chart.d.ts +97 -0
  84. package/dts/chart/utils/chart.d.ts.map +1 -0
  85. package/dts/chart/utils/context.d.ts +95 -0
  86. package/dts/chart/utils/context.d.ts.map +1 -0
  87. package/dts/chart/utils/index.d.ts +8 -0
  88. package/dts/chart/utils/index.d.ts.map +1 -0
  89. package/dts/chart/utils/path.d.ts +107 -0
  90. package/dts/chart/utils/path.d.ts.map +1 -0
  91. package/dts/chart/utils/point.d.ts +75 -0
  92. package/dts/chart/utils/point.d.ts.map +1 -0
  93. package/dts/chart/utils/scale.d.ts +43 -0
  94. package/dts/chart/utils/scale.d.ts.map +1 -0
  95. package/dts/index.d.ts +3 -0
  96. package/dts/index.d.ts.map +1 -0
  97. package/dts/sparkline/Counter.d.ts +8 -0
  98. package/dts/sparkline/Counter.d.ts.map +1 -0
  99. package/dts/sparkline/Sparkline.d.ts +73 -0
  100. package/dts/sparkline/Sparkline.d.ts.map +1 -0
  101. package/dts/sparkline/SparklineArea.d.ts +14 -0
  102. package/dts/sparkline/SparklineArea.d.ts.map +1 -0
  103. package/dts/sparkline/SparklineAreaPattern.d.ts +14 -0
  104. package/dts/sparkline/SparklineAreaPattern.d.ts.map +1 -0
  105. package/dts/sparkline/SparklineGradient.d.ts +23 -0
  106. package/dts/sparkline/SparklineGradient.d.ts.map +1 -0
  107. package/dts/sparkline/__figma__/Sparkline.figma.d.ts +2 -0
  108. package/dts/sparkline/__figma__/Sparkline.figma.d.ts.map +1 -0
  109. package/dts/sparkline/generateSparklineWithId.d.ts +11 -0
  110. package/dts/sparkline/generateSparklineWithId.d.ts.map +1 -0
  111. package/dts/sparkline/index.d.ts +6 -0
  112. package/dts/sparkline/index.d.ts.map +1 -0
  113. package/dts/sparkline/sparkline-interactive/SparklineAccessibleView.d.ts +23 -0
  114. package/dts/sparkline/sparkline-interactive/SparklineAccessibleView.d.ts.map +1 -0
  115. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts +184 -0
  116. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts.map +1 -0
  117. package/dts/sparkline/sparkline-interactive/SparklineInteractiveAnimatedPath.d.ts +25 -0
  118. package/dts/sparkline/sparkline-interactive/SparklineInteractiveAnimatedPath.d.ts.map +1 -0
  119. package/dts/sparkline/sparkline-interactive/SparklineInteractiveHoverDate.d.ts +28 -0
  120. package/dts/sparkline/sparkline-interactive/SparklineInteractiveHoverDate.d.ts.map +1 -0
  121. package/dts/sparkline/sparkline-interactive/SparklineInteractiveLineVertical.d.ts +13 -0
  122. package/dts/sparkline/sparkline-interactive/SparklineInteractiveLineVertical.d.ts.map +1 -0
  123. package/dts/sparkline/sparkline-interactive/SparklineInteractiveMarkerDates.d.ts +17 -0
  124. package/dts/sparkline/sparkline-interactive/SparklineInteractiveMarkerDates.d.ts.map +1 -0
  125. package/dts/sparkline/sparkline-interactive/SparklineInteractiveMinMax.d.ts +11 -0
  126. package/dts/sparkline/sparkline-interactive/SparklineInteractiveMinMax.d.ts.map +1 -0
  127. package/dts/sparkline/sparkline-interactive/SparklineInteractivePanGestureHandler.d.ts +26 -0
  128. package/dts/sparkline/sparkline-interactive/SparklineInteractivePanGestureHandler.d.ts.map +1 -0
  129. package/dts/sparkline/sparkline-interactive/SparklineInteractivePaths.d.ts +25 -0
  130. package/dts/sparkline/sparkline-interactive/SparklineInteractivePaths.d.ts.map +1 -0
  131. package/dts/sparkline/sparkline-interactive/SparklineInteractivePeriodSelector.d.ts +25 -0
  132. package/dts/sparkline/sparkline-interactive/SparklineInteractivePeriodSelector.d.ts.map +1 -0
  133. package/dts/sparkline/sparkline-interactive/SparklineInteractiveProvider.d.ts +39 -0
  134. package/dts/sparkline/sparkline-interactive/SparklineInteractiveProvider.d.ts.map +1 -0
  135. package/dts/sparkline/sparkline-interactive/SparklineInteractiveTimeseriesPaths.d.ts +31 -0
  136. package/dts/sparkline/sparkline-interactive/SparklineInteractiveTimeseriesPaths.d.ts.map +1 -0
  137. package/dts/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.d.ts +2 -0
  138. package/dts/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.d.ts.map +1 -0
  139. package/dts/sparkline/sparkline-interactive/useInterruptiblePathAnimation.d.ts +13 -0
  140. package/dts/sparkline/sparkline-interactive/useInterruptiblePathAnimation.d.ts.map +1 -0
  141. package/dts/sparkline/sparkline-interactive/useMinMaxTransform.d.ts +16 -0
  142. package/dts/sparkline/sparkline-interactive/useMinMaxTransform.d.ts.map +1 -0
  143. package/dts/sparkline/sparkline-interactive/useOpacityAnimation.d.ts +6 -0
  144. package/dts/sparkline/sparkline-interactive/useOpacityAnimation.d.ts.map +1 -0
  145. package/dts/sparkline/sparkline-interactive/useSparklineInteractiveConstants.d.ts +22 -0
  146. package/dts/sparkline/sparkline-interactive/useSparklineInteractiveConstants.d.ts.map +1 -0
  147. package/dts/sparkline/sparkline-interactive/useSparklineInteractiveLineStyles.d.ts +34 -0
  148. package/dts/sparkline/sparkline-interactive/useSparklineInteractiveLineStyles.d.ts.map +1 -0
  149. package/dts/sparkline/sparkline-interactive-header/SparklineInteractiveHeader.d.ts +118 -0
  150. package/dts/sparkline/sparkline-interactive-header/SparklineInteractiveHeader.d.ts.map +1 -0
  151. package/dts/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.d.ts +2 -0
  152. package/dts/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.d.ts.map +1 -0
  153. package/dts/sparkline/sparkline-interactive-header/useSparklineInteractiveHeaderStyles.d.ts +29 -0
  154. package/dts/sparkline/sparkline-interactive-header/useSparklineInteractiveHeaderStyles.d.ts.map +1 -0
  155. package/esm/chart/CartesianChart.js +241 -0
  156. package/esm/chart/ChartProvider.js +10 -0
  157. package/esm/chart/Path.js +133 -0
  158. package/esm/chart/PeriodSelector.js +136 -0
  159. package/esm/chart/Point.js +111 -0
  160. package/esm/chart/__stories__/CartesianChart.stories.js +476 -0
  161. package/esm/chart/__stories__/Chart.stories.js +79 -0
  162. package/esm/chart/__stories__/PeriodSelector.stories.js +294 -0
  163. package/esm/chart/area/Area.js +85 -0
  164. package/esm/chart/area/AreaChart.js +146 -0
  165. package/esm/chart/area/DottedArea.js +128 -0
  166. package/esm/chart/area/GradientArea.js +110 -0
  167. package/esm/chart/area/SolidArea.js +24 -0
  168. package/esm/chart/area/__stories__/AreaChart.stories.js +100 -0
  169. package/esm/chart/area/index.js +7 -0
  170. package/esm/chart/axis/Axis.js +43 -0
  171. package/esm/chart/axis/XAxis.js +181 -0
  172. package/esm/chart/axis/YAxis.js +170 -0
  173. package/esm/chart/axis/__stories__/Axis.stories.js +277 -0
  174. package/esm/chart/axis/index.js +5 -0
  175. package/esm/chart/bar/Bar.js +67 -0
  176. package/esm/chart/bar/BarChart.js +147 -0
  177. package/esm/chart/bar/BarPlot.js +96 -0
  178. package/esm/chart/bar/BarStack.js +514 -0
  179. package/esm/chart/bar/BarStackGroup.js +89 -0
  180. package/esm/chart/bar/DefaultBar.js +78 -0
  181. package/esm/chart/bar/DefaultBarStack.js +82 -0
  182. package/esm/chart/bar/__stories__/BarChart.stories.js +282 -0
  183. package/esm/chart/bar/index.js +9 -0
  184. package/esm/chart/index.js +14 -0
  185. package/esm/chart/line/DottedLine.js +35 -0
  186. package/esm/chart/line/GradientLine.js +62 -0
  187. package/esm/chart/line/Line.js +139 -0
  188. package/esm/chart/line/LineChart.js +115 -0
  189. package/esm/chart/line/ReferenceLine.js +115 -0
  190. package/esm/chart/line/SolidLine.js +31 -0
  191. package/esm/chart/line/__stories__/LineChart.stories.js +2248 -0
  192. package/esm/chart/line/__stories__/ReferenceLine.stories.js +77 -0
  193. package/esm/chart/line/index.js +8 -0
  194. package/esm/chart/scrubber/Scrubber.js +186 -0
  195. package/esm/chart/scrubber/ScrubberBeacon.js +199 -0
  196. package/esm/chart/scrubber/ScrubberProvider.js +143 -0
  197. package/esm/chart/scrubber/index.js +2 -0
  198. package/esm/chart/text/ChartText.js +237 -0
  199. package/esm/chart/text/SmartChartTextGroup.js +210 -0
  200. package/esm/chart/text/index.js +4 -0
  201. package/esm/chart/utils/axis.js +592 -0
  202. package/esm/chart/utils/bar.js +24 -0
  203. package/esm/chart/utils/chart.js +229 -0
  204. package/esm/chart/utils/context.js +15 -0
  205. package/esm/chart/utils/index.js +9 -0
  206. package/esm/chart/utils/path.js +206 -0
  207. package/esm/chart/utils/point.js +118 -0
  208. package/esm/chart/utils/scale.js +48 -0
  209. package/esm/index.js +4 -0
  210. package/esm/sparkline/Counter.js +45 -0
  211. package/esm/sparkline/Sparkline.js +164 -0
  212. package/esm/sparkline/SparklineArea.js +19 -0
  213. package/esm/sparkline/SparklineAreaPattern.js +38 -0
  214. package/esm/sparkline/SparklineGradient.js +76 -0
  215. package/esm/sparkline/__figma__/Sparkline.figma.js +22 -0
  216. package/esm/sparkline/__stories__/Sparkline.stories.js +120 -0
  217. package/esm/sparkline/__stories__/SparklineGradient.stories.js +123 -0
  218. package/esm/sparkline/generateSparklineWithId.js +7 -0
  219. package/esm/sparkline/index.js +5 -0
  220. package/esm/sparkline/sparkline-interactive/SparklineAccessibleView.js +75 -0
  221. package/esm/sparkline/sparkline-interactive/SparklineInteractive.js +307 -0
  222. package/esm/sparkline/sparkline-interactive/SparklineInteractiveAnimatedPath.js +116 -0
  223. package/esm/sparkline/sparkline-interactive/SparklineInteractiveHoverDate.js +131 -0
  224. package/esm/sparkline/sparkline-interactive/SparklineInteractiveLineVertical.js +99 -0
  225. package/esm/sparkline/sparkline-interactive/SparklineInteractiveMarkerDates.js +82 -0
  226. package/esm/sparkline/sparkline-interactive/SparklineInteractiveMinMax.js +103 -0
  227. package/esm/sparkline/sparkline-interactive/SparklineInteractivePanGestureHandler.js +104 -0
  228. package/esm/sparkline/sparkline-interactive/SparklineInteractivePaths.js +57 -0
  229. package/esm/sparkline/sparkline-interactive/SparklineInteractivePeriodSelector.js +124 -0
  230. package/esm/sparkline/sparkline-interactive/SparklineInteractiveProvider.js +80 -0
  231. package/esm/sparkline/sparkline-interactive/SparklineInteractiveTimeseriesPaths.js +109 -0
  232. package/esm/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.js +85 -0
  233. package/esm/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.js +501 -0
  234. package/esm/sparkline/sparkline-interactive/useInterruptiblePathAnimation.js +58 -0
  235. package/esm/sparkline/sparkline-interactive/useInterruptiblePathAnimation.test.disable.js +37 -0
  236. package/esm/sparkline/sparkline-interactive/useMinMaxTransform.js +56 -0
  237. package/esm/sparkline/sparkline-interactive/useOpacityAnimation.js +23 -0
  238. package/esm/sparkline/sparkline-interactive/useSparklineInteractiveConstants.js +47 -0
  239. package/esm/sparkline/sparkline-interactive/useSparklineInteractiveLineStyles.js +34 -0
  240. package/esm/sparkline/sparkline-interactive-header/SparklineInteractiveHeader.js +233 -0
  241. package/esm/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.js +104 -0
  242. package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +555 -0
  243. package/esm/sparkline/sparkline-interactive-header/useSparklineInteractiveHeaderStyles.js +117 -0
  244. package/package.json +65 -6
  245. package/index.js +0 -1
@@ -0,0 +1,56 @@
1
+ import { useEffect } from 'react';
2
+ import { Animated } from 'react-native';
3
+ import { durations } from '@coinbase/cds-common/motion/tokens';
4
+ import { useTheme } from '@coinbase/cds-mobile/hooks/useTheme';
5
+ import { useSparklineInteractiveContext } from './SparklineInteractiveProvider';
6
+ import { useSparklineInteractiveConstants } from './useSparklineInteractiveConstants';
7
+ export function useMinMaxTransform(_ref) {
8
+ let {
9
+ minMaxLayout,
10
+ x,
11
+ transform,
12
+ opacity
13
+ } = _ref;
14
+ const theme = useTheme();
15
+ const {
16
+ height,
17
+ width
18
+ } = minMaxLayout;
19
+ const {
20
+ SparklineInteractiveMinMaxLabelHeight,
21
+ chartWidth
22
+ } = useSparklineInteractiveConstants({});
23
+ const {
24
+ gutter
25
+ } = useSparklineInteractiveContext();
26
+ useEffect(() => {
27
+ // If onLayout has not finished we don't want to show min/max
28
+ // or else it will abruptly change positions
29
+ if (height === 0 && width === 0) {
30
+ opacity.setValue(0);
31
+ return;
32
+ }
33
+
34
+ // if we have no gutter the min/max label needs some space so it's not right up against the edge of the screen
35
+ const minGutter = gutter === 0 ? theme.space['1'] : 0;
36
+
37
+ // Position min or max at center of the desired x coordinate when possible.
38
+ // If this is not possible, ensure that it's never positioned outside of chart container.
39
+ // This means the x transform should never be less than 0 or greater than chartWidth - labelWidth
40
+ const idealX = x - width / 2;
41
+ const translateX = Math.round(Math.max(minGutter, Math.min(idealX, chartWidth - width - minGutter)));
42
+ // Vertically center the min/max label within SparklineInteractiveMinMaxLabelHeight.
43
+ // This is the area between the vertical dotted line and the top or bottom
44
+ // of sparkline where min/max is displayed
45
+ const translateY = SparklineInteractiveMinMaxLabelHeight / 2 - height / 2;
46
+ transform.setValue({
47
+ x: translateX,
48
+ y: translateY
49
+ });
50
+ Animated.timing(opacity, {
51
+ toValue: 1,
52
+ duration: durations.moderate1,
53
+ useNativeDriver: true
54
+ }).start();
55
+ }, [SparklineInteractiveMinMaxLabelHeight, chartWidth, gutter, height, opacity, theme.space, transform, width, x]);
56
+ }
@@ -0,0 +1,23 @@
1
+ import { useMemo, useRef } from 'react';
2
+ import { Animated } from 'react-native';
3
+ import { fadeDuration } from '@coinbase/cds-common/tokens/sparkline';
4
+ export function useOpacityAnimation(initialValue, duration) {
5
+ if (initialValue === void 0) {
6
+ initialValue = 0;
7
+ }
8
+ if (duration === void 0) {
9
+ duration = fadeDuration;
10
+ }
11
+ const animation = useRef(new Animated.Value(initialValue)).current;
12
+ const animateIn = useMemo(() => Animated.timing(animation, {
13
+ toValue: 1,
14
+ duration,
15
+ useNativeDriver: true
16
+ }), [animation, duration]);
17
+ const animateOut = useMemo(() => Animated.timing(animation, {
18
+ toValue: 0,
19
+ duration,
20
+ useNativeDriver: true
21
+ }), [animation, duration]);
22
+ return [animation, animateIn, animateOut];
23
+ }
@@ -0,0 +1,47 @@
1
+ import { useMemo } from 'react';
2
+ import { useWindowDimensions } from 'react-native';
3
+ import { borderWidth, chartCompactHeight, chartHeight as chartHeightToken } from '@coinbase/cds-common/tokens/sparkline';
4
+ import { useTheme } from '@coinbase/cds-mobile/hooks/useTheme';
5
+ import { useSparklineInteractiveContext } from './SparklineInteractiveProvider';
6
+ export function useSparklineInteractiveConstants(_ref) {
7
+ let {
8
+ compact = false
9
+ } = _ref;
10
+ const theme = useTheme();
11
+ const {
12
+ width: screenWidth
13
+ } = useWindowDimensions();
14
+ const {
15
+ gutter
16
+ } = useSparklineInteractiveContext();
17
+ return useMemo(() => {
18
+ const chartHorizontalGutter = theme.space[gutter];
19
+ const chartWidth = screenWidth - chartHorizontalGutter * 2;
20
+ const chartHeight = compact ? chartCompactHeight : chartHeightToken;
21
+ const chartMarkerSize = theme.space[2];
22
+ const SparklineInteractiveMinMaxLabelHeight = theme.space[3];
23
+ const SparklineInteractiveMinMaxVerticalGutter = theme.space[0.5];
24
+ const chartVerticalLineWidth = borderWidth;
25
+ const xRange = [borderWidth, chartWidth - borderWidth];
26
+ const yRange = [chartHeight - borderWidth, borderWidth];
27
+ const startX = 0;
28
+ const endX = xRange[1];
29
+ return {
30
+ chartHorizontalGutter,
31
+ chartWidth,
32
+ chartHeight,
33
+ chartDimensionStyles: {
34
+ height: chartHeight,
35
+ width: chartWidth
36
+ },
37
+ chartMarkerSize,
38
+ SparklineInteractiveMinMaxLabelHeight,
39
+ SparklineInteractiveMinMaxVerticalGutter,
40
+ chartVerticalLineWidth,
41
+ xRange,
42
+ yRange,
43
+ startX,
44
+ endX
45
+ };
46
+ }, [compact, gutter, screenWidth, theme.space]);
47
+ }
@@ -0,0 +1,34 @@
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
+ import { useMemo } from 'react';
3
+ import { borderWidth, lineDashArray, lineOpacity } from '@coinbase/cds-common/tokens/sparkline';
4
+ import { useTheme } from '@coinbase/cds-mobile/hooks/useTheme';
5
+ const staticLineProps = {
6
+ x1: 0,
7
+ x2: 0,
8
+ y1: 0,
9
+ y2: 0,
10
+ strokeDasharray: lineDashArray
11
+ };
12
+ export function useSparklineInteractiveLineStyles() {
13
+ const theme = useTheme();
14
+ return useMemo(() => {
15
+ const chartLineSize = theme.space[0.5];
16
+ return {
17
+ dotStyle: [{
18
+ backgroundColor: theme.color.fgMuted
19
+ }, {
20
+ position: 'absolute',
21
+ top: -chartLineSize / 2,
22
+ left: -chartLineSize / 2,
23
+ height: chartLineSize,
24
+ width: chartLineSize,
25
+ borderRadius: chartLineSize / 2,
26
+ opacity: lineOpacity
27
+ }],
28
+ lineProps: _extends({}, staticLineProps, {
29
+ strokeWidth: borderWidth,
30
+ stroke: theme.color.fgMuted
31
+ })
32
+ };
33
+ }, [theme.color.fgMuted, theme.space]);
34
+ }
@@ -0,0 +1,233 @@
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
+ import React, { forwardRef, memo, useCallback, useImperativeHandle, useRef } from 'react';
3
+ import { TextInput, View } from 'react-native';
4
+ import { subheadIconSignMap } from '@coinbase/cds-common/tokens/sparkline';
5
+ import { HStack, VStack } from '@coinbase/cds-mobile/layout';
6
+ import { useSparklineInteractiveHeaderStyles } from './useSparklineInteractiveHeaderStyles';
7
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
8
+ export * from '@coinbase/cds-common/types/SparklineInteractiveHeaderBaseProps';
9
+ export const interpolateSubHeadText = subHead => {
10
+ if (subHead.priceChange && subHead.percent) {
11
+ return subHead.priceChange + " (" + subHead.percent + ")";
12
+ }
13
+ if (subHead.priceChange) {
14
+ return subHead.priceChange;
15
+ }
16
+ return '';
17
+ };
18
+ const Trailing = _ref => {
19
+ let {
20
+ children
21
+ } = _ref;
22
+ if (children) {
23
+ return /*#__PURE__*/_jsx(VStack, {
24
+ alignItems: "center",
25
+ flexShrink: 0,
26
+ justifyContent: "center",
27
+ paddingStart: 2,
28
+ children: children
29
+ });
30
+ }
31
+ return null;
32
+ };
33
+ const SparklineInteractiveHeaderStable = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2, forwardedRef) => {
34
+ let {
35
+ defaultLabel,
36
+ defaultTitle,
37
+ defaultSubHead,
38
+ testID,
39
+ trailing,
40
+ labelNode
41
+ } = _ref2;
42
+ const labelRef = useRef(null);
43
+ const titleRef = useRef(null);
44
+ const subHeadRef = useRef(null);
45
+ const subHeadIconRef = useRef(null);
46
+ const subHeadAccessoryRef = useRef(null);
47
+ const valuesRef = useRef({
48
+ title: defaultTitle,
49
+ label: defaultLabel,
50
+ subHead: defaultSubHead
51
+ });
52
+ const styles = useSparklineInteractiveHeaderStyles();
53
+ const updateLabel = useCallback(label => {
54
+ var _valuesRef$current;
55
+ const prevLabel = (_valuesRef$current = valuesRef.current) == null ? void 0 : _valuesRef$current.label;
56
+ if (prevLabel !== label) {
57
+ var _labelRef$current;
58
+ // BAD: We only disabled this lint rule to enable eslint upgrade after this component was implemented. These apis should never be used.
59
+ // Usage in this component are known making this a high risk component. Contact team for more information.
60
+
61
+ (_labelRef$current = labelRef.current) == null || _labelRef$current.setNativeProps({
62
+ text: label
63
+ });
64
+ valuesRef.current = _extends({}, valuesRef.current, {
65
+ label
66
+ });
67
+ }
68
+ }, []);
69
+ const updateTitle = useCallback(title => {
70
+ var _valuesRef$current2;
71
+ const prevTitle = (_valuesRef$current2 = valuesRef.current) == null ? void 0 : _valuesRef$current2.title;
72
+ if (prevTitle !== title && typeof title === 'string') {
73
+ var _titleRef$current;
74
+ // BAD: We only disabled this lint rule to enable eslint upgrade after this component was implemented. These apis should never be used.
75
+ // Usage in this component are known making this a high risk component. Contact team for more information.
76
+
77
+ (_titleRef$current = titleRef.current) == null || _titleRef$current.setNativeProps({
78
+ text: title,
79
+ style: styles.title(title)
80
+ });
81
+ valuesRef.current = _extends({}, valuesRef.current, {
82
+ title
83
+ });
84
+ }
85
+ }, [styles]);
86
+ const updateSubHead = useCallback(subHead => {
87
+ var _valuesRef$current3;
88
+ const prevSubHead = (_valuesRef$current3 = valuesRef.current) == null ? void 0 : _valuesRef$current3.subHead;
89
+ if (prevSubHead !== subHead) {
90
+ var _subHeadIconRef$curre, _subHeadRef$current, _subHeadAccessoryRef$, _subHead$accessoryTex;
91
+ // BAD: We only disabled this lint rule to enable eslint upgrade after this component was implemented. These apis should never be used.
92
+ // Usage in this component are known making this a high risk component. Contact team for more information.
93
+
94
+ (_subHeadIconRef$curre = subHeadIconRef.current) == null || _subHeadIconRef$curre.setNativeProps({
95
+ text: subheadIconSignMap[subHead.sign],
96
+ style: styles.subHeadIcon(subHead.variant)
97
+ });
98
+ // BAD: We only disabled this lint rule to enable eslint upgrade after this component was implemented. These apis should never be used.
99
+ // Usage in this component are known making this a high risk component. Contact team for more information.
100
+
101
+ (_subHeadRef$current = subHeadRef.current) == null || _subHeadRef$current.setNativeProps({
102
+ text: interpolateSubHeadText(subHead),
103
+ style: styles.subHead(subHead.variant, subHead.accessoryText === undefined)
104
+ });
105
+ // BAD: We only disabled this lint rule to enable eslint upgrade after this component was implemented. These apis should never be used.
106
+ // Usage in this component are known making this a high risk component. Contact team for more information.
107
+
108
+ (_subHeadAccessoryRef$ = subHeadAccessoryRef.current) == null || _subHeadAccessoryRef$.setNativeProps({
109
+ text: (_subHead$accessoryTex = subHead.accessoryText) != null ? _subHead$accessoryTex : '',
110
+ style: styles.subHeadAccessory()
111
+ });
112
+ valuesRef.current = _extends({}, valuesRef.current, {
113
+ subHead
114
+ });
115
+ }
116
+ }, [styles]);
117
+
118
+ // update is triggered from a parent component.
119
+ // We track the values of each input in a valuesRef object
120
+ // so that we can avoid updating unnecessarily if previous
121
+ // value is the same as the new value
122
+ const update = useCallback(_ref3 => {
123
+ let {
124
+ label,
125
+ title,
126
+ subHead
127
+ } = _ref3;
128
+ if (label) {
129
+ updateLabel(label);
130
+ }
131
+ if (title) {
132
+ updateTitle(title);
133
+ }
134
+ if (subHead) {
135
+ updateSubHead(subHead);
136
+ }
137
+ }, [updateLabel, updateSubHead, updateTitle]);
138
+ useImperativeHandle(forwardedRef, () => {
139
+ return {
140
+ update
141
+ };
142
+ }, [update]);
143
+ const label = !!defaultLabel && /*#__PURE__*/_jsx(TextInput, {
144
+ ref: labelRef,
145
+ defaultValue: defaultLabel,
146
+ editable: false,
147
+ pointerEvents: "none",
148
+ style: styles.label,
149
+ testID: "SparklineInteractiveHeaderLabel"
150
+ });
151
+ const title = /*#__PURE__*/_jsxs(_Fragment, {
152
+ children: [/*#__PURE__*/_jsx(View, {
153
+ children: typeof defaultTitle === 'string' ? /*#__PURE__*/_jsx(TextInput, {
154
+ ref: titleRef,
155
+ defaultValue: defaultTitle,
156
+ editable: false,
157
+ pointerEvents: "none",
158
+ style: styles.title(defaultTitle),
159
+ testID: "SparklineInteractiveHeaderTitle"
160
+ }) : defaultTitle
161
+ }), !!defaultSubHead && /*#__PURE__*/_jsxs(HStack, {
162
+ accessible: true,
163
+ alignItems: "center",
164
+ padding: 0,
165
+ children: [/*#__PURE__*/_jsx(TextInput, {
166
+ ref: subHeadIconRef,
167
+ defaultValue: subheadIconSignMap[defaultSubHead.sign],
168
+ editable: false,
169
+ pointerEvents: "none",
170
+ style: styles.subHeadIcon(defaultSubHead.variant),
171
+ testID: "SparklineInteractiveHeaderSubHeadIcon"
172
+ }), /*#__PURE__*/_jsx(TextInput, {
173
+ ref: subHeadRef,
174
+ defaultValue: interpolateSubHeadText(defaultSubHead),
175
+ editable: false,
176
+ pointerEvents: "none",
177
+ style: styles.subHead(defaultSubHead.variant, defaultSubHead.accessoryText === undefined),
178
+ testID: "SparklineInteractiveHeaderSubHead"
179
+ }), !!defaultSubHead.accessoryText && /*#__PURE__*/_jsx(TextInput, {
180
+ ref: subHeadAccessoryRef,
181
+ defaultValue: defaultSubHead.accessoryText,
182
+ editable: false,
183
+ pointerEvents: "none",
184
+ style: styles.subHeadAccessory(),
185
+ testID: "SparklineInteractiveHeaderSubHead"
186
+ })]
187
+ })]
188
+ });
189
+ const trendA11yLabel = defaultSubHead ? "" + ((defaultSubHead == null ? void 0 : defaultSubHead.variant) === 'positive' ? 'up' : 'down') : '';
190
+ const headerA11yLabel = defaultLabel + ", " + defaultTitle + ", " + trendA11yLabel + " " + (defaultSubHead == null ? void 0 : defaultSubHead.priceChange) + ", " + (defaultSubHead == null ? void 0 : defaultSubHead.percent);
191
+ return /*#__PURE__*/_jsxs(HStack, {
192
+ accessibilityHint: "The price and difference for this time period",
193
+ accessibilityLabel: "Asset summary",
194
+ accessibilityRole: "header",
195
+ "aria-live": "polite",
196
+ justifyContent: "space-between",
197
+ padding: 0,
198
+ testID: testID,
199
+ children: [/*#__PURE__*/_jsxs(VStack, {
200
+ accessible: true,
201
+ accessibilityLabel: headerA11yLabel,
202
+ flexShrink: 1,
203
+ padding: 0,
204
+ children: [labelNode != null ? labelNode : label, title]
205
+ }), /*#__PURE__*/_jsx(Trailing, {
206
+ children: trailing
207
+ })]
208
+ });
209
+ }));
210
+ export const SparklineInteractiveHeader = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref4, ref) => {
211
+ let {
212
+ defaultLabel,
213
+ defaultTitle,
214
+ defaultSubHead,
215
+ testID,
216
+ trailing,
217
+ labelNode
218
+ } = _ref4;
219
+ return /*#__PURE__*/_jsx(SparklineInteractiveHeaderStable
220
+ // All updates after initial load should be handled imperatively
221
+ // via update function in forwarded ref to prevent overriding
222
+ // values unexpectedly. This is why we use ref here so that the
223
+ // default value is stable and never updates on re-renders
224
+ , {
225
+ ref: ref,
226
+ defaultLabel: useRef(defaultLabel).current,
227
+ defaultSubHead: useRef(defaultSubHead).current,
228
+ defaultTitle: useRef(defaultTitle).current,
229
+ labelNode: labelNode,
230
+ testID: testID,
231
+ trailing: trailing
232
+ });
233
+ }));
@@ -0,0 +1,104 @@
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
+ import React from 'react';
3
+ import { figma } from '@figma/code-connect';
4
+ import { SparklineInteractive } from '../../sparkline-interactive/SparklineInteractive';
5
+ import { SparklineInteractiveHeader } from '../SparklineInteractiveHeader';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ figma.connect(SparklineInteractiveHeader, 'https://www.figma.com/design/k5CtyJccNQUGMI5bI4lJ2g/✨-CDS-Components?node-id=320-14931&m=dev', {
8
+ imports: ["import { SparklineInteractiveHeader } from '@coinbase/cds-web-visualization';", "import { SparklineInteractive } from '@coinbase/cds-web-visualization';"],
9
+ props: {
10
+ compact: figma.boolean('compact'),
11
+ disableScrubbing: figma.boolean('scrubbing', {
12
+ false: true,
13
+ true: false
14
+ })
15
+ },
16
+ example: props => {
17
+ const periods = [{
18
+ label: '1H',
19
+ value: 'hour'
20
+ }, {
21
+ label: '1D',
22
+ value: 'day'
23
+ }, {
24
+ label: '1W',
25
+ value: 'week'
26
+ }, {
27
+ label: '1M',
28
+ value: 'month'
29
+ }, {
30
+ label: '1Y',
31
+ value: 'year'
32
+ }, {
33
+ label: 'All',
34
+ value: 'all'
35
+ }];
36
+ const data = {
37
+ hour: [],
38
+ day: [{
39
+ value: 49259.38,
40
+ date: new Date('2021-12-05T04:00:00.000Z')
41
+ }, {
42
+ value: 49163.79,
43
+ date: new Date('2021-12-05T04:05:00.000Z')
44
+ }, {
45
+ value: 49146.66,
46
+ date: new Date('2021-12-05T04:10:00.000Z')
47
+ }, {
48
+ value: 49083.92,
49
+ date: new Date('2021-12-05T04:15:00.000Z')
50
+ }, {
51
+ value: 49115.3,
52
+ date: new Date('2021-12-05T04:20:00.000Z')
53
+ }, {
54
+ value: 48992.14,
55
+ date: new Date('2021-12-05T04:25:00.000Z')
56
+ }, {
57
+ value: 49075.75,
58
+ date: new Date('2021-12-05T04:30:00.000Z')
59
+ }, {
60
+ value: 49025.78,
61
+ date: new Date('2021-12-05T04:35:00.000Z')
62
+ }, {
63
+ value: 49066.23,
64
+ date: new Date('2021-12-05T04:40:00.000Z')
65
+ }, {
66
+ value: 49247.82,
67
+ date: new Date('2021-12-05T04:45:00.000Z')
68
+ }],
69
+ week: [],
70
+ month: [],
71
+ year: [],
72
+ all: []
73
+ };
74
+ const defaultSubHead = {
75
+ percent: '1.35%',
76
+ sign: 'upwardTrend',
77
+ variant: 'positive',
78
+ accessibilityLabel: 'on Sunday, December 5, 2021 at 10:55 PM, up',
79
+ priceChange: '$21.36'
80
+ };
81
+ const header = /*#__PURE__*/_jsx(SparklineInteractiveHeader, {
82
+ defaultLabel: "Portfolio balance"
83
+ // @ts-expect-error: defaultSubHead is not part of the type definition
84
+ ,
85
+ defaultSubHead: defaultSubHead,
86
+ defaultTitle: "$10,023.82"
87
+ });
88
+ return /*#__PURE__*/_jsx(SparklineInteractive, _extends({
89
+ data: data,
90
+ defaultPeriod: "day",
91
+ formatDate: date => date.toLocaleString('en-US', {
92
+ timeZone: 'America/New_York',
93
+ hour: 'numeric',
94
+ minute: 'numeric'
95
+ }),
96
+ headerNode: header,
97
+ onPeriodChanged: () => {},
98
+ onScrub: () => {},
99
+ onScrubEnd: () => {},
100
+ periods: periods,
101
+ strokeColor: "#cb51bb"
102
+ }, props));
103
+ }
104
+ });