js-draw 1.21.2 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +103 -75
- package/build-config.json +2 -2
- package/dist/Editor.css +29 -16
- package/dist/bundle.js +2 -2
- package/dist/bundledStyles.js +1 -1
- package/dist/cjs/Editor.js +36 -22
- package/dist/cjs/EventDispatcher.js +1 -1
- package/dist/cjs/Pointer.js +3 -3
- package/dist/cjs/SVGLoader/SVGLoader.js +13 -6
- package/dist/cjs/UndoRedoHistory.js +1 -1
- package/dist/cjs/Viewport.js +4 -2
- package/dist/cjs/commands/Command.js +7 -5
- package/dist/cjs/commands/Duplicate.js +2 -2
- package/dist/cjs/commands/Erase.js +3 -4
- package/dist/cjs/commands/invertCommand.js +4 -4
- package/dist/cjs/commands/lib.d.ts +1 -1
- package/dist/cjs/commands/uniteCommands.js +4 -4
- package/dist/cjs/components/AbstractComponent.d.ts +1 -1
- package/dist/cjs/components/AbstractComponent.js +3 -3
- package/dist/cjs/components/BackgroundComponent.js +8 -6
- package/dist/cjs/components/ImageComponent.js +12 -5
- package/dist/cjs/components/RestylableComponent.js +1 -1
- package/dist/cjs/components/SVGGlobalAttributesObject.js +1 -2
- package/dist/cjs/components/Stroke.js +37 -24
- package/dist/cjs/components/TextComponent.js +13 -10
- package/dist/cjs/components/UnknownSVGObject.js +2 -3
- package/dist/cjs/components/builders/ArrowBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/ArrowBuilder.js +9 -3
- package/dist/cjs/components/builders/CircleBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/CircleBuilder.js +11 -4
- package/dist/cjs/components/builders/FreehandLineBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/FreehandLineBuilder.js +10 -4
- package/dist/cjs/components/builders/LineBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/LineBuilder.js +8 -4
- package/dist/cjs/components/builders/PolylineBuilder.d.ts +4 -1
- package/dist/cjs/components/builders/PolylineBuilder.js +9 -5
- package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.js +16 -10
- package/dist/cjs/components/builders/RectangleBuilder.d.ts +12 -0
- package/dist/cjs/components/builders/RectangleBuilder.js +17 -3
- package/dist/cjs/components/builders/autocorrect/makeShapeFitAutocorrect.js +5 -8
- package/dist/cjs/components/builders/autocorrect/makeSnapToGridAutocorrect.js +1 -1
- package/dist/cjs/components/builders/lib.d.ts +7 -0
- package/dist/cjs/components/builders/lib.js +18 -0
- package/dist/cjs/components/lib.d.ts +1 -4
- package/dist/cjs/components/lib.js +2 -9
- package/dist/cjs/components/util/StrokeSmoother.js +5 -6
- package/dist/cjs/dialogs/makeAboutDialog.js +1 -1
- package/dist/cjs/dialogs/makeMessageDialog.js +2 -2
- package/dist/cjs/image/EditorImage.js +13 -15
- package/dist/cjs/image/export/editorImageToSVG.js +1 -1
- package/dist/cjs/inputEvents.js +3 -3
- package/dist/cjs/lib.d.ts +2 -2
- package/dist/cjs/localizations/de.js +2 -2
- package/dist/cjs/localizations/es.js +7 -3
- package/dist/cjs/rendering/Display.js +7 -3
- package/dist/cjs/rendering/RenderablePathSpec.js +26 -11
- package/dist/cjs/rendering/RenderingStyle.js +22 -15
- package/dist/cjs/rendering/TextRenderingStyle.js +1 -1
- package/dist/cjs/rendering/caching/CacheRecord.js +1 -1
- package/dist/cjs/rendering/caching/CacheRecordManager.js +1 -1
- package/dist/cjs/rendering/caching/RenderingCache.js +1 -1
- package/dist/cjs/rendering/caching/RenderingCacheNode.js +26 -15
- package/dist/cjs/rendering/caching/testUtils.js +2 -2
- package/dist/cjs/rendering/renderers/AbstractRenderer.js +3 -1
- package/dist/cjs/rendering/renderers/CanvasRenderer.js +4 -3
- package/dist/cjs/rendering/renderers/DummyRenderer.js +1 -1
- package/dist/cjs/rendering/renderers/SVGRenderer.js +37 -19
- package/dist/cjs/rendering/renderers/TextOnlyRenderer.js +13 -15
- package/dist/cjs/shortcuts/KeyBinding.js +6 -12
- package/dist/cjs/shortcuts/KeyboardShortcutManager.js +2 -2
- package/dist/cjs/testing/createEditor.js +6 -1
- package/dist/cjs/testing/findNodeWithText.d.ts +4 -1
- package/dist/cjs/testing/findNodeWithText.js +12 -3
- package/dist/cjs/testing/getUniquePointerId.js +1 -1
- package/dist/cjs/testing/sendHtmlSwipe.js +7 -3
- package/dist/cjs/testing/sendPenEvent.js +1 -3
- package/dist/cjs/testing/sendTouchEvent.js +1 -4
- package/dist/cjs/testing/startPinchGesture.js +3 -1
- package/dist/cjs/toolbar/AbstractToolbar.js +7 -11
- package/dist/cjs/toolbar/EdgeToolbar.js +11 -15
- package/dist/cjs/toolbar/IconProvider.js +5 -3
- package/dist/cjs/toolbar/localization.js +3 -3
- package/dist/cjs/toolbar/utils/HelpDisplay.js +8 -6
- package/dist/cjs/toolbar/utils/makeDraggable.js +4 -7
- package/dist/cjs/toolbar/widgets/BaseToolWidget.js +3 -2
- package/dist/cjs/toolbar/widgets/BaseWidget.js +7 -7
- package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +2 -2
- package/dist/cjs/toolbar/widgets/EraserToolWidget.js +5 -3
- package/dist/cjs/toolbar/widgets/HandToolWidget.js +8 -6
- package/dist/cjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.js +9 -10
- package/dist/cjs/toolbar/widgets/PenToolWidget.js +22 -13
- package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +2 -2
- package/dist/cjs/toolbar/widgets/TextToolWidget.js +5 -5
- package/dist/cjs/toolbar/widgets/components/makeFileInput.js +7 -7
- package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +5 -5
- package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +9 -5
- package/dist/cjs/toolbar/widgets/keybindings.js +2 -2
- package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.js +6 -6
- package/dist/cjs/tools/BaseTool.d.ts +61 -0
- package/dist/cjs/tools/BaseTool.js +181 -0
- package/dist/cjs/tools/Eraser.d.ts +60 -0
- package/dist/cjs/tools/Eraser.js +304 -0
- package/dist/cjs/tools/Eraser.test.d.ts +1 -0
- package/dist/cjs/tools/FindTool.d.ts +21 -0
- package/dist/cjs/tools/FindTool.js +137 -0
- package/dist/cjs/tools/FindTool.test.d.ts +1 -0
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.d.ts +17 -0
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.js +103 -0
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.test.d.ts +1 -0
- package/dist/cjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
- package/dist/cjs/tools/InputFilter/FunctionMapper.js +21 -0
- package/dist/cjs/tools/InputFilter/InputMapper.d.ts +23 -0
- package/dist/cjs/tools/InputFilter/InputMapper.js +38 -0
- package/dist/cjs/tools/InputFilter/InputPipeline.d.ts +15 -0
- package/dist/cjs/tools/InputFilter/InputPipeline.js +54 -0
- package/dist/cjs/tools/InputFilter/InputPipeline.test.d.ts +1 -0
- package/dist/cjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
- package/dist/cjs/tools/InputFilter/InputStabilizer.js +188 -0
- package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
- package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +87 -0
- package/dist/cjs/tools/PanZoom.d.ts +125 -0
- package/dist/cjs/tools/PanZoom.js +522 -0
- package/dist/cjs/tools/PanZoom.test.d.ts +1 -0
- package/dist/cjs/tools/PasteHandler.d.ts +23 -0
- package/dist/cjs/tools/PasteHandler.js +115 -0
- package/dist/cjs/tools/Pen.d.ts +54 -0
- package/dist/cjs/tools/Pen.js +343 -0
- package/dist/cjs/tools/Pen.test.d.ts +1 -0
- package/dist/cjs/tools/PipetteTool.d.ts +28 -0
- package/dist/cjs/tools/PipetteTool.js +69 -0
- package/dist/cjs/tools/ScrollbarTool.d.ts +18 -0
- package/dist/cjs/tools/ScrollbarTool.js +86 -0
- package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +9 -0
- package/dist/cjs/tools/SelectionTool/SelectAllShortcutHandler.js +32 -0
- package/dist/cjs/tools/SelectionTool/Selection.d.ts +72 -0
- package/dist/cjs/tools/SelectionTool/Selection.js +638 -0
- package/dist/cjs/tools/SelectionTool/SelectionHandle.d.ts +62 -0
- package/dist/cjs/tools/SelectionTool/SelectionHandle.js +144 -0
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.d.ts +32 -0
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +88 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +42 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.js +509 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +1 -0
- package/dist/cjs/tools/SelectionTool/SelectionTool.test.d.ts +1 -0
- package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +23 -0
- package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +83 -0
- package/dist/cjs/tools/SelectionTool/TransformMode.d.ts +42 -0
- package/dist/cjs/tools/SelectionTool/TransformMode.js +154 -0
- package/dist/cjs/tools/SelectionTool/keybindings.d.ts +15 -0
- package/dist/cjs/tools/SelectionTool/keybindings.js +38 -0
- package/dist/cjs/tools/SelectionTool/types.d.ts +35 -0
- package/dist/cjs/tools/SelectionTool/types.js +14 -0
- package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.d.ts +6 -0
- package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.js +71 -0
- package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.d.ts +5 -0
- package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.js +52 -0
- package/dist/cjs/tools/SoundUITool.d.ts +26 -0
- package/dist/cjs/tools/SoundUITool.js +173 -0
- package/dist/cjs/tools/TextTool.d.ts +36 -0
- package/dist/cjs/tools/TextTool.js +287 -0
- package/dist/cjs/tools/TextTool.test.d.ts +1 -0
- package/dist/cjs/tools/ToolController.d.ts +73 -0
- package/dist/cjs/tools/ToolController.js +310 -0
- package/dist/cjs/tools/ToolController.test.d.ts +1 -0
- package/dist/cjs/tools/ToolEnabledGroup.d.ts +6 -0
- package/dist/cjs/tools/ToolEnabledGroup.js +13 -0
- package/dist/cjs/tools/ToolSwitcherShortcut.d.ts +16 -0
- package/dist/cjs/tools/ToolSwitcherShortcut.js +40 -0
- package/dist/cjs/tools/ToolbarShortcutHandler.d.ts +12 -0
- package/dist/cjs/tools/ToolbarShortcutHandler.js +34 -0
- package/dist/cjs/tools/UndoRedoShortcut.d.ts +8 -0
- package/dist/cjs/tools/UndoRedoShortcut.js +27 -0
- package/dist/cjs/tools/UndoRedoShortcut.test.d.ts +1 -0
- package/dist/cjs/tools/keybindings.d.ts +16 -0
- package/dist/cjs/tools/keybindings.js +58 -0
- package/dist/cjs/tools/lib.d.ts +14 -0
- package/dist/cjs/tools/lib.js +36 -0
- package/dist/cjs/tools/localization.d.ts +45 -0
- package/dist/cjs/tools/localization.js +47 -0
- package/dist/cjs/tools/util/StationaryPenDetector.d.ts +25 -0
- package/dist/cjs/tools/util/StationaryPenDetector.js +107 -0
- package/dist/cjs/tools/util/createMenuOverlay.d.ts +10 -0
- package/dist/cjs/tools/util/createMenuOverlay.js +126 -0
- package/dist/cjs/tools/util/createMenuOverlay.test.d.ts +1 -0
- package/dist/cjs/util/ClipboardHandler.d.ts +1 -1
- package/dist/cjs/util/ClipboardHandler.js +19 -18
- package/dist/cjs/util/ReactiveValue.js +16 -12
- package/dist/cjs/util/adjustEditorThemeForContrast.js +6 -2
- package/dist/cjs/util/guessKeyCodeFromKey.js +1 -1
- package/dist/cjs/util/listenForKeyboardEventsFrom.js +8 -6
- package/dist/cjs/util/waitForAll.js +3 -3
- package/dist/cjs/util/waitForImageLoaded.js +3 -3
- package/dist/cjs/util/waitForTimeout.js +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/mjs/Editor.mjs +37 -23
- package/dist/mjs/EventDispatcher.mjs +1 -1
- package/dist/mjs/Pointer.mjs +3 -3
- package/dist/mjs/SVGLoader/SVGLoader.mjs +14 -7
- package/dist/mjs/UndoRedoHistory.mjs +1 -1
- package/dist/mjs/Viewport.mjs +4 -2
- package/dist/mjs/commands/Command.mjs +7 -5
- package/dist/mjs/commands/Duplicate.mjs +2 -2
- package/dist/mjs/commands/Erase.mjs +3 -4
- package/dist/mjs/commands/invertCommand.mjs +4 -4
- package/dist/mjs/commands/lib.d.ts +1 -1
- package/dist/mjs/commands/lib.mjs +1 -1
- package/dist/mjs/commands/uniteCommands.mjs +4 -4
- package/dist/mjs/components/AbstractComponent.d.ts +1 -1
- package/dist/mjs/components/AbstractComponent.mjs +3 -3
- package/dist/mjs/components/BackgroundComponent.mjs +10 -8
- package/dist/mjs/components/ImageComponent.mjs +12 -5
- package/dist/mjs/components/RestylableComponent.mjs +2 -2
- package/dist/mjs/components/SVGGlobalAttributesObject.mjs +1 -2
- package/dist/mjs/components/Stroke.mjs +40 -27
- package/dist/mjs/components/TextComponent.mjs +15 -12
- package/dist/mjs/components/UnknownSVGObject.mjs +2 -3
- package/dist/mjs/components/builders/ArrowBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/ArrowBuilder.mjs +9 -3
- package/dist/mjs/components/builders/CircleBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/CircleBuilder.mjs +11 -4
- package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/FreehandLineBuilder.mjs +10 -4
- package/dist/mjs/components/builders/LineBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/LineBuilder.mjs +8 -4
- package/dist/mjs/components/builders/PolylineBuilder.d.ts +4 -1
- package/dist/mjs/components/builders/PolylineBuilder.mjs +10 -6
- package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +17 -11
- package/dist/mjs/components/builders/RectangleBuilder.d.ts +12 -0
- package/dist/mjs/components/builders/RectangleBuilder.mjs +17 -3
- package/dist/mjs/components/builders/autocorrect/makeShapeFitAutocorrect.mjs +5 -8
- package/dist/mjs/components/builders/autocorrect/makeSnapToGridAutocorrect.mjs +1 -1
- package/dist/mjs/components/builders/lib.d.ts +7 -0
- package/dist/mjs/components/builders/lib.mjs +7 -0
- package/dist/mjs/components/lib.d.ts +1 -4
- package/dist/mjs/components/lib.mjs +2 -5
- package/dist/mjs/components/util/StrokeSmoother.mjs +5 -6
- package/dist/mjs/dialogs/makeAboutDialog.mjs +1 -1
- package/dist/mjs/dialogs/makeMessageDialog.mjs +2 -2
- package/dist/mjs/image/EditorImage.mjs +13 -15
- package/dist/mjs/image/export/editorImageToSVG.mjs +1 -1
- package/dist/mjs/inputEvents.mjs +3 -3
- package/dist/mjs/lib.d.ts +2 -2
- package/dist/mjs/lib.mjs +2 -2
- package/dist/mjs/localization.mjs +2 -2
- package/dist/mjs/localizations/de.mjs +2 -2
- package/dist/mjs/localizations/es.mjs +7 -3
- package/dist/mjs/rendering/Display.mjs +7 -3
- package/dist/mjs/rendering/RenderablePathSpec.mjs +26 -11
- package/dist/mjs/rendering/RenderingStyle.mjs +22 -15
- package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -1
- package/dist/mjs/rendering/caching/CacheRecord.mjs +1 -1
- package/dist/mjs/rendering/caching/CacheRecordManager.mjs +1 -1
- package/dist/mjs/rendering/caching/RenderingCache.mjs +1 -1
- package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +26 -15
- package/dist/mjs/rendering/caching/testUtils.mjs +2 -2
- package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +3 -1
- package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +4 -3
- package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
- package/dist/mjs/rendering/renderers/SVGRenderer.mjs +38 -20
- package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +13 -15
- package/dist/mjs/shortcuts/KeyBinding.mjs +6 -12
- package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +2 -2
- package/dist/mjs/testing/createEditor.mjs +6 -1
- package/dist/mjs/testing/findNodeWithText.d.ts +4 -1
- package/dist/mjs/testing/findNodeWithText.mjs +12 -3
- package/dist/mjs/testing/getUniquePointerId.mjs +1 -1
- package/dist/mjs/testing/sendHtmlSwipe.mjs +7 -3
- package/dist/mjs/testing/sendPenEvent.mjs +1 -3
- package/dist/mjs/testing/sendTouchEvent.mjs +1 -4
- package/dist/mjs/testing/startPinchGesture.mjs +3 -1
- package/dist/mjs/toolbar/AbstractToolbar.mjs +7 -11
- package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
- package/dist/mjs/toolbar/IconProvider.mjs +5 -3
- package/dist/mjs/toolbar/localization.mjs +3 -3
- package/dist/mjs/toolbar/utils/HelpDisplay.mjs +8 -6
- package/dist/mjs/toolbar/utils/makeDraggable.mjs +4 -7
- package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +3 -2
- package/dist/mjs/toolbar/widgets/BaseWidget.mjs +8 -8
- package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +2 -2
- package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +5 -3
- package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +8 -6
- package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +9 -10
- package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +23 -14
- package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +2 -2
- package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +5 -5
- package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +7 -7
- package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +5 -5
- package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +9 -5
- package/dist/mjs/toolbar/widgets/keybindings.mjs +2 -2
- package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +6 -6
- package/dist/mjs/tools/BaseTool.d.ts +61 -0
- package/dist/mjs/tools/BaseTool.mjs +179 -0
- package/dist/mjs/tools/Eraser.d.ts +60 -0
- package/dist/mjs/tools/Eraser.mjs +297 -0
- package/dist/mjs/tools/Eraser.test.d.ts +1 -0
- package/dist/mjs/tools/FindTool.d.ts +21 -0
- package/dist/mjs/tools/FindTool.mjs +131 -0
- package/dist/mjs/tools/FindTool.test.d.ts +1 -0
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.d.ts +17 -0
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.mjs +74 -0
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.test.d.ts +1 -0
- package/dist/mjs/tools/InputFilter/FunctionMapper.d.ts +12 -0
- package/dist/mjs/tools/InputFilter/FunctionMapper.mjs +15 -0
- package/dist/mjs/tools/InputFilter/InputMapper.d.ts +23 -0
- package/dist/mjs/tools/InputFilter/InputMapper.mjs +36 -0
- package/dist/mjs/tools/InputFilter/InputPipeline.d.ts +15 -0
- package/dist/mjs/tools/InputFilter/InputPipeline.mjs +49 -0
- package/dist/mjs/tools/InputFilter/InputPipeline.test.d.ts +1 -0
- package/dist/mjs/tools/InputFilter/InputStabilizer.d.ts +29 -0
- package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +182 -0
- package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.d.ts +21 -0
- package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +81 -0
- package/dist/mjs/tools/PanZoom.d.ts +125 -0
- package/dist/mjs/tools/PanZoom.mjs +515 -0
- package/dist/mjs/tools/PanZoom.test.d.ts +1 -0
- package/dist/mjs/tools/PasteHandler.d.ts +23 -0
- package/dist/mjs/tools/PasteHandler.mjs +109 -0
- package/dist/mjs/tools/Pen.d.ts +54 -0
- package/dist/mjs/tools/Pen.mjs +314 -0
- package/dist/mjs/tools/Pen.test.d.ts +1 -0
- package/dist/mjs/tools/PipetteTool.d.ts +28 -0
- package/dist/mjs/tools/PipetteTool.mjs +63 -0
- package/dist/mjs/tools/ScrollbarTool.d.ts +18 -0
- package/dist/mjs/tools/ScrollbarTool.mjs +80 -0
- package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.d.ts +9 -0
- package/dist/mjs/tools/SelectionTool/SelectAllShortcutHandler.mjs +26 -0
- package/dist/mjs/tools/SelectionTool/Selection.d.ts +72 -0
- package/dist/mjs/tools/SelectionTool/Selection.mjs +610 -0
- package/dist/mjs/tools/SelectionTool/SelectionHandle.d.ts +62 -0
- package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +140 -0
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.d.ts +32 -0
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +85 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +42 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +502 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.selecting.test.d.ts +1 -0
- package/dist/mjs/tools/SelectionTool/SelectionTool.test.d.ts +1 -0
- package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.d.ts +23 -0
- package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +77 -0
- package/dist/mjs/tools/SelectionTool/TransformMode.d.ts +42 -0
- package/dist/mjs/tools/SelectionTool/TransformMode.mjs +145 -0
- package/dist/mjs/tools/SelectionTool/keybindings.d.ts +15 -0
- package/dist/mjs/tools/SelectionTool/keybindings.mjs +32 -0
- package/dist/mjs/tools/SelectionTool/types.d.ts +35 -0
- package/dist/mjs/tools/SelectionTool/types.mjs +11 -0
- package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.d.ts +6 -0
- package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.mjs +66 -0
- package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.d.ts +5 -0
- package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.mjs +47 -0
- package/dist/mjs/tools/SoundUITool.d.ts +26 -0
- package/dist/mjs/tools/SoundUITool.mjs +167 -0
- package/dist/mjs/tools/TextTool.d.ts +36 -0
- package/dist/mjs/tools/TextTool.mjs +281 -0
- package/dist/mjs/tools/TextTool.test.d.ts +1 -0
- package/dist/mjs/tools/ToolController.d.ts +73 -0
- package/dist/mjs/tools/ToolController.mjs +281 -0
- package/dist/mjs/tools/ToolController.test.d.ts +1 -0
- package/dist/mjs/tools/ToolEnabledGroup.d.ts +6 -0
- package/dist/mjs/tools/ToolEnabledGroup.mjs +10 -0
- package/dist/mjs/tools/ToolSwitcherShortcut.d.ts +16 -0
- package/dist/mjs/tools/ToolSwitcherShortcut.mjs +34 -0
- package/dist/mjs/tools/ToolbarShortcutHandler.d.ts +12 -0
- package/dist/mjs/tools/ToolbarShortcutHandler.mjs +28 -0
- package/dist/mjs/tools/UndoRedoShortcut.d.ts +8 -0
- package/dist/mjs/tools/UndoRedoShortcut.mjs +21 -0
- package/dist/mjs/tools/UndoRedoShortcut.test.d.ts +1 -0
- package/dist/mjs/tools/keybindings.d.ts +16 -0
- package/dist/mjs/tools/keybindings.mjs +38 -0
- package/dist/mjs/tools/lib.d.ts +14 -0
- package/dist/mjs/tools/lib.mjs +14 -0
- package/dist/mjs/tools/localization.d.ts +45 -0
- package/dist/mjs/tools/localization.mjs +44 -0
- package/dist/mjs/tools/util/StationaryPenDetector.d.ts +25 -0
- package/dist/mjs/tools/util/StationaryPenDetector.mjs +103 -0
- package/dist/mjs/tools/util/createMenuOverlay.d.ts +10 -0
- package/dist/mjs/tools/util/createMenuOverlay.mjs +121 -0
- package/dist/mjs/tools/util/createMenuOverlay.test.d.ts +1 -0
- package/dist/mjs/util/ClipboardHandler.d.ts +1 -1
- package/dist/mjs/util/ClipboardHandler.mjs +19 -18
- package/dist/mjs/util/ReactiveValue.mjs +16 -12
- package/dist/mjs/util/adjustEditorThemeForContrast.mjs +6 -2
- package/dist/mjs/util/guessKeyCodeFromKey.mjs +1 -1
- package/dist/mjs/util/listenForKeyboardEventsFrom.mjs +8 -6
- package/dist/mjs/util/waitForAll.mjs +3 -3
- package/dist/mjs/util/waitForImageLoaded.mjs +3 -3
- package/dist/mjs/util/waitForTimeout.mjs +1 -1
- package/dist/mjs/version.mjs +1 -1
- package/package.json +88 -88
- package/src/Coloris.css +6 -6
- package/src/Editor.scss +7 -5
- package/src/dialogs/dialogs.scss +3 -4
- package/src/dialogs/makeAboutDialog.scss +2 -2
- package/src/dialogs/makeMessageDialog.scss +11 -7
- package/src/styles.js +1 -1
- package/src/toolbar/AbstractToolbar.scss +20 -12
- package/src/toolbar/DropdownToolbar.scss +5 -4
- package/src/toolbar/EdgeToolbar.scss +65 -31
- package/src/toolbar/toolbar.scss +5 -5
- package/src/toolbar/utils/HelpDisplay.scss +48 -25
- package/src/toolbar/utils/labelVisibleOnHover.scss +39 -16
- package/src/toolbar/widgets/DocumentPropertiesWidget.scss +0 -1
- package/src/toolbar/widgets/HandToolWidget.scss +0 -1
- package/src/toolbar/widgets/InsertImageWidget/InsertImageWidget.scss +2 -3
- package/src/toolbar/widgets/OverflowWidget.css +1 -2
- package/src/toolbar/widgets/PenToolWidget.scss +0 -2
- package/src/toolbar/widgets/SelectionToolWidget.scss +1 -2
- package/src/toolbar/widgets/components/components.scss +6 -6
- package/src/toolbar/widgets/components/makeColorInput.scss +0 -2
- package/src/toolbar/widgets/components/makeFileInput.scss +5 -7
- package/src/toolbar/widgets/components/makeGridSelector.scss +6 -9
- package/src/toolbar/widgets/components/makeSnappedList.scss +3 -4
- package/src/toolbar/widgets/components/makeThicknessSlider.scss +1 -2
- package/src/toolbar/widgets/widgets.scss +7 -7
- package/src/tools/FindTool.css +6 -0
- package/src/tools/ScrollbarTool.scss +61 -0
- package/src/tools/SelectionTool/SelectionTool.scss +173 -0
- package/src/tools/SelectionTool/util/makeClipboardErrorHandlers.scss +14 -0
- package/src/tools/SoundUITool.scss +22 -0
- package/src/tools/tools.scss +5 -0
- package/src/tools/util/createMenuOverlay.scss +73 -0
- package/tsconfig.json +1 -3
- package/typedoc.json +1 -1
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
/** Returns the smallest ID not used by the pointers in the given list. */
|
4
4
|
const getUniquePointerId = (pointers) => {
|
5
5
|
let ptrId = 0;
|
6
|
-
const pointerIds = pointers.map(ptr => ptr.id);
|
6
|
+
const pointerIds = pointers.map((ptr) => ptr.id);
|
7
7
|
pointerIds.sort();
|
8
8
|
for (const pointerId of pointerIds) {
|
9
9
|
if (ptrId === pointerId) {
|
@@ -2,13 +2,17 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
/** Swipes `element` using HTML pointer events. */
|
4
4
|
const sendHtmlSwipe = async (element, start, end, timeMs = 300) => {
|
5
|
-
element.dispatchEvent(new PointerEvent('pointerdown', { isPrimary: true, clientX: start.x, clientY: start.y
|
5
|
+
element.dispatchEvent(new PointerEvent('pointerdown', { isPrimary: true, clientX: start.x, clientY: start.y }));
|
6
6
|
const step = 0.1;
|
7
7
|
for (let i = 0; i < 1; i += step) {
|
8
8
|
await jest.advanceTimersByTimeAsync(timeMs * step);
|
9
9
|
const currentPoint = start.lerp(end, i);
|
10
|
-
element.dispatchEvent(new PointerEvent('pointermove', {
|
10
|
+
element.dispatchEvent(new PointerEvent('pointermove', {
|
11
|
+
isPrimary: true,
|
12
|
+
clientX: currentPoint.x,
|
13
|
+
clientY: currentPoint.y,
|
14
|
+
}));
|
11
15
|
}
|
12
|
-
element.dispatchEvent(new PointerEvent('pointerup', { isPrimary: true, clientX: end.x, clientY: end.y
|
16
|
+
element.dispatchEvent(new PointerEvent('pointerup', { isPrimary: true, clientX: end.x, clientY: end.y }));
|
13
17
|
};
|
14
18
|
exports.default = sendHtmlSwipe;
|
@@ -40,9 +40,7 @@ const sendPenEvent = (editor, eventType, point, allPointers, deviceType = Pointe
|
|
40
40
|
const mainPointer = Pointer_1.default.ofCanvasPoint(point, eventType !== inputEvents_1.InputEvtType.PointerUpEvt, editor.viewport, id, deviceType);
|
41
41
|
editor.toolController.dispatchInputEvent({
|
42
42
|
kind: eventType,
|
43
|
-
allPointers: allPointers ?? [
|
44
|
-
mainPointer,
|
45
|
-
],
|
43
|
+
allPointers: allPointers ?? [mainPointer],
|
46
44
|
current: mainPointer,
|
47
45
|
});
|
48
46
|
return mainPointer;
|
@@ -73,10 +73,7 @@ const sendTouchEvent = (editor, eventType, screenPos, allOtherPointers) => {
|
|
73
73
|
const mainPointer = Pointer_1.default.ofCanvasPoint(canvasPos, eventType !== inputEvents_1.InputEvtType.PointerUpEvt, editor.viewport, ptrId, Pointer_1.PointerDevice.Touch);
|
74
74
|
editor.toolController.dispatchInputEvent({
|
75
75
|
kind: eventType,
|
76
|
-
allPointers: [
|
77
|
-
...(allOtherPointers ?? []),
|
78
|
-
mainPointer,
|
79
|
-
],
|
76
|
+
allPointers: [...(allOtherPointers ?? []), mainPointer],
|
80
77
|
current: mainPointer,
|
81
78
|
});
|
82
79
|
return mainPointer;
|
@@ -22,7 +22,9 @@ const startPinchGesture = (editor, center, initialDistance, initialRotation) =>
|
|
22
22
|
};
|
23
23
|
let [touchPoint1, touchPoint2] = computeTouchPoints(center, initialDistance, initialRotation);
|
24
24
|
let firstPointer = (0, sendTouchEvent_1.default)(editor, inputEvents_1.InputEvtType.PointerDownEvt, touchPoint1);
|
25
|
-
let secondPointer = (0, sendTouchEvent_1.default)(editor, inputEvents_1.InputEvtType.PointerDownEvt, touchPoint2, [
|
25
|
+
let secondPointer = (0, sendTouchEvent_1.default)(editor, inputEvents_1.InputEvtType.PointerDownEvt, touchPoint2, [
|
26
|
+
firstPointer,
|
27
|
+
]);
|
26
28
|
return {
|
27
29
|
update(center, distance, rotation) {
|
28
30
|
const eventType = inputEvents_1.InputEvtType.PointerMoveEvt;
|
@@ -138,7 +138,7 @@ class AbstractToolbar {
|
|
138
138
|
initColoris();
|
139
139
|
}
|
140
140
|
};
|
141
|
-
__classPrivateFieldGet(this, _AbstractToolbar_listeners, "f").push(this.editor.notifier.on(types_1.EditorEventType.ColorPickerToggled, event => {
|
141
|
+
__classPrivateFieldGet(this, _AbstractToolbar_listeners, "f").push(this.editor.notifier.on(types_1.EditorEventType.ColorPickerToggled, (event) => {
|
142
142
|
if (event.kind !== types_1.EditorEventType.ColorPickerToggled) {
|
143
143
|
return;
|
144
144
|
}
|
@@ -149,7 +149,7 @@ class AbstractToolbar {
|
|
149
149
|
}
|
150
150
|
}));
|
151
151
|
// Add newly-selected colors to the swatch.
|
152
|
-
__classPrivateFieldGet(this, _AbstractToolbar_listeners, "f").push(this.editor.notifier.on(types_1.EditorEventType.ColorPickerColorSelected, event => {
|
152
|
+
__classPrivateFieldGet(this, _AbstractToolbar_listeners, "f").push(this.editor.notifier.on(types_1.EditorEventType.ColorPickerColorSelected, (event) => {
|
153
153
|
if (event.kind === types_1.EditorEventType.ColorPickerColorSelected) {
|
154
154
|
addColorToSwatch(event.color.toHexString());
|
155
155
|
}
|
@@ -193,7 +193,7 @@ class AbstractToolbar {
|
|
193
193
|
const id = widget.getUniqueIdIn(__classPrivateFieldGet(this, _AbstractToolbar_widgetsById, "f"));
|
194
194
|
this.removeWidgetInternal(widget);
|
195
195
|
delete __classPrivateFieldGet(this, _AbstractToolbar_widgetsById, "f")[id];
|
196
|
-
__classPrivateFieldSet(this, _AbstractToolbar_widgetList, __classPrivateFieldGet(this, _AbstractToolbar_widgetList, "f").filter(otherWidget => otherWidget !== widget), "f");
|
196
|
+
__classPrivateFieldSet(this, _AbstractToolbar_widgetList, __classPrivateFieldGet(this, _AbstractToolbar_widgetList, "f").filter((otherWidget) => otherWidget !== widget), "f");
|
197
197
|
}
|
198
198
|
/** Returns a snapshot of the state of widgets in the toolbar. */
|
199
199
|
serializeState() {
|
@@ -336,19 +336,15 @@ class AbstractToolbar {
|
|
336
336
|
*/
|
337
337
|
addUndoRedoButtons(undoFirst = true) {
|
338
338
|
const makeUndo = () => {
|
339
|
-
return this.addTaggedActionButton([
|
340
|
-
BaseWidget_1.ToolbarWidgetTag.Undo,
|
341
|
-
], {
|
339
|
+
return this.addTaggedActionButton([BaseWidget_1.ToolbarWidgetTag.Undo], {
|
342
340
|
label: this.localizationTable.undo,
|
343
|
-
icon: this.editor.icons.makeUndoIcon()
|
341
|
+
icon: this.editor.icons.makeUndoIcon(),
|
344
342
|
}, () => {
|
345
343
|
this.editor.history.undo();
|
346
344
|
});
|
347
345
|
};
|
348
346
|
const makeRedo = () => {
|
349
|
-
return this.addTaggedActionButton([
|
350
|
-
BaseWidget_1.ToolbarWidgetTag.Redo,
|
351
|
-
], {
|
347
|
+
return this.addTaggedActionButton([BaseWidget_1.ToolbarWidgetTag.Redo], {
|
352
348
|
label: this.localizationTable.redo,
|
353
349
|
icon: this.editor.icons.makeRedoIcon(),
|
354
350
|
}, () => {
|
@@ -367,7 +363,7 @@ class AbstractToolbar {
|
|
367
363
|
}
|
368
364
|
undoButton.setDisabled(true);
|
369
365
|
redoButton.setDisabled(true);
|
370
|
-
this.editor.notifier.on(types_1.EditorEventType.UndoRedoStackUpdated, event => {
|
366
|
+
this.editor.notifier.on(types_1.EditorEventType.UndoRedoStackUpdated, (event) => {
|
371
367
|
if (event.kind !== types_1.EditorEventType.UndoRedoStackUpdated) {
|
372
368
|
throw new Error('Wrong event type!');
|
373
369
|
}
|
@@ -79,7 +79,7 @@ class EdgeToolbar extends AbstractToolbar_1.default {
|
|
79
79
|
this.sidebarContainer.classList.add(`${constants_1.toolbarCSSPrefix}tool-properties`);
|
80
80
|
this.sidebarContent = document.createElement('div');
|
81
81
|
// Setup resizing/dragging
|
82
|
-
this.sidebarY.onUpdateAndNow(y => {
|
82
|
+
this.sidebarY.onUpdateAndNow((y) => {
|
83
83
|
const belowEdgeClassName = 'dropdown-below-edge';
|
84
84
|
if (y > 0) {
|
85
85
|
this.sidebarContainer.style.transform = `translate(0, ${y}px)`;
|
@@ -96,12 +96,12 @@ class EdgeToolbar extends AbstractToolbar_1.default {
|
|
96
96
|
this.closeButton.classList.add('drag-elem');
|
97
97
|
// The close button has default focus -- forward its events to the main editor so that keyboard
|
98
98
|
// shortcuts still work.
|
99
|
-
this.editor.handleKeyEventsFrom(this.closeButton, event => {
|
99
|
+
this.editor.handleKeyEventsFrom(this.closeButton, (event) => {
|
100
100
|
// Don't send
|
101
101
|
return event.code !== 'Space' && event.code !== 'Enter' && event.code !== 'Tab';
|
102
102
|
});
|
103
103
|
// Close the sidebar when pressing escape
|
104
|
-
this.sidebarContainer.addEventListener('keyup', event => {
|
104
|
+
this.sidebarContainer.addEventListener('keyup', (event) => {
|
105
105
|
if (!event.defaultPrevented && event.code === 'Escape') {
|
106
106
|
this.sidebarVisible.set(false);
|
107
107
|
event.preventDefault();
|
@@ -115,7 +115,7 @@ class EdgeToolbar extends AbstractToolbar_1.default {
|
|
115
115
|
};
|
116
116
|
this.sidebarTitle = ReactiveValue_1.MutableReactiveValue.fromInitialValue('');
|
117
117
|
this.layoutManager = new EdgeToolbarLayoutManager_1.default(setSidebarContent, this.sidebarTitle, this.sidebarVisible, editor.announceForAccessibility.bind(editor), localizationTable);
|
118
|
-
this.sidebarTitle.onUpdateAndNow(title => {
|
118
|
+
this.sidebarTitle.onUpdateAndNow((title) => {
|
119
119
|
this.closeButton.setAttribute('aria-label', localizationTable.closeSidebar(title));
|
120
120
|
});
|
121
121
|
// Make things visible/keep hidden.
|
@@ -134,7 +134,7 @@ class EdgeToolbar extends AbstractToolbar_1.default {
|
|
134
134
|
this.menuContainer.style.opacity = '0';
|
135
135
|
}
|
136
136
|
const prefersReduceMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)') ?? '';
|
137
|
-
this.sidebarVisible.onUpdate(visible => {
|
137
|
+
this.sidebarVisible.onUpdate((visible) => {
|
138
138
|
const animationProperties = `${animationDuration}ms ease`;
|
139
139
|
// We need to use different animations when reducing motion.
|
140
140
|
const reduceMotion = prefersReduceMotion.matches ? '-reduce-motion' : '';
|
@@ -145,23 +145,19 @@ class EdgeToolbar extends AbstractToolbar_1.default {
|
|
145
145
|
animationTimeout = null;
|
146
146
|
}
|
147
147
|
this.menuContainer.style.display = '';
|
148
|
-
this.sidebarContainer.style.animation =
|
149
|
-
|
150
|
-
this.menuContainer.style.animation =
|
151
|
-
`${animationProperties} ${constants_1.toolbarCSSPrefix}-edgemenu-container-transition-in${reduceMotion}`;
|
148
|
+
this.sidebarContainer.style.animation = `${animationProperties} ${constants_1.toolbarCSSPrefix}-edgemenu-transition-in${reduceMotion}`;
|
149
|
+
this.menuContainer.style.animation = `${animationProperties} ${constants_1.toolbarCSSPrefix}-edgemenu-container-transition-in${reduceMotion}`;
|
152
150
|
this.menuContainer.style.opacity = '1';
|
153
151
|
// Focus the close button when first shown, but prevent scroll because the button
|
154
152
|
// is likely at the bottom of the screen (and we want the full sidebar to remain
|
155
153
|
// visible).
|
156
|
-
this.closeButton.focus({ preventScroll: true
|
154
|
+
this.closeButton.focus({ preventScroll: true });
|
157
155
|
}
|
158
156
|
else {
|
159
157
|
this.closeColorPickers();
|
160
158
|
if (animationTimeout === null) {
|
161
|
-
this.sidebarContainer.style.animation =
|
162
|
-
|
163
|
-
this.menuContainer.style.animation =
|
164
|
-
`${animationProperties} ${constants_1.toolbarCSSPrefix}-edgemenu-container-transition-out${reduceMotion}`;
|
159
|
+
this.sidebarContainer.style.animation = `${animationProperties} ${constants_1.toolbarCSSPrefix}-edgemenu-transition-out${reduceMotion}`;
|
160
|
+
this.menuContainer.style.animation = `${animationProperties} ${constants_1.toolbarCSSPrefix}-edgemenu-container-transition-out${reduceMotion}`;
|
165
161
|
// Manually set the container's opacity to prevent flickering when closing
|
166
162
|
// the toolbar.
|
167
163
|
this.menuContainer.style.opacity = '0';
|
@@ -204,7 +200,7 @@ class EdgeToolbar extends AbstractToolbar_1.default {
|
|
204
200
|
break;
|
205
201
|
}
|
206
202
|
}
|
207
|
-
const perButtonPadding = Math.round(extraPadding / numVisibleButtons * 10) / 10;
|
203
|
+
const perButtonPadding = Math.round((extraPadding / numVisibleButtons) * 10) / 10;
|
208
204
|
this.toolbarToolRow.style.setProperty('--extra-left-right-padding', `${perButtonPadding}px`);
|
209
205
|
};
|
210
206
|
const actionRowBBox = this.toolbarActionRow.getBoundingClientRect();
|
@@ -571,7 +571,7 @@ class IconProvider {
|
|
571
571
|
icon.appendChild(defs);
|
572
572
|
const background = document.createElementNS(svgNamespace, 'g');
|
573
573
|
icon.appendChild(background);
|
574
|
-
renderer = new class extends SVGRenderer_1.default {
|
574
|
+
renderer = new (class extends SVGRenderer_1.default {
|
575
575
|
constructor() {
|
576
576
|
super(icon, viewport);
|
577
577
|
}
|
@@ -593,7 +593,7 @@ class IconProvider {
|
|
593
593
|
}
|
594
594
|
return addedPath;
|
595
595
|
}
|
596
|
-
}();
|
596
|
+
})();
|
597
597
|
}
|
598
598
|
else {
|
599
599
|
renderer = new SVGRenderer_1.default(icon, viewport);
|
@@ -860,7 +860,9 @@ class IconProvider {
|
|
860
860
|
return penStyle.factory === PolylineBuilder_1.makePolylineBuilder;
|
861
861
|
}
|
862
862
|
/** Must be overridden by icon packs that need attribution. */
|
863
|
-
licenseInfo() {
|
863
|
+
licenseInfo() {
|
864
|
+
return null;
|
865
|
+
}
|
864
866
|
}
|
865
867
|
_IconProvider_instances = new WeakSet(), _IconProvider_makeXIcon = function _IconProvider_makeXIcon() {
|
866
868
|
const strokeWidth = '6px';
|
@@ -65,7 +65,7 @@ exports.defaultToolbarLocalization = {
|
|
65
65
|
fileInput__andNMoreFiles: (n) => `(...${n} more)`,
|
66
66
|
// Help text
|
67
67
|
penDropdown__baseHelpText: 'This tool draws shapes or freehand lines.',
|
68
|
-
penDropdown__colorHelpText:
|
68
|
+
penDropdown__colorHelpText: "Changes the pen's color",
|
69
69
|
penDropdown__thicknessHelpText: 'Changes the thickness of strokes drawn by the pen.',
|
70
70
|
penDropdown__penTypeHelpText: 'Changes the pen style.\n\nEither a “pen” style or “shape” can be chosen. Choosing a “pen” style draws freehand lines. Choosing a “shape” draws shapes.',
|
71
71
|
penDropdown__autocorrectHelpText: 'Converts approximate freehand lines and rectangles to perfect ones.\n\nThe pen must be held stationary at the end of a stroke to trigger a correction.',
|
@@ -81,11 +81,11 @@ exports.defaultToolbarLocalization = {
|
|
81
81
|
eraserDropdown__thicknessHelpText: 'Changes the size of the eraser.',
|
82
82
|
eraserDropdown__fullStrokeEraserHelpText: 'When in full-stroke mode, entire shapes are erased.\n\nWhen not in full-stroke mode, shapes can be partially erased.',
|
83
83
|
selectionDropdown__baseHelpText: 'Selects content and manipulates the selection',
|
84
|
-
selectionDropdown__resizeToHelpText:
|
84
|
+
selectionDropdown__resizeToHelpText: "Crops the drawing to the size of what's currently selected.\n\nIf auto-resize is enabled, it will be disabled.",
|
85
85
|
selectionDropdown__deleteHelpText: 'Erases selected items.',
|
86
86
|
selectionDropdown__duplicateHelpText: 'Makes a copy of selected items.',
|
87
87
|
selectionDropdown__changeColorHelpText: 'Changes the color of selected items.',
|
88
|
-
pageDropdown__baseHelpText:
|
88
|
+
pageDropdown__baseHelpText: "Controls the drawing canvas' background color, pattern, and size.",
|
89
89
|
pageDropdown__backgroundColorHelpText: 'Changes the background color of the drawing canvas.',
|
90
90
|
pageDropdown__gridCheckboxHelpText: 'Enables/disables a background grid pattern.',
|
91
91
|
pageDropdown__autoresizeCheckboxHelpText: 'When checked, the page grows to fit the drawing.\n\nWhen unchecked, the page is visible and its size can be set manually.',
|
@@ -46,7 +46,7 @@ const createHelpPage = (helpItems, onItemClick, onBackgroundClick, context) => {
|
|
46
46
|
let clonedElementContainers = [];
|
47
47
|
// Clicking on the background of the help area should send an event (e.g. to allow the
|
48
48
|
// help container to be closed).
|
49
|
-
container.addEventListener('click', event => {
|
49
|
+
container.addEventListener('click', (event) => {
|
50
50
|
// If clicking directly on the container (and not on a child)
|
51
51
|
if (event.target === container) {
|
52
52
|
onBackgroundClick();
|
@@ -58,7 +58,7 @@ const createHelpPage = (helpItems, onItemClick, onBackgroundClick, context) => {
|
|
58
58
|
if (!currentItem) {
|
59
59
|
return math_1.Rect2.empty;
|
60
60
|
}
|
61
|
-
const itemBoundingBoxes = currentItem.targetElements.map(element => math_1.Rect2.of(element.getBoundingClientRect()));
|
61
|
+
const itemBoundingBoxes = currentItem.targetElements.map((element) => math_1.Rect2.of(element.getBoundingClientRect()));
|
62
62
|
return math_1.Rect2.union(...itemBoundingBoxes);
|
63
63
|
};
|
64
64
|
// Updates each cloned element's click listener and CSS classes based on whether
|
@@ -223,7 +223,9 @@ class HelpDisplay {
|
|
223
223
|
const label = this.context.localization.close;
|
224
224
|
closeButton.setAttribute('aria-label', label);
|
225
225
|
closeButton.setAttribute('title', label);
|
226
|
-
closeButton.onclick = () => {
|
226
|
+
closeButton.onclick = () => {
|
227
|
+
closeOverlay();
|
228
|
+
};
|
227
229
|
return closeButton;
|
228
230
|
};
|
229
231
|
// Wraps the label and clickable help elements
|
@@ -231,7 +233,7 @@ class HelpDisplay {
|
|
231
233
|
const currentPage = ReactiveValue_1.MutableReactiveValue.fromInitialValue(0);
|
232
234
|
const content = document.createElement('div');
|
233
235
|
content.classList.add('navigation-content');
|
234
|
-
const helpPage = createHelpPage(__classPrivateFieldGet(this, _HelpDisplay_helpData, "f"), newPageIndex => currentPage.set(newPageIndex), onBackgroundClick, this.context);
|
236
|
+
const helpPage = createHelpPage(__classPrivateFieldGet(this, _HelpDisplay_helpData, "f"), (newPageIndex) => currentPage.set(newPageIndex), onBackgroundClick, this.context);
|
235
237
|
helpPage.addToParent(content);
|
236
238
|
const showPage = (pageIndex) => {
|
237
239
|
if (pageIndex >= __classPrivateFieldGet(this, _HelpDisplay_helpData, "f").length || pageIndex < 0) {
|
@@ -380,12 +382,12 @@ class HelpDisplay {
|
|
380
382
|
// Close the overlay when clicking on the background (*directly* on any of the
|
381
383
|
// elements in closeOverlayTriggers).
|
382
384
|
const closeOverlayTriggers = [navigation.content, navigationButtons, overlay];
|
383
|
-
overlay.onclick = event => {
|
385
|
+
overlay.onclick = (event) => {
|
384
386
|
if (closeOverlayTriggers.includes(event.target)) {
|
385
387
|
onBackgroundClick();
|
386
388
|
}
|
387
389
|
};
|
388
|
-
overlay.onkeyup = event => {
|
390
|
+
overlay.onkeyup = (event) => {
|
389
391
|
if (event.code === 'Escape') {
|
390
392
|
closeOverlay();
|
391
393
|
event.preventDefault();
|
@@ -2,10 +2,7 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const math_1 = require("@js-draw/math");
|
4
4
|
const makeDraggable = (dragElement, options) => {
|
5
|
-
const dragElements = [
|
6
|
-
...options.draggableChildElements,
|
7
|
-
dragElement,
|
8
|
-
];
|
5
|
+
const dragElements = [...options.draggableChildElements, dragElement];
|
9
6
|
let lastX = 0;
|
10
7
|
let lastY = 0;
|
11
8
|
let startX = 0;
|
@@ -51,7 +48,7 @@ const makeDraggable = (dragElement, options) => {
|
|
51
48
|
return Math.hypot(lastX - startX, lastY - startY) < clickThreshold;
|
52
49
|
};
|
53
50
|
let startedDragging = false;
|
54
|
-
addEventListener('pointerdown', event => {
|
51
|
+
addEventListener('pointerdown', (event) => {
|
55
52
|
if (event.defaultPrevented || !isDraggableElement(event.target)) {
|
56
53
|
return;
|
57
54
|
}
|
@@ -82,7 +79,7 @@ const makeDraggable = (dragElement, options) => {
|
|
82
79
|
pointerDown = false;
|
83
80
|
startedDragging = false;
|
84
81
|
};
|
85
|
-
addEventListener('pointermove', event => {
|
82
|
+
addEventListener('pointermove', (event) => {
|
86
83
|
if (!event.isPrimary || !pointerDown) {
|
87
84
|
return undefined;
|
88
85
|
}
|
@@ -110,7 +107,7 @@ const makeDraggable = (dragElement, options) => {
|
|
110
107
|
startedDragging = true;
|
111
108
|
}
|
112
109
|
});
|
113
|
-
addEventListener('pointerleave', event => {
|
110
|
+
addEventListener('pointerleave', (event) => {
|
114
111
|
// Capture the pointer if it exits the container while dragging.
|
115
112
|
if (capturedPointerId === null && pointerDown && event.isPrimary) {
|
116
113
|
dragElement.setPointerCapture(event.pointerId);
|
@@ -7,13 +7,14 @@ const BaseWidget_1 = __importDefault(require("./BaseWidget"));
|
|
7
7
|
const constants_1 = require("../constants");
|
8
8
|
const isToolWidgetFocused = () => {
|
9
9
|
const currentFocus = [...document.querySelectorAll('*:focus')];
|
10
|
-
return currentFocus.length &&
|
10
|
+
return (currentFocus.length &&
|
11
|
+
currentFocus.some((elem) => elem.classList.contains(`${constants_1.toolbarCSSPrefix}button`)));
|
11
12
|
};
|
12
13
|
class BaseToolWidget extends BaseWidget_1.default {
|
13
14
|
constructor(editor, targetTool, id, localizationTable) {
|
14
15
|
super(editor, id, localizationTable);
|
15
16
|
this.targetTool = targetTool;
|
16
|
-
this.targetTool.enabledValue().onUpdateAndNow(enabled => {
|
17
|
+
this.targetTool.enabledValue().onUpdateAndNow((enabled) => {
|
17
18
|
if (enabled) {
|
18
19
|
this.setSelected(true);
|
19
20
|
// Transfer focus to the current button, only if another toolbar button is
|
@@ -73,7 +73,7 @@ class BaseWidget {
|
|
73
73
|
this.button.tabIndex = 0;
|
74
74
|
// Disable the context menu. This allows long-press gestures to trigger the button's
|
75
75
|
// tooltip instead.
|
76
|
-
this.button.oncontextmenu = event => {
|
76
|
+
this.button.oncontextmenu = (event) => {
|
77
77
|
event.preventDefault();
|
78
78
|
};
|
79
79
|
(0, addLongPressOrHoverCssClasses_1.default)(this.button);
|
@@ -171,7 +171,7 @@ class BaseWidget {
|
|
171
171
|
return this.setUpButtonEventListeners(button);
|
172
172
|
}
|
173
173
|
setUpButtonEventListeners(button) {
|
174
|
-
const clickTriggers = { Enter: true, ' ': true
|
174
|
+
const clickTriggers = { Enter: true, ' ': true };
|
175
175
|
button.onkeydown = (evt) => {
|
176
176
|
let handled = false;
|
177
177
|
if (evt.key in clickTriggers) {
|
@@ -189,7 +189,7 @@ class BaseWidget {
|
|
189
189
|
evt.preventDefault();
|
190
190
|
}
|
191
191
|
};
|
192
|
-
button.onkeyup = htmlEvent => {
|
192
|
+
button.onkeyup = (htmlEvent) => {
|
193
193
|
if (htmlEvent.key in clickTriggers) {
|
194
194
|
return;
|
195
195
|
}
|
@@ -205,7 +205,7 @@ class BaseWidget {
|
|
205
205
|
}
|
206
206
|
};
|
207
207
|
// Prevent double-click zoom on some devices.
|
208
|
-
button.ondblclick = event => {
|
208
|
+
button.ondblclick = (event) => {
|
209
209
|
event.preventDefault();
|
210
210
|
};
|
211
211
|
}
|
@@ -257,7 +257,7 @@ class BaseWidget {
|
|
257
257
|
this.container.replaceChildren();
|
258
258
|
this.button.replaceChildren(this.icon, this.label);
|
259
259
|
this.container.appendChild(this.button);
|
260
|
-
const helpDisplay = new HelpDisplay_1.default(content => this.editor.createHTMLOverlay(content), this.editor);
|
260
|
+
const helpDisplay = new HelpDisplay_1.default((content) => this.editor.createHTMLOverlay(content), this.editor);
|
261
261
|
const helpText = this.getHelpText();
|
262
262
|
if (helpText) {
|
263
263
|
helpDisplay.registerTextHelpForElement(this.dropdownContent, [this.getTitle(), helpText].join('\n\n'));
|
@@ -277,7 +277,7 @@ class BaseWidget {
|
|
277
277
|
getTitle: () => this.getTitle(),
|
278
278
|
isToplevel: () => this.toplevel,
|
279
279
|
});
|
280
|
-
this.dropdown.visible.onUpdate(visible => {
|
280
|
+
this.dropdown.visible.onUpdate((visible) => {
|
281
281
|
if (visible) {
|
282
282
|
this.container.classList.add('dropdownVisible');
|
283
283
|
}
|
@@ -475,7 +475,7 @@ _a = BaseWidget, _BaseWidget_hasDropdown = new WeakMap(), _BaseWidget_disabledDu
|
|
475
475
|
handler.removeListener(keyPressListener);
|
476
476
|
};
|
477
477
|
}
|
478
|
-
const readOnlyListener = this.editor.isReadOnlyReactiveValue().onUpdateAndNow(readOnly => {
|
478
|
+
const readOnlyListener = this.editor.isReadOnlyReactiveValue().onUpdateAndNow((readOnly) => {
|
479
479
|
if (readOnly && this.shouldAutoDisableInReadOnlyEditor() && !this.disabled) {
|
480
480
|
this.setDisabled(true);
|
481
481
|
__classPrivateFieldSet(this, _BaseWidget_disabledDueToReadOnlyEditor, true, "f");
|
@@ -129,7 +129,7 @@ class DocumentPropertiesWidget extends BaseWidget_1.default {
|
|
129
129
|
const backgroundColorRow = document.createElement('div');
|
130
130
|
const backgroundColorLabel = document.createElement('label');
|
131
131
|
backgroundColorLabel.innerText = this.localizationTable.backgroundColor;
|
132
|
-
const { input: colorInput, container: backgroundColorInputContainer, setValue: setBgColorInputValue, registerWithHelpTextDisplay: registerHelpForInputs, } = (0, makeColorInput_1.default)(this.editor, color => {
|
132
|
+
const { input: colorInput, container: backgroundColorInputContainer, setValue: setBgColorInputValue, registerWithHelpTextDisplay: registerHelpForInputs, } = (0, makeColorInput_1.default)(this.editor, (color) => {
|
133
133
|
if (!color.eq(this.getBackgroundColor())) {
|
134
134
|
this.setBackgroundColor(color);
|
135
135
|
}
|
@@ -144,7 +144,7 @@ class DocumentPropertiesWidget extends BaseWidget_1.default {
|
|
144
144
|
helpDisplay?.registerTextHelpForElement(backgroundColorRow, this.localizationTable.pageDropdown__backgroundColorHelpText);
|
145
145
|
registerHelpForInputs(helpDisplay);
|
146
146
|
};
|
147
|
-
return { setBgColorInputValue, backgroundColorRow, registerWithHelp
|
147
|
+
return { setBgColorInputValue, backgroundColorRow, registerWithHelp };
|
148
148
|
};
|
149
149
|
const { backgroundColorRow, setBgColorInputValue, registerWithHelp: registerBackgroundRowWithHelp, } = makeBackgroundColorInput();
|
150
150
|
const makeCheckboxRow = (labelText, onChange) => {
|
@@ -13,7 +13,7 @@ class EraserToolWidget extends BaseToolWidget_1.default {
|
|
13
13
|
super(editor, tool, 'eraser-tool-widget', localizationTable);
|
14
14
|
this.tool = tool;
|
15
15
|
this.updateInputs = () => { };
|
16
|
-
this.editor.notifier.on(types_1.EditorEventType.ToolUpdated, toolEvt => {
|
16
|
+
this.editor.notifier.on(types_1.EditorEventType.ToolUpdated, (toolEvt) => {
|
17
17
|
if (toolEvt.kind === types_1.EditorEventType.ToolUpdated && toolEvt.tool === this.tool) {
|
18
18
|
this.updateInputs();
|
19
19
|
this.updateIcon();
|
@@ -41,7 +41,9 @@ class EraserToolWidget extends BaseToolWidget_1.default {
|
|
41
41
|
labelElement.innerText = this.localizationTable.fullStrokeEraser;
|
42
42
|
checkboxElement.type = 'checkbox';
|
43
43
|
checkboxElement.oninput = () => {
|
44
|
-
this.tool
|
44
|
+
this.tool
|
45
|
+
.getModeValue()
|
46
|
+
.set(checkboxElement.checked ? Eraser_1.EraserMode.FullStroke : Eraser_1.EraserMode.PartialStroke);
|
45
47
|
};
|
46
48
|
const updateValue = () => {
|
47
49
|
checkboxElement.checked = this.tool.getModeValue().get() === Eraser_1.EraserMode.FullStroke;
|
@@ -58,7 +60,7 @@ class EraserToolWidget extends BaseToolWidget_1.default {
|
|
58
60
|
fillDropdown(dropdown, helpDisplay) {
|
59
61
|
const container = document.createElement('div');
|
60
62
|
container.classList.add(`${constants_1.toolbarCSSPrefix}spacedList`, `${constants_1.toolbarCSSPrefix}nonbutton-controls-main-list`);
|
61
|
-
const thicknessSlider = (0, makeThicknessSlider_1.default)(this.editor, thickness => {
|
63
|
+
const thicknessSlider = (0, makeThicknessSlider_1.default)(this.editor, (thickness) => {
|
62
64
|
this.tool.setThickness(thickness);
|
63
65
|
});
|
64
66
|
thicknessSlider.setBounds(10, 55);
|
@@ -97,7 +97,7 @@ class HandModeWidget extends BaseWidget_1.default {
|
|
97
97
|
this.makeIcon = makeIcon;
|
98
98
|
this.title = title;
|
99
99
|
this.helpText = helpText;
|
100
|
-
editor.notifier.on(types_1.EditorEventType.ToolUpdated, toolEvt => {
|
100
|
+
editor.notifier.on(types_1.EditorEventType.ToolUpdated, (toolEvt) => {
|
101
101
|
if (toolEvt.kind === types_1.EditorEventType.ToolUpdated && toolEvt.tool === tool) {
|
102
102
|
const allEnabled = !!(tool.getMode() & PanZoom_1.PanZoomMode.SinglePointerGestures);
|
103
103
|
this.setSelected(!!(tool.getMode() & flag) || allEnabled);
|
@@ -140,12 +140,12 @@ class HandToolWidget extends BaseToolWidget_1.default {
|
|
140
140
|
// If the primary, the override will be gotten from the editor's tool controller.
|
141
141
|
tool, localizationTable) {
|
142
142
|
const isGivenToolPrimary = editor.toolController.getPrimaryTools().includes(tool);
|
143
|
-
const primaryTool = (isGivenToolPrimary ? tool : HandToolWidget.getPrimaryHandTool(editor.toolController))
|
144
|
-
|
143
|
+
const primaryTool = (isGivenToolPrimary ? tool : HandToolWidget.getPrimaryHandTool(editor.toolController)) ??
|
144
|
+
tool;
|
145
145
|
super(editor, primaryTool, 'hand-tool-widget', localizationTable);
|
146
146
|
this.overridePanZoomTool =
|
147
|
-
(isGivenToolPrimary ? HandToolWidget.getOverrideHandTool(editor.toolController) : tool)
|
148
|
-
|
147
|
+
(isGivenToolPrimary ? HandToolWidget.getOverrideHandTool(editor.toolController) : tool) ??
|
148
|
+
tool;
|
149
149
|
// Only allow toggling a hand tool if we're using the primary hand tool and not the override
|
150
150
|
// hand tool for this button.
|
151
151
|
this.allowTogglingBaseTool = primaryTool !== null;
|
@@ -160,7 +160,9 @@ class HandToolWidget extends BaseToolWidget_1.default {
|
|
160
160
|
this.addSubWidget(rotationLockWidget);
|
161
161
|
}
|
162
162
|
static getPrimaryHandTool(toolController) {
|
163
|
-
const primaryPanZoomToolList = toolController
|
163
|
+
const primaryPanZoomToolList = toolController
|
164
|
+
.getPrimaryTools()
|
165
|
+
.filter((tool) => tool instanceof PanZoom_1.default);
|
164
166
|
const primaryPanZoomTool = primaryPanZoomToolList[0];
|
165
167
|
return primaryPanZoomTool;
|
166
168
|
}
|
@@ -39,7 +39,7 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
39
39
|
super(editor, 'insert-image-widget', localization);
|
40
40
|
// Make the dropdown showable
|
41
41
|
this.container.classList.add('dropdownShowable');
|
42
|
-
editor.notifier.on(types_1.EditorEventType.SelectionUpdated, event => {
|
42
|
+
editor.notifier.on(types_1.EditorEventType.SelectionUpdated, (event) => {
|
43
43
|
if (event.kind === types_1.EditorEventType.SelectionUpdated && this.isDropdownVisible()) {
|
44
44
|
this.updateInputs();
|
45
45
|
}
|
@@ -72,7 +72,7 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
72
72
|
fillDropdown(dropdown) {
|
73
73
|
const container = document.createElement('div');
|
74
74
|
container.classList.add('insert-image-widget-dropdown-content', `${constants_1.toolbarCSSPrefix}spacedList`, `${constants_1.toolbarCSSPrefix}nonbutton-controls-main-list`);
|
75
|
-
const { container: chooseImageRow, selectedFiles
|
75
|
+
const { container: chooseImageRow, selectedFiles } = (0, makeFileInput_1.default)(this.localizationTable.chooseFile, this.editor, {
|
76
76
|
accepts: 'image/*',
|
77
77
|
allowMultiSelect: true,
|
78
78
|
customPickerAction: this.editor.getCurrentSettings().image?.showImagePicker,
|
@@ -120,7 +120,7 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
120
120
|
this.statusView.innerText = errorMessage;
|
121
121
|
return [];
|
122
122
|
}
|
123
|
-
return renderableImages.map(image => {
|
123
|
+
return renderableImages.map((image) => {
|
124
124
|
const { wrapper, preview } = ImageWrapper_1.ImageWrapper.fromRenderable(image, () => this.onImageDataUpdate());
|
125
125
|
return {
|
126
126
|
data: wrapper,
|
@@ -188,7 +188,9 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
188
188
|
this.statusView.appendChild(resetSizeButton);
|
189
189
|
}
|
190
190
|
else {
|
191
|
-
const hasLargeOrChangedImages = this.images
|
191
|
+
const hasLargeOrChangedImages = this.images
|
192
|
+
.get()
|
193
|
+
.some((image) => image.data?.isChanged() || image.data?.isLarge());
|
192
194
|
if (hasLargeOrChangedImages) {
|
193
195
|
// Still show the button -- prevents the layout from readjusting while
|
194
196
|
// scrolling through the image list
|
@@ -207,7 +209,7 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
207
209
|
};
|
208
210
|
resetInputs();
|
209
211
|
const selectionTools = this.editor.toolController.getMatchingTools(SelectionTool_1.default);
|
210
|
-
const selectedObjects = selectionTools.map(tool => tool.getSelectedObjects()).flat();
|
212
|
+
const selectedObjects = selectionTools.map((tool) => tool.getSelectedObjects()).flat();
|
211
213
|
// Check: Is there a selected image that can be edited?
|
212
214
|
let editingImage = null;
|
213
215
|
if (selectedObjects.length === 1 && selectedObjects[0] instanceof ImageComponent_1.default) {
|
@@ -219,7 +221,7 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
219
221
|
}
|
220
222
|
else if (selectedObjects.length > 0) {
|
221
223
|
// If not, clear the selection.
|
222
|
-
selectionTools.forEach(tool => tool.clearSelection());
|
224
|
+
selectionTools.forEach((tool) => tool.clearSelection());
|
223
225
|
}
|
224
226
|
// Show the submit button only when there is data to submit.
|
225
227
|
this.submitButton.style.display = 'none';
|
@@ -275,10 +277,7 @@ class InsertImageWidget extends BaseWidget_1.default {
|
|
275
277
|
for (const component of newComponents) {
|
276
278
|
commands.push(EditorImage_1.default.addElement(component), component.transformBy(originalTransform.rightMul(widthAdjustTransform)), component.setZIndex(editingImage.getZIndex()));
|
277
279
|
}
|
278
|
-
this.editor.dispatch((0, uniteCommands_1.default)([
|
279
|
-
...commands,
|
280
|
-
eraseCommand,
|
281
|
-
]));
|
280
|
+
this.editor.dispatch((0, uniteCommands_1.default)([...commands, eraseCommand]));
|
282
281
|
selectionTools[0]?.setSelection(newComponents);
|
283
282
|
}
|
284
283
|
else {
|