@obitrain/charts 0.10.4 → 0.11.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 (93) hide show
  1. package/README.md +4 -2
  2. package/lib/commonjs/Charts/BottomAxis/BottomAxis.js +53 -13
  3. package/lib/commonjs/Charts/BottomAxis/BottomAxis.js.map +1 -1
  4. package/lib/commonjs/Charts/BottomAxis/Tick.js +27 -11
  5. package/lib/commonjs/Charts/BottomAxis/Tick.js.map +1 -1
  6. package/lib/commonjs/Charts/BottomAxis/index.js.map +1 -1
  7. package/lib/commonjs/Charts/Cursor.js +18 -6
  8. package/lib/commonjs/Charts/Cursor.js.map +1 -1
  9. package/lib/commonjs/Charts/Dot.js +51 -0
  10. package/lib/commonjs/Charts/Dot.js.map +1 -0
  11. package/lib/commonjs/Charts/Dots.js +74 -0
  12. package/lib/commonjs/Charts/Dots.js.map +1 -0
  13. package/lib/commonjs/Charts/YAxis.js +64 -0
  14. package/lib/commonjs/Charts/YAxis.js.map +1 -0
  15. package/lib/commonjs/Charts/gesture.js +67 -24
  16. package/lib/commonjs/Charts/gesture.js.map +1 -1
  17. package/lib/commonjs/Charts/graphUtils.js +4 -1
  18. package/lib/commonjs/Charts/graphUtils.js.map +1 -1
  19. package/lib/commonjs/Charts/index.js +33 -0
  20. package/lib/commonjs/Charts/index.js.map +1 -1
  21. package/lib/module/Charts/BottomAxis/BottomAxis.js +55 -14
  22. package/lib/module/Charts/BottomAxis/BottomAxis.js.map +1 -1
  23. package/lib/module/Charts/BottomAxis/Tick.js +28 -10
  24. package/lib/module/Charts/BottomAxis/Tick.js.map +1 -1
  25. package/lib/module/Charts/BottomAxis/index.js.map +1 -1
  26. package/lib/module/Charts/Cursor.js +19 -7
  27. package/lib/module/Charts/Cursor.js.map +1 -1
  28. package/lib/module/Charts/Dot.js +47 -0
  29. package/lib/module/Charts/Dot.js.map +1 -0
  30. package/lib/module/Charts/Dots.js +70 -0
  31. package/lib/module/Charts/Dots.js.map +1 -0
  32. package/lib/module/Charts/YAxis.js +59 -0
  33. package/lib/module/Charts/YAxis.js.map +1 -0
  34. package/lib/module/Charts/gesture.js +67 -25
  35. package/lib/module/Charts/gesture.js.map +1 -1
  36. package/lib/module/Charts/graphUtils.js +4 -1
  37. package/lib/module/Charts/graphUtils.js.map +1 -1
  38. package/lib/module/Charts/index.js +4 -1
  39. package/lib/module/Charts/index.js.map +1 -1
  40. package/lib/typescript/commonjs/src/Charts/BottomAxis/BottomAxis.d.ts +26 -3
  41. package/lib/typescript/commonjs/src/Charts/BottomAxis/BottomAxis.d.ts.map +1 -1
  42. package/lib/typescript/commonjs/src/Charts/BottomAxis/Tick.d.ts +16 -3
  43. package/lib/typescript/commonjs/src/Charts/BottomAxis/Tick.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/src/Charts/BottomAxis/index.d.ts +1 -1
  45. package/lib/typescript/commonjs/src/Charts/BottomAxis/index.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/src/Charts/Cursor.d.ts +3 -0
  47. package/lib/typescript/commonjs/src/Charts/Cursor.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/src/Charts/Dot.d.ts +22 -0
  49. package/lib/typescript/commonjs/src/Charts/Dot.d.ts.map +1 -0
  50. package/lib/typescript/commonjs/src/Charts/Dots.d.ts +28 -0
  51. package/lib/typescript/commonjs/src/Charts/Dots.d.ts.map +1 -0
  52. package/lib/typescript/commonjs/src/Charts/YAxis.d.ts +22 -0
  53. package/lib/typescript/commonjs/src/Charts/YAxis.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/src/Charts/ZoomableLinechart/ScalablePath.d.ts +1 -1
  55. package/lib/typescript/commonjs/src/Charts/ZoomableLinechart/ScalablePath.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/src/Charts/gesture.d.ts +6 -0
  57. package/lib/typescript/commonjs/src/Charts/gesture.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/src/Charts/graphUtils.d.ts.map +1 -1
  59. package/lib/typescript/commonjs/src/Charts/index.d.ts +8 -2
  60. package/lib/typescript/commonjs/src/Charts/index.d.ts.map +1 -1
  61. package/lib/typescript/module/src/Charts/BottomAxis/BottomAxis.d.ts +26 -3
  62. package/lib/typescript/module/src/Charts/BottomAxis/BottomAxis.d.ts.map +1 -1
  63. package/lib/typescript/module/src/Charts/BottomAxis/Tick.d.ts +16 -3
  64. package/lib/typescript/module/src/Charts/BottomAxis/Tick.d.ts.map +1 -1
  65. package/lib/typescript/module/src/Charts/BottomAxis/index.d.ts +1 -1
  66. package/lib/typescript/module/src/Charts/BottomAxis/index.d.ts.map +1 -1
  67. package/lib/typescript/module/src/Charts/Cursor.d.ts +3 -0
  68. package/lib/typescript/module/src/Charts/Cursor.d.ts.map +1 -1
  69. package/lib/typescript/module/src/Charts/Dot.d.ts +22 -0
  70. package/lib/typescript/module/src/Charts/Dot.d.ts.map +1 -0
  71. package/lib/typescript/module/src/Charts/Dots.d.ts +28 -0
  72. package/lib/typescript/module/src/Charts/Dots.d.ts.map +1 -0
  73. package/lib/typescript/module/src/Charts/YAxis.d.ts +22 -0
  74. package/lib/typescript/module/src/Charts/YAxis.d.ts.map +1 -0
  75. package/lib/typescript/module/src/Charts/ZoomableLinechart/ScalablePath.d.ts +1 -1
  76. package/lib/typescript/module/src/Charts/ZoomableLinechart/ScalablePath.d.ts.map +1 -1
  77. package/lib/typescript/module/src/Charts/gesture.d.ts +6 -0
  78. package/lib/typescript/module/src/Charts/gesture.d.ts.map +1 -1
  79. package/lib/typescript/module/src/Charts/graphUtils.d.ts.map +1 -1
  80. package/lib/typescript/module/src/Charts/index.d.ts +8 -2
  81. package/lib/typescript/module/src/Charts/index.d.ts.map +1 -1
  82. package/package.json +1 -1
  83. package/src/Charts/BottomAxis/BottomAxis.tsx +100 -19
  84. package/src/Charts/BottomAxis/Tick.tsx +55 -11
  85. package/src/Charts/BottomAxis/index.tsx +5 -1
  86. package/src/Charts/Cursor.tsx +21 -1
  87. package/src/Charts/Dot.tsx +64 -0
  88. package/src/Charts/Dots.tsx +96 -0
  89. package/src/Charts/YAxis.tsx +96 -0
  90. package/src/Charts/ZoomableLinechart/ScalablePath.tsx +1 -1
  91. package/src/Charts/gesture.ts +109 -51
  92. package/src/Charts/graphUtils.ts +4 -1
  93. package/src/Charts/index.tsx +8 -0
package/README.md CHANGED
@@ -155,8 +155,10 @@ From `example/src/screens/DotsScreen`.
155
155
 
156
156
  ![Advanced chart](./static/advanced-chart.gif)
157
157
 
158
- `AxisLine` + `Tick` + a Y axis and dots composed in a single Skia canvas, with a shared scale driven
159
- by gestures or sliders. From `example/src/screens/AdvancedChartScreen`.
158
+ Two series with hollow markers (ring and diamond), pinch-to-zoom with live-clamped panning, period
159
+ presets, and a light/dark themed time axis whose bucketing and labels adapt to the visible window
160
+ (years → months → weeks → days). See the [implementation notes](./docs/advanced-chart.md).
161
+ From `example/src/screens/AdvancedChartScreen`.
160
162
 
161
163
  ## Example app
162
164
 
@@ -5,40 +5,80 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.BottomAxis = void 0;
7
7
  var _reactNativeSkia = require("@shopify/react-native-skia");
8
+ var _react = require("react");
8
9
  var _AxisLine = require("./AxisLine.js");
9
10
  var _Tick = require("./Tick.js");
10
11
  var _jsxRuntime = require("react/jsx-runtime");
11
- // ChartUtilsScreen.tsx
12
+ /** A tick at an explicit position in graph space, as returned by a d3 scale. */
12
13
 
13
14
  const BottomAxis = function (props) {
14
15
  const {
15
16
  labels,
17
+ ticks,
16
18
  scale,
17
19
  focalX,
18
20
  offsetX,
19
21
  style,
20
22
  width,
21
- font
23
+ font,
24
+ offsetY = 0,
25
+ standalone = true,
26
+ showAxisLine = true,
27
+ color,
28
+ labelColor,
29
+ tickLength,
30
+ strokeWidth,
31
+ dash,
32
+ labelAlign,
33
+ labelGap,
34
+ showLabels
22
35
  } = props;
23
- const offsetY = props.offsetY ?? 0;
24
- const tickInterval = labels.length > 1 ? width / (labels.length - 1) : 0;
25
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeSkia.Canvas, {
26
- style: style,
27
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AxisLine.AxisLine, {
36
+ const items = (0, _react.useMemo)(() => {
37
+ if (ticks !== undefined) return ticks;
38
+ if (labels === undefined) return [];
39
+ const interval = labels.length > 1 ? width / (labels.length - 1) : 0;
40
+ return labels.map((label, i) => ({
41
+ x: interval * i,
42
+ label
43
+ }));
44
+ }, [ticks, labels, width]);
45
+
46
+ // Callers naturally write `dash={[3, 4]}`; keying the memo on the values
47
+ // keeps one reference so the memoized Ticks are not rebuilt every render
48
+ const dashStart = dash?.[0];
49
+ const dashEnd = dash?.[1];
50
+ const dashIntervals = (0, _react.useMemo)(() => dashStart === undefined || dashEnd === undefined ? undefined : [dashStart, dashEnd], [dashStart, dashEnd]);
51
+ const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
52
+ children: [showAxisLine ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_AxisLine.AxisLine, {
28
53
  width,
29
54
  offsetY,
30
55
  focalX,
31
56
  scale,
32
- offsetX
33
- }), labels.map((_label, i) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tick.Tick, {
34
- label: _label,
35
- initPosition: tickInterval * i,
57
+ offsetX,
58
+ color,
59
+ strokeWidth
60
+ }) : null, items.map(tick => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tick.Tick, {
61
+ initPosition: tick.x,
62
+ label: tick.label,
63
+ dash: dashIntervals,
36
64
  offsetX,
37
65
  offsetY,
38
66
  focalX,
39
67
  scale,
40
- font
41
- }, i))]
68
+ font,
69
+ color,
70
+ labelColor,
71
+ tickLength,
72
+ strokeWidth,
73
+ labelAlign,
74
+ labelGap,
75
+ showLabel: showLabels
76
+ }, `${tick.x}:${tick.label}`))]
77
+ });
78
+ if (!standalone) return content;
79
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Canvas, {
80
+ style: style,
81
+ children: content
42
82
  });
43
83
  };
44
84
  exports.BottomAxis = BottomAxis;
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeSkia","require","_AxisLine","_Tick","_jsxRuntime","BottomAxis","props","labels","scale","focalX","offsetX","style","width","font","offsetY","tickInterval","length","jsxs","Canvas","children","jsx","AxisLine","map","_label","i","Tick","label","initPosition","exports"],"sourceRoot":"../../../../src","sources":["Charts/BottomAxis/BottomAxis.tsx"],"mappings":";;;;;;AACA,IAAAA,gBAAA,GAAAC,OAAA;AAIA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AAA8B,IAAAG,WAAA,GAAAH,OAAA;AAN9B;;AAoBA,MAAMI,UAA+B,GAAG,SAAAA,CAAUC,KAAK,EAAE;EACvD,MAAM;IAAEC,MAAM;IAAEC,KAAK;IAAEC,MAAM;IAAEC,OAAO;IAAEC,KAAK;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGP,KAAK;EACpE,MAAMQ,OAAO,GAAGR,KAAK,CAACQ,OAAO,IAAI,CAAC;EAClC,MAAMC,YAAY,GAAGR,MAAM,CAACS,MAAM,GAAG,CAAC,GAAGJ,KAAK,IAAIL,MAAM,CAACS,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;EAExE,oBACE,IAAAZ,WAAA,CAAAa,IAAA,EAACjB,gBAAA,CAAAkB,MAAM;IAACP,KAAK,EAAEA,KAAM;IAAAQ,QAAA,gBACnB,IAAAf,WAAA,CAAAgB,GAAA,EAAClB,SAAA,CAAAmB,QAAQ;MAAOT,KAAK;MAAEE,OAAO;MAAEL,MAAM;MAAED,KAAK;MAAEE;IAAO,CAAK,CAAC,EAC3DH,MAAM,CAACe,GAAG,CAAC,CAACC,MAAM,EAAEC,CAAC,kBACpB,IAAApB,WAAA,CAAAgB,GAAA,EAACjB,KAAA,CAAAsB,IAAI;MAEHC,KAAK,EAAEH,MAAO;MACdI,YAAY,EAAEZ,YAAY,GAAGS,CAAE;MACzBd,OAAO;MAAEI,OAAO;MAAEL,MAAM;MAAED,KAAK;MAAEK;IAAI,GAHtCW,CAIN,CACF,CAAC;EAAA,CACI,CAAC;AAEb,CAAC;AAACI,OAAA,CAAAvB,UAAA,GAAAA,UAAA","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeSkia","require","_react","_AxisLine","_Tick","_jsxRuntime","BottomAxis","props","labels","ticks","scale","focalX","offsetX","style","width","font","offsetY","standalone","showAxisLine","color","labelColor","tickLength","strokeWidth","dash","labelAlign","labelGap","showLabels","items","useMemo","undefined","interval","length","map","label","i","x","dashStart","dashEnd","dashIntervals","content","jsxs","Fragment","children","jsx","AxisLine","tick","Tick","initPosition","showLabel","Canvas","exports"],"sourceRoot":"../../../../src","sources":["Charts/BottomAxis/BottomAxis.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAKA,IAAAC,MAAA,GAAAD,OAAA;AAGA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AAA8B,IAAAI,WAAA,GAAAJ,OAAA;AAE9B;;AAgCA,MAAMK,UAA+B,GAAG,SAAAA,CAAUC,KAAK,EAAE;EACvD,MAAM;IACJC,MAAM;IACNC,KAAK;IACLC,KAAK;IACLC,MAAM;IACNC,OAAO;IACPC,KAAK;IACLC,KAAK;IACLC,IAAI;IACJC,OAAO,GAAG,CAAC;IACXC,UAAU,GAAG,IAAI;IACjBC,YAAY,GAAG,IAAI;IACnBC,KAAK;IACLC,UAAU;IACVC,UAAU;IACVC,WAAW;IACXC,IAAI;IACJC,UAAU;IACVC,QAAQ;IACRC;EACF,CAAC,GAAGnB,KAAK;EAET,MAAMoB,KAAK,GAAG,IAAAC,cAAO,EAAa,MAAM;IACtC,IAAInB,KAAK,KAAKoB,SAAS,EAAE,OAAOpB,KAAK;IACrC,IAAID,MAAM,KAAKqB,SAAS,EAAE,OAAO,EAAE;IACnC,MAAMC,QAAQ,GAAGtB,MAAM,CAACuB,MAAM,GAAG,CAAC,GAAGjB,KAAK,IAAIN,MAAM,CAACuB,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;IACpE,OAAOvB,MAAM,CAACwB,GAAG,CAAC,CAACC,KAAK,EAAEC,CAAC,MAAM;MAAEC,CAAC,EAAEL,QAAQ,GAAGI,CAAC;MAAED;IAAM,CAAC,CAAC,CAAC;EAC/D,CAAC,EAAE,CAACxB,KAAK,EAAED,MAAM,EAAEM,KAAK,CAAC,CAAC;;EAE1B;EACA;EACA,MAAMsB,SAAS,GAAGb,IAAI,GAAG,CAAC,CAAC;EAC3B,MAAMc,OAAO,GAAGd,IAAI,GAAG,CAAC,CAAC;EACzB,MAAMe,aAAa,GAAG,IAAAV,cAAO,EAC3B,MACEQ,SAAS,KAAKP,SAAS,IAAIQ,OAAO,KAAKR,SAAS,GAC5CA,SAAS,GACR,CAACO,SAAS,EAAEC,OAAO,CAAsB,EAChD,CAACD,SAAS,EAAEC,OAAO,CACrB,CAAC;EAED,MAAME,OAAO,gBACX,IAAAlC,WAAA,CAAAmC,IAAA,EAAAnC,WAAA,CAAAoC,QAAA;IAAAC,QAAA,GACGxB,YAAY,gBACX,IAAAb,WAAA,CAAAsC,GAAA,EAACxC,SAAA,CAAAyC,QAAQ;MACD9B,KAAK;MAAEE,OAAO;MAAEL,MAAM;MAAED,KAAK;MAAEE,OAAO;MAAEO,KAAK;MAAEG;IAAW,CACjE,CAAC,GACA,IAAI,EACPK,KAAK,CAACK,GAAG,CAAEa,IAAI,iBACd,IAAAxC,WAAA,CAAAsC,GAAA,EAACvC,KAAA,CAAA0C,IAAI;MAEHC,YAAY,EAAEF,IAAI,CAACV,CAAE;MACrBF,KAAK,EAAEY,IAAI,CAACZ,KAAM;MAClBV,IAAI,EAAEe,aAAc;MAElB1B,OAAO;MACPI,OAAO;MACPL,MAAM;MACND,KAAK;MACLK,IAAI;MACJI,KAAK;MACLC,UAAU;MACVC,UAAU;MACVC,WAAW;MACXE,UAAU;MACVC,QAAQ;MAEVuB,SAAS,EAAEtB;IAAW,GAjBjB,GAAGmB,IAAI,CAACV,CAAC,IAAIU,IAAI,CAACZ,KAAK,EAkB7B,CACF,CAAC;EAAA,CACF,CACH;EAED,IAAI,CAAChB,UAAU,EAAE,OAAOsB,OAAO;EAC/B,oBAAO,IAAAlC,WAAA,CAAAsC,GAAA,EAAC3C,gBAAA,CAAAiD,MAAM;IAACpC,KAAK,EAAEA,KAAM;IAAA6B,QAAA,EAAEH;EAAO,CAAS,CAAC;AACjD,CAAC;AAACW,OAAA,CAAA5C,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -5,39 +5,55 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Tick = void 0;
7
7
  var _reactNativeSkia = require("@shopify/react-native-skia");
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = require("react");
9
9
  var _reactNativeReanimated = require("react-native-reanimated");
10
10
  var _gesture = require("../gesture.js");
11
11
  var _jsxRuntime = require("react/jsx-runtime");
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- const Tick = props => {
12
+ const TickComponent = function (props) {
14
13
  const {
15
14
  label,
16
15
  scale,
17
16
  focalX,
18
17
  offsetX,
19
18
  initPosition,
20
- font
19
+ font,
20
+ color = 'black',
21
+ labelColor,
22
+ tickLength = 10,
23
+ strokeWidth,
24
+ dash,
25
+ showLabel = true,
26
+ labelAlign = 'center',
27
+ labelGap = 6
21
28
  } = props;
22
29
  const offsetY = props.offsetY ?? 0;
23
30
  const transform = (0, _reactNativeReanimated.useDerivedValue)(() => [{
24
31
  translateX: (0, _gesture.getPositionWl)(initPosition, focalX.value, scale.value, offsetX.value)
25
32
  }]);
26
33
  const width = font.getGlyphWidths(font.getGlyphIDs(label)).reduce((a, b) => a + b, 0);
34
+ const labelX = labelAlign === 'left' ? labelGap : -width / 2;
27
35
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeSkia.Group, {
28
36
  transform: transform,
29
37
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Line, {
30
- color: "black",
38
+ color: color,
39
+ strokeWidth: strokeWidth,
31
40
  p1: (0, _reactNativeSkia.vec)(0, offsetY),
32
- p2: (0, _reactNativeSkia.vec)(0, offsetY + 10)
33
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Text, {
41
+ p2: (0, _reactNativeSkia.vec)(0, offsetY + tickLength),
42
+ children: dash !== undefined ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.DashPathEffect, {
43
+ intervals: dash
44
+ }) : null
45
+ }), showLabel ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Text, {
34
46
  text: label,
35
- color: "black",
36
- x: -width / 2,
47
+ color: labelColor ?? color,
48
+ x: labelX,
37
49
  y: offsetY + 23,
38
50
  font: font
39
- })]
51
+ }) : null]
40
52
  });
41
53
  };
42
- exports.Tick = Tick;
54
+
55
+ // Memoized: zoom/pan flows through shared values, so a Tick only needs to
56
+ // re-render when its label or base position changes
57
+ const Tick = exports.Tick = /*#__PURE__*/(0, _react.memo)(TickComponent);
58
+ Tick.displayName = 'Tick';
43
59
  //# sourceMappingURL=Tick.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeSkia","require","_react","_interopRequireDefault","_reactNativeReanimated","_gesture","_jsxRuntime","e","__esModule","default","Tick","props","label","scale","focalX","offsetX","initPosition","font","offsetY","transform","useDerivedValue","translateX","getPositionWl","value","width","getGlyphWidths","getGlyphIDs","reduce","a","b","jsxs","Group","children","jsx","Line","color","p1","vec","p2","Text","text","x","y","exports"],"sourceRoot":"../../../../src","sources":["Charts/BottomAxis/Tick.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAOA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AAA2C,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAE,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAYpC,MAAMG,IAAyB,GAAIC,KAAK,IAAK;EAClD,MAAM;IAAEC,KAAK;IAAEC,KAAK;IAAEC,MAAM;IAAEC,OAAO;IAAEC,YAAY;IAAEC;EAAK,CAAC,GAAGN,KAAK;EACnE,MAAMO,OAAO,GAAGP,KAAK,CAACO,OAAO,IAAI,CAAC;EAClC,MAAMC,SAAS,GAAG,IAAAC,sCAAe,EAAC,MAAM,CACtC;IACEC,UAAU,EAAE,IAAAC,sBAAa,EACvBN,YAAY,EACZF,MAAM,CAACS,KAAK,EACZV,KAAK,CAACU,KAAK,EACXR,OAAO,CAACQ,KACV;EACF,CAAC,CACF,CAAC;EACF,MAAMC,KAAK,GAAGP,IAAI,CACfQ,cAAc,CAACR,IAAI,CAACS,WAAW,CAACd,KAAK,CAAC,CAAC,CACvCe,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,EAAE,CAAC,CAAC;EAE7B,oBACE,IAAAvB,WAAA,CAAAwB,IAAA,EAAC9B,gBAAA,CAAA+B,KAAK;IAACZ,SAAS,EAAEA,SAAU;IAAAa,QAAA,gBAC1B,IAAA1B,WAAA,CAAA2B,GAAA,EAACjC,gBAAA,CAAAkC,IAAI;MAACC,KAAK,EAAC,OAAO;MAACC,EAAE,EAAE,IAAAC,oBAAG,EAAC,CAAC,EAAEnB,OAAO,CAAE;MAACoB,EAAE,EAAE,IAAAD,oBAAG,EAAC,CAAC,EAAEnB,OAAO,GAAG,EAAE;IAAE,CAAE,CAAC,eACrE,IAAAZ,WAAA,CAAA2B,GAAA,EAACjC,gBAAA,CAAAuC,IAAI;MACHC,IAAI,EAAE5B,KAAM;MACZuB,KAAK,EAAC,OAAO;MACbM,CAAC,EAAE,CAACjB,KAAK,GAAG,CAAE;MACdkB,CAAC,EAAExB,OAAO,GAAG,EAAG;MAChBD,IAAI,EAAEA;IAAK,CACZ,CAAC;EAAA,CACG,CAAC;AAEZ,CAAC;AAAC0B,OAAA,CAAAjC,IAAA,GAAAA,IAAA","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeSkia","require","_react","_reactNativeReanimated","_gesture","_jsxRuntime","TickComponent","props","label","scale","focalX","offsetX","initPosition","font","color","labelColor","tickLength","strokeWidth","dash","showLabel","labelAlign","labelGap","offsetY","transform","useDerivedValue","translateX","getPositionWl","value","width","getGlyphWidths","getGlyphIDs","reduce","a","b","labelX","jsxs","Group","children","jsx","Line","p1","vec","p2","undefined","DashPathEffect","intervals","Text","text","x","y","Tick","exports","memo","displayName"],"sourceRoot":"../../../../src","sources":["Charts/BottomAxis/Tick.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AASA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AAA2C,IAAAI,WAAA,GAAAJ,OAAA;AAwB3C,MAAMK,aAAa,GAAG,SAAAA,CAAUC,KAAgB,EAAE;EAChD,MAAM;IACJC,KAAK;IACLC,KAAK;IACLC,MAAM;IACNC,OAAO;IACPC,YAAY;IACZC,IAAI;IACJC,KAAK,GAAG,OAAO;IACfC,UAAU;IACVC,UAAU,GAAG,EAAE;IACfC,WAAW;IACXC,IAAI;IACJC,SAAS,GAAG,IAAI;IAChBC,UAAU,GAAG,QAAQ;IACrBC,QAAQ,GAAG;EACb,CAAC,GAAGd,KAAK;EACT,MAAMe,OAAO,GAAGf,KAAK,CAACe,OAAO,IAAI,CAAC;EAClC,MAAMC,SAAS,GAAG,IAAAC,sCAAe,EAAC,MAAM,CACtC;IACEC,UAAU,EAAE,IAAAC,sBAAa,EACvBd,YAAY,EACZF,MAAM,CAACiB,KAAK,EACZlB,KAAK,CAACkB,KAAK,EACXhB,OAAO,CAACgB,KACV;EACF,CAAC,CACF,CAAC;EACF,MAAMC,KAAK,GAAGf,IAAI,CACfgB,cAAc,CAAChB,IAAI,CAACiB,WAAW,CAACtB,KAAK,CAAC,CAAC,CACvCuB,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,EAAE,CAAC,CAAC;EAC7B,MAAMC,MAAM,GAAGd,UAAU,KAAK,MAAM,GAAGC,QAAQ,GAAG,CAACO,KAAK,GAAG,CAAC;EAE5D,oBACE,IAAAvB,WAAA,CAAA8B,IAAA,EAACnC,gBAAA,CAAAoC,KAAK;IAACb,SAAS,EAAEA,SAAU;IAAAc,QAAA,gBAC1B,IAAAhC,WAAA,CAAAiC,GAAA,EAACtC,gBAAA,CAAAuC,IAAI;MACHzB,KAAK,EAAEA,KAAM;MACbG,WAAW,EAAEA,WAAY;MACzBuB,EAAE,EAAE,IAAAC,oBAAG,EAAC,CAAC,EAAEnB,OAAO,CAAE;MACpBoB,EAAE,EAAE,IAAAD,oBAAG,EAAC,CAAC,EAAEnB,OAAO,GAAGN,UAAU,CAAE;MAAAqB,QAAA,EAEhCnB,IAAI,KAAKyB,SAAS,gBAAG,IAAAtC,WAAA,CAAAiC,GAAA,EAACtC,gBAAA,CAAA4C,cAAc;QAACC,SAAS,EAAE3B;MAAK,CAAE,CAAC,GAAG;IAAI,CAC5D,CAAC,EACNC,SAAS,gBACR,IAAAd,WAAA,CAAAiC,GAAA,EAACtC,gBAAA,CAAA8C,IAAI;MACHC,IAAI,EAAEvC,KAAM;MACZM,KAAK,EAAEC,UAAU,IAAID,KAAM;MAC3BkC,CAAC,EAAEd,MAAO;MACVe,CAAC,EAAE3B,OAAO,GAAG,EAAG;MAChBT,IAAI,EAAEA;IAAK,CACZ,CAAC,GACA,IAAI;EAAA,CACH,CAAC;AAEZ,CAAC;;AAED;AACA;AACO,MAAMqC,IAAI,GAAAC,OAAA,CAAAD,IAAA,gBAAG,IAAAE,WAAI,EAAC9C,aAAa,CAAC;AACvC4C,IAAI,CAACG,WAAW,GAAG,MAAM","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_AxisLine","require","_BottomAxis","_Tick"],"sourceRoot":"../../../../src","sources":["Charts/BottomAxis/index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_AxisLine","require","_BottomAxis","_Tick"],"sourceRoot":"../../../../src","sources":["Charts/BottomAxis/index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAKA,IAAAE,KAAA,GAAAF,OAAA","ignoreList":[]}
@@ -13,6 +13,8 @@ const Cursor = function ({
13
13
  commands,
14
14
  positionX,
15
15
  color,
16
+ strokeColor,
17
+ strokeWidth = 2,
16
18
  currentValue,
17
19
  translateY,
18
20
  size = CURSOR_SIZE
@@ -37,12 +39,22 @@ const Cursor = function ({
37
39
  }, {
38
40
  translateY: _translateY.value ?? 0
39
41
  }]);
40
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Circle, {
41
- transform: transform,
42
- cx: 0,
43
- cy: 0,
44
- r: size,
45
- color: color
42
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
43
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Circle, {
44
+ transform: transform,
45
+ cx: 0,
46
+ cy: 0,
47
+ r: size,
48
+ color: color
49
+ }), strokeColor !== undefined ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Circle, {
50
+ transform: transform,
51
+ cx: 0,
52
+ cy: 0,
53
+ r: size,
54
+ color: strokeColor,
55
+ style: "stroke",
56
+ strokeWidth: strokeWidth
57
+ }) : null]
46
58
  });
47
59
  };
48
60
  exports.Cursor = Cursor;
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeSkia","require","_reactNativeReanimated","_maths","_jsxRuntime","CURSOR_SIZE","Cursor","commands","positionX","color","currentValue","translateY","size","undefined","console","warn","derivedTranslateY","useDerivedValue","_commands","value","_value","getYForX","_translateY","transform","translateX","jsx","Circle","cx","cy","r","exports"],"sourceRoot":"../../../src","sources":["Charts/Cursor.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAEA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAAmC,IAAAG,WAAA,GAAAH,OAAA;AAEnC,MAAMI,WAAW,GAAG,EAAE;AAWtB,MAAMC,MAAuB,GAAG,SAAAA,CAAU;EACxCC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,UAAU;EACVC,IAAI,GAAGP;AACT,CAAC,EAAE;EACD,IAAIK,YAAY,KAAKG,SAAS,IAAIF,UAAU,KAAKE,SAAS,EAAE;IAC1DC,OAAO,CAACC,IAAI,CAAC,mDAAmD,CAAC;EACnE;EAEA,MAAMC,iBAAiB,GAAG,IAAAC,sCAAe,EAAC,MAAM;IAC9C,MAAMC,SAAS,GAAGX,QAAQ,EAAEY,KAAK;IACjC,IAAID,SAAS,KAAKL,SAAS,EAAE;MAC3B,OAAO,CAAC;IACV;IACA,MAAMO,MAAM,GAAG,IAAAC,eAAQ,EAACH,SAAS,EAAEV,SAAS,CAACW,KAAK,CAAC,IAAI,CAAC;IACxD,IAAIR,UAAU,KAAKE,SAAS,IAAIH,YAAY,KAAKG,SAAS,EAAE;MAC1DH,YAAY,CAACS,KAAK,GAAGC,MAAM;IAC7B;IACA,OAAOA,MAAM;EACf,CAAC,CAAC;EAEF,MAAME,WAAW,GAAGX,UAAU,IAAIK,iBAAiB;EAEnD,MAAMO,SAAS,GAAG,IAAAN,sCAAe,EAAC,MAAM,CACtC;IAAEO,UAAU,EAAEhB,SAAS,CAACW;EAAM,CAAC,EAC/B;IAAER,UAAU,EAAEW,WAAW,CAACH,KAAK,IAAI;EAAE,CAAC,CACvC,CAAC;EACF,oBAAO,IAAAf,WAAA,CAAAqB,GAAA,EAACzB,gBAAA,CAAA0B,MAAM;IAACH,SAAS,EAAEA,SAAU;IAACI,EAAE,EAAE,CAAE;IAACC,EAAE,EAAE,CAAE;IAACC,CAAC,EAAEjB,IAAK;IAACH,KAAK,EAAEA;EAAM,CAAE,CAAC;AAC9E,CAAC;AAACqB,OAAA,CAAAxB,MAAA,GAAAA,MAAA","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeSkia","require","_reactNativeReanimated","_maths","_jsxRuntime","CURSOR_SIZE","Cursor","commands","positionX","color","strokeColor","strokeWidth","currentValue","translateY","size","undefined","console","warn","derivedTranslateY","useDerivedValue","_commands","value","_value","getYForX","_translateY","transform","translateX","jsxs","Fragment","children","jsx","Circle","cx","cy","r","style","exports"],"sourceRoot":"../../../src","sources":["Charts/Cursor.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAEA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAAmC,IAAAG,WAAA,GAAAH,OAAA;AAEnC,MAAMI,WAAW,GAAG,EAAE;AActB,MAAMC,MAAuB,GAAG,SAAAA,CAAU;EACxCC,QAAQ;EACRC,SAAS;EACTC,KAAK;EACLC,WAAW;EACXC,WAAW,GAAG,CAAC;EACfC,YAAY;EACZC,UAAU;EACVC,IAAI,GAAGT;AACT,CAAC,EAAE;EACD,IAAIO,YAAY,KAAKG,SAAS,IAAIF,UAAU,KAAKE,SAAS,EAAE;IAC1DC,OAAO,CAACC,IAAI,CAAC,mDAAmD,CAAC;EACnE;EAEA,MAAMC,iBAAiB,GAAG,IAAAC,sCAAe,EAAC,MAAM;IAC9C,MAAMC,SAAS,GAAGb,QAAQ,EAAEc,KAAK;IACjC,IAAID,SAAS,KAAKL,SAAS,EAAE;MAC3B,OAAO,CAAC;IACV;IACA,MAAMO,MAAM,GAAG,IAAAC,eAAQ,EAACH,SAAS,EAAEZ,SAAS,CAACa,KAAK,CAAC,IAAI,CAAC;IACxD,IAAIR,UAAU,KAAKE,SAAS,IAAIH,YAAY,KAAKG,SAAS,EAAE;MAC1DH,YAAY,CAACS,KAAK,GAAGC,MAAM;IAC7B;IACA,OAAOA,MAAM;EACf,CAAC,CAAC;EAEF,MAAME,WAAW,GAAGX,UAAU,IAAIK,iBAAiB;EAEnD,MAAMO,SAAS,GAAG,IAAAN,sCAAe,EAAC,MAAM,CACtC;IAAEO,UAAU,EAAElB,SAAS,CAACa;EAAM,CAAC,EAC/B;IAAER,UAAU,EAAEW,WAAW,CAACH,KAAK,IAAI;EAAE,CAAC,CACvC,CAAC;EACF,oBACE,IAAAjB,WAAA,CAAAuB,IAAA,EAAAvB,WAAA,CAAAwB,QAAA;IAAAC,QAAA,gBACE,IAAAzB,WAAA,CAAA0B,GAAA,EAAC9B,gBAAA,CAAA+B,MAAM;MAACN,SAAS,EAAEA,SAAU;MAACO,EAAE,EAAE,CAAE;MAACC,EAAE,EAAE,CAAE;MAACC,CAAC,EAAEpB,IAAK;MAACL,KAAK,EAAEA;IAAM,CAAE,CAAC,EACpEC,WAAW,KAAKK,SAAS,gBACxB,IAAAX,WAAA,CAAA0B,GAAA,EAAC9B,gBAAA,CAAA+B,MAAM;MACLN,SAAS,EAAEA,SAAU;MACrBO,EAAE,EAAE,CAAE;MACNC,EAAE,EAAE,CAAE;MACNC,CAAC,EAAEpB,IAAK;MACRL,KAAK,EAAEC,WAAY;MACnByB,KAAK,EAAC,QAAQ;MACdxB,WAAW,EAAEA;IAAY,CAC1B,CAAC,GACA,IAAI;EAAA,CACR,CAAC;AAEP,CAAC;AAACyB,OAAA,CAAA9B,MAAA,GAAAA,MAAA","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Dot = void 0;
7
+ var _reactNativeSkia = require("@shopify/react-native-skia");
8
+ var _react = require("react");
9
+ var _reactNativeReanimated = require("react-native-reanimated");
10
+ var _gesture = require("./gesture.js");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function DotComponent(props) {
13
+ const {
14
+ x,
15
+ y,
16
+ opacity = 1,
17
+ r = 4,
18
+ color = 'black',
19
+ fillColor,
20
+ strokeWidth = 2,
21
+ scale,
22
+ focalX,
23
+ offsetX
24
+ } = props;
25
+ const cx = (0, _reactNativeReanimated.useDerivedValue)(() => {
26
+ const _x = typeof x === 'number' ? x : x.value;
27
+ if (scale === undefined || focalX === undefined || offsetX === undefined) return _x;
28
+ return (0, _gesture.getPositionWl)(_x, focalX.value, scale.value, offsetX.value);
29
+ });
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeSkia.Group, {
31
+ opacity: opacity,
32
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Circle, {
33
+ cx: cx,
34
+ cy: y,
35
+ r: r,
36
+ color: fillColor ?? color
37
+ }), fillColor !== undefined ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Circle, {
38
+ cx: cx,
39
+ cy: y,
40
+ r: r,
41
+ style: "stroke",
42
+ color: color,
43
+ strokeWidth: strokeWidth
44
+ }) : null]
45
+ });
46
+ }
47
+
48
+ // Memoized: charts render many dots and the position updates flow through
49
+ // shared values, so parent re-renders don't need to reach them
50
+ const Dot = exports.Dot = /*#__PURE__*/(0, _react.memo)(DotComponent);
51
+ //# sourceMappingURL=Dot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeSkia","require","_react","_reactNativeReanimated","_gesture","_jsxRuntime","DotComponent","props","x","y","opacity","r","color","fillColor","strokeWidth","scale","focalX","offsetX","cx","useDerivedValue","_x","value","undefined","getPositionWl","jsxs","Group","children","jsx","Circle","cy","style","Dot","exports","memo"],"sourceRoot":"../../../src","sources":["Charts/Dot.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AAA0C,IAAAI,WAAA,GAAAJ,OAAA;AAoB1C,SAASK,YAAYA,CAACC,KAAe,EAAE;EACrC,MAAM;IACJC,CAAC;IACDC,CAAC;IACDC,OAAO,GAAG,CAAC;IACXC,CAAC,GAAG,CAAC;IACLC,KAAK,GAAG,OAAO;IACfC,SAAS;IACTC,WAAW,GAAG,CAAC;IACfC,KAAK;IACLC,MAAM;IACNC;EACF,CAAC,GAAGV,KAAK;EAET,MAAMW,EAAE,GAAG,IAAAC,sCAAe,EAAC,MAAM;IAC/B,MAAMC,EAAE,GAAG,OAAOZ,CAAC,KAAK,QAAQ,GAAGA,CAAC,GAAGA,CAAC,CAACa,KAAK;IAC9C,IAAIN,KAAK,KAAKO,SAAS,IAAIN,MAAM,KAAKM,SAAS,IAAIL,OAAO,KAAKK,SAAS,EACtE,OAAOF,EAAE;IACX,OAAO,IAAAG,sBAAa,EAACH,EAAE,EAAEJ,MAAM,CAACK,KAAK,EAAEN,KAAK,CAACM,KAAK,EAAEJ,OAAO,CAACI,KAAK,CAAC;EACpE,CAAC,CAAC;EAEF,oBACE,IAAAhB,WAAA,CAAAmB,IAAA,EAACxB,gBAAA,CAAAyB,KAAK;IAACf,OAAO,EAAEA,OAAQ;IAAAgB,QAAA,gBACtB,IAAArB,WAAA,CAAAsB,GAAA,EAAC3B,gBAAA,CAAA4B,MAAM;MAACV,EAAE,EAAEA,EAAG;MAACW,EAAE,EAAEpB,CAAE;MAACE,CAAC,EAAEA,CAAE;MAACC,KAAK,EAAEC,SAAS,IAAID;IAAM,CAAE,CAAC,EACzDC,SAAS,KAAKS,SAAS,gBACtB,IAAAjB,WAAA,CAAAsB,GAAA,EAAC3B,gBAAA,CAAA4B,MAAM;MACLV,EAAE,EAAEA,EAAG;MACPW,EAAE,EAAEpB,CAAE;MACNE,CAAC,EAAEA,CAAE;MACLmB,KAAK,EAAC,QAAQ;MACdlB,KAAK,EAAEA,KAAM;MACbE,WAAW,EAAEA;IAAY,CAC1B,CAAC,GACA,IAAI;EAAA,CACH,CAAC;AAEZ;;AAEA;AACA;AACO,MAAMiB,GAAG,GAAAC,OAAA,CAAAD,GAAA,gBAAG,IAAAE,WAAI,EAAC3B,YAAY,CAAC","ignoreList":[]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Dots = void 0;
7
+ var _reactNativeSkia = require("@shopify/react-native-skia");
8
+ var _reactNativeReanimated = require("react-native-reanimated");
9
+ var _gesture = require("./gesture.js");
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ /**
12
+ * Draw a whole series of dots as a single Skia path (two with `fillColor`).
13
+ * Unlike mapping over {@link Dot}, this runs one worklet per frame instead of
14
+ * one per dot, which keeps large series smooth during zoom/pan gestures.
15
+ * Per-dot opacity is binary here: dots below 0.5 are hidden.
16
+ */
17
+ const Dots = function (props) {
18
+ const {
19
+ dots,
20
+ r = 4,
21
+ shape = 'circle',
22
+ color = 'black',
23
+ fillColor,
24
+ strokeWidth = 2,
25
+ width,
26
+ scale,
27
+ focalX,
28
+ offsetX
29
+ } = props;
30
+ const path = (0, _reactNativeReanimated.useDerivedValue)(() => {
31
+ const p = _reactNativeSkia.Skia.Path.Make();
32
+ const margin = r + strokeWidth;
33
+ for (const dot of dots) {
34
+ if (dot.opacity.value < 0.5) continue;
35
+ const x = scale === undefined || focalX === undefined || offsetX === undefined ? dot.x.value : (0, _gesture.getPositionWl)(dot.x.value, focalX.value, scale.value, offsetX.value);
36
+ if (width !== undefined && (x < -margin || x > width + margin)) continue;
37
+ const y = dot.y.value;
38
+ if (shape === 'diamond') {
39
+ // One addPoly beats four moveTo/lineTo calls: each is a JSI hop, and
40
+ // this worklet rebuilds every dot on every frame of a gesture
41
+ p.addPoly([{
42
+ x,
43
+ y: y - r
44
+ }, {
45
+ x: x + r,
46
+ y
47
+ }, {
48
+ x,
49
+ y: y + r
50
+ }, {
51
+ x: x - r,
52
+ y
53
+ }], true);
54
+ } else {
55
+ p.addCircle(x, y, r);
56
+ }
57
+ }
58
+ return p;
59
+ });
60
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
61
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Path, {
62
+ path: path,
63
+ color: fillColor ?? color
64
+ }), fillColor !== undefined ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Path, {
65
+ path: path,
66
+ style: "stroke",
67
+ color: color,
68
+ strokeWidth: strokeWidth,
69
+ strokeJoin: "round"
70
+ }) : null]
71
+ });
72
+ };
73
+ exports.Dots = Dots;
74
+ //# sourceMappingURL=Dots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeSkia","require","_reactNativeReanimated","_gesture","_jsxRuntime","Dots","props","dots","r","shape","color","fillColor","strokeWidth","width","scale","focalX","offsetX","path","useDerivedValue","p","Skia","Path","Make","margin","dot","opacity","value","x","undefined","getPositionWl","y","addPoly","addCircle","jsxs","Fragment","children","jsx","style","strokeJoin","exports"],"sourceRoot":"../../../src","sources":["Charts/Dots.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAEA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AAA0C,IAAAG,WAAA,GAAAH,OAAA;AAqB1C;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,IAAmB,GAAG,SAAAA,CAAUC,KAAK,EAAE;EAC3C,MAAM;IACJC,IAAI;IACJC,CAAC,GAAG,CAAC;IACLC,KAAK,GAAG,QAAQ;IAChBC,KAAK,GAAG,OAAO;IACfC,SAAS;IACTC,WAAW,GAAG,CAAC;IACfC,KAAK;IACLC,KAAK;IACLC,MAAM;IACNC;EACF,CAAC,GAAGV,KAAK;EAET,MAAMW,IAAI,GAAG,IAAAC,sCAAe,EAAC,MAAM;IACjC,MAAMC,CAAC,GAAGC,qBAAI,CAACC,IAAI,CAACC,IAAI,CAAC,CAAC;IAC1B,MAAMC,MAAM,GAAGf,CAAC,GAAGI,WAAW;IAC9B,KAAK,MAAMY,GAAG,IAAIjB,IAAI,EAAE;MACtB,IAAIiB,GAAG,CAACC,OAAO,CAACC,KAAK,GAAG,GAAG,EAAE;MAC7B,MAAMC,CAAC,GACLb,KAAK,KAAKc,SAAS,IAAIb,MAAM,KAAKa,SAAS,IAAIZ,OAAO,KAAKY,SAAS,GAChEJ,GAAG,CAACG,CAAC,CAACD,KAAK,GACX,IAAAG,sBAAa,EACXL,GAAG,CAACG,CAAC,CAACD,KAAK,EACXX,MAAM,CAACW,KAAK,EACZZ,KAAK,CAACY,KAAK,EACXV,OAAO,CAACU,KACV,CAAC;MACP,IAAIb,KAAK,KAAKe,SAAS,KAAKD,CAAC,GAAG,CAACJ,MAAM,IAAII,CAAC,GAAGd,KAAK,GAAGU,MAAM,CAAC,EAAE;MAChE,MAAMO,CAAC,GAAGN,GAAG,CAACM,CAAC,CAACJ,KAAK;MACrB,IAAIjB,KAAK,KAAK,SAAS,EAAE;QACvB;QACA;QACAU,CAAC,CAACY,OAAO,CACP,CACE;UAAEJ,CAAC;UAAEG,CAAC,EAAEA,CAAC,GAAGtB;QAAE,CAAC,EACf;UAAEmB,CAAC,EAAEA,CAAC,GAAGnB,CAAC;UAAEsB;QAAE,CAAC,EACf;UAAEH,CAAC;UAAEG,CAAC,EAAEA,CAAC,GAAGtB;QAAE,CAAC,EACf;UAAEmB,CAAC,EAAEA,CAAC,GAAGnB,CAAC;UAAEsB;QAAE,CAAC,CAChB,EACD,IACF,CAAC;MACH,CAAC,MAAM;QACLX,CAAC,CAACa,SAAS,CAACL,CAAC,EAAEG,CAAC,EAAEtB,CAAC,CAAC;MACtB;IACF;IACA,OAAOW,CAAC;EACV,CAAC,CAAC;EAEF,oBACE,IAAAf,WAAA,CAAA6B,IAAA,EAAA7B,WAAA,CAAA8B,QAAA;IAAAC,QAAA,gBACE,IAAA/B,WAAA,CAAAgC,GAAA,EAACpC,gBAAA,CAAAqB,IAAI;MAACJ,IAAI,EAAEA,IAAK;MAACP,KAAK,EAAEC,SAAS,IAAID;IAAM,CAAE,CAAC,EAC9CC,SAAS,KAAKiB,SAAS,gBACtB,IAAAxB,WAAA,CAAAgC,GAAA,EAACpC,gBAAA,CAAAqB,IAAI;MACHJ,IAAI,EAAEA,IAAK;MACXoB,KAAK,EAAC,QAAQ;MACd3B,KAAK,EAAEA,KAAM;MACbE,WAAW,EAAEA,WAAY;MACzB0B,UAAU,EAAC;IAAO,CACnB,CAAC,GACA,IAAI;EAAA,CACR,CAAC;AAEP,CAAC;AAACC,OAAA,CAAAlC,IAAA,GAAAA,IAAA","ignoreList":[]}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getPaddedTicks = exports.YAxis = void 0;
7
+ var _reactNativeSkia = require("@shopify/react-native-skia");
8
+ var _reactNative = require("react-native");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ const defaultFormatLabel = value => `${Math.round(value)}`;
11
+
12
+ /** Evenly spaced integer ticks from 0 to a padded maximum, e.g. 0, 26, 52, 78, 104. */
13
+ const getPaddedTicks = function (maxValue, nbTicks = 4, padding = 1.15) {
14
+ const step = Math.max(1, Math.ceil(maxValue * padding / nbTicks));
15
+ return Array.from({
16
+ length: nbTicks + 1
17
+ }, (_, i) => i * step);
18
+ };
19
+ exports.getPaddedTicks = getPaddedTicks;
20
+ const YAxis = function (props) {
21
+ const {
22
+ width,
23
+ height,
24
+ font,
25
+ minY,
26
+ maxY,
27
+ nbTicks = 4,
28
+ color = 'black',
29
+ labelColor,
30
+ strokeWidth = _reactNative.StyleSheet.hairlineWidth,
31
+ showLabels = true,
32
+ formatLabel = defaultFormatLabel
33
+ } = props;
34
+ const values = props.values ?? Array.from({
35
+ length: nbTicks
36
+ }, (_, i) => minY + (i + 1) * (maxY - minY) / nbTicks);
37
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Group, {
38
+ children: values.map((value, i) => {
39
+ const y = height - (value - minY) * height / (maxY - minY);
40
+ const label = formatLabel(value);
41
+ const labelWidth = font.getGlyphWidths(font.getGlyphIDs(label)).reduce((a, b) => a + b, 0);
42
+ const lineWidth = showLabels ? width - 10 - labelWidth : width;
43
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeSkia.Group, {
44
+ transform: [{
45
+ translateY: y
46
+ }],
47
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Line, {
48
+ p1: (0, _reactNativeSkia.vec)(0, 0),
49
+ p2: (0, _reactNativeSkia.vec)(lineWidth, 0),
50
+ color: color,
51
+ strokeWidth: strokeWidth
52
+ }), showLabels ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeSkia.Text, {
53
+ text: label,
54
+ x: width - labelWidth,
55
+ y: font.getSize() / 2.5,
56
+ font: font,
57
+ color: labelColor ?? color
58
+ }) : null]
59
+ }, `YTick-${i}`);
60
+ })
61
+ });
62
+ };
63
+ exports.YAxis = YAxis;
64
+ //# sourceMappingURL=YAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeSkia","require","_reactNative","_jsxRuntime","defaultFormatLabel","value","Math","round","getPaddedTicks","maxValue","nbTicks","padding","step","max","ceil","Array","from","length","_","i","exports","YAxis","props","width","height","font","minY","maxY","color","labelColor","strokeWidth","StyleSheet","hairlineWidth","showLabels","formatLabel","values","jsx","Group","children","map","y","label","labelWidth","getGlyphWidths","getGlyphIDs","reduce","a","b","lineWidth","jsxs","transform","translateY","Line","p1","vec","p2","Text","text","x","getSize"],"sourceRoot":"../../../src","sources":["Charts/YAxis.tsx"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AASA,IAAAC,YAAA,GAAAD,OAAA;AAA0C,IAAAE,WAAA,GAAAF,OAAA;AAkB1C,MAAMG,kBAAkB,GAAIC,KAAa,IAAK,GAAGC,IAAI,CAACC,KAAK,CAACF,KAAK,CAAC,EAAE;;AAEpE;AACO,MAAMG,cAAc,GAAG,SAAAA,CAC5BC,QAAgB,EAChBC,OAAO,GAAG,CAAC,EACXC,OAAO,GAAG,IAAI,EACJ;EACV,MAAMC,IAAI,GAAGN,IAAI,CAACO,GAAG,CAAC,CAAC,EAAEP,IAAI,CAACQ,IAAI,CAAEL,QAAQ,GAAGE,OAAO,GAAID,OAAO,CAAC,CAAC;EACnE,OAAOK,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAEP,OAAO,GAAG;EAAE,CAAC,EAAE,CAACQ,CAAC,EAAEC,CAAC,KAAKA,CAAC,GAAGP,IAAI,CAAC;AAChE,CAAC;AAACQ,OAAA,CAAAZ,cAAA,GAAAA,cAAA;AAEF,MAAMa,KAAqB,GAAG,SAAAA,CAAUC,KAAK,EAAE;EAC7C,MAAM;IACJC,KAAK;IACLC,MAAM;IACNC,IAAI;IACJC,IAAI;IACJC,IAAI;IACJjB,OAAO,GAAG,CAAC;IACXkB,KAAK,GAAG,OAAO;IACfC,UAAU;IACVC,WAAW,GAAGC,uBAAU,CAACC,aAAa;IACtCC,UAAU,GAAG,IAAI;IACjBC,WAAW,GAAG9B;EAChB,CAAC,GAAGkB,KAAK;EAET,MAAMa,MAAM,GACVb,KAAK,CAACa,MAAM,IACZpB,KAAK,CAACC,IAAI,CACR;IAAEC,MAAM,EAAEP;EAAQ,CAAC,EACnB,CAACQ,CAAC,EAAEC,CAAC,KAAKO,IAAI,GAAI,CAACP,CAAC,GAAG,CAAC,KAAKQ,IAAI,GAAGD,IAAI,CAAC,GAAIhB,OAC/C,CAAC;EAEH,oBACE,IAAAP,WAAA,CAAAiC,GAAA,EAACpC,gBAAA,CAAAqC,KAAK;IAAAC,QAAA,EACHH,MAAM,CAACI,GAAG,CAAC,CAAClC,KAAK,EAAEc,CAAC,KAAK;MACxB,MAAMqB,CAAC,GAAGhB,MAAM,GAAI,CAACnB,KAAK,GAAGqB,IAAI,IAAIF,MAAM,IAAKG,IAAI,GAAGD,IAAI,CAAC;MAC5D,MAAMe,KAAK,GAAGP,WAAW,CAAC7B,KAAK,CAAC;MAChC,MAAMqC,UAAU,GAAGjB,IAAI,CACpBkB,cAAc,CAAClB,IAAI,CAACmB,WAAW,CAACH,KAAK,CAAC,CAAC,CACvCI,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,EAAE,CAAC,CAAC;MAC7B,MAAMC,SAAS,GAAGf,UAAU,GAAGV,KAAK,GAAG,EAAE,GAAGmB,UAAU,GAAGnB,KAAK;MAE9D,oBACE,IAAApB,WAAA,CAAA8C,IAAA,EAACjD,gBAAA,CAAAqC,KAAK;QAAoBa,SAAS,EAAE,CAAC;UAAEC,UAAU,EAAEX;QAAE,CAAC,CAAE;QAAAF,QAAA,gBACvD,IAAAnC,WAAA,CAAAiC,GAAA,EAACpC,gBAAA,CAAAoD,IAAI;UACHC,EAAE,EAAE,IAAAC,oBAAG,EAAC,CAAC,EAAE,CAAC,CAAE;UACdC,EAAE,EAAE,IAAAD,oBAAG,EAACN,SAAS,EAAE,CAAC,CAAE;UACtBpB,KAAK,EAAEA,KAAM;UACbE,WAAW,EAAEA;QAAY,CAC1B,CAAC,EACDG,UAAU,gBACT,IAAA9B,WAAA,CAAAiC,GAAA,EAACpC,gBAAA,CAAAwD,IAAI;UACHC,IAAI,EAAEhB,KAAM;UACZiB,CAAC,EAAEnC,KAAK,GAAGmB,UAAW;UACtBF,CAAC,EAAEf,IAAI,CAACkC,OAAO,CAAC,CAAC,GAAG,GAAI;UACxBlC,IAAI,EAAEA,IAAK;UACXG,KAAK,EAAEC,UAAU,IAAID;QAAM,CAC5B,CAAC,GACA,IAAI;MAAA,GAfE,SAAST,CAAC,EAgBf,CAAC;IAEZ,CAAC;EAAC,CACG,CAAC;AAEZ,CAAC;AAACC,OAAA,CAAAC,KAAA,GAAAA,KAAA","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useUpdateAxis = exports.useScalableGesture = exports.useCursorGesture = exports.getPositionWl = exports.getClosestPoint = void 0;
6
+ exports.useUpdateAxis = exports.useScalableGesture = exports.useCursorGesture = exports.getPositionWl = exports.getOffsetBoundsWl = exports.getClosestPoint = void 0;
7
7
  var _reactNativeSkia = require("@shopify/react-native-skia");
8
8
  var _react = require("react");
9
9
  var _reactNativeGestureHandler = require("react-native-gesture-handler");
@@ -18,7 +18,21 @@ const getPositionWl = function (position, focalX, scale, offsetX) {
18
18
 
19
19
  return (position - focalX) * scale + focalX + offsetX;
20
20
  };
21
+
22
+ /**
23
+ * Offset range keeping the content edges pinned to the viewport:
24
+ * leftBound (position 0) <= startOffset and rightBound (position width)
25
+ * >= width + startOffset. Collapses to [startOffset, startOffset] at scale 1.
26
+ */
21
27
  exports.getPositionWl = getPositionWl;
28
+ const getOffsetBoundsWl = function (width, startOffset, focalX, scale) {
29
+ 'worklet';
30
+
31
+ const maxOffset = startOffset + focalX * (scale - 1);
32
+ const minOffset = startOffset + (1 - scale) * (width - focalX);
33
+ return [minOffset, maxOffset];
34
+ };
35
+ exports.getOffsetBoundsWl = getOffsetBoundsWl;
22
36
  /**
23
37
  * Return utilities for zooming and panning the axis
24
38
  */
@@ -37,6 +51,8 @@ const useScalableGesture = props => {
37
51
  // For panning
38
52
  const offsetX = (0, _reactNativeReanimated.useSharedValue)(startOffset);
39
53
  const lastOffsetX = (0, _reactNativeReanimated.useSharedValue)(startOffset);
54
+ // Pinch pivot bookkeeping (see pinchGesture)
55
+ const needsPivot = (0, _reactNativeReanimated.useSharedValue)(true);
40
56
  const reset = (0, _react.useCallback)(() => {
41
57
  scale.value = startScale;
42
58
  lastScale.value = startScale;
@@ -45,37 +61,56 @@ const useScalableGesture = props => {
45
61
  offsetX.value = startOffset;
46
62
  lastOffsetX.value = startOffset;
47
63
  }, [focalX, lastFocalX, lastOffsetX, lastScale, offsetX, scale, startOffset, startScale]);
48
- const panGesture = _reactNativeGestureHandler.Gesture.Pan().onUpdate(event => {
49
- const newOffsetX = lastOffsetX.value + event.translationX;
50
- offsetX.value = newOffsetX;
64
+
65
+ // Memoized: handing a new gesture instance to GestureDetector mid-gesture
66
+ // resets the active pan and makes the chart jump
67
+ const panGesture = (0, _react.useMemo)(() => _reactNativeGestureHandler.Gesture.Pan()
68
+ // Single-finger only: two fingers belong to the pinch, whose focal
69
+ // rebase would otherwise fight the pan over offsetX
70
+ .maxPointers(1)
71
+ // Incremental deltas (changeX) with a live clamp keep the content
72
+ // edges pinned: no overscroll, no snap-back to interrupt
73
+ .onChange(event => {
74
+ const [minOffset, maxOffset] = getOffsetBoundsWl(width, startOffset, focalX.value, scale.value);
75
+ offsetX.value = (0, _reactNativeSkia.clamp)(offsetX.value + event.changeX, minOffset, maxOffset);
51
76
  }).onEnd(() => {
52
77
  lastScale.value = scale.value;
53
78
  lastFocalX.value = focalX.value;
54
- const leftBound = getPositionWl(0, focalX.value, scale.value, offsetX.value);
55
- const rightBound = getPositionWl(width, focalX.value, scale.value, offsetX.value);
56
- let newOffset;
57
- if (leftBound > startOffset) {
58
- newOffset = offsetX.value - leftBound + startOffset;
59
- } else if (rightBound < width + startOffset) {
60
- newOffset = offsetX.value + width - rightBound + startOffset;
79
+ lastOffsetX.value = offsetX.value;
80
+ }), [focalX, lastFocalX, lastOffsetX, lastScale, offsetX, scale, startOffset, width]);
81
+ const pinchGesture = (0, _react.useMemo)(() => _reactNativeGestureHandler.Gesture.Pinch().onStart(() => {
82
+ needsPivot.value = true;
83
+ }).onUpdate(event => {
84
+ // The pinch can keep firing in the single-finger tail of the
85
+ // gesture, tracking the remaining finger as its focal: ignore it
86
+ // (numberOfPointers is missing on web — let those through)
87
+ if ((event.numberOfPointers ?? 2) < 2) {
88
+ needsPivot.value = true;
89
+ return;
90
+ }
91
+ const prevScale = scale.value;
92
+ const newScale = (0, _reactNativeSkia.clamp)(lastScale.value * event.scale, 1, Infinity);
93
+ if (needsPivot.value) {
94
+ // New pivot: rebase offsetX so re-anchoring under the fingers
95
+ // doesn't shift the content
96
+ const rebased = offsetX.value + (focalX.value - event.focalX) * (1 - prevScale);
97
+ offsetX.value = rebased * newScale / prevScale;
98
+ needsPivot.value = false;
61
99
  } else {
62
- newOffset = offsetX.value;
100
+ // Keep the content glued to both fingers: the offset follows the
101
+ // focal translation and rescales with the zoom
102
+ offsetX.value = (event.focalX - focalX.value + offsetX.value / prevScale) * newScale;
63
103
  }
64
- offsetX.value = (0, _reactNativeReanimated.withTiming)(newOffset, {
65
- duration: 300
66
- });
67
- lastOffsetX.value = newOffset;
68
- });
69
- const pinchGesture = _reactNativeGestureHandler.Gesture.Pinch().onUpdate(event => {
70
- // Rebase offsetX so moving the focal point doesn't shift the content
71
- offsetX.value += (focalX.value - event.focalX) * (1 - scale.value);
72
104
  focalX.value = event.focalX;
73
- scale.value = (0, _reactNativeSkia.clamp)(lastScale.value * event.scale, 1, Infinity);
105
+ scale.value = newScale;
106
+ // Zooming moves the bounds: keep the content edges pinned
107
+ const [minOffset, maxOffset] = getOffsetBoundsWl(width, startOffset, focalX.value, scale.value);
108
+ offsetX.value = (0, _reactNativeSkia.clamp)(offsetX.value, minOffset, maxOffset);
74
109
  }).onEnd(() => {
75
110
  lastScale.value = scale.value;
76
111
  lastFocalX.value = focalX.value;
77
112
  lastOffsetX.value = offsetX.value;
78
- });
113
+ }), [focalX, lastFocalX, lastOffsetX, lastScale, needsPivot, offsetX, scale, startOffset, width]);
79
114
  return {
80
115
  scale,
81
116
  focalX,
@@ -93,6 +128,14 @@ const useUpdateAxis = function (props) {
93
128
  onScaleChange
94
129
  } = props;
95
130
  const currentIndex = (0, _reactNativeReanimated.useSharedValue)(0);
131
+
132
+ // Stable dispatcher so an inline onScaleChange doesn't re-register the
133
+ // reaction (and disturb the UI thread) on every render
134
+ const onScaleChangeRef = (0, _react.useRef)(onScaleChange);
135
+ onScaleChangeRef.current = onScaleChange;
136
+ const dispatchScaleChange = (0, _react.useCallback)(index => {
137
+ onScaleChangeRef.current?.(index);
138
+ }, []);
96
139
  (0, _reactNativeReanimated.useAnimatedReaction)(() => scale.value, (currentScale, _) => {
97
140
  for (let i = 0; i < scales.length; i++) {
98
141
  const _prevScale = scales[i - 1] ?? 0;
@@ -100,11 +143,11 @@ const useUpdateAxis = function (props) {
100
143
  if (_curScale === undefined || _prevScale === undefined) throw new Error('Got undefined scale');
101
144
  if (currentScale >= _prevScale && currentScale < _curScale && currentIndex.value !== i) {
102
145
  currentIndex.value = i;
103
- if (onScaleChange !== undefined) (0, _reactNativeWorklets.scheduleOnRN)(onScaleChange, i);
146
+ (0, _reactNativeWorklets.scheduleOnRN)(dispatchScaleChange, i);
104
147
  break;
105
148
  }
106
149
  }
107
- });
150
+ }, [scales, dispatchScaleChange]);
108
151
  return {
109
152
  currentIndex
110
153
  };