@coinbase/cds-web-visualization 3.4.0-beta.4 → 3.4.0-beta.6

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 +13 -0
  2. package/dts/chart/CartesianChart.d.ts +38 -2
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/Path.d.ts +27 -7
  5. package/dts/chart/Path.d.ts.map +1 -1
  6. package/dts/chart/PeriodSelector.d.ts +0 -4
  7. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  8. package/dts/chart/area/Area.d.ts +54 -24
  9. package/dts/chart/area/Area.d.ts.map +1 -1
  10. package/dts/chart/area/AreaChart.d.ts +33 -6
  11. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  12. package/dts/chart/area/DottedArea.d.ts +21 -44
  13. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  14. package/dts/chart/area/GradientArea.d.ts +21 -12
  15. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  16. package/dts/chart/area/SolidArea.d.ts +16 -1
  17. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  18. package/dts/chart/axis/Axis.d.ts +89 -43
  19. package/dts/chart/axis/Axis.d.ts.map +1 -1
  20. package/dts/chart/axis/DefaultAxisTickLabel.d.ts +8 -0
  21. package/dts/chart/axis/DefaultAxisTickLabel.d.ts.map +1 -0
  22. package/dts/chart/axis/XAxis.d.ts +1 -1
  23. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  24. package/dts/chart/axis/YAxis.d.ts +1 -1
  25. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  26. package/dts/chart/axis/index.d.ts +1 -0
  27. package/dts/chart/axis/index.d.ts.map +1 -1
  28. package/dts/chart/bar/Bar.d.ts +16 -13
  29. package/dts/chart/bar/Bar.d.ts.map +1 -1
  30. package/dts/chart/bar/BarChart.d.ts +17 -8
  31. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  32. package/dts/chart/bar/BarPlot.d.ts +2 -1
  33. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  34. package/dts/chart/bar/BarStack.d.ts +40 -48
  35. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  36. package/dts/chart/bar/BarStackGroup.d.ts +1 -0
  37. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  38. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  39. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  40. package/dts/chart/gradient/Gradient.d.ts +35 -0
  41. package/dts/chart/gradient/Gradient.d.ts.map +1 -0
  42. package/dts/chart/gradient/index.d.ts +2 -0
  43. package/dts/chart/gradient/index.d.ts.map +1 -0
  44. package/dts/chart/index.d.ts +2 -1
  45. package/dts/chart/index.d.ts.map +1 -1
  46. package/dts/chart/line/DefaultReferenceLineLabel.d.ts +9 -0
  47. package/dts/chart/line/DefaultReferenceLineLabel.d.ts.map +1 -0
  48. package/dts/chart/line/DottedLine.d.ts +15 -3
  49. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  50. package/dts/chart/line/Line.d.ts +70 -28
  51. package/dts/chart/line/Line.d.ts.map +1 -1
  52. package/dts/chart/line/LineChart.d.ts +26 -8
  53. package/dts/chart/line/LineChart.d.ts.map +1 -1
  54. package/dts/chart/line/ReferenceLine.d.ts +85 -44
  55. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  56. package/dts/chart/line/SolidLine.d.ts +14 -3
  57. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  58. package/dts/chart/line/index.d.ts +1 -1
  59. package/dts/chart/line/index.d.ts.map +1 -1
  60. package/dts/chart/point/DefaultPointLabel.d.ts +10 -0
  61. package/dts/chart/point/DefaultPointLabel.d.ts.map +1 -0
  62. package/dts/chart/point/Point.d.ts +201 -0
  63. package/dts/chart/point/Point.d.ts.map +1 -0
  64. package/dts/chart/point/index.d.ts +3 -0
  65. package/dts/chart/point/index.d.ts.map +1 -0
  66. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +24 -0
  67. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -0
  68. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts +12 -0
  69. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts.map +1 -0
  70. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +10 -0
  71. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -0
  72. package/dts/chart/scrubber/Scrubber.d.ts +203 -64
  73. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  74. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +70 -0
  75. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -0
  76. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +32 -0
  77. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -0
  78. package/dts/chart/scrubber/index.d.ts +3 -0
  79. package/dts/chart/scrubber/index.d.ts.map +1 -1
  80. package/dts/chart/text/ChartText.d.ts +46 -43
  81. package/dts/chart/text/ChartText.d.ts.map +1 -1
  82. package/dts/chart/text/{SmartChartTextGroup.d.ts → ChartTextGroup.d.ts} +9 -3
  83. package/dts/chart/text/ChartTextGroup.d.ts.map +1 -0
  84. package/dts/chart/text/index.d.ts +1 -1
  85. package/dts/chart/text/index.d.ts.map +1 -1
  86. package/dts/chart/utils/chart.d.ts +27 -7
  87. package/dts/chart/utils/chart.d.ts.map +1 -1
  88. package/dts/chart/utils/context.d.ts +6 -0
  89. package/dts/chart/utils/context.d.ts.map +1 -1
  90. package/dts/chart/utils/gradient.d.ts +104 -0
  91. package/dts/chart/utils/gradient.d.ts.map +1 -0
  92. package/dts/chart/utils/index.d.ts +4 -0
  93. package/dts/chart/utils/index.d.ts.map +1 -1
  94. package/dts/chart/utils/interpolate.d.ts +112 -0
  95. package/dts/chart/utils/interpolate.d.ts.map +1 -0
  96. package/dts/chart/utils/path.d.ts +24 -1
  97. package/dts/chart/utils/path.d.ts.map +1 -1
  98. package/dts/chart/utils/point.d.ts +29 -0
  99. package/dts/chart/utils/point.d.ts.map +1 -1
  100. package/dts/chart/utils/scrubber.d.ts +39 -0
  101. package/dts/chart/utils/scrubber.d.ts.map +1 -0
  102. package/dts/chart/utils/transition.d.ts +65 -0
  103. package/dts/chart/utils/transition.d.ts.map +1 -0
  104. package/esm/chart/CartesianChart.js +140 -85
  105. package/esm/chart/Path.js +51 -46
  106. package/esm/chart/PeriodSelector.js +4 -18
  107. package/esm/chart/area/Area.js +24 -34
  108. package/esm/chart/area/AreaChart.js +24 -15
  109. package/esm/chart/area/DottedArea.js +35 -89
  110. package/esm/chart/area/GradientArea.js +34 -80
  111. package/esm/chart/area/SolidArea.js +29 -11
  112. package/esm/chart/axis/Axis.js +4 -25
  113. package/esm/chart/axis/DefaultAxisTickLabel.js +15 -0
  114. package/esm/chart/axis/XAxis.js +53 -36
  115. package/esm/chart/axis/YAxis.js +55 -32
  116. package/esm/chart/axis/index.js +1 -0
  117. package/esm/chart/bar/Bar.js +3 -1
  118. package/esm/chart/bar/BarChart.js +15 -32
  119. package/esm/chart/bar/BarPlot.js +3 -2
  120. package/esm/chart/bar/BarStack.js +65 -23
  121. package/esm/chart/bar/BarStackGroup.js +7 -17
  122. package/esm/chart/bar/DefaultBar.js +4 -7
  123. package/esm/chart/bar/DefaultBarStack.js +5 -7
  124. package/esm/chart/gradient/Gradient.js +104 -0
  125. package/esm/chart/gradient/index.js +1 -0
  126. package/esm/chart/index.js +2 -1
  127. package/esm/chart/line/DefaultReferenceLineLabel.js +81 -0
  128. package/esm/chart/line/DottedLine.js +38 -17
  129. package/esm/chart/line/Line.js +96 -70
  130. package/esm/chart/line/LineChart.js +18 -6
  131. package/esm/chart/line/ReferenceLine.js +34 -41
  132. package/esm/chart/line/SolidLine.js +36 -15
  133. package/esm/chart/line/index.js +1 -1
  134. package/esm/chart/{line/GradientLine.js → point/DefaultPointLabel.js} +31 -45
  135. package/esm/chart/point/Point.css +2 -0
  136. package/esm/chart/{Point.js → point/Point.js} +66 -57
  137. package/esm/chart/point/index.js +2 -0
  138. package/esm/chart/scrubber/DefaultScrubberBeacon.js +155 -0
  139. package/esm/chart/scrubber/{ScrubberBeaconLabel.js → DefaultScrubberBeaconLabel.js} +23 -10
  140. package/esm/chart/scrubber/DefaultScrubberLabel.js +30 -0
  141. package/esm/chart/scrubber/Scrubber.js +98 -392
  142. package/esm/chart/scrubber/ScrubberBeaconGroup.js +166 -0
  143. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +186 -0
  144. package/esm/chart/scrubber/index.js +3 -1
  145. package/esm/chart/text/ChartText.js +13 -19
  146. package/esm/chart/text/{SmartChartTextGroup.js → ChartTextGroup.js} +4 -3
  147. package/esm/chart/text/index.js +1 -1
  148. package/esm/chart/utils/chart.js +29 -3
  149. package/esm/chart/utils/gradient.js +257 -0
  150. package/esm/chart/utils/index.js +4 -0
  151. package/esm/chart/utils/interpolate.js +644 -0
  152. package/esm/chart/utils/path.js +32 -9
  153. package/esm/chart/utils/point.js +69 -0
  154. package/esm/chart/utils/scrubber.js +132 -0
  155. package/esm/chart/utils/transition.js +111 -0
  156. package/package.json +9 -9
  157. package/dts/chart/Point.d.ts +0 -153
  158. package/dts/chart/Point.d.ts.map +0 -1
  159. package/dts/chart/line/GradientLine.d.ts +0 -42
  160. package/dts/chart/line/GradientLine.d.ts.map +0 -1
  161. package/dts/chart/scrubber/ScrubberBeacon.d.ts +0 -93
  162. package/dts/chart/scrubber/ScrubberBeacon.d.ts.map +0 -1
  163. package/dts/chart/scrubber/ScrubberBeaconLabel.d.ts +0 -7
  164. package/dts/chart/scrubber/ScrubberBeaconLabel.d.ts.map +0 -1
  165. package/dts/chart/text/SmartChartTextGroup.d.ts.map +0 -1
  166. package/esm/chart/Point.css +0 -2
  167. package/esm/chart/scrubber/ScrubberBeacon.js +0 -195
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolate.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/interpolate.ts"],"names":[],"mappings":"AAIA,KAAK,WAAW,GACZ,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,CAAC;AAER,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAoIF;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,YAAY,EAAE,WAAW,EACzB,UAAU,EAAE,WAAW,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,WAAW,EAAE,CAWf;AAkJD,KAAK,gBAAgB,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,KAAK,OAAO,CAAC;AAmHxF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,EAAE,CA+BlF;AAED,KAAK,kBAAkB,GAAG;IACxB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,EAChD,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,EAChD,kBAAkB,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,GACzD,CAAC,CAAC,EAAE,MAAM,KAAK,WAAW,EAAE,CAoG9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC5B,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC5B,kBAAkB,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,GACzD,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAgDvB"}
@@ -24,7 +24,7 @@ export declare const getPathCurveFunction: (
24
24
  * @example
25
25
  * ```typescript
26
26
  * const chartScale = getChartScale({ chartRect, domain, range, xScale, yScale });
27
- * const path = getLinePath({ data: [1, 2, 3], chartScale, curve: 'linear' });
27
+ * const path = getLinePath({ data: [1, 2, 3], chartScale, curve: 'bump' });
28
28
  * ```
29
29
  */
30
30
  export declare const getLinePath: ({
@@ -33,6 +33,7 @@ export declare const getLinePath: ({
33
33
  xScale,
34
34
  yScale,
35
35
  xData,
36
+ connectNulls,
36
37
  }: {
37
38
  data: (
38
39
  | number
@@ -46,6 +47,11 @@ export declare const getLinePath: ({
46
47
  xScale: ChartScaleFunction;
47
48
  yScale: ChartScaleFunction;
48
49
  xData?: number[];
50
+ /**
51
+ * When true, null values are skipped and the line connects across gaps.
52
+ * By default, null values create gaps in the line.
53
+ */
54
+ connectNulls?: boolean;
49
55
  }) => string;
50
56
  /**
51
57
  * Generates an SVG area path string from data using chart scale functions.
@@ -75,13 +81,30 @@ export declare const getAreaPath: ({
75
81
  xScale,
76
82
  yScale,
77
83
  xData,
84
+ connectNulls,
78
85
  }: {
79
86
  data: (number | null)[] | Array<[number, number] | null>;
80
87
  xScale: ChartScaleFunction;
81
88
  yScale: ChartScaleFunction;
82
89
  curve: ChartPathCurveType;
83
90
  xData?: number[];
91
+ /**
92
+ * When true, null values are skipped and the area connects across gaps.
93
+ * By default null values create gaps in the area.
94
+ */
95
+ connectNulls?: boolean;
84
96
  }) => string;
97
+ /**
98
+ * Converts line coordinates to an SVG path string.
99
+ * Useful for rendering axis lines and tick marks.
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const path = lineToPath(0, 0, 100, 100);
104
+ * // Returns: "M 0 0 L 100 100"
105
+ * ```
106
+ */
107
+ export declare const lineToPath: (x1: number, y1: number, x2: number, y2: number) => string;
85
108
  /**
86
109
  * Creates an SVG path string for a rectangle with selective corner rounding.
87
110
  * Useful for creating bars in charts with optional rounded corners.
@@ -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;AAEtE,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,yCAMzB;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;CAClB,KAAG,MAgBH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,WAAW,GAAI,yCAMzB;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;CAClB,KAAG,MAgFH,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"}
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;AAEtE,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;;;OAGG;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;;;OAGG;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"}
@@ -1,4 +1,13 @@
1
+ import type { TextHorizontalAlignment, TextVerticalAlignment } from '../text';
1
2
  import { type ChartScaleFunction } from './scale';
3
+ /**
4
+ * Position a label should be placed relative to the point
5
+ *
6
+ * @example
7
+ * 'top' would have the label be located above the point itself,
8
+ * and thus the vertical alignment of that text would be bottom.
9
+ */
10
+ export type PointLabelPosition = 'top' | 'bottom' | 'left' | 'right' | 'center';
2
11
  /**
3
12
  * Get a point from a data value and a scale.
4
13
  * @note for categorical scales, the point will be centered within the band.
@@ -72,4 +81,24 @@ export declare const projectPoints: ({
72
81
  x: number;
73
82
  y: number;
74
83
  } | null>;
84
+ /**
85
+ * Determines text alignment based on label position.
86
+ * For example, a 'top' position needs the text aligned to the 'bottom' so it appears above the point.
87
+ */
88
+ export declare const getAlignmentFromPosition: (position: PointLabelPosition) => {
89
+ horizontalAlignment: TextHorizontalAlignment;
90
+ verticalAlignment: TextVerticalAlignment;
91
+ };
92
+ /**
93
+ * Calculates the final label coordinates by applying offset based on position.
94
+ */
95
+ export declare const getLabelCoordinates: (
96
+ x: number,
97
+ y: number,
98
+ position: PointLabelPosition,
99
+ offset: number,
100
+ ) => {
101
+ x: number;
102
+ y: number;
103
+ };
75
104
  //# sourceMappingURL=point.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/point.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAkD,MAAM,SAAS,CAAC;AAElG;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,EAAE,OAAO,kBAAkB,KAAG,MAc9E,CAAC;AAEF;;;;;;;;;;;;;;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"}
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,EAAE,KAAK,kBAAkB,EAAkD,MAAM,SAAS,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,EAAE,OAAO,kBAAkB,KAAG,MAc9E,CAAC;AAEF;;;;;;;;;;;;;;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"}
@@ -0,0 +1,39 @@
1
+ import type { Rect } from '@coinbase/cds-common/types';
2
+ export type ScrubberLabelPosition = 'left' | 'right';
3
+ export type LabelPosition = {
4
+ seriesId: string;
5
+ x: number;
6
+ y: number;
7
+ };
8
+ export type LabelDimensions = {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ /**
13
+ * Determines which side (left/right) to place scrubber labels based on available space.
14
+ * Prefers right side, switches to left when labels would overflow.
15
+ */
16
+ export declare const getLabelPosition: (
17
+ beaconX: number,
18
+ maxLabelWidth: number,
19
+ drawingArea: Rect,
20
+ xOffset?: number,
21
+ ) => ScrubberLabelPosition;
22
+ type LabelDimension = {
23
+ seriesId: string;
24
+ width: number;
25
+ height: number;
26
+ preferredX: number;
27
+ preferredY: number;
28
+ };
29
+ /**
30
+ * Calculates Y positions for all labels avoiding overlaps while maintaining order.
31
+ */
32
+ export declare const calculateLabelYPositions: (
33
+ dimensions: LabelDimension[],
34
+ drawingArea: Rect,
35
+ labelHeight: number,
36
+ minGap: number,
37
+ ) => Map<string, number>;
38
+ export {};
39
+ //# sourceMappingURL=scrubber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrubber.d.ts","sourceRoot":"","sources":["../../../src/chart/utils/scrubber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,MAAM,EACf,eAAe,MAAM,EACrB,aAAa,IAAI,EACjB,UAAS,MAAW,KACnB,qBASF,CAAC;AAQF,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,cAAc,EAAE,EAC5B,aAAa,IAAI,EACjB,aAAa,MAAM,EACnB,QAAQ,MAAM,KACb,GAAG,CAAC,MAAM,EAAE,MAAM,CAoIpB,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { type MotionValue, type Transition } from 'framer-motion';
2
+ /**
3
+ * Default transition configuration used across all chart components.
4
+ */
5
+ export declare const defaultTransition: Transition;
6
+ /**
7
+ * Duration in seconds for accessory elements to fade in.
8
+ */
9
+ export declare const accessoryFadeTransitionDuration = 0.15;
10
+ /**
11
+ * Delay in seconds before accessory elements fade in.
12
+ */
13
+ export declare const accessoryFadeTransitionDelay = 0.35;
14
+ /**
15
+ * Hook for path animation state and transitions.
16
+ *
17
+ * @param currentPath - Current target path to animate to
18
+ * @param initialPath - Initial path for enter animation. When provided, the first animation will go from initialPath to currentPath.
19
+ * @param transition - Transition configuration
20
+ * @returns MotionValue containing the current interpolated path string
21
+ *
22
+ * @example
23
+ * // Simple path transition
24
+ * const animatedPath = usePathTransition({
25
+ * currentPath: d ?? '',
26
+ * transition: {
27
+ * type: 'spring',
28
+ * stiffness: 300,
29
+ * damping: 20
30
+ * }
31
+ * });
32
+ *
33
+ * @example
34
+ * // Time based animation
35
+ * const animatedPath = usePathTransition({
36
+ * currentPath: targetPath,
37
+ * initialPath: baselinePath,
38
+ * transition: {
39
+ * type: 'tween',
40
+ * duration: 0.3,
41
+ * ease: 'easeInOut'
42
+ * }
43
+ * });
44
+ */
45
+ export declare const usePathTransition: ({
46
+ currentPath,
47
+ initialPath,
48
+ transition,
49
+ }: {
50
+ /**
51
+ * Current target path to animate to.
52
+ */
53
+ currentPath: string;
54
+ /**
55
+ * Initial path for enter animation.
56
+ * When provided, the first animation will go from initialPath to currentPath.
57
+ * If not provided, defaults to currentPath (no enter animation).
58
+ */
59
+ initialPath?: string;
60
+ /**
61
+ * Transition configuration
62
+ */
63
+ transition?: Transition;
64
+ }) => MotionValue<string>;
65
+ //# sourceMappingURL=transition.d.ts.map
@@ -0,0 +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,4 +1,4 @@
1
- const _excluded = ["series", "children", "animate", "xAxis", "yAxis", "inset", "enableScrubbing", "onScrubberPositionChange", "width", "height", "className", "style"];
1
+ const _excluded = ["series", "children", "animate", "xAxis", "yAxis", "inset", "enableScrubbing", "onScrubberPositionChange", "width", "height", "className", "classNames", "style", "styles"];
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; }
@@ -20,15 +20,17 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
20
20
  series,
21
21
  children,
22
22
  animate = true,
23
- xAxis: xAxisConfigInput,
24
- yAxis: yAxisConfigInput,
25
- inset: insetInput,
23
+ xAxis: xAxisConfigProp,
24
+ yAxis: yAxisConfigProp,
25
+ inset,
26
26
  enableScrubbing,
27
27
  onScrubberPositionChange,
28
28
  width = '100%',
29
29
  height = '100%',
30
30
  className,
31
- style
31
+ classNames,
32
+ style,
33
+ styles
32
34
  } = _ref,
33
35
  props = _objectWithoutProperties(_ref, _excluded);
34
36
  const {
@@ -36,15 +38,13 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
36
38
  width: chartWidth,
37
39
  height: chartHeight
38
40
  } = useDimensions();
39
- const internalSvgRef = useRef(null);
40
- const userInset = useMemo(() => {
41
- return getChartInset(insetInput, defaultChartInset);
42
- }, [insetInput]);
41
+ const svgRef = useRef(null);
42
+ const calculatedInset = useMemo(() => getChartInset(inset, defaultChartInset), [inset]);
43
43
 
44
44
  // Axis configs store the properties of each axis, such as id, scale type, domain limit, etc.
45
45
  // We only support 1 x axis but allow for multiple y axes.
46
- const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigInput)[0], [xAxisConfigInput]);
47
- const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigInput), [yAxisConfigInput]);
46
+ const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp)[0], [xAxisConfigProp]);
47
+ const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigProp), [yAxisConfigProp]);
48
48
  const {
49
49
  renderedAxes,
50
50
  registerAxis,
@@ -59,10 +59,10 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
59
59
  height: 0
60
60
  };
61
61
  const totalInset = {
62
- top: userInset.top + axisPadding.top,
63
- right: userInset.right + axisPadding.right,
64
- bottom: userInset.bottom + axisPadding.bottom,
65
- left: userInset.left + axisPadding.left
62
+ top: calculatedInset.top + axisPadding.top,
63
+ right: calculatedInset.right + axisPadding.right,
64
+ bottom: calculatedInset.bottom + axisPadding.bottom,
65
+ left: calculatedInset.left + axisPadding.left
66
66
  };
67
67
  const availableWidth = chartWidth - totalInset.left - totalInset.right;
68
68
  const availableHeight = chartHeight - totalInset.top - totalInset.bottom;
@@ -72,11 +72,15 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
72
72
  width: availableWidth > 0 ? availableWidth : 0,
73
73
  height: availableHeight > 0 ? availableHeight : 0
74
74
  };
75
- }, [chartHeight, chartWidth, userInset, axisPadding]);
76
-
77
- // Axes contain the config along with domain and range, which get calculated here.
78
- const xAxis = useMemo(() => {
79
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return undefined;
75
+ }, [chartHeight, chartWidth, calculatedInset, axisPadding]);
76
+ const {
77
+ xAxis,
78
+ xScale
79
+ } = useMemo(() => {
80
+ if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
81
+ xAxis: undefined,
82
+ xScale: undefined
83
+ };
80
84
  const domain = getAxisDomain(xAxisConfig, series !== null && series !== void 0 ? series : [], 'x');
81
85
  const range = getAxisRange(xAxisConfig, chartRect, 'x');
82
86
  const axisConfig = {
@@ -87,11 +91,43 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
87
91
  categoryPadding: xAxisConfig.categoryPadding,
88
92
  domainLimit: xAxisConfig.domainLimit
89
93
  };
90
- return axisConfig;
94
+
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
+ };
106
+
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
115
+ });
116
+ return {
117
+ xAxis: finalAxisConfig,
118
+ xScale: scale
119
+ };
91
120
  }, [xAxisConfig, series, chartRect]);
92
- const yAxes = useMemo(() => {
121
+ const {
122
+ yAxes,
123
+ yScales
124
+ } = useMemo(() => {
93
125
  const axes = new Map();
94
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return axes;
126
+ const scales = new Map();
127
+ if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
128
+ yAxes: axes,
129
+ yScales: scales
130
+ };
95
131
  yAxisConfig.forEach(axisParam => {
96
132
  var _axisParam$id, _series$filter, _axisParam$domainLimi;
97
133
  const axisId = (_axisParam$id = axisParam.id) !== null && _axisParam$id !== void 0 ? _axisParam$id : defaultAxisId;
@@ -102,36 +138,19 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
102
138
  return ((_s$yAxisId = s.yAxisId) !== null && _s$yAxisId !== void 0 ? _s$yAxisId : defaultAxisId) === axisId;
103
139
  })) !== null && _series$filter !== void 0 ? _series$filter : [];
104
140
 
105
- // Calculate domain and range in one pass
106
- const domain = getAxisDomain(axisParam, relevantSeries, 'y');
141
+ // Calculate domain and range
142
+ const dataDomain = getAxisDomain(axisParam, relevantSeries, 'y');
107
143
  const range = getAxisRange(axisParam, chartRect, 'y');
108
- axes.set(axisId, {
144
+ const axisConfig = {
109
145
  scaleType: axisParam.scaleType,
110
- domain,
146
+ domain: dataDomain,
111
147
  range,
112
148
  data: axisParam.data,
113
149
  categoryPadding: axisParam.categoryPadding,
114
150
  domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) !== null && _axisParam$domainLimi !== void 0 ? _axisParam$domainLimi : 'nice'
115
- });
116
- });
117
- return axes;
118
- }, [yAxisConfig, series, chartRect]);
151
+ };
119
152
 
120
- // Scales are the functions that convert data values to visual positions.
121
- // They are calculated here based on the above axes.
122
- const xScale = useMemo(() => {
123
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0 || xAxis === undefined) return undefined;
124
- return getAxisScale({
125
- config: xAxis,
126
- type: 'x',
127
- range: xAxis.range,
128
- dataDomain: xAxis.domain
129
- });
130
- }, [chartRect, xAxis]);
131
- const yScales = useMemo(() => {
132
- const scales = new Map();
133
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return scales;
134
- yAxes.forEach((axisConfig, axisId) => {
153
+ // Create the scale
135
154
  const scale = getAxisScale({
136
155
  config: axisConfig,
137
156
  type: 'y',
@@ -140,10 +159,23 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
140
159
  });
141
160
  if (scale) {
142
161
  scales.set(axisId, scale);
162
+
163
+ // Update axis config with actual scale domain (after .nice() or other adjustments)
164
+ const scaleDomain = scale.domain();
165
+ const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
166
+ min: scaleDomain[0],
167
+ max: scaleDomain[1]
168
+ } : axisConfig.domain;
169
+ axes.set(axisId, _objectSpread(_objectSpread({}, axisConfig), {}, {
170
+ domain: actualDomain
171
+ }));
143
172
  }
144
173
  });
145
- return scales;
146
- }, [chartRect, yAxes]);
174
+ return {
175
+ yAxes: axes,
176
+ yScales: scales
177
+ };
178
+ }, [yAxisConfig, series, chartRect]);
147
179
  const getXAxis = useCallback(() => xAxis, [xAxis]);
148
180
  const getYAxis = useCallback(id => yAxes.get(id !== null && id !== void 0 ? id : defaultAxisId), [yAxes]);
149
181
  const getXScale = useCallback(() => xScale, [xScale]);
@@ -157,6 +189,20 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
157
189
  if (!seriesId) return undefined;
158
190
  return stackedDataMap.get(seriesId);
159
191
  }, [stackedDataMap]);
192
+ 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;
196
+ }
197
+
198
+ // Otherwise, find the longest series
199
+ if (!series || series.length === 0) return 0;
200
+ return series.reduce((max, s) => {
201
+ var _seriesData$length;
202
+ const seriesData = getStackedSeriesData(s.id);
203
+ return Math.max(max, (_seriesData$length = seriesData === null || seriesData === void 0 ? void 0 : seriesData.length) !== null && _seriesData$length !== void 0 ? _seriesData$length : 0);
204
+ }, 0);
205
+ }, [xAxisConfig.data, series, getStackedSeriesData]);
160
206
  const getAxisBounds = useCallback(axisId => {
161
207
  const axis = renderedAxes.get(axisId);
162
208
  if (!axis || !chartRect) return;
@@ -168,7 +214,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
168
214
  const offsetFromPreviousAxes = axesAtPosition.slice(0, axisIndex).reduce((sum, a) => sum + a.size, 0);
169
215
  if (axis.position === 'top') {
170
216
  // Position above the chart rect, accounting for user inset
171
- const startY = userInset.top + offsetFromPreviousAxes;
217
+ const startY = calculatedInset.top + offsetFromPreviousAxes;
172
218
  return {
173
219
  x: chartRect.x,
174
220
  y: startY,
@@ -186,7 +232,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
186
232
  };
187
233
  } else if (axis.position === 'left') {
188
234
  // Position to the left of the chart rect, accounting for user inset
189
- const startX = userInset.left + offsetFromPreviousAxes;
235
+ const startX = calculatedInset.left + offsetFromPreviousAxes;
190
236
  return {
191
237
  x: startX,
192
238
  y: chartRect.y,
@@ -203,7 +249,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
203
249
  height: chartRect.height
204
250
  };
205
251
  }
206
- }, [renderedAxes, chartRect, userInset]);
252
+ }, [renderedAxes, chartRect, calculatedInset]);
207
253
  const contextValue = useMemo(() => ({
208
254
  series: series !== null && series !== void 0 ? series : [],
209
255
  getSeries,
@@ -216,43 +262,52 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
216
262
  getXScale,
217
263
  getYScale,
218
264
  drawingArea: chartRect,
265
+ dataLength,
219
266
  registerAxis,
220
267
  unregisterAxis,
221
268
  getAxisBounds
222
- }), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, getXAxis, getYAxis, getXScale, getYScale, chartRect, registerAxis, unregisterAxis, getAxisBounds]);
223
- return /*#__PURE__*/_jsx(Box, _objectSpread(_objectSpread({
224
- ref: node => {
225
- // Handle the observe ref, internal ref, and forwarded ref
226
- observe(node);
227
- if (internalSvgRef.current !== node) {
228
- internalSvgRef.current = node;
229
- }
230
- if (ref) {
231
- if (typeof ref === 'function') {
232
- ref(node);
233
- } else {
234
- ref.current = node;
235
- }
236
- }
237
- },
238
- "aria-live": "polite",
239
- as: "svg",
240
- className: cx(enableScrubbing && focusStylesCss, className),
241
- height: height,
242
- role: "figure",
243
- style: style,
244
- tabIndex: enableScrubbing ? 0 : undefined,
245
- width: width
246
- }, props), {}, {
247
- children: /*#__PURE__*/_jsx(CartesianChartProvider, {
248
- value: contextValue,
249
- children: /*#__PURE__*/_jsx(ScrubberProvider, {
250
- enableScrubbing: !!enableScrubbing,
251
- onScrubberPositionChange: onScrubberPositionChange,
252
- svgRef: internalSvgRef,
253
- children: children
254
- })
269
+ }), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, getXAxis, getYAxis, getXScale, getYScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
270
+ const rootClassNames = useMemo(() => cx(className, classNames === null || classNames === void 0 ? void 0 : classNames.root), [className, classNames]);
271
+ 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]);
272
+ return /*#__PURE__*/_jsx(CartesianChartProvider, {
273
+ value: contextValue,
274
+ children: /*#__PURE__*/_jsx(ScrubberProvider, {
275
+ enableScrubbing: !!enableScrubbing,
276
+ onScrubberPositionChange: onScrubberPositionChange,
277
+ 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
+ })
309
+ }))
255
310
  })
256
- }));
311
+ });
257
312
  }));
258
313
  import "./CartesianChart.css";