@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.
- package/README.md +181 -0
- package/lib/commonjs/DrawingEditor.js +815 -0
- package/lib/commonjs/DrawingEditor.js.map +1 -0
- package/lib/commonjs/assets/toolbar-icons/arrow-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/arrow-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/arrow.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/circle-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/circle-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/circle.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/freehand-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/freehand-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/freehand.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/line-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/line-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/line.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/measure-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/measure-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/measure.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/move-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/move-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/move.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/polygon-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/polygon-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/polygon.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/rectangle-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/rectangle-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/rectangle.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/text-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/text-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/text.png +0 -0
- package/lib/commonjs/components/ColorPalette.js +379 -0
- package/lib/commonjs/components/ColorPalette.js.map +1 -0
- package/lib/commonjs/components/LineWidthSlider.js +70 -0
- package/lib/commonjs/components/LineWidthSlider.js.map +1 -0
- package/lib/commonjs/components/MeasurementEditModal.js +153 -0
- package/lib/commonjs/components/MeasurementEditModal.js.map +1 -0
- package/lib/commonjs/components/MiniMap.js +244 -0
- package/lib/commonjs/components/MiniMap.js.map +1 -0
- package/lib/commonjs/components/TextAnnotation.js +162 -0
- package/lib/commonjs/components/TextAnnotation.js.map +1 -0
- package/lib/commonjs/components/TextEditModal.js +133 -0
- package/lib/commonjs/components/TextEditModal.js.map +1 -0
- package/lib/commonjs/components/Toolbar.js +198 -0
- package/lib/commonjs/components/Toolbar.js.map +1 -0
- package/lib/commonjs/components/ZoomBadge.js +161 -0
- package/lib/commonjs/components/ZoomBadge.js.map +1 -0
- package/lib/commonjs/hooks/useFreehandGesture.js +173 -0
- package/lib/commonjs/hooks/useFreehandGesture.js.map +1 -0
- package/lib/commonjs/hooks/usePolygonGesture.js +109 -0
- package/lib/commonjs/hooks/usePolygonGesture.js.map +1 -0
- package/lib/commonjs/hooks/useSelectionGesture.js +236 -0
- package/lib/commonjs/hooks/useSelectionGesture.js.map +1 -0
- package/lib/commonjs/hooks/useShapeGesture.js +181 -0
- package/lib/commonjs/hooks/useShapeGesture.js.map +1 -0
- package/lib/commonjs/hooks/useViewportGesture.js +238 -0
- package/lib/commonjs/hooks/useViewportGesture.js.map +1 -0
- package/lib/commonjs/index.js +104 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/renderers/ArrowRenderer.js +118 -0
- package/lib/commonjs/renderers/ArrowRenderer.js.map +1 -0
- package/lib/commonjs/renderers/CircleRenderer.js +51 -0
- package/lib/commonjs/renderers/CircleRenderer.js.map +1 -0
- package/lib/commonjs/renderers/FreehandRenderer.js +31 -0
- package/lib/commonjs/renderers/FreehandRenderer.js.map +1 -0
- package/lib/commonjs/renderers/InProgressRenderer.js +174 -0
- package/lib/commonjs/renderers/InProgressRenderer.js.map +1 -0
- package/lib/commonjs/renderers/LineRenderer.js +27 -0
- package/lib/commonjs/renderers/LineRenderer.js.map +1 -0
- package/lib/commonjs/renderers/MeasurementRenderer.js +134 -0
- package/lib/commonjs/renderers/MeasurementRenderer.js.map +1 -0
- package/lib/commonjs/renderers/ObjectRenderer.js +65 -0
- package/lib/commonjs/renderers/ObjectRenderer.js.map +1 -0
- package/lib/commonjs/renderers/PolygonRenderer.js +46 -0
- package/lib/commonjs/renderers/PolygonRenderer.js.map +1 -0
- package/lib/commonjs/renderers/RectRenderer.js +51 -0
- package/lib/commonjs/renderers/RectRenderer.js.map +1 -0
- package/lib/commonjs/renderers/SelectedObjectRenderer.js +592 -0
- package/lib/commonjs/renderers/SelectedObjectRenderer.js.map +1 -0
- package/lib/commonjs/renderers/SelectionOverlay.js +120 -0
- package/lib/commonjs/renderers/SelectionOverlay.js.map +1 -0
- package/lib/commonjs/store/useDrawingStore.js +354 -0
- package/lib/commonjs/store/useDrawingStore.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/colors.js +44 -0
- package/lib/commonjs/utils/colors.js.map +1 -0
- package/lib/commonjs/utils/coordinates.js +81 -0
- package/lib/commonjs/utils/coordinates.js.map +1 -0
- package/lib/commonjs/utils/hitTesting.js +181 -0
- package/lib/commonjs/utils/hitTesting.js.map +1 -0
- package/lib/commonjs/utils/serialization.js +42 -0
- package/lib/commonjs/utils/serialization.js.map +1 -0
- package/lib/commonjs/utils/shapeDetection.js +151 -0
- package/lib/commonjs/utils/shapeDetection.js.map +1 -0
- package/lib/commonjs/utils/smoothing.js +85 -0
- package/lib/commonjs/utils/smoothing.js.map +1 -0
- package/lib/module/DrawingEditor.js +811 -0
- package/lib/module/DrawingEditor.js.map +1 -0
- package/lib/module/assets/toolbar-icons/arrow-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/arrow-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/arrow.png +0 -0
- package/lib/module/assets/toolbar-icons/circle-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/circle-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/circle.png +0 -0
- package/lib/module/assets/toolbar-icons/freehand-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/freehand-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/freehand.png +0 -0
- package/lib/module/assets/toolbar-icons/line-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/line-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/line.png +0 -0
- package/lib/module/assets/toolbar-icons/measure-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/measure-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/measure.png +0 -0
- package/lib/module/assets/toolbar-icons/move-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/move-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/move.png +0 -0
- package/lib/module/assets/toolbar-icons/polygon-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/polygon-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/polygon.png +0 -0
- package/lib/module/assets/toolbar-icons/rectangle-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/rectangle-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/rectangle.png +0 -0
- package/lib/module/assets/toolbar-icons/text-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/text-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/text.png +0 -0
- package/lib/module/components/ColorPalette.js +374 -0
- package/lib/module/components/ColorPalette.js.map +1 -0
- package/lib/module/components/LineWidthSlider.js +64 -0
- package/lib/module/components/LineWidthSlider.js.map +1 -0
- package/lib/module/components/MeasurementEditModal.js +148 -0
- package/lib/module/components/MeasurementEditModal.js.map +1 -0
- package/lib/module/components/MiniMap.js +239 -0
- package/lib/module/components/MiniMap.js.map +1 -0
- package/lib/module/components/TextAnnotation.js +157 -0
- package/lib/module/components/TextAnnotation.js.map +1 -0
- package/lib/module/components/TextEditModal.js +128 -0
- package/lib/module/components/TextEditModal.js.map +1 -0
- package/lib/module/components/Toolbar.js +193 -0
- package/lib/module/components/Toolbar.js.map +1 -0
- package/lib/module/components/ZoomBadge.js +155 -0
- package/lib/module/components/ZoomBadge.js.map +1 -0
- package/lib/module/hooks/useFreehandGesture.js +169 -0
- package/lib/module/hooks/useFreehandGesture.js.map +1 -0
- package/lib/module/hooks/usePolygonGesture.js +106 -0
- package/lib/module/hooks/usePolygonGesture.js.map +1 -0
- package/lib/module/hooks/useSelectionGesture.js +232 -0
- package/lib/module/hooks/useSelectionGesture.js.map +1 -0
- package/lib/module/hooks/useShapeGesture.js +177 -0
- package/lib/module/hooks/useShapeGesture.js.map +1 -0
- package/lib/module/hooks/useViewportGesture.js +234 -0
- package/lib/module/hooks/useViewportGesture.js.map +1 -0
- package/lib/module/index.js +20 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/renderers/ArrowRenderer.js +113 -0
- package/lib/module/renderers/ArrowRenderer.js.map +1 -0
- package/lib/module/renderers/CircleRenderer.js +46 -0
- package/lib/module/renderers/CircleRenderer.js.map +1 -0
- package/lib/module/renderers/FreehandRenderer.js +26 -0
- package/lib/module/renderers/FreehandRenderer.js.map +1 -0
- package/lib/module/renderers/InProgressRenderer.js +169 -0
- package/lib/module/renderers/InProgressRenderer.js.map +1 -0
- package/lib/module/renderers/LineRenderer.js +22 -0
- package/lib/module/renderers/LineRenderer.js.map +1 -0
- package/lib/module/renderers/MeasurementRenderer.js +129 -0
- package/lib/module/renderers/MeasurementRenderer.js.map +1 -0
- package/lib/module/renderers/ObjectRenderer.js +60 -0
- package/lib/module/renderers/ObjectRenderer.js.map +1 -0
- package/lib/module/renderers/PolygonRenderer.js +41 -0
- package/lib/module/renderers/PolygonRenderer.js.map +1 -0
- package/lib/module/renderers/RectRenderer.js +46 -0
- package/lib/module/renderers/RectRenderer.js.map +1 -0
- package/lib/module/renderers/SelectedObjectRenderer.js +587 -0
- package/lib/module/renderers/SelectedObjectRenderer.js.map +1 -0
- package/lib/module/renderers/SelectionOverlay.js +116 -0
- package/lib/module/renderers/SelectionOverlay.js.map +1 -0
- package/lib/module/store/useDrawingStore.js +350 -0
- package/lib/module/store/useDrawingStore.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/colors.js +40 -0
- package/lib/module/utils/colors.js.map +1 -0
- package/lib/module/utils/coordinates.js +71 -0
- package/lib/module/utils/coordinates.js.map +1 -0
- package/lib/module/utils/hitTesting.js +171 -0
- package/lib/module/utils/hitTesting.js.map +1 -0
- package/lib/module/utils/serialization.js +36 -0
- package/lib/module/utils/serialization.js.map +1 -0
- package/lib/module/utils/shapeDetection.js +147 -0
- package/lib/module/utils/shapeDetection.js.map +1 -0
- package/lib/module/utils/smoothing.js +80 -0
- package/lib/module/utils/smoothing.js.map +1 -0
- package/lib/typescript/DrawingEditor.d.ts +3 -0
- package/lib/typescript/DrawingEditor.d.ts.map +1 -0
- package/lib/typescript/components/ColorPalette.d.ts +9 -0
- package/lib/typescript/components/ColorPalette.d.ts.map +1 -0
- package/lib/typescript/components/LineWidthSlider.d.ts +11 -0
- package/lib/typescript/components/LineWidthSlider.d.ts.map +1 -0
- package/lib/typescript/components/MeasurementEditModal.d.ts +11 -0
- package/lib/typescript/components/MeasurementEditModal.d.ts.map +1 -0
- package/lib/typescript/components/MiniMap.d.ts +23 -0
- package/lib/typescript/components/MiniMap.d.ts.map +1 -0
- package/lib/typescript/components/TextAnnotation.d.ts +22 -0
- package/lib/typescript/components/TextAnnotation.d.ts.map +1 -0
- package/lib/typescript/components/TextEditModal.d.ts +10 -0
- package/lib/typescript/components/TextEditModal.d.ts.map +1 -0
- package/lib/typescript/components/Toolbar.d.ts +13 -0
- package/lib/typescript/components/Toolbar.d.ts.map +1 -0
- package/lib/typescript/components/ZoomBadge.d.ts +9 -0
- package/lib/typescript/components/ZoomBadge.d.ts.map +1 -0
- package/lib/typescript/hooks/useFreehandGesture.d.ts +47 -0
- package/lib/typescript/hooks/useFreehandGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/usePolygonGesture.d.ts +47 -0
- package/lib/typescript/hooks/usePolygonGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/useSelectionGesture.d.ts +32 -0
- package/lib/typescript/hooks/useSelectionGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/useShapeGesture.d.ts +54 -0
- package/lib/typescript/hooks/useShapeGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/useViewportGesture.d.ts +37 -0
- package/lib/typescript/hooks/useViewportGesture.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +11 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/renderers/ArrowRenderer.d.ts +9 -0
- package/lib/typescript/renderers/ArrowRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/CircleRenderer.d.ts +9 -0
- package/lib/typescript/renderers/CircleRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/FreehandRenderer.d.ts +9 -0
- package/lib/typescript/renderers/FreehandRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/InProgressRenderer.d.ts +32 -0
- package/lib/typescript/renderers/InProgressRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/LineRenderer.d.ts +9 -0
- package/lib/typescript/renderers/LineRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/MeasurementRenderer.d.ts +9 -0
- package/lib/typescript/renderers/MeasurementRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/ObjectRenderer.d.ts +12 -0
- package/lib/typescript/renderers/ObjectRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/PolygonRenderer.d.ts +13 -0
- package/lib/typescript/renderers/PolygonRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/RectRenderer.d.ts +9 -0
- package/lib/typescript/renderers/RectRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/SelectedObjectRenderer.d.ts +18 -0
- package/lib/typescript/renderers/SelectedObjectRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/SelectionOverlay.d.ts +21 -0
- package/lib/typescript/renderers/SelectionOverlay.d.ts.map +1 -0
- package/lib/typescript/store/useDrawingStore.d.ts +30 -0
- package/lib/typescript/store/useDrawingStore.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +130 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/utils/colors.d.ts +11 -0
- package/lib/typescript/utils/colors.d.ts.map +1 -0
- package/lib/typescript/utils/coordinates.d.ts +34 -0
- package/lib/typescript/utils/coordinates.d.ts.map +1 -0
- package/lib/typescript/utils/hitTesting.d.ts +18 -0
- package/lib/typescript/utils/hitTesting.d.ts.map +1 -0
- package/lib/typescript/utils/serialization.d.ts +17 -0
- package/lib/typescript/utils/serialization.d.ts.map +1 -0
- package/lib/typescript/utils/shapeDetection.d.ts +22 -0
- package/lib/typescript/utils/shapeDetection.d.ts.map +1 -0
- package/lib/typescript/utils/smoothing.d.ts +16 -0
- package/lib/typescript/utils/smoothing.d.ts.map +1 -0
- package/package.json +108 -0
- package/src/DrawingEditor.tsx +1071 -0
- package/src/assets/toolbar-icons/arrow-disabled.png +0 -0
- package/src/assets/toolbar-icons/arrow-enabled.png +0 -0
- package/src/assets/toolbar-icons/arrow.png +0 -0
- package/src/assets/toolbar-icons/circle-disabled.png +0 -0
- package/src/assets/toolbar-icons/circle-enabled.png +0 -0
- package/src/assets/toolbar-icons/circle.png +0 -0
- package/src/assets/toolbar-icons/freehand-disabled.png +0 -0
- package/src/assets/toolbar-icons/freehand-enabled.png +0 -0
- package/src/assets/toolbar-icons/freehand.png +0 -0
- package/src/assets/toolbar-icons/line-disabled.png +0 -0
- package/src/assets/toolbar-icons/line-enabled.png +0 -0
- package/src/assets/toolbar-icons/line.png +0 -0
- package/src/assets/toolbar-icons/measure-disabled.png +0 -0
- package/src/assets/toolbar-icons/measure-enabled.png +0 -0
- package/src/assets/toolbar-icons/measure.png +0 -0
- package/src/assets/toolbar-icons/move-disabled.png +0 -0
- package/src/assets/toolbar-icons/move-enabled.png +0 -0
- package/src/assets/toolbar-icons/move.png +0 -0
- package/src/assets/toolbar-icons/polygon-disabled.png +0 -0
- package/src/assets/toolbar-icons/polygon-enabled.png +0 -0
- package/src/assets/toolbar-icons/polygon.png +0 -0
- package/src/assets/toolbar-icons/rectangle-disabled.png +0 -0
- package/src/assets/toolbar-icons/rectangle-enabled.png +0 -0
- package/src/assets/toolbar-icons/rectangle.png +0 -0
- package/src/assets/toolbar-icons/text-disabled.png +0 -0
- package/src/assets/toolbar-icons/text-enabled.png +0 -0
- package/src/assets/toolbar-icons/text.png +0 -0
- package/src/components/ColorPalette.tsx +497 -0
- package/src/components/LineWidthSlider.tsx +87 -0
- package/src/components/MeasurementEditModal.tsx +163 -0
- package/src/components/MiniMap.tsx +275 -0
- package/src/components/TextAnnotation.tsx +198 -0
- package/src/components/TextEditModal.tsx +139 -0
- package/src/components/Toolbar.tsx +254 -0
- package/src/components/ZoomBadge.tsx +166 -0
- package/src/hooks/useFreehandGesture.ts +249 -0
- package/src/hooks/usePolygonGesture.ts +162 -0
- package/src/hooks/useSelectionGesture.ts +293 -0
- package/src/hooks/useShapeGesture.ts +256 -0
- package/src/hooks/useViewportGesture.ts +337 -0
- package/src/index.tsx +51 -0
- package/src/renderers/ArrowRenderer.tsx +123 -0
- package/src/renderers/CircleRenderer.tsx +60 -0
- package/src/renderers/FreehandRenderer.tsx +33 -0
- package/src/renderers/InProgressRenderer.tsx +217 -0
- package/src/renderers/LineRenderer.tsx +34 -0
- package/src/renderers/MeasurementRenderer.tsx +179 -0
- package/src/renderers/ObjectRenderer.tsx +42 -0
- package/src/renderers/PolygonRenderer.tsx +66 -0
- package/src/renderers/RectRenderer.tsx +60 -0
- package/src/renderers/SelectedObjectRenderer.tsx +738 -0
- package/src/renderers/SelectionOverlay.tsx +170 -0
- package/src/store/useDrawingStore.ts +357 -0
- package/src/types.ts +186 -0
- package/src/utils/colors.ts +98 -0
- package/src/utils/coordinates.ts +75 -0
- package/src/utils/hitTesting.ts +242 -0
- package/src/utils/serialization.ts +45 -0
- package/src/utils/shapeDetection.ts +160 -0
- package/src/utils/smoothing.ts +84 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { denormalize, denormalizePoints } from "./coordinates";
|
|
4
|
+
import { buildSmoothedPath } from "./smoothing";
|
|
5
|
+
const HIT_PADDING = 20; // pixels tolerance for hit-testing lines/paths
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Test if a pixel-space tap point hits a drawing object.
|
|
9
|
+
* All object coordinates are normalized and must be denormalized with canvasSize.
|
|
10
|
+
*
|
|
11
|
+
* Returns true if the point is within hit range of the object.
|
|
12
|
+
*/
|
|
13
|
+
export function hitTestObject(object, tapPoint, canvasSize) {
|
|
14
|
+
switch (object.type) {
|
|
15
|
+
case "freehand":
|
|
16
|
+
return hitTestFreehand(object, tapPoint, canvasSize);
|
|
17
|
+
case "line":
|
|
18
|
+
case "arrow":
|
|
19
|
+
case "measure":
|
|
20
|
+
return hitTestLine(object, tapPoint, canvasSize);
|
|
21
|
+
case "rectangle":
|
|
22
|
+
return hitTestRect(object, tapPoint, canvasSize);
|
|
23
|
+
case "circle":
|
|
24
|
+
return hitTestEllipse(object, tapPoint, canvasSize);
|
|
25
|
+
case "polygon":
|
|
26
|
+
return hitTestPolygon(object, tapPoint, canvasSize);
|
|
27
|
+
case "text":
|
|
28
|
+
return hitTestText(object, tapPoint, canvasSize);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function hitTestFreehand(object, tap, canvasSize) {
|
|
32
|
+
const points = denormalizePoints(object.points, canvasSize);
|
|
33
|
+
const padding = HIT_PADDING + object.lineWidth / 2;
|
|
34
|
+
|
|
35
|
+
// Check distance to each segment of the smoothed path
|
|
36
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
37
|
+
const a = points[i];
|
|
38
|
+
const b = points[i + 1];
|
|
39
|
+
if (distanceToSegment(tap, a, b) < padding) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
function hitTestLine(object, tap, canvasSize) {
|
|
46
|
+
const from = denormalize(object.from, canvasSize);
|
|
47
|
+
const to = denormalize(object.to, canvasSize);
|
|
48
|
+
const padding = HIT_PADDING + object.lineWidth / 2;
|
|
49
|
+
return distanceToSegment(tap, from, to) < padding;
|
|
50
|
+
}
|
|
51
|
+
function hitTestRect(object, tap, canvasSize) {
|
|
52
|
+
const from = denormalize(object.from, canvasSize);
|
|
53
|
+
const to = denormalize(object.to, canvasSize);
|
|
54
|
+
const padding = HIT_PADDING;
|
|
55
|
+
const minX = Math.min(from.x, to.x) - padding;
|
|
56
|
+
const maxX = Math.max(from.x, to.x) + padding;
|
|
57
|
+
const minY = Math.min(from.y, to.y) - padding;
|
|
58
|
+
const maxY = Math.max(from.y, to.y) + padding;
|
|
59
|
+
|
|
60
|
+
// If has fill, hit inside the rect
|
|
61
|
+
if ("backgroundColor" in object && object.backgroundColor) {
|
|
62
|
+
return tap.x >= minX && tap.x <= maxX && tap.y >= minY && tap.y <= maxY;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Otherwise, hit the border only
|
|
66
|
+
const innerMinX = Math.min(from.x, to.x) + padding;
|
|
67
|
+
const innerMaxX = Math.max(from.x, to.x) - padding;
|
|
68
|
+
const innerMinY = Math.min(from.y, to.y) + padding;
|
|
69
|
+
const innerMaxY = Math.max(from.y, to.y) - padding;
|
|
70
|
+
const inOuter = tap.x >= minX && tap.x <= maxX && tap.y >= minY && tap.y <= maxY;
|
|
71
|
+
const inInner = tap.x >= innerMinX && tap.x <= innerMaxX && tap.y >= innerMinY && tap.y <= innerMaxY;
|
|
72
|
+
return inOuter && !inInner;
|
|
73
|
+
}
|
|
74
|
+
function hitTestEllipse(object, tap, canvasSize) {
|
|
75
|
+
const from = denormalize(object.from, canvasSize);
|
|
76
|
+
const to = denormalize(object.to, canvasSize);
|
|
77
|
+
const cx = (from.x + to.x) / 2;
|
|
78
|
+
const cy = (from.y + to.y) / 2;
|
|
79
|
+
const rx = Math.abs(to.x - from.x) / 2;
|
|
80
|
+
const ry = Math.abs(to.y - from.y) / 2;
|
|
81
|
+
if (rx === 0 || ry === 0) return false;
|
|
82
|
+
const dx = tap.x - cx;
|
|
83
|
+
const dy = tap.y - cy;
|
|
84
|
+
|
|
85
|
+
// Normalized distance from center
|
|
86
|
+
// If has fill, hit inside the ellipse
|
|
87
|
+
if ("backgroundColor" in object && object.backgroundColor) {
|
|
88
|
+
const outerRx = rx + HIT_PADDING;
|
|
89
|
+
const outerRy = ry + HIT_PADDING;
|
|
90
|
+
return dx * dx / (outerRx * outerRx) + dy * dy / (outerRy * outerRy) <= 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Otherwise, hit the border ring
|
|
94
|
+
const padding = HIT_PADDING + ("lineWidth" in object ? object.lineWidth / 2 : 2);
|
|
95
|
+
const outerRx = rx + padding;
|
|
96
|
+
const outerRy = ry + padding;
|
|
97
|
+
const innerRx = Math.max(0, rx - padding);
|
|
98
|
+
const innerRy = Math.max(0, ry - padding);
|
|
99
|
+
const outerDist = dx * dx / (outerRx * outerRx) + dy * dy / (outerRy * outerRy);
|
|
100
|
+
const innerDist = innerRx > 0 && innerRy > 0 ? dx * dx / (innerRx * innerRx) + dy * dy / (innerRy * innerRy) : Infinity;
|
|
101
|
+
return outerDist <= 1 && innerDist >= 1;
|
|
102
|
+
}
|
|
103
|
+
function hitTestText(object, tap, canvasSize) {
|
|
104
|
+
const pos = denormalize(object.position, canvasSize);
|
|
105
|
+
const w = object.width * canvasSize.width;
|
|
106
|
+
const h = object.height * canvasSize.height;
|
|
107
|
+
return tap.x >= pos.x && tap.x <= pos.x + w && tap.y >= pos.y && tap.y <= pos.y + h;
|
|
108
|
+
}
|
|
109
|
+
function hitTestPolygon(object, tap, canvasSize) {
|
|
110
|
+
const points = denormalizePoints(object.points, canvasSize);
|
|
111
|
+
if (points.length < 2) return false;
|
|
112
|
+
const padding = HIT_PADDING + object.lineWidth / 2;
|
|
113
|
+
|
|
114
|
+
// If filled and closed, check if point is inside the polygon
|
|
115
|
+
if (object.closed && object.backgroundColor) {
|
|
116
|
+
if (pointInPolygon(tap, points)) return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Check distance to each segment (including closing segment if closed)
|
|
120
|
+
const len = points.length;
|
|
121
|
+
for (let i = 0; i < len - 1; i++) {
|
|
122
|
+
if (distanceToSegment(tap, points[i], points[i + 1]) < padding) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Closing segment
|
|
127
|
+
if (object.closed && len >= 3) {
|
|
128
|
+
if (distanceToSegment(tap, points[len - 1], points[0]) < padding) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Ray-casting point-in-polygon test */
|
|
136
|
+
function pointInPolygon(p, polygon) {
|
|
137
|
+
let inside = false;
|
|
138
|
+
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
139
|
+
const xi = polygon[i].x;
|
|
140
|
+
const yi = polygon[i].y;
|
|
141
|
+
const xj = polygon[j].x;
|
|
142
|
+
const yj = polygon[j].y;
|
|
143
|
+
const intersect = yi > p.y !== yj > p.y && p.x < (xj - xi) * (p.y - yi) / (yj - yi) + xi;
|
|
144
|
+
if (intersect) inside = !inside;
|
|
145
|
+
}
|
|
146
|
+
return inside;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Returns the minimum distance from point p to segment [a, b].
|
|
151
|
+
*/
|
|
152
|
+
function distanceToSegment(p, a, b) {
|
|
153
|
+
const dx = b.x - a.x;
|
|
154
|
+
const dy = b.y - a.y;
|
|
155
|
+
const lenSq = dx * dx + dy * dy;
|
|
156
|
+
if (lenSq === 0) {
|
|
157
|
+
// a and b are the same point
|
|
158
|
+
return Math.sqrt((p.x - a.x) ** 2 + (p.y - a.y) ** 2);
|
|
159
|
+
}
|
|
160
|
+
let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / lenSq;
|
|
161
|
+
t = Math.max(0, Math.min(1, t));
|
|
162
|
+
const projX = a.x + t * dx;
|
|
163
|
+
const projY = a.y + t * dy;
|
|
164
|
+
return Math.sqrt((p.x - projX) ** 2 + (p.y - projY) ** 2);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Export for use in selection gesture calculations.
|
|
169
|
+
*/
|
|
170
|
+
export { buildSmoothedPath, distanceToSegment };
|
|
171
|
+
//# sourceMappingURL=hitTesting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["denormalize","denormalizePoints","buildSmoothedPath","HIT_PADDING","hitTestObject","object","tapPoint","canvasSize","type","hitTestFreehand","hitTestLine","hitTestRect","hitTestEllipse","hitTestPolygon","hitTestText","tap","points","padding","lineWidth","i","length","a","b","distanceToSegment","from","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,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Serialize drawing state to a JSON-compatible structure.
|
|
5
|
+
*/
|
|
6
|
+
export function serializeObjects(objects, canvasSize) {
|
|
7
|
+
return JSON.stringify({
|
|
8
|
+
version: 1,
|
|
9
|
+
canvasSize,
|
|
10
|
+
objects
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Deserialize drawing state from JSON.
|
|
16
|
+
*/
|
|
17
|
+
export function deserializeObjects(json) {
|
|
18
|
+
try {
|
|
19
|
+
const data = JSON.parse(json);
|
|
20
|
+
if (!data.objects || !data.canvasSize) return null;
|
|
21
|
+
return {
|
|
22
|
+
objects: data.objects,
|
|
23
|
+
canvasSize: data.canvasSize
|
|
24
|
+
};
|
|
25
|
+
} catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Generate a unique ID for drawing objects.
|
|
32
|
+
*/
|
|
33
|
+
export function generateId() {
|
|
34
|
+
return Date.now().toString(36) + Math.random().toString(36).substring(2, 8);
|
|
35
|
+
}
|
|
36
|
+
//# 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;AACA,OAAO,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;AACA,OAAO,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;AACA,OAAO,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,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Count the number of direction changes (inflections) in a series of points.
|
|
5
|
+
* An inflection is when the general direction of movement reverses or sharply changes.
|
|
6
|
+
*/
|
|
7
|
+
function countInflections(points, startIndex = 0) {
|
|
8
|
+
if (points.length < 3) return 0;
|
|
9
|
+
let inflections = 0;
|
|
10
|
+
for (let i = Math.max(startIndex, 1); i < points.length - 1; i++) {
|
|
11
|
+
const prev = points[i - 1];
|
|
12
|
+
const curr = points[i];
|
|
13
|
+
const next = points[i + 1];
|
|
14
|
+
const dx1 = curr.x - prev.x;
|
|
15
|
+
const dy1 = curr.y - prev.y;
|
|
16
|
+
const dx2 = next.x - curr.x;
|
|
17
|
+
const dy2 = next.y - curr.y;
|
|
18
|
+
|
|
19
|
+
// Cross product sign change indicates direction change
|
|
20
|
+
const cross = dx1 * dy2 - dy1 * dx2;
|
|
21
|
+
if (i > Math.max(startIndex, 1)) {
|
|
22
|
+
const prevPrev = points[i - 2];
|
|
23
|
+
const pdx1 = prev.x - prevPrev.x;
|
|
24
|
+
const pdy1 = prev.y - prevPrev.y;
|
|
25
|
+
const prevCross = pdx1 * dy1 - pdy1 * dx1;
|
|
26
|
+
if (prevCross * cross < 0) {
|
|
27
|
+
inflections++;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return inflections;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Compute total angle traversed by the path.
|
|
36
|
+
* Used for circle detection (should be ~2π for a full circle).
|
|
37
|
+
*/
|
|
38
|
+
function totalAngleTraversed(points) {
|
|
39
|
+
if (points.length < 3) return 0;
|
|
40
|
+
let totalAngle = 0;
|
|
41
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
42
|
+
const prev = points[i - 1];
|
|
43
|
+
const curr = points[i];
|
|
44
|
+
const next = points[i + 1];
|
|
45
|
+
const a1 = Math.atan2(curr.y - prev.y, curr.x - prev.x);
|
|
46
|
+
const a2 = Math.atan2(next.y - curr.y, next.x - curr.x);
|
|
47
|
+
let delta = a2 - a1;
|
|
48
|
+
|
|
49
|
+
// Normalize to [-π, π]
|
|
50
|
+
while (delta > Math.PI) delta -= 2 * Math.PI;
|
|
51
|
+
while (delta < -Math.PI) delta += 2 * Math.PI;
|
|
52
|
+
totalAngle += delta;
|
|
53
|
+
}
|
|
54
|
+
return totalAngle;
|
|
55
|
+
}
|
|
56
|
+
function dist(a, b) {
|
|
57
|
+
const dx = a.x - b.x;
|
|
58
|
+
const dy = a.y - b.y;
|
|
59
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
60
|
+
}
|
|
61
|
+
function boundingRect(points) {
|
|
62
|
+
let minX = Infinity;
|
|
63
|
+
let minY = Infinity;
|
|
64
|
+
let maxX = -Infinity;
|
|
65
|
+
let maxY = -Infinity;
|
|
66
|
+
for (const p of points) {
|
|
67
|
+
if (p.x < minX) minX = p.x;
|
|
68
|
+
if (p.y < minY) minY = p.y;
|
|
69
|
+
if (p.x > maxX) maxX = p.x;
|
|
70
|
+
if (p.y > maxY) maxY = p.y;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
x: minX,
|
|
74
|
+
y: minY,
|
|
75
|
+
width: maxX - minX,
|
|
76
|
+
height: maxY - minY
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Attempt to detect a geometric shape from freehand points.
|
|
81
|
+
* Returns the detected shape or null if no shape is recognized.
|
|
82
|
+
*
|
|
83
|
+
* Points should be in pixel coordinates. Duration in milliseconds.
|
|
84
|
+
*/
|
|
85
|
+
export function detectShape(points, durationMs) {
|
|
86
|
+
if (points.length < 5) return null;
|
|
87
|
+
const first = points[0];
|
|
88
|
+
const last = points[points.length - 1];
|
|
89
|
+
const startEndDist = dist(first, last);
|
|
90
|
+
const inflections = countInflections(points);
|
|
91
|
+
|
|
92
|
+
// ── Circle detection ──
|
|
93
|
+
// Duration < 1.5s, inflections ≤ 5, distance start↔end < threshold,
|
|
94
|
+
// total angle ≈ 2π (±45°)
|
|
95
|
+
if (durationMs < 1500 && inflections <= 5 && startEndDist < 150) {
|
|
96
|
+
const totalAngle = Math.abs(totalAngleTraversed(points));
|
|
97
|
+
const twoPi = 2 * Math.PI;
|
|
98
|
+
const tolerance = Math.PI / 4; // 45°
|
|
99
|
+
|
|
100
|
+
if (Math.abs(totalAngle - twoPi) < tolerance) {
|
|
101
|
+
const bbox = boundingRect(points);
|
|
102
|
+
return {
|
|
103
|
+
type: "circle",
|
|
104
|
+
from: {
|
|
105
|
+
x: bbox.x,
|
|
106
|
+
y: bbox.y
|
|
107
|
+
},
|
|
108
|
+
to: {
|
|
109
|
+
x: bbox.x + bbox.width,
|
|
110
|
+
y: bbox.y + bbox.height
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ── Rectangle detection ──
|
|
117
|
+
// Duration < 12s, inflections ≤ 15, distance start↔end < threshold
|
|
118
|
+
if (durationMs < 12000 && inflections <= 15 && startEndDist < 30) {
|
|
119
|
+
const bbox = boundingRect(points);
|
|
120
|
+
return {
|
|
121
|
+
type: "rectangle",
|
|
122
|
+
from: {
|
|
123
|
+
x: bbox.x,
|
|
124
|
+
y: bbox.y
|
|
125
|
+
},
|
|
126
|
+
to: {
|
|
127
|
+
x: bbox.x + bbox.width,
|
|
128
|
+
y: bbox.y + bbox.height
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// ── Line detection ──
|
|
134
|
+
// Duration < 4s, inflections ≤ 4 (checked from 11th point onward)
|
|
135
|
+
if (durationMs < 4000 && points.length >= 11) {
|
|
136
|
+
const lineInflections = countInflections(points, 10);
|
|
137
|
+
if (lineInflections <= 4) {
|
|
138
|
+
return {
|
|
139
|
+
type: "line",
|
|
140
|
+
from: first,
|
|
141
|
+
to: last
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
//# 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,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Build a smoothed SVG path string from an array of pixel-space points
|
|
5
|
+
* using quadratic Bezier curves through midpoints.
|
|
6
|
+
*
|
|
7
|
+
* This is the standard "midpoint smoothing" algorithm for touch-based drawing:
|
|
8
|
+
* each raw point becomes a control point, and the curve passes through the
|
|
9
|
+
* midpoints between consecutive raw points.
|
|
10
|
+
*/
|
|
11
|
+
export function buildSmoothedPath(points) {
|
|
12
|
+
const n = points.length;
|
|
13
|
+
if (n === 0) return "";
|
|
14
|
+
if (n === 1) return `M ${points[0].x} ${points[0].y}`;
|
|
15
|
+
const first = points[0];
|
|
16
|
+
if (n === 2) {
|
|
17
|
+
const second = points[1];
|
|
18
|
+
return `M ${first.x} ${first.y} L ${second.x} ${second.y}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Start at first point
|
|
22
|
+
const parts = [`M ${first.x} ${first.y}`];
|
|
23
|
+
|
|
24
|
+
// Line to first midpoint
|
|
25
|
+
const p1 = points[1];
|
|
26
|
+
const m0x = (first.x + p1.x) / 2;
|
|
27
|
+
const m0y = (first.y + p1.y) / 2;
|
|
28
|
+
parts.push(`L ${m0x} ${m0y}`);
|
|
29
|
+
|
|
30
|
+
// Quadratic curves through midpoints
|
|
31
|
+
for (let i = 1; i < n - 1; i++) {
|
|
32
|
+
const cp = points[i];
|
|
33
|
+
const next = points[i + 1];
|
|
34
|
+
const mx = (cp.x + next.x) / 2;
|
|
35
|
+
const my = (cp.y + next.y) / 2;
|
|
36
|
+
parts.push(`Q ${cp.x} ${cp.y} ${mx} ${my}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Line to last point
|
|
40
|
+
const last = points[n - 1];
|
|
41
|
+
parts.push(`L ${last.x} ${last.y}`);
|
|
42
|
+
return parts.join(" ");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Build a smoothed SVG path from a flat array [x0, y0, x1, y1, ...].
|
|
47
|
+
* Used in worklets where Point objects aren't available.
|
|
48
|
+
*/
|
|
49
|
+
export function buildSmoothedPathFromFlat(coords) {
|
|
50
|
+
"worklet";
|
|
51
|
+
|
|
52
|
+
const n = coords.length / 2;
|
|
53
|
+
if (n < 1) return "";
|
|
54
|
+
if (n === 1) return `M ${coords[0]} ${coords[1]}`;
|
|
55
|
+
if (n === 2) {
|
|
56
|
+
return `M ${coords[0]} ${coords[1]} L ${coords[2]} ${coords[3]}`;
|
|
57
|
+
}
|
|
58
|
+
let svg = `M ${coords[0]} ${coords[1]}`;
|
|
59
|
+
|
|
60
|
+
// Line to first midpoint
|
|
61
|
+
const m0x = (coords[0] + coords[2]) / 2;
|
|
62
|
+
const m0y = (coords[1] + coords[3]) / 2;
|
|
63
|
+
svg += ` L ${m0x} ${m0y}`;
|
|
64
|
+
|
|
65
|
+
// Quadratic curves through midpoints
|
|
66
|
+
for (let i = 1; i < n - 1; i++) {
|
|
67
|
+
const cx = coords[i * 2];
|
|
68
|
+
const cy = coords[i * 2 + 1];
|
|
69
|
+
const nx = coords[(i + 1) * 2];
|
|
70
|
+
const ny = coords[(i + 1) * 2 + 1];
|
|
71
|
+
const mx = (cx + nx) / 2;
|
|
72
|
+
const my = (cy + ny) / 2;
|
|
73
|
+
svg += ` Q ${cx} ${cy} ${mx} ${my}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Line to last point
|
|
77
|
+
svg += ` L ${coords[(n - 1) * 2]} ${coords[(n - 1) * 2 + 1]}`;
|
|
78
|
+
return svg;
|
|
79
|
+
}
|
|
80
|
+
//# 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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawingEditor.d.ts","sourceRoot":"","sources":["../../src/DrawingEditor.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAMjB,MAAM,SAAS,CAAC;AA4EjB,eAAO,MAAM,aAAa,iHA84BzB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface ColorPaletteProps {
|
|
3
|
+
strokeColor: string;
|
|
4
|
+
onSelectColor: (color: string) => void;
|
|
5
|
+
direction?: "horizontal" | "vertical";
|
|
6
|
+
}
|
|
7
|
+
export declare const ColorPalette: React.NamedExoticComponent<ColorPaletteProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ColorPalette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorPalette.d.ts","sourceRoot":"","sources":["../../../src/components/ColorPalette.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAa9D,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACvC;AAED,eAAO,MAAM,YAAY,+CA6DvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface LineWidthSliderProps {
|
|
3
|
+
value: number;
|
|
4
|
+
onValueChange: (value: number) => void;
|
|
5
|
+
minimumValue?: number;
|
|
6
|
+
maximumValue?: number;
|
|
7
|
+
orientation?: "horizontal" | "vertical";
|
|
8
|
+
}
|
|
9
|
+
export declare const LineWidthSlider: React.NamedExoticComponent<LineWidthSliderProps>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=LineWidthSlider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineWidthSlider.d.ts","sourceRoot":"","sources":["../../../src/components/LineWidthSlider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;CACzC;AAED,eAAO,MAAM,eAAe,kDA6C1B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface MeasurementEditModalProps {
|
|
3
|
+
visible: boolean;
|
|
4
|
+
initialValue: string;
|
|
5
|
+
initialUnit: string;
|
|
6
|
+
onSubmit: (value: string, unit: string) => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const MeasurementEditModal: React.NamedExoticComponent<MeasurementEditModalProps>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=MeasurementEditModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeasurementEditModal.d.ts","sourceRoot":"","sources":["../../../src/components/MeasurementEditModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAYrD,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,uDAuE/B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type SkImage } from "@shopify/react-native-skia";
|
|
3
|
+
import { type SharedValue } from "react-native-reanimated";
|
|
4
|
+
interface MiniMapProps {
|
|
5
|
+
image: SkImage | null;
|
|
6
|
+
/** Image rect within the layout (fitted) */
|
|
7
|
+
imageRect: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
};
|
|
13
|
+
/** Viewport shared values */
|
|
14
|
+
scale: SharedValue<number>;
|
|
15
|
+
translateX: SharedValue<number>;
|
|
16
|
+
translateY: SharedValue<number>;
|
|
17
|
+
visible: boolean;
|
|
18
|
+
/** Clamp translate callback — keeps viewport in bounds */
|
|
19
|
+
onPanViewport?: (dtx: number, dty: number) => void;
|
|
20
|
+
}
|
|
21
|
+
export declare const MiniMap: React.NamedExoticComponent<MiniMapProps>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=MiniMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MiniMap.d.ts","sourceRoot":"","sources":["../../../src/components/MiniMap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAEtC,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,4BAA4B,CAAC;AACpC,OAAiB,EAGf,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAKjC,UAAU,YAAY;IACpB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,4CAA4C;IAC5C,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,6BAA6B;IAC7B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAED,eAAO,MAAM,OAAO,0CAkFlB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { SharedValue } from "react-native-reanimated";
|
|
3
|
+
import type { TextObject, Size } from "../types";
|
|
4
|
+
interface TextAnnotationProps {
|
|
5
|
+
object: TextObject;
|
|
6
|
+
canvasSize: Size;
|
|
7
|
+
imageOffset: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
};
|
|
11
|
+
isSelected: boolean;
|
|
12
|
+
onSelect: (id: string) => void;
|
|
13
|
+
onMove: (id: string, dx: number, dy: number) => void;
|
|
14
|
+
onDoubleTap: (id: string) => void;
|
|
15
|
+
onDelete: (id: string) => void;
|
|
16
|
+
viewScale: SharedValue<number>;
|
|
17
|
+
viewTranslateX: SharedValue<number>;
|
|
18
|
+
viewTranslateY: SharedValue<number>;
|
|
19
|
+
}
|
|
20
|
+
export declare const TextAnnotation: React.NamedExoticComponent<TextAnnotationProps>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=TextAnnotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAnnotation.d.ts","sourceRoot":"","sources":["../../../src/components/TextAnnotation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAcpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGjD,UAAU,mBAAmB;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,WAAW,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;AAID,eAAO,MAAM,cAAc,iDAoIzB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface TextEditModalProps {
|
|
3
|
+
visible: boolean;
|
|
4
|
+
initialValue: string;
|
|
5
|
+
onSubmit: (value: string) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const TextEditModal: React.NamedExoticComponent<TextEditModalProps>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=TextEditModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextEditModal.d.ts","sourceRoot":"","sources":["../../../src/components/TextEditModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAYrD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,gDA2DxB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ToolType } from "../types";
|
|
3
|
+
interface ToolbarProps {
|
|
4
|
+
currentTool: ToolType | null;
|
|
5
|
+
onSelectTool: (tool: ToolType | null) => void;
|
|
6
|
+
onUndo: () => void;
|
|
7
|
+
canUndo: boolean;
|
|
8
|
+
isZoomed: boolean;
|
|
9
|
+
onResetZoom: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare const Toolbar: React.NamedExoticComponent<ToolbarProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=Toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAW3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,YAAY;IACpB,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AA0FD,eAAO,MAAM,OAAO,0CA4DlB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type SharedValue } from "react-native-reanimated";
|
|
3
|
+
interface ZoomBadgeProps {
|
|
4
|
+
scale: SharedValue<number>;
|
|
5
|
+
onPress: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const ZoomBadge: React.NamedExoticComponent<ZoomBadgeProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ZoomBadge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZoomBadge.d.ts","sourceRoot":"","sources":["../../../src/components/ZoomBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAiB,EAIf,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAOjC,UAAU,cAAc;IACtB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,SAAS,4CAgEpB,CAAC"}
|