@reffy/infinite-canvas 0.0.1
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/LICENSE.txt +21 -0
- package/README.md +94 -0
- package/esm/API.d.ts +21 -0
- package/esm/API.d.ts.map +1 -0
- package/esm/API.js +74 -0
- package/esm/API.js.map +1 -0
- package/esm/Canvas.d.ts +69 -0
- package/esm/Canvas.d.ts.map +1 -0
- package/esm/Canvas.js +383 -0
- package/esm/Canvas.js.map +1 -0
- package/esm/Component.d.ts +126 -0
- package/esm/Component.d.ts.map +1 -0
- package/esm/Component.js +612 -0
- package/esm/Component.js.map +1 -0
- package/esm/bounding/AABB.d.ts +10 -0
- package/esm/bounding/AABB.d.ts.map +1 -0
- package/esm/bounding/AABB.js +19 -0
- package/esm/bounding/AABB.js.map +1 -0
- package/esm/bounding/BoundingBox.d.ts +53 -0
- package/esm/bounding/BoundingBox.d.ts.map +1 -0
- package/esm/bounding/BoundingBox.js +300 -0
- package/esm/bounding/BoundingBox.js.map +1 -0
- package/esm/bounding/Marquee.d.ts +28 -0
- package/esm/bounding/Marquee.d.ts.map +1 -0
- package/esm/bounding/Marquee.js +111 -0
- package/esm/bounding/Marquee.js.map +1 -0
- package/esm/bounding/MultiBoundingBox.d.ts +33 -0
- package/esm/bounding/MultiBoundingBox.d.ts.map +1 -0
- package/esm/bounding/MultiBoundingBox.js +373 -0
- package/esm/bounding/MultiBoundingBox.js.map +1 -0
- package/esm/bounding/index.d.ts +6 -0
- package/esm/bounding/index.d.ts.map +1 -0
- package/esm/bounding/index.js +6 -0
- package/esm/bounding/index.js.map +1 -0
- package/esm/bounding/type.d.ts +13 -0
- package/esm/bounding/type.d.ts.map +1 -0
- package/esm/bounding/type.js +6 -0
- package/esm/bounding/type.js.map +1 -0
- package/esm/camera/Camera.d.ts +27 -0
- package/esm/camera/Camera.d.ts.map +1 -0
- package/esm/camera/Camera.js +68 -0
- package/esm/camera/Camera.js.map +1 -0
- package/esm/camera/index.d.ts +2 -0
- package/esm/camera/index.d.ts.map +1 -0
- package/esm/camera/index.js +2 -0
- package/esm/camera/index.js.map +1 -0
- package/esm/contextMenu/ContextMenu.d.ts +57 -0
- package/esm/contextMenu/ContextMenu.d.ts.map +1 -0
- package/esm/contextMenu/ContextMenu.js +118 -0
- package/esm/contextMenu/ContextMenu.js.map +1 -0
- package/esm/contextMenu/Interaction.d.ts +22 -0
- package/esm/contextMenu/Interaction.d.ts.map +1 -0
- package/esm/contextMenu/Interaction.js +256 -0
- package/esm/contextMenu/Interaction.js.map +1 -0
- package/esm/contextMenu/index.d.ts +3 -0
- package/esm/contextMenu/index.d.ts.map +1 -0
- package/esm/contextMenu/index.js +3 -0
- package/esm/contextMenu/index.js.map +1 -0
- package/esm/history/history.d.ts +29 -0
- package/esm/history/history.d.ts.map +1 -0
- package/esm/history/history.js +120 -0
- package/esm/history/history.js.map +1 -0
- package/esm/history/index.d.ts +2 -0
- package/esm/history/index.d.ts.map +1 -0
- package/esm/history/index.js +2 -0
- package/esm/history/index.js.map +1 -0
- package/esm/index.d.ts +5 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +5 -0
- package/esm/index.js.map +1 -0
- package/esm/loader/Interaction.d.ts +4 -0
- package/esm/loader/Interaction.d.ts.map +1 -0
- package/esm/loader/Interaction.js +17 -0
- package/esm/loader/Interaction.js.map +1 -0
- package/esm/loader/Loader.d.ts +19 -0
- package/esm/loader/Loader.d.ts.map +1 -0
- package/esm/loader/Loader.js +49 -0
- package/esm/loader/Loader.js.map +1 -0
- package/esm/loader/index.d.ts +3 -0
- package/esm/loader/index.d.ts.map +1 -0
- package/esm/loader/index.js +3 -0
- package/esm/loader/index.js.map +1 -0
- package/esm/manager/ContextMenu.d.ts +11 -0
- package/esm/manager/ContextMenu.d.ts.map +1 -0
- package/esm/manager/ContextMenu.js +46 -0
- package/esm/manager/ContextMenu.js.map +1 -0
- package/esm/manager/FlipCommand.d.ts +18 -0
- package/esm/manager/FlipCommand.d.ts.map +1 -0
- package/esm/manager/FlipCommand.js +35 -0
- package/esm/manager/FlipCommand.js.map +1 -0
- package/esm/manager/KeyEvent.d.ts +16 -0
- package/esm/manager/KeyEvent.d.ts.map +1 -0
- package/esm/manager/KeyEvent.js +51 -0
- package/esm/manager/KeyEvent.js.map +1 -0
- package/esm/manager/OrderCommand.d.ts +17 -0
- package/esm/manager/OrderCommand.d.ts.map +1 -0
- package/esm/manager/OrderCommand.js +28 -0
- package/esm/manager/OrderCommand.js.map +1 -0
- package/esm/manager/PointerEvent.d.ts +70 -0
- package/esm/manager/PointerEvent.d.ts.map +1 -0
- package/esm/manager/PointerEvent.js +171 -0
- package/esm/manager/PointerEvent.js.map +1 -0
- package/esm/manager/SceneCommand.d.ts +18 -0
- package/esm/manager/SceneCommand.d.ts.map +1 -0
- package/esm/manager/SceneCommand.js +85 -0
- package/esm/manager/SceneCommand.js.map +1 -0
- package/esm/manager/Selection.d.ts +61 -0
- package/esm/manager/Selection.d.ts.map +1 -0
- package/esm/manager/Selection.js +305 -0
- package/esm/manager/Selection.js.map +1 -0
- package/esm/manager/TransformCommand.d.ts +20 -0
- package/esm/manager/TransformCommand.d.ts.map +1 -0
- package/esm/manager/TransformCommand.js +29 -0
- package/esm/manager/TransformCommand.js.map +1 -0
- package/esm/manager/index.d.ts +9 -0
- package/esm/manager/index.d.ts.map +1 -0
- package/esm/manager/index.js +9 -0
- package/esm/manager/index.js.map +1 -0
- package/esm/serializer/index.d.ts +2 -0
- package/esm/serializer/index.d.ts.map +1 -0
- package/esm/serializer/index.js +2 -0
- package/esm/serializer/index.js.map +1 -0
- package/esm/serializer/serializer.d.ts +54 -0
- package/esm/serializer/serializer.d.ts.map +1 -0
- package/esm/serializer/serializer.js +226 -0
- package/esm/serializer/serializer.js.map +1 -0
- package/esm/shaders/grid.d.ts +3 -0
- package/esm/shaders/grid.d.ts.map +1 -0
- package/esm/shaders/grid.js +89 -0
- package/esm/shaders/grid.js.map +1 -0
- package/esm/shaders/img.d.ts +4 -0
- package/esm/shaders/img.d.ts.map +1 -0
- package/esm/shaders/img.js +39 -0
- package/esm/shaders/img.js.map +1 -0
- package/esm/shaders/index.d.ts +4 -0
- package/esm/shaders/index.d.ts.map +1 -0
- package/esm/shaders/index.js +4 -0
- package/esm/shaders/index.js.map +1 -0
- package/esm/shaders/shape.d.ts +4 -0
- package/esm/shaders/shape.d.ts.map +1 -0
- package/esm/shaders/shape.js +29 -0
- package/esm/shaders/shape.js.map +1 -0
- package/esm/shapes/Grid.d.ts +21 -0
- package/esm/shapes/Grid.d.ts.map +1 -0
- package/esm/shapes/Grid.js +86 -0
- package/esm/shapes/Grid.js.map +1 -0
- package/esm/shapes/Img.d.ts +47 -0
- package/esm/shapes/Img.d.ts.map +1 -0
- package/esm/shapes/Img.js +310 -0
- package/esm/shapes/Img.js.map +1 -0
- package/esm/shapes/Rect.d.ts +34 -0
- package/esm/shapes/Rect.d.ts.map +1 -0
- package/esm/shapes/Rect.js +92 -0
- package/esm/shapes/Rect.js.map +1 -0
- package/esm/shapes/Renderable.d.ts +54 -0
- package/esm/shapes/Renderable.d.ts.map +1 -0
- package/esm/shapes/Renderable.js +141 -0
- package/esm/shapes/Renderable.js.map +1 -0
- package/esm/shapes/Shape.d.ts +27 -0
- package/esm/shapes/Shape.d.ts.map +1 -0
- package/esm/shapes/Shape.js +69 -0
- package/esm/shapes/Shape.js.map +1 -0
- package/esm/shapes/Triangle.d.ts +20 -0
- package/esm/shapes/Triangle.d.ts.map +1 -0
- package/esm/shapes/Triangle.js +82 -0
- package/esm/shapes/Triangle.js.map +1 -0
- package/esm/shapes/index.d.ts +6 -0
- package/esm/shapes/index.d.ts.map +1 -0
- package/esm/shapes/index.js +7 -0
- package/esm/shapes/index.js.map +1 -0
- package/esm/state/camera.d.ts +36 -0
- package/esm/state/camera.d.ts.map +1 -0
- package/esm/state/camera.js +88 -0
- package/esm/state/camera.js.map +1 -0
- package/esm/state/index.d.ts +4 -0
- package/esm/state/index.d.ts.map +1 -0
- package/esm/state/index.js +4 -0
- package/esm/state/index.js.map +1 -0
- package/esm/state/pointerEvent.d.ts +23 -0
- package/esm/state/pointerEvent.d.ts.map +1 -0
- package/esm/state/pointerEvent.js +49 -0
- package/esm/state/pointerEvent.js.map +1 -0
- package/esm/state/renderable.d.ts +36 -0
- package/esm/state/renderable.d.ts.map +1 -0
- package/esm/state/renderable.js +176 -0
- package/esm/state/renderable.js.map +1 -0
- package/esm/storage/defaultStorage.d.ts +34 -0
- package/esm/storage/defaultStorage.d.ts.map +1 -0
- package/esm/storage/defaultStorage.js +237 -0
- package/esm/storage/defaultStorage.js.map +1 -0
- package/esm/storage/index.d.ts +3 -0
- package/esm/storage/index.d.ts.map +1 -0
- package/esm/storage/index.js +3 -0
- package/esm/storage/index.js.map +1 -0
- package/esm/storage/storage.d.ts +36 -0
- package/esm/storage/storage.d.ts.map +1 -0
- package/esm/storage/storage.js +44 -0
- package/esm/storage/storage.js.map +1 -0
- package/esm/util/camera/camera.d.ts +19 -0
- package/esm/util/camera/camera.d.ts.map +1 -0
- package/esm/util/camera/camera.js +75 -0
- package/esm/util/camera/camera.js.map +1 -0
- package/esm/util/camera/index.d.ts +2 -0
- package/esm/util/camera/index.d.ts.map +1 -0
- package/esm/util/camera/index.js +2 -0
- package/esm/util/camera/index.js.map +1 -0
- package/esm/util/checks.d.ts +11 -0
- package/esm/util/checks.d.ts.map +1 -0
- package/esm/util/checks.js +36 -0
- package/esm/util/checks.js.map +1 -0
- package/esm/util/clipboard.d.ts +7 -0
- package/esm/util/clipboard.d.ts.map +1 -0
- package/esm/util/clipboard.js +146 -0
- package/esm/util/clipboard.js.map +1 -0
- package/esm/util/color.d.ts +4 -0
- package/esm/util/color.d.ts.map +1 -0
- package/esm/util/color.js +8 -0
- package/esm/util/color.js.map +1 -0
- package/esm/util/customEventType.d.ts +35 -0
- package/esm/util/customEventType.d.ts.map +1 -0
- package/esm/util/customEventType.js +35 -0
- package/esm/util/customEventType.js.map +1 -0
- package/esm/util/files.d.ts +19 -0
- package/esm/util/files.d.ts.map +1 -0
- package/esm/util/files.js +182 -0
- package/esm/util/files.js.map +1 -0
- package/esm/util/handles.d.ts +10 -0
- package/esm/util/handles.d.ts.map +1 -0
- package/esm/util/handles.js +16 -0
- package/esm/util/handles.js.map +1 -0
- package/esm/util/index.d.ts +11 -0
- package/esm/util/index.d.ts.map +1 -0
- package/esm/util/index.js +11 -0
- package/esm/util/index.js.map +1 -0
- package/esm/util/performance.d.ts +2 -0
- package/esm/util/performance.d.ts.map +1 -0
- package/esm/util/performance.js +7 -0
- package/esm/util/performance.js.map +1 -0
- package/esm/util/shaders.d.ts +2 -0
- package/esm/util/shaders.d.ts.map +1 -0
- package/esm/util/shaders.js +30 -0
- package/esm/util/shaders.js.map +1 -0
- package/esm/util/webgl/index.d.ts +3 -0
- package/esm/util/webgl/index.d.ts.map +1 -0
- package/esm/util/webgl/index.js +3 -0
- package/esm/util/webgl/index.js.map +1 -0
- package/esm/util/webgl/m3.d.ts +11 -0
- package/esm/util/webgl/m3.d.ts.map +1 -0
- package/esm/util/webgl/m3.js +98 -0
- package/esm/util/webgl/m3.js.map +1 -0
- package/esm/util/webgl/uniform.d.ts +5 -0
- package/esm/util/webgl/uniform.d.ts.map +1 -0
- package/esm/util/webgl/uniform.js +18 -0
- package/esm/util/webgl/uniform.js.map +1 -0
- package/lib/API.d.ts +21 -0
- package/lib/API.d.ts.map +1 -0
- package/lib/API.js +78 -0
- package/lib/API.js.map +1 -0
- package/lib/Canvas.d.ts +69 -0
- package/lib/Canvas.d.ts.map +1 -0
- package/lib/Canvas.js +387 -0
- package/lib/Canvas.js.map +1 -0
- package/lib/Component.d.ts +126 -0
- package/lib/Component.d.ts.map +1 -0
- package/lib/Component.js +618 -0
- package/lib/Component.js.map +1 -0
- package/lib/bounding/AABB.d.ts +10 -0
- package/lib/bounding/AABB.d.ts.map +1 -0
- package/lib/bounding/AABB.js +23 -0
- package/lib/bounding/AABB.js.map +1 -0
- package/lib/bounding/BoundingBox.d.ts +53 -0
- package/lib/bounding/BoundingBox.d.ts.map +1 -0
- package/lib/bounding/BoundingBox.js +304 -0
- package/lib/bounding/BoundingBox.js.map +1 -0
- package/lib/bounding/Marquee.d.ts +28 -0
- package/lib/bounding/Marquee.d.ts.map +1 -0
- package/lib/bounding/Marquee.js +115 -0
- package/lib/bounding/Marquee.js.map +1 -0
- package/lib/bounding/MultiBoundingBox.d.ts +33 -0
- package/lib/bounding/MultiBoundingBox.d.ts.map +1 -0
- package/lib/bounding/MultiBoundingBox.js +377 -0
- package/lib/bounding/MultiBoundingBox.js.map +1 -0
- package/lib/bounding/index.d.ts +6 -0
- package/lib/bounding/index.d.ts.map +1 -0
- package/lib/bounding/index.js +22 -0
- package/lib/bounding/index.js.map +1 -0
- package/lib/bounding/type.d.ts +13 -0
- package/lib/bounding/type.d.ts.map +1 -0
- package/lib/bounding/type.js +9 -0
- package/lib/bounding/type.js.map +1 -0
- package/lib/camera/Camera.d.ts +27 -0
- package/lib/camera/Camera.d.ts.map +1 -0
- package/lib/camera/Camera.js +72 -0
- package/lib/camera/Camera.js.map +1 -0
- package/lib/camera/index.d.ts +2 -0
- package/lib/camera/index.d.ts.map +1 -0
- package/lib/camera/index.js +18 -0
- package/lib/camera/index.js.map +1 -0
- package/lib/contextMenu/ContextMenu.d.ts +57 -0
- package/lib/contextMenu/ContextMenu.d.ts.map +1 -0
- package/lib/contextMenu/ContextMenu.js +124 -0
- package/lib/contextMenu/ContextMenu.js.map +1 -0
- package/lib/contextMenu/Interaction.d.ts +22 -0
- package/lib/contextMenu/Interaction.d.ts.map +1 -0
- package/lib/contextMenu/Interaction.js +265 -0
- package/lib/contextMenu/Interaction.js.map +1 -0
- package/lib/contextMenu/index.d.ts +3 -0
- package/lib/contextMenu/index.d.ts.map +1 -0
- package/lib/contextMenu/index.js +19 -0
- package/lib/contextMenu/index.js.map +1 -0
- package/lib/history/history.d.ts +29 -0
- package/lib/history/history.d.ts.map +1 -0
- package/lib/history/history.js +127 -0
- package/lib/history/history.js.map +1 -0
- package/lib/history/index.d.ts +2 -0
- package/lib/history/index.d.ts.map +1 -0
- package/lib/history/index.js +18 -0
- package/lib/history/index.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +21 -0
- package/lib/index.js.map +1 -0
- package/lib/loader/Interaction.d.ts +4 -0
- package/lib/loader/Interaction.d.ts.map +1 -0
- package/lib/loader/Interaction.js +21 -0
- package/lib/loader/Interaction.js.map +1 -0
- package/lib/loader/Loader.d.ts +19 -0
- package/lib/loader/Loader.d.ts.map +1 -0
- package/lib/loader/Loader.js +53 -0
- package/lib/loader/Loader.js.map +1 -0
- package/lib/loader/index.d.ts +3 -0
- package/lib/loader/index.d.ts.map +1 -0
- package/lib/loader/index.js +19 -0
- package/lib/loader/index.js.map +1 -0
- package/lib/manager/ContextMenu.d.ts +11 -0
- package/lib/manager/ContextMenu.d.ts.map +1 -0
- package/lib/manager/ContextMenu.js +50 -0
- package/lib/manager/ContextMenu.js.map +1 -0
- package/lib/manager/FlipCommand.d.ts +18 -0
- package/lib/manager/FlipCommand.d.ts.map +1 -0
- package/lib/manager/FlipCommand.js +39 -0
- package/lib/manager/FlipCommand.js.map +1 -0
- package/lib/manager/KeyEvent.d.ts +16 -0
- package/lib/manager/KeyEvent.d.ts.map +1 -0
- package/lib/manager/KeyEvent.js +55 -0
- package/lib/manager/KeyEvent.js.map +1 -0
- package/lib/manager/OrderCommand.d.ts +17 -0
- package/lib/manager/OrderCommand.d.ts.map +1 -0
- package/lib/manager/OrderCommand.js +32 -0
- package/lib/manager/OrderCommand.js.map +1 -0
- package/lib/manager/PointerEvent.d.ts +70 -0
- package/lib/manager/PointerEvent.d.ts.map +1 -0
- package/lib/manager/PointerEvent.js +175 -0
- package/lib/manager/PointerEvent.js.map +1 -0
- package/lib/manager/SceneCommand.d.ts +18 -0
- package/lib/manager/SceneCommand.d.ts.map +1 -0
- package/lib/manager/SceneCommand.js +91 -0
- package/lib/manager/SceneCommand.js.map +1 -0
- package/lib/manager/Selection.d.ts +61 -0
- package/lib/manager/Selection.d.ts.map +1 -0
- package/lib/manager/Selection.js +309 -0
- package/lib/manager/Selection.js.map +1 -0
- package/lib/manager/TransformCommand.d.ts +20 -0
- package/lib/manager/TransformCommand.d.ts.map +1 -0
- package/lib/manager/TransformCommand.js +33 -0
- package/lib/manager/TransformCommand.js.map +1 -0
- package/lib/manager/index.d.ts +9 -0
- package/lib/manager/index.d.ts.map +1 -0
- package/lib/manager/index.js +25 -0
- package/lib/manager/index.js.map +1 -0
- package/lib/serializer/index.d.ts +2 -0
- package/lib/serializer/index.d.ts.map +1 -0
- package/lib/serializer/index.js +18 -0
- package/lib/serializer/index.js.map +1 -0
- package/lib/serializer/serializer.d.ts +54 -0
- package/lib/serializer/serializer.d.ts.map +1 -0
- package/lib/serializer/serializer.js +231 -0
- package/lib/serializer/serializer.js.map +1 -0
- package/lib/shaders/grid.d.ts +3 -0
- package/lib/shaders/grid.d.ts.map +1 -0
- package/lib/shaders/grid.js +92 -0
- package/lib/shaders/grid.js.map +1 -0
- package/lib/shaders/img.d.ts +4 -0
- package/lib/shaders/img.d.ts.map +1 -0
- package/lib/shaders/img.js +43 -0
- package/lib/shaders/img.js.map +1 -0
- package/lib/shaders/index.d.ts +4 -0
- package/lib/shaders/index.d.ts.map +1 -0
- package/lib/shaders/index.js +20 -0
- package/lib/shaders/index.js.map +1 -0
- package/lib/shaders/shape.d.ts +4 -0
- package/lib/shaders/shape.d.ts.map +1 -0
- package/lib/shaders/shape.js +33 -0
- package/lib/shaders/shape.js.map +1 -0
- package/lib/shapes/Grid.d.ts +21 -0
- package/lib/shapes/Grid.d.ts.map +1 -0
- package/lib/shapes/Grid.js +90 -0
- package/lib/shapes/Grid.js.map +1 -0
- package/lib/shapes/Img.d.ts +47 -0
- package/lib/shapes/Img.d.ts.map +1 -0
- package/lib/shapes/Img.js +314 -0
- package/lib/shapes/Img.js.map +1 -0
- package/lib/shapes/Rect.d.ts +34 -0
- package/lib/shapes/Rect.d.ts.map +1 -0
- package/lib/shapes/Rect.js +96 -0
- package/lib/shapes/Rect.js.map +1 -0
- package/lib/shapes/Renderable.d.ts +54 -0
- package/lib/shapes/Renderable.d.ts.map +1 -0
- package/lib/shapes/Renderable.js +146 -0
- package/lib/shapes/Renderable.js.map +1 -0
- package/lib/shapes/Shape.d.ts +27 -0
- package/lib/shapes/Shape.d.ts.map +1 -0
- package/lib/shapes/Shape.js +73 -0
- package/lib/shapes/Shape.js.map +1 -0
- package/lib/shapes/Triangle.d.ts +20 -0
- package/lib/shapes/Triangle.d.ts.map +1 -0
- package/lib/shapes/Triangle.js +86 -0
- package/lib/shapes/Triangle.js.map +1 -0
- package/lib/shapes/index.d.ts +6 -0
- package/lib/shapes/index.d.ts.map +1 -0
- package/lib/shapes/index.js +23 -0
- package/lib/shapes/index.js.map +1 -0
- package/lib/state/camera.d.ts +36 -0
- package/lib/state/camera.d.ts.map +1 -0
- package/lib/state/camera.js +92 -0
- package/lib/state/camera.js.map +1 -0
- package/lib/state/index.d.ts +4 -0
- package/lib/state/index.d.ts.map +1 -0
- package/lib/state/index.js +20 -0
- package/lib/state/index.js.map +1 -0
- package/lib/state/pointerEvent.d.ts +23 -0
- package/lib/state/pointerEvent.d.ts.map +1 -0
- package/lib/state/pointerEvent.js +53 -0
- package/lib/state/pointerEvent.js.map +1 -0
- package/lib/state/renderable.d.ts +36 -0
- package/lib/state/renderable.d.ts.map +1 -0
- package/lib/state/renderable.js +180 -0
- package/lib/state/renderable.js.map +1 -0
- package/lib/storage/defaultStorage.d.ts +34 -0
- package/lib/storage/defaultStorage.d.ts.map +1 -0
- package/lib/storage/defaultStorage.js +246 -0
- package/lib/storage/defaultStorage.js.map +1 -0
- package/lib/storage/index.d.ts +3 -0
- package/lib/storage/index.d.ts.map +1 -0
- package/lib/storage/index.js +19 -0
- package/lib/storage/index.js.map +1 -0
- package/lib/storage/storage.d.ts +36 -0
- package/lib/storage/storage.d.ts.map +1 -0
- package/lib/storage/storage.js +50 -0
- package/lib/storage/storage.js.map +1 -0
- package/lib/util/camera/camera.d.ts +19 -0
- package/lib/util/camera/camera.d.ts.map +1 -0
- package/lib/util/camera/camera.js +87 -0
- package/lib/util/camera/camera.js.map +1 -0
- package/lib/util/camera/index.d.ts +2 -0
- package/lib/util/camera/index.d.ts.map +1 -0
- package/lib/util/camera/index.js +18 -0
- package/lib/util/camera/index.js.map +1 -0
- package/lib/util/checks.d.ts +11 -0
- package/lib/util/checks.d.ts.map +1 -0
- package/lib/util/checks.js +49 -0
- package/lib/util/checks.js.map +1 -0
- package/lib/util/clipboard.d.ts +7 -0
- package/lib/util/clipboard.d.ts.map +1 -0
- package/lib/util/clipboard.js +152 -0
- package/lib/util/clipboard.js.map +1 -0
- package/lib/util/color.d.ts +4 -0
- package/lib/util/color.d.ts.map +1 -0
- package/lib/util/color.js +11 -0
- package/lib/util/color.js.map +1 -0
- package/lib/util/customEventType.d.ts +35 -0
- package/lib/util/customEventType.d.ts.map +1 -0
- package/lib/util/customEventType.js +38 -0
- package/lib/util/customEventType.js.map +1 -0
- package/lib/util/files.d.ts +19 -0
- package/lib/util/files.d.ts.map +1 -0
- package/lib/util/files.js +193 -0
- package/lib/util/files.js.map +1 -0
- package/lib/util/handles.d.ts +10 -0
- package/lib/util/handles.d.ts.map +1 -0
- package/lib/util/handles.js +20 -0
- package/lib/util/handles.js.map +1 -0
- package/lib/util/index.d.ts +11 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/index.js +27 -0
- package/lib/util/index.js.map +1 -0
- package/lib/util/performance.d.ts +2 -0
- package/lib/util/performance.d.ts.map +1 -0
- package/lib/util/performance.js +10 -0
- package/lib/util/performance.js.map +1 -0
- package/lib/util/shaders.d.ts +2 -0
- package/lib/util/shaders.d.ts.map +1 -0
- package/lib/util/shaders.js +33 -0
- package/lib/util/shaders.js.map +1 -0
- package/lib/util/webgl/index.d.ts +3 -0
- package/lib/util/webgl/index.d.ts.map +1 -0
- package/lib/util/webgl/index.js +19 -0
- package/lib/util/webgl/index.js.map +1 -0
- package/lib/util/webgl/m3.d.ts +11 -0
- package/lib/util/webgl/m3.d.ts.map +1 -0
- package/lib/util/webgl/m3.js +101 -0
- package/lib/util/webgl/m3.js.map +1 -0
- package/lib/util/webgl/uniform.d.ts +5 -0
- package/lib/util/webgl/uniform.d.ts.map +1 -0
- package/lib/util/webgl/uniform.js +21 -0
- package/lib/util/webgl/uniform.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { m3 } from "../webgl/m3";
|
|
2
|
+
export function getClipSpaceMousePosition(e, canvas) {
|
|
3
|
+
const rect = canvas.getBoundingClientRect();
|
|
4
|
+
const cssX = e.clientX - rect.left;
|
|
5
|
+
const cssY = e.clientY - rect.top;
|
|
6
|
+
const normalizedX = cssX / canvas.clientWidth;
|
|
7
|
+
const normalizedY = cssY / canvas.clientHeight;
|
|
8
|
+
const clipX = normalizedX * 2 - 1;
|
|
9
|
+
const clipY = normalizedY * -2 + 1;
|
|
10
|
+
return [clipX, clipY];
|
|
11
|
+
}
|
|
12
|
+
export function clipToCSS(clipX, clipY, canvas) {
|
|
13
|
+
const x = (clipX + 1) * 0.5 * canvas.clientWidth;
|
|
14
|
+
const y = (1 - clipY) * 0.5 * canvas.clientHeight;
|
|
15
|
+
return [x, y];
|
|
16
|
+
}
|
|
17
|
+
// Render: clip = P · V · world
|
|
18
|
+
// Picking: world = inverse(P · V) · clip
|
|
19
|
+
export function screenToWorld(clientX, clientY, w, h, canvas, worldMatrix) {
|
|
20
|
+
const rect = canvas.getBoundingClientRect();
|
|
21
|
+
const dpr = window.devicePixelRatio || 1;
|
|
22
|
+
// Device pixels relative to canvas
|
|
23
|
+
const x = (clientX - rect.left) * dpr;
|
|
24
|
+
const y = (clientY - rect.top) * dpr;
|
|
25
|
+
const xClip = (x / w) * 2 - 1;
|
|
26
|
+
const yClip = (y / h) * -2 + 1;
|
|
27
|
+
// projection matrix transforms pixel space to clip space
|
|
28
|
+
const proj = m3.projection(w, h);
|
|
29
|
+
// view-projection matrix
|
|
30
|
+
const pv = m3.multiply(proj, worldMatrix); // worldMatrix is view matrix and calculates the matrix to map world-space to clip-space
|
|
31
|
+
// used to unproject and retrieve world coords
|
|
32
|
+
const invPV = m3.inverse(pv);
|
|
33
|
+
const [wx, wy] = m3.transformPoint(invPV, [xClip, yClip]);
|
|
34
|
+
return [wx, wy];
|
|
35
|
+
}
|
|
36
|
+
export function getWorldCoords(x, y, canvas) {
|
|
37
|
+
const { gl, canvas: innerCanvas } = canvas;
|
|
38
|
+
return screenToWorld(x, y, gl.canvas.width, gl.canvas.height, innerCanvas, canvas.worldMatrix);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Transforms a point from world space to camera (view) space.
|
|
42
|
+
* @param worldX X coordinate in world space
|
|
43
|
+
* @param worldY Y coordinate in world space
|
|
44
|
+
* @param cameraMatrix The camera/view matrix (usually canvas.worldMatrix)
|
|
45
|
+
* @returns [cameraX, cameraY]
|
|
46
|
+
*/
|
|
47
|
+
export function worldToCamera(worldX, worldY, cameraMatrix) {
|
|
48
|
+
// The camera matrix maps camera space to world space, so invert it
|
|
49
|
+
const invCamera = m3.inverse(cameraMatrix);
|
|
50
|
+
return m3.transformPoint(invCamera, [worldX, worldY]);
|
|
51
|
+
}
|
|
52
|
+
export function applyMatrixToPoint(matrix, x, y) {
|
|
53
|
+
const px = x ?? 0;
|
|
54
|
+
const py = y ?? 0;
|
|
55
|
+
return [
|
|
56
|
+
matrix[0] * px + matrix[3] * py + matrix[6],
|
|
57
|
+
matrix[1] * px + matrix[4] * py + matrix[7],
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
export function getScaleXFromMatrix(matrix) {
|
|
61
|
+
return Math.hypot(matrix[0], matrix[1]);
|
|
62
|
+
}
|
|
63
|
+
export function getScaleYFromMatrix(matrix) {
|
|
64
|
+
return Math.hypot(matrix[3], matrix[4]);
|
|
65
|
+
}
|
|
66
|
+
export function getScalesFromMatrix(matrix) {
|
|
67
|
+
return [getScaleXFromMatrix(matrix), getScaleYFromMatrix(matrix)];
|
|
68
|
+
}
|
|
69
|
+
function isPositive(num) {
|
|
70
|
+
return num / Math.abs(num);
|
|
71
|
+
}
|
|
72
|
+
export function isScalePositive(matrix) {
|
|
73
|
+
return [isPositive(matrix[0]), isPositive(matrix[4])];
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=camera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera.js","sourceRoot":"src/","sources":["util/camera/camera.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"src/","sources":["util/camera/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"src/","sources":["util/camera/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function arraysEqual(a: any, b: any): boolean;
|
|
2
|
+
export declare const isNumber: (a: any) => a is number;
|
|
3
|
+
export declare const isObject: (a: any) => a is object;
|
|
4
|
+
export declare const isBoolean: (arg: any) => arg is boolean;
|
|
5
|
+
export declare const isFunction: (val: any) => val is Function;
|
|
6
|
+
export declare const isUndefined: (val: any) => val is undefined;
|
|
7
|
+
export declare const isNil: (val: any) => val is null | undefined;
|
|
8
|
+
export declare const sameSign: (a: number, b: number) => boolean;
|
|
9
|
+
export declare const normalizeSign: (v: number, EPS: number) => number;
|
|
10
|
+
export declare const willFlip: (current: number, factor: number, EPS: number) => boolean;
|
|
11
|
+
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"src/","sources":["util/checks.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA,WAe/B;AAED,eAAO,MAAM,QAAQ,GAAI,MAAC,KAAG,CAAC,IAAI,MAA+B,CAAC;AAClE,eAAO,MAAM,QAAQ,GAAI,MAAC,KAAG,CAAC,IAAI,MAA6B,CAAC;AAChE,eAAO,MAAM,SAAS,GAAI,QAAG,KAAG,GAAG,IAAI,OAAwB,CAAC;AAChE,eAAO,MAAM,UAAU,GAAI,QAAG,KAAG,GAAG,IAAI,QAAqC,CAAC;AAC9E,eAAO,MAAM,WAAW,GAAI,QAAG,KAAG,GAAG,IAAI,SAA8B,CAAC;AACxE,eAAO,MAAM,KAAK,GAAI,QAAG,KAAG,GAAG,IAAI,IAAI,GAAG,SAAwB,CAAC;AAEnE,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,YAAkC,CAAC;AAEhF,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,EAAE,KAAK,MAAM,WAGnD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,EAAE,KAAK,MAAM,YAGpE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function arraysEqual(a, b) {
|
|
2
|
+
if (a == undefined || b == undefined)
|
|
3
|
+
return false;
|
|
4
|
+
if (a === b)
|
|
5
|
+
return true;
|
|
6
|
+
if (a == null || b == null)
|
|
7
|
+
return false;
|
|
8
|
+
if (a.length !== b.length)
|
|
9
|
+
return false;
|
|
10
|
+
// If you don't care about the order of the elements inside
|
|
11
|
+
// the array, you should sort both arrays here.
|
|
12
|
+
// Please note that calling sort on an array will modify that array.
|
|
13
|
+
// you might want to clone your array first.
|
|
14
|
+
for (var i = 0; i < a.length; ++i) {
|
|
15
|
+
if (a[i] !== b[i])
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
export const isNumber = (a) => typeof a === "number";
|
|
21
|
+
export const isObject = (a) => a instanceof Object;
|
|
22
|
+
export const isBoolean = (arg) => arg === !!arg;
|
|
23
|
+
export const isFunction = (val) => typeof val === "function";
|
|
24
|
+
export const isUndefined = (val) => val === undefined;
|
|
25
|
+
export const isNil = (val) => val == null;
|
|
26
|
+
export const sameSign = (a, b) => Math.sign(a) === Math.sign(b);
|
|
27
|
+
export const normalizeSign = (v, EPS) => {
|
|
28
|
+
if (Math.abs(v) < EPS)
|
|
29
|
+
return 0;
|
|
30
|
+
return Math.sign(v);
|
|
31
|
+
};
|
|
32
|
+
export const willFlip = (current, factor, EPS) => {
|
|
33
|
+
const next = current * factor;
|
|
34
|
+
return normalizeSign(current, EPS) !== normalizeSign(next, EPS);
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"src/","sources":["util/checks.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,CAAC,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAExC,2DAA2D;IAC3D,+CAA+C;IAC/C,oEAAoE;IACpE,4CAA4C;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,YAAY,MAAM,CAAC;AAChE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,EAAkB,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAmB,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAoB,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC;AACxE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,EAA2B,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC;AAEnE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE;IACtD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,MAAc,EAAE,GAAW,EAAE,EAAE;IACvE,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9B,OAAO,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Img } from "../shapes";
|
|
2
|
+
import { Canvas } from "Canvas";
|
|
3
|
+
import { CanvasHistory } from "history";
|
|
4
|
+
export declare const probablySupportsClipboardWriteText: () => boolean;
|
|
5
|
+
export declare function copy(selected: Img[], clipboardEvent?: ClipboardEvent): Promise<void>;
|
|
6
|
+
export declare function paste(clientX: number, clientY: number, canvas: Canvas, history: CanvasHistory, isWorldCoord?: boolean): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"src/","sources":["util/clipboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAkBxC,eAAO,MAAM,kCAAkC,eAE9C,CAAC;AAIF,wBAAsB,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,cAAc,iBAsC1E;AA2CD,wBAAsB,KAAK,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,YAAY,GAAE,OAAc,iBAqF7B"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { convertToPNG, getWorldCoords } from ".";
|
|
2
|
+
import { makeMultiAddChildCommand } from "../manager/SceneCommand";
|
|
3
|
+
const acceptedPasteMimeType = ["image/", "text/plain"];
|
|
4
|
+
export const probablySupportsClipboardWriteText = () => {
|
|
5
|
+
return "clipboard" in navigator && "writeText" in navigator.clipboard;
|
|
6
|
+
};
|
|
7
|
+
// the original copying method involved writing to clipboard API which can take a long time when writing multiple images
|
|
8
|
+
// opted for in canvas only copying, which is faster
|
|
9
|
+
export async function copy(selected, clipboardEvent) {
|
|
10
|
+
const dataStored = {
|
|
11
|
+
type: "infinite_canvas",
|
|
12
|
+
elements: selected.map((img) => ({
|
|
13
|
+
src: img.src,
|
|
14
|
+
x: img.x,
|
|
15
|
+
y: img.y,
|
|
16
|
+
sx: img.sx,
|
|
17
|
+
sy: img.sy,
|
|
18
|
+
})),
|
|
19
|
+
};
|
|
20
|
+
const json = JSON.stringify(dataStored);
|
|
21
|
+
const clipboardItem = new ClipboardItem({
|
|
22
|
+
"text/plain": new Blob([json], { type: "text/plain" }),
|
|
23
|
+
});
|
|
24
|
+
if (probablySupportsClipboardWriteText()) {
|
|
25
|
+
try {
|
|
26
|
+
await navigator.clipboard.write([clipboardItem]);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
console.error(err);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
if (clipboardEvent) {
|
|
35
|
+
clipboardEvent.clipboardData?.setData("text/plain", json);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error(err);
|
|
41
|
+
}
|
|
42
|
+
if (!copyTextViaExecCommand(json)) {
|
|
43
|
+
throw new Error("Error copying to clipboard.");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function copyTextViaExecCommand(text) {
|
|
47
|
+
// execCommand doesn't allow copying empty strings, so if we're
|
|
48
|
+
// clearing clipboard using this API, we must copy at least an empty char
|
|
49
|
+
if (!text) {
|
|
50
|
+
text = " ";
|
|
51
|
+
}
|
|
52
|
+
const isRTL = document.documentElement.getAttribute("dir") === "rtl";
|
|
53
|
+
const textarea = document.createElement("textarea");
|
|
54
|
+
textarea.style.border = "0";
|
|
55
|
+
textarea.style.padding = "0";
|
|
56
|
+
textarea.style.margin = "0";
|
|
57
|
+
textarea.style.position = "absolute";
|
|
58
|
+
textarea.style[isRTL ? "right" : "left"] = "-9999px";
|
|
59
|
+
const yPosition = window.pageYOffset || document.documentElement.scrollTop;
|
|
60
|
+
textarea.style.top = `${yPosition}px`;
|
|
61
|
+
textarea.style.fontSize = "12pt";
|
|
62
|
+
textarea.setAttribute("readonly", "");
|
|
63
|
+
textarea.value = text;
|
|
64
|
+
document.body.appendChild(textarea);
|
|
65
|
+
let success = false;
|
|
66
|
+
try {
|
|
67
|
+
textarea.select();
|
|
68
|
+
textarea.setSelectionRange(0, textarea.value.length);
|
|
69
|
+
success = document.execCommand("copy");
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error(error);
|
|
73
|
+
}
|
|
74
|
+
textarea.remove();
|
|
75
|
+
return success;
|
|
76
|
+
}
|
|
77
|
+
export async function paste(clientX, clientY, canvas, history, isWorldCoord = true) {
|
|
78
|
+
// check if there is anything from your clipboard to paste from
|
|
79
|
+
const items = await navigator.clipboard.read();
|
|
80
|
+
const types = items[0].types;
|
|
81
|
+
const [wx, wy] = isWorldCoord
|
|
82
|
+
? [clientX, clientY]
|
|
83
|
+
: getWorldCoords(clientX, clientY, canvas);
|
|
84
|
+
for (const type of types) {
|
|
85
|
+
const allowed = acceptedPasteMimeType.find((allowed) => allowed.endsWith("/") ? type.startsWith(allowed) : type === allowed);
|
|
86
|
+
if (!allowed)
|
|
87
|
+
continue;
|
|
88
|
+
const blob = await items[0].getType(type);
|
|
89
|
+
try {
|
|
90
|
+
if (type === "text/plain") {
|
|
91
|
+
const data = JSON.parse(await blob.text());
|
|
92
|
+
if (data.elements.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
let minX = Infinity, minY = Infinity;
|
|
95
|
+
for (const el of data.elements) {
|
|
96
|
+
if (el.x < minX)
|
|
97
|
+
minX = el.x;
|
|
98
|
+
if (el.y < minY)
|
|
99
|
+
minY = el.y;
|
|
100
|
+
}
|
|
101
|
+
const images = await Promise.all(data.elements.map((element) => canvas.addImageToCanvas(element.src, wx + element.x - minX, wy + element.y - minY, element.sx, element.sy)));
|
|
102
|
+
history.push(makeMultiAddChildCommand(canvas, images));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error("Failed to parse clipboard data", err);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
let base64;
|
|
111
|
+
if (type.startsWith("image/svg")) {
|
|
112
|
+
try {
|
|
113
|
+
const svgText = await blob.text();
|
|
114
|
+
base64 = await convertToPNG(`data:image/svg+xml;base64,${btoa(svgText)}`);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
console.error("SVG conversion failed", err);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
try {
|
|
123
|
+
base64 = await new Promise((resolve, reject) => {
|
|
124
|
+
const reader = new FileReader();
|
|
125
|
+
reader.onloadend = () => resolve(reader.result);
|
|
126
|
+
reader.onerror = reject;
|
|
127
|
+
reader.readAsDataURL(blob);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
console.error("Image read failed", err);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const img = await canvas.addImageToCanvas(base64, wx, wy);
|
|
137
|
+
history.push(makeMultiAddChildCommand(canvas, [img]));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
console.error("Failed to add image to canvas", err);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"src/","sources":["util/clipboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"src/","sources":["util/color.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAwB,CAAC;AAChF,eAAO,MAAM,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAEvD,CAAC;AACF,eAAO,MAAM,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAEzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"src/","sources":["util/color.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAqC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,UAAU,GAAqC;IAC1D,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;CACrB,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAqC;IAC5D,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;CACrB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const ContextMenuEvent: {
|
|
2
|
+
readonly Open: "opencontextmenu";
|
|
3
|
+
readonly Close: "closecontextmenu";
|
|
4
|
+
};
|
|
5
|
+
export declare const CanvasEvent: {
|
|
6
|
+
readonly Dirty: "dirty";
|
|
7
|
+
readonly Save: "save";
|
|
8
|
+
readonly SelectionChanged: "selectionchanged";
|
|
9
|
+
readonly Render: "render";
|
|
10
|
+
readonly Resize: "resize";
|
|
11
|
+
readonly Zoom: "zoom";
|
|
12
|
+
readonly ModeChange: "modechange";
|
|
13
|
+
readonly HistoryChange: "historychange";
|
|
14
|
+
readonly PointerDown: "pointerdown";
|
|
15
|
+
readonly PointerUp: "pointerup";
|
|
16
|
+
readonly PointerMove: "pointermove";
|
|
17
|
+
readonly ImageAdded: "imageadded";
|
|
18
|
+
readonly ImageRemoved: "imageremoved";
|
|
19
|
+
readonly Change: "statechange";
|
|
20
|
+
};
|
|
21
|
+
export declare const CustomClipboardEvent: {
|
|
22
|
+
readonly Copy: "copy";
|
|
23
|
+
readonly Cut: "cut";
|
|
24
|
+
readonly Paste: "paste";
|
|
25
|
+
};
|
|
26
|
+
export declare const LoaderEvent: {
|
|
27
|
+
readonly start: "startloading";
|
|
28
|
+
readonly done: "completeloading";
|
|
29
|
+
};
|
|
30
|
+
export declare const SaveEvent: {
|
|
31
|
+
readonly Save: "save";
|
|
32
|
+
readonly SaveCompleted: "savecompleted";
|
|
33
|
+
readonly SaveFailed: "savefailed";
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=customEventType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customEventType.d.ts","sourceRoot":"src/","sources":["util/customEventType.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;CAed,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAEX,eAAO,MAAM,SAAS;;;;CAIZ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const ContextMenuEvent = {
|
|
2
|
+
Open: "opencontextmenu",
|
|
3
|
+
Close: "closecontextmenu",
|
|
4
|
+
};
|
|
5
|
+
export const CanvasEvent = {
|
|
6
|
+
Dirty: "dirty",
|
|
7
|
+
Save: "save",
|
|
8
|
+
SelectionChanged: "selectionchanged",
|
|
9
|
+
Render: "render",
|
|
10
|
+
Resize: "resize",
|
|
11
|
+
Zoom: "zoom",
|
|
12
|
+
ModeChange: "modechange",
|
|
13
|
+
HistoryChange: "historychange",
|
|
14
|
+
PointerDown: "pointerdown",
|
|
15
|
+
PointerUp: "pointerup",
|
|
16
|
+
PointerMove: "pointermove",
|
|
17
|
+
ImageAdded: "imageadded",
|
|
18
|
+
ImageRemoved: "imageremoved",
|
|
19
|
+
Change: "statechange",
|
|
20
|
+
};
|
|
21
|
+
export const CustomClipboardEvent = {
|
|
22
|
+
Copy: "copy",
|
|
23
|
+
Cut: "cut",
|
|
24
|
+
Paste: "paste",
|
|
25
|
+
};
|
|
26
|
+
export const LoaderEvent = {
|
|
27
|
+
start: "startloading",
|
|
28
|
+
done: "completeloading",
|
|
29
|
+
};
|
|
30
|
+
export const SaveEvent = {
|
|
31
|
+
Save: "save",
|
|
32
|
+
SaveCompleted: "savecompleted",
|
|
33
|
+
SaveFailed: "savefailed",
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=customEventType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customEventType.js","sourceRoot":"src/","sources":["util/customEventType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,kBAAkB;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,gBAAgB,EAAE,kBAAkB;IACpC,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,cAAc;IAC5B,MAAM,EAAE,aAAa;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,iBAAiB;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,MAAM;IACZ,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;CAChB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SerializedCanvas } from "../serializer";
|
|
2
|
+
import { Img } from "../shapes";
|
|
3
|
+
export declare function previewImage(file: File): Promise<string | ArrayBuffer>;
|
|
4
|
+
export declare function hashStringToId(str: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Extract mimetype from base64 string
|
|
7
|
+
*/
|
|
8
|
+
export declare function getMimeType(data: string): string;
|
|
9
|
+
export declare function addImages(files: FileList, addToCanvas: (src: string) => Promise<Img>): Promise<any[]>;
|
|
10
|
+
export declare function downloadJSON(filename: string, data: SerializedCanvas): void;
|
|
11
|
+
export declare function readJSONFile<T = unknown>(file: File): Promise<T>;
|
|
12
|
+
export declare function convertToPNG(src: string, quality?: number): Promise<string>;
|
|
13
|
+
export declare function mergeMultiImg(imgs: Img[]): Promise<string>;
|
|
14
|
+
export declare function mergeImagesToCanvas(images: Img[]): Promise<{
|
|
15
|
+
mergedCanvas: HTMLCanvasElement;
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"src/","sources":["util/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,iCAU5C;AAiBD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,UAGvC;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,kBAmB3C;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,QAWpE;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAGtE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBxE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ChE;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,GAAG,EAAE,GACZ,OAAO,CAAC;IAAE,YAAY,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD7E"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export async function previewImage(file) {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
let reader = new FileReader();
|
|
4
|
+
reader.onload = (e) => {
|
|
5
|
+
resolve(e.target.result);
|
|
6
|
+
};
|
|
7
|
+
reader.onerror = reject;
|
|
8
|
+
reader.readAsDataURL(file);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
const PERMISSIBLE_IMAGE_TYPES = [
|
|
12
|
+
"image/webp",
|
|
13
|
+
"image/png",
|
|
14
|
+
"image/jpeg",
|
|
15
|
+
"image/jpg",
|
|
16
|
+
"image/svg+xml",
|
|
17
|
+
"image/avif",
|
|
18
|
+
"image/gif", // will be rendered as a still image
|
|
19
|
+
"image/apng", // will be rendered as a still image
|
|
20
|
+
];
|
|
21
|
+
function isPermissibleImageType(fileType) {
|
|
22
|
+
return PERMISSIBLE_IMAGE_TYPES.includes(fileType);
|
|
23
|
+
}
|
|
24
|
+
export async function hashStringToId(str) {
|
|
25
|
+
const encoder = new TextEncoder();
|
|
26
|
+
const data = encoder.encode(str);
|
|
27
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
28
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
29
|
+
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extract mimetype from base64 string
|
|
33
|
+
*/
|
|
34
|
+
export function getMimeType(data) {
|
|
35
|
+
const match = /^data:([^;]+);base64,/.exec(data);
|
|
36
|
+
return match ? match[1] : undefined;
|
|
37
|
+
}
|
|
38
|
+
export async function addImages(files, addToCanvas) {
|
|
39
|
+
const images = [];
|
|
40
|
+
if (files.length > 0) {
|
|
41
|
+
for (let i = 0; i < files.length; i++) {
|
|
42
|
+
const file = files[i];
|
|
43
|
+
if (isPermissibleImageType(file.type)) {
|
|
44
|
+
try {
|
|
45
|
+
const src = await previewImage(file);
|
|
46
|
+
if (typeof src === "string") {
|
|
47
|
+
images.push(await addToCanvas(src));
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
console.error("Image not added");
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
console.error("Failed to copy image.");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return images;
|
|
59
|
+
}
|
|
60
|
+
export function downloadJSON(filename, data) {
|
|
61
|
+
const text = JSON.stringify(data, null, 2);
|
|
62
|
+
const blob = new Blob([text], { type: "application/json" });
|
|
63
|
+
const url = URL.createObjectURL(blob);
|
|
64
|
+
const a = document.createElement("a");
|
|
65
|
+
a.href = url;
|
|
66
|
+
a.download = filename;
|
|
67
|
+
document.body.appendChild(a);
|
|
68
|
+
a.click();
|
|
69
|
+
a.remove();
|
|
70
|
+
URL.revokeObjectURL(url);
|
|
71
|
+
}
|
|
72
|
+
export async function readJSONFile(file) {
|
|
73
|
+
const text = await file.text();
|
|
74
|
+
return JSON.parse(text);
|
|
75
|
+
}
|
|
76
|
+
export function convertToPNG(src, quality = 1.0) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const img = new Image();
|
|
79
|
+
img.onload = () => {
|
|
80
|
+
const canvas = document.createElement("canvas");
|
|
81
|
+
canvas.width = img.width;
|
|
82
|
+
canvas.height = img.height;
|
|
83
|
+
const ctx = canvas.getContext("2d");
|
|
84
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
85
|
+
ctx.drawImage(img, 0, 0);
|
|
86
|
+
const pngDataUrl = canvas.toDataURL("image/png", quality);
|
|
87
|
+
resolve(pngDataUrl);
|
|
88
|
+
};
|
|
89
|
+
img.onerror = reject;
|
|
90
|
+
img.src = src;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export async function mergeMultiImg(imgs) {
|
|
94
|
+
const startX = getSmallestImgX(imgs);
|
|
95
|
+
const startY = getSmallestImgY(imgs);
|
|
96
|
+
const endX = getEndX(imgs);
|
|
97
|
+
const endY = getEndY(imgs);
|
|
98
|
+
const canvas = document.createElement("canvas");
|
|
99
|
+
canvas.width = endX - startX;
|
|
100
|
+
canvas.height = endY - startY;
|
|
101
|
+
const ctx = canvas.getContext("2d");
|
|
102
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
103
|
+
// consider transformation as well
|
|
104
|
+
const promises = imgs.map(async (img) => {
|
|
105
|
+
return new Promise(async (resolve, reject) => {
|
|
106
|
+
try {
|
|
107
|
+
const innerImg = new Image();
|
|
108
|
+
innerImg.onload = () => {
|
|
109
|
+
ctx.drawImage(innerImg, 0, 0, img.width, img.height, img.x - startX, img.y - startY, img.width * img.sx, img.height * img.sy);
|
|
110
|
+
resolve();
|
|
111
|
+
};
|
|
112
|
+
innerImg.onerror = reject;
|
|
113
|
+
innerImg.src = img.src;
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
console.error(err);
|
|
117
|
+
reject(err);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
await Promise.all(promises);
|
|
122
|
+
const data = canvas.toDataURL("image/png");
|
|
123
|
+
return data;
|
|
124
|
+
}
|
|
125
|
+
export async function mergeImagesToCanvas(images) {
|
|
126
|
+
if (images.length === 0) {
|
|
127
|
+
throw new Error("No images to merge.");
|
|
128
|
+
}
|
|
129
|
+
// Compute bounding box for all images
|
|
130
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
131
|
+
for (const img of images) {
|
|
132
|
+
minX = Math.min(minX, img.x);
|
|
133
|
+
minY = Math.min(minY, img.y);
|
|
134
|
+
maxX = Math.max(maxX, img.x + img.width);
|
|
135
|
+
maxY = Math.max(maxY, img.y + img.height);
|
|
136
|
+
}
|
|
137
|
+
const width = Math.ceil(maxX - minX);
|
|
138
|
+
const height = Math.ceil(maxY - minY);
|
|
139
|
+
// Create offscreen canvas
|
|
140
|
+
const canvas = document.createElement("canvas");
|
|
141
|
+
canvas.width = width;
|
|
142
|
+
canvas.height = height;
|
|
143
|
+
const ctx = canvas.getContext("2d");
|
|
144
|
+
if (!ctx)
|
|
145
|
+
throw new Error("Could not get 2D context");
|
|
146
|
+
// Draw each image at its relative position
|
|
147
|
+
await Promise.all(images.map((img) => {
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
const imageEl = new window.Image();
|
|
150
|
+
imageEl.onload = () => {
|
|
151
|
+
ctx.drawImage(imageEl, img.x - minX, img.y - minY, img.width, img.height);
|
|
152
|
+
resolve();
|
|
153
|
+
};
|
|
154
|
+
imageEl.onerror = reject;
|
|
155
|
+
imageEl.src = img.src;
|
|
156
|
+
});
|
|
157
|
+
}));
|
|
158
|
+
return { mergedCanvas: canvas, width, height };
|
|
159
|
+
}
|
|
160
|
+
function getSmallestImgX(imgs) {
|
|
161
|
+
return [...imgs].sort((a, b) => {
|
|
162
|
+
return a.x - b.x;
|
|
163
|
+
})[0].x;
|
|
164
|
+
}
|
|
165
|
+
function getSmallestImgY(imgs) {
|
|
166
|
+
return [...imgs].sort((a, b) => {
|
|
167
|
+
return a.y - b.y;
|
|
168
|
+
})[0].y;
|
|
169
|
+
}
|
|
170
|
+
function getEndX(imgs) {
|
|
171
|
+
const endImg = [...imgs].sort((a, b) => {
|
|
172
|
+
return b.x + b.width * b.sx - (a.x + a.width * a.sx);
|
|
173
|
+
})[0];
|
|
174
|
+
return endImg.x + endImg.width * endImg.sx;
|
|
175
|
+
}
|
|
176
|
+
function getEndY(imgs) {
|
|
177
|
+
const endImg = [...imgs].sort((a, b) => {
|
|
178
|
+
return b.y + b.height * b.sy - (a.y + a.height * a.sy);
|
|
179
|
+
})[0];
|
|
180
|
+
return endImg.y + endImg.height * endImg.sy;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=files.js.map
|