@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,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
|