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

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 +122 -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 +220 -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,21 +1,23 @@
1
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 { memo, useCallback, useMemo } from 'react';
2
+ import { memo, useCallback, useMemo, useState } from 'react';
3
3
  import { Image, ScrollView, StyleSheet } from 'react-native';
4
- import { Circle, G } from 'react-native-svg';
5
4
  import { assets } from '@coinbase/cds-common/internal/data/assets';
6
5
  import { candles as btcCandles } from '@coinbase/cds-common/internal/data/candles';
7
6
  import { Example, ExampleScreen } from '@coinbase/cds-mobile/examples/ExampleScreen';
8
7
  import { useTheme } from '@coinbase/cds-mobile/hooks/useTheme';
9
8
  import { Box, HStack, VStack } from '@coinbase/cds-mobile/layout';
10
- import { TextLabel1, TextLabel2, TextTitle1, TextTitle2 } from '@coinbase/cds-mobile/typography';
9
+ import { Text } from '@coinbase/cds-mobile/typography';
10
+ import { Circle, Group } from '@shopify/react-native-skia';
11
11
  import { Area } from '../area/Area';
12
12
  import { XAxis, YAxis } from '../axis';
13
13
  import { BarPlot } from '../bar/BarPlot';
14
14
  import { useCartesianChartContext } from '../ChartProvider';
15
15
  import { Line } from '../line/Line';
16
+ import { Point } from '../point/Point';
16
17
  import { Scrubber } from '../scrubber/Scrubber';
18
+ import { ChartText } from '../text';
17
19
  import { isCategoricalScale } from '../utils';
18
- import { CartesianChart, DottedArea, GradientLine, ReferenceLine, SolidLine } from '../';
20
+ import { CartesianChart, DottedArea, ReferenceLine, SolidLine } from '../';
19
21
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
20
22
  const defaultChartHeight = 250;
21
23
  const LineStyles = () => {
@@ -47,14 +49,9 @@ const LineStyles = () => {
47
49
  seriesId: "upperMiddle",
48
50
  type: "dotted"
49
51
  }), /*#__PURE__*/_jsx(Line, {
50
- LineComponent: lineProps => /*#__PURE__*/_jsx(GradientLine, {
51
- d: lineProps.d,
52
- endColor: "#F7931A",
53
- startColor: "#E3D74D",
54
- stroke: lineProps.stroke,
55
- strokeOpacity: lineProps.strokeOpacity,
52
+ LineComponent: lineProps => /*#__PURE__*/_jsx(SolidLine, _extends({}, lineProps, {
56
53
  strokeWidth: 4
57
- }),
54
+ })),
58
55
  curve: "natural",
59
56
  seriesId: "lowerMiddle"
60
57
  }), /*#__PURE__*/_jsx(Line, {
@@ -108,7 +105,7 @@ const EarningsHistory = () => {
108
105
 
109
106
  // Have circle diameter be the smaller of the x scale bandwidth or 10% of the y space available
110
107
  const diameter = Math.min(xScale.bandwidth(), yScaleSize / 10);
111
- return /*#__PURE__*/_jsx(G, {
108
+ return /*#__PURE__*/_jsx(Group, {
112
109
  children: data.map((value, index) => {
113
110
  if (value === null || value === undefined) return null;
114
111
 
@@ -122,9 +119,9 @@ const EarningsHistory = () => {
122
119
  const centerY = yScale(yValue);
123
120
  if (centerY === undefined) return null;
124
121
  return /*#__PURE__*/_jsx(Circle, {
122
+ color: (series == null ? void 0 : series.color) || theme.color.fgPrimary,
125
123
  cx: centerX,
126
124
  cy: centerY,
127
- fill: (series == null ? void 0 : series.color) || theme.color.fgPrimary,
128
125
  opacity: opacity,
129
126
  r: diameter / 2
130
127
  }, seriesId + "-" + index);
@@ -158,7 +155,7 @@ const EarningsHistory = () => {
158
155
  backgroundColor: theme.color.bgPositive
159
156
  }
160
157
  });
161
- const LegendItem = /*#__PURE__*/memo(_ref2 => {
158
+ const LegendEntry = /*#__PURE__*/memo(_ref2 => {
162
159
  let {
163
160
  opacity = 1,
164
161
  label
@@ -171,7 +168,8 @@ const EarningsHistory = () => {
171
168
  style: [styles.legendDot, {
172
169
  opacity
173
170
  }]
174
- }), /*#__PURE__*/_jsx(TextLabel2, {
171
+ }), /*#__PURE__*/_jsx(Text, {
172
+ font: "label2",
175
173
  children: label
176
174
  })]
177
175
  });
@@ -186,7 +184,6 @@ const EarningsHistory = () => {
186
184
  left: 0,
187
185
  right: 0
188
186
  },
189
- overflow: "visible",
190
187
  series: [{
191
188
  id: 'estimatedEPS',
192
189
  data: estimatedEPS,
@@ -220,36 +217,33 @@ const EarningsHistory = () => {
220
217
  }), /*#__PURE__*/_jsxs(HStack, {
221
218
  gap: 2,
222
219
  justifyContent: "flex-end",
223
- children: [/*#__PURE__*/_jsx(LegendItem, {
220
+ children: [/*#__PURE__*/_jsx(LegendEntry, {
224
221
  label: "Estimated EPS",
225
222
  opacity: 0.5
226
- }), /*#__PURE__*/_jsx(LegendItem, {
223
+ }), /*#__PURE__*/_jsx(LegendEntry, {
227
224
  label: "Actual EPS"
228
225
  })]
229
226
  })]
230
227
  });
231
228
  };
232
- const PriceWithVolume = () => {
229
+ const btcData = btcCandles.slice(0, 180).reverse();
230
+ const btcPrices = btcData.map(candle => parseFloat(candle.close));
231
+ const btcVolumes = btcData.map(candle => parseFloat(candle.volume));
232
+ const btcDates = btcData.map(candle => new Date(parseInt(candle.start) * 1000));
233
+ const displayIndex = btcPrices.length - 1;
234
+ const currentPrice = btcPrices[displayIndex];
235
+ const currentDate = btcDates[displayIndex];
236
+ const PriceWithVolumeChart = /*#__PURE__*/memo(_ref3 => {
237
+ let {
238
+ onScrubberPositionChange
239
+ } = _ref3;
233
240
  const theme = useTheme();
234
- const btcData = btcCandles.slice(0, 180).reverse();
235
- const btcPrices = btcData.map(candle => parseFloat(candle.close));
236
- const btcVolumes = btcData.map(candle => parseFloat(candle.volume));
237
- const btcDates = btcData.map(candle => new Date(parseInt(candle.start) * 1000));
238
- const formatPrice = useCallback(price => {
239
- return "$" + price.toLocaleString('en-US', {
240
- minimumFractionDigits: 2,
241
- maximumFractionDigits: 2
242
- });
243
- }, []);
244
241
  const formatPriceInThousands = useCallback(price => {
245
242
  return "$" + (price / 1000).toLocaleString('en-US', {
246
243
  minimumFractionDigits: 0,
247
244
  maximumFractionDigits: 2
248
245
  }) + "k";
249
246
  }, []);
250
- const formatVolume = useCallback(volume => {
251
- return (volume / 1000).toFixed(2) + "K";
252
- }, []);
253
247
  const formatDate = useCallback(date => {
254
248
  return date.toLocaleDateString('en-US', {
255
249
  month: 'short',
@@ -258,110 +252,151 @@ const PriceWithVolume = () => {
258
252
  }, []);
259
253
  const scrubberLabel = useCallback(dataIndex => {
260
254
  return formatDate(btcDates[dataIndex]);
261
- }, [btcDates, formatDate]);
262
-
263
- // Display the last values in the header
264
- const displayIndex = btcPrices.length - 1;
265
- const currentPrice = btcPrices[displayIndex];
266
- const currentVolume = btcVolumes[displayIndex];
267
- const currentDate = btcDates[displayIndex];
268
- return /*#__PURE__*/_jsxs(VStack, {
255
+ }, [formatDate]);
256
+ return /*#__PURE__*/_jsxs(CartesianChart, {
257
+ enableScrubbing: true,
258
+ height: defaultChartHeight,
259
+ onScrubberPositionChange: onScrubberPositionChange,
260
+ series: [{
261
+ id: 'prices',
262
+ data: btcPrices,
263
+ color: assets.btc.color,
264
+ yAxisId: 'price'
265
+ }, {
266
+ id: 'volume',
267
+ data: btcVolumes,
268
+ color: theme.color.fgMuted,
269
+ yAxisId: 'volume'
270
+ }],
271
+ xAxis: {
272
+ scaleType: 'band',
273
+ range: _ref4 => {
274
+ let {
275
+ min,
276
+ max
277
+ } = _ref4;
278
+ return {
279
+ min,
280
+ max: max - 8
281
+ };
282
+ }
283
+ },
284
+ yAxis: [{
285
+ id: 'price',
286
+ domain: _ref5 => {
287
+ let {
288
+ min,
289
+ max
290
+ } = _ref5;
291
+ return {
292
+ min: min * 0.9,
293
+ max
294
+ };
295
+ }
296
+ }, {
297
+ id: 'volume',
298
+ range: _ref6 => {
299
+ let {
300
+ min,
301
+ max
302
+ } = _ref6;
303
+ return {
304
+ min: max - 32,
305
+ max
306
+ };
307
+ }
308
+ }],
309
+ children: [/*#__PURE__*/_jsx(YAxis, {
310
+ showGrid: true,
311
+ axisId: "price",
312
+ tickLabelFormatter: formatPriceInThousands,
313
+ width: 20
314
+ }), /*#__PURE__*/_jsx(BarPlot, {
315
+ seriesIds: ['volume']
316
+ }), /*#__PURE__*/_jsx(Line, {
317
+ showArea: true,
318
+ seriesId: "prices"
319
+ }), /*#__PURE__*/_jsx(Scrubber, {
320
+ label: scrubberLabel,
321
+ seriesIds: ['prices']
322
+ })]
323
+ });
324
+ });
325
+ const PriceWithVolumeHeader = /*#__PURE__*/memo(_ref7 => {
326
+ let {
327
+ currentIndex
328
+ } = _ref7;
329
+ const theme = useTheme();
330
+ const formatPrice = useCallback(price => {
331
+ return "$" + price.toLocaleString('en-US', {
332
+ minimumFractionDigits: 2,
333
+ maximumFractionDigits: 2
334
+ });
335
+ }, []);
336
+ const formatDate = useCallback(date => {
337
+ return date.toLocaleDateString('en-US', {
338
+ month: 'short',
339
+ day: 'numeric'
340
+ });
341
+ }, []);
342
+ const formatVolume = useCallback(volume => {
343
+ return (volume / 1000).toFixed(2) + "K";
344
+ }, []);
345
+ const volumeText = useMemo(() => {
346
+ return formatVolume(currentIndex !== undefined ? btcVolumes[currentIndex] : btcVolumes[displayIndex]);
347
+ }, [currentIndex, formatVolume]);
348
+ return /*#__PURE__*/_jsxs(HStack, {
269
349
  gap: 2,
270
- children: [/*#__PURE__*/_jsxs(HStack, {
350
+ justifyContent: "space-between",
351
+ paddingX: 0,
352
+ children: [/*#__PURE__*/_jsxs(VStack, {
353
+ gap: 0,
354
+ children: [/*#__PURE__*/_jsx(Text, {
355
+ font: "title1",
356
+ children: "Bitcoin"
357
+ }), /*#__PURE__*/_jsx(Text, {
358
+ font: "title2",
359
+ children: formatPrice(currentPrice)
360
+ })]
361
+ }), /*#__PURE__*/_jsxs(HStack, {
271
362
  gap: 2,
272
- justifyContent: "space-between",
273
- paddingX: 0,
274
363
  children: [/*#__PURE__*/_jsxs(VStack, {
275
- gap: 0,
276
- children: [/*#__PURE__*/_jsx(TextTitle1, {
277
- children: "Bitcoin"
278
- }), /*#__PURE__*/_jsx(TextTitle2, {
279
- children: formatPrice(currentPrice)
364
+ alignItems: "flex-end",
365
+ justifyContent: "center",
366
+ children: [/*#__PURE__*/_jsx(Text, {
367
+ font: "label1",
368
+ children: formatDate(currentDate)
369
+ }), /*#__PURE__*/_jsx(Text, {
370
+ font: "label2",
371
+ children: volumeText
280
372
  })]
281
- }), /*#__PURE__*/_jsxs(HStack, {
282
- gap: 2,
283
- children: [/*#__PURE__*/_jsxs(VStack, {
284
- alignItems: "flex-end",
285
- justifyContent: "center",
286
- children: [/*#__PURE__*/_jsx(TextLabel1, {
287
- children: formatDate(currentDate)
288
- }), /*#__PURE__*/_jsx(TextLabel2, {
289
- children: formatVolume(currentVolume)
290
- })]
291
- }), /*#__PURE__*/_jsx(VStack, {
292
- justifyContent: "center",
293
- children: /*#__PURE__*/_jsx(Image, {
294
- source: {
295
- uri: assets.btc.imageUrl
296
- },
297
- style: {
298
- width: theme.iconSize.l,
299
- height: theme.iconSize.l,
300
- borderRadius: 1000
301
- }
302
- })
303
- })]
304
- })]
305
- }), /*#__PURE__*/_jsxs(CartesianChart, {
306
- enableScrubbing: true,
307
- height: defaultChartHeight,
308
- series: [{
309
- id: 'prices',
310
- data: btcPrices,
311
- color: assets.btc.color,
312
- yAxisId: 'price'
313
- }, {
314
- id: 'volume',
315
- data: btcVolumes,
316
- color: theme.color.fgMuted,
317
- yAxisId: 'volume'
318
- }],
319
- xAxis: {
320
- scaleType: 'band'
321
- },
322
- yAxis: [{
323
- id: 'price',
324
- domain: _ref3 => {
325
- let {
326
- min,
327
- max
328
- } = _ref3;
329
- return {
330
- min: min * 0.9,
331
- max
332
- };
333
- }
334
- }, {
335
- id: 'volume',
336
- range: _ref4 => {
337
- let {
338
- min,
339
- max
340
- } = _ref4;
341
- return {
342
- min: max - 32,
343
- max
344
- };
345
- }
346
- }],
347
- children: [/*#__PURE__*/_jsx(YAxis, {
348
- showGrid: true,
349
- axisId: "price",
350
- tickLabelFormatter: formatPriceInThousands,
351
- width: 20
352
- }), /*#__PURE__*/_jsx(BarPlot, {
353
- seriesIds: ['volume']
354
- }), /*#__PURE__*/_jsx(Line, {
355
- showArea: true,
356
- curve: "monotone",
357
- seriesId: "prices"
358
- }), /*#__PURE__*/_jsx(Scrubber, {
359
- label: scrubberLabel,
360
- seriesIds: ['prices']
373
+ }), /*#__PURE__*/_jsx(VStack, {
374
+ justifyContent: "center",
375
+ children: /*#__PURE__*/_jsx(Image, {
376
+ source: {
377
+ uri: assets.btc.imageUrl
378
+ },
379
+ style: {
380
+ width: theme.iconSize.l,
381
+ height: theme.iconSize.l,
382
+ borderRadius: 1000
383
+ }
384
+ })
361
385
  })]
362
386
  })]
363
387
  });
364
- };
388
+ });
389
+ const PriceWithVolume = /*#__PURE__*/memo(() => {
390
+ const [currentIndex, setCurrentIndex] = useState();
391
+ return /*#__PURE__*/_jsxs(VStack, {
392
+ gap: 2,
393
+ children: [/*#__PURE__*/_jsx(PriceWithVolumeHeader, {
394
+ currentIndex: currentIndex
395
+ }), /*#__PURE__*/_jsx(PriceWithVolumeChart, {
396
+ onScrubberPositionChange: setCurrentIndex
397
+ })]
398
+ });
399
+ });
365
400
  function TradingTrends() {
366
401
  const theme = useTheme();
367
402
  const profitData = [34, 24, 28, -4, 8, -16, -3, 12, 24, 18, 20, 28];
@@ -402,11 +437,11 @@ function TradingTrends() {
402
437
  },
403
438
  yAxis: [{
404
439
  id: 'profit',
405
- range: _ref5 => {
440
+ range: _ref8 => {
406
441
  let {
407
442
  min,
408
443
  max
409
- } = _ref5;
444
+ } = _ref8;
410
445
  return {
411
446
  min: min,
412
447
  max: max - 64
@@ -418,11 +453,11 @@ function TradingTrends() {
418
453
  }
419
454
  }, {
420
455
  id: 'revenue',
421
- range: _ref6 => {
456
+ range: _ref9 => {
422
457
  let {
423
458
  min,
424
459
  max
425
- } = _ref6;
460
+ } = _ref9;
426
461
  return {
427
462
  min: max - 64,
428
463
  max
@@ -446,11 +481,146 @@ function TradingTrends() {
446
481
  seriesIds: ['gains', 'losses']
447
482
  }), /*#__PURE__*/_jsx(Line, {
448
483
  showArea: true,
449
- curve: "monotone",
450
484
  seriesId: "revenue"
451
485
  })]
452
486
  });
453
487
  }
488
+ const ScatterplotWithCustomLabels = /*#__PURE__*/memo(() => {
489
+ const theme = useTheme();
490
+ const dataPoints = useMemo(() => [{
491
+ x: 12,
492
+ y: 34,
493
+ label: 'A',
494
+ color: theme.color.accentBoldBlue
495
+ }, {
496
+ x: 28,
497
+ y: 67,
498
+ label: 'B',
499
+ color: theme.color.accentBoldBlue
500
+ }, {
501
+ x: 45,
502
+ y: 23,
503
+ label: 'C',
504
+ color: theme.color.accentBoldBlue
505
+ }, {
506
+ x: 67,
507
+ y: 89,
508
+ label: 'D',
509
+ color: theme.color.bgPositive
510
+ }, {
511
+ x: 82,
512
+ y: 76,
513
+ label: 'E',
514
+ color: theme.color.bgPositive
515
+ }, {
516
+ x: 34,
517
+ y: 91,
518
+ label: 'F',
519
+ color: theme.color.bgPositive
520
+ }, {
521
+ x: 56,
522
+ y: 45,
523
+ label: 'G',
524
+ color: theme.color.bgPositive
525
+ }, {
526
+ x: 19,
527
+ y: 12,
528
+ label: 'H',
529
+ color: theme.color.fgWarning
530
+ }, {
531
+ x: 73,
532
+ y: 28,
533
+ label: 'I',
534
+ color: theme.color.fgWarning
535
+ }, {
536
+ x: 91,
537
+ y: 54,
538
+ label: 'J',
539
+ color: theme.color.fgWarning
540
+ }, {
541
+ x: 15,
542
+ y: 58,
543
+ label: 'K',
544
+ color: theme.color.fgPrimary
545
+ }, {
546
+ x: 39,
547
+ y: 72,
548
+ label: 'L',
549
+ color: theme.color.fgPrimary
550
+ }, {
551
+ x: 88,
552
+ y: 15,
553
+ label: 'M',
554
+ color: theme.color.fgPrimary
555
+ }, {
556
+ x: 52,
557
+ y: 82,
558
+ label: 'N',
559
+ color: theme.color.fgPrimary
560
+ }], [theme]);
561
+
562
+ // Calculate domain based on data
563
+ const xValues = useMemo(() => dataPoints.map(p => p.x), [dataPoints]);
564
+ const yValues = useMemo(() => dataPoints.map(p => p.y), [dataPoints]);
565
+ const xMin = Math.min(...xValues);
566
+ const xMax = Math.max(...xValues);
567
+ const yMin = Math.min(...yValues);
568
+ const yMax = Math.max(...yValues);
569
+
570
+ // Custom label component that places labels to the top-right
571
+ const TopRightPointLabel = useCallback(_ref0 => {
572
+ let {
573
+ x,
574
+ y,
575
+ offset = 0,
576
+ children
577
+ } = _ref0;
578
+ return /*#__PURE__*/_jsx(ChartText, {
579
+ font: "label1",
580
+ fontWeight: 600,
581
+ horizontalAlignment: "left",
582
+ verticalAlignment: "bottom",
583
+ x: x + offset,
584
+ y: y - offset,
585
+ children: children
586
+ });
587
+ }, []);
588
+ return /*#__PURE__*/_jsxs(CartesianChart, {
589
+ height: 300,
590
+ xAxis: {
591
+ domain: {
592
+ min: xMin,
593
+ max: xMax
594
+ },
595
+ domainLimit: 'nice'
596
+ },
597
+ yAxis: {
598
+ domain: {
599
+ min: yMin,
600
+ max: yMax
601
+ },
602
+ domainLimit: 'nice'
603
+ },
604
+ children: [/*#__PURE__*/_jsx(XAxis, {
605
+ showGrid: true,
606
+ showLine: true,
607
+ showTickMarks: true
608
+ }), /*#__PURE__*/_jsx(YAxis, {
609
+ showGrid: true,
610
+ showLine: true,
611
+ showTickMarks: true,
612
+ position: "left"
613
+ }), dataPoints.map((point, index) => /*#__PURE__*/_jsx(Point, {
614
+ LabelComponent: TopRightPointLabel,
615
+ dataX: point.x,
616
+ dataY: point.y,
617
+ fill: point.color,
618
+ label: point.label,
619
+ labelOffset: 8,
620
+ radius: 5
621
+ }, index))]
622
+ });
623
+ });
454
624
  const ChartStories = () => {
455
625
  return /*#__PURE__*/_jsx(ScrollView, {
456
626
  children: /*#__PURE__*/_jsxs(ExampleScreen, {
@@ -469,6 +639,9 @@ const ChartStories = () => {
469
639
  }), /*#__PURE__*/_jsx(Example, {
470
640
  title: "Trading Trends",
471
641
  children: /*#__PURE__*/_jsx(TradingTrends, {})
642
+ }), /*#__PURE__*/_jsx(Example, {
643
+ title: "Scatterplot with Custom Labels",
644
+ children: /*#__PURE__*/_jsx(ScatterplotWithCustomLabels, {})
472
645
  })]
473
646
  })
474
647
  });