@coinbase/cds-mobile-visualization 3.4.0-beta.9 → 3.4.0

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 (167) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/dts/chart/CartesianChart.d.ts +92 -7
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/ChartContextBridge.d.ts.map +1 -1
  5. package/dts/chart/ChartProvider.d.ts +3 -0
  6. package/dts/chart/ChartProvider.d.ts.map +1 -1
  7. package/dts/chart/Path.d.ts +36 -13
  8. package/dts/chart/Path.d.ts.map +1 -1
  9. package/dts/chart/PeriodSelector.d.ts +20 -5
  10. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  11. package/dts/chart/area/Area.d.ts +14 -11
  12. package/dts/chart/area/Area.d.ts.map +1 -1
  13. package/dts/chart/area/AreaChart.d.ts +33 -9
  14. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  15. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  16. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  17. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  18. package/dts/chart/axis/Axis.d.ts +22 -42
  19. package/dts/chart/axis/Axis.d.ts.map +1 -1
  20. package/dts/chart/axis/XAxis.d.ts +6 -0
  21. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  22. package/dts/chart/axis/YAxis.d.ts +1 -0
  23. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  24. package/dts/chart/bar/Bar.d.ts +51 -51
  25. package/dts/chart/bar/Bar.d.ts.map +1 -1
  26. package/dts/chart/bar/BarChart.d.ts +56 -11
  27. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  28. package/dts/chart/bar/BarPlot.d.ts +2 -1
  29. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  30. package/dts/chart/bar/BarStack.d.ts +45 -20
  31. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  32. package/dts/chart/bar/BarStackGroup.d.ts +2 -1
  33. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  34. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  35. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  36. package/dts/chart/gradient/Gradient.d.ts +5 -0
  37. package/dts/chart/gradient/Gradient.d.ts.map +1 -1
  38. package/dts/chart/index.d.ts +1 -0
  39. package/dts/chart/index.d.ts.map +1 -1
  40. package/dts/chart/legend/DefaultLegendEntry.d.ts +5 -0
  41. package/dts/chart/legend/DefaultLegendEntry.d.ts.map +1 -0
  42. package/dts/chart/legend/DefaultLegendShape.d.ts +5 -0
  43. package/dts/chart/legend/DefaultLegendShape.d.ts.map +1 -0
  44. package/dts/chart/legend/Legend.d.ts +168 -0
  45. package/dts/chart/legend/Legend.d.ts.map +1 -0
  46. package/dts/chart/legend/index.d.ts +4 -0
  47. package/dts/chart/legend/index.d.ts.map +1 -0
  48. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  49. package/dts/chart/line/Line.d.ts +23 -19
  50. package/dts/chart/line/Line.d.ts.map +1 -1
  51. package/dts/chart/line/LineChart.d.ts +26 -9
  52. package/dts/chart/line/LineChart.d.ts.map +1 -1
  53. package/dts/chart/line/ReferenceLine.d.ts +1 -0
  54. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  55. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  56. package/dts/chart/point/Point.d.ts +26 -2
  57. package/dts/chart/point/Point.d.ts.map +1 -1
  58. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +32 -2
  59. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -1
  60. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +2 -1
  61. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -1
  62. package/dts/chart/scrubber/Scrubber.d.ts +86 -17
  63. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  64. package/dts/chart/scrubber/ScrubberAccessibilityView.d.ts +12 -0
  65. package/dts/chart/scrubber/ScrubberAccessibilityView.d.ts.map +1 -0
  66. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +10 -0
  67. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -1
  68. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +16 -1
  69. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -1
  70. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  71. package/dts/chart/utils/axis.d.ts +45 -10
  72. package/dts/chart/utils/axis.d.ts.map +1 -1
  73. package/dts/chart/utils/bar.d.ts +190 -0
  74. package/dts/chart/utils/bar.d.ts.map +1 -1
  75. package/dts/chart/utils/chart.d.ts +32 -0
  76. package/dts/chart/utils/chart.d.ts.map +1 -1
  77. package/dts/chart/utils/context.d.ts +21 -6
  78. package/dts/chart/utils/context.d.ts.map +1 -1
  79. package/dts/chart/utils/gradient.d.ts +3 -1
  80. package/dts/chart/utils/gradient.d.ts.map +1 -1
  81. package/dts/chart/utils/path.d.ts +26 -0
  82. package/dts/chart/utils/path.d.ts.map +1 -1
  83. package/dts/chart/utils/point.d.ts +24 -12
  84. package/dts/chart/utils/point.d.ts.map +1 -1
  85. package/dts/chart/utils/scale.d.ts +11 -0
  86. package/dts/chart/utils/scale.d.ts.map +1 -1
  87. package/dts/chart/utils/scrubber.d.ts +2 -1
  88. package/dts/chart/utils/scrubber.d.ts.map +1 -1
  89. package/dts/chart/utils/transition.d.ts +63 -22
  90. package/dts/chart/utils/transition.d.ts.map +1 -1
  91. package/dts/sparkline/Sparkline.d.ts +2 -1
  92. package/dts/sparkline/Sparkline.d.ts.map +1 -1
  93. package/dts/sparkline/SparklineArea.d.ts +2 -1
  94. package/dts/sparkline/SparklineArea.d.ts.map +1 -1
  95. package/dts/sparkline/SparklineGradient.d.ts +2 -1
  96. package/dts/sparkline/SparklineGradient.d.ts.map +1 -1
  97. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts +2 -1
  98. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts.map +1 -1
  99. package/esm/chart/CartesianChart.js +176 -82
  100. package/esm/chart/ChartContextBridge.js +14 -3
  101. package/esm/chart/ChartProvider.js +2 -2
  102. package/esm/chart/Path.js +34 -29
  103. package/esm/chart/PeriodSelector.js +5 -1
  104. package/esm/chart/__stories__/CartesianChart.stories.js +16 -80
  105. package/esm/chart/__stories__/ChartAccessibility.stories.js +721 -0
  106. package/esm/chart/__stories__/ChartTransitions.stories.js +625 -0
  107. package/esm/chart/__stories__/PeriodSelector.stories.js +99 -1
  108. package/esm/chart/area/Area.js +21 -9
  109. package/esm/chart/area/AreaChart.js +18 -13
  110. package/esm/chart/area/DottedArea.js +28 -18
  111. package/esm/chart/area/GradientArea.js +14 -7
  112. package/esm/chart/area/SolidArea.js +6 -2
  113. package/esm/chart/area/__stories__/AreaChart.stories.js +47 -5
  114. package/esm/chart/axis/Axis.js +5 -41
  115. package/esm/chart/axis/XAxis.js +116 -47
  116. package/esm/chart/axis/YAxis.js +105 -26
  117. package/esm/chart/axis/__stories__/Axis.stories.js +324 -48
  118. package/esm/chart/bar/Bar.js +17 -15
  119. package/esm/chart/bar/BarChart.js +38 -33
  120. package/esm/chart/bar/BarPlot.js +40 -45
  121. package/esm/chart/bar/BarStack.js +92 -475
  122. package/esm/chart/bar/BarStackGroup.js +37 -27
  123. package/esm/chart/bar/DefaultBar.js +27 -18
  124. package/esm/chart/bar/DefaultBarStack.js +25 -9
  125. package/esm/chart/bar/__stories__/BarChart.stories.js +728 -54
  126. package/esm/chart/gradient/Gradient.js +2 -1
  127. package/esm/chart/index.js +1 -0
  128. package/esm/chart/legend/DefaultLegendEntry.js +42 -0
  129. package/esm/chart/legend/DefaultLegendShape.js +64 -0
  130. package/esm/chart/legend/Legend.js +59 -0
  131. package/esm/chart/legend/__stories__/Legend.stories.js +574 -0
  132. package/esm/chart/legend/index.js +3 -0
  133. package/esm/chart/line/DottedLine.js +6 -2
  134. package/esm/chart/line/Line.js +42 -38
  135. package/esm/chart/line/LineChart.js +36 -12
  136. package/esm/chart/line/SolidLine.js +6 -2
  137. package/esm/chart/line/__stories__/LineChart.stories.js +236 -590
  138. package/esm/chart/line/__stories__/ReferenceLine.stories.js +95 -1
  139. package/esm/chart/point/Point.js +35 -36
  140. package/esm/chart/scrubber/DefaultScrubberBeacon.js +41 -38
  141. package/esm/chart/scrubber/DefaultScrubberLabel.js +26 -10
  142. package/esm/chart/scrubber/Scrubber.js +67 -35
  143. package/esm/chart/scrubber/ScrubberAccessibilityView.js +177 -0
  144. package/esm/chart/scrubber/ScrubberBeaconGroup.js +30 -22
  145. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +35 -8
  146. package/esm/chart/scrubber/ScrubberProvider.js +29 -24
  147. package/esm/chart/scrubber/__stories__/Scrubber.stories.js +946 -0
  148. package/esm/chart/utils/axis.js +88 -44
  149. package/esm/chart/utils/bar.js +820 -0
  150. package/esm/chart/utils/chart.js +34 -7
  151. package/esm/chart/utils/context.js +7 -0
  152. package/esm/chart/utils/gradient.js +8 -4
  153. package/esm/chart/utils/path.js +91 -61
  154. package/esm/chart/utils/point.js +92 -39
  155. package/esm/chart/utils/scale.js +13 -2
  156. package/esm/chart/utils/scrubber.js +12 -5
  157. package/esm/chart/utils/transition.js +108 -60
  158. package/esm/sparkline/Sparkline.js +2 -1
  159. package/esm/sparkline/SparklineArea.js +2 -1
  160. package/esm/sparkline/SparklineGradient.js +2 -1
  161. package/esm/sparkline/__figma__/Sparkline.figma.js +1 -1
  162. package/esm/sparkline/sparkline-interactive/SparklineInteractive.js +2 -1
  163. package/esm/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.js +1 -1
  164. package/esm/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.js +1 -1
  165. package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +2 -0
  166. package/package.json +5 -6
  167. package/esm/chart/__stories__/Chart.stories.js +0 -77
@@ -24,7 +24,8 @@ export const PeriodSelectorActiveIndicator = _ref => {
24
24
  const {
25
25
  width,
26
26
  height,
27
- x
27
+ x,
28
+ y
28
29
  } = activeTabRect;
29
30
 
30
31
  // Get the target background color
@@ -38,6 +39,7 @@ export const PeriodSelectorActiveIndicator = _ref => {
38
39
  // Combined animated value for position, size, and color
39
40
  const newAnimatedValues = {
40
41
  x,
42
+ y,
41
43
  width,
42
44
  backgroundColor: targetColor
43
45
  };
@@ -51,6 +53,8 @@ export const PeriodSelectorActiveIndicator = _ref => {
51
53
  const animatedStyles = useAnimatedStyle(() => ({
52
54
  transform: [{
53
55
  translateX: animatedValues.value.x
56
+ }, {
57
+ translateY: animatedValues.value.y
54
58
  }],
55
59
  width: animatedValues.value.width,
56
60
  backgroundColor: animatedValues.value.backgroundColor
@@ -7,7 +7,7 @@ import { Example, ExampleScreen } from '@coinbase/cds-mobile/examples/ExampleScr
7
7
  import { useTheme } from '@coinbase/cds-mobile/hooks/useTheme';
8
8
  import { Box, HStack, VStack } from '@coinbase/cds-mobile/layout';
9
9
  import { Text } from '@coinbase/cds-mobile/typography';
10
- import { Circle, Group, Skia } from '@shopify/react-native-skia';
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';
@@ -155,7 +155,7 @@ const EarningsHistory = () => {
155
155
  backgroundColor: theme.color.bgPositive
156
156
  }
157
157
  });
158
- const LegendItem = /*#__PURE__*/memo(_ref2 => {
158
+ const LegendEntry = /*#__PURE__*/memo(_ref2 => {
159
159
  let {
160
160
  opacity = 1,
161
161
  label
@@ -217,10 +217,10 @@ const EarningsHistory = () => {
217
217
  }), /*#__PURE__*/_jsxs(HStack, {
218
218
  gap: 2,
219
219
  justifyContent: "flex-end",
220
- children: [/*#__PURE__*/_jsx(LegendItem, {
220
+ children: [/*#__PURE__*/_jsx(LegendEntry, {
221
221
  label: "Estimated EPS",
222
222
  opacity: 0.5
223
- }), /*#__PURE__*/_jsx(LegendItem, {
223
+ }), /*#__PURE__*/_jsx(LegendEntry, {
224
224
  label: "Actual EPS"
225
225
  })]
226
226
  })]
@@ -250,11 +250,21 @@ const PriceWithVolumeChart = /*#__PURE__*/memo(_ref3 => {
250
250
  day: 'numeric'
251
251
  });
252
252
  }, []);
253
+ const formatVolume = useCallback(volume => {
254
+ return (volume / 1000).toFixed(2) + "K";
255
+ }, []);
253
256
  const scrubberLabel = useCallback(dataIndex => {
254
257
  return formatDate(btcDates[dataIndex]);
255
258
  }, [formatDate]);
259
+ const chartAccessibilityLabel = useMemo(() => {
260
+ const lastIndex = btcPrices.length - 1;
261
+ return "Bitcoin chart. Current date " + formatDate(btcDates[lastIndex]) + ". Current price " + formatPriceInThousands(btcPrices[lastIndex]) + ". Current volume " + formatVolume(btcVolumes[lastIndex]) + ".";
262
+ }, [formatDate, formatPriceInThousands, formatVolume]);
263
+ const getScrubberAccessibilityLabel = useCallback(dataIndex => "Bitcoin on " + formatDate(btcDates[dataIndex]) + ". Price " + formatPriceInThousands(btcPrices[dataIndex]) + ". Volume " + formatVolume(btcVolumes[dataIndex]) + ".", [formatDate, formatPriceInThousands, formatVolume]);
256
264
  return /*#__PURE__*/_jsxs(CartesianChart, {
257
265
  enableScrubbing: true,
266
+ accessibilityLabel: chartAccessibilityLabel,
267
+ getScrubberAccessibilityLabel: getScrubberAccessibilityLabel,
258
268
  height: defaultChartHeight,
259
269
  onScrubberPositionChange: onScrubberPositionChange,
260
270
  series: [{
@@ -485,80 +495,6 @@ function TradingTrends() {
485
495
  })]
486
496
  });
487
497
  }
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
498
  const ScatterplotWithCustomLabels = /*#__PURE__*/memo(() => {
563
499
  const theme = useTheme();
564
500
  const dataPoints = useMemo(() => [{
@@ -642,13 +578,13 @@ const ScatterplotWithCustomLabels = /*#__PURE__*/memo(() => {
642
578
  const yMax = Math.max(...yValues);
643
579
 
644
580
  // Custom label component that places labels to the top-right
645
- const TopRightPointLabel = useCallback(_ref10 => {
581
+ const TopRightPointLabel = useCallback(_ref0 => {
646
582
  let {
647
583
  x,
648
584
  y,
649
585
  offset = 0,
650
586
  children
651
- } = _ref10;
587
+ } = _ref0;
652
588
  return /*#__PURE__*/_jsx(ChartText, {
653
589
  font: "label1",
654
590
  fontWeight: 600,