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

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 (184) hide show
  1. package/CHANGELOG.md +54 -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 +2 -2
  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 +198 -113
  112. package/esm/chart/PeriodSelector.js +2 -2
  113. package/esm/chart/__stories__/CartesianChart.stories.js +378 -131
  114. package/esm/chart/__stories__/Chart.stories.js +2 -4
  115. package/esm/chart/__stories__/PeriodSelector.stories.js +103 -75
  116. package/esm/chart/area/Area.js +25 -35
  117. package/esm/chart/area/AreaChart.js +17 -12
  118. package/esm/chart/area/DottedArea.js +61 -109
  119. package/esm/chart/area/GradientArea.js +35 -91
  120. package/esm/chart/area/SolidArea.js +22 -8
  121. package/esm/chart/area/__stories__/AreaChart.stories.js +1 -1
  122. package/esm/chart/axis/Axis.js +2 -0
  123. package/esm/chart/axis/DefaultAxisTickLabel.js +11 -0
  124. package/esm/chart/axis/XAxis.js +63 -56
  125. package/esm/chart/axis/YAxis.js +59 -52
  126. package/esm/chart/axis/__stories__/Axis.stories.js +0 -1
  127. package/esm/chart/axis/index.js +1 -0
  128. package/esm/chart/bar/Bar.js +3 -1
  129. package/esm/chart/bar/BarChart.js +15 -37
  130. package/esm/chart/bar/BarPlot.js +41 -35
  131. package/esm/chart/bar/BarStack.js +75 -38
  132. package/esm/chart/bar/BarStackGroup.js +6 -16
  133. package/esm/chart/bar/DefaultBar.js +26 -48
  134. package/esm/chart/bar/DefaultBarStack.js +23 -58
  135. package/esm/chart/bar/__stories__/BarChart.stories.js +463 -77
  136. package/esm/chart/gradient/Gradient.js +53 -0
  137. package/esm/chart/gradient/index.js +1 -0
  138. package/esm/chart/index.js +3 -1
  139. package/esm/chart/line/DefaultReferenceLineLabel.js +66 -0
  140. package/esm/chart/line/DottedLine.js +29 -14
  141. package/esm/chart/line/Line.js +106 -67
  142. package/esm/chart/line/LineChart.js +20 -14
  143. package/esm/chart/line/ReferenceLine.js +80 -63
  144. package/esm/chart/line/SolidLine.js +25 -10
  145. package/esm/chart/line/__stories__/LineChart.stories.js +2101 -1977
  146. package/esm/chart/line/__stories__/ReferenceLine.stories.js +83 -28
  147. package/esm/chart/line/index.js +1 -1
  148. package/esm/chart/point/DefaultPointLabel.js +39 -0
  149. package/esm/chart/point/Point.js +188 -0
  150. package/esm/chart/point/index.js +2 -0
  151. package/esm/chart/scrubber/DefaultScrubberBeacon.js +179 -0
  152. package/esm/chart/scrubber/DefaultScrubberBeaconLabel.js +43 -0
  153. package/esm/chart/scrubber/DefaultScrubberLabel.js +28 -0
  154. package/esm/chart/scrubber/Scrubber.js +126 -146
  155. package/esm/chart/scrubber/ScrubberBeaconGroup.js +161 -0
  156. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +185 -0
  157. package/esm/chart/scrubber/ScrubberProvider.js +46 -54
  158. package/esm/chart/scrubber/index.js +3 -1
  159. package/esm/chart/text/ChartText.js +242 -174
  160. package/esm/chart/text/{SmartChartTextGroup.js → ChartTextGroup.js} +6 -5
  161. package/esm/chart/text/index.js +1 -1
  162. package/esm/chart/utils/chart.js +44 -3
  163. package/esm/chart/utils/gradient.js +305 -0
  164. package/esm/chart/utils/index.js +3 -0
  165. package/esm/chart/utils/path.js +76 -8
  166. package/esm/chart/utils/point.js +116 -5
  167. package/esm/chart/utils/scale.js +230 -1
  168. package/esm/chart/utils/scrubber.js +139 -0
  169. package/esm/chart/utils/transition.js +185 -0
  170. package/esm/sparkline/__stories__/Sparkline.stories.js +11 -7
  171. package/esm/sparkline/__stories__/SparklineGradient.stories.js +7 -4
  172. package/esm/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.js +51 -26
  173. package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +17 -9
  174. package/package.json +15 -9
  175. package/dts/chart/Point.d.ts +0 -103
  176. package/dts/chart/Point.d.ts.map +0 -1
  177. package/dts/chart/line/GradientLine.d.ts +0 -45
  178. package/dts/chart/line/GradientLine.d.ts.map +0 -1
  179. package/dts/chart/scrubber/ScrubberBeacon.d.ts +0 -75
  180. package/dts/chart/scrubber/ScrubberBeacon.d.ts.map +0 -1
  181. package/dts/chart/text/SmartChartTextGroup.d.ts.map +0 -1
  182. package/esm/chart/Point.js +0 -111
  183. package/esm/chart/line/GradientLine.js +0 -62
  184. 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, Skia } 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);
@@ -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,
@@ -229,27 +226,24 @@ const EarningsHistory = () => {
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)
280
- })]
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
- })
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
303
372
  })]
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,220 @@ 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 UVGradient = {
489
+ axis: 'y',
490
+ stops: [{
491
+ offset: 0,
492
+ color: 'green'
493
+ }, {
494
+ offset: 3,
495
+ color: 'yellow'
496
+ }, {
497
+ offset: 5,
498
+ color: 'orange'
499
+ }, {
500
+ offset: 8,
501
+ color: 'red'
502
+ }, {
503
+ offset: 10,
504
+ color: 'purple'
505
+ }]
506
+ };
507
+ const PreviousData = /*#__PURE__*/memo(_ref0 => {
508
+ let {
509
+ children,
510
+ currentHour,
511
+ clipOffset = 0
512
+ } = _ref0;
513
+ // we will clip the data to the current hour
514
+ const {
515
+ drawingArea,
516
+ getXScale
517
+ } = useCartesianChartContext();
518
+ const xScale = getXScale();
519
+ const currentHourX = xScale == null ? void 0 : xScale(currentHour);
520
+ const clipPath = useMemo(() => {
521
+ if (!xScale || currentHourX === undefined) return null;
522
+
523
+ // Create a rectangle from top-left of drawing area to currentHourX on the right
524
+ // Apply clipOffset to left, top, and bottom edges only (NOT to currentHourX)
525
+ const pathString = "M " + (drawingArea.x - clipOffset) + " " + (drawingArea.y - clipOffset) + " L " + currentHourX + " " + (drawingArea.y - clipOffset) + " L " + currentHourX + " " + (drawingArea.y + drawingArea.height + clipOffset) + " L " + (drawingArea.x - clipOffset) + " " + (drawingArea.y + drawingArea.height + clipOffset) + " Z";
526
+ return Skia.Path.MakeFromSVGString(pathString);
527
+ }, [xScale, currentHourX, drawingArea, clipOffset]);
528
+ if (!clipPath) return null;
529
+ return /*#__PURE__*/_jsx(Group, {
530
+ clip: clipPath,
531
+ opacity: 0.75,
532
+ children: children
533
+ });
534
+ });
535
+ const FutureData = /*#__PURE__*/memo(_ref1 => {
536
+ let {
537
+ children,
538
+ currentHour,
539
+ clipOffset = 0
540
+ } = _ref1;
541
+ // we will clip the data from the current hour to the right edge
542
+ const {
543
+ drawingArea,
544
+ getXScale
545
+ } = useCartesianChartContext();
546
+ const xScale = getXScale();
547
+ const currentHourX = xScale == null ? void 0 : xScale(currentHour);
548
+ const clipPath = useMemo(() => {
549
+ if (!xScale || currentHourX === undefined) return null;
550
+
551
+ // Create a rectangle from currentHourX to right edge of drawing area
552
+ // Apply clipOffset to top, bottom, and right, but NOT left (currentHourX)
553
+ const pathString = "M " + currentHourX + " " + (drawingArea.y - clipOffset) + " L " + (drawingArea.x + drawingArea.width + clipOffset) + " " + (drawingArea.y - clipOffset) + " L " + (drawingArea.x + drawingArea.width + clipOffset) + " " + (drawingArea.y + drawingArea.height + clipOffset) + " L " + currentHourX + " " + (drawingArea.y + drawingArea.height + clipOffset) + " Z";
554
+ return Skia.Path.MakeFromSVGString(pathString);
555
+ }, [xScale, currentHourX, drawingArea, clipOffset]);
556
+ if (!clipPath) return null;
557
+ return /*#__PURE__*/_jsx(Group, {
558
+ clip: clipPath,
559
+ children: children
560
+ });
561
+ });
562
+ const ScatterplotWithCustomLabels = /*#__PURE__*/memo(() => {
563
+ const theme = useTheme();
564
+ const dataPoints = useMemo(() => [{
565
+ x: 12,
566
+ y: 34,
567
+ label: 'A',
568
+ color: theme.color.accentBoldBlue
569
+ }, {
570
+ x: 28,
571
+ y: 67,
572
+ label: 'B',
573
+ color: theme.color.accentBoldBlue
574
+ }, {
575
+ x: 45,
576
+ y: 23,
577
+ label: 'C',
578
+ color: theme.color.accentBoldBlue
579
+ }, {
580
+ x: 67,
581
+ y: 89,
582
+ label: 'D',
583
+ color: theme.color.bgPositive
584
+ }, {
585
+ x: 82,
586
+ y: 76,
587
+ label: 'E',
588
+ color: theme.color.bgPositive
589
+ }, {
590
+ x: 34,
591
+ y: 91,
592
+ label: 'F',
593
+ color: theme.color.bgPositive
594
+ }, {
595
+ x: 56,
596
+ y: 45,
597
+ label: 'G',
598
+ color: theme.color.bgPositive
599
+ }, {
600
+ x: 19,
601
+ y: 12,
602
+ label: 'H',
603
+ color: theme.color.fgWarning
604
+ }, {
605
+ x: 73,
606
+ y: 28,
607
+ label: 'I',
608
+ color: theme.color.fgWarning
609
+ }, {
610
+ x: 91,
611
+ y: 54,
612
+ label: 'J',
613
+ color: theme.color.fgWarning
614
+ }, {
615
+ x: 15,
616
+ y: 58,
617
+ label: 'K',
618
+ color: theme.color.fgPrimary
619
+ }, {
620
+ x: 39,
621
+ y: 72,
622
+ label: 'L',
623
+ color: theme.color.fgPrimary
624
+ }, {
625
+ x: 88,
626
+ y: 15,
627
+ label: 'M',
628
+ color: theme.color.fgPrimary
629
+ }, {
630
+ x: 52,
631
+ y: 82,
632
+ label: 'N',
633
+ color: theme.color.fgPrimary
634
+ }], [theme]);
635
+
636
+ // Calculate domain based on data
637
+ const xValues = useMemo(() => dataPoints.map(p => p.x), [dataPoints]);
638
+ const yValues = useMemo(() => dataPoints.map(p => p.y), [dataPoints]);
639
+ const xMin = Math.min(...xValues);
640
+ const xMax = Math.max(...xValues);
641
+ const yMin = Math.min(...yValues);
642
+ const yMax = Math.max(...yValues);
643
+
644
+ // Custom label component that places labels to the top-right
645
+ const TopRightPointLabel = useCallback(_ref10 => {
646
+ let {
647
+ x,
648
+ y,
649
+ offset = 0,
650
+ children
651
+ } = _ref10;
652
+ return /*#__PURE__*/_jsx(ChartText, {
653
+ font: "label1",
654
+ fontWeight: 600,
655
+ horizontalAlignment: "left",
656
+ verticalAlignment: "bottom",
657
+ x: x + offset,
658
+ y: y - offset,
659
+ children: children
660
+ });
661
+ }, []);
662
+ return /*#__PURE__*/_jsxs(CartesianChart, {
663
+ height: 300,
664
+ xAxis: {
665
+ domain: {
666
+ min: xMin,
667
+ max: xMax
668
+ },
669
+ domainLimit: 'nice'
670
+ },
671
+ yAxis: {
672
+ domain: {
673
+ min: yMin,
674
+ max: yMax
675
+ },
676
+ domainLimit: 'nice'
677
+ },
678
+ children: [/*#__PURE__*/_jsx(XAxis, {
679
+ showGrid: true,
680
+ showLine: true,
681
+ showTickMarks: true
682
+ }), /*#__PURE__*/_jsx(YAxis, {
683
+ showGrid: true,
684
+ showLine: true,
685
+ showTickMarks: true,
686
+ position: "left"
687
+ }), dataPoints.map((point, index) => /*#__PURE__*/_jsx(Point, {
688
+ LabelComponent: TopRightPointLabel,
689
+ dataX: point.x,
690
+ dataY: point.y,
691
+ fill: point.color,
692
+ label: point.label,
693
+ labelOffset: 8,
694
+ radius: 5
695
+ }, index))]
696
+ });
697
+ });
454
698
  const ChartStories = () => {
455
699
  return /*#__PURE__*/_jsx(ScrollView, {
456
700
  children: /*#__PURE__*/_jsxs(ExampleScreen, {
@@ -469,6 +713,9 @@ const ChartStories = () => {
469
713
  }), /*#__PURE__*/_jsx(Example, {
470
714
  title: "Trading Trends",
471
715
  children: /*#__PURE__*/_jsx(TradingTrends, {})
716
+ }), /*#__PURE__*/_jsx(Example, {
717
+ title: "Scatterplot with Custom Labels",
718
+ children: /*#__PURE__*/_jsx(ScatterplotWithCustomLabels, {})
472
719
  })]
473
720
  })
474
721
  });
@@ -1,6 +1,6 @@
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
2
  import { Example, ExampleScreen } from '@coinbase/cds-mobile/examples/ExampleScreen';
3
- import { CartesianChart, DottedArea, GradientLine, Line, LineChart } from '../';
3
+ import { CartesianChart, DottedArea, Line, LineChart, SolidLine } from '../';
4
4
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  const defaultChartHeight = 250;
6
6
  const BasicLineChart = () => {
@@ -50,9 +50,7 @@ const LineStyles = () => {
50
50
  seriesId: "upperMiddle",
51
51
  type: "dotted"
52
52
  }), /*#__PURE__*/_jsx(Line, {
53
- LineComponent: props => /*#__PURE__*/_jsx(GradientLine, _extends({}, props, {
54
- endColor: "#F7931A",
55
- startColor: "#E3D74D",
53
+ LineComponent: props => /*#__PURE__*/_jsx(SolidLine, _extends({}, props, {
56
54
  strokeWidth: 4
57
55
  })),
58
56
  curve: "natural",