react-native-image-editor-skia 0.1.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 (299) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/lib/commonjs/ImageEditor.js +141 -0
  4. package/lib/commonjs/ImageEditor.js.map +1 -0
  5. package/lib/commonjs/annotations/AnnotationView.js +42 -0
  6. package/lib/commonjs/annotations/AnnotationView.js.map +1 -0
  7. package/lib/commonjs/annotations/ArrowAnnotation.js +29 -0
  8. package/lib/commonjs/annotations/ArrowAnnotation.js.map +1 -0
  9. package/lib/commonjs/annotations/CircleAnnotation.js +31 -0
  10. package/lib/commonjs/annotations/CircleAnnotation.js.map +1 -0
  11. package/lib/commonjs/annotations/FreehandAnnotation.js +29 -0
  12. package/lib/commonjs/annotations/FreehandAnnotation.js.map +1 -0
  13. package/lib/commonjs/annotations/MarkerAnnotation.js +27 -0
  14. package/lib/commonjs/annotations/MarkerAnnotation.js.map +1 -0
  15. package/lib/commonjs/annotations/RotatedGroup.js +34 -0
  16. package/lib/commonjs/annotations/RotatedGroup.js.map +1 -0
  17. package/lib/commonjs/annotations/TextAnnotation.js +40 -0
  18. package/lib/commonjs/annotations/TextAnnotation.js.map +1 -0
  19. package/lib/commonjs/annotations/geometry.js +73 -0
  20. package/lib/commonjs/annotations/geometry.js.map +1 -0
  21. package/lib/commonjs/annotations/geometryPure.js +104 -0
  22. package/lib/commonjs/annotations/geometryPure.js.map +1 -0
  23. package/lib/commonjs/canvas/AnnotationLayer.js +58 -0
  24. package/lib/commonjs/canvas/AnnotationLayer.js.map +1 -0
  25. package/lib/commonjs/canvas/BaseImageLayer.js +27 -0
  26. package/lib/commonjs/canvas/BaseImageLayer.js.map +1 -0
  27. package/lib/commonjs/canvas/CropOverlay.js +135 -0
  28. package/lib/commonjs/canvas/CropOverlay.js.map +1 -0
  29. package/lib/commonjs/canvas/EditorCanvas.js +91 -0
  30. package/lib/commonjs/canvas/EditorCanvas.js.map +1 -0
  31. package/lib/commonjs/canvas/InFlightLayer.js +152 -0
  32. package/lib/commonjs/canvas/InFlightLayer.js.map +1 -0
  33. package/lib/commonjs/canvas/SelectionOverlay.js +90 -0
  34. package/lib/commonjs/canvas/SelectionOverlay.js.map +1 -0
  35. package/lib/commonjs/constants.js +56 -0
  36. package/lib/commonjs/constants.js.map +1 -0
  37. package/lib/commonjs/context/EditorContext.js +132 -0
  38. package/lib/commonjs/context/EditorContext.js.map +1 -0
  39. package/lib/commonjs/export/drawScene.js +97 -0
  40. package/lib/commonjs/export/drawScene.js.map +1 -0
  41. package/lib/commonjs/export/exportImage.js +92 -0
  42. package/lib/commonjs/export/exportImage.js.map +1 -0
  43. package/lib/commonjs/gestures/applyTransform.js +79 -0
  44. package/lib/commonjs/gestures/applyTransform.js.map +1 -0
  45. package/lib/commonjs/gestures/createAnnotation.js +73 -0
  46. package/lib/commonjs/gestures/createAnnotation.js.map +1 -0
  47. package/lib/commonjs/gestures/handles.js +53 -0
  48. package/lib/commonjs/gestures/handles.js.map +1 -0
  49. package/lib/commonjs/gestures/hitTest.js +72 -0
  50. package/lib/commonjs/gestures/hitTest.js.map +1 -0
  51. package/lib/commonjs/gestures/useCropGesture.js +149 -0
  52. package/lib/commonjs/gestures/useCropGesture.js.map +1 -0
  53. package/lib/commonjs/gestures/useEditorGestures.js +289 -0
  54. package/lib/commonjs/gestures/useEditorGestures.js.map +1 -0
  55. package/lib/commonjs/image/disposeRegistry.js +63 -0
  56. package/lib/commonjs/image/disposeRegistry.js.map +1 -0
  57. package/lib/commonjs/image/useLoadedImage.js +121 -0
  58. package/lib/commonjs/image/useLoadedImage.js.map +1 -0
  59. package/lib/commonjs/index.js +52 -0
  60. package/lib/commonjs/index.js.map +1 -0
  61. package/lib/commonjs/package.json +1 -0
  62. package/lib/commonjs/state/history.js +85 -0
  63. package/lib/commonjs/state/history.js.map +1 -0
  64. package/lib/commonjs/state/selectors.js +19 -0
  65. package/lib/commonjs/state/selectors.js.map +1 -0
  66. package/lib/commonjs/state/useEditorReducer.js +83 -0
  67. package/lib/commonjs/state/useEditorReducer.js.map +1 -0
  68. package/lib/commonjs/toolbar/ColorPicker.js +84 -0
  69. package/lib/commonjs/toolbar/ColorPicker.js.map +1 -0
  70. package/lib/commonjs/toolbar/CropControls.js +65 -0
  71. package/lib/commonjs/toolbar/CropControls.js.map +1 -0
  72. package/lib/commonjs/toolbar/RotationSlider.js +73 -0
  73. package/lib/commonjs/toolbar/RotationSlider.js.map +1 -0
  74. package/lib/commonjs/toolbar/TextInputOverlay.js +108 -0
  75. package/lib/commonjs/toolbar/TextInputOverlay.js.map +1 -0
  76. package/lib/commonjs/toolbar/ToolButton.js +56 -0
  77. package/lib/commonjs/toolbar/ToolButton.js.map +1 -0
  78. package/lib/commonjs/toolbar/Toolbar.js +137 -0
  79. package/lib/commonjs/toolbar/Toolbar.js.map +1 -0
  80. package/lib/commonjs/types.js +47 -0
  81. package/lib/commonjs/types.js.map +1 -0
  82. package/lib/commonjs/utils/color.js +37 -0
  83. package/lib/commonjs/utils/color.js.map +1 -0
  84. package/lib/commonjs/utils/id.js +14 -0
  85. package/lib/commonjs/utils/id.js.map +1 -0
  86. package/lib/commonjs/utils/math.js +277 -0
  87. package/lib/commonjs/utils/math.js.map +1 -0
  88. package/lib/module/ImageEditor.js +138 -0
  89. package/lib/module/ImageEditor.js.map +1 -0
  90. package/lib/module/annotations/AnnotationView.js +39 -0
  91. package/lib/module/annotations/AnnotationView.js.map +1 -0
  92. package/lib/module/annotations/ArrowAnnotation.js +26 -0
  93. package/lib/module/annotations/ArrowAnnotation.js.map +1 -0
  94. package/lib/module/annotations/CircleAnnotation.js +27 -0
  95. package/lib/module/annotations/CircleAnnotation.js.map +1 -0
  96. package/lib/module/annotations/FreehandAnnotation.js +25 -0
  97. package/lib/module/annotations/FreehandAnnotation.js.map +1 -0
  98. package/lib/module/annotations/MarkerAnnotation.js +23 -0
  99. package/lib/module/annotations/MarkerAnnotation.js.map +1 -0
  100. package/lib/module/annotations/RotatedGroup.js +29 -0
  101. package/lib/module/annotations/RotatedGroup.js.map +1 -0
  102. package/lib/module/annotations/TextAnnotation.js +37 -0
  103. package/lib/module/annotations/TextAnnotation.js.map +1 -0
  104. package/lib/module/annotations/geometry.js +56 -0
  105. package/lib/module/annotations/geometry.js.map +1 -0
  106. package/lib/module/annotations/geometryPure.js +100 -0
  107. package/lib/module/annotations/geometryPure.js.map +1 -0
  108. package/lib/module/canvas/AnnotationLayer.js +55 -0
  109. package/lib/module/canvas/AnnotationLayer.js.map +1 -0
  110. package/lib/module/canvas/BaseImageLayer.js +23 -0
  111. package/lib/module/canvas/BaseImageLayer.js.map +1 -0
  112. package/lib/module/canvas/CropOverlay.js +131 -0
  113. package/lib/module/canvas/CropOverlay.js.map +1 -0
  114. package/lib/module/canvas/EditorCanvas.js +88 -0
  115. package/lib/module/canvas/EditorCanvas.js.map +1 -0
  116. package/lib/module/canvas/InFlightLayer.js +149 -0
  117. package/lib/module/canvas/InFlightLayer.js.map +1 -0
  118. package/lib/module/canvas/SelectionOverlay.js +85 -0
  119. package/lib/module/canvas/SelectionOverlay.js.map +1 -0
  120. package/lib/module/constants.js +52 -0
  121. package/lib/module/constants.js.map +1 -0
  122. package/lib/module/context/EditorContext.js +126 -0
  123. package/lib/module/context/EditorContext.js.map +1 -0
  124. package/lib/module/export/drawScene.js +93 -0
  125. package/lib/module/export/drawScene.js.map +1 -0
  126. package/lib/module/export/exportImage.js +88 -0
  127. package/lib/module/export/exportImage.js.map +1 -0
  128. package/lib/module/gestures/applyTransform.js +75 -0
  129. package/lib/module/gestures/applyTransform.js.map +1 -0
  130. package/lib/module/gestures/createAnnotation.js +65 -0
  131. package/lib/module/gestures/createAnnotation.js.map +1 -0
  132. package/lib/module/gestures/handles.js +49 -0
  133. package/lib/module/gestures/handles.js.map +1 -0
  134. package/lib/module/gestures/hitTest.js +69 -0
  135. package/lib/module/gestures/hitTest.js.map +1 -0
  136. package/lib/module/gestures/useCropGesture.js +145 -0
  137. package/lib/module/gestures/useCropGesture.js.map +1 -0
  138. package/lib/module/gestures/useEditorGestures.js +285 -0
  139. package/lib/module/gestures/useEditorGestures.js.map +1 -0
  140. package/lib/module/image/disposeRegistry.js +57 -0
  141. package/lib/module/image/disposeRegistry.js.map +1 -0
  142. package/lib/module/image/useLoadedImage.js +117 -0
  143. package/lib/module/image/useLoadedImage.js.map +1 -0
  144. package/lib/module/index.js +8 -0
  145. package/lib/module/index.js.map +1 -0
  146. package/lib/module/package.json +1 -0
  147. package/lib/module/state/history.js +76 -0
  148. package/lib/module/state/history.js.map +1 -0
  149. package/lib/module/state/selectors.js +14 -0
  150. package/lib/module/state/selectors.js.map +1 -0
  151. package/lib/module/state/useEditorReducer.js +79 -0
  152. package/lib/module/state/useEditorReducer.js.map +1 -0
  153. package/lib/module/toolbar/ColorPicker.js +80 -0
  154. package/lib/module/toolbar/ColorPicker.js.map +1 -0
  155. package/lib/module/toolbar/CropControls.js +62 -0
  156. package/lib/module/toolbar/CropControls.js.map +1 -0
  157. package/lib/module/toolbar/RotationSlider.js +69 -0
  158. package/lib/module/toolbar/RotationSlider.js.map +1 -0
  159. package/lib/module/toolbar/TextInputOverlay.js +105 -0
  160. package/lib/module/toolbar/TextInputOverlay.js.map +1 -0
  161. package/lib/module/toolbar/ToolButton.js +52 -0
  162. package/lib/module/toolbar/ToolButton.js.map +1 -0
  163. package/lib/module/toolbar/Toolbar.js +133 -0
  164. package/lib/module/toolbar/Toolbar.js.map +1 -0
  165. package/lib/module/types.js +43 -0
  166. package/lib/module/types.js.map +1 -0
  167. package/lib/module/utils/color.js +33 -0
  168. package/lib/module/utils/color.js.map +1 -0
  169. package/lib/module/utils/id.js +10 -0
  170. package/lib/module/utils/id.js.map +1 -0
  171. package/lib/module/utils/math.js +258 -0
  172. package/lib/module/utils/math.js.map +1 -0
  173. package/lib/typescript/src/ImageEditor.d.ts +9 -0
  174. package/lib/typescript/src/ImageEditor.d.ts.map +1 -0
  175. package/lib/typescript/src/annotations/AnnotationView.d.ts +6 -0
  176. package/lib/typescript/src/annotations/AnnotationView.d.ts.map +1 -0
  177. package/lib/typescript/src/annotations/ArrowAnnotation.d.ts +5 -0
  178. package/lib/typescript/src/annotations/ArrowAnnotation.d.ts.map +1 -0
  179. package/lib/typescript/src/annotations/CircleAnnotation.d.ts +5 -0
  180. package/lib/typescript/src/annotations/CircleAnnotation.d.ts.map +1 -0
  181. package/lib/typescript/src/annotations/FreehandAnnotation.d.ts +5 -0
  182. package/lib/typescript/src/annotations/FreehandAnnotation.d.ts.map +1 -0
  183. package/lib/typescript/src/annotations/MarkerAnnotation.d.ts +5 -0
  184. package/lib/typescript/src/annotations/MarkerAnnotation.d.ts.map +1 -0
  185. package/lib/typescript/src/annotations/RotatedGroup.d.ts +13 -0
  186. package/lib/typescript/src/annotations/RotatedGroup.d.ts.map +1 -0
  187. package/lib/typescript/src/annotations/TextAnnotation.d.ts +10 -0
  188. package/lib/typescript/src/annotations/TextAnnotation.d.ts.map +1 -0
  189. package/lib/typescript/src/annotations/geometry.d.ts +11 -0
  190. package/lib/typescript/src/annotations/geometry.d.ts.map +1 -0
  191. package/lib/typescript/src/annotations/geometryPure.d.ts +14 -0
  192. package/lib/typescript/src/annotations/geometryPure.d.ts.map +1 -0
  193. package/lib/typescript/src/canvas/AnnotationLayer.d.ts +11 -0
  194. package/lib/typescript/src/canvas/AnnotationLayer.d.ts.map +1 -0
  195. package/lib/typescript/src/canvas/BaseImageLayer.d.ts +12 -0
  196. package/lib/typescript/src/canvas/BaseImageLayer.d.ts.map +1 -0
  197. package/lib/typescript/src/canvas/CropOverlay.d.ts +10 -0
  198. package/lib/typescript/src/canvas/CropOverlay.d.ts.map +1 -0
  199. package/lib/typescript/src/canvas/EditorCanvas.d.ts +18 -0
  200. package/lib/typescript/src/canvas/EditorCanvas.d.ts.map +1 -0
  201. package/lib/typescript/src/canvas/InFlightLayer.d.ts +12 -0
  202. package/lib/typescript/src/canvas/InFlightLayer.d.ts.map +1 -0
  203. package/lib/typescript/src/canvas/SelectionOverlay.d.ts +11 -0
  204. package/lib/typescript/src/canvas/SelectionOverlay.d.ts.map +1 -0
  205. package/lib/typescript/src/constants.d.ts +25 -0
  206. package/lib/typescript/src/constants.d.ts.map +1 -0
  207. package/lib/typescript/src/context/EditorContext.d.ts +66 -0
  208. package/lib/typescript/src/context/EditorContext.d.ts.map +1 -0
  209. package/lib/typescript/src/export/drawScene.d.ts +10 -0
  210. package/lib/typescript/src/export/drawScene.d.ts.map +1 -0
  211. package/lib/typescript/src/export/exportImage.d.ts +23 -0
  212. package/lib/typescript/src/export/exportImage.d.ts.map +1 -0
  213. package/lib/typescript/src/gestures/applyTransform.d.ts +17 -0
  214. package/lib/typescript/src/gestures/applyTransform.d.ts.map +1 -0
  215. package/lib/typescript/src/gestures/createAnnotation.d.ts +11 -0
  216. package/lib/typescript/src/gestures/createAnnotation.d.ts.map +1 -0
  217. package/lib/typescript/src/gestures/handles.d.ts +17 -0
  218. package/lib/typescript/src/gestures/handles.d.ts.map +1 -0
  219. package/lib/typescript/src/gestures/hitTest.d.ts +9 -0
  220. package/lib/typescript/src/gestures/hitTest.d.ts.map +1 -0
  221. package/lib/typescript/src/gestures/useCropGesture.d.ts +7 -0
  222. package/lib/typescript/src/gestures/useCropGesture.d.ts.map +1 -0
  223. package/lib/typescript/src/gestures/useEditorGestures.d.ts +8 -0
  224. package/lib/typescript/src/gestures/useEditorGestures.d.ts.map +1 -0
  225. package/lib/typescript/src/image/disposeRegistry.d.ts +25 -0
  226. package/lib/typescript/src/image/disposeRegistry.d.ts.map +1 -0
  227. package/lib/typescript/src/image/useLoadedImage.d.ts +23 -0
  228. package/lib/typescript/src/image/useLoadedImage.d.ts.map +1 -0
  229. package/lib/typescript/src/index.d.ts +6 -0
  230. package/lib/typescript/src/index.d.ts.map +1 -0
  231. package/lib/typescript/src/state/history.d.ts +23 -0
  232. package/lib/typescript/src/state/history.d.ts.map +1 -0
  233. package/lib/typescript/src/state/selectors.d.ts +5 -0
  234. package/lib/typescript/src/state/selectors.d.ts.map +1 -0
  235. package/lib/typescript/src/state/useEditorReducer.d.ts +32 -0
  236. package/lib/typescript/src/state/useEditorReducer.d.ts.map +1 -0
  237. package/lib/typescript/src/toolbar/ColorPicker.d.ts +7 -0
  238. package/lib/typescript/src/toolbar/ColorPicker.d.ts.map +1 -0
  239. package/lib/typescript/src/toolbar/CropControls.d.ts +3 -0
  240. package/lib/typescript/src/toolbar/CropControls.d.ts.map +1 -0
  241. package/lib/typescript/src/toolbar/RotationSlider.d.ts +8 -0
  242. package/lib/typescript/src/toolbar/RotationSlider.d.ts.map +1 -0
  243. package/lib/typescript/src/toolbar/TextInputOverlay.d.ts +9 -0
  244. package/lib/typescript/src/toolbar/TextInputOverlay.d.ts.map +1 -0
  245. package/lib/typescript/src/toolbar/ToolButton.d.ts +7 -0
  246. package/lib/typescript/src/toolbar/ToolButton.d.ts.map +1 -0
  247. package/lib/typescript/src/toolbar/Toolbar.d.ts +4 -0
  248. package/lib/typescript/src/toolbar/Toolbar.d.ts.map +1 -0
  249. package/lib/typescript/src/types.d.ts +170 -0
  250. package/lib/typescript/src/types.d.ts.map +1 -0
  251. package/lib/typescript/src/utils/color.d.ts +8 -0
  252. package/lib/typescript/src/utils/color.d.ts.map +1 -0
  253. package/lib/typescript/src/utils/id.d.ts +3 -0
  254. package/lib/typescript/src/utils/id.d.ts.map +1 -0
  255. package/lib/typescript/src/utils/math.d.ts +68 -0
  256. package/lib/typescript/src/utils/math.d.ts.map +1 -0
  257. package/package.json +90 -0
  258. package/src/ImageEditor.tsx +133 -0
  259. package/src/annotations/AnnotationView.tsx +24 -0
  260. package/src/annotations/ArrowAnnotation.tsx +26 -0
  261. package/src/annotations/CircleAnnotation.tsx +22 -0
  262. package/src/annotations/FreehandAnnotation.tsx +22 -0
  263. package/src/annotations/MarkerAnnotation.tsx +20 -0
  264. package/src/annotations/RotatedGroup.tsx +28 -0
  265. package/src/annotations/TextAnnotation.tsx +42 -0
  266. package/src/annotations/geometry.ts +62 -0
  267. package/src/annotations/geometryPure.ts +73 -0
  268. package/src/canvas/AnnotationLayer.tsx +43 -0
  269. package/src/canvas/BaseImageLayer.tsx +28 -0
  270. package/src/canvas/CropOverlay.tsx +92 -0
  271. package/src/canvas/EditorCanvas.tsx +70 -0
  272. package/src/canvas/InFlightLayer.tsx +140 -0
  273. package/src/canvas/SelectionOverlay.tsx +92 -0
  274. package/src/constants.ts +46 -0
  275. package/src/context/EditorContext.tsx +229 -0
  276. package/src/export/drawScene.ts +120 -0
  277. package/src/export/exportImage.ts +111 -0
  278. package/src/gestures/applyTransform.ts +76 -0
  279. package/src/gestures/createAnnotation.ts +92 -0
  280. package/src/gestures/handles.ts +50 -0
  281. package/src/gestures/hitTest.ts +79 -0
  282. package/src/gestures/useCropGesture.ts +123 -0
  283. package/src/gestures/useEditorGestures.ts +308 -0
  284. package/src/image/disposeRegistry.ts +59 -0
  285. package/src/image/useLoadedImage.ts +131 -0
  286. package/src/index.ts +32 -0
  287. package/src/state/history.ts +71 -0
  288. package/src/state/selectors.ts +16 -0
  289. package/src/state/useEditorReducer.ts +93 -0
  290. package/src/toolbar/ColorPicker.tsx +72 -0
  291. package/src/toolbar/CropControls.tsx +46 -0
  292. package/src/toolbar/RotationSlider.tsx +56 -0
  293. package/src/toolbar/TextInputOverlay.tsx +104 -0
  294. package/src/toolbar/ToolButton.tsx +46 -0
  295. package/src/toolbar/Toolbar.tsx +110 -0
  296. package/src/types.ts +203 -0
  297. package/src/utils/color.ts +34 -0
  298. package/src/utils/id.ts +7 -0
  299. package/src/utils/math.ts +222 -0
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useEditorGestures = useEditorGestures;
7
+ var _react = require("react");
8
+ var _reactNativeGestureHandler = require("react-native-gesture-handler");
9
+ var _reactNativeReanimated = require("react-native-reanimated");
10
+ var _EditorContext = require("../context/EditorContext");
11
+ var _constants = require("../constants");
12
+ var _math = require("../utils/math");
13
+ var _geometry = require("../annotations/geometry");
14
+ var _hitTest = require("./hitTest");
15
+ var _handles = require("./handles");
16
+ var _applyTransform = require("./applyTransform");
17
+ var _createAnnotation = require("./createAnnotation");
18
+ function isDrawTool(tool) {
19
+ 'worklet';
20
+
21
+ return tool === 'circle' || tool === 'arrow' || tool === 'marker' || tool === 'freehand';
22
+ }
23
+
24
+ /**
25
+ * A single composed Pan gesture over the canvas. It branches on the active tool
26
+ * and, in select mode, on where the touch began (rotate handle → rotate, corner
27
+ * handle → resize, body → move, empty → (de)select). All geometry math runs on
28
+ * the UI thread; only final commits hop to JS via runOnJS.
29
+ */
30
+ function useEditorGestures() {
31
+ const editor = (0, _EditorContext.useEditor)();
32
+ const {
33
+ tool,
34
+ selectedId,
35
+ annotations,
36
+ matrix,
37
+ draw,
38
+ live,
39
+ strokeColor,
40
+ strokeWidth,
41
+ dispatch,
42
+ setSelectedId,
43
+ setEditingTextId
44
+ } = editor;
45
+ const invMatrix = (0, _react.useMemo)(() => (0, _math.invert)(matrix), [matrix]);
46
+ const scaleFactor = (0, _react.useMemo)(() => Math.hypot(matrix.a, matrix.b) || 1, [matrix]);
47
+ const slopImage = _constants.HIT_SLOP / scaleFactor;
48
+
49
+ // Per-gesture UI-thread scratch state.
50
+ const mode = (0, _reactNativeReanimated.useSharedValue)('none');
51
+ const startImg = (0, _reactNativeReanimated.useSharedValue)({
52
+ x: 0,
53
+ y: 0
54
+ });
55
+ const startDist = (0, _reactNativeReanimated.useSharedValue)(0);
56
+ const startAngle = (0, _reactNativeReanimated.useSharedValue)(0);
57
+ const activeId = (0, _reactNativeReanimated.useSharedValue)(null);
58
+
59
+ // ---- JS-thread commit callbacks --------------------------------------
60
+ const selectId = id => setSelectedId(id);
61
+ const commitCircle = (center, radius) => dispatch({
62
+ type: 'ADD_ANNOTATION',
63
+ annotation: (0, _createAnnotation.makeCircle)(center, radius, {
64
+ strokeColor,
65
+ strokeWidth
66
+ })
67
+ });
68
+ const commitArrow = (start, end) => dispatch({
69
+ type: 'ADD_ANNOTATION',
70
+ annotation: (0, _createAnnotation.makeArrow)(start, end, {
71
+ strokeColor,
72
+ strokeWidth
73
+ })
74
+ });
75
+ const commitMarker = rect => dispatch({
76
+ type: 'ADD_ANNOTATION',
77
+ annotation: (0, _createAnnotation.makeMarker)(rect, strokeColor)
78
+ });
79
+ const commitFreehand = points => dispatch({
80
+ type: 'ADD_ANNOTATION',
81
+ annotation: (0, _createAnnotation.makeFreehand)(points, {
82
+ strokeColor,
83
+ strokeWidth
84
+ })
85
+ });
86
+ const placeText = origin => {
87
+ const annotation = (0, _createAnnotation.makeText)(origin, editor.textColor);
88
+ dispatch({
89
+ type: 'ADD_ANNOTATION',
90
+ annotation
91
+ });
92
+ setSelectedId(annotation.id);
93
+ setEditingTextId(annotation.id);
94
+ };
95
+ const commitTransform = (id, vals) => {
96
+ if (!id) {
97
+ return;
98
+ }
99
+ // Skip no-op transforms (a plain tap) so they don't pollute history.
100
+ const identity = vals.tx === 0 && vals.ty === 0 && vals.rotate === 0 && vals.scale === 1;
101
+ if (identity) {
102
+ return;
103
+ }
104
+ const target = annotations.find(a => a.id === id);
105
+ if (!target) {
106
+ return;
107
+ }
108
+ const updated = (0, _applyTransform.applyTransformToAnnotation)(target, vals);
109
+ dispatch({
110
+ type: 'UPDATE_ANNOTATION',
111
+ id,
112
+ changes: updated
113
+ });
114
+ };
115
+ const resetLive = () => {
116
+ live.active.value = false;
117
+ live.tx.value = 0;
118
+ live.ty.value = 0;
119
+ live.rotate.value = 0;
120
+ live.scale.value = 1;
121
+ };
122
+
123
+ // ---- The gesture ------------------------------------------------------
124
+ const pan = (0, _react.useMemo)(() => {
125
+ return _reactNativeGestureHandler.Gesture.Pan().maxPointers(1).onBegin(e => {
126
+ 'worklet';
127
+
128
+ if (tool === 'crop') {
129
+ mode.value = 'none';
130
+ return;
131
+ }
132
+ const screen = {
133
+ x: e.x,
134
+ y: e.y
135
+ };
136
+ const img = (0, _math.applyToPoint)(invMatrix, screen);
137
+ startImg.value = img;
138
+ activeId.value = selectedId;
139
+ if (isDrawTool(tool)) {
140
+ mode.value = 'draw';
141
+ draw.active.value = true;
142
+ draw.start.value = img;
143
+ draw.current.value = img;
144
+ if (tool === 'freehand') {
145
+ draw.points.value = [img];
146
+ }
147
+ return;
148
+ }
149
+ if (tool === 'text') {
150
+ mode.value = 'text';
151
+ return;
152
+ }
153
+
154
+ // select tool: figure out what was grabbed.
155
+ const sel = selectedId ? annotations.find(a => a.id === selectedId) : undefined;
156
+ if (sel) {
157
+ const h = (0, _handles.selectionHandles)(sel, matrix);
158
+ const center = (0, _geometry.annotationCenter)(sel);
159
+ if ((0, _math.distance)(screen, h.rotate) <= _constants.HANDLE_SIZE * 1.5) {
160
+ mode.value = 'rotate';
161
+ live.origin.value = center;
162
+ live.active.value = true;
163
+ startAngle.value = Math.atan2(img.y - center.y, img.x - center.x);
164
+ return;
165
+ }
166
+ for (let i = 0; i < h.corners.length; i++) {
167
+ if ((0, _math.distance)(screen, h.corners[i]) <= _constants.HANDLE_SIZE * 1.5) {
168
+ mode.value = 'resize';
169
+ live.origin.value = center;
170
+ live.active.value = true;
171
+ startDist.value = (0, _math.distance)(center, img);
172
+ return;
173
+ }
174
+ }
175
+ // Body of the selected annotation → move it.
176
+ if ((0, _hitTest.hitTest)([sel], img, slopImage) === sel.id) {
177
+ mode.value = 'move';
178
+ live.origin.value = center;
179
+ live.active.value = true;
180
+ return;
181
+ }
182
+ }
183
+
184
+ // Otherwise (de)select whatever is under the touch.
185
+ const hitId = (0, _hitTest.hitTest)(annotations, img, slopImage);
186
+ (0, _reactNativeReanimated.runOnJS)(selectId)(hitId);
187
+ activeId.value = hitId;
188
+ if (hitId) {
189
+ const target = annotations.find(a => a.id === hitId);
190
+ mode.value = 'move';
191
+ live.origin.value = (0, _geometry.annotationCenter)(target);
192
+ live.active.value = true;
193
+ } else {
194
+ mode.value = 'none';
195
+ }
196
+ }).onChange(e => {
197
+ 'worklet';
198
+
199
+ const screen = {
200
+ x: e.x,
201
+ y: e.y
202
+ };
203
+ const img = (0, _math.applyToPoint)(invMatrix, screen);
204
+ switch (mode.value) {
205
+ case 'draw':
206
+ if (tool === 'freehand') {
207
+ const pts = draw.points.value;
208
+ const last = pts[pts.length - 1];
209
+ if (!last || (0, _math.distance)(last, img) >= _constants.FREEHAND_MIN_DISTANCE) {
210
+ draw.points.value = [...pts, img];
211
+ }
212
+ } else {
213
+ draw.current.value = img;
214
+ }
215
+ break;
216
+ case 'move':
217
+ live.tx.value = img.x - startImg.value.x;
218
+ live.ty.value = img.y - startImg.value.y;
219
+ break;
220
+ case 'resize':
221
+ live.scale.value = startDist.value > 0 ? (0, _math.distance)(live.origin.value, img) / startDist.value : 1;
222
+ break;
223
+ case 'rotate':
224
+ {
225
+ const ang = Math.atan2(img.y - live.origin.value.y, img.x - live.origin.value.x);
226
+ live.rotate.value = ang - startAngle.value;
227
+ break;
228
+ }
229
+ default:
230
+ break;
231
+ }
232
+ }).onEnd(() => {
233
+ 'worklet';
234
+
235
+ if (mode.value === 'draw') {
236
+ draw.active.value = false;
237
+ const s = draw.start.value;
238
+ const c = draw.current.value;
239
+ if (tool === 'circle') {
240
+ const r = (0, _math.distance)(s, c);
241
+ if (r > 2) (0, _reactNativeReanimated.runOnJS)(commitCircle)(s, r);
242
+ } else if (tool === 'arrow') {
243
+ if ((0, _math.distance)(s, c) > 2) (0, _reactNativeReanimated.runOnJS)(commitArrow)(s, c);
244
+ } else if (tool === 'marker') {
245
+ const rect = {
246
+ x: Math.min(s.x, c.x),
247
+ y: Math.min(s.y, c.y),
248
+ width: Math.abs(c.x - s.x),
249
+ height: Math.abs(c.y - s.y)
250
+ };
251
+ if (rect.width > 2 && rect.height > 2) (0, _reactNativeReanimated.runOnJS)(commitMarker)(rect);
252
+ } else if (tool === 'freehand') {
253
+ const pts = draw.points.value;
254
+ if (pts.length > 1) (0, _reactNativeReanimated.runOnJS)(commitFreehand)(pts);
255
+ draw.points.value = [];
256
+ }
257
+ mode.value = 'none';
258
+ return;
259
+ }
260
+ if (mode.value === 'text') {
261
+ (0, _reactNativeReanimated.runOnJS)(placeText)(startImg.value);
262
+ mode.value = 'none';
263
+ return;
264
+ }
265
+ if (mode.value === 'move' || mode.value === 'resize' || mode.value === 'rotate') {
266
+ const vals = {
267
+ tx: live.tx.value,
268
+ ty: live.ty.value,
269
+ rotate: live.rotate.value,
270
+ scale: live.scale.value,
271
+ origin: live.origin.value
272
+ };
273
+ (0, _reactNativeReanimated.runOnJS)(commitTransform)(activeId.value, vals);
274
+ (0, _reactNativeReanimated.runOnJS)(resetLive)();
275
+ mode.value = 'none';
276
+ }
277
+ }).onFinalize(() => {
278
+ 'worklet';
279
+
280
+ // Safety: ensure draw preview is cleared if the gesture is cancelled.
281
+ if (draw.active.value && mode.value !== 'draw') {
282
+ draw.active.value = false;
283
+ }
284
+ });
285
+ // eslint-disable-next-line react-hooks/exhaustive-deps
286
+ }, [tool, selectedId, annotations, matrix, strokeColor, strokeWidth]);
287
+ return pan;
288
+ }
289
+ //# sourceMappingURL=useEditorGestures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNativeGestureHandler","_reactNativeReanimated","_EditorContext","_constants","_math","_geometry","_hitTest","_handles","_applyTransform","_createAnnotation","isDrawTool","tool","useEditorGestures","editor","useEditor","selectedId","annotations","matrix","draw","live","strokeColor","strokeWidth","dispatch","setSelectedId","setEditingTextId","invMatrix","useMemo","invert","scaleFactor","Math","hypot","a","b","slopImage","HIT_SLOP","mode","useSharedValue","startImg","x","y","startDist","startAngle","activeId","selectId","id","commitCircle","center","radius","type","annotation","makeCircle","commitArrow","start","end","makeArrow","commitMarker","rect","makeMarker","commitFreehand","points","makeFreehand","placeText","origin","makeText","textColor","commitTransform","vals","identity","tx","ty","rotate","scale","target","find","updated","applyTransformToAnnotation","changes","resetLive","active","value","pan","Gesture","Pan","maxPointers","onBegin","e","screen","img","applyToPoint","current","sel","undefined","h","selectionHandles","annotationCenter","distance","HANDLE_SIZE","atan2","i","corners","length","hitTest","hitId","runOnJS","onChange","pts","last","FREEHAND_MIN_DISTANCE","ang","onEnd","s","c","r","min","width","abs","height","onFinalize"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/useEditorGestures.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DisposeRegistry = void 0;
7
+ exports.safeDispose = safeDispose;
8
+ /**
9
+ * Tracks Skia native objects (SkImage / SkData / SkSurface / SkParagraph …) so
10
+ * they can be released deterministically. Skia objects are JSI HostObjects; the
11
+ * Hermes GC under-counts their native footprint and may never collect them, so
12
+ * we must call `.dispose()` explicitly. This registry is a safety net: register
13
+ * anything created imperatively, and `flush()` on unmount to guarantee cleanup.
14
+ */
15
+
16
+ class DisposeRegistry {
17
+ items = new Set();
18
+
19
+ /** Track an object and return it for convenient chaining. */
20
+ add(item) {
21
+ this.items.add(item);
22
+ return item;
23
+ }
24
+
25
+ /** Stop tracking without disposing (e.g. ownership handed elsewhere). */
26
+ forget(item) {
27
+ this.items.delete(item);
28
+ }
29
+
30
+ /** Dispose a single tracked object now. */
31
+ release(item) {
32
+ if (!item) {
33
+ return;
34
+ }
35
+ this.items.delete(item);
36
+ safeDispose(item);
37
+ }
38
+
39
+ /** Dispose everything still tracked. Call on unmount. */
40
+ flush() {
41
+ for (const item of this.items) {
42
+ safeDispose(item);
43
+ }
44
+ this.items.clear();
45
+ }
46
+ get size() {
47
+ return this.items.size;
48
+ }
49
+ }
50
+
51
+ /** Dispose without throwing if the object was already released. */
52
+ exports.DisposeRegistry = DisposeRegistry;
53
+ function safeDispose(item) {
54
+ if (!item) {
55
+ return;
56
+ }
57
+ try {
58
+ item.dispose();
59
+ } catch {
60
+ // Already disposed or not a real disposable — ignore.
61
+ }
62
+ }
63
+ //# sourceMappingURL=disposeRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DisposeRegistry","items","Set","add","item","forget","delete","release","safeDispose","flush","clear","size","exports","dispose"],"sourceRoot":"..\\..\\..\\src","sources":["image/disposeRegistry.ts"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMO,MAAMA,eAAe,CAAC;EACnBC,KAAK,GAAG,IAAIC,GAAG,CAAa,CAAC;;EAErC;EACAC,GAAGA,CAAuBC,IAAO,EAAK;IACpC,IAAI,CAACH,KAAK,CAACE,GAAG,CAACC,IAAI,CAAC;IACpB,OAAOA,IAAI;EACb;;EAEA;EACAC,MAAMA,CAACD,IAAgB,EAAQ;IAC7B,IAAI,CAACH,KAAK,CAACK,MAAM,CAACF,IAAI,CAAC;EACzB;;EAEA;EACAG,OAAOA,CAACH,IAAmC,EAAQ;IACjD,IAAI,CAACA,IAAI,EAAE;MACT;IACF;IACA,IAAI,CAACH,KAAK,CAACK,MAAM,CAACF,IAAI,CAAC;IACvBI,WAAW,CAACJ,IAAI,CAAC;EACnB;;EAEA;EACAK,KAAKA,CAAA,EAAS;IACZ,KAAK,MAAML,IAAI,IAAI,IAAI,CAACH,KAAK,EAAE;MAC7BO,WAAW,CAACJ,IAAI,CAAC;IACnB;IACA,IAAI,CAACH,KAAK,CAACS,KAAK,CAAC,CAAC;EACpB;EAEA,IAAIC,IAAIA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACV,KAAK,CAACU,IAAI;EACxB;AACF;;AAEA;AAAAC,OAAA,CAAAZ,eAAA,GAAAA,eAAA;AACO,SAASQ,WAAWA,CAACJ,IAAmC,EAAQ;EACrE,IAAI,CAACA,IAAI,EAAE;IACT;EACF;EACA,IAAI;IACFA,IAAI,CAACS,OAAO,CAAC,CAAC;EAChB,CAAC,CAAC,MAAM;IACN;EAAA;AAEJ","ignoreList":[]}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useLoadedImage = useLoadedImage;
7
+ var _react = require("react");
8
+ var _reactNativeSkia = require("@shopify/react-native-skia");
9
+ var _disposeRegistry = require("./disposeRegistry");
10
+ function stripDataUri(base64) {
11
+ const comma = base64.indexOf(',');
12
+ if (base64.startsWith('data:') && comma !== -1) {
13
+ return base64.slice(comma + 1);
14
+ }
15
+ return base64;
16
+ }
17
+
18
+ /**
19
+ * Decode an {@link ImageSource} into an `SkImage`, managing native memory.
20
+ *
21
+ * Memory rules enforced here:
22
+ * - The encoded `SkData` is disposed immediately after `MakeImageFromEncoded`;
23
+ * the decoded `SkImage` owns its pixels, so retaining the encoded bytes would
24
+ * roughly double memory usage.
25
+ * - When `source` changes (or the component unmounts) the previous `SkImage` is
26
+ * disposed before the next one is created.
27
+ * - The input base64 string is consumed inside the effect and never copied into
28
+ * state, so a large payload is not retained by this hook.
29
+ */
30
+ function useLoadedImage(source) {
31
+ const [state, setState] = (0, _react.useState)({
32
+ image: null,
33
+ width: 0,
34
+ height: 0,
35
+ loading: true,
36
+ error: null
37
+ });
38
+
39
+ // Serialize the source so the effect re-runs only on a real change, without
40
+ // holding the (possibly huge) base64 string in a memoized ref.
41
+ const sourceKey = 'base64' in source ? `b64:${source.base64.length}:${source.base64.slice(-64)}` : `uri:${source.uri}`;
42
+ const currentImage = (0, _react.useRef)(null);
43
+ (0, _react.useEffect)(() => {
44
+ let cancelled = false;
45
+ const commit = image => {
46
+ if (cancelled) {
47
+ // A newer load superseded us — drop this result.
48
+ (0, _disposeRegistry.safeDispose)(image);
49
+ return;
50
+ }
51
+ // Dispose the previous image before swapping in the new one.
52
+ if (currentImage.current && currentImage.current !== image) {
53
+ (0, _disposeRegistry.safeDispose)(currentImage.current);
54
+ }
55
+ currentImage.current = image;
56
+ setState({
57
+ image,
58
+ width: image.width(),
59
+ height: image.height(),
60
+ loading: false,
61
+ error: null
62
+ });
63
+ };
64
+ const fail = error => {
65
+ if (cancelled) {
66
+ return;
67
+ }
68
+ setState(prev => ({
69
+ ...prev,
70
+ loading: false,
71
+ error
72
+ }));
73
+ };
74
+ setState(prev => ({
75
+ ...prev,
76
+ loading: true,
77
+ error: null
78
+ }));
79
+ try {
80
+ if ('base64' in source) {
81
+ const data = _reactNativeSkia.Skia.Data.fromBase64(stripDataUri(source.base64));
82
+ const image = _reactNativeSkia.Skia.Image.MakeImageFromEncoded(data);
83
+ (0, _disposeRegistry.safeDispose)(data); // decoded pixels are owned by `image` now
84
+ if (!image) {
85
+ throw new Error('Failed to decode image from base64.');
86
+ }
87
+ commit(image);
88
+ } else {
89
+ // fromURI is async (may fetch a remote/local file).
90
+ _reactNativeSkia.Skia.Data.fromURI(source.uri).then(data => {
91
+ if (cancelled) {
92
+ (0, _disposeRegistry.safeDispose)(data);
93
+ return;
94
+ }
95
+ const image = _reactNativeSkia.Skia.Image.MakeImageFromEncoded(data);
96
+ (0, _disposeRegistry.safeDispose)(data);
97
+ if (!image) {
98
+ throw new Error(`Failed to decode image from URI: ${source.uri}`);
99
+ }
100
+ commit(image);
101
+ }).catch(e => fail(e instanceof Error ? e : new Error(String(e))));
102
+ }
103
+ } catch (e) {
104
+ fail(e instanceof Error ? e : new Error(String(e)));
105
+ }
106
+ return () => {
107
+ cancelled = true;
108
+ };
109
+ // eslint-disable-next-line react-hooks/exhaustive-deps
110
+ }, [sourceKey]);
111
+
112
+ // Final safety net: dispose the last image when the hook unmounts.
113
+ (0, _react.useEffect)(() => {
114
+ return () => {
115
+ (0, _disposeRegistry.safeDispose)(currentImage.current);
116
+ currentImage.current = null;
117
+ };
118
+ }, []);
119
+ return state;
120
+ }
121
+ //# sourceMappingURL=useLoadedImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNativeSkia","_disposeRegistry","stripDataUri","base64","comma","indexOf","startsWith","slice","useLoadedImage","source","state","setState","useState","image","width","height","loading","error","sourceKey","length","uri","currentImage","useRef","useEffect","cancelled","commit","safeDispose","current","fail","prev","data","Skia","Data","fromBase64","Image","MakeImageFromEncoded","Error","fromURI","then","catch","e","String"],"sourceRoot":"..\\..\\..\\src","sources":["image/useLoadedImage.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "DEFAULT_PALETTE", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _constants.DEFAULT_PALETTE;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "DEFAULT_STROKE_COLOR", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _constants.DEFAULT_STROKE_COLOR;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "DEFAULT_TEXT_COLOR", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _constants.DEFAULT_TEXT_COLOR;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "EditorProvider", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _EditorContext.EditorProvider;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "ImageEditor", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _ImageEditor.ImageEditor;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "exportImage", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _exportImage.exportImage;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "useEditor", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _EditorContext.useEditor;
46
+ }
47
+ });
48
+ var _ImageEditor = require("./ImageEditor");
49
+ var _EditorContext = require("./context/EditorContext");
50
+ var _exportImage = require("./export/exportImage");
51
+ var _constants = require("./constants");
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_ImageEditor","require","_EditorContext","_exportImage","_constants"],"sourceRoot":"..\\..\\src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAwBA,IAAAC,cAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AAEA,IAAAG,UAAA,GAAAH,OAAA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.canRedo = canRedo;
7
+ exports.canUndo = canUndo;
8
+ exports.commit = commit;
9
+ exports.initHistory = initHistory;
10
+ exports.redo = redo;
11
+ exports.replacePresent = replacePresent;
12
+ exports.undo = undo;
13
+ var _constants = require("../constants");
14
+ /**
15
+ * Generic, pure undo/redo history over an immutable document `T`.
16
+ * Snapshots are cheap here because the document is plain JSON (annotations +
17
+ * scene transform) — it never contains image bytes.
18
+ */
19
+
20
+ function initHistory(present) {
21
+ return {
22
+ past: [],
23
+ present,
24
+ future: []
25
+ };
26
+ }
27
+
28
+ /** Replace the present, pushing the old present onto the undo stack. */
29
+ function commit(history, next) {
30
+ if (next === history.present) {
31
+ return history;
32
+ }
33
+ const past = [...history.past, history.present];
34
+ // Cap the depth to bound memory.
35
+ if (past.length > _constants.MAX_HISTORY) {
36
+ past.shift();
37
+ }
38
+ return {
39
+ past,
40
+ present: next,
41
+ future: []
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Replace the present WITHOUT creating a history entry — used for live edits
47
+ * (e.g. typing in a text box) that should collapse into the eventual commit.
48
+ */
49
+ function replacePresent(history, next) {
50
+ return {
51
+ ...history,
52
+ present: next
53
+ };
54
+ }
55
+ function undo(history) {
56
+ if (history.past.length === 0) {
57
+ return history;
58
+ }
59
+ const previous = history.past[history.past.length - 1];
60
+ const past = history.past.slice(0, -1);
61
+ return {
62
+ past,
63
+ present: previous,
64
+ future: [history.present, ...history.future]
65
+ };
66
+ }
67
+ function redo(history) {
68
+ if (history.future.length === 0) {
69
+ return history;
70
+ }
71
+ const next = history.future[0];
72
+ const future = history.future.slice(1);
73
+ return {
74
+ past: [...history.past, history.present],
75
+ present: next,
76
+ future
77
+ };
78
+ }
79
+ function canUndo(history) {
80
+ return history.past.length > 0;
81
+ }
82
+ function canRedo(history) {
83
+ return history.future.length > 0;
84
+ }
85
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_constants","require","initHistory","present","past","future","commit","history","next","length","MAX_HISTORY","shift","replacePresent","undo","previous","slice","redo","canUndo","canRedo"],"sourceRoot":"..\\..\\..\\src","sources":["state/history.ts"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;;AAOO,SAASC,WAAWA,CAAIC,OAAU,EAAc;EACrD,OAAO;IAAEC,IAAI,EAAE,EAAE;IAAED,OAAO;IAAEE,MAAM,EAAE;EAAG,CAAC;AAC1C;;AAEA;AACO,SAASC,MAAMA,CAAIC,OAAmB,EAAEC,IAAO,EAAc;EAClE,IAAIA,IAAI,KAAKD,OAAO,CAACJ,OAAO,EAAE;IAC5B,OAAOI,OAAO;EAChB;EACA,MAAMH,IAAI,GAAG,CAAC,GAAGG,OAAO,CAACH,IAAI,EAAEG,OAAO,CAACJ,OAAO,CAAC;EAC/C;EACA,IAAIC,IAAI,CAACK,MAAM,GAAGC,sBAAW,EAAE;IAC7BN,IAAI,CAACO,KAAK,CAAC,CAAC;EACd;EACA,OAAO;IAAEP,IAAI;IAAED,OAAO,EAAEK,IAAI;IAAEH,MAAM,EAAE;EAAG,CAAC;AAC5C;;AAEA;AACA;AACA;AACA;AACO,SAASO,cAAcA,CAAIL,OAAmB,EAAEC,IAAO,EAAc;EAC1E,OAAO;IAAE,GAAGD,OAAO;IAAEJ,OAAO,EAAEK;EAAK,CAAC;AACtC;AAEO,SAASK,IAAIA,CAAIN,OAAmB,EAAc;EACvD,IAAIA,OAAO,CAACH,IAAI,CAACK,MAAM,KAAK,CAAC,EAAE;IAC7B,OAAOF,OAAO;EAChB;EACA,MAAMO,QAAQ,GAAGP,OAAO,CAACH,IAAI,CAACG,OAAO,CAACH,IAAI,CAACK,MAAM,GAAG,CAAC,CAAE;EACvD,MAAML,IAAI,GAAGG,OAAO,CAACH,IAAI,CAACW,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EACtC,OAAO;IACLX,IAAI;IACJD,OAAO,EAAEW,QAAQ;IACjBT,MAAM,EAAE,CAACE,OAAO,CAACJ,OAAO,EAAE,GAAGI,OAAO,CAACF,MAAM;EAC7C,CAAC;AACH;AAEO,SAASW,IAAIA,CAAIT,OAAmB,EAAc;EACvD,IAAIA,OAAO,CAACF,MAAM,CAACI,MAAM,KAAK,CAAC,EAAE;IAC/B,OAAOF,OAAO;EAChB;EACA,MAAMC,IAAI,GAAGD,OAAO,CAACF,MAAM,CAAC,CAAC,CAAE;EAC/B,MAAMA,MAAM,GAAGE,OAAO,CAACF,MAAM,CAACU,KAAK,CAAC,CAAC,CAAC;EACtC,OAAO;IACLX,IAAI,EAAE,CAAC,GAAGG,OAAO,CAACH,IAAI,EAAEG,OAAO,CAACJ,OAAO,CAAC;IACxCA,OAAO,EAAEK,IAAI;IACbH;EACF,CAAC;AACH;AAEO,SAASY,OAAOA,CAAIV,OAAmB,EAAW;EACvD,OAAOA,OAAO,CAACH,IAAI,CAACK,MAAM,GAAG,CAAC;AAChC;AAEO,SAASS,OAAOA,CAAIX,OAAmB,EAAW;EACvD,OAAOA,OAAO,CAACF,MAAM,CAACI,MAAM,GAAG,CAAC;AAClC","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getAnnotationById = getAnnotationById;
7
+ exports.sortedByZ = sortedByZ;
8
+ function getAnnotationById(annotations, id) {
9
+ if (!id) {
10
+ return undefined;
11
+ }
12
+ return annotations.find(a => a.id === id);
13
+ }
14
+
15
+ /** Annotations in paint order (ascending z). */
16
+ function sortedByZ(annotations) {
17
+ return [...annotations].sort((a, b) => a.z - b.z);
18
+ }
19
+ //# sourceMappingURL=selectors.js.map