@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,181 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "buildSmoothedPath", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _smoothing.buildSmoothedPath;
10
+ }
11
+ });
12
+ exports.distanceToSegment = distanceToSegment;
13
+ exports.hitTestObject = hitTestObject;
14
+ var _coordinates = require("./coordinates");
15
+ var _smoothing = require("./smoothing");
16
+ const HIT_PADDING = 20; // pixels tolerance for hit-testing lines/paths
17
+
18
+ /**
19
+ * Test if a pixel-space tap point hits a drawing object.
20
+ * All object coordinates are normalized and must be denormalized with canvasSize.
21
+ *
22
+ * Returns true if the point is within hit range of the object.
23
+ */
24
+ function hitTestObject(object, tapPoint, canvasSize) {
25
+ switch (object.type) {
26
+ case "freehand":
27
+ return hitTestFreehand(object, tapPoint, canvasSize);
28
+ case "line":
29
+ case "arrow":
30
+ case "measure":
31
+ return hitTestLine(object, tapPoint, canvasSize);
32
+ case "rectangle":
33
+ return hitTestRect(object, tapPoint, canvasSize);
34
+ case "circle":
35
+ return hitTestEllipse(object, tapPoint, canvasSize);
36
+ case "polygon":
37
+ return hitTestPolygon(object, tapPoint, canvasSize);
38
+ case "text":
39
+ return hitTestText(object, tapPoint, canvasSize);
40
+ }
41
+ }
42
+ function hitTestFreehand(object, tap, canvasSize) {
43
+ const points = (0, _coordinates.denormalizePoints)(object.points, canvasSize);
44
+ const padding = HIT_PADDING + object.lineWidth / 2;
45
+
46
+ // Check distance to each segment of the smoothed path
47
+ for (let i = 0; i < points.length - 1; i++) {
48
+ const a = points[i];
49
+ const b = points[i + 1];
50
+ if (distanceToSegment(tap, a, b) < padding) {
51
+ return true;
52
+ }
53
+ }
54
+ return false;
55
+ }
56
+ function hitTestLine(object, tap, canvasSize) {
57
+ const from = (0, _coordinates.denormalize)(object.from, canvasSize);
58
+ const to = (0, _coordinates.denormalize)(object.to, canvasSize);
59
+ const padding = HIT_PADDING + object.lineWidth / 2;
60
+ return distanceToSegment(tap, from, to) < padding;
61
+ }
62
+ function hitTestRect(object, tap, canvasSize) {
63
+ const from = (0, _coordinates.denormalize)(object.from, canvasSize);
64
+ const to = (0, _coordinates.denormalize)(object.to, canvasSize);
65
+ const padding = HIT_PADDING;
66
+ const minX = Math.min(from.x, to.x) - padding;
67
+ const maxX = Math.max(from.x, to.x) + padding;
68
+ const minY = Math.min(from.y, to.y) - padding;
69
+ const maxY = Math.max(from.y, to.y) + padding;
70
+
71
+ // If has fill, hit inside the rect
72
+ if ("backgroundColor" in object && object.backgroundColor) {
73
+ return tap.x >= minX && tap.x <= maxX && tap.y >= minY && tap.y <= maxY;
74
+ }
75
+
76
+ // Otherwise, hit the border only
77
+ const innerMinX = Math.min(from.x, to.x) + padding;
78
+ const innerMaxX = Math.max(from.x, to.x) - padding;
79
+ const innerMinY = Math.min(from.y, to.y) + padding;
80
+ const innerMaxY = Math.max(from.y, to.y) - padding;
81
+ const inOuter = tap.x >= minX && tap.x <= maxX && tap.y >= minY && tap.y <= maxY;
82
+ const inInner = tap.x >= innerMinX && tap.x <= innerMaxX && tap.y >= innerMinY && tap.y <= innerMaxY;
83
+ return inOuter && !inInner;
84
+ }
85
+ function hitTestEllipse(object, tap, canvasSize) {
86
+ const from = (0, _coordinates.denormalize)(object.from, canvasSize);
87
+ const to = (0, _coordinates.denormalize)(object.to, canvasSize);
88
+ const cx = (from.x + to.x) / 2;
89
+ const cy = (from.y + to.y) / 2;
90
+ const rx = Math.abs(to.x - from.x) / 2;
91
+ const ry = Math.abs(to.y - from.y) / 2;
92
+ if (rx === 0 || ry === 0) return false;
93
+ const dx = tap.x - cx;
94
+ const dy = tap.y - cy;
95
+
96
+ // Normalized distance from center
97
+ // If has fill, hit inside the ellipse
98
+ if ("backgroundColor" in object && object.backgroundColor) {
99
+ const outerRx = rx + HIT_PADDING;
100
+ const outerRy = ry + HIT_PADDING;
101
+ return dx * dx / (outerRx * outerRx) + dy * dy / (outerRy * outerRy) <= 1;
102
+ }
103
+
104
+ // Otherwise, hit the border ring
105
+ const padding = HIT_PADDING + ("lineWidth" in object ? object.lineWidth / 2 : 2);
106
+ const outerRx = rx + padding;
107
+ const outerRy = ry + padding;
108
+ const innerRx = Math.max(0, rx - padding);
109
+ const innerRy = Math.max(0, ry - padding);
110
+ const outerDist = dx * dx / (outerRx * outerRx) + dy * dy / (outerRy * outerRy);
111
+ const innerDist = innerRx > 0 && innerRy > 0 ? dx * dx / (innerRx * innerRx) + dy * dy / (innerRy * innerRy) : Infinity;
112
+ return outerDist <= 1 && innerDist >= 1;
113
+ }
114
+ function hitTestText(object, tap, canvasSize) {
115
+ const pos = (0, _coordinates.denormalize)(object.position, canvasSize);
116
+ const w = object.width * canvasSize.width;
117
+ const h = object.height * canvasSize.height;
118
+ return tap.x >= pos.x && tap.x <= pos.x + w && tap.y >= pos.y && tap.y <= pos.y + h;
119
+ }
120
+ function hitTestPolygon(object, tap, canvasSize) {
121
+ const points = (0, _coordinates.denormalizePoints)(object.points, canvasSize);
122
+ if (points.length < 2) return false;
123
+ const padding = HIT_PADDING + object.lineWidth / 2;
124
+
125
+ // If filled and closed, check if point is inside the polygon
126
+ if (object.closed && object.backgroundColor) {
127
+ if (pointInPolygon(tap, points)) return true;
128
+ }
129
+
130
+ // Check distance to each segment (including closing segment if closed)
131
+ const len = points.length;
132
+ for (let i = 0; i < len - 1; i++) {
133
+ if (distanceToSegment(tap, points[i], points[i + 1]) < padding) {
134
+ return true;
135
+ }
136
+ }
137
+ // Closing segment
138
+ if (object.closed && len >= 3) {
139
+ if (distanceToSegment(tap, points[len - 1], points[0]) < padding) {
140
+ return true;
141
+ }
142
+ }
143
+ return false;
144
+ }
145
+
146
+ /** Ray-casting point-in-polygon test */
147
+ function pointInPolygon(p, polygon) {
148
+ let inside = false;
149
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
150
+ const xi = polygon[i].x;
151
+ const yi = polygon[i].y;
152
+ const xj = polygon[j].x;
153
+ const yj = polygon[j].y;
154
+ const intersect = yi > p.y !== yj > p.y && p.x < (xj - xi) * (p.y - yi) / (yj - yi) + xi;
155
+ if (intersect) inside = !inside;
156
+ }
157
+ return inside;
158
+ }
159
+
160
+ /**
161
+ * Returns the minimum distance from point p to segment [a, b].
162
+ */
163
+ function distanceToSegment(p, a, b) {
164
+ const dx = b.x - a.x;
165
+ const dy = b.y - a.y;
166
+ const lenSq = dx * dx + dy * dy;
167
+ if (lenSq === 0) {
168
+ // a and b are the same point
169
+ return Math.sqrt((p.x - a.x) ** 2 + (p.y - a.y) ** 2);
170
+ }
171
+ let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / lenSq;
172
+ t = Math.max(0, Math.min(1, t));
173
+ const projX = a.x + t * dx;
174
+ const projY = a.y + t * dy;
175
+ return Math.sqrt((p.x - projX) ** 2 + (p.y - projY) ** 2);
176
+ }
177
+
178
+ /**
179
+ * Export for use in selection gesture calculations.
180
+ */
181
+ //# sourceMappingURL=hitTesting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_coordinates","require","_smoothing","HIT_PADDING","hitTestObject","object","tapPoint","canvasSize","type","hitTestFreehand","hitTestLine","hitTestRect","hitTestEllipse","hitTestPolygon","hitTestText","tap","points","denormalizePoints","padding","lineWidth","i","length","a","b","distanceToSegment","from","denormalize","to","minX","Math","min","x","maxX","max","minY","y","maxY","backgroundColor","innerMinX","innerMaxX","innerMinY","innerMaxY","inOuter","inInner","cx","cy","rx","abs","ry","dx","dy","outerRx","outerRy","innerRx","innerRy","outerDist","innerDist","Infinity","pos","position","w","width","h","height","closed","pointInPolygon","len","p","polygon","inside","j","xi","yi","xj","yj","intersect","lenSq","sqrt","t","projX","projY"],"sourceRoot":"../../../src","sources":["utils/hitTesting.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.deserializeObjects = deserializeObjects;
7
+ exports.generateId = generateId;
8
+ exports.serializeObjects = serializeObjects;
9
+ /**
10
+ * Serialize drawing state to a JSON-compatible structure.
11
+ */
12
+ function serializeObjects(objects, canvasSize) {
13
+ return JSON.stringify({
14
+ version: 1,
15
+ canvasSize,
16
+ objects
17
+ });
18
+ }
19
+
20
+ /**
21
+ * Deserialize drawing state from JSON.
22
+ */
23
+ function deserializeObjects(json) {
24
+ try {
25
+ const data = JSON.parse(json);
26
+ if (!data.objects || !data.canvasSize) return null;
27
+ return {
28
+ objects: data.objects,
29
+ canvasSize: data.canvasSize
30
+ };
31
+ } catch {
32
+ return null;
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Generate a unique ID for drawing objects.
38
+ */
39
+ function generateId() {
40
+ return Date.now().toString(36) + Math.random().toString(36).substring(2, 8);
41
+ }
42
+ //# sourceMappingURL=serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["serializeObjects","objects","canvasSize","JSON","stringify","version","deserializeObjects","json","data","parse","generateId","Date","now","toString","Math","random","substring"],"sourceRoot":"../../../src","sources":["utils/serialization.ts"],"mappings":";;;;;;;;AAEA;AACA;AACA;AACO,SAASA,gBAAgBA,CAC9BC,OAAwB,EACxBC,UAAgB,EACR;EACR,OAAOC,IAAI,CAACC,SAAS,CAAC;IACpBC,OAAO,EAAE,CAAC;IACVH,UAAU;IACVD;EACF,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACO,SAASK,kBAAkBA,CAACC,IAAY,EAGtC;EACP,IAAI;IACF,MAAMC,IAAI,GAAGL,IAAI,CAACM,KAAK,CAACF,IAAI,CAI3B;IACD,IAAI,CAACC,IAAI,CAACP,OAAO,IAAI,CAACO,IAAI,CAACN,UAAU,EAAE,OAAO,IAAI;IAClD,OAAO;MACLD,OAAO,EAAEO,IAAI,CAACP,OAAO;MACrBC,UAAU,EAAEM,IAAI,CAACN;IACnB,CAAC;EACH,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;;AAEA;AACA;AACA;AACO,SAASQ,UAAUA,CAAA,EAAW;EACnC,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,GAAGC,IAAI,CAACC,MAAM,CAAC,CAAC,CAACF,QAAQ,CAAC,EAAE,CAAC,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7E","ignoreList":[]}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.detectShape = detectShape;
7
+ /**
8
+ * Count the number of direction changes (inflections) in a series of points.
9
+ * An inflection is when the general direction of movement reverses or sharply changes.
10
+ */
11
+ function countInflections(points, startIndex = 0) {
12
+ if (points.length < 3) return 0;
13
+ let inflections = 0;
14
+ for (let i = Math.max(startIndex, 1); i < points.length - 1; i++) {
15
+ const prev = points[i - 1];
16
+ const curr = points[i];
17
+ const next = points[i + 1];
18
+ const dx1 = curr.x - prev.x;
19
+ const dy1 = curr.y - prev.y;
20
+ const dx2 = next.x - curr.x;
21
+ const dy2 = next.y - curr.y;
22
+
23
+ // Cross product sign change indicates direction change
24
+ const cross = dx1 * dy2 - dy1 * dx2;
25
+ if (i > Math.max(startIndex, 1)) {
26
+ const prevPrev = points[i - 2];
27
+ const pdx1 = prev.x - prevPrev.x;
28
+ const pdy1 = prev.y - prevPrev.y;
29
+ const prevCross = pdx1 * dy1 - pdy1 * dx1;
30
+ if (prevCross * cross < 0) {
31
+ inflections++;
32
+ }
33
+ }
34
+ }
35
+ return inflections;
36
+ }
37
+
38
+ /**
39
+ * Compute total angle traversed by the path.
40
+ * Used for circle detection (should be ~2π for a full circle).
41
+ */
42
+ function totalAngleTraversed(points) {
43
+ if (points.length < 3) return 0;
44
+ let totalAngle = 0;
45
+ for (let i = 1; i < points.length - 1; i++) {
46
+ const prev = points[i - 1];
47
+ const curr = points[i];
48
+ const next = points[i + 1];
49
+ const a1 = Math.atan2(curr.y - prev.y, curr.x - prev.x);
50
+ const a2 = Math.atan2(next.y - curr.y, next.x - curr.x);
51
+ let delta = a2 - a1;
52
+
53
+ // Normalize to [-π, π]
54
+ while (delta > Math.PI) delta -= 2 * Math.PI;
55
+ while (delta < -Math.PI) delta += 2 * Math.PI;
56
+ totalAngle += delta;
57
+ }
58
+ return totalAngle;
59
+ }
60
+ function dist(a, b) {
61
+ const dx = a.x - b.x;
62
+ const dy = a.y - b.y;
63
+ return Math.sqrt(dx * dx + dy * dy);
64
+ }
65
+ function boundingRect(points) {
66
+ let minX = Infinity;
67
+ let minY = Infinity;
68
+ let maxX = -Infinity;
69
+ let maxY = -Infinity;
70
+ for (const p of points) {
71
+ if (p.x < minX) minX = p.x;
72
+ if (p.y < minY) minY = p.y;
73
+ if (p.x > maxX) maxX = p.x;
74
+ if (p.y > maxY) maxY = p.y;
75
+ }
76
+ return {
77
+ x: minX,
78
+ y: minY,
79
+ width: maxX - minX,
80
+ height: maxY - minY
81
+ };
82
+ }
83
+ /**
84
+ * Attempt to detect a geometric shape from freehand points.
85
+ * Returns the detected shape or null if no shape is recognized.
86
+ *
87
+ * Points should be in pixel coordinates. Duration in milliseconds.
88
+ */
89
+ function detectShape(points, durationMs) {
90
+ if (points.length < 5) return null;
91
+ const first = points[0];
92
+ const last = points[points.length - 1];
93
+ const startEndDist = dist(first, last);
94
+ const inflections = countInflections(points);
95
+
96
+ // ── Circle detection ──
97
+ // Duration < 1.5s, inflections ≤ 5, distance start↔end < threshold,
98
+ // total angle ≈ 2π (±45°)
99
+ if (durationMs < 1500 && inflections <= 5 && startEndDist < 150) {
100
+ const totalAngle = Math.abs(totalAngleTraversed(points));
101
+ const twoPi = 2 * Math.PI;
102
+ const tolerance = Math.PI / 4; // 45°
103
+
104
+ if (Math.abs(totalAngle - twoPi) < tolerance) {
105
+ const bbox = boundingRect(points);
106
+ return {
107
+ type: "circle",
108
+ from: {
109
+ x: bbox.x,
110
+ y: bbox.y
111
+ },
112
+ to: {
113
+ x: bbox.x + bbox.width,
114
+ y: bbox.y + bbox.height
115
+ }
116
+ };
117
+ }
118
+ }
119
+
120
+ // ── Rectangle detection ──
121
+ // Duration < 12s, inflections ≤ 15, distance start↔end < threshold
122
+ if (durationMs < 12000 && inflections <= 15 && startEndDist < 30) {
123
+ const bbox = boundingRect(points);
124
+ return {
125
+ type: "rectangle",
126
+ from: {
127
+ x: bbox.x,
128
+ y: bbox.y
129
+ },
130
+ to: {
131
+ x: bbox.x + bbox.width,
132
+ y: bbox.y + bbox.height
133
+ }
134
+ };
135
+ }
136
+
137
+ // ── Line detection ──
138
+ // Duration < 4s, inflections ≤ 4 (checked from 11th point onward)
139
+ if (durationMs < 4000 && points.length >= 11) {
140
+ const lineInflections = countInflections(points, 10);
141
+ if (lineInflections <= 4) {
142
+ return {
143
+ type: "line",
144
+ from: first,
145
+ to: last
146
+ };
147
+ }
148
+ }
149
+ return null;
150
+ }
151
+ //# sourceMappingURL=shapeDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["countInflections","points","startIndex","length","inflections","i","Math","max","prev","curr","next","dx1","x","dy1","y","dx2","dy2","cross","prevPrev","pdx1","pdy1","prevCross","totalAngleTraversed","totalAngle","a1","atan2","a2","delta","PI","dist","a","b","dx","dy","sqrt","boundingRect","minX","Infinity","minY","maxX","maxY","p","width","height","detectShape","durationMs","first","last","startEndDist","abs","twoPi","tolerance","bbox","type","from","to","lineInflections"],"sourceRoot":"../../../src","sources":["utils/shapeDetection.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildSmoothedPath = buildSmoothedPath;
7
+ exports.buildSmoothedPathFromFlat = buildSmoothedPathFromFlat;
8
+ /**
9
+ * Build a smoothed SVG path string from an array of pixel-space points
10
+ * using quadratic Bezier curves through midpoints.
11
+ *
12
+ * This is the standard "midpoint smoothing" algorithm for touch-based drawing:
13
+ * each raw point becomes a control point, and the curve passes through the
14
+ * midpoints between consecutive raw points.
15
+ */
16
+ function buildSmoothedPath(points) {
17
+ const n = points.length;
18
+ if (n === 0) return "";
19
+ if (n === 1) return `M ${points[0].x} ${points[0].y}`;
20
+ const first = points[0];
21
+ if (n === 2) {
22
+ const second = points[1];
23
+ return `M ${first.x} ${first.y} L ${second.x} ${second.y}`;
24
+ }
25
+
26
+ // Start at first point
27
+ const parts = [`M ${first.x} ${first.y}`];
28
+
29
+ // Line to first midpoint
30
+ const p1 = points[1];
31
+ const m0x = (first.x + p1.x) / 2;
32
+ const m0y = (first.y + p1.y) / 2;
33
+ parts.push(`L ${m0x} ${m0y}`);
34
+
35
+ // Quadratic curves through midpoints
36
+ for (let i = 1; i < n - 1; i++) {
37
+ const cp = points[i];
38
+ const next = points[i + 1];
39
+ const mx = (cp.x + next.x) / 2;
40
+ const my = (cp.y + next.y) / 2;
41
+ parts.push(`Q ${cp.x} ${cp.y} ${mx} ${my}`);
42
+ }
43
+
44
+ // Line to last point
45
+ const last = points[n - 1];
46
+ parts.push(`L ${last.x} ${last.y}`);
47
+ return parts.join(" ");
48
+ }
49
+
50
+ /**
51
+ * Build a smoothed SVG path from a flat array [x0, y0, x1, y1, ...].
52
+ * Used in worklets where Point objects aren't available.
53
+ */
54
+ function buildSmoothedPathFromFlat(coords) {
55
+ "worklet";
56
+
57
+ const n = coords.length / 2;
58
+ if (n < 1) return "";
59
+ if (n === 1) return `M ${coords[0]} ${coords[1]}`;
60
+ if (n === 2) {
61
+ return `M ${coords[0]} ${coords[1]} L ${coords[2]} ${coords[3]}`;
62
+ }
63
+ let svg = `M ${coords[0]} ${coords[1]}`;
64
+
65
+ // Line to first midpoint
66
+ const m0x = (coords[0] + coords[2]) / 2;
67
+ const m0y = (coords[1] + coords[3]) / 2;
68
+ svg += ` L ${m0x} ${m0y}`;
69
+
70
+ // Quadratic curves through midpoints
71
+ for (let i = 1; i < n - 1; i++) {
72
+ const cx = coords[i * 2];
73
+ const cy = coords[i * 2 + 1];
74
+ const nx = coords[(i + 1) * 2];
75
+ const ny = coords[(i + 1) * 2 + 1];
76
+ const mx = (cx + nx) / 2;
77
+ const my = (cy + ny) / 2;
78
+ svg += ` Q ${cx} ${cy} ${mx} ${my}`;
79
+ }
80
+
81
+ // Line to last point
82
+ svg += ` L ${coords[(n - 1) * 2]} ${coords[(n - 1) * 2 + 1]}`;
83
+ return svg;
84
+ }
85
+ //# sourceMappingURL=smoothing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["buildSmoothedPath","points","n","length","x","y","first","second","parts","p1","m0x","m0y","push","i","cp","next","mx","my","last","join","buildSmoothedPathFromFlat","coords","svg","cx","cy","nx","ny"],"sourceRoot":"../../../src","sources":["utils/smoothing.ts"],"mappings":"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","ignoreList":[]}