@coinbase/cds-mobile-visualization 3.4.0-beta.21 → 3.4.0-beta.23

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 (106) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dts/chart/CartesianChart.d.ts +39 -7
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/Path.d.ts.map +1 -1
  5. package/dts/chart/PeriodSelector.d.ts +18 -6
  6. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  7. package/dts/chart/area/Area.d.ts +7 -0
  8. package/dts/chart/area/Area.d.ts.map +1 -1
  9. package/dts/chart/area/AreaChart.d.ts +33 -9
  10. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  11. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  12. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  13. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  14. package/dts/chart/axis/Axis.d.ts +3 -1
  15. package/dts/chart/axis/Axis.d.ts.map +1 -1
  16. package/dts/chart/axis/XAxis.d.ts +6 -0
  17. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  18. package/dts/chart/axis/YAxis.d.ts +1 -0
  19. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  20. package/dts/chart/bar/Bar.d.ts +4 -2
  21. package/dts/chart/bar/Bar.d.ts.map +1 -1
  22. package/dts/chart/bar/BarChart.d.ts +49 -9
  23. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  24. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  25. package/dts/chart/bar/BarStack.d.ts +30 -9
  26. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  27. package/dts/chart/bar/BarStackGroup.d.ts +1 -1
  28. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  29. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  30. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  31. package/dts/chart/gradient/Gradient.d.ts +5 -0
  32. package/dts/chart/gradient/Gradient.d.ts.map +1 -1
  33. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  34. package/dts/chart/line/Line.d.ts +7 -0
  35. package/dts/chart/line/Line.d.ts.map +1 -1
  36. package/dts/chart/line/LineChart.d.ts +8 -5
  37. package/dts/chart/line/LineChart.d.ts.map +1 -1
  38. package/dts/chart/line/ReferenceLine.d.ts +1 -0
  39. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  40. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  41. package/dts/chart/point/Point.d.ts +7 -0
  42. package/dts/chart/point/Point.d.ts.map +1 -1
  43. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -1
  44. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +2 -1
  45. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -1
  46. package/dts/chart/scrubber/Scrubber.d.ts +8 -0
  47. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  48. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -1
  49. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  50. package/dts/chart/utils/axis.d.ts +20 -9
  51. package/dts/chart/utils/axis.d.ts.map +1 -1
  52. package/dts/chart/utils/bar.d.ts +6 -5
  53. package/dts/chart/utils/bar.d.ts.map +1 -1
  54. package/dts/chart/utils/chart.d.ts +13 -0
  55. package/dts/chart/utils/chart.d.ts.map +1 -1
  56. package/dts/chart/utils/context.d.ts +21 -6
  57. package/dts/chart/utils/context.d.ts.map +1 -1
  58. package/dts/chart/utils/gradient.d.ts +3 -1
  59. package/dts/chart/utils/gradient.d.ts.map +1 -1
  60. package/dts/chart/utils/path.d.ts +20 -0
  61. package/dts/chart/utils/path.d.ts.map +1 -1
  62. package/dts/chart/utils/point.d.ts +7 -0
  63. package/dts/chart/utils/point.d.ts.map +1 -1
  64. package/dts/chart/utils/transition.d.ts +7 -4
  65. package/dts/chart/utils/transition.d.ts.map +1 -1
  66. package/esm/chart/CartesianChart.js +107 -68
  67. package/esm/chart/Path.js +18 -14
  68. package/esm/chart/__stories__/ChartTransitions.stories.js +6 -10
  69. package/esm/chart/area/Area.js +19 -9
  70. package/esm/chart/area/AreaChart.js +18 -13
  71. package/esm/chart/area/DottedArea.js +23 -17
  72. package/esm/chart/area/GradientArea.js +11 -6
  73. package/esm/chart/area/SolidArea.js +3 -1
  74. package/esm/chart/area/__stories__/AreaChart.stories.js +30 -2
  75. package/esm/chart/axis/XAxis.js +14 -21
  76. package/esm/chart/axis/YAxis.js +4 -3
  77. package/esm/chart/bar/Bar.js +9 -5
  78. package/esm/chart/bar/BarChart.js +34 -31
  79. package/esm/chart/bar/BarPlot.js +7 -5
  80. package/esm/chart/bar/BarStack.js +176 -36
  81. package/esm/chart/bar/BarStackGroup.js +37 -27
  82. package/esm/chart/bar/DefaultBar.js +24 -8
  83. package/esm/chart/bar/DefaultBarStack.js +24 -10
  84. package/esm/chart/bar/__stories__/BarChart.stories.js +99 -3
  85. package/esm/chart/gradient/Gradient.js +2 -1
  86. package/esm/chart/line/DottedLine.js +3 -1
  87. package/esm/chart/line/Line.js +36 -21
  88. package/esm/chart/line/LineChart.js +13 -11
  89. package/esm/chart/line/SolidLine.js +3 -1
  90. package/esm/chart/line/__stories__/LineChart.stories.js +31 -0
  91. package/esm/chart/point/Point.js +2 -1
  92. package/esm/chart/scrubber/DefaultScrubberBeacon.js +1 -1
  93. package/esm/chart/scrubber/DefaultScrubberLabel.js +26 -10
  94. package/esm/chart/scrubber/Scrubber.js +47 -21
  95. package/esm/chart/scrubber/ScrubberBeaconGroup.js +24 -20
  96. package/esm/chart/scrubber/ScrubberProvider.js +29 -24
  97. package/esm/chart/scrubber/__stories__/Scrubber.stories.js +135 -1
  98. package/esm/chart/utils/axis.js +42 -14
  99. package/esm/chart/utils/bar.js +6 -4
  100. package/esm/chart/utils/chart.js +18 -5
  101. package/esm/chart/utils/context.js +7 -0
  102. package/esm/chart/utils/gradient.js +8 -4
  103. package/esm/chart/utils/path.js +90 -61
  104. package/esm/chart/utils/point.js +28 -18
  105. package/esm/chart/utils/transition.js +28 -10
  106. package/package.json +5 -5
@@ -1,3 +1,4 @@
1
+ import type { CartesianChartLayout } from './context';
1
2
  import { type ChartScaleFunction } from './scale';
2
3
  import type { Transition } from './transition';
3
4
  /**
@@ -19,10 +20,12 @@ export type ChartPathCurveType =
19
20
  * Get the d3 curve function for a path.
20
21
  * See https://d3js.org/d3-shape/curve
21
22
  * @param curve - The curve type. Defaults to 'linear'.
23
+ * @param layout - The chart layout. Defaults to 'vertical'.
22
24
  * @returns The d3 curve function.
23
25
  */
24
26
  export declare const getPathCurveFunction: (
25
27
  curve?: ChartPathCurveType,
28
+ layout?: CartesianChartLayout,
26
29
  ) => import('d3-shape').CurveFactory;
27
30
  /**
28
31
  * Generates an SVG line path string from data using chart scale functions.
@@ -39,7 +42,9 @@ export declare const getLinePath: ({
39
42
  xScale,
40
43
  yScale,
41
44
  xData,
45
+ yData,
42
46
  connectNulls,
47
+ layout,
43
48
  }: {
44
49
  data: (
45
50
  | number
@@ -53,12 +58,18 @@ export declare const getLinePath: ({
53
58
  xScale: ChartScaleFunction;
54
59
  yScale: ChartScaleFunction;
55
60
  xData?: number[];
61
+ yData?: number[];
56
62
  /**
57
63
  * When true, null values are skipped and the line connects across gaps.
58
64
  * When false, null values create gaps in the line.
59
65
  * @default false
60
66
  */
61
67
  connectNulls?: boolean;
68
+ /**
69
+ * Chart layout.
70
+ * @default 'vertical'
71
+ */
72
+ layout?: CartesianChartLayout;
62
73
  }) => string;
63
74
  /**
64
75
  * Generates an SVG area path string from data using chart scale functions.
@@ -88,19 +99,27 @@ export declare const getAreaPath: ({
88
99
  xScale,
89
100
  yScale,
90
101
  xData,
102
+ yData,
91
103
  connectNulls,
104
+ layout,
92
105
  }: {
93
106
  data: (number | null)[] | Array<[number, number] | null>;
94
107
  xScale: ChartScaleFunction;
95
108
  yScale: ChartScaleFunction;
96
109
  curve: ChartPathCurveType;
97
110
  xData?: number[];
111
+ yData?: number[];
98
112
  /**
99
113
  * When true, null values are skipped and the area connects across gaps.
100
114
  * When false, null values create gaps in the area.
101
115
  * @default false
102
116
  */
103
117
  connectNulls?: boolean;
118
+ /**
119
+ * Chart layout.
120
+ * @default 'vertical'
121
+ */
122
+ layout?: CartesianChartLayout;
104
123
  }) => string;
105
124
  /**
106
125
  * Converts line coordinates to an SVG path string.
@@ -134,6 +153,7 @@ export declare const getBarPath: (
134
153
  radius: number,
135
154
  roundTop: boolean,
136
155
  roundBottom: boolean,
156
+ layout?: CartesianChartLayout,
137
157
  ) => string;
138
158
  /**
139
159
  * Generates an SVG path string with circles arranged in a dotted pattern within a bounding area.
@@ -1 +1 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/path.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,UAGxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,cAAc,GACd,UAAU,GACV,SAAS,GACT,MAAM,GACN,YAAY,GACZ,WAAW,CAAC;AAEhB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAO,kBAA6B,oCAsBxE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,uDAOzB;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,KAAG,MAoBH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,WAAW,GAAI,uDAOzB;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,KAAG,MAoFH,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,MAE3E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GACrB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,UAAU,OAAO,EACjB,aAAa,OAAO,KACnB,MA0BF,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC/D,aAAa,MAAM,EACnB,SAAS,MAAM,KACd,MAgCF,CAAC"}
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/path.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,UAGxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,cAAc,GACd,UAAU,GACV,SAAS,GACT,MAAM,GACN,YAAY,GACZ,WAAW,CAAC;AAEhB;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,QAAO,kBAA6B,EACpC,SAAQ,oBAAiC,oCA2B1C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,sEASzB;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,KAAG,MAoBH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,WAAW,GAAI,sEASzB;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,KAAG,MAwFH,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,KAAG,MAE3E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GACrB,GAAG,MAAM,EACT,GAAG,MAAM,EACT,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,UAAU,OAAO,EACjB,aAAa,OAAO,EACpB,SAAQ,oBAAiC,KACxC,MAgCF,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC/D,aAAa,MAAM,EACnB,SAAS,MAAM,KACd,MAgCF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { TextHorizontalAlignment, TextVerticalAlignment } from '../text';
2
+ import type { CartesianChartLayout } from './context';
2
3
  import { type ChartScaleFunction, type PointAnchor, type SerializableScale } from './scale';
3
4
  /**
4
5
  * Position a label should be placed relative to the point
@@ -99,6 +100,7 @@ export declare const projectPoints: ({
99
100
  yScale,
100
101
  xData,
101
102
  yData,
103
+ layout,
102
104
  }: {
103
105
  data: (
104
106
  | number
@@ -112,6 +114,11 @@ export declare const projectPoints: ({
112
114
  yData?: number[];
113
115
  xScale: ChartScaleFunction;
114
116
  yScale: ChartScaleFunction;
117
+ /**
118
+ * Chart layout.
119
+ * @default 'vertical'
120
+ */
121
+ layout?: CartesianChartLayout;
115
122
  }) => Array<{
116
123
  x: number;
117
124
  y: number;
@@ -1 +1 @@
1
- {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/point.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE9E,OAAO,EAIL,KAAK,kBAAkB,EAIvB,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,OAAO,kBAAkB,EACzB,SAAQ,WAAsB,KAC7B,MAgCF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,EACxB,MAAM,GAAE,WAAsB,GAC7B,MAAM,CAuCR;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,EAChD,CAAC,EACD,CAAC,EACD,MAAM,EACN,MAAM,GACP,EAAE;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAM3B;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GAAI,2BAK1B;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAEzB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,yCAM3B;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAG,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqDxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,kBAAkB,KAC3B;IAAE,mBAAmB,EAAE,uBAAuB,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,CAAA;CAyB1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,GAAG,MAAM,EACT,GAAG,MAAM,EACT,UAAU,kBAAkB,EAC5B,QAAQ,MAAM,KACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CA0BxB,CAAC"}
1
+ {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/point.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAIL,KAAK,kBAAkB,EAGvB,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,OAAO,kBAAkB,EACzB,SAAQ,WAAsB,KAC7B,MAgCF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,EACxB,MAAM,GAAE,WAAsB,GAC7B,MAAM,CAuCR;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,EAChD,CAAC,EACD,CAAC,EACD,MAAM,EACN,MAAM,GACP,EAAE;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAM3B;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GAAI,2BAK1B;IACD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAEzB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAI,iDAO3B;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,KAAG,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4CxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,kBAAkB,KAC3B;IAAE,mBAAmB,EAAE,uBAAuB,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,CAAA;CAyB1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,GAAG,MAAM,EACT,GAAG,MAAM,EACT,UAAU,kBAAkB,EAC5B,QAAQ,MAAM,KACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CA0BxB,CAAC"}
@@ -67,7 +67,7 @@ export declare const getTransition: (
67
67
  value: Transition | null | undefined,
68
68
  animate: boolean,
69
69
  defaultValue: Transition,
70
- ) => Transition;
70
+ ) => Transition | null;
71
71
  /**
72
72
  * @worklet
73
73
  */
@@ -107,7 +107,10 @@ export declare const useInterpolator: <T>(
107
107
  * // Timing animation
108
108
  * progress.value = buildTransition(1, { type: 'timing', duration: 500 });
109
109
  */
110
- export declare const buildTransition: (targetValue: number, transition: Transition) => number;
110
+ export declare const buildTransition: (
111
+ targetValue: number,
112
+ transition: Transition | null,
113
+ ) => number;
111
114
  /**
112
115
  * Hook for path animation state and transitions.
113
116
  *
@@ -161,12 +164,12 @@ export declare const usePathTransition: ({
161
164
  * Only used when `initialPath` is provided.
162
165
  * If not provided, falls back to `update`.
163
166
  */
164
- enter?: Transition;
167
+ enter?: Transition | null;
165
168
  /**
166
169
  * Transition for subsequent data update animations.
167
170
  * @default defaultTransition
168
171
  */
169
- update?: Transition;
172
+ update?: Transition | null;
170
173
  };
171
174
  /**
172
175
  * Transition for updates.
@@ -1 +1 @@
1
- {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/transition.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAKhB,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAG7E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAAG,CACrB,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACvC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAC1C,GAAG;IACF;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAI/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;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,UAGF,CAAC;AAGF;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,IAAI,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,CAAC,EAAE,EACX,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,CAAC,KACN,CAAC,CAAC;AAEP,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,SAAS,MAAM,CAAC,EAChB,OAAO,WAAW,CAAC,MAAM,CAAC,EAC1B,cAAc,YAAY,CAAC,CAAC,CAAC,EAC7B,OAAO,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,EACX,UAAU,iBAAiB,mBAc5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,YAAY,UAAU,KAAG,MAyB7E,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,CAAC;QACnB;;;WAGG;QACH,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB,CAAC;IACF;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAG,WAAW,CAAC,MAAM,CAoErB,CAAC"}
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/transition.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAKhB,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAG7E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAAG,CACrB,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACvC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAC1C,GAAG;IACF;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAI/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,UAI7C,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,UAAU,GAAG,IAAI,GAAG,SAAS,EACpC,SAAS,OAAO,EAChB,cAAc,UAAU,KACvB,UAAU,GAAG,IAGf,CAAC;AAGF;;GAEG;AACH,KAAK,YAAY,CAAC,CAAC,IAAI,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,CAAC,EAAE,EACX,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,CAAC,KACN,CAAC,CAAC;AAEP,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,SAAS,MAAM,CAAC,EAChB,OAAO,WAAW,CAAC,MAAM,CAAC,EAC1B,cAAc,YAAY,CAAC,CAAC,CAAC,EAC7B,OAAO,MAAM,EAAE,EACf,QAAQ,CAAC,EAAE,EACX,UAAU,iBAAiB,mBAc5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,YAAY,UAAU,GAAG,IAAI,KAAG,MA4BpF,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,CAkFrB,CAAC"}
@@ -1,4 +1,4 @@
1
- const _excluded = ["series", "children", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "legend", "legendPosition", "legendAccessibilityLabel", "width", "height", "style", "styles", "allowOverflowGestures", "fontFamilies", "fontProvider", "collapsable"];
1
+ const _excluded = ["series", "children", "layout", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "legend", "legendPosition", "legendAccessibilityLabel", "width", "height", "style", "styles", "allowOverflowGestures", "fontFamilies", "fontProvider", "collapsable"];
2
2
  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); }
3
3
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
4
4
  import React, { forwardRef, memo, useCallback, useMemo } from 'react';
@@ -10,7 +10,7 @@ import { convertToSerializableScale } from './utils/scale';
10
10
  import { useChartContextBridge } from './ChartContextBridge';
11
11
  import { CartesianChartProvider } from './ChartProvider';
12
12
  import { Legend } from './legend';
13
- import { defaultAxisId, defaultChartInset, getAxisConfig, getAxisDomain, getAxisRange, getAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
13
+ import { defaultAxisId, defaultHorizontalLayoutChartInset, defaultVerticalLayoutChartInset, getAxisConfig, getAxisRange, getCartesianAxisDomain, getCartesianAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
14
14
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
15
  const ChartCanvas = /*#__PURE__*/memo(_ref => {
16
16
  let {
@@ -32,6 +32,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
32
32
  let {
33
33
  series,
34
34
  children,
35
+ layout = 'vertical',
35
36
  animate = true,
36
37
  enableScrubbing,
37
38
  xAxis: xAxisConfigProp,
@@ -57,11 +58,18 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
57
58
  const [containerLayout, onContainerLayout] = useLayout();
58
59
  const chartWidth = containerLayout.width;
59
60
  const chartHeight = containerLayout.height;
60
- const calculatedInset = useMemo(() => getChartInset(inset, defaultChartInset), [inset]);
61
-
62
- // there can only be one x axis but the helper function always returns an array
63
- const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp)[0], [xAxisConfigProp]);
61
+ const calculatedInset = useMemo(() => getChartInset(inset, layout === 'horizontal' ? defaultHorizontalLayoutChartInset : defaultVerticalLayoutChartInset), [inset, layout]);
62
+ const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp), [xAxisConfigProp]);
64
63
  const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigProp), [yAxisConfigProp]);
64
+
65
+ // Horizontal layout supports multiple value axes on x, but only a single category axis on y.
66
+ // Vertical layout keeps a single x-axis to preserve existing behavior.
67
+ if (layout === 'horizontal' && yAxisConfig.length > 1) {
68
+ throw new Error('When layout="horizontal", only one y-axis is supported. See https://cds.coinbase.com/components/charts/CartesianChart.');
69
+ }
70
+ if (layout !== 'horizontal' && xAxisConfig.length > 1) {
71
+ throw new Error('Multiple x-axes are only supported when layout="horizontal". See https://cds.coinbase.com/components/charts/CartesianChart.');
72
+ }
65
73
  const {
66
74
  renderedAxes,
67
75
  registerAxis,
@@ -91,54 +99,76 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
91
99
  };
92
100
  }, [chartHeight, chartWidth, totalInset]);
93
101
  const {
94
- xAxis,
95
- xScale
102
+ xAxes,
103
+ xScales
96
104
  } = useMemo(() => {
105
+ const axes = new Map();
106
+ const scales = new Map();
97
107
  if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
98
- xAxis: undefined,
99
- xScale: undefined
100
- };
101
- const domain = getAxisDomain(xAxisConfig, series != null ? series : [], 'x');
102
- const range = getAxisRange(xAxisConfig, chartRect, 'x');
103
- const axisConfig = {
104
- scaleType: xAxisConfig.scaleType,
105
- domain,
106
- range,
107
- data: xAxisConfig.data,
108
- categoryPadding: xAxisConfig.categoryPadding,
109
- domainLimit: xAxisConfig.domainLimit
108
+ xAxes: axes,
109
+ xScales: scales
110
110
  };
111
+ xAxisConfig.forEach(axisParam => {
112
+ var _axisParam$id, _series$filter, _axisParam$domainLimi;
113
+ const axisId = (_axisParam$id = axisParam.id) != null ? _axisParam$id : defaultAxisId;
111
114
 
112
- // Create the scale
113
- const scale = getAxisScale({
114
- config: axisConfig,
115
- type: 'x',
116
- range: axisConfig.range,
117
- dataDomain: axisConfig.domain
118
- });
119
- if (!scale) return {
120
- xAxis: undefined,
121
- xScale: undefined
122
- };
115
+ // Get relevant series data.
116
+ const relevantSeries = xAxisConfig.length > 1 ? (_series$filter = series == null ? void 0 : series.filter(s => {
117
+ var _s$xAxisId;
118
+ return ((_s$xAxisId = s.xAxisId) != null ? _s$xAxisId : defaultAxisId) === axisId;
119
+ })) != null ? _series$filter : [] : series != null ? series : [];
120
+
121
+ // Calculate domain and range.
122
+ const dataDomain = getCartesianAxisDomain(axisParam, relevantSeries, 'x', layout);
123
+ const range = getAxisRange(axisParam, chartRect, 'x');
124
+ const axisConfig = {
125
+ scaleType: axisParam.scaleType,
126
+ domain: dataDomain,
127
+ range,
128
+ data: axisParam.data,
129
+ categoryPadding: axisParam.categoryPadding,
130
+ domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) != null ? _axisParam$domainLimi : layout === 'horizontal' ? 'nice' : 'strict'
131
+ };
132
+
133
+ // Create the scale.
134
+ const scale = getCartesianAxisScale({
135
+ config: axisConfig,
136
+ type: 'x',
137
+ range: axisConfig.range,
138
+ dataDomain: axisConfig.domain,
139
+ layout
140
+ });
141
+ if (scale) {
142
+ scales.set(axisId, scale);
123
143
 
124
- // Update axis config with actual scale domain (after .nice() or other adjustments)
125
- const scaleDomain = scale.domain();
126
- const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
127
- min: scaleDomain[0],
128
- max: scaleDomain[1]
129
- } : axisConfig.domain;
130
- const finalAxisConfig = _extends({}, axisConfig, {
131
- domain: actualDomain
144
+ // Update axis config with actual scale domain (after .nice() or other adjustments).
145
+ const scaleDomain = scale.domain();
146
+ const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
147
+ min: scaleDomain[0],
148
+ max: scaleDomain[1]
149
+ } : axisConfig.domain;
150
+ axes.set(axisId, _extends({}, axisConfig, {
151
+ domain: actualDomain
152
+ }));
153
+ }
132
154
  });
133
155
  return {
134
- xAxis: finalAxisConfig,
135
- xScale: scale
156
+ xAxes: axes,
157
+ xScales: scales
136
158
  };
137
- }, [xAxisConfig, series, chartRect]);
138
- const xSerializableScale = useMemo(() => {
139
- if (!xScale) return;
140
- return convertToSerializableScale(xScale);
141
- }, [xScale]);
159
+ }, [xAxisConfig, series, chartRect, layout]);
160
+
161
+ // We need a set of serialized scales usable in UI thread.
162
+ const xSerializableScales = useMemo(() => {
163
+ const serializableScales = new Map();
164
+ xScales.forEach((scale, id) => {
165
+ const serializableScale = convertToSerializableScale(scale);
166
+ if (serializableScale) {
167
+ serializableScales.set(id, serializableScale);
168
+ }
169
+ });
170
+ return serializableScales;
171
+ }, [xScales]);
142
172
  const {
143
173
  yAxes,
144
174
  yScales
@@ -150,17 +180,17 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
150
180
  yScales: scales
151
181
  };
152
182
  yAxisConfig.forEach(axisParam => {
153
- var _axisParam$id, _series$filter, _axisParam$domainLimi;
154
- const axisId = (_axisParam$id = axisParam.id) != null ? _axisParam$id : defaultAxisId;
183
+ var _axisParam$id2, _series$filter2, _axisParam$domainLimi2;
184
+ const axisId = (_axisParam$id2 = axisParam.id) != null ? _axisParam$id2 : defaultAxisId;
155
185
 
156
- // Get relevant series data
157
- const relevantSeries = (_series$filter = series == null ? void 0 : series.filter(s => {
186
+ // Get relevant series data.
187
+ const relevantSeries = yAxisConfig.length > 1 ? (_series$filter2 = series == null ? void 0 : series.filter(s => {
158
188
  var _s$yAxisId;
159
189
  return ((_s$yAxisId = s.yAxisId) != null ? _s$yAxisId : defaultAxisId) === axisId;
160
- })) != null ? _series$filter : [];
190
+ })) != null ? _series$filter2 : [] : series != null ? series : [];
161
191
 
162
- // Calculate domain and range
163
- const dataDomain = getAxisDomain(axisParam, relevantSeries, 'y');
192
+ // Calculate domain and range.
193
+ const dataDomain = getCartesianAxisDomain(axisParam, relevantSeries, 'y', layout);
164
194
  const range = getAxisRange(axisParam, chartRect, 'y');
165
195
  const axisConfig = {
166
196
  scaleType: axisParam.scaleType,
@@ -168,20 +198,21 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
168
198
  range,
169
199
  data: axisParam.data,
170
200
  categoryPadding: axisParam.categoryPadding,
171
- domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) != null ? _axisParam$domainLimi : 'nice'
201
+ domainLimit: (_axisParam$domainLimi2 = axisParam.domainLimit) != null ? _axisParam$domainLimi2 : layout === 'horizontal' ? 'strict' : 'nice'
172
202
  };
173
203
 
174
- // Create the scale
175
- const scale = getAxisScale({
204
+ // Create the scale.
205
+ const scale = getCartesianAxisScale({
176
206
  config: axisConfig,
177
207
  type: 'y',
178
208
  range: axisConfig.range,
179
- dataDomain: axisConfig.domain
209
+ dataDomain: axisConfig.domain,
210
+ layout
180
211
  });
181
212
  if (scale) {
182
213
  scales.set(axisId, scale);
183
214
 
184
- // Update axis config with actual scale domain (after .nice() or other adjustments)
215
+ // Update axis config with actual scale domain (after .nice() or other adjustments).
185
216
  const scaleDomain = scale.domain();
186
217
  const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
187
218
  min: scaleDomain[0],
@@ -196,7 +227,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
196
227
  yAxes: axes,
197
228
  yScales: scales
198
229
  };
199
- }, [yAxisConfig, series, chartRect]);
230
+ }, [yAxisConfig, series, chartRect, layout]);
200
231
 
201
232
  // We need a set of serialized scales usable in UI thread
202
233
  const ySerializableScales = useMemo(() => {
@@ -209,11 +240,11 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
209
240
  });
210
241
  return serializableScales;
211
242
  }, [yScales]);
212
- const getXAxis = useCallback(() => xAxis, [xAxis]);
243
+ const getXAxis = useCallback(id => xAxes.get(id != null ? id : defaultAxisId), [xAxes]);
213
244
  const getYAxis = useCallback(id => yAxes.get(id != null ? id : defaultAxisId), [yAxes]);
214
- const getXScale = useCallback(() => xScale, [xScale]);
245
+ const getXScale = useCallback(id => xScales.get(id != null ? id : defaultAxisId), [xScales]);
215
246
  const getYScale = useCallback(id => yScales.get(id != null ? id : defaultAxisId), [yScales]);
216
- const getXSerializableScale = useCallback(() => xSerializableScale, [xSerializableScale]);
247
+ const getXSerializableScale = useCallback(id => xSerializableScales.get(id != null ? id : defaultAxisId), [xSerializableScales]);
217
248
  const getYSerializableScale = useCallback(id => ySerializableScales.get(id != null ? id : defaultAxisId), [ySerializableScales]);
218
249
  const getSeries = useCallback(seriesId => series == null ? void 0 : series.find(s => s.id === seriesId), [series]);
219
250
  const stackedDataMap = useMemo(() => {
@@ -224,20 +255,27 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
224
255
  if (!seriesId) return undefined;
225
256
  return stackedDataMap.get(seriesId);
226
257
  }, [stackedDataMap]);
258
+ const categoryAxisIsX = useMemo(() => {
259
+ return layout !== 'horizontal';
260
+ }, [layout]);
261
+ const categoryAxisConfig = useMemo(() => {
262
+ var _xAxisConfig$, _yAxisConfig$;
263
+ return categoryAxisIsX ? (_xAxisConfig$ = xAxisConfig[0]) != null ? _xAxisConfig$ : yAxisConfig[0] : (_yAxisConfig$ = yAxisConfig[0]) != null ? _yAxisConfig$ : xAxisConfig[0];
264
+ }, [categoryAxisIsX, xAxisConfig, yAxisConfig]);
227
265
  const dataLength = useMemo(() => {
228
- // If xAxis has categorical data, use that length
229
- if (xAxisConfig.data && xAxisConfig.data.length > 0) {
230
- return xAxisConfig.data.length;
266
+ // If category axis has categorical data, use that length.
267
+ if (categoryAxisConfig.data && categoryAxisConfig.data.length > 0) {
268
+ return categoryAxisConfig.data.length;
231
269
  }
232
270
 
233
- // Otherwise, find the longest series
271
+ // Otherwise, find the longest series.
234
272
  if (!series || series.length === 0) return 0;
235
273
  return series.reduce((max, s) => {
236
274
  var _seriesData$length;
237
275
  const seriesData = getStackedSeriesData(s.id);
238
276
  return Math.max(max, (_seriesData$length = seriesData == null ? void 0 : seriesData.length) != null ? _seriesData$length : 0);
239
277
  }, 0);
240
- }, [xAxisConfig.data, series, getStackedSeriesData]);
278
+ }, [categoryAxisConfig, series, getStackedSeriesData]);
241
279
  const getAxisBounds = useCallback(axisId => {
242
280
  const axis = renderedAxes.get(axisId);
243
281
  if (!axis || !chartRect) return;
@@ -290,6 +328,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
290
328
  return Skia.TypefaceFontProvider.Make();
291
329
  }, [fontProviderProp]);
292
330
  const contextValue = useMemo(() => ({
331
+ layout,
293
332
  series: series != null ? series : [],
294
333
  getSeries,
295
334
  getSeriesData: getStackedSeriesData,
@@ -309,7 +348,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2,
309
348
  registerAxis,
310
349
  unregisterAxis,
311
350
  getAxisBounds
312
- }), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, fontFamilies, fontProvider, getXAxis, getYAxis, getXScale, getYScale, getXSerializableScale, getYSerializableScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
351
+ }), [layout, series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, fontFamilies, fontProvider, getXAxis, getYAxis, getXScale, getYScale, getXSerializableScale, getYSerializableScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
313
352
  const rootStyles = useMemo(() => {
314
353
  return [style, styles == null ? void 0 : styles.root];
315
354
  }, [style, styles == null ? void 0 : styles.root]);
package/esm/chart/Path.js CHANGED
@@ -92,18 +92,19 @@ export const Path = /*#__PURE__*/memo(props => {
92
92
  const isReady = !!context.getXScale();
93
93
  const enterTransition = useMemo(() => getTransition(transitions == null ? void 0 : transitions.enter, animate, defaultPathEnterTransition), [animate, transitions == null ? void 0 : transitions.enter]);
94
94
  const updateTransition = useMemo(() => getTransition((transitions == null ? void 0 : transitions.update) !== undefined ? transitions.update : transition, animate, defaultTransition), [animate, transitions == null ? void 0 : transitions.update, transition]);
95
+ const shouldAnimateClip = animate && enterTransition !== null;
95
96
 
96
97
  // The clip offset provides extra padding to prevent path from being cut off
97
98
  // Area charts typically use offset=0 for exact clipping, while lines use offset=2 for breathing room
98
99
  const totalOffset = clipOffset * 2; // Applied on both sides
99
100
 
100
101
  // Animation progress for clip path reveal
101
- const clipProgress = useSharedValue(animate ? 0 : 1);
102
+ const clipProgress = useSharedValue(shouldAnimateClip ? 0 : 1);
102
103
  useEffect(() => {
103
- if (animate && isReady) {
104
+ if (shouldAnimateClip && isReady) {
104
105
  clipProgress.value = buildTransition(1, enterTransition);
105
106
  }
106
- }, [animate, isReady, clipProgress, enterTransition]);
107
+ }, [shouldAnimateClip, isReady, clipProgress, enterTransition]);
107
108
 
108
109
  // Create initial and target clip paths for animation
109
110
  const {
@@ -114,32 +115,35 @@ export const Path = /*#__PURE__*/memo(props => {
114
115
  initialClipPath: null,
115
116
  targetClipPath: null
116
117
  };
118
+ const categoryAxisIsX = context.layout !== 'horizontal';
119
+ const fullWidth = rect.width + totalOffset;
120
+ const fullHeight = rect.height + totalOffset;
117
121
 
118
- // Initial clip path (width = 0)
122
+ // Initial clip path starts collapsed on the category axis.
119
123
  const initial = Skia.Path.Make();
120
124
  initial.addRect({
121
125
  x: rect.x - clipOffset,
122
126
  y: rect.y - clipOffset,
123
- width: 0,
124
- height: rect.height + totalOffset
127
+ width: categoryAxisIsX ? 0 : fullWidth,
128
+ height: categoryAxisIsX ? fullHeight : 0
125
129
  });
126
130
 
127
- // Target clip path (full width)
131
+ // Target clip path is fully expanded.
128
132
  const target = Skia.Path.Make();
129
133
  target.addRect({
130
134
  x: rect.x - clipOffset,
131
135
  y: rect.y - clipOffset,
132
- width: rect.width + totalOffset,
133
- height: rect.height + totalOffset
136
+ width: fullWidth,
137
+ height: fullHeight
134
138
  });
135
139
  return {
136
140
  initialClipPath: initial,
137
141
  targetClipPath: target
138
142
  };
139
- }, [rect, clipOffset, totalOffset]);
143
+ }, [rect, clipOffset, totalOffset, context.layout]);
140
144
 
141
145
  // Use usePathInterpolation for animated clip path
142
- const animatedClipPath = usePathInterpolation(clipProgress, [0, 1], animate && initialClipPath && targetClipPath ? [initialClipPath, targetClipPath] : targetClipPath ? [targetClipPath, targetClipPath] : [Skia.Path.Make(), Skia.Path.Make()]);
146
+ const animatedClipPath = usePathInterpolation(clipProgress, [0, 1], shouldAnimateClip && initialClipPath && targetClipPath ? [initialClipPath, targetClipPath] : targetClipPath ? [targetClipPath, targetClipPath] : [Skia.Path.Make(), Skia.Path.Make()]);
143
147
 
144
148
  // Resolve the final clip path:
145
149
  // 1. If clipPath prop was explicitly provided, use it (even if null = no clipping)
@@ -152,13 +156,13 @@ export const Path = /*#__PURE__*/memo(props => {
152
156
  }
153
157
 
154
158
  // If not animating or paths are null, return target clip path
155
- if (!animate || !targetClipPath) {
159
+ if (!shouldAnimateClip || !targetClipPath) {
156
160
  return targetClipPath;
157
161
  }
158
162
 
159
163
  // Return undefined here since we'll use animatedClipPath directly
160
164
  return undefined;
161
- }, [clipPathProp, animate, targetClipPath]);
165
+ }, [clipPathProp, shouldAnimateClip, targetClipPath]);
162
166
 
163
167
  // Convert SVG path string to SkPath for static rendering
164
168
  const staticPath = useDerivedValue(() => {
@@ -206,7 +210,7 @@ export const Path = /*#__PURE__*/memo(props => {
206
210
  });
207
211
 
208
212
  // Determine which clip path to use
209
- const finalClipPath = animate && resolvedClipPath === undefined ? animatedClipPath : resolvedClipPath;
213
+ const finalClipPath = shouldAnimateClip && resolvedClipPath === undefined ? animatedClipPath : resolvedClipPath;
210
214
 
211
215
  // If finalClipPath is null, render without clipping
212
216
  if (finalClipPath === null) {
@@ -5,7 +5,7 @@ import { IconButton } from '@coinbase/cds-mobile/buttons/IconButton';
5
5
  import { ExampleScreen } from '@coinbase/cds-mobile/examples/ExampleScreen';
6
6
  import { Box, HStack, VStack } from '@coinbase/cds-mobile/layout';
7
7
  import { Text } from '@coinbase/cds-mobile/typography';
8
- import { Area } from '../area/Area';
8
+ import { AreaChart } from '../area/AreaChart';
9
9
  import { BarChart } from '../bar/BarChart';
10
10
  import { CartesianChart } from '../CartesianChart';
11
11
  import { Line } from '../line/Line';
@@ -143,8 +143,9 @@ const TransitionAreaChart = /*#__PURE__*/memo(_ref2 => {
143
143
  idlePulse,
144
144
  scrubberRef
145
145
  } = _ref2;
146
- return /*#__PURE__*/_jsxs(CartesianChart, {
146
+ return /*#__PURE__*/_jsx(AreaChart, {
147
147
  enableScrubbing: true,
148
+ showLines: true,
148
149
  height: 200,
149
150
  inset: {
150
151
  top: 16,
@@ -156,18 +157,13 @@ const TransitionAreaChart = /*#__PURE__*/memo(_ref2 => {
156
157
  id: 'values',
157
158
  data
158
159
  }],
159
- children: [/*#__PURE__*/_jsx(Area, {
160
- seriesId: "values",
161
- transitions: transitions
162
- }), /*#__PURE__*/_jsx(Line, {
163
- seriesId: "values",
164
- transitions: transitions
165
- }), /*#__PURE__*/_jsx(Scrubber, {
160
+ transitions: transitions,
161
+ children: /*#__PURE__*/_jsx(Scrubber, {
166
162
  ref: scrubberRef,
167
163
  hideOverlay: true,
168
164
  idlePulse: idlePulse,
169
165
  transitions: transitions
170
- })]
166
+ })
171
167
  });
172
168
  });
173
169
  const MultiLineChart = /*#__PURE__*/memo(_ref3 => {