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

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 (187) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dts/chart/CartesianChart.d.ts +57 -33
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/ChartContextBridge.d.ts +28 -0
  5. package/dts/chart/ChartContextBridge.d.ts.map +1 -0
  6. package/dts/chart/Path.d.ts +77 -34
  7. package/dts/chart/Path.d.ts.map +1 -1
  8. package/dts/chart/PeriodSelector.d.ts +2 -2
  9. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  10. package/dts/chart/area/Area.d.ts +42 -27
  11. package/dts/chart/area/Area.d.ts.map +1 -1
  12. package/dts/chart/area/AreaChart.d.ts +51 -10
  13. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  14. package/dts/chart/area/DottedArea.d.ts +21 -2
  15. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  16. package/dts/chart/area/GradientArea.d.ts +19 -13
  17. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  18. package/dts/chart/area/SolidArea.d.ts +17 -2
  19. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  20. package/dts/chart/axis/Axis.d.ts +86 -118
  21. package/dts/chart/axis/Axis.d.ts.map +1 -1
  22. package/dts/chart/axis/DefaultAxisTickLabel.d.ts +8 -0
  23. package/dts/chart/axis/DefaultAxisTickLabel.d.ts.map +1 -0
  24. package/dts/chart/axis/XAxis.d.ts +1 -1
  25. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  26. package/dts/chart/axis/YAxis.d.ts +2 -2
  27. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  28. package/dts/chart/axis/index.d.ts +1 -0
  29. package/dts/chart/axis/index.d.ts.map +1 -1
  30. package/dts/chart/bar/Bar.d.ts +16 -13
  31. package/dts/chart/bar/Bar.d.ts.map +1 -1
  32. package/dts/chart/bar/BarChart.d.ts +36 -20
  33. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  34. package/dts/chart/bar/BarPlot.d.ts +2 -1
  35. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  36. package/dts/chart/bar/BarStack.d.ts +39 -48
  37. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  38. package/dts/chart/bar/BarStackGroup.d.ts +1 -0
  39. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  40. package/dts/chart/bar/DefaultBar.d.ts +1 -1
  41. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  42. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  43. package/dts/chart/gradient/Gradient.d.ts +25 -0
  44. package/dts/chart/gradient/Gradient.d.ts.map +1 -0
  45. package/dts/chart/gradient/index.d.ts +2 -0
  46. package/dts/chart/gradient/index.d.ts.map +1 -0
  47. package/dts/chart/index.d.ts +3 -1
  48. package/dts/chart/index.d.ts.map +1 -1
  49. package/dts/chart/line/DefaultReferenceLineLabel.d.ts +9 -0
  50. package/dts/chart/line/DefaultReferenceLineLabel.d.ts.map +1 -0
  51. package/dts/chart/line/DottedLine.d.ts +13 -5
  52. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  53. package/dts/chart/line/Line.d.ts +64 -25
  54. package/dts/chart/line/Line.d.ts.map +1 -1
  55. package/dts/chart/line/LineChart.d.ts +43 -9
  56. package/dts/chart/line/LineChart.d.ts.map +1 -1
  57. package/dts/chart/line/ReferenceLine.d.ts +68 -20
  58. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  59. package/dts/chart/line/SolidLine.d.ts +8 -5
  60. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  61. package/dts/chart/line/index.d.ts +1 -1
  62. package/dts/chart/line/index.d.ts.map +1 -1
  63. package/dts/chart/point/DefaultPointLabel.d.ts +10 -0
  64. package/dts/chart/point/DefaultPointLabel.d.ts.map +1 -0
  65. package/dts/chart/point/Point.d.ts +120 -0
  66. package/dts/chart/point/Point.d.ts.map +1 -0
  67. package/dts/chart/point/index.d.ts +3 -0
  68. package/dts/chart/point/index.d.ts.map +1 -0
  69. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +8 -0
  70. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -0
  71. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts +12 -0
  72. package/dts/chart/scrubber/DefaultScrubberBeaconLabel.d.ts.map +1 -0
  73. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +11 -0
  74. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -0
  75. package/dts/chart/scrubber/Scrubber.d.ts +172 -43
  76. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  77. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +44 -0
  78. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -0
  79. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +31 -0
  80. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -0
  81. package/dts/chart/scrubber/ScrubberProvider.d.ts +6 -3
  82. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  83. package/dts/chart/scrubber/index.d.ts +3 -0
  84. package/dts/chart/scrubber/index.d.ts.map +1 -1
  85. package/dts/chart/text/ChartText.d.ts +151 -77
  86. package/dts/chart/text/ChartText.d.ts.map +1 -1
  87. package/dts/chart/text/{SmartChartTextGroup.d.ts → ChartTextGroup.d.ts} +9 -3
  88. package/dts/chart/text/ChartTextGroup.d.ts.map +1 -0
  89. package/dts/chart/text/index.d.ts +1 -1
  90. package/dts/chart/text/index.d.ts.map +1 -1
  91. package/dts/chart/utils/axis.d.ts +25 -1
  92. package/dts/chart/utils/axis.d.ts.map +1 -1
  93. package/dts/chart/utils/chart.d.ts +34 -7
  94. package/dts/chart/utils/chart.d.ts.map +1 -1
  95. package/dts/chart/utils/context.d.ts +28 -7
  96. package/dts/chart/utils/context.d.ts.map +1 -1
  97. package/dts/chart/utils/gradient.d.ts +117 -0
  98. package/dts/chart/utils/gradient.d.ts.map +1 -0
  99. package/dts/chart/utils/index.d.ts +3 -0
  100. package/dts/chart/utils/index.d.ts.map +1 -1
  101. package/dts/chart/utils/path.d.ts +53 -0
  102. package/dts/chart/utils/path.d.ts.map +1 -1
  103. package/dts/chart/utils/point.d.ts +71 -7
  104. package/dts/chart/utils/point.d.ts.map +1 -1
  105. package/dts/chart/utils/scale.d.ts +102 -0
  106. package/dts/chart/utils/scale.d.ts.map +1 -1
  107. package/dts/chart/utils/scrubber.d.ts +39 -0
  108. package/dts/chart/utils/scrubber.d.ts.map +1 -0
  109. package/dts/chart/utils/transition.d.ts +140 -0
  110. package/dts/chart/utils/transition.d.ts.map +1 -0
  111. package/esm/chart/CartesianChart.js +164 -70
  112. package/esm/chart/ChartContextBridge.js +148 -0
  113. package/esm/chart/Path.js +198 -113
  114. package/esm/chart/PeriodSelector.js +2 -2
  115. package/esm/chart/__stories__/CartesianChart.stories.js +378 -131
  116. package/esm/chart/__stories__/Chart.stories.js +2 -4
  117. package/esm/chart/__stories__/PeriodSelector.stories.js +103 -75
  118. package/esm/chart/area/Area.js +25 -35
  119. package/esm/chart/area/AreaChart.js +17 -12
  120. package/esm/chart/area/DottedArea.js +61 -109
  121. package/esm/chart/area/GradientArea.js +35 -91
  122. package/esm/chart/area/SolidArea.js +22 -8
  123. package/esm/chart/area/__stories__/AreaChart.stories.js +1 -1
  124. package/esm/chart/axis/Axis.js +5 -39
  125. package/esm/chart/axis/DefaultAxisTickLabel.js +11 -0
  126. package/esm/chart/axis/XAxis.js +148 -66
  127. package/esm/chart/axis/YAxis.js +149 -65
  128. package/esm/chart/axis/__stories__/Axis.stories.js +259 -1
  129. package/esm/chart/axis/index.js +1 -0
  130. package/esm/chart/bar/Bar.js +3 -1
  131. package/esm/chart/bar/BarChart.js +15 -37
  132. package/esm/chart/bar/BarPlot.js +41 -35
  133. package/esm/chart/bar/BarStack.js +75 -38
  134. package/esm/chart/bar/BarStackGroup.js +6 -16
  135. package/esm/chart/bar/DefaultBar.js +26 -48
  136. package/esm/chart/bar/DefaultBarStack.js +23 -58
  137. package/esm/chart/bar/__stories__/BarChart.stories.js +502 -77
  138. package/esm/chart/gradient/Gradient.js +53 -0
  139. package/esm/chart/gradient/index.js +1 -0
  140. package/esm/chart/index.js +3 -1
  141. package/esm/chart/line/DefaultReferenceLineLabel.js +66 -0
  142. package/esm/chart/line/DottedLine.js +29 -14
  143. package/esm/chart/line/Line.js +106 -67
  144. package/esm/chart/line/LineChart.js +20 -14
  145. package/esm/chart/line/ReferenceLine.js +80 -63
  146. package/esm/chart/line/SolidLine.js +25 -10
  147. package/esm/chart/line/__stories__/LineChart.stories.js +2101 -1977
  148. package/esm/chart/line/__stories__/ReferenceLine.stories.js +83 -28
  149. package/esm/chart/line/index.js +1 -1
  150. package/esm/chart/point/DefaultPointLabel.js +39 -0
  151. package/esm/chart/point/Point.js +188 -0
  152. package/esm/chart/point/index.js +2 -0
  153. package/esm/chart/scrubber/DefaultScrubberBeacon.js +179 -0
  154. package/esm/chart/scrubber/DefaultScrubberBeaconLabel.js +43 -0
  155. package/esm/chart/scrubber/DefaultScrubberLabel.js +28 -0
  156. package/esm/chart/scrubber/Scrubber.js +126 -146
  157. package/esm/chart/scrubber/ScrubberBeaconGroup.js +161 -0
  158. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +185 -0
  159. package/esm/chart/scrubber/ScrubberProvider.js +46 -54
  160. package/esm/chart/scrubber/index.js +3 -1
  161. package/esm/chart/text/ChartText.js +242 -174
  162. package/esm/chart/text/{SmartChartTextGroup.js → ChartTextGroup.js} +6 -5
  163. package/esm/chart/text/index.js +1 -1
  164. package/esm/chart/utils/axis.js +45 -29
  165. package/esm/chart/utils/chart.js +44 -3
  166. package/esm/chart/utils/gradient.js +305 -0
  167. package/esm/chart/utils/index.js +3 -0
  168. package/esm/chart/utils/path.js +76 -8
  169. package/esm/chart/utils/point.js +171 -17
  170. package/esm/chart/utils/scale.js +242 -2
  171. package/esm/chart/utils/scrubber.js +139 -0
  172. package/esm/chart/utils/transition.js +185 -0
  173. package/esm/sparkline/__stories__/Sparkline.stories.js +11 -7
  174. package/esm/sparkline/__stories__/SparklineGradient.stories.js +7 -4
  175. package/esm/sparkline/sparkline-interactive/__stories__/SparklineInteractive.stories.js +51 -26
  176. package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +17 -9
  177. package/package.json +15 -9
  178. package/dts/chart/Point.d.ts +0 -103
  179. package/dts/chart/Point.d.ts.map +0 -1
  180. package/dts/chart/line/GradientLine.d.ts +0 -45
  181. package/dts/chart/line/GradientLine.d.ts.map +0 -1
  182. package/dts/chart/scrubber/ScrubberBeacon.d.ts +0 -75
  183. package/dts/chart/scrubber/ScrubberBeacon.d.ts.map +0 -1
  184. package/dts/chart/text/SmartChartTextGroup.d.ts.map +0 -1
  185. package/esm/chart/Point.js +0 -111
  186. package/esm/chart/line/GradientLine.js +0 -62
  187. package/esm/chart/scrubber/ScrubberBeacon.js +0 -199
@@ -0,0 +1,140 @@
1
+ import {
2
+ type ExtrapolationType,
3
+ type SharedValue,
4
+ type WithSpringConfig,
5
+ type WithTimingConfig,
6
+ } from 'react-native-reanimated';
7
+ import { type SkPath } from '@shopify/react-native-skia';
8
+ /**
9
+ * Transition for animations.
10
+ * Supports timing and spring animation types.
11
+ * Used for paths, positions, opacity, and any other animated properties.
12
+ *
13
+ * @example
14
+ * // Spring animation
15
+ * { type: 'spring', damping: 10, stiffness: 100 }
16
+ *
17
+ * @example
18
+ * // Timing animation
19
+ * { type: 'timing', duration: 500, easing: Easing.inOut(Easing.ease) }
20
+ */
21
+ export type Transition =
22
+ | ({
23
+ type: 'timing';
24
+ } & WithTimingConfig)
25
+ | ({
26
+ type: 'spring';
27
+ } & WithSpringConfig);
28
+ /**
29
+ * Default transition configuration used across all chart components.
30
+ */
31
+ export declare const defaultTransition: Transition;
32
+ /**
33
+ * Duration in milliseconds for accessory elements to fade in.
34
+ */
35
+ export declare const accessoryFadeTransitionDuration = 150;
36
+ /**
37
+ * Delay in milliseconds before accessory elements fade in.
38
+ */
39
+ export declare const accessoryFadeTransitionDelay = 350;
40
+ /**
41
+ * Custom hook that uses d3-interpolate-path for more robust path interpolation.
42
+ * then use Skia's native interpolation in the worklet.
43
+ *
44
+ * @param progress - Shared value between 0 and 1
45
+ * @param fromPath - Starting path as SVG string
46
+ * @param toPath - Ending path as SVG string
47
+ * @returns Interpolated SkPath as a shared value
48
+ */
49
+ export declare const useD3PathInterpolation: (
50
+ progress: SharedValue<number>,
51
+ fromPath: string,
52
+ toPath: string,
53
+ ) => SharedValue<SkPath>;
54
+ /**
55
+ * @worklet
56
+ */
57
+ type Interpolator<T> = (
58
+ value: number,
59
+ input: number[],
60
+ output: T[],
61
+ options: ExtrapolationType,
62
+ result: T,
63
+ ) => T;
64
+ export declare const useInterpolator: <T>(
65
+ factory: () => T,
66
+ value: SharedValue<number>,
67
+ interpolator: Interpolator<T>,
68
+ input: number[],
69
+ output: T[],
70
+ options?: ExtrapolationType,
71
+ ) => SharedValue<T>;
72
+ /**
73
+ * Builds a react-native-reanimated animation based on the configuration.
74
+ *
75
+ * @param targetValue - The target value to animate to
76
+ * @param config - The transition configuration
77
+ * @returns The animation value to assign to a shared value
78
+ *
79
+ * @example
80
+ * // Use directly for animation
81
+ * progress.value = 0;
82
+ * progress.value = buildTransition(1, { type: 'spring', damping: 10, stiffness: 100 });
83
+ *
84
+ * @example
85
+ * // Coordinate animations
86
+ * animatedX.value = buildTransition(100, { type: 'spring', damping: 10, stiffness: 100 });
87
+ * animatedY.value = buildTransition(200, { type: 'spring', damping: 10, stiffness: 100 });
88
+ *
89
+ * @example
90
+ * // Timing animation
91
+ * progress.value = buildTransition(1, { type: 'timing', duration: 500 });
92
+ */
93
+ export declare const buildTransition: (targetValue: number, transition: Transition) => number;
94
+ /**
95
+ * Hook for path animation state and transitions.
96
+ *
97
+ * @param currentPath - Current target path to animate to
98
+ * @param initialPath - Initial path for enter animation. When provided, the first animation will go from initialPath to currentPath.
99
+ * @param transition - Transition configuration
100
+ * @returns Animated SkPath as a shared value
101
+ *
102
+ * @example
103
+ * // Simple path transition
104
+ * const path = usePathTransition({
105
+ * currentPath: d ?? '',
106
+ * animate: shouldAnimate,
107
+ * transition: { type: 'timing', duration: 3000 }
108
+ * });
109
+ *
110
+ * @example
111
+ * // Enter animation with different initial config (like DefaultBar)
112
+ * const path = usePathTransition({
113
+ * currentPath: targetPath,
114
+ * initialPath: baselinePath,
115
+ * animate: true,
116
+ * transition: { type: 'timing', duration: 300 }
117
+ * });
118
+ */
119
+ export declare const usePathTransition: ({
120
+ currentPath,
121
+ initialPath,
122
+ transition,
123
+ }: {
124
+ /**
125
+ * Current target path to animate to.
126
+ */
127
+ currentPath: string;
128
+ /**
129
+ * Initial path for enter animation.
130
+ * When provided, the first animation will go from initialPath to currentPath.
131
+ * If not provided, defaults to currentPath (no enter animation).
132
+ */
133
+ initialPath?: string;
134
+ /**
135
+ * Transition configuration
136
+ */
137
+ transition?: Transition;
138
+ }) => SharedValue<SkPath>;
139
+ export {};
140
+ //# sourceMappingURL=transition.d.ts.map
@@ -0,0 +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,EAIhB,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAG7E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACvC,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAI/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,GACjC,UAAU,WAAW,CAAC,MAAM,CAAC,EAC7B,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,WAAW,CAAC,MAAM,CA2BpB,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,MAc7E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;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,CAwBrB,CAAC"}
@@ -1,40 +1,63 @@
1
- const _excluded = ["series", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "children", "width", "height", "style", "allowOverflowGestures"];
1
+ const _excluded = ["series", "children", "animate", "enableScrubbing", "xAxis", "yAxis", "inset", "onScrubberPositionChange", "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';
5
- import { Svg } from 'react-native-svg';
6
5
  import { useLayout } from '@coinbase/cds-mobile/hooks/useLayout';
7
6
  import { Box } from '@coinbase/cds-mobile/layout';
7
+ import { Canvas, Skia } from '@shopify/react-native-skia';
8
8
  import { ScrubberProvider } from './scrubber/ScrubberProvider';
9
+ import { convertToSerializableScale } from './utils/scale';
10
+ import { useChartContextBridge } from './ChartContextBridge';
9
11
  import { CartesianChartProvider } from './ChartProvider';
10
12
  import { defaultAxisId, defaultChartInset, getAxisConfig, getAxisDomain, getAxisRange, getAxisScale, getChartInset, getStackedSeriesData as calculateStackedSeriesData, useTotalAxisPadding } from './utils';
11
13
  import { jsx as _jsx } from "react/jsx-runtime";
12
- export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, ref) => {
14
+ const ChartCanvas = /*#__PURE__*/memo(_ref => {
15
+ let {
16
+ children,
17
+ style
18
+ } = _ref;
19
+ const ContextBridge = useChartContextBridge();
20
+ return /*#__PURE__*/_jsx(Canvas, {
21
+ style: [{
22
+ width: '100%',
23
+ height: '100%'
24
+ }, style],
25
+ children: /*#__PURE__*/_jsx(ContextBridge, {
26
+ children: children
27
+ })
28
+ });
29
+ });
30
+ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref2, ref) => {
13
31
  let {
14
32
  series,
33
+ children,
15
34
  animate = true,
16
35
  enableScrubbing,
17
- xAxis: xAxisConfigInput,
18
- yAxis: yAxisConfigInput,
19
- inset: insetInput,
36
+ xAxis: xAxisConfigProp,
37
+ yAxis: yAxisConfigProp,
38
+ inset,
20
39
  onScrubberPositionChange,
21
- children,
22
40
  width = '100%',
23
41
  height = '100%',
24
42
  style,
25
- allowOverflowGestures
26
- } = _ref,
27
- props = _objectWithoutPropertiesLoose(_ref, _excluded);
43
+ styles,
44
+ allowOverflowGestures,
45
+ fontFamilies,
46
+ fontProvider: fontProviderProp,
47
+ // React Native will collapse views by default when only used
48
+ // to group children, which interferes with gesture-handler
49
+ // https://docs.swmansion.com/react-native-gesture-handler/docs/gestures/gesture-detector/#:~:text=%7B%0A%20%20return%20%3C-,View,-collapsable%3D%7B
50
+ collapsable = false
51
+ } = _ref2,
52
+ props = _objectWithoutPropertiesLoose(_ref2, _excluded);
28
53
  const [containerLayout, onContainerLayout] = useLayout();
29
- const chartWidth = typeof width === 'number' ? width : containerLayout.width;
30
- const chartHeight = typeof height === 'number' ? height : containerLayout.height;
31
- const userInset = useMemo(() => {
32
- return getChartInset(insetInput, defaultChartInset);
33
- }, [insetInput]);
54
+ const chartWidth = containerLayout.width;
55
+ const chartHeight = containerLayout.height;
56
+ const calculatedInset = useMemo(() => getChartInset(inset, defaultChartInset), [inset]);
34
57
 
35
58
  // there can only be one x axis but the helper function always returns an array
36
- const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigInput)[0], [xAxisConfigInput]);
37
- const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigInput), [yAxisConfigInput]);
59
+ const xAxisConfig = useMemo(() => getAxisConfig('x', xAxisConfigProp)[0], [xAxisConfigProp]);
60
+ const yAxisConfig = useMemo(() => getAxisConfig('y', yAxisConfigProp), [yAxisConfigProp]);
38
61
  const {
39
62
  renderedAxes,
40
63
  registerAxis,
@@ -42,11 +65,11 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
42
65
  axisPadding
43
66
  } = useTotalAxisPadding();
44
67
  const totalInset = useMemo(() => ({
45
- top: userInset.top + axisPadding.top,
46
- right: userInset.right + axisPadding.right,
47
- bottom: userInset.bottom + axisPadding.bottom,
48
- left: userInset.left + axisPadding.left
49
- }), [userInset, axisPadding]);
68
+ top: calculatedInset.top + axisPadding.top,
69
+ right: calculatedInset.right + axisPadding.right,
70
+ bottom: calculatedInset.bottom + axisPadding.bottom,
71
+ left: calculatedInset.left + axisPadding.left
72
+ }), [calculatedInset, axisPadding]);
50
73
  const chartRect = useMemo(() => {
51
74
  if (chartWidth <= 0 || chartHeight <= 0) return {
52
75
  x: 0,
@@ -63,8 +86,14 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
63
86
  height: availableHeight > 0 ? availableHeight : 0
64
87
  };
65
88
  }, [chartHeight, chartWidth, totalInset]);
66
- const xAxis = useMemo(() => {
67
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return undefined;
89
+ const {
90
+ xAxis,
91
+ xScale
92
+ } = useMemo(() => {
93
+ if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
94
+ xAxis: undefined,
95
+ xScale: undefined
96
+ };
68
97
  const domain = getAxisDomain(xAxisConfig, series != null ? series : [], 'x');
69
98
  const range = getAxisRange(xAxisConfig, chartRect, 'x');
70
99
  const axisConfig = {
@@ -75,11 +104,47 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
75
104
  categoryPadding: xAxisConfig.categoryPadding,
76
105
  domainLimit: xAxisConfig.domainLimit
77
106
  };
78
- return axisConfig;
107
+
108
+ // Create the scale
109
+ const scale = getAxisScale({
110
+ config: axisConfig,
111
+ type: 'x',
112
+ range: axisConfig.range,
113
+ dataDomain: axisConfig.domain
114
+ });
115
+ if (!scale) return {
116
+ xAxis: undefined,
117
+ xScale: undefined
118
+ };
119
+
120
+ // Update axis config with actual scale domain (after .nice() or other adjustments)
121
+ const scaleDomain = scale.domain();
122
+ const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
123
+ min: scaleDomain[0],
124
+ max: scaleDomain[1]
125
+ } : axisConfig.domain;
126
+ const finalAxisConfig = _extends({}, axisConfig, {
127
+ domain: actualDomain
128
+ });
129
+ return {
130
+ xAxis: finalAxisConfig,
131
+ xScale: scale
132
+ };
79
133
  }, [xAxisConfig, series, chartRect]);
80
- const yAxes = useMemo(() => {
134
+ const xSerializableScale = useMemo(() => {
135
+ if (!xScale) return;
136
+ return convertToSerializableScale(xScale);
137
+ }, [xScale]);
138
+ const {
139
+ yAxes,
140
+ yScales
141
+ } = useMemo(() => {
81
142
  const axes = new Map();
82
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return axes;
143
+ const scales = new Map();
144
+ if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return {
145
+ yAxes: axes,
146
+ yScales: scales
147
+ };
83
148
  yAxisConfig.forEach(axisParam => {
84
149
  var _axisParam$id, _series$filter, _axisParam$domainLimi;
85
150
  const axisId = (_axisParam$id = axisParam.id) != null ? _axisParam$id : defaultAxisId;
@@ -90,33 +155,19 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
90
155
  return ((_s$yAxisId = s.yAxisId) != null ? _s$yAxisId : defaultAxisId) === axisId;
91
156
  })) != null ? _series$filter : [];
92
157
 
93
- // Calculate domain and range in one pass
94
- const domain = getAxisDomain(axisParam, relevantSeries, 'y');
158
+ // Calculate domain and range
159
+ const dataDomain = getAxisDomain(axisParam, relevantSeries, 'y');
95
160
  const range = getAxisRange(axisParam, chartRect, 'y');
96
- axes.set(axisId, {
161
+ const axisConfig = {
97
162
  scaleType: axisParam.scaleType,
98
- domain,
163
+ domain: dataDomain,
99
164
  range,
100
165
  data: axisParam.data,
101
166
  categoryPadding: axisParam.categoryPadding,
102
167
  domainLimit: (_axisParam$domainLimi = axisParam.domainLimit) != null ? _axisParam$domainLimi : 'nice'
103
- });
104
- });
105
- return axes;
106
- }, [yAxisConfig, series, chartRect]);
107
- const xScale = useMemo(() => {
108
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0 || xAxis === undefined) return undefined;
109
- return getAxisScale({
110
- config: xAxis,
111
- type: 'x',
112
- range: xAxis.range,
113
- dataDomain: xAxis.domain
114
- });
115
- }, [chartRect, xAxis]);
116
- const yScales = useMemo(() => {
117
- const scales = new Map();
118
- if (!chartRect || chartRect.width <= 0 || chartRect.height <= 0) return scales;
119
- yAxes.forEach((axisConfig, axisId) => {
168
+ };
169
+
170
+ // Create the scale
120
171
  const scale = getAxisScale({
121
172
  config: axisConfig,
122
173
  type: 'y',
@@ -125,17 +176,42 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
125
176
  });
126
177
  if (scale) {
127
178
  scales.set(axisId, scale);
179
+
180
+ // Update axis config with actual scale domain (after .nice() or other adjustments)
181
+ const scaleDomain = scale.domain();
182
+ const actualDomain = Array.isArray(scaleDomain) && scaleDomain.length === 2 ? {
183
+ min: scaleDomain[0],
184
+ max: scaleDomain[1]
185
+ } : axisConfig.domain;
186
+ axes.set(axisId, _extends({}, axisConfig, {
187
+ domain: actualDomain
188
+ }));
128
189
  }
129
190
  });
130
- return scales;
131
- }, [chartRect, yAxes]);
191
+ return {
192
+ yAxes: axes,
193
+ yScales: scales
194
+ };
195
+ }, [yAxisConfig, series, chartRect]);
196
+
197
+ // We need a set of serialized scales usable in UI thread
198
+ const ySerializableScales = useMemo(() => {
199
+ const serializableScales = new Map();
200
+ yScales.forEach((scale, id) => {
201
+ const serializableScale = convertToSerializableScale(scale);
202
+ if (serializableScale) {
203
+ serializableScales.set(id, serializableScale);
204
+ }
205
+ });
206
+ return serializableScales;
207
+ }, [yScales]);
132
208
  const getXAxis = useCallback(() => xAxis, [xAxis]);
133
209
  const getYAxis = useCallback(id => yAxes.get(id != null ? id : defaultAxisId), [yAxes]);
134
210
  const getXScale = useCallback(() => xScale, [xScale]);
135
211
  const getYScale = useCallback(id => yScales.get(id != null ? id : defaultAxisId), [yScales]);
212
+ const getXSerializableScale = useCallback(() => xSerializableScale, [xSerializableScale]);
213
+ const getYSerializableScale = useCallback(id => ySerializableScales.get(id != null ? id : defaultAxisId), [ySerializableScales]);
136
214
  const getSeries = useCallback(seriesId => series == null ? void 0 : series.find(s => s.id === seriesId), [series]);
137
-
138
- // Compute stacked data for series with stack properties
139
215
  const stackedDataMap = useMemo(() => {
140
216
  if (!series) return new Map();
141
217
  return calculateStackedSeriesData(series);
@@ -144,6 +220,20 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
144
220
  if (!seriesId) return undefined;
145
221
  return stackedDataMap.get(seriesId);
146
222
  }, [stackedDataMap]);
223
+ const dataLength = useMemo(() => {
224
+ // If xAxis has categorical data, use that length
225
+ if (xAxisConfig.data && xAxisConfig.data.length > 0) {
226
+ return xAxisConfig.data.length;
227
+ }
228
+
229
+ // Otherwise, find the longest series
230
+ if (!series || series.length === 0) return 0;
231
+ return series.reduce((max, s) => {
232
+ var _seriesData$length;
233
+ const seriesData = getStackedSeriesData(s.id);
234
+ return Math.max(max, (_seriesData$length = seriesData == null ? void 0 : seriesData.length) != null ? _seriesData$length : 0);
235
+ }, 0);
236
+ }, [xAxisConfig.data, series, getStackedSeriesData]);
147
237
  const getAxisBounds = useCallback(axisId => {
148
238
  const axis = renderedAxes.get(axisId);
149
239
  if (!axis || !chartRect) return;
@@ -155,7 +245,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
155
245
  const offsetFromPreviousAxes = axesAtPosition.slice(0, axisIndex).reduce((sum, a) => sum + a.size, 0);
156
246
  if (axis.position === 'top') {
157
247
  // Position above the chart rect, accounting for user inset
158
- const startY = userInset.top + offsetFromPreviousAxes;
248
+ const startY = calculatedInset.top + offsetFromPreviousAxes;
159
249
  return {
160
250
  x: chartRect.x,
161
251
  y: startY,
@@ -173,7 +263,7 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
173
263
  };
174
264
  } else if (axis.position === 'left') {
175
265
  // Position to the left of the chart rect, accounting for user inset
176
- const startX = userInset.left + offsetFromPreviousAxes;
266
+ const startX = calculatedInset.left + offsetFromPreviousAxes;
177
267
  return {
178
268
  x: startX,
179
269
  y: chartRect.y,
@@ -190,7 +280,11 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
190
280
  height: chartRect.height
191
281
  };
192
282
  }
193
- }, [renderedAxes, chartRect, userInset]);
283
+ }, [renderedAxes, chartRect, calculatedInset]);
284
+ const fontProvider = useMemo(() => {
285
+ if (fontProviderProp) return fontProviderProp;
286
+ return Skia.TypefaceFontProvider.Make();
287
+ }, [fontProviderProp]);
194
288
  const contextValue = useMemo(() => ({
195
289
  series: series != null ? series : [],
196
290
  getSeries,
@@ -198,25 +292,23 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
198
292
  animate,
199
293
  width: chartWidth,
200
294
  height: chartHeight,
295
+ fontFamilies,
296
+ fontProvider,
201
297
  getXAxis,
202
298
  getYAxis,
203
299
  getXScale,
204
300
  getYScale,
301
+ getXSerializableScale,
302
+ getYSerializableScale,
205
303
  drawingArea: chartRect,
304
+ dataLength,
206
305
  registerAxis,
207
306
  unregisterAxis,
208
307
  getAxisBounds
209
- }), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, getXAxis, getYAxis, getXScale, getYScale, chartRect, registerAxis, unregisterAxis, getAxisBounds]);
210
- const containerStyles = useMemo(() => {
211
- const dynamicStyles = {};
212
- if (typeof width === 'string') {
213
- dynamicStyles.width = width;
214
- }
215
- if (typeof height === 'string') {
216
- dynamicStyles.height = height;
217
- }
218
- return [style, dynamicStyles];
219
- }, [style, width, height]);
308
+ }), [series, getSeries, getStackedSeriesData, animate, chartWidth, chartHeight, fontFamilies, fontProvider, getXAxis, getYAxis, getXScale, getYScale, getXSerializableScale, getYSerializableScale, chartRect, dataLength, registerAxis, unregisterAxis, getAxisBounds]);
309
+ const rootStyles = useMemo(() => {
310
+ return [style, styles == null ? void 0 : styles.root];
311
+ }, [style, styles == null ? void 0 : styles.root]);
220
312
  return /*#__PURE__*/_jsx(CartesianChartProvider, {
221
313
  value: contextValue,
222
314
  children: /*#__PURE__*/_jsx(ScrubberProvider, {
@@ -227,12 +319,14 @@ export const CartesianChart = /*#__PURE__*/memo(/*#__PURE__*/forwardRef((_ref, r
227
319
  ref: ref,
228
320
  accessibilityLiveRegion: "polite",
229
321
  accessibilityRole: "image",
322
+ collapsable: collapsable,
323
+ height: height,
230
324
  onLayout: onContainerLayout,
231
- style: containerStyles
325
+ style: rootStyles,
326
+ width: width
232
327
  }, props, {
233
- children: /*#__PURE__*/_jsx(Svg, {
234
- height: chartHeight,
235
- width: chartWidth,
328
+ children: /*#__PURE__*/_jsx(ChartCanvas, {
329
+ style: styles == null ? void 0 : styles.chart,
236
330
  children: children
237
331
  })
238
332
  }))
@@ -0,0 +1,148 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ /**
3
+ * Simplified context bridge utilities for React Native.
4
+ * Adapted from its-fine to enable context sharing across React renderers
5
+ * https://github.com/pmndrs/its-fine/blob/598b81f02778c22ed21121c2b1a786bdefb14e23/src/index.tsx
6
+ */
7
+
8
+ import * as React from 'react';
9
+
10
+ /**
11
+ * Represents a react-internal tree node.
12
+ */
13
+
14
+ /**
15
+ * Represents a tree node selector for traversal.
16
+ */
17
+ import { jsx as _jsx } from "react/jsx-runtime";
18
+ /**
19
+ * Traverses up or down a React tree, return `true` to stop and select a node.
20
+ */
21
+ function traverseTreeNode(node, ascending, selector) {
22
+ if (!node) return;
23
+ if (selector(node) === true) return node;
24
+ let child = ascending ? node.return : node.child;
25
+ while (child) {
26
+ const match = traverseTreeNode(child, ascending, selector);
27
+ if (match) return match;
28
+ child = ascending ? null : child.sibling;
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Wraps context to hide React development warnings about using contexts between renderers.
34
+ */
35
+ function wrapContext(context) {
36
+ try {
37
+ return Object.defineProperties(context, {
38
+ _currentRenderer: {
39
+ get() {
40
+ return null;
41
+ },
42
+ set() {}
43
+ },
44
+ _currentRenderer2: {
45
+ get() {
46
+ return null;
47
+ },
48
+ set() {}
49
+ }
50
+ });
51
+ } catch (_) {
52
+ return context;
53
+ }
54
+ }
55
+
56
+ // In development, React will warn about using contexts between renderers.
57
+ // Suppress the warning because our context bridge fixes this issue
58
+ const error = console.error;
59
+ console.error = function () {
60
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
61
+ args[_key] = arguments[_key];
62
+ }
63
+ const message = args.join('');
64
+ if (message != null && message.startsWith('Warning:') && message.includes('useContext')) {
65
+ console.error = error;
66
+ return;
67
+ }
68
+ return error.apply(this, args);
69
+ };
70
+ const TreeNodeContext = wrapContext(/*#__PURE__*/React.createContext(null));
71
+
72
+ /**
73
+ * A react-internal tree node provider that binds React children to the React tree for chart context bridging.
74
+ */
75
+ export class ChartBridgeProvider extends React.Component {
76
+ render() {
77
+ return /*#__PURE__*/_jsx(TreeNodeContext.Provider, {
78
+ value: this._reactInternals,
79
+ children: this.props.children
80
+ });
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Returns the current react-internal tree node.
86
+ */
87
+ function useTreeNode() {
88
+ const root = React.useContext(TreeNodeContext);
89
+ if (root === null) throw new Error('useTreeNode must be called within a <ChartBridgeProvider />!');
90
+ const id = React.useId();
91
+ const treeNode = React.useMemo(() => {
92
+ for (const maybeNode of [root, root == null ? void 0 : root.alternate]) {
93
+ if (!maybeNode) continue;
94
+ const node = traverseTreeNode(maybeNode, false, node => {
95
+ let state = node.memoizedState;
96
+ while (state) {
97
+ if (state.memoizedState === id) return true;
98
+ state = state.next;
99
+ }
100
+ });
101
+ if (node) return node;
102
+ }
103
+ }, [root, id]);
104
+ return treeNode;
105
+ }
106
+ /**
107
+ * Returns a map of all contexts and their values.
108
+ */
109
+ function useContextMap() {
110
+ const treeNode = useTreeNode();
111
+ const [contextMap] = React.useState(() => new Map());
112
+
113
+ // Collect live context
114
+ contextMap.clear();
115
+ let node = treeNode;
116
+ while (node) {
117
+ if (node.type && typeof node.type === 'object') {
118
+ // https://github.com/facebook/react/pull/28226
119
+ const enableRenderableContext = node.type._context === undefined && node.type.Provider === node.type;
120
+ const context = enableRenderableContext ? node.type : node.type._context;
121
+ if (context && context !== TreeNodeContext && !contextMap.has(context)) {
122
+ // eslint-disable-next-line react-hooks/rules-of-hooks
123
+ contextMap.set(context, React.useContext(wrapContext(context)));
124
+ }
125
+ }
126
+ node = node.return;
127
+ }
128
+ return contextMap;
129
+ }
130
+
131
+ /**
132
+ * Represents a chart context bridge provider component.
133
+ */
134
+
135
+ /**
136
+ * Returns a ChartContextBridge of live context providers to pierce Context across renderers.
137
+ * Pass ChartContextBridge as a component to a secondary renderer (e.g., Skia Canvas) to enable context-sharing in charts.
138
+ */
139
+ export function useChartContextBridge() {
140
+ const contextMap = useContextMap();
141
+
142
+ // Flatten context and their memoized values into a `ChartContextBridge` provider
143
+ return React.useMemo(() => Array.from(contextMap.keys()).reduce((Prev, context) => props => /*#__PURE__*/_jsx(Prev, {
144
+ children: /*#__PURE__*/_jsx(context.Provider, _extends({}, props, {
145
+ value: contextMap.get(context)
146
+ }))
147
+ }), props => /*#__PURE__*/_jsx(ChartBridgeProvider, _extends({}, props))), [contextMap]);
148
+ }