@archireport/react-native-drawing 0.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 (323) hide show
  1. package/README.md +181 -0
  2. package/lib/commonjs/DrawingEditor.js +815 -0
  3. package/lib/commonjs/DrawingEditor.js.map +1 -0
  4. package/lib/commonjs/assets/toolbar-icons/arrow-disabled.png +0 -0
  5. package/lib/commonjs/assets/toolbar-icons/arrow-enabled.png +0 -0
  6. package/lib/commonjs/assets/toolbar-icons/arrow.png +0 -0
  7. package/lib/commonjs/assets/toolbar-icons/circle-disabled.png +0 -0
  8. package/lib/commonjs/assets/toolbar-icons/circle-enabled.png +0 -0
  9. package/lib/commonjs/assets/toolbar-icons/circle.png +0 -0
  10. package/lib/commonjs/assets/toolbar-icons/freehand-disabled.png +0 -0
  11. package/lib/commonjs/assets/toolbar-icons/freehand-enabled.png +0 -0
  12. package/lib/commonjs/assets/toolbar-icons/freehand.png +0 -0
  13. package/lib/commonjs/assets/toolbar-icons/line-disabled.png +0 -0
  14. package/lib/commonjs/assets/toolbar-icons/line-enabled.png +0 -0
  15. package/lib/commonjs/assets/toolbar-icons/line.png +0 -0
  16. package/lib/commonjs/assets/toolbar-icons/measure-disabled.png +0 -0
  17. package/lib/commonjs/assets/toolbar-icons/measure-enabled.png +0 -0
  18. package/lib/commonjs/assets/toolbar-icons/measure.png +0 -0
  19. package/lib/commonjs/assets/toolbar-icons/move-disabled.png +0 -0
  20. package/lib/commonjs/assets/toolbar-icons/move-enabled.png +0 -0
  21. package/lib/commonjs/assets/toolbar-icons/move.png +0 -0
  22. package/lib/commonjs/assets/toolbar-icons/polygon-disabled.png +0 -0
  23. package/lib/commonjs/assets/toolbar-icons/polygon-enabled.png +0 -0
  24. package/lib/commonjs/assets/toolbar-icons/polygon.png +0 -0
  25. package/lib/commonjs/assets/toolbar-icons/rectangle-disabled.png +0 -0
  26. package/lib/commonjs/assets/toolbar-icons/rectangle-enabled.png +0 -0
  27. package/lib/commonjs/assets/toolbar-icons/rectangle.png +0 -0
  28. package/lib/commonjs/assets/toolbar-icons/text-disabled.png +0 -0
  29. package/lib/commonjs/assets/toolbar-icons/text-enabled.png +0 -0
  30. package/lib/commonjs/assets/toolbar-icons/text.png +0 -0
  31. package/lib/commonjs/components/ColorPalette.js +379 -0
  32. package/lib/commonjs/components/ColorPalette.js.map +1 -0
  33. package/lib/commonjs/components/LineWidthSlider.js +70 -0
  34. package/lib/commonjs/components/LineWidthSlider.js.map +1 -0
  35. package/lib/commonjs/components/MeasurementEditModal.js +153 -0
  36. package/lib/commonjs/components/MeasurementEditModal.js.map +1 -0
  37. package/lib/commonjs/components/MiniMap.js +244 -0
  38. package/lib/commonjs/components/MiniMap.js.map +1 -0
  39. package/lib/commonjs/components/TextAnnotation.js +162 -0
  40. package/lib/commonjs/components/TextAnnotation.js.map +1 -0
  41. package/lib/commonjs/components/TextEditModal.js +133 -0
  42. package/lib/commonjs/components/TextEditModal.js.map +1 -0
  43. package/lib/commonjs/components/Toolbar.js +198 -0
  44. package/lib/commonjs/components/Toolbar.js.map +1 -0
  45. package/lib/commonjs/components/ZoomBadge.js +161 -0
  46. package/lib/commonjs/components/ZoomBadge.js.map +1 -0
  47. package/lib/commonjs/hooks/useFreehandGesture.js +173 -0
  48. package/lib/commonjs/hooks/useFreehandGesture.js.map +1 -0
  49. package/lib/commonjs/hooks/usePolygonGesture.js +109 -0
  50. package/lib/commonjs/hooks/usePolygonGesture.js.map +1 -0
  51. package/lib/commonjs/hooks/useSelectionGesture.js +236 -0
  52. package/lib/commonjs/hooks/useSelectionGesture.js.map +1 -0
  53. package/lib/commonjs/hooks/useShapeGesture.js +181 -0
  54. package/lib/commonjs/hooks/useShapeGesture.js.map +1 -0
  55. package/lib/commonjs/hooks/useViewportGesture.js +238 -0
  56. package/lib/commonjs/hooks/useViewportGesture.js.map +1 -0
  57. package/lib/commonjs/index.js +104 -0
  58. package/lib/commonjs/index.js.map +1 -0
  59. package/lib/commonjs/package.json +1 -0
  60. package/lib/commonjs/renderers/ArrowRenderer.js +118 -0
  61. package/lib/commonjs/renderers/ArrowRenderer.js.map +1 -0
  62. package/lib/commonjs/renderers/CircleRenderer.js +51 -0
  63. package/lib/commonjs/renderers/CircleRenderer.js.map +1 -0
  64. package/lib/commonjs/renderers/FreehandRenderer.js +31 -0
  65. package/lib/commonjs/renderers/FreehandRenderer.js.map +1 -0
  66. package/lib/commonjs/renderers/InProgressRenderer.js +174 -0
  67. package/lib/commonjs/renderers/InProgressRenderer.js.map +1 -0
  68. package/lib/commonjs/renderers/LineRenderer.js +27 -0
  69. package/lib/commonjs/renderers/LineRenderer.js.map +1 -0
  70. package/lib/commonjs/renderers/MeasurementRenderer.js +134 -0
  71. package/lib/commonjs/renderers/MeasurementRenderer.js.map +1 -0
  72. package/lib/commonjs/renderers/ObjectRenderer.js +65 -0
  73. package/lib/commonjs/renderers/ObjectRenderer.js.map +1 -0
  74. package/lib/commonjs/renderers/PolygonRenderer.js +46 -0
  75. package/lib/commonjs/renderers/PolygonRenderer.js.map +1 -0
  76. package/lib/commonjs/renderers/RectRenderer.js +51 -0
  77. package/lib/commonjs/renderers/RectRenderer.js.map +1 -0
  78. package/lib/commonjs/renderers/SelectedObjectRenderer.js +592 -0
  79. package/lib/commonjs/renderers/SelectedObjectRenderer.js.map +1 -0
  80. package/lib/commonjs/renderers/SelectionOverlay.js +120 -0
  81. package/lib/commonjs/renderers/SelectionOverlay.js.map +1 -0
  82. package/lib/commonjs/store/useDrawingStore.js +354 -0
  83. package/lib/commonjs/store/useDrawingStore.js.map +1 -0
  84. package/lib/commonjs/types.js +6 -0
  85. package/lib/commonjs/types.js.map +1 -0
  86. package/lib/commonjs/utils/colors.js +44 -0
  87. package/lib/commonjs/utils/colors.js.map +1 -0
  88. package/lib/commonjs/utils/coordinates.js +81 -0
  89. package/lib/commonjs/utils/coordinates.js.map +1 -0
  90. package/lib/commonjs/utils/hitTesting.js +181 -0
  91. package/lib/commonjs/utils/hitTesting.js.map +1 -0
  92. package/lib/commonjs/utils/serialization.js +42 -0
  93. package/lib/commonjs/utils/serialization.js.map +1 -0
  94. package/lib/commonjs/utils/shapeDetection.js +151 -0
  95. package/lib/commonjs/utils/shapeDetection.js.map +1 -0
  96. package/lib/commonjs/utils/smoothing.js +85 -0
  97. package/lib/commonjs/utils/smoothing.js.map +1 -0
  98. package/lib/module/DrawingEditor.js +811 -0
  99. package/lib/module/DrawingEditor.js.map +1 -0
  100. package/lib/module/assets/toolbar-icons/arrow-disabled.png +0 -0
  101. package/lib/module/assets/toolbar-icons/arrow-enabled.png +0 -0
  102. package/lib/module/assets/toolbar-icons/arrow.png +0 -0
  103. package/lib/module/assets/toolbar-icons/circle-disabled.png +0 -0
  104. package/lib/module/assets/toolbar-icons/circle-enabled.png +0 -0
  105. package/lib/module/assets/toolbar-icons/circle.png +0 -0
  106. package/lib/module/assets/toolbar-icons/freehand-disabled.png +0 -0
  107. package/lib/module/assets/toolbar-icons/freehand-enabled.png +0 -0
  108. package/lib/module/assets/toolbar-icons/freehand.png +0 -0
  109. package/lib/module/assets/toolbar-icons/line-disabled.png +0 -0
  110. package/lib/module/assets/toolbar-icons/line-enabled.png +0 -0
  111. package/lib/module/assets/toolbar-icons/line.png +0 -0
  112. package/lib/module/assets/toolbar-icons/measure-disabled.png +0 -0
  113. package/lib/module/assets/toolbar-icons/measure-enabled.png +0 -0
  114. package/lib/module/assets/toolbar-icons/measure.png +0 -0
  115. package/lib/module/assets/toolbar-icons/move-disabled.png +0 -0
  116. package/lib/module/assets/toolbar-icons/move-enabled.png +0 -0
  117. package/lib/module/assets/toolbar-icons/move.png +0 -0
  118. package/lib/module/assets/toolbar-icons/polygon-disabled.png +0 -0
  119. package/lib/module/assets/toolbar-icons/polygon-enabled.png +0 -0
  120. package/lib/module/assets/toolbar-icons/polygon.png +0 -0
  121. package/lib/module/assets/toolbar-icons/rectangle-disabled.png +0 -0
  122. package/lib/module/assets/toolbar-icons/rectangle-enabled.png +0 -0
  123. package/lib/module/assets/toolbar-icons/rectangle.png +0 -0
  124. package/lib/module/assets/toolbar-icons/text-disabled.png +0 -0
  125. package/lib/module/assets/toolbar-icons/text-enabled.png +0 -0
  126. package/lib/module/assets/toolbar-icons/text.png +0 -0
  127. package/lib/module/components/ColorPalette.js +374 -0
  128. package/lib/module/components/ColorPalette.js.map +1 -0
  129. package/lib/module/components/LineWidthSlider.js +64 -0
  130. package/lib/module/components/LineWidthSlider.js.map +1 -0
  131. package/lib/module/components/MeasurementEditModal.js +148 -0
  132. package/lib/module/components/MeasurementEditModal.js.map +1 -0
  133. package/lib/module/components/MiniMap.js +239 -0
  134. package/lib/module/components/MiniMap.js.map +1 -0
  135. package/lib/module/components/TextAnnotation.js +157 -0
  136. package/lib/module/components/TextAnnotation.js.map +1 -0
  137. package/lib/module/components/TextEditModal.js +128 -0
  138. package/lib/module/components/TextEditModal.js.map +1 -0
  139. package/lib/module/components/Toolbar.js +193 -0
  140. package/lib/module/components/Toolbar.js.map +1 -0
  141. package/lib/module/components/ZoomBadge.js +155 -0
  142. package/lib/module/components/ZoomBadge.js.map +1 -0
  143. package/lib/module/hooks/useFreehandGesture.js +169 -0
  144. package/lib/module/hooks/useFreehandGesture.js.map +1 -0
  145. package/lib/module/hooks/usePolygonGesture.js +106 -0
  146. package/lib/module/hooks/usePolygonGesture.js.map +1 -0
  147. package/lib/module/hooks/useSelectionGesture.js +232 -0
  148. package/lib/module/hooks/useSelectionGesture.js.map +1 -0
  149. package/lib/module/hooks/useShapeGesture.js +177 -0
  150. package/lib/module/hooks/useShapeGesture.js.map +1 -0
  151. package/lib/module/hooks/useViewportGesture.js +234 -0
  152. package/lib/module/hooks/useViewportGesture.js.map +1 -0
  153. package/lib/module/index.js +20 -0
  154. package/lib/module/index.js.map +1 -0
  155. package/lib/module/package.json +1 -0
  156. package/lib/module/renderers/ArrowRenderer.js +113 -0
  157. package/lib/module/renderers/ArrowRenderer.js.map +1 -0
  158. package/lib/module/renderers/CircleRenderer.js +46 -0
  159. package/lib/module/renderers/CircleRenderer.js.map +1 -0
  160. package/lib/module/renderers/FreehandRenderer.js +26 -0
  161. package/lib/module/renderers/FreehandRenderer.js.map +1 -0
  162. package/lib/module/renderers/InProgressRenderer.js +169 -0
  163. package/lib/module/renderers/InProgressRenderer.js.map +1 -0
  164. package/lib/module/renderers/LineRenderer.js +22 -0
  165. package/lib/module/renderers/LineRenderer.js.map +1 -0
  166. package/lib/module/renderers/MeasurementRenderer.js +129 -0
  167. package/lib/module/renderers/MeasurementRenderer.js.map +1 -0
  168. package/lib/module/renderers/ObjectRenderer.js +60 -0
  169. package/lib/module/renderers/ObjectRenderer.js.map +1 -0
  170. package/lib/module/renderers/PolygonRenderer.js +41 -0
  171. package/lib/module/renderers/PolygonRenderer.js.map +1 -0
  172. package/lib/module/renderers/RectRenderer.js +46 -0
  173. package/lib/module/renderers/RectRenderer.js.map +1 -0
  174. package/lib/module/renderers/SelectedObjectRenderer.js +587 -0
  175. package/lib/module/renderers/SelectedObjectRenderer.js.map +1 -0
  176. package/lib/module/renderers/SelectionOverlay.js +116 -0
  177. package/lib/module/renderers/SelectionOverlay.js.map +1 -0
  178. package/lib/module/store/useDrawingStore.js +350 -0
  179. package/lib/module/store/useDrawingStore.js.map +1 -0
  180. package/lib/module/types.js +4 -0
  181. package/lib/module/types.js.map +1 -0
  182. package/lib/module/utils/colors.js +40 -0
  183. package/lib/module/utils/colors.js.map +1 -0
  184. package/lib/module/utils/coordinates.js +71 -0
  185. package/lib/module/utils/coordinates.js.map +1 -0
  186. package/lib/module/utils/hitTesting.js +171 -0
  187. package/lib/module/utils/hitTesting.js.map +1 -0
  188. package/lib/module/utils/serialization.js +36 -0
  189. package/lib/module/utils/serialization.js.map +1 -0
  190. package/lib/module/utils/shapeDetection.js +147 -0
  191. package/lib/module/utils/shapeDetection.js.map +1 -0
  192. package/lib/module/utils/smoothing.js +80 -0
  193. package/lib/module/utils/smoothing.js.map +1 -0
  194. package/lib/typescript/DrawingEditor.d.ts +3 -0
  195. package/lib/typescript/DrawingEditor.d.ts.map +1 -0
  196. package/lib/typescript/components/ColorPalette.d.ts +9 -0
  197. package/lib/typescript/components/ColorPalette.d.ts.map +1 -0
  198. package/lib/typescript/components/LineWidthSlider.d.ts +11 -0
  199. package/lib/typescript/components/LineWidthSlider.d.ts.map +1 -0
  200. package/lib/typescript/components/MeasurementEditModal.d.ts +11 -0
  201. package/lib/typescript/components/MeasurementEditModal.d.ts.map +1 -0
  202. package/lib/typescript/components/MiniMap.d.ts +23 -0
  203. package/lib/typescript/components/MiniMap.d.ts.map +1 -0
  204. package/lib/typescript/components/TextAnnotation.d.ts +22 -0
  205. package/lib/typescript/components/TextAnnotation.d.ts.map +1 -0
  206. package/lib/typescript/components/TextEditModal.d.ts +10 -0
  207. package/lib/typescript/components/TextEditModal.d.ts.map +1 -0
  208. package/lib/typescript/components/Toolbar.d.ts +13 -0
  209. package/lib/typescript/components/Toolbar.d.ts.map +1 -0
  210. package/lib/typescript/components/ZoomBadge.d.ts +9 -0
  211. package/lib/typescript/components/ZoomBadge.d.ts.map +1 -0
  212. package/lib/typescript/hooks/useFreehandGesture.d.ts +47 -0
  213. package/lib/typescript/hooks/useFreehandGesture.d.ts.map +1 -0
  214. package/lib/typescript/hooks/usePolygonGesture.d.ts +47 -0
  215. package/lib/typescript/hooks/usePolygonGesture.d.ts.map +1 -0
  216. package/lib/typescript/hooks/useSelectionGesture.d.ts +32 -0
  217. package/lib/typescript/hooks/useSelectionGesture.d.ts.map +1 -0
  218. package/lib/typescript/hooks/useShapeGesture.d.ts +54 -0
  219. package/lib/typescript/hooks/useShapeGesture.d.ts.map +1 -0
  220. package/lib/typescript/hooks/useViewportGesture.d.ts +37 -0
  221. package/lib/typescript/hooks/useViewportGesture.d.ts.map +1 -0
  222. package/lib/typescript/index.d.ts +11 -0
  223. package/lib/typescript/index.d.ts.map +1 -0
  224. package/lib/typescript/renderers/ArrowRenderer.d.ts +9 -0
  225. package/lib/typescript/renderers/ArrowRenderer.d.ts.map +1 -0
  226. package/lib/typescript/renderers/CircleRenderer.d.ts +9 -0
  227. package/lib/typescript/renderers/CircleRenderer.d.ts.map +1 -0
  228. package/lib/typescript/renderers/FreehandRenderer.d.ts +9 -0
  229. package/lib/typescript/renderers/FreehandRenderer.d.ts.map +1 -0
  230. package/lib/typescript/renderers/InProgressRenderer.d.ts +32 -0
  231. package/lib/typescript/renderers/InProgressRenderer.d.ts.map +1 -0
  232. package/lib/typescript/renderers/LineRenderer.d.ts +9 -0
  233. package/lib/typescript/renderers/LineRenderer.d.ts.map +1 -0
  234. package/lib/typescript/renderers/MeasurementRenderer.d.ts +9 -0
  235. package/lib/typescript/renderers/MeasurementRenderer.d.ts.map +1 -0
  236. package/lib/typescript/renderers/ObjectRenderer.d.ts +12 -0
  237. package/lib/typescript/renderers/ObjectRenderer.d.ts.map +1 -0
  238. package/lib/typescript/renderers/PolygonRenderer.d.ts +13 -0
  239. package/lib/typescript/renderers/PolygonRenderer.d.ts.map +1 -0
  240. package/lib/typescript/renderers/RectRenderer.d.ts +9 -0
  241. package/lib/typescript/renderers/RectRenderer.d.ts.map +1 -0
  242. package/lib/typescript/renderers/SelectedObjectRenderer.d.ts +18 -0
  243. package/lib/typescript/renderers/SelectedObjectRenderer.d.ts.map +1 -0
  244. package/lib/typescript/renderers/SelectionOverlay.d.ts +21 -0
  245. package/lib/typescript/renderers/SelectionOverlay.d.ts.map +1 -0
  246. package/lib/typescript/store/useDrawingStore.d.ts +30 -0
  247. package/lib/typescript/store/useDrawingStore.d.ts.map +1 -0
  248. package/lib/typescript/types.d.ts +130 -0
  249. package/lib/typescript/types.d.ts.map +1 -0
  250. package/lib/typescript/utils/colors.d.ts +11 -0
  251. package/lib/typescript/utils/colors.d.ts.map +1 -0
  252. package/lib/typescript/utils/coordinates.d.ts +34 -0
  253. package/lib/typescript/utils/coordinates.d.ts.map +1 -0
  254. package/lib/typescript/utils/hitTesting.d.ts +18 -0
  255. package/lib/typescript/utils/hitTesting.d.ts.map +1 -0
  256. package/lib/typescript/utils/serialization.d.ts +17 -0
  257. package/lib/typescript/utils/serialization.d.ts.map +1 -0
  258. package/lib/typescript/utils/shapeDetection.d.ts +22 -0
  259. package/lib/typescript/utils/shapeDetection.d.ts.map +1 -0
  260. package/lib/typescript/utils/smoothing.d.ts +16 -0
  261. package/lib/typescript/utils/smoothing.d.ts.map +1 -0
  262. package/package.json +108 -0
  263. package/src/DrawingEditor.tsx +1071 -0
  264. package/src/assets/toolbar-icons/arrow-disabled.png +0 -0
  265. package/src/assets/toolbar-icons/arrow-enabled.png +0 -0
  266. package/src/assets/toolbar-icons/arrow.png +0 -0
  267. package/src/assets/toolbar-icons/circle-disabled.png +0 -0
  268. package/src/assets/toolbar-icons/circle-enabled.png +0 -0
  269. package/src/assets/toolbar-icons/circle.png +0 -0
  270. package/src/assets/toolbar-icons/freehand-disabled.png +0 -0
  271. package/src/assets/toolbar-icons/freehand-enabled.png +0 -0
  272. package/src/assets/toolbar-icons/freehand.png +0 -0
  273. package/src/assets/toolbar-icons/line-disabled.png +0 -0
  274. package/src/assets/toolbar-icons/line-enabled.png +0 -0
  275. package/src/assets/toolbar-icons/line.png +0 -0
  276. package/src/assets/toolbar-icons/measure-disabled.png +0 -0
  277. package/src/assets/toolbar-icons/measure-enabled.png +0 -0
  278. package/src/assets/toolbar-icons/measure.png +0 -0
  279. package/src/assets/toolbar-icons/move-disabled.png +0 -0
  280. package/src/assets/toolbar-icons/move-enabled.png +0 -0
  281. package/src/assets/toolbar-icons/move.png +0 -0
  282. package/src/assets/toolbar-icons/polygon-disabled.png +0 -0
  283. package/src/assets/toolbar-icons/polygon-enabled.png +0 -0
  284. package/src/assets/toolbar-icons/polygon.png +0 -0
  285. package/src/assets/toolbar-icons/rectangle-disabled.png +0 -0
  286. package/src/assets/toolbar-icons/rectangle-enabled.png +0 -0
  287. package/src/assets/toolbar-icons/rectangle.png +0 -0
  288. package/src/assets/toolbar-icons/text-disabled.png +0 -0
  289. package/src/assets/toolbar-icons/text-enabled.png +0 -0
  290. package/src/assets/toolbar-icons/text.png +0 -0
  291. package/src/components/ColorPalette.tsx +497 -0
  292. package/src/components/LineWidthSlider.tsx +87 -0
  293. package/src/components/MeasurementEditModal.tsx +163 -0
  294. package/src/components/MiniMap.tsx +275 -0
  295. package/src/components/TextAnnotation.tsx +198 -0
  296. package/src/components/TextEditModal.tsx +139 -0
  297. package/src/components/Toolbar.tsx +254 -0
  298. package/src/components/ZoomBadge.tsx +166 -0
  299. package/src/hooks/useFreehandGesture.ts +249 -0
  300. package/src/hooks/usePolygonGesture.ts +162 -0
  301. package/src/hooks/useSelectionGesture.ts +293 -0
  302. package/src/hooks/useShapeGesture.ts +256 -0
  303. package/src/hooks/useViewportGesture.ts +337 -0
  304. package/src/index.tsx +51 -0
  305. package/src/renderers/ArrowRenderer.tsx +123 -0
  306. package/src/renderers/CircleRenderer.tsx +60 -0
  307. package/src/renderers/FreehandRenderer.tsx +33 -0
  308. package/src/renderers/InProgressRenderer.tsx +217 -0
  309. package/src/renderers/LineRenderer.tsx +34 -0
  310. package/src/renderers/MeasurementRenderer.tsx +179 -0
  311. package/src/renderers/ObjectRenderer.tsx +42 -0
  312. package/src/renderers/PolygonRenderer.tsx +66 -0
  313. package/src/renderers/RectRenderer.tsx +60 -0
  314. package/src/renderers/SelectedObjectRenderer.tsx +738 -0
  315. package/src/renderers/SelectionOverlay.tsx +170 -0
  316. package/src/store/useDrawingStore.ts +357 -0
  317. package/src/types.ts +186 -0
  318. package/src/utils/colors.ts +98 -0
  319. package/src/utils/coordinates.ts +75 -0
  320. package/src/utils/hitTesting.ts +242 -0
  321. package/src/utils/serialization.ts +45 -0
  322. package/src/utils/shapeDetection.ts +160 -0
  323. package/src/utils/smoothing.ts +84 -0
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ import React, { useState, useCallback } from "react";
4
+ import { Modal, View, TextInput, TouchableOpacity, Text, StyleSheet, KeyboardAvoidingView, Platform } from "react-native";
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ export const TextEditModal = /*#__PURE__*/React.memo(function TextEditModal({
7
+ visible,
8
+ initialValue,
9
+ onSubmit,
10
+ onCancel
11
+ }) {
12
+ const [text, setText] = useState(initialValue);
13
+ const handleSubmit = useCallback(() => {
14
+ if (text.trim()) {
15
+ onSubmit(text.trim());
16
+ }
17
+ }, [text, onSubmit]);
18
+
19
+ // Reset text when modal becomes visible
20
+ React.useEffect(() => {
21
+ if (visible) {
22
+ setText(initialValue);
23
+ }
24
+ }, [visible, initialValue]);
25
+ return /*#__PURE__*/_jsx(Modal, {
26
+ visible: visible,
27
+ transparent: true,
28
+ animationType: "fade",
29
+ onRequestClose: onCancel,
30
+ children: /*#__PURE__*/_jsx(KeyboardAvoidingView, {
31
+ style: styles.overlay,
32
+ behavior: Platform.OS === "ios" ? "padding" : "height",
33
+ children: /*#__PURE__*/_jsxs(View, {
34
+ style: styles.dialog,
35
+ children: [/*#__PURE__*/_jsx(Text, {
36
+ style: styles.title,
37
+ children: "Edit Text"
38
+ }), /*#__PURE__*/_jsx(TextInput, {
39
+ style: styles.input,
40
+ value: text,
41
+ onChangeText: setText,
42
+ placeholder: "Enter text...",
43
+ placeholderTextColor: "#999",
44
+ multiline: true,
45
+ autoFocus: true,
46
+ textAlignVertical: "top"
47
+ }), /*#__PURE__*/_jsxs(View, {
48
+ style: styles.buttons,
49
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
50
+ style: styles.cancelButton,
51
+ onPress: onCancel,
52
+ children: /*#__PURE__*/_jsx(Text, {
53
+ style: styles.cancelText,
54
+ children: "Cancel"
55
+ })
56
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
57
+ style: styles.submitButton,
58
+ onPress: handleSubmit,
59
+ children: /*#__PURE__*/_jsx(Text, {
60
+ style: styles.submitText,
61
+ children: "Done"
62
+ })
63
+ })]
64
+ })]
65
+ })
66
+ })
67
+ });
68
+ });
69
+ const styles = StyleSheet.create({
70
+ overlay: {
71
+ flex: 1,
72
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
73
+ justifyContent: "center",
74
+ alignItems: "center",
75
+ padding: 24
76
+ },
77
+ dialog: {
78
+ backgroundColor: "#2C2C2E",
79
+ borderRadius: 14,
80
+ padding: 20,
81
+ width: "100%",
82
+ maxWidth: 400
83
+ },
84
+ title: {
85
+ color: "#FFFFFF",
86
+ fontSize: 18,
87
+ fontWeight: "600",
88
+ marginBottom: 16,
89
+ textAlign: "center"
90
+ },
91
+ input: {
92
+ backgroundColor: "#1C1C1E",
93
+ borderRadius: 10,
94
+ padding: 12,
95
+ color: "#FFFFFF",
96
+ fontSize: 16,
97
+ minHeight: 100,
98
+ marginBottom: 16
99
+ },
100
+ buttons: {
101
+ flexDirection: "row",
102
+ gap: 12
103
+ },
104
+ cancelButton: {
105
+ flex: 1,
106
+ paddingVertical: 12,
107
+ borderRadius: 10,
108
+ backgroundColor: "#3A3A3C",
109
+ alignItems: "center"
110
+ },
111
+ cancelText: {
112
+ color: "#FFFFFF",
113
+ fontSize: 16
114
+ },
115
+ submitButton: {
116
+ flex: 1,
117
+ paddingVertical: 12,
118
+ borderRadius: 10,
119
+ backgroundColor: "#007AFF",
120
+ alignItems: "center"
121
+ },
122
+ submitText: {
123
+ color: "#FFFFFF",
124
+ fontSize: 16,
125
+ fontWeight: "600"
126
+ }
127
+ });
128
+ //# sourceMappingURL=TextEditModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useState","useCallback","Modal","View","TextInput","TouchableOpacity","Text","StyleSheet","KeyboardAvoidingView","Platform","jsx","_jsx","jsxs","_jsxs","TextEditModal","memo","visible","initialValue","onSubmit","onCancel","text","setText","handleSubmit","trim","useEffect","transparent","animationType","onRequestClose","children","style","styles","overlay","behavior","OS","dialog","title","input","value","onChangeText","placeholder","placeholderTextColor","multiline","autoFocus","textAlignVertical","buttons","cancelButton","onPress","cancelText","submitButton","submitText","create","flex","backgroundColor","justifyContent","alignItems","padding","borderRadius","width","maxWidth","color","fontSize","fontWeight","marginBottom","textAlign","minHeight","flexDirection","gap","paddingVertical"],"sourceRoot":"../../../src","sources":["components/TextEditModal.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+
3
+ import React, { useCallback } from "react";
4
+ import { View, TouchableOpacity, ScrollView, StyleSheet, Text, Image, useWindowDimensions } from "react-native";
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ const BUTTON_SIZE = 44;
7
+ const BUTTON_GAP = 4;
8
+ const TOOLBAR_HORIZONTAL_PADDING = 12;
9
+ const TOOLS = [{
10
+ type: "freehand",
11
+ label: "Pen",
12
+ icons: {
13
+ default: require("../assets/toolbar-icons/freehand.png"),
14
+ active: require("../assets/toolbar-icons/freehand-enabled.png")
15
+ }
16
+ }, {
17
+ type: "line",
18
+ label: "Line",
19
+ icons: {
20
+ default: require("../assets/toolbar-icons/line.png"),
21
+ active: require("../assets/toolbar-icons/line-enabled.png")
22
+ }
23
+ }, {
24
+ type: "arrow",
25
+ label: "Arrow",
26
+ icons: {
27
+ default: require("../assets/toolbar-icons/arrow.png"),
28
+ active: require("../assets/toolbar-icons/arrow-enabled.png")
29
+ }
30
+ }, {
31
+ type: "rectangle",
32
+ label: "Rect",
33
+ icons: {
34
+ default: require("../assets/toolbar-icons/rectangle.png"),
35
+ active: require("../assets/toolbar-icons/rectangle-enabled.png")
36
+ }
37
+ }, {
38
+ type: "circle",
39
+ label: "Circle",
40
+ icons: {
41
+ default: require("../assets/toolbar-icons/circle.png"),
42
+ active: require("../assets/toolbar-icons/circle-enabled.png")
43
+ }
44
+ }, {
45
+ type: "polygon",
46
+ label: "Polygon",
47
+ icons: {
48
+ default: require("../assets/toolbar-icons/polygon.png"),
49
+ active: require("../assets/toolbar-icons/polygon-enabled.png")
50
+ }
51
+ }, {
52
+ type: "measure",
53
+ label: "Measure",
54
+ icons: {
55
+ default: require("../assets/toolbar-icons/measure.png"),
56
+ active: require("../assets/toolbar-icons/measure-enabled.png")
57
+ }
58
+ }, {
59
+ type: "text",
60
+ label: "Text",
61
+ icons: {
62
+ default: require("../assets/toolbar-icons/text.png"),
63
+ active: require("../assets/toolbar-icons/text-enabled.png")
64
+ }
65
+ }];
66
+ const FULL_TOOLBAR_WIDTH = TOOLS.length * BUTTON_SIZE + BUTTON_SIZE * 2 +
67
+ // undo + reset
68
+ BUTTON_GAP * (TOOLS.length + 1) + TOOLBAR_HORIZONTAL_PADDING * 2;
69
+ export const Toolbar = /*#__PURE__*/React.memo(function Toolbar({
70
+ currentTool,
71
+ onSelectTool,
72
+ onUndo,
73
+ canUndo,
74
+ isZoomed,
75
+ onResetZoom
76
+ }) {
77
+ const {
78
+ width
79
+ } = useWindowDimensions();
80
+ const availableWidth = Math.max(width - 24, BUTTON_SIZE * 4);
81
+ const shellWidth = Math.min(availableWidth, 560);
82
+ const shouldCenterContent = shellWidth >= FULL_TOOLBAR_WIDTH;
83
+ return /*#__PURE__*/_jsx(View, {
84
+ style: styles.container,
85
+ children: /*#__PURE__*/_jsx(View, {
86
+ style: [styles.shell, {
87
+ width: shellWidth
88
+ }],
89
+ children: /*#__PURE__*/_jsxs(ScrollView, {
90
+ horizontal: true,
91
+ bounces: false,
92
+ showsHorizontalScrollIndicator: false,
93
+ contentContainerStyle: [styles.scrollContent, shouldCenterContent && styles.scrollContentCentered],
94
+ children: [TOOLS.map(tool => /*#__PURE__*/_jsx(ToolButton, {
95
+ tool: tool,
96
+ isActive: currentTool === tool.type,
97
+ onPress: onSelectTool
98
+ }, tool.type)), /*#__PURE__*/_jsx(TouchableOpacity, {
99
+ accessibilityLabel: "Undo",
100
+ style: [styles.button, !canUndo && styles.buttonDisabled],
101
+ onPress: onUndo,
102
+ disabled: !canUndo,
103
+ activeOpacity: 0.7,
104
+ children: /*#__PURE__*/_jsx(Text, {
105
+ style: [styles.undoIcon, !canUndo && styles.iconDisabled],
106
+ children: "\u21A9"
107
+ })
108
+ }), isZoomed && /*#__PURE__*/_jsx(TouchableOpacity, {
109
+ accessibilityLabel: "Reset zoom",
110
+ style: styles.button,
111
+ onPress: onResetZoom,
112
+ activeOpacity: 0.7,
113
+ children: /*#__PURE__*/_jsx(Text, {
114
+ style: styles.undoIcon,
115
+ children: "\u2299"
116
+ })
117
+ })]
118
+ })
119
+ })
120
+ });
121
+ });
122
+ const ToolButton = /*#__PURE__*/React.memo(function ToolButton({
123
+ tool,
124
+ isActive,
125
+ onPress
126
+ }) {
127
+ const handlePress = useCallback(() => {
128
+ onPress(tool.type);
129
+ }, [onPress, tool.type]);
130
+ return /*#__PURE__*/_jsx(TouchableOpacity, {
131
+ accessibilityLabel: tool.label,
132
+ style: styles.button,
133
+ onPress: handlePress,
134
+ activeOpacity: 0.7,
135
+ children: /*#__PURE__*/_jsx(Image, {
136
+ source: isActive ? tool.icons.active : tool.icons.default,
137
+ style: [styles.iconImage, isActive && styles.iconImageActive],
138
+ resizeMode: "contain"
139
+ })
140
+ });
141
+ });
142
+ const styles = StyleSheet.create({
143
+ container: {
144
+ width: "100%",
145
+ alignItems: "center",
146
+ paddingHorizontal: 12,
147
+ paddingVertical: 8
148
+ },
149
+ shell: {
150
+ backgroundColor: "rgba(0, 0, 0, 0.88)",
151
+ borderRadius: 18,
152
+ borderWidth: StyleSheet.hairlineWidth,
153
+ borderColor: "rgba(255, 255, 255, 0.16)"
154
+ },
155
+ scrollContent: {
156
+ alignItems: "center",
157
+ flexGrow: 1,
158
+ paddingHorizontal: TOOLBAR_HORIZONTAL_PADDING,
159
+ paddingVertical: 10,
160
+ gap: BUTTON_GAP
161
+ },
162
+ scrollContentCentered: {
163
+ justifyContent: "center"
164
+ },
165
+ button: {
166
+ width: BUTTON_SIZE,
167
+ height: BUTTON_SIZE,
168
+ borderRadius: BUTTON_SIZE / 2,
169
+ justifyContent: "center",
170
+ alignItems: "center",
171
+ backgroundColor: "transparent"
172
+ },
173
+ buttonDisabled: {
174
+ opacity: 0.4
175
+ },
176
+ iconImage: {
177
+ width: 26,
178
+ height: 26
179
+ },
180
+ iconImageActive: {
181
+ width: 36,
182
+ height: 36
183
+ },
184
+ iconDisabled: {
185
+ color: "#666666"
186
+ },
187
+ undoIcon: {
188
+ fontSize: 24,
189
+ lineHeight: 24,
190
+ color: "#FFFFFF"
191
+ }
192
+ });
193
+ //# sourceMappingURL=Toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","View","TouchableOpacity","ScrollView","StyleSheet","Text","Image","useWindowDimensions","jsx","_jsx","jsxs","_jsxs","BUTTON_SIZE","BUTTON_GAP","TOOLBAR_HORIZONTAL_PADDING","TOOLS","type","label","icons","default","require","active","FULL_TOOLBAR_WIDTH","length","Toolbar","memo","currentTool","onSelectTool","onUndo","canUndo","isZoomed","onResetZoom","width","availableWidth","Math","max","shellWidth","min","shouldCenterContent","style","styles","container","children","shell","horizontal","bounces","showsHorizontalScrollIndicator","contentContainerStyle","scrollContent","scrollContentCentered","map","tool","ToolButton","isActive","onPress","accessibilityLabel","button","buttonDisabled","disabled","activeOpacity","undoIcon","iconDisabled","handlePress","source","iconImage","iconImageActive","resizeMode","create","alignItems","paddingHorizontal","paddingVertical","backgroundColor","borderRadius","borderWidth","hairlineWidth","borderColor","flexGrow","gap","justifyContent","height","opacity","color","fontSize","lineHeight"],"sourceRoot":"../../../src","sources":["components/Toolbar.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ import React from "react";
4
+ import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
5
+ import Animated, { useAnimatedStyle, useDerivedValue, withTiming } from "react-native-reanimated";
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ const AnimatedTouchable = Animated.createAnimatedComponent(TouchableOpacity);
8
+ const HINT_DURATION = 3000;
9
+ const FADE_DURATION = 400;
10
+ export const ZoomBadge = /*#__PURE__*/React.memo(function ZoomBadge({
11
+ scale,
12
+ onPress
13
+ }) {
14
+ const isZoomed = useDerivedValue(() => scale.value > 1.02);
15
+ const [hintExpired, setHintExpired] = React.useState(false);
16
+ const [mounted, setMounted] = React.useState(true);
17
+ const [zoomed, setZoomed] = React.useState(false);
18
+
19
+ // Start fade-out after HINT_DURATION, then unmount after animation
20
+ React.useEffect(() => {
21
+ const fadeTimer = setTimeout(() => setHintExpired(true), HINT_DURATION);
22
+ const unmountTimer = setTimeout(() => setMounted(false), HINT_DURATION + FADE_DURATION);
23
+ return () => {
24
+ clearTimeout(fadeTimer);
25
+ clearTimeout(unmountTimer);
26
+ };
27
+ }, []);
28
+
29
+ // Track zoom state on JS thread
30
+ React.useEffect(() => {
31
+ const id = setInterval(() => {
32
+ setZoomed(isZoomed.value);
33
+ }, 100);
34
+ return () => clearInterval(id);
35
+ }, [isZoomed]);
36
+ const animatedStyle = useAnimatedStyle(() => {
37
+ const show = isZoomed.value || !hintExpired;
38
+ return {
39
+ opacity: withTiming(show ? 1 : 0, {
40
+ duration: FADE_DURATION
41
+ }),
42
+ transform: [{
43
+ scale: withTiming(show ? 1 : 0.85, {
44
+ duration: FADE_DURATION
45
+ })
46
+ }]
47
+ };
48
+ }, [hintExpired]);
49
+ const zoomText = useDerivedValue(() => {
50
+ const s = Math.round(scale.value * 10) / 10;
51
+ return `${s}x`;
52
+ });
53
+
54
+ // Keep mounted while hint is visible OR zoomed
55
+ if (!mounted && !zoomed) return null;
56
+ return /*#__PURE__*/_jsx(AnimatedTouchable, {
57
+ style: [styles.badge, animatedStyle],
58
+ onPress: onPress,
59
+ activeOpacity: 0.7,
60
+ children: zoomed ? /*#__PURE__*/_jsx(ZoomLabel, {
61
+ zoomText: zoomText
62
+ }) : /*#__PURE__*/_jsxs(View, {
63
+ style: styles.iconRow,
64
+ children: [/*#__PURE__*/_jsx(MagnifyIcon, {}), /*#__PURE__*/_jsx(Text, {
65
+ style: styles.hintText,
66
+ children: "Pinch to zoom"
67
+ })]
68
+ })
69
+ });
70
+ });
71
+ function ZoomLabel({
72
+ zoomText
73
+ }) {
74
+ const [text, setText] = React.useState("1x");
75
+ React.useEffect(() => {
76
+ const id = setInterval(() => {
77
+ const val = zoomText.value;
78
+ setText(prev => prev !== val ? val : prev);
79
+ }, 100);
80
+ return () => clearInterval(id);
81
+ }, [zoomText]);
82
+ return /*#__PURE__*/_jsx(Text, {
83
+ style: styles.text,
84
+ children: text
85
+ });
86
+ }
87
+ function MagnifyIcon() {
88
+ return /*#__PURE__*/_jsxs(View, {
89
+ style: styles.magnifyIcon,
90
+ children: [/*#__PURE__*/_jsx(View, {
91
+ style: styles.lens
92
+ }), /*#__PURE__*/_jsx(View, {
93
+ style: styles.handle
94
+ })]
95
+ });
96
+ }
97
+ const styles = StyleSheet.create({
98
+ badge: {
99
+ position: "absolute",
100
+ top: 12,
101
+ alignSelf: "center",
102
+ backgroundColor: "rgba(0, 0, 0, 0.55)",
103
+ borderRadius: 14,
104
+ paddingHorizontal: 10,
105
+ paddingVertical: 5,
106
+ borderWidth: StyleSheet.hairlineWidth,
107
+ borderColor: "rgba(255, 255, 255, 0.25)",
108
+ flexDirection: "row",
109
+ alignItems: "center"
110
+ },
111
+ text: {
112
+ color: "#FFFFFF",
113
+ fontSize: 13,
114
+ fontWeight: "600",
115
+ fontVariant: ["tabular-nums"]
116
+ },
117
+ iconRow: {
118
+ flexDirection: "row",
119
+ alignItems: "center",
120
+ gap: 5
121
+ },
122
+ hintText: {
123
+ color: "rgba(255, 255, 255, 0.9)",
124
+ fontSize: 12,
125
+ fontWeight: "500"
126
+ },
127
+ magnifyIcon: {
128
+ width: 14,
129
+ height: 14,
130
+ position: "relative"
131
+ },
132
+ lens: {
133
+ width: 9,
134
+ height: 9,
135
+ borderRadius: 5,
136
+ borderWidth: 1.5,
137
+ borderColor: "#FFFFFF",
138
+ position: "absolute",
139
+ top: 0,
140
+ left: 0
141
+ },
142
+ handle: {
143
+ width: 5,
144
+ height: 1.5,
145
+ backgroundColor: "#FFFFFF",
146
+ borderRadius: 1,
147
+ position: "absolute",
148
+ bottom: 1.5,
149
+ right: 0,
150
+ transform: [{
151
+ rotate: "45deg"
152
+ }]
153
+ }
154
+ });
155
+ //# sourceMappingURL=ZoomBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","StyleSheet","Text","TouchableOpacity","View","Animated","useAnimatedStyle","useDerivedValue","withTiming","jsx","_jsx","jsxs","_jsxs","AnimatedTouchable","createAnimatedComponent","HINT_DURATION","FADE_DURATION","ZoomBadge","memo","scale","onPress","isZoomed","value","hintExpired","setHintExpired","useState","mounted","setMounted","zoomed","setZoomed","useEffect","fadeTimer","setTimeout","unmountTimer","clearTimeout","id","setInterval","clearInterval","animatedStyle","show","opacity","duration","transform","zoomText","s","Math","round","style","styles","badge","activeOpacity","children","ZoomLabel","iconRow","MagnifyIcon","hintText","text","setText","val","prev","magnifyIcon","lens","handle","create","position","top","alignSelf","backgroundColor","borderRadius","paddingHorizontal","paddingVertical","borderWidth","hairlineWidth","borderColor","flexDirection","alignItems","color","fontSize","fontWeight","fontVariant","gap","width","height","left","bottom","right","rotate"],"sourceRoot":"../../../src","sources":["components/ZoomBadge.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ import { useCallback } from "react";
4
+ import { Gesture } from "react-native-gesture-handler";
5
+ import { useSharedValue, useDerivedValue, runOnJS } from "react-native-reanimated";
6
+ import { Skia } from "@shopify/react-native-skia";
7
+ import { buildSmoothedPathFromFlat } from "../utils/smoothing";
8
+ import { normalize, screenToCanvas } from "../utils/coordinates";
9
+ import { generateId } from "../utils/serialization";
10
+ import { detectShape } from "../utils/shapeDetection";
11
+ import { useDrawingStore } from "../store/useDrawingStore";
12
+ const MIN_GESTURE_DURATION_MS = 300;
13
+ const MIN_GESTURE_DISTANCE = 5;
14
+ export function useFreehandGesture({
15
+ colorSV,
16
+ lineWidthSV,
17
+ fillColorSV,
18
+ fillAlphaSV,
19
+ canvasSize,
20
+ enabled,
21
+ imageOffsetX,
22
+ imageOffsetY,
23
+ imageWidth,
24
+ imageHeight,
25
+ viewScale,
26
+ viewTranslateX,
27
+ viewTranslateY
28
+ }) {
29
+ const rawPoints = useSharedValue([]);
30
+ const isDrawing = useSharedValue(false);
31
+ const gestureStartTime = useSharedValue(0);
32
+ const gestureStartPos = useSharedValue([0, 0]);
33
+ const addObject = useDrawingStore(s => s.addObject);
34
+
35
+ // Build the path in the Skia worklet on every points update
36
+ const inProgressPath = useDerivedValue(() => {
37
+ if (!isDrawing.value) return null;
38
+ const svg = buildSmoothedPathFromFlat(rawPoints.value);
39
+ if (!svg) return null;
40
+ const path = Skia.Path.MakeFromSVGString(svg);
41
+ return path;
42
+ });
43
+ const inProgressColor = useDerivedValue(() => colorSV.value);
44
+ const inProgressWidth = useDerivedValue(() => lineWidthSV.value);
45
+ const commitPath = useCallback((flatPoints, durationMs, color, lineWidth, fillColor, fillAlpha) => {
46
+ const n = flatPoints.length / 2;
47
+ if (n < 2) return;
48
+
49
+ // Convert flat array to Point[]
50
+ const pixelPoints = [];
51
+ for (let i = 0; i < n; i++) {
52
+ pixelPoints.push({
53
+ x: flatPoints[i * 2],
54
+ y: flatPoints[i * 2 + 1]
55
+ });
56
+ }
57
+
58
+ // Try auto shape detection
59
+ const detected = detectShape(pixelPoints, durationMs);
60
+ let obj;
61
+ if (detected) {
62
+ const from = normalize(detected.from, canvasSize);
63
+ const to = normalize(detected.to, canvasSize);
64
+ switch (detected.type) {
65
+ case "circle":
66
+ obj = {
67
+ id: generateId(),
68
+ type: "circle",
69
+ from,
70
+ to,
71
+ color,
72
+ lineWidth,
73
+ backgroundColor: fillColor ?? undefined,
74
+ backgroundAlpha: fillColor ? fillAlpha : undefined
75
+ };
76
+ break;
77
+ case "rectangle":
78
+ obj = {
79
+ id: generateId(),
80
+ type: "rectangle",
81
+ from,
82
+ to,
83
+ color,
84
+ lineWidth,
85
+ backgroundColor: fillColor ?? undefined,
86
+ backgroundAlpha: fillColor ? fillAlpha : undefined
87
+ };
88
+ break;
89
+ case "line":
90
+ obj = {
91
+ id: generateId(),
92
+ type: "line",
93
+ from,
94
+ to,
95
+ color,
96
+ lineWidth
97
+ };
98
+ break;
99
+ }
100
+ } else {
101
+ // Store as freehand with normalized points
102
+ const normalizedPoints = pixelPoints.map(p => normalize(p, canvasSize));
103
+ obj = {
104
+ id: generateId(),
105
+ type: "freehand",
106
+ points: normalizedPoints,
107
+ color,
108
+ lineWidth
109
+ };
110
+ }
111
+ addObject(obj);
112
+ }, [canvasSize, addObject]);
113
+ const gesture = Gesture.Pan().enabled(enabled).maxPointers(1).minDistance(0).onBegin(e => {
114
+ "worklet";
115
+
116
+ const canvas = screenToCanvas(e.x, e.y, viewScale.value, viewTranslateX.value, viewTranslateY.value);
117
+ const x = Math.max(0, Math.min(imageWidth.value, canvas.x - imageOffsetX.value));
118
+ const y = Math.max(0, Math.min(imageHeight.value, canvas.y - imageOffsetY.value));
119
+ isDrawing.value = true;
120
+ gestureStartTime.value = Date.now();
121
+ gestureStartPos.value = [x, y];
122
+ rawPoints.value = [x, y];
123
+ }).onUpdate(e => {
124
+ "worklet";
125
+
126
+ const canvas = screenToCanvas(e.x, e.y, viewScale.value, viewTranslateX.value, viewTranslateY.value);
127
+ const x = Math.max(0, Math.min(imageWidth.value, canvas.x - imageOffsetX.value));
128
+ const y = Math.max(0, Math.min(imageHeight.value, canvas.y - imageOffsetY.value));
129
+ // Append new point
130
+ rawPoints.value = [...rawPoints.value, x, y];
131
+ }).onEnd(e => {
132
+ "worklet";
133
+
134
+ const canvas = screenToCanvas(e.x, e.y, viewScale.value, viewTranslateX.value, viewTranslateY.value);
135
+ const x = Math.max(0, Math.min(imageWidth.value, canvas.x - imageOffsetX.value));
136
+ const y = Math.max(0, Math.min(imageHeight.value, canvas.y - imageOffsetY.value));
137
+ const duration = Date.now() - gestureStartTime.value;
138
+ const [sx, sy] = gestureStartPos.value;
139
+ const dist = Math.sqrt((x - sx) ** 2 + (y - sy) ** 2);
140
+
141
+ // Cancel accidental taps (< 300ms and < 5px movement)
142
+ if (duration < MIN_GESTURE_DURATION_MS && dist < MIN_GESTURE_DISTANCE) {
143
+ isDrawing.value = false;
144
+ rawPoints.value = [];
145
+ return;
146
+ }
147
+ const pts = rawPoints.value;
148
+ const color = colorSV.value;
149
+ const lw = lineWidthSV.value;
150
+ const fc = fillColorSV.value;
151
+ const fa = fillAlphaSV.value;
152
+ isDrawing.value = false;
153
+ rawPoints.value = [];
154
+ runOnJS(commitPath)(pts, duration, color, lw, fc, fa);
155
+ }).onFinalize(() => {
156
+ "worklet";
157
+
158
+ isDrawing.value = false;
159
+ rawPoints.value = [];
160
+ });
161
+ return {
162
+ gesture,
163
+ inProgressPath,
164
+ inProgressColor,
165
+ inProgressWidth,
166
+ isDrawing
167
+ };
168
+ }
169
+ //# sourceMappingURL=useFreehandGesture.js.map