@coinbase/cds-web-visualization 3.4.0-beta.8 → 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 (156) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/dts/chart/CartesianChart.d.ts +40 -4
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/ChartProvider.d.ts +3 -0
  5. package/dts/chart/ChartProvider.d.ts.map +1 -1
  6. package/dts/chart/Path.d.ts +51 -12
  7. package/dts/chart/Path.d.ts.map +1 -1
  8. package/dts/chart/PeriodSelector.d.ts +25 -4
  9. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  10. package/dts/chart/area/Area.d.ts +13 -11
  11. package/dts/chart/area/Area.d.ts.map +1 -1
  12. package/dts/chart/area/AreaChart.d.ts +18 -5
  13. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  14. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  15. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  16. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  17. package/dts/chart/axis/Axis.d.ts +29 -29
  18. package/dts/chart/axis/Axis.d.ts.map +1 -1
  19. package/dts/chart/axis/XAxis.d.ts +6 -0
  20. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  21. package/dts/chart/axis/YAxis.d.ts +2 -1
  22. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  23. package/dts/chart/bar/Bar.d.ts +51 -51
  24. package/dts/chart/bar/Bar.d.ts.map +1 -1
  25. package/dts/chart/bar/BarChart.d.ts +29 -6
  26. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  27. package/dts/chart/bar/BarPlot.d.ts +2 -1
  28. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  29. package/dts/chart/bar/BarStack.d.ts +58 -20
  30. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  31. package/dts/chart/bar/BarStackGroup.d.ts +2 -1
  32. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  33. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  34. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  35. package/dts/chart/gradient/Gradient.d.ts +7 -0
  36. package/dts/chart/gradient/Gradient.d.ts.map +1 -1
  37. package/dts/chart/index.d.ts +1 -0
  38. package/dts/chart/index.d.ts.map +1 -1
  39. package/dts/chart/legend/DefaultLegendEntry.d.ts +21 -0
  40. package/dts/chart/legend/DefaultLegendEntry.d.ts.map +1 -0
  41. package/dts/chart/legend/DefaultLegendShape.d.ts +7 -0
  42. package/dts/chart/legend/DefaultLegendShape.d.ts.map +1 -0
  43. package/dts/chart/legend/Legend.d.ts +169 -0
  44. package/dts/chart/legend/Legend.d.ts.map +1 -0
  45. package/dts/chart/legend/index.d.ts +4 -0
  46. package/dts/chart/legend/index.d.ts.map +1 -0
  47. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  48. package/dts/chart/line/Line.d.ts +45 -24
  49. package/dts/chart/line/Line.d.ts.map +1 -1
  50. package/dts/chart/line/LineChart.d.ts +5 -3
  51. package/dts/chart/line/LineChart.d.ts.map +1 -1
  52. package/dts/chart/line/ReferenceLine.d.ts +9 -0
  53. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  54. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  55. package/dts/chart/point/Point.d.ts +26 -2
  56. package/dts/chart/point/Point.d.ts.map +1 -1
  57. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +34 -17
  58. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -1
  59. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.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 +148 -46
  63. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  64. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +10 -0
  65. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -1
  66. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +25 -1
  67. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -1
  68. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  69. package/dts/chart/text/ChartText.d.ts.map +1 -1
  70. package/dts/chart/utils/axis.d.ts +48 -9
  71. package/dts/chart/utils/axis.d.ts.map +1 -1
  72. package/dts/chart/utils/bar.d.ts +188 -0
  73. package/dts/chart/utils/bar.d.ts.map +1 -1
  74. package/dts/chart/utils/chart.d.ts +32 -0
  75. package/dts/chart/utils/chart.d.ts.map +1 -1
  76. package/dts/chart/utils/context.d.ts +20 -4
  77. package/dts/chart/utils/context.d.ts.map +1 -1
  78. package/dts/chart/utils/gradient.d.ts +3 -1
  79. package/dts/chart/utils/gradient.d.ts.map +1 -1
  80. package/dts/chart/utils/path.d.ts +26 -0
  81. package/dts/chart/utils/path.d.ts.map +1 -1
  82. package/dts/chart/utils/point.d.ts +18 -7
  83. package/dts/chart/utils/point.d.ts.map +1 -1
  84. package/dts/chart/utils/scale.d.ts +11 -0
  85. package/dts/chart/utils/scale.d.ts.map +1 -1
  86. package/dts/chart/utils/scrubber.d.ts +2 -1
  87. package/dts/chart/utils/scrubber.d.ts.map +1 -1
  88. package/dts/chart/utils/transition.d.ts +50 -14
  89. package/dts/chart/utils/transition.d.ts.map +1 -1
  90. package/dts/sparkline/Sparkline.d.ts +2 -1
  91. package/dts/sparkline/Sparkline.d.ts.map +1 -1
  92. package/dts/sparkline/SparklineArea.d.ts +2 -1
  93. package/dts/sparkline/SparklineArea.d.ts.map +1 -1
  94. package/dts/sparkline/SparklineGradient.d.ts +2 -1
  95. package/dts/sparkline/SparklineGradient.d.ts.map +1 -1
  96. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts +2 -1
  97. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts.map +1 -1
  98. package/esm/chart/CartesianChart.js +154 -90
  99. package/esm/chart/ChartProvider.js +2 -2
  100. package/esm/chart/Path.js +35 -19
  101. package/esm/chart/PeriodSelector.js +33 -15
  102. package/esm/chart/area/Area.js +21 -9
  103. package/esm/chart/area/AreaChart.js +28 -25
  104. package/esm/chart/area/DottedArea.js +18 -9
  105. package/esm/chart/area/GradientArea.js +16 -8
  106. package/esm/chart/area/SolidArea.js +8 -3
  107. package/esm/chart/axis/Axis.js +3 -17
  108. package/esm/chart/axis/XAxis.js +153 -50
  109. package/esm/chart/axis/YAxis.js +146 -36
  110. package/esm/chart/bar/Bar.js +16 -8
  111. package/esm/chart/bar/BarChart.js +38 -33
  112. package/esm/chart/bar/BarPlot.js +20 -25
  113. package/esm/chart/bar/BarStack.js +109 -505
  114. package/esm/chart/bar/BarStackGroup.js +36 -27
  115. package/esm/chart/bar/DefaultBar.js +34 -26
  116. package/esm/chart/bar/DefaultBarStack.js +31 -18
  117. package/esm/chart/gradient/Gradient.js +3 -2
  118. package/esm/chart/index.js +1 -0
  119. package/esm/chart/legend/DefaultLegendEntry.css +1 -0
  120. package/esm/chart/legend/DefaultLegendEntry.js +50 -0
  121. package/esm/chart/legend/DefaultLegendShape.css +5 -0
  122. package/esm/chart/legend/DefaultLegendShape.js +47 -0
  123. package/esm/chart/legend/Legend.js +76 -0
  124. package/esm/chart/legend/index.js +3 -0
  125. package/esm/chart/line/DottedLine.js +7 -2
  126. package/esm/chart/line/Line.js +41 -42
  127. package/esm/chart/line/LineChart.js +18 -13
  128. package/esm/chart/line/ReferenceLine.js +6 -2
  129. package/esm/chart/line/SolidLine.js +8 -3
  130. package/esm/chart/point/Point.js +41 -24
  131. package/esm/chart/scrubber/DefaultScrubberBeacon.js +64 -65
  132. package/esm/chart/scrubber/DefaultScrubberBeaconLabel.js +25 -14
  133. package/esm/chart/scrubber/DefaultScrubberLabel.js +26 -8
  134. package/esm/chart/scrubber/Scrubber.js +54 -43
  135. package/esm/chart/scrubber/ScrubberBeaconGroup.js +60 -35
  136. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +31 -8
  137. package/esm/chart/scrubber/ScrubberProvider.js +44 -39
  138. package/esm/chart/text/ChartText.js +3 -2
  139. package/esm/chart/utils/axis.js +90 -43
  140. package/esm/chart/utils/bar.js +863 -0
  141. package/esm/chart/utils/chart.js +34 -7
  142. package/esm/chart/utils/context.js +7 -0
  143. package/esm/chart/utils/gradient.js +6 -4
  144. package/esm/chart/utils/path.js +88 -61
  145. package/esm/chart/utils/point.js +57 -30
  146. package/esm/chart/utils/scale.js +13 -2
  147. package/esm/chart/utils/scrubber.js +9 -4
  148. package/esm/chart/utils/transition.js +68 -41
  149. package/esm/sparkline/Sparkline.js +2 -1
  150. package/esm/sparkline/SparklineArea.js +2 -1
  151. package/esm/sparkline/SparklineGradient.js +2 -1
  152. package/esm/sparkline/__figma__/Sparkline.figma.js +1 -1
  153. package/esm/sparkline/sparkline-interactive/SparklineInteractive.js +2 -1
  154. package/esm/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.js +1 -1
  155. package/esm/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.js +1 -1
  156. package/package.json +12 -11
@@ -1,8 +1,14 @@
1
1
  import { type MotionValue, type Transition } from 'framer-motion';
2
2
  /**
3
- * Default transition configuration used across all chart components.
3
+ * Default update transition used across all chart components.
4
+ * `{ type: 'spring', stiffness: 900, damping: 120, mass: 4 }`
4
5
  */
5
6
  export declare const defaultTransition: Transition;
7
+ /**
8
+ * Instant transition that completes immediately with no animation.
9
+ * Used when a transition is set to `null`.
10
+ */
11
+ export declare const instantTransition: Transition;
6
12
  /**
7
13
  * Duration in seconds for accessory elements to fade in.
8
14
  */
@@ -11,40 +17,53 @@ export declare const accessoryFadeTransitionDuration = 0.15;
11
17
  * Delay in seconds before accessory elements fade in.
12
18
  */
13
19
  export declare const accessoryFadeTransitionDelay = 0.35;
20
+ /**
21
+ * Default enter transition for accessory elements (Point, Scrubber beacons).
22
+ * `{ type: 'tween', duration: 0.15, delay: 0.35 }`
23
+ */
24
+ export declare const defaultAccessoryEnterTransition: Transition;
25
+ /**
26
+ * Resolves a transition value based on the animation state and a default.
27
+ * @note Passing in null will disable an animation.
28
+ * @note Passing in undefined will use the provided default.
29
+ */
30
+ export declare const getTransition: (
31
+ value: Transition | null | undefined,
32
+ animate: boolean,
33
+ defaultValue: Transition,
34
+ ) => Transition | null;
14
35
  /**
15
36
  * Hook for path animation state and transitions.
16
37
  *
17
38
  * @param currentPath - Current target path to animate to
18
39
  * @param initialPath - Initial path for enter animation. When provided, the first animation will go from initialPath to currentPath.
19
- * @param transition - Transition configuration
40
+ * @param transitions - Transition configuration for enter and update animations
20
41
  * @returns MotionValue containing the current interpolated path string
21
42
  *
22
43
  * @example
23
44
  * // Simple path transition
24
45
  * const animatedPath = usePathTransition({
25
46
  * currentPath: d ?? '',
26
- * transition: {
27
- * type: 'spring',
28
- * stiffness: 300,
29
- * damping: 20
30
- * }
47
+ * transitions: {
48
+ * update: { type: 'spring', stiffness: 300, damping: 20 },
49
+ * },
31
50
  * });
32
51
  *
33
52
  * @example
34
- * // Time based animation
53
+ * // Enter animation with different initial config (like DefaultBar)
35
54
  * const animatedPath = usePathTransition({
36
55
  * currentPath: targetPath,
37
56
  * initialPath: baselinePath,
38
- * transition: {
39
- * type: 'tween',
40
- * duration: 0.3,
41
- * ease: 'easeInOut'
42
- * }
57
+ * transitions: {
58
+ * enter: { type: 'tween', duration: 0.5 },
59
+ * update: { type: 'spring', stiffness: 900, damping: 120, mass: 4 },
60
+ * },
43
61
  * });
44
62
  */
45
63
  export declare const usePathTransition: ({
46
64
  currentPath,
47
65
  initialPath,
66
+ transitions,
48
67
  transition,
49
68
  }: {
50
69
  /**
@@ -58,7 +77,24 @@ export declare const usePathTransition: ({
58
77
  */
59
78
  initialPath?: string;
60
79
  /**
61
- * Transition configuration
80
+ * Transition configuration for enter and update animations.
81
+ */
82
+ transitions?: {
83
+ /**
84
+ * Transition for the initial enter animation (initialPath → currentPath).
85
+ * Only used when `initialPath` is provided.
86
+ * If not provided, falls back to `update`.
87
+ */
88
+ enter?: Transition | null;
89
+ /**
90
+ * Transition for subsequent data update animations.
91
+ * @default defaultTransition
92
+ */
93
+ update?: Transition | null;
94
+ };
95
+ /**
96
+ * Transition for updates.
97
+ * @deprecated Use `transitions.update` instead.
62
98
  */
63
99
  transition?: Transition;
64
100
  }) => MotionValue<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/transition.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EAIhB,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAK/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,iBAAiB,GAAI,2CAI/B;IACD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,WAAW,CAAC,MAAM,CAwDrB,CAAC"}
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/transition.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EAGhB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAK/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,UAI7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,UAAU,GAAG,IAAI,GAAG,SAAS,EACpC,SAAS,OAAO,EAChB,cAAc,UAAU,KACvB,UAAU,GAAG,IAGf,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,iBAAiB,GAAI,wDAK/B;IACD;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ;;;;WAIG;QACH,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;QAC1B;;;WAGG;QACH,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,WAAW,CAAC,MAAM,CA4DrB,CAAC"}
@@ -32,7 +32,8 @@ export type SparklineBaseProps = SharedProps & {
32
32
  };
33
33
  export type SparklineProps = SparklineBaseProps;
34
34
  /**
35
- * @deprecated Use LineChart instead.
35
+ * @deprecated Use LineChart instead. This will be removed in a future major release.
36
+ * @deprecationExpectedRemoval v4
36
37
  */
37
38
  export declare const Sparkline: React.MemoExoticComponent<
38
39
  React.ForwardRefExoticComponent<
@@ -1 +1 @@
1
- {"version":3,"file":"Sparkline.d.ts","sourceRoot":"","sources":["../../src/sparkline/Sparkline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAQ/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG;IAC7C,iPAAiP;IACjP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oQAAoQ;IACpQ,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,kWAAkW;IAClW,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACnD,oOAAoO;IACpO,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,SAAS;IA/BpB,iPAAiP;iBACpO,MAAM;IACnB,oQAAoQ;WAC7P,MAAM;IACb,8BAA8B;YACtB,MAAM;IACd,kWAAkW;WAC3V,MAAM;IACb,6BAA6B;WACtB,MAAM;IACb,0EAA0E;eAC/D,eAAe,CAAC,sBAAsB,CAAC;IAClD,oOAAoO;yBAC/M,MAAM;IAC3B;;;OAGG;iBACU,mBAAmB;IAChC;;;OAGG;eACQ,iBAAiB;2CA4J7B,CAAC"}
1
+ {"version":3,"file":"Sparkline.d.ts","sourceRoot":"","sources":["../../src/sparkline/Sparkline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAQ/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG;IAC7C,iPAAiP;IACjP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oQAAoQ;IACpQ,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,kWAAkW;IAClW,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACnD,oOAAoO;IACpO,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,SAAS;IAhCpB,iPAAiP;iBACpO,MAAM;IACnB,oQAAoQ;WAC7P,MAAM;IACb,8BAA8B;YACtB,MAAM;IACd,kWAAkW;WAC3V,MAAM;IACb,6BAA6B;WACtB,MAAM;IACb,0EAA0E;eAC/D,eAAe,CAAC,sBAAsB,CAAC;IAClD,oOAAoO;yBAC/M,MAAM;IAC3B;;;OAGG;iBACU,mBAAmB;IAChC;;;OAGG;eACQ,iBAAiB;2CA6J7B,CAAC"}
@@ -5,7 +5,8 @@ export type SparklineAreaBaseProps = {
5
5
  maskId?: string;
6
6
  };
7
7
  /**
8
- * @deprecated Use AreaChart instead.
8
+ * @deprecated Use AreaChart instead. This will be removed in a future major release.
9
+ * @deprecationExpectedRemoval v4
9
10
  */
10
11
  export declare const SparklineArea: React.MemoExoticComponent<
11
12
  React.ForwardRefExoticComponent<
@@ -1 +1 @@
1
- {"version":3,"file":"SparklineArea.d.ts","sourceRoot":"","sources":["../../src/sparkline/SparklineArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,iIAazB,CAAC"}
1
+ {"version":3,"file":"SparklineArea.d.ts","sourceRoot":"","sources":["../../src/sparkline/SparklineArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,iIAazB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
  import type { SparklinePathRef } from './SparklinePath';
3
3
  /**
4
- * @deprecated Use LineChart instead.
4
+ * @deprecated Use LineChart instead. This will be removed in a future major release.
5
+ * @deprecationExpectedRemoval v4
5
6
  */
6
7
  export declare const SparklineGradient: React.MemoExoticComponent<
7
8
  React.ForwardRefExoticComponent<
@@ -1 +1 @@
1
- {"version":3,"file":"SparklineGradient.d.ts","sourceRoot":"","sources":["../../src/sparkline/SparklineGradient.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAIhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;2CAoB7B,CAAC"}
1
+ {"version":3,"file":"SparklineGradient.d.ts","sourceRoot":"","sources":["../../src/sparkline/SparklineGradient.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAIhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;2CAoB7B,CAAC"}
@@ -193,7 +193,8 @@ declare function SparklineInteractiveWithGeneric<Period extends string>({
193
193
  ...props
194
194
  }: SparklineInteractiveProps<Period>): import('react/jsx-runtime').JSX.Element;
195
195
  /**
196
- * @deprecated Use LineChart instead.
196
+ * @deprecated Use LineChart instead. This will be removed in a future major release.
197
+ * @deprecationExpectedRemoval v4
197
198
  */
198
199
  export declare const SparklineInteractive: typeof SparklineInteractiveWithGeneric;
199
200
  //# sourceMappingURL=SparklineInteractive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SparklineInteractive.d.ts","sourceRoot":"","sources":["../../../src/sparkline/sparkline-interactive/SparklineInteractive.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SparklineInteractive.d.ts","sourceRoot":"","sources":["../../../src/sparkline/sparkline-interactive/SparklineInteractive.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,4BAA4B,CAAC;AAkCpC,cAAc,kCAAkC,CAAC;AAEjD,MAAM,MAAM,mCAAmC,GAAG,IAAI,CACpD,6BAA6B,CAAC,MAAM,CAAC,EACrC,cAAc,GAAG,SAAS,CAC3B,CAAC;AAYF,MAAM,MAAM,6BAA6B,CAAC,MAAM,SAAS,MAAM,IAAI;IACjE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC;;OAEG;IACH,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACrD;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;OAEG;IACH,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACjC;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9C;;OAEG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;IACnC;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAChE,oOAAoO;IACpO,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,MAAM,SAAS,MAAM,IACzD,6BAA6B,CAAC,MAAM,CAAC,GAAG;IACtC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAC7B;;WAEG;QACH,IAAI,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;KAC5B,CAAC;IACF,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEJ,iBAAS,sCAAsC,CAAC,MAAM,SAAS,MAAM,EAAE,EACrE,IAAI,EACJ,OAAO,EACP,aAAa,EACb,eAAe,EACf,WAAW,EACX,OAAc,EACd,YAAmB,EACnB,UAAiB,EACjB,UAAU,EACV,QAAe,EACf,kBAA0B,EAC1B,gBAAwB,EACxB,IAAW,EACX,QAAqB,EACrB,kBAAwB,EACxB,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAyB,EACzB,gBAAgB,EAChB,SAAS,EACT,uBAAiC,EACjC,SAAS,EACT,UAAU,EACV,KAAK,EACL,MAAM,EACN,YAAY,GACb,EAAE,yBAAyB,CAAC,MAAM,CAAC,2CAgNnC;AAGD,eAAO,MAAM,2BAA2B,EAEnC,OAAO,sCAAsC,CAAC;AAEnD,iBAAS,+BAA+B,CAAC,MAAM,SAAS,MAAM,EAAE,EAC9D,OAAO,EACP,GAAG,KAAK,EACT,EAAE,yBAAyB,CAAC,MAAM,CAAC,2CAyBnC;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAE5B,OAAO,+BAA+B,CAAC"}
@@ -1,4 +1,4 @@
1
- const _excluded = ["series", "children", "animate", "xAxis", "yAxis", "inset", "enableScrubbing", "onScrubberPositionChange", "width", "height", "className", "classNames", "style", "styles"];
1
+ const _excluded = ["series", "children", "layout", "animate", "xAxis", "yAxis", "inset", "enableScrubbing", "onScrubberPositionChange", "legend", "legendPosition", "legendAccessibilityLabel", "width", "height", "className", "classNames", "style", "styles", "accessibilityLabel"];
2
2
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
3
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
4
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
@@ -12,25 +12,31 @@ import { useDimensions } from '@coinbase/cds-web/hooks/useDimensions';
12
12
  import { Box } from '@coinbase/cds-web/layout';
13
13
  import { ScrubberProvider } from './scrubber/ScrubberProvider';
14
14
  import { CartesianChartProvider } from './ChartProvider';
15
- import { defaultAxisId, defaultChartInset, getAxisConfig, getAxisDomain, getAxisRange, getAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
16
- import { jsx as _jsx } from "react/jsx-runtime";
15
+ import { Legend } from './legend';
16
+ import { defaultAxisId, defaultHorizontalLayoutChartInset, defaultVerticalLayoutChartInset, getAxisConfig, getAxisRange, getCartesianAxisDomain, getCartesianAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
18
  const focusStylesCss = "cds-focusStylesCss-f4oy7ru";
18
19
  export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, ref) => {
19
20
  let {
20
21
  series,
21
22
  children,
23
+ layout = 'vertical',
22
24
  animate = true,
23
25
  xAxis: xAxisConfigProp,
24
26
  yAxis: yAxisConfigProp,
25
27
  inset,
26
28
  enableScrubbing,
27
29
  onScrubberPositionChange,
30
+ legend,
31
+ legendPosition = 'bottom',
32
+ legendAccessibilityLabel,
28
33
  width = '100%',
29
34
  height = '100%',
30
35
  className,
31
36
  classNames,
32
37
  style,
33
- styles
38
+ styles,
39
+ accessibilityLabel
34
40
  } = _ref,
35
41
  props = _objectWithoutProperties(_ref, _excluded);
36
42
  const {
@@ -39,12 +45,20 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
39
45
  height: chartHeight
40
46
  } = useDimensions();
41
47
  const svgRef = useRef(null);
42
- const calculatedInset = useMemo(() => getChartInset(inset, defaultChartInset), [inset]);
48
+ const calculatedInset = useMemo(() => getChartInset(inset, layout === 'horizontal' ? defaultHorizontalLayoutChartInset : defaultVerticalLayoutChartInset), [inset, layout]);
43
49
 
44
50
  // Axis configs store the properties of each axis, such as id, scale type, domain limit, etc.
45
- // We only support 1 x axis but allow for multiple y axes.
46
- const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp)[0], [xAxisConfigProp]);
51
+ const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp), [xAxisConfigProp]);
47
52
  const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigProp), [yAxisConfigProp]);
53
+
54
+ // Horizontal layout supports multiple value axes on x, but only a single category axis on y.
55
+ // Vertical layout keeps a single x-axis to preserve existing behavior.
56
+ if (layout === 'horizontal' && yAxisConfig.length > 1) {
57
+ throw new Error('When layout="horizontal", only one y-axis is supported. See https://cds.coinbase.com/components/charts/CartesianChart.');
58
+ }
59
+ if (layout !== 'horizontal' && xAxisConfig.length > 1) {
60
+ throw new Error('Multiple x-axes are only supported when layout="horizontal". See https://cds.coinbase.com/components/charts/CartesianChart.');
61
+ }
48
62
  const {
49
63
  renderedAxes,
50
64
  registerAxis,
@@ -74,50 +88,64 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
74
88
  };
75
89
  }, [chartHeight, chartWidth, calculatedInset, axisPadding]);
76
90
  const {
77
- xAxis,
78
- xScale
91
+ xAxes,
92
+ xScales
79
93
  } = useMemo(() => {
94
+ const axes = new Map();
95
+ const scales = new Map();
80
96
  if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
81
- xAxis: undefined,
82
- xScale: undefined
83
- };
84
- const domain = getAxisDomain(xAxisConfig, series !== null && series !== void 0 ? series : [], 'x');
85
- const range = getAxisRange(xAxisConfig, chartRect, 'x');
86
- const axisConfig = {
87
- scaleType: xAxisConfig.scaleType,
88
- domain,
89
- range,
90
- data: xAxisConfig.data,
91
- categoryPadding: xAxisConfig.categoryPadding,
92
- domainLimit: xAxisConfig.domainLimit
97
+ xAxes: axes,
98
+ xScales: scales
93
99
  };
100
+ xAxisConfig.forEach(axisParam => {
101
+ var _axisParam$id, _series$filter, _axisParam$domainLimi;
102
+ const axisId = (_axisParam$id = axisParam.id) !== null && _axisParam$id !== void 0 ? _axisParam$id : defaultAxisId;
94
103
 
95
- // Create the scale
96
- const scale = getAxisScale({
97
- config: axisConfig,
98
- type: 'x',
99
- range: axisConfig.range,
100
- dataDomain: axisConfig.domain
101
- });
102
- if (!scale) return {
103
- xAxis: undefined,
104
- xScale: undefined
105
- };
104
+ // Get relevant series data
105
+ const relevantSeries = xAxisConfig.length > 1 ? (_series$filter = series === null || series === void 0 ? void 0 : series.filter(s => {
106
+ var _s$xAxisId;
107
+ return ((_s$xAxisId = s.xAxisId) !== null && _s$xAxisId !== void 0 ? _s$xAxisId : defaultAxisId) === axisId;
108
+ })) !== null && _series$filter !== void 0 ? _series$filter : [] : series !== null && series !== void 0 ? series : [];
106
109
 
107
- // Update axis config with actual scale domain (after .nice() or other adjustments)
108
- const scaleDomain = scale.domain();
109
- const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
110
- min: scaleDomain[0],
111
- max: scaleDomain[1]
112
- } : axisConfig.domain;
113
- const finalAxisConfig = _objectSpread(_objectSpread({}, axisConfig), {}, {
114
- domain: actualDomain
110
+ // Calculate domain and range
111
+ const dataDomain = getCartesianAxisDomain(axisParam, relevantSeries, 'x', layout);
112
+ const range = getAxisRange(axisParam, chartRect, 'x');
113
+ const axisConfig = {
114
+ scaleType: axisParam.scaleType,
115
+ domain: dataDomain,
116
+ range,
117
+ data: axisParam.data,
118
+ categoryPadding: axisParam.categoryPadding,
119
+ domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) !== null && _axisParam$domainLimi !== void 0 ? _axisParam$domainLimi : layout === 'horizontal' ? 'nice' : 'strict'
120
+ };
121
+
122
+ // Create the scale
123
+ const scale = getCartesianAxisScale({
124
+ config: axisConfig,
125
+ type: 'x',
126
+ range: axisConfig.range,
127
+ dataDomain: axisConfig.domain,
128
+ layout
129
+ });
130
+ if (scale) {
131
+ scales.set(axisId, scale);
132
+
133
+ // Update axis config with actual scale domain (after .nice() or other adjustments)
134
+ const scaleDomain = scale.domain();
135
+ const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
136
+ min: scaleDomain[0],
137
+ max: scaleDomain[1]
138
+ } : axisConfig.domain;
139
+ axes.set(axisId, _objectSpread(_objectSpread({}, axisConfig), {}, {
140
+ domain: actualDomain
141
+ }));
142
+ }
115
143
  });
116
144
  return {
117
- xAxis: finalAxisConfig,
118
- xScale: scale
145
+ xAxes: axes,
146
+ xScales: scales
119
147
  };
120
- }, [xAxisConfig, series, chartRect]);
148
+ }, [xAxisConfig, series, chartRect, layout]);
121
149
  const {
122
150
  yAxes,
123
151
  yScales
@@ -129,17 +157,17 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
129
157
  yScales: scales
130
158
  };
131
159
  yAxisConfig.forEach(axisParam => {
132
- var _axisParam$id, _series$filter, _axisParam$domainLimi;
133
- const axisId = (_axisParam$id = axisParam.id) !== null && _axisParam$id !== void 0 ? _axisParam$id : defaultAxisId;
160
+ var _axisParam$id2, _series$filter2, _axisParam$domainLimi2;
161
+ const axisId = (_axisParam$id2 = axisParam.id) !== null && _axisParam$id2 !== void 0 ? _axisParam$id2 : defaultAxisId;
134
162
 
135
163
  // Get relevant series data
136
- const relevantSeries = (_series$filter = series === null || series === void 0 ? void 0 : series.filter(s => {
164
+ const relevantSeries = yAxisConfig.length > 1 ? (_series$filter2 = series === null || series === void 0 ? void 0 : series.filter(s => {
137
165
  var _s$yAxisId;
138
166
  return ((_s$yAxisId = s.yAxisId) !== null && _s$yAxisId !== void 0 ? _s$yAxisId : defaultAxisId) === axisId;
139
- })) !== null && _series$filter !== void 0 ? _series$filter : [];
167
+ })) !== null && _series$filter2 !== void 0 ? _series$filter2 : [] : series !== null && series !== void 0 ? series : [];
140
168
 
141
169
  // Calculate domain and range
142
- const dataDomain = getAxisDomain(axisParam, relevantSeries, 'y');
170
+ const dataDomain = getCartesianAxisDomain(axisParam, relevantSeries, 'y', layout);
143
171
  const range = getAxisRange(axisParam, chartRect, 'y');
144
172
  const axisConfig = {
145
173
  scaleType: axisParam.scaleType,
@@ -147,15 +175,16 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
147
175
  range,
148
176
  data: axisParam.data,
149
177
  categoryPadding: axisParam.categoryPadding,
150
- domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) !== null && _axisParam$domainLimi !== void 0 ? _axisParam$domainLimi : 'nice'
178
+ domainLimit: (_axisParam$domainLimi2 = axisParam.domainLimit) !== null && _axisParam$domainLimi2 !== void 0 ? _axisParam$domainLimi2 : layout === 'horizontal' ? 'strict' : 'nice'
151
179
  };
152
180
 
153
181
  // Create the scale
154
- const scale = getAxisScale({
182
+ const scale = getCartesianAxisScale({
155
183
  config: axisConfig,
156
184
  type: 'y',
157
185
  range: axisConfig.range,
158
- dataDomain: axisConfig.domain
186
+ dataDomain: axisConfig.domain,
187
+ layout
159
188
  });
160
189
  if (scale) {
161
190
  scales.set(axisId, scale);
@@ -175,10 +204,10 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
175
204
  yAxes: axes,
176
205
  yScales: scales
177
206
  };
178
- }, [yAxisConfig, series, chartRect]);
179
- const getXAxis = useCallback(() => xAxis, [xAxis]);
207
+ }, [yAxisConfig, series, chartRect, layout]);
208
+ const getXAxis = useCallback(id => xAxes.get(id !== null && id !== void 0 ? id : defaultAxisId), [xAxes]);
180
209
  const getYAxis = useCallback(id => yAxes.get(id !== null && id !== void 0 ? id : defaultAxisId), [yAxes]);
181
- const getXScale = useCallback(() => xScale, [xScale]);
210
+ const getXScale = useCallback(id => xScales.get(id !== null && id !== void 0 ? id : defaultAxisId), [xScales]);
182
211
  const getYScale = useCallback(id => yScales.get(id !== null && id !== void 0 ? id : defaultAxisId), [yScales]);
183
212
  const getSeries = useCallback(seriesId => series === null || series === void 0 ? void 0 : series.find(s => s.id === seriesId), [series]);
184
213
  const stackedDataMap = useMemo(() => {
@@ -189,10 +218,17 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
189
218
  if (!seriesId) return undefined;
190
219
  return stackedDataMap.get(seriesId);
191
220
  }, [stackedDataMap]);
221
+ const categoryAxisIsX = useMemo(() => {
222
+ return layout !== 'horizontal';
223
+ }, [layout]);
224
+ const categoryAxisConfig = useMemo(() => {
225
+ var _xAxisConfig$, _yAxisConfig$;
226
+ return categoryAxisIsX ? (_xAxisConfig$ = xAxisConfig[0]) !== null && _xAxisConfig$ !== void 0 ? _xAxisConfig$ : yAxisConfig[0] : (_yAxisConfig$ = yAxisConfig[0]) !== null && _yAxisConfig$ !== void 0 ? _yAxisConfig$ : xAxisConfig[0];
227
+ }, [categoryAxisIsX, xAxisConfig, yAxisConfig]);
192
228
  const dataLength = useMemo(() => {
193
- // If xAxis has categorical data, use that length
194
- if (xAxisConfig.data && xAxisConfig.data.length > 0) {
195
- return xAxisConfig.data.length;
229
+ // If category axis has categorical data, use that length
230
+ if (categoryAxisConfig.data && categoryAxisConfig.data.length > 0) {
231
+ return categoryAxisConfig.data.length;
196
232
  }
197
233
 
198
234
  // Otherwise, find the longest series
@@ -202,7 +238,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
202
238
  const seriesData = getStackedSeriesData(s.id);
203
239
  return Math.max(max, (_seriesData$length = seriesData === null || seriesData === void 0 ? void 0 : seriesData.length) !== null && _seriesData$length !== void 0 ? _seriesData$length : 0);
204
240
  }, 0);
205
- }, [xAxisConfig.data, series, getStackedSeriesData]);
241
+ }, [categoryAxisConfig, series, getStackedSeriesData]);
206
242
  const getAxisBounds = useCallback(axisId => {
207
243
  const axis = renderedAxes.get(axisId);
208
244
  if (!axis || !chartRect) return;
@@ -251,6 +287,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
251
287
  }
252
288
  }, [renderedAxes, chartRect, calculatedInset]);
253
289
  const contextValue = useMemo(() => ({
290
+ layout,
254
291
  series: series !== null && series !== void 0 ? series : [],
255
292
  getSeries,
256
293
  getSeriesData: getStackedSeriesData,
@@ -266,46 +303,73 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
266
303
  registerAxis,
267
304
  unregisterAxis,
268
305
  getAxisBounds
269
- }), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, getXAxis, getYAxis, getXScale, getYScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
306
+ }), [layout, series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, getXAxis, getYAxis, getXScale, getYScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
270
307
  const rootClassNames = useMemo(() => cx(className, classNames === null || classNames === void 0 ? void 0 : classNames.root), [className, classNames]);
271
308
  const rootStyles = useMemo(() => _objectSpread(_objectSpread({}, style), styles === null || styles === void 0 ? void 0 : styles.root), [style, styles === null || styles === void 0 ? void 0 : styles.root]);
309
+ const legendElement = useMemo(() => {
310
+ if (!legend) return;
311
+ if (legend === true) {
312
+ const isHorizontal = legendPosition === 'top' || legendPosition === 'bottom';
313
+ const flexDirection = isHorizontal ? 'row' : 'column';
314
+ return /*#__PURE__*/_jsx(Legend, {
315
+ accessibilityLabel: legendAccessibilityLabel,
316
+ flexDirection: flexDirection
317
+ });
318
+ }
319
+ return legend;
320
+ }, [legend, legendAccessibilityLabel, legendPosition]);
321
+ const rootBoxProps = useMemo(() => _objectSpread({
322
+ className: rootClassNames,
323
+ height,
324
+ style: rootStyles,
325
+ width
326
+ }, props), [rootClassNames, height, rootStyles, width, props]);
327
+ const chartContent = /*#__PURE__*/_jsx(Box, {
328
+ ref: node => {
329
+ observe(node);
330
+ },
331
+ height: legend ? undefined : height,
332
+ style: {
333
+ flex: 1,
334
+ minHeight: 0,
335
+ minWidth: 0
336
+ },
337
+ width: legend ? undefined : width,
338
+ children: /*#__PURE__*/_jsx(Box, {
339
+ ref: node => {
340
+ const svgElement = node;
341
+ svgRef.current = svgElement;
342
+ // Forward the ref to the user
343
+ if (ref) {
344
+ if (typeof ref === 'function') {
345
+ ref(svgElement);
346
+ } else {
347
+ ref.current = svgElement;
348
+ }
349
+ }
350
+ },
351
+ accessibilityLabel: accessibilityLabel,
352
+ "aria-live": "polite",
353
+ as: "svg",
354
+ className: cx(enableScrubbing && focusStylesCss, classNames === null || classNames === void 0 ? void 0 : classNames.chart),
355
+ height: "100%",
356
+ style: styles === null || styles === void 0 ? void 0 : styles.chart,
357
+ tabIndex: enableScrubbing ? 0 : undefined,
358
+ width: "100%",
359
+ children: children
360
+ })
361
+ });
272
362
  return /*#__PURE__*/_jsx(CartesianChartProvider, {
273
363
  value: contextValue,
274
364
  children: /*#__PURE__*/_jsx(ScrubberProvider, {
275
365
  enableScrubbing: !!enableScrubbing,
276
366
  onScrubberPositionChange: onScrubberPositionChange,
277
367
  svgRef: svgRef,
278
- children: /*#__PURE__*/_jsx(Box, _objectSpread(_objectSpread({
279
- ref: node => {
280
- observe(node);
281
- },
282
- className: rootClassNames,
283
- height: height,
284
- style: rootStyles,
285
- width: width
286
- }, props), {}, {
287
- children: /*#__PURE__*/_jsx(Box, {
288
- ref: node => {
289
- const svgElement = node;
290
- svgRef.current = svgElement;
291
- // Forward the ref to the user
292
- if (ref) {
293
- if (typeof ref === 'function') {
294
- ref(svgElement);
295
- } else {
296
- ref.current = svgElement;
297
- }
298
- }
299
- },
300
- "aria-live": "polite",
301
- as: "svg",
302
- className: cx(enableScrubbing && focusStylesCss, classNames === null || classNames === void 0 ? void 0 : classNames.chart),
303
- height: "100%",
304
- style: styles === null || styles === void 0 ? void 0 : styles.chart,
305
- tabIndex: enableScrubbing ? 0 : undefined,
306
- width: "100%",
307
- children: children
308
- })
368
+ children: legend ? /*#__PURE__*/_jsxs(Box, _objectSpread(_objectSpread({}, rootBoxProps), {}, {
369
+ flexDirection: legendPosition === 'top' || legendPosition === 'bottom' ? 'column' : 'row',
370
+ children: [(legendPosition === 'top' || legendPosition === 'left') && legendElement, chartContent, (legendPosition === 'bottom' || legendPosition === 'right') && legendElement]
371
+ })) : /*#__PURE__*/_jsx(Box, _objectSpread(_objectSpread({}, rootBoxProps), {}, {
372
+ children: chartContent
309
373
  }))
310
374
  })
311
375
  });
@@ -1,9 +1,9 @@
1
1
  import { createContext, useContext } from 'react';
2
- const CartesianChartContext = /*#__PURE__*/createContext(undefined);
2
+ export const CartesianChartContext = /*#__PURE__*/createContext(undefined);
3
3
  export const useCartesianChartContext = () => {
4
4
  const context = useContext(CartesianChartContext);
5
5
  if (!context) {
6
- throw new Error('useCartesianChartContext must be used within a CartesianChart component. See http://cds.coinbase.com/components/graphs/CartesianChart.');
6
+ throw new Error('useCartesianChartContext must be used within a CartesianChart component. See https://cds.coinbase.com/components/charts/CartesianChart.');
7
7
  }
8
8
  return context;
9
9
  };