js-draw 1.21.3 → 1.23.1
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +104 -76
- 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.d.ts +1 -3
- package/dist/cjs/Editor.js +38 -26
- package/dist/cjs/EventDispatcher.js +1 -1
- package/dist/cjs/Pointer.js +3 -3
- package/dist/cjs/SVGLoader/SVGLoader.js +15 -6
- package/dist/cjs/UndoRedoHistory.js +1 -1
- package/dist/cjs/Viewport.d.ts +1 -1
- package/dist/cjs/Viewport.js +5 -3
- 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 +2 -2
- package/dist/cjs/components/AbstractComponent.js +4 -4
- 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.d.ts +30 -7
- package/dist/cjs/image/EditorImage.js +43 -22
- 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.d.ts +2 -25
- package/dist/cjs/rendering/renderers/CanvasRenderer.js +6 -28
- package/dist/cjs/rendering/renderers/DummyRenderer.js +1 -1
- package/dist/cjs/rendering/renderers/SVGRenderer.js +39 -21
- 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.d.ts +19 -0
- package/dist/cjs/toolbar/AbstractToolbar.js +26 -11
- package/dist/cjs/toolbar/EdgeToolbar.js +11 -15
- package/dist/cjs/toolbar/IconProvider.d.ts +5 -1
- package/dist/cjs/toolbar/IconProvider.js +117 -149
- package/dist/cjs/toolbar/localization.js +5 -5
- 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.d.ts +1 -1
- package/dist/cjs/toolbar/widgets/BaseWidget.js +8 -8
- 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.js +5 -3
- package/dist/cjs/tools/Eraser.js +25 -20
- package/dist/cjs/tools/FindTool.js +2 -2
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.js +1 -3
- package/dist/cjs/tools/InputFilter/InputMapper.js +1 -1
- package/dist/cjs/tools/InputFilter/InputPipeline.js +1 -1
- package/dist/cjs/tools/InputFilter/InputStabilizer.js +12 -5
- package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +7 -4
- package/dist/cjs/tools/PanZoom.d.ts +1 -1
- package/dist/cjs/tools/PanZoom.js +18 -13
- package/dist/cjs/tools/PasteHandler.js +8 -2
- package/dist/cjs/tools/Pen.d.ts +13 -0
- package/dist/cjs/tools/Pen.js +30 -9
- package/dist/cjs/tools/ScrollbarTool.js +8 -7
- package/dist/cjs/tools/SelectionTool/Selection.js +16 -12
- package/dist/cjs/tools/SelectionTool/SelectionHandle.js +5 -2
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +3 -1
- package/dist/cjs/tools/SelectionTool/SelectionTool.js +25 -16
- package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +1 -1
- package/dist/cjs/tools/SelectionTool/TransformMode.js +6 -7
- package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.js +23 -2
- package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.js +29 -20
- package/dist/cjs/tools/SoundUITool.js +5 -3
- package/dist/cjs/tools/TextTool.js +8 -6
- package/dist/cjs/tools/ToolController.js +16 -10
- package/dist/cjs/tools/lib.d.ts +1 -0
- package/dist/cjs/tools/lib.js +3 -1
- package/dist/cjs/tools/localization.d.ts +2 -0
- package/dist/cjs/tools/localization.js +3 -1
- package/dist/cjs/tools/util/StationaryPenDetector.js +3 -3
- package/dist/cjs/tools/util/createMenuOverlay.js +2 -2
- 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/cloneElementWithStyles.js +1 -1
- package/dist/cjs/util/createElement.d.ts +62 -0
- package/dist/cjs/util/createElement.js +53 -0
- 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.d.ts +1 -3
- package/dist/mjs/Editor.mjs +39 -27
- package/dist/mjs/EventDispatcher.mjs +1 -1
- package/dist/mjs/Pointer.mjs +3 -3
- package/dist/mjs/SVGLoader/SVGLoader.mjs +16 -7
- package/dist/mjs/UndoRedoHistory.mjs +1 -1
- package/dist/mjs/Viewport.d.ts +1 -1
- package/dist/mjs/Viewport.mjs +5 -3
- 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 +2 -2
- package/dist/mjs/components/AbstractComponent.mjs +4 -4
- 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.d.ts +30 -7
- package/dist/mjs/image/EditorImage.mjs +43 -22
- 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.d.ts +2 -25
- package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +6 -28
- package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
- package/dist/mjs/rendering/renderers/SVGRenderer.mjs +40 -22
- 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.d.ts +19 -0
- package/dist/mjs/toolbar/AbstractToolbar.mjs +26 -11
- package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
- package/dist/mjs/toolbar/IconProvider.d.ts +5 -1
- package/dist/mjs/toolbar/IconProvider.mjs +117 -149
- package/dist/mjs/toolbar/localization.mjs +5 -5
- 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.d.ts +1 -1
- package/dist/mjs/toolbar/widgets/BaseWidget.mjs +9 -9
- 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.mjs +6 -4
- package/dist/mjs/tools/Eraser.mjs +25 -20
- package/dist/mjs/tools/FindTool.mjs +2 -2
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.mjs +2 -4
- package/dist/mjs/tools/InputFilter/InputMapper.mjs +1 -1
- package/dist/mjs/tools/InputFilter/InputPipeline.mjs +1 -1
- package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +13 -6
- package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +7 -4
- package/dist/mjs/tools/PanZoom.d.ts +1 -1
- package/dist/mjs/tools/PanZoom.mjs +19 -14
- package/dist/mjs/tools/PasteHandler.mjs +8 -2
- package/dist/mjs/tools/Pen.d.ts +13 -0
- package/dist/mjs/tools/Pen.mjs +31 -10
- package/dist/mjs/tools/ScrollbarTool.mjs +8 -7
- package/dist/mjs/tools/SelectionTool/Selection.mjs +16 -12
- package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +5 -2
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +3 -1
- package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +26 -17
- package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +1 -1
- package/dist/mjs/tools/SelectionTool/TransformMode.mjs +6 -7
- package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.mjs +23 -2
- package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.mjs +29 -20
- package/dist/mjs/tools/SoundUITool.mjs +5 -3
- package/dist/mjs/tools/TextTool.mjs +8 -6
- package/dist/mjs/tools/ToolController.mjs +16 -10
- package/dist/mjs/tools/lib.d.ts +1 -0
- package/dist/mjs/tools/lib.mjs +1 -0
- package/dist/mjs/tools/localization.d.ts +2 -0
- package/dist/mjs/tools/localization.mjs +3 -1
- package/dist/mjs/tools/util/StationaryPenDetector.mjs +3 -3
- package/dist/mjs/tools/util/createMenuOverlay.mjs +2 -2
- 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/cloneElementWithStyles.mjs +1 -1
- package/dist/mjs/util/createElement.d.ts +62 -0
- package/dist/mjs/util/createElement.mjs +47 -0
- 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 +1 -2
- package/src/tools/ScrollbarTool.scss +9 -5
- package/src/tools/SelectionTool/SelectionTool.scss +15 -7
- package/src/tools/SelectionTool/util/makeClipboardErrorHandlers.scss +1 -2
- package/src/tools/SoundUITool.scss +4 -4
- package/src/tools/tools.scss +5 -6
- package/src/tools/util/createMenuOverlay.scss +10 -4
- package/tsconfig.json +1 -3
- package/typedoc.json +1 -1
@@ -0,0 +1,53 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.createSvgPaths = exports.createSvgElements = exports.createSvgElement = exports.ElementNamespace = void 0;
|
4
|
+
var ElementNamespace;
|
5
|
+
(function (ElementNamespace) {
|
6
|
+
ElementNamespace["Html"] = "html";
|
7
|
+
ElementNamespace["Svg"] = "svg";
|
8
|
+
})(ElementNamespace || (exports.ElementNamespace = ElementNamespace = {}));
|
9
|
+
/**
|
10
|
+
* Shorthand for creating an element with `document.createElement`, then assigning properties.
|
11
|
+
*
|
12
|
+
* Non-HTML elements (e.g. `svg` elements) should use the `elementType` parameter to select
|
13
|
+
* the element namespace.
|
14
|
+
*/
|
15
|
+
const createElement = (tag, props, elementType = ElementNamespace.Html) => {
|
16
|
+
let elem;
|
17
|
+
if (elementType === ElementNamespace.Html) {
|
18
|
+
elem = document.createElement(tag);
|
19
|
+
}
|
20
|
+
else if (elementType === ElementNamespace.Svg) {
|
21
|
+
elem = document.createElementNS('http://www.w3.org/2000/svg', tag);
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
throw new Error(`Unknown element type ${elementType}`);
|
25
|
+
}
|
26
|
+
for (const [key, value] of Object.entries(props)) {
|
27
|
+
if (key === 'children')
|
28
|
+
continue;
|
29
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
30
|
+
throw new Error(`Unsupported value type ${typeof value}`);
|
31
|
+
}
|
32
|
+
elem.setAttribute(key, value.toString());
|
33
|
+
}
|
34
|
+
if (props.children) {
|
35
|
+
for (const item of props.children) {
|
36
|
+
elem.appendChild(item);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return elem;
|
40
|
+
};
|
41
|
+
const createSvgElement = (tag, props) => {
|
42
|
+
return createElement(tag, props, ElementNamespace.Svg);
|
43
|
+
};
|
44
|
+
exports.createSvgElement = createSvgElement;
|
45
|
+
const createSvgElements = (tag, elements) => {
|
46
|
+
return elements.map((props) => (0, exports.createSvgElement)(tag, props));
|
47
|
+
};
|
48
|
+
exports.createSvgElements = createSvgElements;
|
49
|
+
const createSvgPaths = (...paths) => {
|
50
|
+
return (0, exports.createSvgElements)('path', paths);
|
51
|
+
};
|
52
|
+
exports.createSvgPaths = createSvgPaths;
|
53
|
+
exports.default = createElement;
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// See https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_code_values for
|
4
4
|
// more
|
5
5
|
const keyToKeyCode = {
|
6
|
-
|
6
|
+
Control: 'ControlLeft',
|
7
7
|
'=': 'Equal',
|
8
8
|
'-': 'Minus',
|
9
9
|
';': 'Semicolon',
|
@@ -21,7 +21,7 @@ const listenForKeyboardEventsFrom = (elem, callbacks) => {
|
|
21
21
|
return a.key === b.key && a.code === b.code;
|
22
22
|
};
|
23
23
|
const isKeyDown = (keyEvent) => {
|
24
|
-
return keysDown.some(other => keyEventsMatch(other, keyEvent));
|
24
|
+
return keysDown.some((other) => keyEventsMatch(other, keyEvent));
|
25
25
|
};
|
26
26
|
const keyEventToRecord = (event) => {
|
27
27
|
return {
|
@@ -47,10 +47,11 @@ const listenForKeyboardEventsFrom = (elem, callbacks) => {
|
|
47
47
|
}
|
48
48
|
callbacks.handleKeyDown(htmlEvent);
|
49
49
|
}
|
50
|
-
else {
|
50
|
+
else {
|
51
|
+
// keyup
|
51
52
|
console.assert(htmlEvent.type === 'keyup');
|
52
53
|
// Remove the key from keysDown -- it's no longer down.
|
53
|
-
keysDown = keysDown.filter(event => {
|
54
|
+
keysDown = keysDown.filter((event) => {
|
54
55
|
const matches = keyEventsMatch(event, htmlEvent);
|
55
56
|
return !matches;
|
56
57
|
});
|
@@ -60,17 +61,18 @@ const listenForKeyboardEventsFrom = (elem, callbacks) => {
|
|
60
61
|
callbacks.handleKeyUp(htmlEvent);
|
61
62
|
}
|
62
63
|
};
|
63
|
-
elem.addEventListener('keydown', htmlEvent => {
|
64
|
+
elem.addEventListener('keydown', (htmlEvent) => {
|
64
65
|
handleKeyEvent(htmlEvent);
|
65
66
|
});
|
66
|
-
elem.addEventListener('keyup', htmlEvent => {
|
67
|
+
elem.addEventListener('keyup', (htmlEvent) => {
|
67
68
|
handleKeyEvent(htmlEvent);
|
68
69
|
});
|
69
70
|
elem.addEventListener('focusout', (focusEvent) => {
|
70
71
|
let stillHasFocus = false;
|
71
72
|
if (focusEvent.relatedTarget) {
|
72
73
|
const relatedTarget = focusEvent.relatedTarget;
|
73
|
-
stillHasFocus =
|
74
|
+
stillHasFocus =
|
75
|
+
elem.contains(relatedTarget) || callbacks.getHandlesKeyEventsFrom(relatedTarget);
|
74
76
|
}
|
75
77
|
if (!stillHasFocus) {
|
76
78
|
for (const event of keysDown) {
|
@@ -8,11 +8,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
*/
|
9
9
|
const waitForAll = (results) => {
|
10
10
|
// If any are Promises...
|
11
|
-
if (results.some(command => command && command['then'])) {
|
11
|
+
if (results.some((command) => command && command['then'])) {
|
12
12
|
// Wait for all commands to finish.
|
13
|
-
return Promise.all(results)
|
13
|
+
return (Promise.all(results)
|
14
14
|
// Ensure we return a Promise<void> and not a Promise<void[]>
|
15
|
-
.then(() => { });
|
15
|
+
.then(() => { }));
|
16
16
|
}
|
17
17
|
return;
|
18
18
|
};
|
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const waitForImageLoad = async (image) => {
|
4
4
|
if (!image.complete) {
|
5
5
|
await new Promise((resolve, reject) => {
|
6
|
-
image.onload = event => resolve(event);
|
6
|
+
image.onload = (event) => resolve(event);
|
7
7
|
// TODO(v2): Return a `new Error(event.message)`
|
8
8
|
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- Forwarding an error-like object.
|
9
|
-
image.onerror = event => reject(event);
|
9
|
+
image.onerror = (event) => reject(event);
|
10
10
|
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- Forwarding an error-like object.
|
11
|
-
image.onabort = event => reject(event);
|
11
|
+
image.onabort = (event) => reject(event);
|
12
12
|
});
|
13
13
|
}
|
14
14
|
};
|
@@ -2,7 +2,7 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
/** Returns a promise that resolves after `timeout` milliseconds. */
|
4
4
|
const waitForTimeout = (timeout) => {
|
5
|
-
return new Promise(resolve => {
|
5
|
+
return new Promise((resolve) => {
|
6
6
|
setTimeout(() => resolve(), timeout);
|
7
7
|
});
|
8
8
|
};
|
package/dist/cjs/version.js
CHANGED
package/dist/mjs/Editor.d.ts
CHANGED
@@ -411,9 +411,7 @@ export declare class Editor {
|
|
411
411
|
* Use this to show finalized commands that don't need to have `announceForAccessibility`
|
412
412
|
* called.
|
413
413
|
*
|
414
|
-
*
|
415
|
-
* clients to listen for the application of commands (e.g. `SerializableCommand`s so they can
|
416
|
-
* be sent across the network), while `apply` does not.
|
414
|
+
* If `addToHistory` is `false`, this is equivalent to `command.apply(editor)`.
|
417
415
|
*
|
418
416
|
* @example
|
419
417
|
* ```
|
package/dist/mjs/Editor.mjs
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import EditorImage from './image/EditorImage.mjs';
|
2
2
|
import ToolController from './tools/ToolController.mjs';
|
3
3
|
import { EditorEventType } from './types.mjs';
|
4
|
-
import { InputEvtType, keyUpEventFromHTMLEvent, keyPressEventFromHTMLEvent } from './inputEvents.mjs';
|
4
|
+
import { InputEvtType, keyUpEventFromHTMLEvent, keyPressEventFromHTMLEvent, } from './inputEvents.mjs';
|
5
5
|
import UndoRedoHistory from './UndoRedoHistory.mjs';
|
6
6
|
import Viewport from './Viewport.mjs';
|
7
7
|
import EventDispatcher from './EventDispatcher.mjs';
|
@@ -108,11 +108,11 @@ export class Editor {
|
|
108
108
|
maxZoom: settings.maxZoom ?? 1e12,
|
109
109
|
keyboardShortcutOverrides: settings.keyboardShortcutOverrides ?? {},
|
110
110
|
iconProvider: settings.iconProvider ?? new IconProvider(),
|
111
|
-
notices: [],
|
111
|
+
notices: settings.notices ?? [],
|
112
112
|
appInfo: settings.appInfo ? { ...settings.appInfo } : null,
|
113
113
|
pens: {
|
114
114
|
additionalPenTypes: settings.pens?.additionalPenTypes ?? [],
|
115
|
-
filterPenTypes: settings.pens?.filterPenTypes ?? (() => true)
|
115
|
+
filterPenTypes: settings.pens?.filterPenTypes ?? (() => true),
|
116
116
|
},
|
117
117
|
text: {
|
118
118
|
fonts: settings.text?.fonts ?? ['sans-serif', 'serif', 'monospace'],
|
@@ -172,7 +172,7 @@ export class Editor {
|
|
172
172
|
this.queueRerender();
|
173
173
|
this.hideLoadingWarning();
|
174
174
|
// Enforce zoom limits.
|
175
|
-
this.notifier.on(EditorEventType.ViewportChanged, evt => {
|
175
|
+
this.notifier.on(EditorEventType.ViewportChanged, (evt) => {
|
176
176
|
if (evt.kind !== EditorEventType.ViewportChanged)
|
177
177
|
return;
|
178
178
|
const getZoom = (mat) => mat.transformVec3(Vec2.unitX).length();
|
@@ -281,16 +281,16 @@ export class Editor {
|
|
281
281
|
this.loadingWarning,
|
282
282
|
];
|
283
283
|
for (const element of preventSelectionOf) {
|
284
|
-
element.addEventListener('drag', event => {
|
284
|
+
element.addEventListener('drag', (event) => {
|
285
285
|
event.preventDefault();
|
286
286
|
return false;
|
287
287
|
});
|
288
|
-
element.addEventListener('dragstart', event => {
|
288
|
+
element.addEventListener('dragstart', (event) => {
|
289
289
|
event.preventDefault();
|
290
290
|
return false;
|
291
291
|
});
|
292
292
|
}
|
293
|
-
this.container.addEventListener('wheel', evt => {
|
293
|
+
this.container.addEventListener('wheel', (evt) => {
|
294
294
|
this.handleHTMLWheelEvent(evt);
|
295
295
|
});
|
296
296
|
const handleResize = () => {
|
@@ -316,7 +316,7 @@ export class Editor {
|
|
316
316
|
}
|
317
317
|
copyHandler.copy(evt);
|
318
318
|
});
|
319
|
-
document.addEventListener('paste', evt => {
|
319
|
+
document.addEventListener('paste', (evt) => {
|
320
320
|
this.handlePaste(evt);
|
321
321
|
});
|
322
322
|
}
|
@@ -371,7 +371,7 @@ export class Editor {
|
|
371
371
|
const res = [];
|
372
372
|
for (const id in this.pointers) {
|
373
373
|
const maxUnupdatedTime = 2000; // Maximum time without a pointer update (ms)
|
374
|
-
if (this.pointers[id] &&
|
374
|
+
if (this.pointers[id] && nowTime - this.pointers[id].timeStamp < maxUnupdatedTime) {
|
375
375
|
res.push(this.pointers[id]);
|
376
376
|
}
|
377
377
|
}
|
@@ -526,10 +526,15 @@ export class Editor {
|
|
526
526
|
evt.preventDefault();
|
527
527
|
};
|
528
528
|
const listeners = {
|
529
|
-
|
530
|
-
|
529
|
+
touchstart: touchstartListener,
|
530
|
+
contextmenu: contextmenuListener,
|
531
531
|
};
|
532
|
-
const eventNames = [
|
532
|
+
const eventNames = [
|
533
|
+
'pointerdown',
|
534
|
+
'pointermove',
|
535
|
+
'pointerup',
|
536
|
+
'pointercancel',
|
537
|
+
];
|
533
538
|
for (const eventName of eventNames) {
|
534
539
|
listeners[eventName] = (evt) => {
|
535
540
|
// This listener will only be called in the context of PointerEvents.
|
@@ -614,8 +619,9 @@ export class Editor {
|
|
614
619
|
// Otherwise, if we received a pointerup/pointercancel without flushing all pointerevents from the
|
615
620
|
// buffer, the gesture wasn't recognised as a stroke. Thus, the editor isn't expecting a pointerup/
|
616
621
|
// pointercancel event.
|
617
|
-
else if ((eventName === 'pointerup' || eventName === 'pointercancel')
|
618
|
-
|
622
|
+
else if ((eventName === 'pointerup' || eventName === 'pointercancel') &&
|
623
|
+
gestureData[pointerId] &&
|
624
|
+
gestureData[pointerId].eventBuffer.length > 0) {
|
619
625
|
this.releasePointerCapture(elem, event.pointerId);
|
620
626
|
// Don't send to the editor.
|
621
627
|
sendToEditor = false;
|
@@ -675,10 +681,10 @@ export class Editor {
|
|
675
681
|
},
|
676
682
|
});
|
677
683
|
// Allow drop.
|
678
|
-
elem.ondragover = evt => {
|
684
|
+
elem.ondragover = (evt) => {
|
679
685
|
evt.preventDefault();
|
680
686
|
};
|
681
|
-
elem.ondrop = evt => {
|
687
|
+
elem.ondrop = (evt) => {
|
682
688
|
this.handleDrop(evt);
|
683
689
|
};
|
684
690
|
this.eventListenerTargets.push(elem);
|
@@ -720,9 +726,7 @@ export class Editor {
|
|
720
726
|
* Use this to show finalized commands that don't need to have `announceForAccessibility`
|
721
727
|
* called.
|
722
728
|
*
|
723
|
-
*
|
724
|
-
* clients to listen for the application of commands (e.g. `SerializableCommand`s so they can
|
725
|
-
* be sent across the network), while `apply` does not.
|
729
|
+
* If `addToHistory` is `false`, this is equivalent to `command.apply(editor)`.
|
726
730
|
*
|
727
731
|
* @example
|
728
732
|
* ```
|
@@ -760,7 +764,7 @@ export class Editor {
|
|
760
764
|
}
|
761
765
|
// Re-render to show progress, but only if we're not done.
|
762
766
|
if (i + updateChunkSize < commands.length) {
|
763
|
-
await new Promise(resolve => {
|
767
|
+
await new Promise((resolve) => {
|
764
768
|
this.rerender();
|
765
769
|
requestAnimationFrame(resolve);
|
766
770
|
});
|
@@ -803,7 +807,7 @@ export class Editor {
|
|
803
807
|
}
|
804
808
|
});
|
805
809
|
}
|
806
|
-
return new Promise(resolve => {
|
810
|
+
return new Promise((resolve) => {
|
807
811
|
this.nextRerenderListeners.push(() => resolve());
|
808
812
|
});
|
809
813
|
}
|
@@ -831,7 +835,7 @@ export class Editor {
|
|
831
835
|
renderer.drawRect(this.getImportExportRect(), exportRectStrokeWidth, exportRectFill);
|
832
836
|
}
|
833
837
|
this.rerenderQueued = false;
|
834
|
-
this.nextRerenderListeners.forEach(listener => listener());
|
838
|
+
this.nextRerenderListeners.forEach((listener) => listener());
|
835
839
|
this.nextRerenderListeners = [];
|
836
840
|
}
|
837
841
|
/**
|
@@ -873,6 +877,7 @@ export class Editor {
|
|
873
877
|
* (e.g. a selection box).
|
874
878
|
*/
|
875
879
|
createHTMLOverlay(overlay) {
|
880
|
+
// TODO(v2): Fix conflict with toolbars that have been added to the editor.
|
876
881
|
overlay.classList.add('overlay', 'js-draw-editor-overlay');
|
877
882
|
this.container.appendChild(overlay);
|
878
883
|
return {
|
@@ -951,7 +956,8 @@ export class Editor {
|
|
951
956
|
const scaleRatioX = visibleRect.width / bbox.width;
|
952
957
|
const scaleRatioY = visibleRect.height / bbox.height;
|
953
958
|
let scaleRatio = scaleRatioX;
|
954
|
-
if (bbox.width * scaleRatio > visibleRect.width ||
|
959
|
+
if (bbox.width * scaleRatio > visibleRect.width ||
|
960
|
+
bbox.height * scaleRatio > visibleRect.height) {
|
955
961
|
scaleRatio = scaleRatioY;
|
956
962
|
}
|
957
963
|
scaleRatio *= 2 / 3;
|
@@ -1106,7 +1112,9 @@ export class Editor {
|
|
1106
1112
|
const originalType = originalBackground?.getBackgroundType?.() ?? BackgroundType.None;
|
1107
1113
|
const originalColor = originalBackground?.getStyle?.().color ?? Color4.transparent;
|
1108
1114
|
const originalFillsScreen = this.image.getAutoresizeEnabled();
|
1109
|
-
const defaultType =
|
1115
|
+
const defaultType = style.color && originalType === BackgroundType.None
|
1116
|
+
? BackgroundType.SolidColor
|
1117
|
+
: originalType;
|
1110
1118
|
const backgroundType = style.type ?? defaultType;
|
1111
1119
|
const backgroundColor = style.color ?? originalColor;
|
1112
1120
|
const fillsScreen = style.autoresize ?? originalFillsScreen;
|
@@ -1134,7 +1142,9 @@ export class Editor {
|
|
1134
1142
|
setBackgroundColor(color) {
|
1135
1143
|
let background = this.getTopmostBackgroundComponent();
|
1136
1144
|
if (!background) {
|
1137
|
-
const backgroundType = color.eq(Color4.transparent)
|
1145
|
+
const backgroundType = color.eq(Color4.transparent)
|
1146
|
+
? BackgroundType.None
|
1147
|
+
: BackgroundType.SolidColor;
|
1138
1148
|
background = new BackgroundComponent(backgroundType, color);
|
1139
1149
|
return this.image.addElement(background);
|
1140
1150
|
}
|
@@ -1221,14 +1231,16 @@ export class Editor {
|
|
1221
1231
|
heading: this.localization.developerInformation,
|
1222
1232
|
text: [
|
1223
1233
|
'Image debug information (from when this dialog was opened):',
|
1224
|
-
` ${this.viewport.getScaleFactor()}x zoom, ${180 / Math.PI * this.viewport.getRotationAngle()}° rotation`,
|
1234
|
+
` ${this.viewport.getScaleFactor()}x zoom, ${(180 / Math.PI) * this.viewport.getRotationAngle()}° rotation`,
|
1225
1235
|
` ${this.image.estimateNumElements()} components`,
|
1226
1236
|
` auto-resize: ${this.image.getAutoresizeEnabled() ? 'enabled' : 'disabled'}`,
|
1227
1237
|
` image size: ${this.getImportExportRect().w}x${this.getImportExportRect().h}`,
|
1228
1238
|
` screen size: ${screenSize.x}x${screenSize.y}`,
|
1229
1239
|
` device pixel ratio: ${this.display.getDevicePixelRatio()}`,
|
1230
1240
|
' cache:',
|
1231
|
-
` ${this.display
|
1241
|
+
` ${this.display
|
1242
|
+
.getCache()
|
1243
|
+
.getDebugInfo()
|
1232
1244
|
// Indent
|
1233
1245
|
.replace(/([\n])/g, '\n ')}`,
|
1234
1246
|
].join('\n'),
|
@@ -49,6 +49,6 @@ export default class EventDispatcher {
|
|
49
49
|
// Replace the current list of listeners with a new, shortened list.
|
50
50
|
// This allows any iterators over this.listeners to continue iterating
|
51
51
|
// without skipping elements.
|
52
|
-
this.listeners[eventName] = listeners.filter(otherCallback => otherCallback !== callback);
|
52
|
+
this.listeners[eventName] = listeners.filter((otherCallback) => otherCallback !== callback);
|
53
53
|
}
|
54
54
|
}
|
package/dist/mjs/Pointer.mjs
CHANGED
@@ -86,9 +86,9 @@ export default class Pointer {
|
|
86
86
|
screenPos = screenPos.minus(Vec2.of(bbox.left, bbox.top));
|
87
87
|
}
|
88
88
|
const pointerTypeToDevice = {
|
89
|
-
|
90
|
-
|
91
|
-
|
89
|
+
mouse: PointerDevice.PrimaryButtonMouse,
|
90
|
+
pen: PointerDevice.Pen,
|
91
|
+
touch: PointerDevice.Touch,
|
92
92
|
};
|
93
93
|
let device = pointerTypeToDevice[evt.pointerType] ?? PointerDevice.Other;
|
94
94
|
const eraserButtonMask = 0x20;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Color4, Mat33, Path, Rect2, Vec2 } from '@js-draw/math';
|
2
|
-
import BackgroundComponent, { BackgroundType, backgroundTypeToClassNameMap, imageBackgroundCSSClassName, imageBackgroundGridSizeCSSPrefix, imageBackgroundNonAutomaticSecondaryColorCSSClassName } from '../components/BackgroundComponent.mjs';
|
2
|
+
import BackgroundComponent, { BackgroundType, backgroundTypeToClassNameMap, imageBackgroundCSSClassName, imageBackgroundGridSizeCSSPrefix, imageBackgroundNonAutomaticSecondaryColorCSSClassName, } from '../components/BackgroundComponent.mjs';
|
3
3
|
import ImageComponent from '../components/ImageComponent.mjs';
|
4
4
|
import Stroke from '../components/Stroke.mjs';
|
5
5
|
import SVGGlobalAttributesObject from '../components/SVGGlobalAttributesObject.mjs';
|
@@ -59,7 +59,10 @@ export default class SVGLoader {
|
|
59
59
|
}
|
60
60
|
}
|
61
61
|
const strokeAttribute = node.getAttribute('stroke') ?? computedStyles?.stroke ?? node.style?.stroke ?? '';
|
62
|
-
const strokeWidthAttr = node.getAttribute('stroke-width') ??
|
62
|
+
const strokeWidthAttr = node.getAttribute('stroke-width') ??
|
63
|
+
computedStyles?.strokeWidth ??
|
64
|
+
node.style?.strokeWidth ??
|
65
|
+
'';
|
63
66
|
if (strokeAttribute && strokeWidthAttr) {
|
64
67
|
try {
|
65
68
|
let width = parseFloat(strokeWidthAttr ?? '1');
|
@@ -114,7 +117,10 @@ export default class SVGLoader {
|
|
114
117
|
if (supportedAttrs.has(attr) || (attr === 'style' && supportedStyleAttrs)) {
|
115
118
|
continue;
|
116
119
|
}
|
117
|
-
elem.attachLoadSaveData(svgAttributesDataKey, [
|
120
|
+
elem.attachLoadSaveData(svgAttributesDataKey, [
|
121
|
+
attr,
|
122
|
+
node.getAttribute(attr),
|
123
|
+
]);
|
118
124
|
}
|
119
125
|
if (supportedStyleAttrs && node.style) {
|
120
126
|
// Use a for loop instead of an iterator: js-dom seems to not
|
@@ -131,7 +137,7 @@ export default class SVGLoader {
|
|
131
137
|
elem.attachLoadSaveData(svgStyleAttributesDataKey, {
|
132
138
|
key: attr,
|
133
139
|
value: node.style.getPropertyValue(attr),
|
134
|
-
priority: node.style.getPropertyPriority(attr)
|
140
|
+
priority: node.style.getPropertyPriority(attr),
|
135
141
|
});
|
136
142
|
}
|
137
143
|
}
|
@@ -492,7 +498,7 @@ export default class SVGLoader {
|
|
492
498
|
}
|
493
499
|
// Get SVG element attributes (e.g. xlink=...)
|
494
500
|
getSourceAttrs(node) {
|
495
|
-
return node.getAttributeNames().map(attr => {
|
501
|
+
return node.getAttributeNames().map((attr) => {
|
496
502
|
return [attr, node.getAttribute(attr)];
|
497
503
|
});
|
498
504
|
}
|
@@ -526,6 +532,7 @@ export default class SVGLoader {
|
|
526
532
|
const { svgElem, cleanUp } = (() => {
|
527
533
|
// If the user requested an iframe load (the default) try to load with an iframe.
|
528
534
|
// There are some cases (e.g. in a sandboxed iframe) where this doesn't work.
|
535
|
+
// TODO(v2): Use domParserLoad by default.
|
529
536
|
if (!domParserLoad) {
|
530
537
|
try {
|
531
538
|
const sandbox = document.createElement('iframe');
|
@@ -533,7 +540,7 @@ export default class SVGLoader {
|
|
533
540
|
// allow-same-origin is necessary for how we interact with the sandbox. As such,
|
534
541
|
// DO NOT ENABLE ALLOW-SCRIPTS.
|
535
542
|
sandbox.setAttribute('sandbox', 'allow-same-origin');
|
536
|
-
sandbox.setAttribute('csp',
|
543
|
+
sandbox.setAttribute('csp', "default-src 'about:blank'");
|
537
544
|
sandbox.style.display = 'none';
|
538
545
|
// Required to access the frame's DOM. See https://stackoverflow.com/a/17777943/17055750
|
539
546
|
document.body.appendChild(sandbox);
|
@@ -565,6 +572,7 @@ export default class SVGLoader {
|
|
565
572
|
`);
|
566
573
|
sandboxDoc.close();
|
567
574
|
const svgElem = sandboxDoc.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
575
|
+
// eslint-disable-next-line no-unsanitized/property -- setting innerHTML in a sandboxed document.
|
568
576
|
svgElem.innerHTML = text;
|
569
577
|
sandboxDoc.body.appendChild(svgElem);
|
570
578
|
const cleanUp = () => {
|
@@ -603,7 +611,8 @@ export default class SVGLoader {
|
|
603
611
|
disableUnknownObjectWarnings = options.disableUnknownObjectWarnings ?? false;
|
604
612
|
}
|
605
613
|
return new SVGLoader(svgElem, cleanUp, {
|
606
|
-
sanitize,
|
614
|
+
sanitize,
|
615
|
+
disableUnknownObjectWarnings,
|
607
616
|
});
|
608
617
|
}
|
609
618
|
}
|
@@ -45,7 +45,7 @@ class UndoRedoHistory {
|
|
45
45
|
if (__classPrivateFieldGet(this, _UndoRedoHistory_undoStack, "f").length > this.maxUndoRedoStackSize) {
|
46
46
|
const removeAtOnceCount = Math.ceil(this.maxUndoRedoStackSize / 100);
|
47
47
|
const removedElements = __classPrivateFieldGet(this, _UndoRedoHistory_undoStack, "f").splice(0, removeAtOnceCount);
|
48
|
-
removedElements.forEach(elem => elem.onDrop(this.editor));
|
48
|
+
removedElements.forEach((elem) => elem.onDrop(this.editor));
|
49
49
|
}
|
50
50
|
this.fireUpdateEvent(UndoEventType.CommandDone, command);
|
51
51
|
this.editor.notifier.dispatch(EditorEventType.CommandDone, {
|
package/dist/mjs/Viewport.d.ts
CHANGED
@@ -53,7 +53,7 @@ export declare class Viewport {
|
|
53
53
|
/**
|
54
54
|
* Snaps `canvasPos` to the nearest grid cell corner.
|
55
55
|
*
|
56
|
-
* @see {@link getGridSize}
|
56
|
+
* @see {@link getGridSize}.
|
57
57
|
*/
|
58
58
|
snapToGrid(canvasPos: Point2): {
|
59
59
|
readonly x: number;
|
package/dist/mjs/Viewport.mjs
CHANGED
@@ -100,7 +100,7 @@ export class Viewport {
|
|
100
100
|
/**
|
101
101
|
* Snaps `canvasPos` to the nearest grid cell corner.
|
102
102
|
*
|
103
|
-
* @see {@link getGridSize}
|
103
|
+
* @see {@link getGridSize}.
|
104
104
|
*/
|
105
105
|
snapToGrid(canvasPos) {
|
106
106
|
const scaleFactor = this.getScaleFactorToNearestPowerOf(2);
|
@@ -151,7 +151,9 @@ export class Viewport {
|
|
151
151
|
// Represent as k 10ⁿ for some n, k ∈ ℤ.
|
152
152
|
const decimalComponent = 10 ** Math.floor(Math.log10(Math.abs(scaleRatio)));
|
153
153
|
const roundAmountFactor = 2 ** roundAmount;
|
154
|
-
scaleRatio =
|
154
|
+
scaleRatio =
|
155
|
+
(Math.round((scaleRatio / decimalComponent) * roundAmountFactor) / roundAmountFactor) *
|
156
|
+
decimalComponent;
|
155
157
|
return scaleRatio;
|
156
158
|
}
|
157
159
|
// Computes and returns an affine transformation that makes `toMakeVisible` visible and roughly centered on the screen.
|
@@ -240,7 +242,7 @@ Viewport.ViewportTransform = (_a = class extends ViewportTransform {
|
|
240
242
|
const linearTransformedVec = this.transform.transformVec3(Vec2.unitX);
|
241
243
|
const affineTransformedVec = this.transform.transformVec2(origVec);
|
242
244
|
const scale = linearTransformedVec.magnitude();
|
243
|
-
const rotation = 180 / Math.PI * linearTransformedVec.angle();
|
245
|
+
const rotation = (180 / Math.PI) * linearTransformedVec.angle();
|
244
246
|
const translation = affineTransformedVec.minus(origVec);
|
245
247
|
if (scale > 1.2) {
|
246
248
|
result.push(localizationTable.zoomedIn);
|
@@ -8,7 +8,7 @@ export class Command {
|
|
8
8
|
onDrop(_editor) { }
|
9
9
|
/** @deprecated Use {@link uniteCommands} */
|
10
10
|
static union(a, b) {
|
11
|
-
return new class extends Command {
|
11
|
+
return new (class extends Command {
|
12
12
|
apply(editor) {
|
13
13
|
a.apply(editor);
|
14
14
|
b.apply(editor);
|
@@ -25,12 +25,14 @@ export class Command {
|
|
25
25
|
}
|
26
26
|
return `${aDescription}, ${bDescription}`;
|
27
27
|
}
|
28
|
-
};
|
28
|
+
})();
|
29
29
|
}
|
30
30
|
}
|
31
|
-
Command.empty = new class extends Command {
|
32
|
-
description(_editor, _localizationTable) {
|
31
|
+
Command.empty = new (class extends Command {
|
32
|
+
description(_editor, _localizationTable) {
|
33
|
+
return '';
|
34
|
+
}
|
33
35
|
apply(_editor) { }
|
34
36
|
unapply(_editor) { }
|
35
|
-
};
|
37
|
+
})();
|
36
38
|
export default Command;
|
@@ -28,7 +28,7 @@ class Duplicate extends SerializableCommand {
|
|
28
28
|
constructor(toDuplicate) {
|
29
29
|
super('duplicate');
|
30
30
|
this.toDuplicate = toDuplicate;
|
31
|
-
this.duplicates = toDuplicate.map(elem => elem.clone());
|
31
|
+
this.duplicates = toDuplicate.map((elem) => elem.clone());
|
32
32
|
this.reverse = new Erase(this.duplicates);
|
33
33
|
}
|
34
34
|
apply(editor) {
|
@@ -47,7 +47,7 @@ class Duplicate extends SerializableCommand {
|
|
47
47
|
return localizationTable.duplicateAction(describeComponentList(localizationTable, this.duplicates) ?? localizationTable.elements, this.duplicates.length);
|
48
48
|
}
|
49
49
|
serializeToJSON() {
|
50
|
-
return this.toDuplicate.map(elem => elem.getId());
|
50
|
+
return this.toDuplicate.map((elem) => elem.getId());
|
51
51
|
}
|
52
52
|
}
|
53
53
|
(() => {
|
@@ -46,7 +46,7 @@ class Erase extends SerializableCommand {
|
|
46
46
|
constructor(toRemove) {
|
47
47
|
super('erase');
|
48
48
|
// Clone the list
|
49
|
-
this.toRemove = toRemove.map(elem => elem);
|
49
|
+
this.toRemove = toRemove.map((elem) => elem);
|
50
50
|
this.applied = false;
|
51
51
|
}
|
52
52
|
apply(editor) {
|
@@ -86,7 +86,7 @@ class Erase extends SerializableCommand {
|
|
86
86
|
serializeToJSON() {
|
87
87
|
// If applied, the elements can't be fetched from the image because they're
|
88
88
|
// erased. Serialize and return the elements themselves.
|
89
|
-
const elems = this.toRemove.map(elem => elem.serialize());
|
89
|
+
const elems = this.toRemove.map((elem) => elem.serialize());
|
90
90
|
return elems;
|
91
91
|
}
|
92
92
|
}
|
@@ -95,8 +95,7 @@ class Erase extends SerializableCommand {
|
|
95
95
|
if (!Array.isArray(json)) {
|
96
96
|
throw new Error('seralized erase data must be an array');
|
97
97
|
}
|
98
|
-
const elems = json
|
99
|
-
.map((elemData) => {
|
98
|
+
const elems = json.map((elemData) => {
|
100
99
|
const componentId = typeof elemData === 'string' ? elemData : `${elemData.id}`;
|
101
100
|
const component = editor.image.lookupElement(componentId) ?? AbstractComponent.deserialize(elemData);
|
102
101
|
return component;
|
@@ -5,7 +5,7 @@ import SerializableCommand from './SerializableCommand.mjs';
|
|
5
5
|
const invertCommand = (command) => {
|
6
6
|
if (command instanceof SerializableCommand) {
|
7
7
|
// SerializableCommand that does the inverse of [command]
|
8
|
-
return new class extends SerializableCommand {
|
8
|
+
return new (class extends SerializableCommand {
|
9
9
|
constructor() {
|
10
10
|
super(...arguments);
|
11
11
|
// For debugging
|
@@ -26,11 +26,11 @@ const invertCommand = (command) => {
|
|
26
26
|
description(editor, localizationTable) {
|
27
27
|
return localizationTable.inverseOf(command.description(editor, localizationTable));
|
28
28
|
}
|
29
|
-
}('inverse');
|
29
|
+
})('inverse');
|
30
30
|
}
|
31
31
|
else {
|
32
32
|
// Command that does the inverse of [command].
|
33
|
-
const result = new class extends Command {
|
33
|
+
const result = new (class extends Command {
|
34
34
|
apply(editor) {
|
35
35
|
command.unapply(editor);
|
36
36
|
}
|
@@ -43,7 +43,7 @@ const invertCommand = (command) => {
|
|
43
43
|
description(editor, localizationTable) {
|
44
44
|
return localizationTable.inverseOf(command.description(editor, localizationTable));
|
45
45
|
}
|
46
|
-
};
|
46
|
+
})();
|
47
47
|
// We know that T does not extend SerializableCommand, and thus returning a Command
|
48
48
|
// is appropriate.
|
49
49
|
return result;
|
@@ -4,4 +4,4 @@ import Erase from './Erase';
|
|
4
4
|
import invertCommand from './invertCommand';
|
5
5
|
import SerializableCommand from './SerializableCommand';
|
6
6
|
import uniteCommands from './uniteCommands';
|
7
|
-
export { Command, Duplicate, Erase, SerializableCommand, invertCommand, uniteCommands
|
7
|
+
export { Command, Duplicate, Erase, SerializableCommand, invertCommand, uniteCommands };
|