@impulse-ui-native/charts 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +50 -6
  2. package/dist/components/bar-chart-body.d.mts +15 -0
  3. package/dist/components/bar-chart-body.js +50 -0
  4. package/dist/components/bar-chart-body.js.map +1 -0
  5. package/dist/components/bar-chart.d.mts +11 -0
  6. package/dist/components/bar-chart.js +21 -0
  7. package/dist/components/bar-chart.js.map +1 -0
  8. package/dist/components/chart-axes.d.mts +22 -0
  9. package/dist/components/chart-axes.js +64 -0
  10. package/dist/components/chart-axes.js.map +1 -0
  11. package/dist/components/index.d.mts +23 -0
  12. package/dist/components/index.js +12 -0
  13. package/dist/components/index.js.map +1 -0
  14. package/dist/components/line-chart-body.d.mts +14 -0
  15. package/dist/components/line-chart-body.js +86 -0
  16. package/dist/components/line-chart-body.js.map +1 -0
  17. package/dist/components/line-chart.d.mts +10 -0
  18. package/dist/components/line-chart.js +21 -0
  19. package/dist/components/line-chart.js.map +1 -0
  20. package/dist/components/multi-bar-chart-body.d.mts +16 -0
  21. package/dist/components/multi-bar-chart-body.js +72 -0
  22. package/dist/components/multi-bar-chart-body.js.map +1 -0
  23. package/dist/components/multi-bar-chart.d.mts +12 -0
  24. package/dist/components/multi-bar-chart.js +21 -0
  25. package/dist/components/multi-bar-chart.js.map +1 -0
  26. package/dist/components/multi-line-chart-body.d.mts +11 -0
  27. package/dist/components/multi-line-chart-body.js +95 -0
  28. package/dist/components/multi-line-chart-body.js.map +1 -0
  29. package/dist/components/multi-line-chart.d.mts +11 -0
  30. package/dist/components/multi-line-chart.js +21 -0
  31. package/dist/components/multi-line-chart.js.map +1 -0
  32. package/dist/components/primitives/bar.d.mts +12 -0
  33. package/dist/components/primitives/bar.js +44 -0
  34. package/dist/components/primitives/bar.js.map +1 -0
  35. package/dist/components/primitives/grid.d.mts +10 -0
  36. package/dist/components/primitives/grid.js +65 -0
  37. package/dist/components/primitives/grid.js.map +1 -0
  38. package/dist/components/primitives/index.d.mts +17 -0
  39. package/dist/components/primitives/index.js +15 -0
  40. package/dist/components/primitives/index.js.map +1 -0
  41. package/dist/components/primitives/label.d.mts +10 -0
  42. package/dist/components/primitives/label.js +94 -0
  43. package/dist/components/primitives/label.js.map +1 -0
  44. package/dist/components/primitives/line.d.mts +11 -0
  45. package/dist/components/primitives/line.js +50 -0
  46. package/dist/components/primitives/line.js.map +1 -0
  47. package/dist/components/primitives/x-axis.d.mts +11 -0
  48. package/dist/components/primitives/x-axis.js +93 -0
  49. package/dist/components/primitives/x-axis.js.map +1 -0
  50. package/dist/components/primitives/y-axis.d.mts +11 -0
  51. package/dist/components/primitives/y-axis.js +95 -0
  52. package/dist/components/primitives/y-axis.js.map +1 -0
  53. package/dist/constants/axis.constants.d.mts +6 -0
  54. package/dist/constants/axis.constants.js +11 -0
  55. package/dist/constants/axis.constants.js.map +1 -0
  56. package/dist/constants/bar-chart.constants.d.mts +4 -0
  57. package/dist/constants/bar-chart.constants.js +7 -0
  58. package/dist/constants/bar-chart.constants.js.map +1 -0
  59. package/dist/constants/bar.constants.d.mts +8 -0
  60. package/dist/constants/bar.constants.js +12 -0
  61. package/dist/constants/bar.constants.js.map +1 -0
  62. package/dist/constants/grid.constants.d.mts +6 -0
  63. package/dist/constants/grid.constants.js +11 -0
  64. package/dist/constants/grid.constants.js.map +1 -0
  65. package/dist/constants/index.d.mts +13 -0
  66. package/dist/constants/index.js +8 -0
  67. package/dist/constants/index.js.map +1 -0
  68. package/dist/constants/label.constants.d.mts +11 -0
  69. package/dist/constants/label.constants.js +12 -0
  70. package/dist/constants/label.constants.js.map +1 -0
  71. package/dist/constants/line-chart.constants.d.mts +8 -0
  72. package/dist/constants/line-chart.constants.js +7 -0
  73. package/dist/constants/line-chart.constants.js.map +1 -0
  74. package/dist/constants/line.constants.d.mts +15 -0
  75. package/dist/constants/line.constants.js +18 -0
  76. package/dist/constants/line.constants.js.map +1 -0
  77. package/dist/contexts/index.d.mts +2 -0
  78. package/dist/contexts/index.js +1 -0
  79. package/dist/contexts/index.js.map +1 -0
  80. package/dist/hooks/index.d.mts +19 -0
  81. package/dist/hooks/index.js +15 -0
  82. package/dist/hooks/index.js.map +1 -0
  83. package/dist/hooks/use-bar-chart.hook.d.mts +11 -0
  84. package/dist/hooks/use-bar-chart.hook.js +13 -0
  85. package/dist/hooks/use-bar-chart.hook.js.map +1 -0
  86. package/dist/hooks/use-chart-canvas.hook.d.mts +9 -0
  87. package/dist/hooks/use-chart-canvas.hook.js +10 -0
  88. package/dist/hooks/use-chart-canvas.hook.js.map +1 -0
  89. package/dist/hooks/use-chart-layout.hook.d.mts +7 -0
  90. package/dist/hooks/use-chart-layout.hook.js +9 -0
  91. package/dist/hooks/use-chart-layout.hook.js.map +1 -0
  92. package/dist/hooks/use-line-chart.hook.d.mts +10 -0
  93. package/dist/hooks/use-line-chart.hook.js +13 -0
  94. package/dist/hooks/use-line-chart.hook.js.map +1 -0
  95. package/dist/hooks/use-multi-bar-chart.hook.d.mts +13 -0
  96. package/dist/hooks/use-multi-bar-chart.hook.js +20 -0
  97. package/dist/hooks/use-multi-bar-chart.hook.js.map +1 -0
  98. package/dist/hooks/use-multi-line-chart.hook.d.mts +12 -0
  99. package/dist/hooks/use-multi-line-chart.hook.js +44 -0
  100. package/dist/hooks/use-multi-line-chart.hook.js.map +1 -0
  101. package/dist/index.d.mts +51 -321
  102. package/dist/index.js +6 -1083
  103. package/dist/index.js.map +1 -1
  104. package/dist/line-chart.types-yxru5uWc.d.mts +62 -0
  105. package/dist/types/axis.types.d.mts +49 -0
  106. package/dist/types/axis.types.js +1 -0
  107. package/dist/types/axis.types.js.map +1 -0
  108. package/dist/types/bar-chart.types.d.mts +38 -0
  109. package/dist/types/bar-chart.types.js +1 -0
  110. package/dist/types/bar-chart.types.js.map +1 -0
  111. package/dist/types/bar.types.d.mts +12 -0
  112. package/dist/types/bar.types.js +1 -0
  113. package/dist/types/bar.types.js.map +1 -0
  114. package/dist/types/common.types.d.mts +57 -0
  115. package/dist/types/common.types.js +1 -0
  116. package/dist/types/common.types.js.map +1 -0
  117. package/dist/types/grid.types.d.mts +5 -0
  118. package/dist/types/grid.types.js +1 -0
  119. package/dist/types/grid.types.js.map +1 -0
  120. package/dist/types/index.d.mts +16 -0
  121. package/dist/types/index.js +16 -0
  122. package/dist/types/index.js.map +1 -0
  123. package/dist/types/label.types.d.mts +24 -0
  124. package/dist/types/label.types.js +1 -0
  125. package/dist/types/label.types.js.map +1 -0
  126. package/dist/types/line-chart.types.d.mts +5 -0
  127. package/dist/types/line-chart.types.js +1 -0
  128. package/dist/types/line-chart.types.js.map +1 -0
  129. package/dist/types/line.types.d.mts +11 -0
  130. package/dist/types/line.types.js +1 -0
  131. package/dist/types/line.types.js.map +1 -0
  132. package/dist/types/multi-bar-chart.types.d.mts +21 -0
  133. package/dist/types/multi-bar-chart.types.js +1 -0
  134. package/dist/types/multi-bar-chart.types.js.map +1 -0
  135. package/dist/types/multi-line-chart.types.d.mts +23 -0
  136. package/dist/types/multi-line-chart.types.js +1 -0
  137. package/dist/types/multi-line-chart.types.js.map +1 -0
  138. package/dist/types/style.types.d.mts +19 -0
  139. package/dist/types/style.types.js +1 -0
  140. package/dist/types/style.types.js.map +1 -0
  141. package/dist/types/use-bar-chart.types.d.mts +26 -0
  142. package/dist/types/use-bar-chart.types.js +1 -0
  143. package/dist/types/use-bar-chart.types.js.map +1 -0
  144. package/dist/types/use-line-chart.types.d.mts +29 -0
  145. package/dist/types/use-line-chart.types.js +1 -0
  146. package/dist/types/use-line-chart.types.js.map +1 -0
  147. package/dist/types/use-multi-bar-chart.types.d.mts +17 -0
  148. package/dist/types/use-multi-bar-chart.types.js +1 -0
  149. package/dist/types/use-multi-bar-chart.types.js.map +1 -0
  150. package/dist/types/use-multi-line-chart.types.d.mts +16 -0
  151. package/dist/types/use-multi-line-chart.types.js +1 -0
  152. package/dist/types/use-multi-line-chart.types.js.map +1 -0
  153. package/dist/utils/axis.util.d.mts +15 -0
  154. package/dist/utils/axis.util.js +82 -0
  155. package/dist/utils/axis.util.js.map +1 -0
  156. package/dist/utils/bar-chart.util.d.mts +25 -0
  157. package/dist/utils/bar-chart.util.js +145 -0
  158. package/dist/utils/bar-chart.util.js.map +1 -0
  159. package/dist/utils/chart-layout.util.d.mts +8 -0
  160. package/dist/utils/chart-layout.util.js +55 -0
  161. package/dist/utils/chart-layout.util.js.map +1 -0
  162. package/dist/utils/grid.util.d.mts +11 -0
  163. package/dist/utils/grid.util.js +56 -0
  164. package/dist/utils/grid.util.js.map +1 -0
  165. package/dist/utils/index.d.mts +23 -0
  166. package/dist/utils/index.js +56 -0
  167. package/dist/utils/index.js.map +1 -0
  168. package/dist/utils/label.util.d.mts +10 -0
  169. package/dist/utils/label.util.js +24 -0
  170. package/dist/utils/label.util.js.map +1 -0
  171. package/dist/utils/line-chart.util.d.mts +11 -0
  172. package/dist/utils/line-chart.util.js +133 -0
  173. package/dist/utils/line-chart.util.js.map +1 -0
  174. package/dist/utils/line.util.d.mts +10 -0
  175. package/dist/utils/line.util.js +36 -0
  176. package/dist/utils/line.util.js.map +1 -0
  177. package/dist/utils/multi-bar-chart.util.d.mts +14 -0
  178. package/dist/utils/multi-bar-chart.util.js +62 -0
  179. package/dist/utils/multi-bar-chart.util.js.map +1 -0
  180. package/dist/utils/multi-line-chart.util.d.mts +10 -0
  181. package/dist/utils/multi-line-chart.util.js +23 -0
  182. package/dist/utils/multi-line-chart.util.js.map +1 -0
  183. package/dist/utils/paragraph-builder.util.d.mts +10 -0
  184. package/dist/utils/paragraph-builder.util.js +16 -0
  185. package/dist/utils/paragraph-builder.util.js.map +1 -0
  186. package/package.json +6 -5
@@ -0,0 +1,56 @@
1
+ import {
2
+ createAxisTicks,
3
+ createXAxisLayout,
4
+ createXAxisLabelRect,
5
+ createYAxisLayout,
6
+ createYAxisLabelRect,
7
+ formatAxisTick
8
+ } from "./axis.util";
9
+ import {
10
+ createBarChartCoordinates,
11
+ createBarChartModel
12
+ } from "./bar-chart.util";
13
+ import { createChartLayout, createInsetRect } from "./chart-layout.util";
14
+ import {
15
+ createHorizontalGridPath,
16
+ createVerticalGridPath,
17
+ resolveGridLineOptions
18
+ } from "./grid.util";
19
+ import { getLabelTextAlign, getLabelY } from "./label.util";
20
+ import { createLinePath, fitLineCoordinatesToRect } from "./line.util";
21
+ import {
22
+ createLineChartCoordinates,
23
+ createLineChartModel
24
+ } from "./line-chart.util";
25
+ import { createDrawableMultiLineChartSeries } from "./multi-line-chart.util";
26
+ import {
27
+ createDrawableMultiBarChartSeries,
28
+ createMultiBarChartModel
29
+ } from "./multi-bar-chart.util";
30
+ import { createParagraphBuilder } from "./paragraph-builder.util";
31
+ export {
32
+ createAxisTicks,
33
+ createBarChartCoordinates,
34
+ createBarChartModel,
35
+ createChartLayout,
36
+ createDrawableMultiBarChartSeries,
37
+ createDrawableMultiLineChartSeries,
38
+ createHorizontalGridPath,
39
+ createInsetRect,
40
+ createLineChartCoordinates,
41
+ createLineChartModel,
42
+ createLinePath,
43
+ createMultiBarChartModel,
44
+ createParagraphBuilder,
45
+ createVerticalGridPath,
46
+ createXAxisLabelRect,
47
+ createXAxisLayout,
48
+ createYAxisLabelRect,
49
+ createYAxisLayout,
50
+ fitLineCoordinatesToRect,
51
+ formatAxisTick,
52
+ getLabelTextAlign,
53
+ getLabelY,
54
+ resolveGridLineOptions
55
+ };
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export {\n createAxisTicks,\n createXAxisLayout,\n createXAxisLabelRect,\n createYAxisLayout,\n createYAxisLabelRect,\n formatAxisTick,\n} from \"./axis.util\";\nexport {\n createBarChartCoordinates,\n createBarChartModel,\n} from \"./bar-chart.util\";\nexport { createChartLayout, createInsetRect } from \"./chart-layout.util\";\nexport {\n createHorizontalGridPath,\n createVerticalGridPath,\n resolveGridLineOptions,\n} from \"./grid.util\";\nexport { getLabelTextAlign, getLabelY } from \"./label.util\";\nexport { createLinePath, fitLineCoordinatesToRect } from \"./line.util\";\nexport {\n createLineChartCoordinates,\n createLineChartModel,\n} from \"./line-chart.util\";\nexport { createDrawableMultiLineChartSeries } from \"./multi-line-chart.util\";\nexport {\n createDrawableMultiBarChartSeries,\n createMultiBarChartModel,\n} from \"./multi-bar-chart.util\";\nexport { createParagraphBuilder } from \"./paragraph-builder.util\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB,uBAAuB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB,iBAAiB;AAC7C,SAAS,gBAAgB,gCAAgC;AACzD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,0CAA0C;AACnD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,8BAA8B;","names":[]}
@@ -0,0 +1,10 @@
1
+ import { TextAlign } from '@shopify/react-native-skia';
2
+ import { ChartRect } from '../types/common.types.mjs';
3
+ import { LabelHorizontalAlignment, LabelVerticalAlignment } from '../types/label.types.mjs';
4
+ import '../types/style.types.mjs';
5
+ import '@impulse-ui-native/theme';
6
+
7
+ declare function getLabelTextAlign(alignment: LabelHorizontalAlignment): TextAlign;
8
+ declare function getLabelY(rect: ChartRect, paragraphHeight: number, alignment: LabelVerticalAlignment): number;
9
+
10
+ export { getLabelTextAlign, getLabelY };
@@ -0,0 +1,24 @@
1
+ import { TextAlign } from "@shopify/react-native-skia";
2
+ function getLabelTextAlign(alignment) {
3
+ if (alignment === "center") {
4
+ return TextAlign.Center;
5
+ }
6
+ if (alignment === "right") {
7
+ return TextAlign.Right;
8
+ }
9
+ return TextAlign.Left;
10
+ }
11
+ function getLabelY(rect, paragraphHeight, alignment) {
12
+ if (alignment === "center") {
13
+ return rect.y + (rect.height - paragraphHeight) / 2;
14
+ }
15
+ if (alignment === "bottom") {
16
+ return rect.y + rect.height - paragraphHeight;
17
+ }
18
+ return rect.y;
19
+ }
20
+ export {
21
+ getLabelTextAlign,
22
+ getLabelY
23
+ };
24
+ //# sourceMappingURL=label.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/label.util.ts"],"sourcesContent":["import { TextAlign } from \"@shopify/react-native-skia\";\n\nimport {\n ChartRect,\n LabelHorizontalAlignment,\n LabelVerticalAlignment,\n} from \"../types\";\n\nexport function getLabelTextAlign(\n alignment: LabelHorizontalAlignment,\n): TextAlign {\n if (alignment === \"center\") {\n return TextAlign.Center;\n }\n\n if (alignment === \"right\") {\n return TextAlign.Right;\n }\n\n return TextAlign.Left;\n}\n\nexport function getLabelY(\n rect: ChartRect,\n paragraphHeight: number,\n alignment: LabelVerticalAlignment,\n): number {\n if (alignment === \"center\") {\n return rect.y + (rect.height - paragraphHeight) / 2;\n }\n\n if (alignment === \"bottom\") {\n return rect.y + rect.height - paragraphHeight;\n }\n\n return rect.y;\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAQnB,SAAS,kBACd,WACW;AACX,MAAI,cAAc,UAAU;AAC1B,WAAO,UAAU;AAAA,EACnB;AAEA,MAAI,cAAc,SAAS;AACzB,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO,UAAU;AACnB;AAEO,SAAS,UACd,MACA,iBACA,WACQ;AACR,MAAI,cAAc,UAAU;AAC1B,WAAO,KAAK,KAAK,KAAK,SAAS,mBAAmB;AAAA,EACpD;AAEA,MAAI,cAAc,UAAU;AAC1B,WAAO,KAAK,IAAI,KAAK,SAAS;AAAA,EAChC;AAEA,SAAO,KAAK;AACd;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { b as ChartXValue, f as LineChartPoint, h as LineChartScale, c as LineChartCoordinate } from '../line-chart.types-yxru5uWc.mjs';
2
+ import { UseLineChartProps, UseLineChartResult } from '../types/use-line-chart.types.mjs';
3
+ import '@shopify/react-native-skia';
4
+ import '../types/common.types.mjs';
5
+ import '../types/style.types.mjs';
6
+ import '@impulse-ui-native/theme';
7
+
8
+ declare function createLineChartModel<X extends ChartXValue>(props: UseLineChartProps<X>): UseLineChartResult<X>;
9
+ declare function createLineChartCoordinates<X extends ChartXValue>(data: readonly LineChartPoint<X>[], xScale: LineChartScale<X>, yScale: LineChartScale<number>): LineChartCoordinate<X>[];
10
+
11
+ export { createLineChartCoordinates, createLineChartModel };
@@ -0,0 +1,133 @@
1
+ import { extent } from "d3-array";
2
+ import { scaleLinear, scalePoint, scaleTime } from "d3-scale";
3
+ import {
4
+ LineChartDefaultNumericDomain,
5
+ LineChartDefaultTickCount
6
+ } from "../constants";
7
+ function createLineChartModel(props) {
8
+ const xTickCount = getTickCount(props.xAxis?.tickCount);
9
+ const yTickCount = getTickCount(props.yAxis?.tickCount);
10
+ const xRange = [
11
+ props.plot.x,
12
+ props.plot.x + props.plot.width
13
+ ];
14
+ const yRange = [
15
+ props.plot.y + props.plot.height,
16
+ props.plot.y
17
+ ];
18
+ const xModel = createXScale(
19
+ props.data.map((point) => point.x),
20
+ props.xScaleType ?? "linear",
21
+ xRange,
22
+ xTickCount
23
+ );
24
+ const yValues = props.data.reduce((values, point) => {
25
+ if (point.y !== null && Number.isFinite(point.y)) {
26
+ values.push(point.y);
27
+ }
28
+ return values;
29
+ }, []);
30
+ const yDomain = props.yAxis?.domain ?? getNumericDomain(yValues);
31
+ const d3YScale = scaleLinear().domain(yDomain).range(yRange);
32
+ if (!props.yAxis?.domain && yTickCount > 0) {
33
+ d3YScale.nice(yTickCount);
34
+ }
35
+ const resolvedYDomain = d3YScale.domain();
36
+ const yScale = (value) => d3YScale(value);
37
+ const coordinates = createLineChartCoordinates(
38
+ props.data,
39
+ xModel.scale,
40
+ yScale
41
+ );
42
+ return {
43
+ xDomain: xModel.domain,
44
+ yDomain: resolvedYDomain,
45
+ xTicks: xModel.ticks,
46
+ yTicks: d3YScale.ticks(yTickCount),
47
+ coordinates,
48
+ xScale: xModel.scale,
49
+ yScale
50
+ };
51
+ }
52
+ function createLineChartCoordinates(data, xScale, yScale) {
53
+ return data.map((datum, index) => {
54
+ const x = xScale(datum.x);
55
+ const y = datum.y === null ? void 0 : yScale(datum.y);
56
+ return {
57
+ datum,
58
+ index,
59
+ x: isFiniteCoordinate(x) ? x : null,
60
+ y: isFiniteCoordinate(y) ? y : null
61
+ };
62
+ });
63
+ }
64
+ function createXScale(values, scaleType, range, tickCount) {
65
+ if (scaleType === "point") {
66
+ const d3Scale2 = scalePoint().domain(values).range(range);
67
+ const domain = d3Scale2.domain();
68
+ return {
69
+ domain,
70
+ ticks: selectPointTicks(domain, tickCount),
71
+ scale: (value) => d3Scale2(value)
72
+ };
73
+ }
74
+ if (scaleType === "time") {
75
+ const dates = values.filter(
76
+ (value) => value instanceof Date && Number.isFinite(value.getTime())
77
+ );
78
+ const [minimum, maximum] = extent(dates);
79
+ const domain = minimum && maximum ? [minimum, maximum] : [/* @__PURE__ */ new Date(0), /* @__PURE__ */ new Date(1)];
80
+ const d3Scale2 = scaleTime().domain(domain).range(range);
81
+ if (tickCount > 0) {
82
+ d3Scale2.nice(tickCount);
83
+ }
84
+ return {
85
+ domain: d3Scale2.domain(),
86
+ ticks: d3Scale2.ticks(tickCount),
87
+ scale: (value) => value instanceof Date && Number.isFinite(value.getTime()) ? d3Scale2(value) : void 0
88
+ };
89
+ }
90
+ const numbers = values.filter(
91
+ (value) => typeof value === "number" && Number.isFinite(value)
92
+ );
93
+ const d3Scale = scaleLinear().domain(getNumericDomain(numbers)).range(range);
94
+ if (tickCount > 0) {
95
+ d3Scale.nice(tickCount);
96
+ }
97
+ return {
98
+ domain: d3Scale.domain(),
99
+ ticks: d3Scale.ticks(tickCount),
100
+ scale: (value) => typeof value === "number" && Number.isFinite(value) ? d3Scale(value) : void 0
101
+ };
102
+ }
103
+ function getNumericDomain(values) {
104
+ const [minimum, maximum] = extent(values);
105
+ return minimum === void 0 || maximum === void 0 ? LineChartDefaultNumericDomain : [minimum, maximum];
106
+ }
107
+ function getTickCount(tickCount) {
108
+ return tickCount === void 0 || !Number.isFinite(tickCount) ? LineChartDefaultTickCount : Math.max(0, Math.floor(tickCount));
109
+ }
110
+ function selectPointTicks(values, tickCount) {
111
+ if (tickCount <= 0 || values.length === 0) {
112
+ return [];
113
+ }
114
+ if (values.length <= tickCount) {
115
+ return [...values];
116
+ }
117
+ if (tickCount === 1) {
118
+ return [values[0]];
119
+ }
120
+ const lastIndex = values.length - 1;
121
+ return Array.from({ length: tickCount }, (_, index) => {
122
+ const valueIndex = Math.round(index * lastIndex / (tickCount - 1));
123
+ return values[valueIndex];
124
+ });
125
+ }
126
+ function isFiniteCoordinate(value) {
127
+ return value !== void 0 && Number.isFinite(value);
128
+ }
129
+ export {
130
+ createLineChartCoordinates,
131
+ createLineChartModel
132
+ };
133
+ //# sourceMappingURL=line-chart.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/line-chart.util.ts"],"sourcesContent":["import { extent } from \"d3-array\";\nimport { scaleLinear, scalePoint, scaleTime } from \"d3-scale\";\n\nimport {\n LineChartDefaultNumericDomain,\n LineChartDefaultTickCount,\n} from \"../constants\";\nimport {\n ChartNumericDomain,\n ChartXValue,\n LineChartCoordinate,\n LineChartPoint,\n LineChartScale,\n LineChartXScaleModel,\n UseLineChartProps,\n UseLineChartResult,\n} from \"../types\";\n\nexport function createLineChartModel<X extends ChartXValue>(\n props: UseLineChartProps<X>,\n): UseLineChartResult<X> {\n const xTickCount = getTickCount(props.xAxis?.tickCount);\n const yTickCount = getTickCount(props.yAxis?.tickCount);\n const xRange: ChartNumericDomain = [\n props.plot.x,\n props.plot.x + props.plot.width,\n ];\n const yRange: ChartNumericDomain = [\n props.plot.y + props.plot.height,\n props.plot.y,\n ];\n\n const xModel = createXScale(\n props.data.map((point) => point.x),\n props.xScaleType ?? \"linear\",\n xRange,\n xTickCount,\n );\n\n const yValues = props.data.reduce<number[]>((values, point) => {\n if (point.y !== null && Number.isFinite(point.y)) {\n values.push(point.y);\n }\n\n return values;\n }, []);\n const yDomain = props.yAxis?.domain ?? getNumericDomain(yValues);\n const d3YScale = scaleLinear().domain(yDomain).range(yRange);\n\n if (!props.yAxis?.domain && yTickCount > 0) {\n d3YScale.nice(yTickCount);\n }\n\n const resolvedYDomain = d3YScale.domain() as [number, number];\n const yScale: LineChartScale<number> = (value) => d3YScale(value);\n const coordinates = createLineChartCoordinates(\n props.data,\n xModel.scale,\n yScale,\n );\n\n return {\n xDomain: xModel.domain,\n yDomain: resolvedYDomain,\n xTicks: xModel.ticks,\n yTicks: d3YScale.ticks(yTickCount),\n coordinates,\n xScale: xModel.scale,\n yScale,\n };\n}\n\nexport function createLineChartCoordinates<X extends ChartXValue>(\n data: readonly LineChartPoint<X>[],\n xScale: LineChartScale<X>,\n yScale: LineChartScale<number>,\n): LineChartCoordinate<X>[] {\n return data.map((datum, index) => {\n const x = xScale(datum.x);\n const y = datum.y === null ? undefined : yScale(datum.y);\n\n return {\n datum,\n index,\n x: isFiniteCoordinate(x) ? x : null,\n y: isFiniteCoordinate(y) ? y : null,\n };\n });\n}\n\nfunction createXScale<X extends ChartXValue>(\n values: readonly X[],\n scaleType: UseLineChartProps<X>[\"xScaleType\"],\n range: ChartNumericDomain,\n tickCount: number,\n): LineChartXScaleModel<X> {\n if (scaleType === \"point\") {\n const d3Scale = scalePoint<X>().domain(values).range(range);\n const domain = d3Scale.domain();\n\n return {\n domain,\n ticks: selectPointTicks(domain, tickCount),\n scale: (value) => d3Scale(value),\n };\n }\n\n if (scaleType === \"time\") {\n const dates = values.filter(\n (value): value is Extract<X, Date> =>\n value instanceof Date && Number.isFinite(value.getTime()),\n );\n const [minimum, maximum] = extent(dates);\n const domain =\n minimum && maximum\n ? ([minimum, maximum] as const)\n : ([new Date(0), new Date(1)] as const);\n const d3Scale = scaleTime().domain(domain).range(range);\n\n if (tickCount > 0) {\n d3Scale.nice(tickCount);\n }\n\n return {\n domain: d3Scale.domain() as X[],\n ticks: d3Scale.ticks(tickCount) as X[],\n scale: (value) =>\n value instanceof Date && Number.isFinite(value.getTime())\n ? d3Scale(value)\n : undefined,\n };\n }\n\n const numbers = values.filter(\n (value): value is Extract<X, number> =>\n typeof value === \"number\" && Number.isFinite(value),\n );\n const d3Scale = scaleLinear().domain(getNumericDomain(numbers)).range(range);\n\n if (tickCount > 0) {\n d3Scale.nice(tickCount);\n }\n\n return {\n domain: d3Scale.domain() as X[],\n ticks: d3Scale.ticks(tickCount) as X[],\n scale: (value) =>\n typeof value === \"number\" && Number.isFinite(value)\n ? d3Scale(value)\n : undefined,\n };\n}\n\nfunction getNumericDomain(values: readonly number[]): ChartNumericDomain {\n const [minimum, maximum] = extent(values);\n\n return minimum === undefined || maximum === undefined\n ? LineChartDefaultNumericDomain\n : [minimum, maximum];\n}\n\nfunction getTickCount(tickCount: number | undefined): number {\n return tickCount === undefined || !Number.isFinite(tickCount)\n ? LineChartDefaultTickCount\n : Math.max(0, Math.floor(tickCount));\n}\n\nfunction selectPointTicks<X>(values: readonly X[], tickCount: number): X[] {\n if (tickCount <= 0 || values.length === 0) {\n return [];\n }\n\n if (values.length <= tickCount) {\n return [...values];\n }\n\n if (tickCount === 1) {\n return [values[0]!];\n }\n\n const lastIndex = values.length - 1;\n\n return Array.from({ length: tickCount }, (_, index) => {\n const valueIndex = Math.round((index * lastIndex) / (tickCount - 1));\n\n return values[valueIndex]!;\n });\n}\n\nfunction isFiniteCoordinate(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value);\n}\n"],"mappings":"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","names":["d3Scale"]}
@@ -0,0 +1,10 @@
1
+ import { SkPath } from '@shopify/react-native-skia';
2
+ import { ChartRect } from '../types/common.types.mjs';
3
+ import { b as ChartXValue, c as LineChartCoordinate, d as LineChartCurve } from '../line-chart.types-yxru5uWc.mjs';
4
+ import '../types/style.types.mjs';
5
+ import '@impulse-ui-native/theme';
6
+
7
+ declare function createLinePath<X extends ChartXValue>(coordinates: readonly LineChartCoordinate<X>[], curve: LineChartCurve): SkPath | null;
8
+ declare function fitLineCoordinatesToRect<X extends ChartXValue>(coordinates: readonly LineChartCoordinate<X>[], source: ChartRect, target: ChartRect): LineChartCoordinate<X>[];
9
+
10
+ export { createLinePath, fitLineCoordinatesToRect };
@@ -0,0 +1,36 @@
1
+ import { Skia } from "@shopify/react-native-skia";
2
+ import { line as createD3Line, curveLinear, curveMonotoneX } from "d3-shape";
3
+ function createLinePath(coordinates, curve) {
4
+ const pathData = createD3Line().defined((coordinate) => coordinate.x !== null && coordinate.y !== null).x((coordinate) => coordinate.x).y((coordinate) => coordinate.y).curve(curve === "monotone" ? curveMonotoneX : curveLinear)(coordinates);
5
+ return pathData ? Skia.Path.MakeFromSVGString(pathData) : null;
6
+ }
7
+ function fitLineCoordinatesToRect(coordinates, source, target) {
8
+ return coordinates.map((coordinate) => ({
9
+ ...coordinate,
10
+ x: coordinate.x === null ? null : mapCoordinate(
11
+ coordinate.x,
12
+ source.x,
13
+ source.width,
14
+ target.x,
15
+ target.width
16
+ ),
17
+ y: coordinate.y === null ? null : mapCoordinate(
18
+ coordinate.y,
19
+ source.y,
20
+ source.height,
21
+ target.y,
22
+ target.height
23
+ )
24
+ }));
25
+ }
26
+ function mapCoordinate(value, sourceStart, sourceLength, targetStart, targetLength) {
27
+ if (sourceLength <= 0) {
28
+ return targetStart + targetLength / 2;
29
+ }
30
+ return targetStart + (value - sourceStart) / sourceLength * targetLength;
31
+ }
32
+ export {
33
+ createLinePath,
34
+ fitLineCoordinatesToRect
35
+ };
36
+ //# sourceMappingURL=line.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/line.util.ts"],"sourcesContent":["import { Skia, SkPath } from \"@shopify/react-native-skia\";\nimport { line as createD3Line, curveLinear, curveMonotoneX } from \"d3-shape\";\n\nimport {\n ChartRect,\n ChartXValue,\n LineChartCoordinate,\n LineChartCurve,\n} from \"../types\";\n\nexport function createLinePath<X extends ChartXValue>(\n coordinates: readonly LineChartCoordinate<X>[],\n curve: LineChartCurve,\n): SkPath | null {\n const pathData = createD3Line<LineChartCoordinate<X>>()\n .defined((coordinate) => coordinate.x !== null && coordinate.y !== null)\n .x((coordinate) => coordinate.x!)\n .y((coordinate) => coordinate.y!)\n .curve(curve === \"monotone\" ? curveMonotoneX : curveLinear)(coordinates);\n\n return pathData ? Skia.Path.MakeFromSVGString(pathData) : null;\n}\n\nexport function fitLineCoordinatesToRect<X extends ChartXValue>(\n coordinates: readonly LineChartCoordinate<X>[],\n source: ChartRect,\n target: ChartRect,\n): LineChartCoordinate<X>[] {\n return coordinates.map((coordinate) => ({\n ...coordinate,\n x:\n coordinate.x === null\n ? null\n : mapCoordinate(\n coordinate.x,\n source.x,\n source.width,\n target.x,\n target.width,\n ),\n y:\n coordinate.y === null\n ? null\n : mapCoordinate(\n coordinate.y,\n source.y,\n source.height,\n target.y,\n target.height,\n ),\n }));\n}\n\nfunction mapCoordinate(\n value: number,\n sourceStart: number,\n sourceLength: number,\n targetStart: number,\n targetLength: number,\n): number {\n if (sourceLength <= 0) {\n return targetStart + targetLength / 2;\n }\n\n return targetStart + ((value - sourceStart) / sourceLength) * targetLength;\n}\n"],"mappings":"AAAA,SAAS,YAAoB;AAC7B,SAAS,QAAQ,cAAc,aAAa,sBAAsB;AAS3D,SAAS,eACd,aACA,OACe;AACf,QAAM,WAAW,aAAqC,EACnD,QAAQ,CAAC,eAAe,WAAW,MAAM,QAAQ,WAAW,MAAM,IAAI,EACtE,EAAE,CAAC,eAAe,WAAW,CAAE,EAC/B,EAAE,CAAC,eAAe,WAAW,CAAE,EAC/B,MAAM,UAAU,aAAa,iBAAiB,WAAW,EAAE,WAAW;AAEzE,SAAO,WAAW,KAAK,KAAK,kBAAkB,QAAQ,IAAI;AAC5D;AAEO,SAAS,yBACd,aACA,QACA,QAC0B;AAC1B,SAAO,YAAY,IAAI,CAAC,gBAAgB;AAAA,IACtC,GAAG;AAAA,IACH,GACE,WAAW,MAAM,OACb,OACA;AAAA,MACE,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACN,GACE,WAAW,MAAM,OACb,OACA;AAAA,MACE,WAAW;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACR,EAAE;AACJ;AAEA,SAAS,cACP,OACA,aACA,cACA,aACA,cACQ;AACR,MAAI,gBAAgB,GAAG;AACrB,WAAO,cAAc,eAAe;AAAA,EACtC;AAEA,SAAO,eAAgB,QAAQ,eAAe,eAAgB;AAChE;","names":[]}
@@ -0,0 +1,14 @@
1
+ import { b as ChartXValue } from '../line-chart.types-yxru5uWc.mjs';
2
+ import { MultiBarChartSeriesModel } from '../types/multi-bar-chart.types.mjs';
3
+ import { UseMultiBarChartProps, UseMultiBarChartResult } from '../types/use-multi-bar-chart.types.mjs';
4
+ import '@shopify/react-native-skia';
5
+ import '../types/common.types.mjs';
6
+ import '../types/style.types.mjs';
7
+ import '@impulse-ui-native/theme';
8
+ import '../types/bar-chart.types.mjs';
9
+ import '../types/use-bar-chart.types.mjs';
10
+
11
+ declare function createMultiBarChartModel<X extends ChartXValue>(props: UseMultiBarChartProps<X>): UseMultiBarChartResult<X>;
12
+ declare function createDrawableMultiBarChartSeries<X extends ChartXValue>(series: MultiBarChartSeriesModel<X>, index: number): MultiBarChartSeriesModel<X>;
13
+
14
+ export { createDrawableMultiBarChartSeries, createMultiBarChartModel };
@@ -0,0 +1,62 @@
1
+ import { scaleBand } from "d3-scale";
2
+ import { MultiBarChartDefaultSeriesPadding } from "../constants/bar-chart.constants";
3
+ import { BarDefaultColor, BarDefaultColors } from "../constants/bar.constants";
4
+ import {
5
+ createBarChartCoordinates,
6
+ createBarChartScaleModel,
7
+ normalizeBarChartPadding
8
+ } from "./bar-chart.util";
9
+ function createMultiBarChartModel(props) {
10
+ const data = props.series.flatMap((series2) => series2.data);
11
+ const model = createBarChartScaleModel({
12
+ data,
13
+ plot: props.plot,
14
+ xAxis: props.xAxis,
15
+ yAxis: props.yAxis,
16
+ categoryPadding: props.categoryPadding
17
+ });
18
+ const seriesScale = scaleBand().domain(props.series.map((_, index) => index)).range([0, model.bandwidth]).paddingInner(
19
+ normalizeBarChartPadding(
20
+ props.seriesPadding,
21
+ MultiBarChartDefaultSeriesPadding
22
+ )
23
+ );
24
+ const seriesBandwidth = seriesScale.bandwidth();
25
+ const series = props.series.map(
26
+ (currentSeries, index) => ({
27
+ ...currentSeries,
28
+ coordinates: createBarChartCoordinates(
29
+ currentSeries.data,
30
+ model.xStartScale,
31
+ model.yScale,
32
+ model.baseline,
33
+ seriesBandwidth,
34
+ seriesScale(index) ?? 0
35
+ )
36
+ })
37
+ );
38
+ return {
39
+ series,
40
+ xDomain: model.xDomain,
41
+ yDomain: model.yDomain,
42
+ xTicks: model.xTicks,
43
+ yTicks: model.yTicks,
44
+ xScale: model.xScale,
45
+ yScale: model.yScale,
46
+ bandwidth: model.bandwidth
47
+ };
48
+ }
49
+ function createDrawableMultiBarChartSeries(series, index) {
50
+ return {
51
+ ...series,
52
+ bar: {
53
+ ...series.bar,
54
+ color: series.bar?.color ?? BarDefaultColors[index % BarDefaultColors.length] ?? BarDefaultColor
55
+ }
56
+ };
57
+ }
58
+ export {
59
+ createDrawableMultiBarChartSeries,
60
+ createMultiBarChartModel
61
+ };
62
+ //# sourceMappingURL=multi-bar-chart.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/multi-bar-chart.util.ts"],"sourcesContent":["import { scaleBand } from \"d3-scale\";\n\nimport { MultiBarChartDefaultSeriesPadding } from \"../constants/bar-chart.constants\";\nimport { BarDefaultColor, BarDefaultColors } from \"../constants/bar.constants\";\nimport {\n ChartXValue,\n MultiBarChartSeriesModel,\n UseMultiBarChartProps,\n UseMultiBarChartResult,\n} from \"../types\";\nimport {\n createBarChartCoordinates,\n createBarChartScaleModel,\n normalizeBarChartPadding,\n} from \"./bar-chart.util\";\n\nexport function createMultiBarChartModel<X extends ChartXValue>(\n props: UseMultiBarChartProps<X>,\n): UseMultiBarChartResult<X> {\n const data = props.series.flatMap((series) => series.data);\n const model = createBarChartScaleModel({\n data,\n plot: props.plot,\n xAxis: props.xAxis,\n yAxis: props.yAxis,\n categoryPadding: props.categoryPadding,\n });\n const seriesScale = scaleBand<number>()\n .domain(props.series.map((_, index) => index))\n .range([0, model.bandwidth])\n .paddingInner(\n normalizeBarChartPadding(\n props.seriesPadding,\n MultiBarChartDefaultSeriesPadding,\n ),\n );\n const seriesBandwidth = seriesScale.bandwidth();\n const series: MultiBarChartSeriesModel<X>[] = props.series.map(\n (currentSeries, index) => ({\n ...currentSeries,\n coordinates: createBarChartCoordinates(\n currentSeries.data,\n model.xStartScale,\n model.yScale,\n model.baseline,\n seriesBandwidth,\n seriesScale(index) ?? 0,\n ),\n }),\n );\n\n return {\n series,\n xDomain: model.xDomain,\n yDomain: model.yDomain,\n xTicks: model.xTicks,\n yTicks: model.yTicks,\n xScale: model.xScale,\n yScale: model.yScale,\n bandwidth: model.bandwidth,\n };\n}\n\nexport function createDrawableMultiBarChartSeries<X extends ChartXValue>(\n series: MultiBarChartSeriesModel<X>,\n index: number,\n): MultiBarChartSeriesModel<X> {\n return {\n ...series,\n bar: {\n ...series.bar,\n color:\n series.bar?.color ??\n BarDefaultColors[index % BarDefaultColors.length] ??\n BarDefaultColor,\n },\n };\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAE1B,SAAS,yCAAyC;AAClD,SAAS,iBAAiB,wBAAwB;AAOlD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,yBACd,OAC2B;AAC3B,QAAM,OAAO,MAAM,OAAO,QAAQ,CAACA,YAAWA,QAAO,IAAI;AACzD,QAAM,QAAQ,yBAAyB;AAAA,IACrC;AAAA,IACA,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,iBAAiB,MAAM;AAAA,EACzB,CAAC;AACD,QAAM,cAAc,UAAkB,EACnC,OAAO,MAAM,OAAO,IAAI,CAAC,GAAG,UAAU,KAAK,CAAC,EAC5C,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,EAC1B;AAAA,IACC;AAAA,MACE,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF,QAAM,kBAAkB,YAAY,UAAU;AAC9C,QAAM,SAAwC,MAAM,OAAO;AAAA,IACzD,CAAC,eAAe,WAAW;AAAA,MACzB,GAAG;AAAA,MACH,aAAa;AAAA,QACX,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,YAAY,KAAK,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,EACnB;AACF;AAEO,SAAS,kCACd,QACA,OAC6B;AAC7B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,MACH,GAAG,OAAO;AAAA,MACV,OACE,OAAO,KAAK,SACZ,iBAAiB,QAAQ,iBAAiB,MAAM,KAChD;AAAA,IACJ;AAAA,EACF;AACF;","names":["series"]}
@@ -0,0 +1,10 @@
1
+ import { ChartRect } from '../types/common.types.mjs';
2
+ import { b as ChartXValue } from '../line-chart.types-yxru5uWc.mjs';
3
+ import { MultiLineChartSeriesModel } from '../types/multi-line-chart.types.mjs';
4
+ import '../types/style.types.mjs';
5
+ import '@shopify/react-native-skia';
6
+ import '@impulse-ui-native/theme';
7
+
8
+ declare function createDrawableMultiLineChartSeries<X extends ChartXValue>(series: MultiLineChartSeriesModel<X>, index: number, plot: ChartRect): MultiLineChartSeriesModel<X>;
9
+
10
+ export { createDrawableMultiLineChartSeries };
@@ -0,0 +1,23 @@
1
+ import {
2
+ LineDefaultColor,
3
+ LineDefaultColors,
4
+ LineDefaultWidth
5
+ } from "../constants";
6
+ import { createInsetRect } from "./chart-layout.util";
7
+ import { fitLineCoordinatesToRect } from "./line.util";
8
+ function createDrawableMultiLineChartSeries(series, index, plot) {
9
+ const width = series.line?.width ?? LineDefaultWidth;
10
+ const linePlot = createInsetRect(plot, width / 2);
11
+ return {
12
+ ...series,
13
+ coordinates: fitLineCoordinatesToRect(series.coordinates, plot, linePlot),
14
+ line: {
15
+ ...series.line,
16
+ color: series.line?.color ?? LineDefaultColors[index % LineDefaultColors.length] ?? LineDefaultColor
17
+ }
18
+ };
19
+ }
20
+ export {
21
+ createDrawableMultiLineChartSeries
22
+ };
23
+ //# sourceMappingURL=multi-line-chart.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/multi-line-chart.util.ts"],"sourcesContent":["import {\n LineDefaultColor,\n LineDefaultColors,\n LineDefaultWidth,\n} from \"../constants\";\nimport { ChartRect, ChartXValue, MultiLineChartSeriesModel } from \"../types\";\nimport { createInsetRect } from \"./chart-layout.util\";\nimport { fitLineCoordinatesToRect } from \"./line.util\";\n\nexport function createDrawableMultiLineChartSeries<X extends ChartXValue>(\n series: MultiLineChartSeriesModel<X>,\n index: number,\n plot: ChartRect,\n): MultiLineChartSeriesModel<X> {\n const width = series.line?.width ?? LineDefaultWidth;\n const linePlot = createInsetRect(plot, width / 2);\n\n return {\n ...series,\n coordinates: fitLineCoordinatesToRect(series.coordinates, plot, linePlot),\n line: {\n ...series.line,\n color:\n series.line?.color ??\n LineDefaultColors[index % LineDefaultColors.length] ??\n LineDefaultColor,\n },\n };\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,uBAAuB;AAChC,SAAS,gCAAgC;AAElC,SAAS,mCACd,QACA,OACA,MAC8B;AAC9B,QAAM,QAAQ,OAAO,MAAM,SAAS;AACpC,QAAM,WAAW,gBAAgB,MAAM,QAAQ,CAAC;AAEhD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,yBAAyB,OAAO,aAAa,MAAM,QAAQ;AAAA,IACxE,MAAM;AAAA,MACJ,GAAG,OAAO;AAAA,MACV,OACE,OAAO,MAAM,SACb,kBAAkB,QAAQ,kBAAkB,MAAM,KAClD;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,10 @@
1
+ import * as _shopify_react_native_skia from '@shopify/react-native-skia';
2
+ import { SkParagraphStyle, SkTypefaceFontProvider } from '@shopify/react-native-skia';
3
+
4
+ interface CreateParagraphBuilderProps {
5
+ paragraphStyle?: SkParagraphStyle;
6
+ typefaceProvider?: SkTypefaceFontProvider;
7
+ }
8
+ declare function createParagraphBuilder(props: CreateParagraphBuilderProps): _shopify_react_native_skia.SkParagraphBuilder;
9
+
10
+ export { createParagraphBuilder };
@@ -0,0 +1,16 @@
1
+ import {
2
+ Skia
3
+ } from "@shopify/react-native-skia";
4
+ function createParagraphBuilder(props) {
5
+ if (props.typefaceProvider) {
6
+ return Skia.ParagraphBuilder.Make(
7
+ props.paragraphStyle,
8
+ props.typefaceProvider
9
+ );
10
+ }
11
+ return Skia.ParagraphBuilder.Make(props.paragraphStyle);
12
+ }
13
+ export {
14
+ createParagraphBuilder
15
+ };
16
+ //# sourceMappingURL=paragraph-builder.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/paragraph-builder.util.ts"],"sourcesContent":["import {\n Skia,\n SkParagraphStyle,\n SkTypefaceFontProvider,\n} from \"@shopify/react-native-skia\";\n\ninterface CreateParagraphBuilderProps {\n paragraphStyle?: SkParagraphStyle;\n typefaceProvider?: SkTypefaceFontProvider;\n}\n\nexport function createParagraphBuilder(props: CreateParagraphBuilderProps) {\n if (props.typefaceProvider) {\n return Skia.ParagraphBuilder.Make(\n props.paragraphStyle,\n props.typefaceProvider,\n );\n }\n\n return Skia.ParagraphBuilder.Make(props.paragraphStyle);\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,OAGK;AAOA,SAAS,uBAAuB,OAAoC;AACzE,MAAI,MAAM,kBAAkB;AAC1B,WAAO,KAAK,iBAAiB;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,KAAK,iBAAiB,KAAK,MAAM,cAAc;AACxD;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@impulse-ui-native/charts",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "source": "src/index.ts",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.mts",
@@ -17,6 +17,7 @@
17
17
  "README.md",
18
18
  "LICENSE"
19
19
  ],
20
+ "sideEffects": false,
20
21
  "dependencies": {
21
22
  "d3-array": "3.2.4",
22
23
  "d3-interpolate": "3.0.1",
@@ -24,9 +25,9 @@
24
25
  "d3-shape": "3.2.0",
25
26
  "d3-time": "3.1.0",
26
27
  "d3-time-format": "4.1.0",
27
- "@impulse-ui-native/core": "2.1.0",
28
- "@impulse-ui-native/primitives": "2.1.0",
29
- "@impulse-ui-native/theme": "2.1.0"
28
+ "@impulse-ui-native/primitives": "2.1.2",
29
+ "@impulse-ui-native/core": "2.1.2",
30
+ "@impulse-ui-native/theme": "2.1.2"
30
31
  },
31
32
  "devDependencies": {
32
33
  "@shopify/react-native-skia": "2.6.2",
@@ -42,8 +43,8 @@
42
43
  "react": "19.2.3",
43
44
  "react-native": "0.86.2",
44
45
  "typescript": "~6.0.3",
45
- "@impulse-ui-native/eslint-config": "1.0.0",
46
46
  "@impulse-ui-native/tsconfig": "1.0.0",
47
+ "@impulse-ui-native/eslint-config": "1.0.0",
47
48
  "@impulse-ui-native/prettier-config": "1.0.0"
48
49
  },
49
50
  "peerDependencies": {