@node-projects/web-component-designer 0.1.90 → 0.1.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/images/tools/PanTool.svg +5 -0
- package/config/elements-native.json +1 -0
- package/dist/elements/helper/ElementHelper.js +9 -4
- package/dist/elements/helper/SelectionHelper.d.ts +2 -0
- package/dist/elements/helper/SelectionHelper.js +51 -0
- package/dist/elements/helper/TransformHelper.js +5 -0
- package/dist/elements/item/DesignItem.d.ts +1 -0
- package/dist/elements/item/DesignItem.js +10 -0
- package/dist/elements/item/IDesignItem.d.ts +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +1 -1
- package/dist/elements/services/dragDropService/DragDropService.js +1 -2
- package/dist/elements/services/placementService/AbsolutePlacementService.d.ts +19 -0
- package/dist/elements/services/placementService/AbsolutePlacementService.js +153 -0
- package/dist/elements/services/placementService/DefaultPlacementService copy.d.ts +19 -0
- package/dist/elements/services/placementService/DefaultPlacementService copy.js +151 -0
- package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -1
- package/dist/elements/services/placementService/DefaultPlacementService.js +3 -1
- package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -1
- package/dist/elements/services/placementService/FlexBoxPlacementService.js +1 -1
- package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -1
- package/dist/elements/services/placementService/GridPlacementService.js +1 -1
- package/dist/elements/services/placementService/IPlacementService.d.ts +1 -1
- package/dist/elements/services/propertiesService/propertyEditors/FontPropertyEditor.d.ts +2 -1
- package/dist/elements/services/propertiesService/propertyEditors/FontPropertyEditor.js +9 -6
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +0 -1
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +0 -9
- package/dist/elements/widgets/designerView/extensions/AltToEnterContainerExtension.js +1 -1
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +2 -8
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +60 -53
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts +1 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js +5 -1
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +3 -3
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +15 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +2 -1
- package/dist/elements/widgets/designerView/extensions/ExtensionType.js +2 -1
- package/dist/elements/widgets/designerView/extensions/GrayOutExtension.d.ts +0 -2
- package/dist/elements/widgets/designerView/extensions/GrayOutExtension.js +6 -9
- package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -0
- package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +2 -1
- package/dist/elements/widgets/designerView/tools/PointerTool.js +26 -10
- package/dist/elements/widgets/designerView/tools/TextTool.js +3 -5
- package/dist/elements/widgets/designerView/tools/toolBar/buttons/PointerToolButtonProvider.js +4 -1
- package/dist/elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.d.ts +5 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.js +37 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.d.ts +3 -3
- package/dist/elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.js +6 -33
- package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup copy.d.ts +6 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup copy.js +49 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.d.ts +4 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.js +16 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup copy.d.ts +6 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup copy.js +49 -0
- package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.d.ts +2 -4
- package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.js +3 -36
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/package.json +24 -24
|
@@ -5,8 +5,12 @@ export class FontPropertyEditor extends BasePropertyEditor {
|
|
|
5
5
|
super(property);
|
|
6
6
|
let element = document.createElement("select");
|
|
7
7
|
this.element = element;
|
|
8
|
+
FontPropertyEditor.addFontsToSelect(element);
|
|
9
|
+
this.element.onchange = (e) => this._valueChanged(this.element.value);
|
|
10
|
+
}
|
|
11
|
+
static addFontsToSelect(select) {
|
|
8
12
|
if (FontPropertyEditor.fontList) {
|
|
9
|
-
|
|
13
|
+
FontPropertyEditor.parseFontList(select);
|
|
10
14
|
//@ts-ignore
|
|
11
15
|
}
|
|
12
16
|
else if (window.queryLocalFonts) {
|
|
@@ -14,22 +18,21 @@ export class FontPropertyEditor extends BasePropertyEditor {
|
|
|
14
18
|
window.queryLocalFonts().then(x => {
|
|
15
19
|
//@ts-ignore
|
|
16
20
|
FontPropertyEditor.fontList = [...new Set(x.map(y => y.family))];
|
|
17
|
-
|
|
21
|
+
FontPropertyEditor.parseFontList(select);
|
|
18
22
|
});
|
|
19
23
|
}
|
|
20
24
|
else {
|
|
21
25
|
FontPropertyEditor.fontList = ["Verdana", "Arial", "Tahoma", "Trebuchet MS", "Times New Roman", "Georgia", "Garamond", "Courier New", "Brush Script MT"];
|
|
22
|
-
|
|
26
|
+
FontPropertyEditor.parseFontList(select);
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
|
-
parseFontList() {
|
|
29
|
+
static parseFontList(select) {
|
|
26
30
|
for (let v of FontPropertyEditor.fontList) {
|
|
27
31
|
let option = document.createElement("option");
|
|
28
32
|
option.value = v;
|
|
29
33
|
option.text = v;
|
|
30
|
-
|
|
34
|
+
select.appendChild(option);
|
|
31
35
|
}
|
|
32
|
-
this.element.onchange = (e) => this._valueChanged(this.element.value);
|
|
33
36
|
}
|
|
34
37
|
refreshValue(valueType, value) {
|
|
35
38
|
this.element.value = value;
|
|
@@ -32,7 +32,6 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
|
|
|
32
32
|
canvasOffset: IPoint;
|
|
33
33
|
canvas: HTMLElement;
|
|
34
34
|
additionalStyles: CSSStyleSheet[];
|
|
35
|
-
eatEvents: Element;
|
|
36
35
|
initialize(serviceContainer: ServiceContainer): any;
|
|
37
36
|
getNormalizedEventCoordinates(event: MouseEvent): IPoint;
|
|
38
37
|
getViewportCoordinates(event: MouseEvent): IPoint;
|
|
@@ -31,7 +31,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
|
|
|
31
31
|
snapLines: Snaplines;
|
|
32
32
|
overlayLayer: OverlayLayerView;
|
|
33
33
|
rootDesignItem: IDesignItem;
|
|
34
|
-
eatEvents: Element;
|
|
35
34
|
private _currentPasteOffset;
|
|
36
35
|
private _zoomFactor;
|
|
37
36
|
private _scaleFactor;
|
|
@@ -58,7 +58,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
58
58
|
snapLines;
|
|
59
59
|
overlayLayer;
|
|
60
60
|
rootDesignItem;
|
|
61
|
-
eatEvents;
|
|
62
61
|
_currentPasteOffset = this.pasteOffset;
|
|
63
62
|
_zoomFactor = 1; //if scale or zoom css property is used this needs to be the value
|
|
64
63
|
_scaleFactor = 1; //if scale css property is used this need to be the scale value
|
|
@@ -869,8 +868,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
869
868
|
}
|
|
870
869
|
}
|
|
871
870
|
onKeyUp(event) {
|
|
872
|
-
if (event.composedPath().indexOf(this.eatEvents) >= 0)
|
|
873
|
-
return;
|
|
874
871
|
if (this._moveGroup) {
|
|
875
872
|
this._moveGroup.commit();
|
|
876
873
|
this._moveGroup = null;
|
|
@@ -878,8 +875,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
878
875
|
event.preventDefault();
|
|
879
876
|
}
|
|
880
877
|
onKeyDown(event) {
|
|
881
|
-
if (event.composedPath().indexOf(this.eatEvents) >= 0)
|
|
882
|
-
return;
|
|
883
878
|
if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey)
|
|
884
879
|
this.executeCommand({ type: CommandType.undo, ctrlKey: event.ctrlKey, altKey: event.altKey, shiftKey: event.shiftKey });
|
|
885
880
|
else if ((event.ctrlKey || event.metaKey) && event.key === 'z' && event.shiftKey)
|
|
@@ -1040,8 +1035,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
1040
1035
|
for (let pe of this._pointerextensions)
|
|
1041
1036
|
pe.refresh(event);
|
|
1042
1037
|
}
|
|
1043
|
-
if (event.composedPath().indexOf(this.eatEvents) >= 0)
|
|
1044
|
-
return;
|
|
1045
1038
|
let currentElement;
|
|
1046
1039
|
if (forceElement)
|
|
1047
1040
|
currentElement = forceElement;
|
|
@@ -1072,8 +1065,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
1072
1065
|
this.showHoverExtension(currentDesignItem.element, event);
|
|
1073
1066
|
//TODO: needed ??
|
|
1074
1067
|
if (currentElement && DomHelper.getHost(currentElement.parentNode) === this.overlayLayer) {
|
|
1075
|
-
if (this.eatEvents)
|
|
1076
|
-
return;
|
|
1077
1068
|
currentElement = this.instanceServiceContainer.selectionService.primarySelection?.element ?? this._canvas;
|
|
1078
1069
|
}
|
|
1079
1070
|
let tool = this.serviceContainer.globalContext.tool ?? this.serviceContainer.designerTools.get(NamedTools.Pointer);
|
|
@@ -10,7 +10,7 @@ export class AltToEnterContainerExtension extends AbstractExtension {
|
|
|
10
10
|
}
|
|
11
11
|
refresh() {
|
|
12
12
|
const itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
|
|
13
|
-
this._text = this._drawText("Press ALT to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foreground);
|
|
13
|
+
this._text = this._drawText("Press ALT (or hold) to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foreground);
|
|
14
14
|
this._text.style.fontSize = (14 / this.designerCanvas.scaleFactor) + 'px';
|
|
15
15
|
this._text.setAttribute('x', '' + (itemRect.x + 5 / this.designerCanvas.scaleFactor));
|
|
16
16
|
this._text.setAttribute('y', '' + (itemRect.y + 12 / this.designerCanvas.scaleFactor));
|
|
@@ -7,18 +7,12 @@ export type handlesPointerEvent = {
|
|
|
7
7
|
};
|
|
8
8
|
export declare class EditTextExtension extends AbstractExtension implements handlesPointerEvent {
|
|
9
9
|
private static template;
|
|
10
|
-
private _contentEditedBound;
|
|
11
|
-
private _blurBound;
|
|
12
|
-
private _blurTimeout;
|
|
13
10
|
private _foreignObject;
|
|
14
|
-
private
|
|
11
|
+
private _path;
|
|
15
12
|
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
16
13
|
extend(): void;
|
|
17
14
|
refresh(): void;
|
|
18
15
|
dispose(): void;
|
|
19
16
|
handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
|
|
20
|
-
|
|
21
|
-
_blur(): void;
|
|
22
|
-
_focus(): void;
|
|
23
|
-
_formatSelection(type: string): void;
|
|
17
|
+
_formatSelection(type: string, value?: string): void;
|
|
24
18
|
}
|
|
@@ -1,96 +1,103 @@
|
|
|
1
1
|
import { html } from "@node-projects/base-custom-webcomponent";
|
|
2
2
|
import { AbstractExtension } from "../AbstractExtension.js";
|
|
3
|
-
import { ExtensionType } from "../ExtensionType.js";
|
|
4
3
|
import { OverlayLayer } from "../OverlayLayer.js";
|
|
4
|
+
import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from "../../../../helper/TransformHelper.js";
|
|
5
|
+
import { shadowrootGetSelection, wrapSelectionInSpans } from "../../../../helper/SelectionHelper.js";
|
|
6
|
+
import { FontPropertyEditor } from "../../../../services/propertiesService/propertyEditors/FontPropertyEditor.js";
|
|
5
7
|
export class EditTextExtension extends AbstractExtension {
|
|
6
8
|
static template = html `
|
|
7
|
-
<div style="height: 24px; display: flex;">
|
|
8
|
-
<button data-command="
|
|
9
|
-
<button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
|
|
10
|
-
<button data-command="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
|
|
11
|
-
<button data-command="
|
|
9
|
+
<div style="height: 24px; display: flex; gap: 2px;">
|
|
10
|
+
<button data-command="font-weight" data-command-parameter="800" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
|
|
11
|
+
<button data-command="font-style" data-command-parameter="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
|
|
12
|
+
<button data-command="text-decoration" data-command-parameter="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
|
|
13
|
+
<button data-command="text-decoration" data-command-parameter="line-through" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
|
|
14
|
+
<button data-command="text-decoration" data-command-parameter="overline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><span style="text-decoration: overline">o</span></button>
|
|
15
|
+
<select data-command="fontSize" style="pointer-events: all; height: 24px; width: 60px; padding: 0;">
|
|
16
|
+
<option>8px</option>
|
|
17
|
+
<option>9px</option>
|
|
18
|
+
<option>10px</option>
|
|
19
|
+
<option>11px</option>
|
|
20
|
+
<option>12px</option>
|
|
21
|
+
<option>14px</option>
|
|
22
|
+
<option>16px</option>
|
|
23
|
+
<option>18px</option>
|
|
24
|
+
<option>20px</option>
|
|
25
|
+
<option>24px</option>
|
|
26
|
+
<option>28px</option>
|
|
27
|
+
<option>32px</option>
|
|
28
|
+
<option>36px</option>
|
|
29
|
+
</select>
|
|
30
|
+
<select id="fontFamily" data-command="font-family" style="pointer-events: all; height: 24px; width: 90px; padding: 0;">
|
|
31
|
+
|
|
32
|
+
</select>
|
|
12
33
|
</div>
|
|
13
34
|
`;
|
|
14
|
-
_contentEditedBound;
|
|
15
|
-
_blurBound;
|
|
16
|
-
_blurTimeout;
|
|
17
35
|
_foreignObject;
|
|
18
|
-
|
|
36
|
+
_path;
|
|
19
37
|
constructor(extensionManager, designerView, extendedItem) {
|
|
20
38
|
super(extensionManager, designerView, extendedItem);
|
|
21
|
-
this._contentEditedBound = this._contentEdited.bind(this);
|
|
22
|
-
this._blurBound = this._blur.bind(this);
|
|
23
|
-
this._focusBound = this._focus.bind(this);
|
|
24
39
|
}
|
|
25
40
|
extend() {
|
|
26
41
|
//TODO: -> check what to do with extensions, do not loose edit on mouse click,...
|
|
27
42
|
//maybe use a html edit framework
|
|
28
43
|
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
29
|
-
|
|
30
|
-
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelectionAndCanBeEntered);
|
|
31
|
-
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
|
|
44
|
+
this.extendedItem.removeDesignerAttributesAndStylesFromChildren();
|
|
32
45
|
this.extendedItem.element.setAttribute('contenteditable', '');
|
|
33
|
-
this.extendedItem.element.addEventListener('input', this._contentEditedBound);
|
|
34
46
|
this.extendedItem.element.focus();
|
|
35
|
-
this.designerCanvas.eatEvents = this.extendedItem.element;
|
|
36
47
|
let itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
37
48
|
const elements = EditTextExtension.template.content.cloneNode(true);
|
|
38
|
-
|
|
49
|
+
FontPropertyEditor.addFontsToSelect(elements.querySelector('#fontFamily'));
|
|
50
|
+
elements.querySelectorAll('button').forEach(x => x.onpointerdown = () => this._formatSelection(x.dataset['command'], x.dataset['commandParameter']));
|
|
51
|
+
elements.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
|
|
52
|
+
//Button overlay
|
|
39
53
|
const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
40
54
|
this._foreignObject = foreignObject;
|
|
41
55
|
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
42
56
|
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
43
|
-
foreignObject.setAttribute('width', '
|
|
57
|
+
foreignObject.setAttribute('width', '300');
|
|
44
58
|
foreignObject.setAttribute('height', '24');
|
|
45
59
|
foreignObject.appendChild(elements);
|
|
46
60
|
this._addOverlay(foreignObject, OverlayLayer.Foreground);
|
|
61
|
+
//TODO - nice way to disable click overlay
|
|
47
62
|
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
48
|
-
|
|
49
|
-
this.
|
|
63
|
+
//overlay to detect click outside
|
|
64
|
+
this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
65
|
+
this._path.setAttribute('class', 'svg-edit-text-clickoutside');
|
|
66
|
+
this._path.setAttribute('fill-rule', 'evenodd');
|
|
67
|
+
this._path.style.pointerEvents = 'auto';
|
|
68
|
+
this._path.onpointerdown = (e) => {
|
|
69
|
+
this.extensionManager.removeExtensionInstance(this.extendedItem, this);
|
|
70
|
+
};
|
|
71
|
+
this._addOverlay(this._path, OverlayLayer.Background);
|
|
72
|
+
let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
|
|
73
|
+
let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
|
|
74
|
+
let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
|
|
75
|
+
data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
|
|
76
|
+
this._path.setAttribute("d", data);
|
|
50
77
|
}
|
|
51
78
|
refresh() {
|
|
52
|
-
this.
|
|
79
|
+
let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
|
|
80
|
+
let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
|
|
81
|
+
let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
|
|
82
|
+
data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
|
|
83
|
+
this._path.setAttribute("d", data);
|
|
53
84
|
}
|
|
54
85
|
dispose() {
|
|
55
86
|
this._removeAllOverlays();
|
|
56
87
|
this.extendedItem.element.removeAttribute('contenteditable');
|
|
57
|
-
this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
|
|
58
|
-
this.extendedItem.element.removeEventListener('blur', this._blurBound);
|
|
59
|
-
this.designerCanvas.eatEvents = null;
|
|
60
88
|
this.extendedItem.updateChildrenFromNodesChildren();
|
|
61
89
|
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
62
90
|
}
|
|
63
91
|
handlesPointerEvent(designerCanvas, event, currentElement) {
|
|
64
|
-
|
|
92
|
+
const p = event.composedPath();
|
|
65
93
|
const stylo = this._foreignObject.querySelector('stylo-editor');
|
|
66
94
|
return p.indexOf(stylo) >= 0;
|
|
67
95
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
_blur() {
|
|
74
|
-
if (!this._blurTimeout) {
|
|
75
|
-
this._blurTimeout = setTimeout(() => {
|
|
76
|
-
//TODO: don't remove doubleclick extension (another type could be used), remove extension itself
|
|
77
|
-
//maybe also configureable when when to remove the extension
|
|
78
|
-
this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
|
|
79
|
-
}, 150);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
_focus() {
|
|
83
|
-
if (this._blurTimeout) {
|
|
84
|
-
clearTimeout(this._blurTimeout);
|
|
85
|
-
this._blurTimeout = null;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
_formatSelection(type) {
|
|
89
|
-
if (this._blurTimeout)
|
|
90
|
-
clearTimeout(this._blurTimeout);
|
|
91
|
-
this._blurTimeout = null;
|
|
92
|
-
//const selection = <Selection>(<any>this.designerView.shadowRoot).getSelection()
|
|
93
|
-
document.execCommand(type, false, null);
|
|
96
|
+
_formatSelection(type, value) {
|
|
97
|
+
const selection = shadowrootGetSelection(this.designerCanvas.rootDesignItem.element.shadowRoot);
|
|
98
|
+
const spans = wrapSelectionInSpans(selection);
|
|
99
|
+
for (const span of spans)
|
|
100
|
+
span.style[type] = value;
|
|
94
101
|
this.extendedItem.element.focus();
|
|
95
102
|
}
|
|
96
103
|
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts
CHANGED
|
@@ -6,4 +6,5 @@ import { IExtensionManager } from '../IExtensionManger.js';
|
|
|
6
6
|
export declare class EditTextExtensionProvider implements IDesignerExtensionProvider {
|
|
7
7
|
shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
8
8
|
getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
9
|
+
readonly style: CSSStyleSheet;
|
|
9
10
|
}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { EditTextExtension } from "./EditTextExtension.js";
|
|
2
|
+
import { css } from '@node-projects/base-custom-webcomponent';
|
|
2
3
|
export class EditTextExtensionProvider {
|
|
3
4
|
shouldExtend(extensionManager, designerView, designItem) {
|
|
4
|
-
if (designItem.name === '
|
|
5
|
+
if (designItem.name === 'input')
|
|
5
6
|
return false;
|
|
6
7
|
return true;
|
|
7
8
|
}
|
|
8
9
|
getExtension(extensionManager, designerView, designItem) {
|
|
9
10
|
return new EditTextExtension(extensionManager, designerView, designItem);
|
|
10
11
|
}
|
|
12
|
+
style = css `
|
|
13
|
+
.svg-edit-text-clickoutside { stroke: transparent; fill: lightgray; opacity: 0.7 }
|
|
14
|
+
`;
|
|
11
15
|
}
|
|
@@ -19,7 +19,8 @@ export class ElementDragTitleExtension extends AbstractExtension {
|
|
|
19
19
|
let text = this.extendedItem.name;
|
|
20
20
|
this._width = Math.max(Math.min(elementWidth, w), extensionWidth);
|
|
21
21
|
this._rect = this._drawRect(transformedCornerPoints[0].x, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-primary-selection-move', this._rect);
|
|
22
|
-
this._text = this._drawHTML('<span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">' + text + '</span>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
|
|
22
|
+
this._text = this._drawHTML('<div style="position:relative"><span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transform-origin: 0 0;">' + text + '</span></div>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
|
|
23
|
+
this._text.style.overflow = 'visible';
|
|
23
24
|
this._rect.addEventListener('pointerdown', (e) => this._pointerEvent(e));
|
|
24
25
|
this._rect.addEventListener('pointermove', (e) => this._pointerEvent(e));
|
|
25
26
|
this._rect.addEventListener('pointerup', (e) => this._pointerEvent(e));
|
|
@@ -47,8 +48,7 @@ export class ElementDragTitleExtension extends AbstractExtension {
|
|
|
47
48
|
this._text.style.fontSize = (10 / this.designerCanvas.scaleFactor) + 'px';
|
|
48
49
|
this._text.setAttribute('height', '' + h);
|
|
49
50
|
this._text.setAttribute('width', '' + w);
|
|
50
|
-
this._text.style.
|
|
51
|
-
this._text.style.rotate = angle + 'deg';
|
|
51
|
+
this._text.children[0].children[0].style.rotate = angle + 'deg';
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -15,6 +15,7 @@ export declare class ExtensionManager implements IExtensionManager {
|
|
|
15
15
|
private _selectedElementsChanged;
|
|
16
16
|
applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
|
|
17
17
|
applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): void;
|
|
18
|
+
applyExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
|
|
18
19
|
removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
|
|
19
20
|
removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): void;
|
|
20
21
|
removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): void;
|
|
@@ -142,6 +142,20 @@ export class ExtensionManager {
|
|
|
142
142
|
}
|
|
143
143
|
this.designerCanvas.overlayLayer.endBatch();
|
|
144
144
|
}
|
|
145
|
+
applyExtensionInstance(designItem, extension) {
|
|
146
|
+
let appE = designItem.appliedDesignerExtensions.get(ExtensionType.Directly);
|
|
147
|
+
if (!appE)
|
|
148
|
+
appE = [];
|
|
149
|
+
try {
|
|
150
|
+
extension.extend(null, null);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
console.error(err);
|
|
154
|
+
}
|
|
155
|
+
appE.push(extension);
|
|
156
|
+
designItem.appliedDesignerExtensions.set(ExtensionType.Directly, appE);
|
|
157
|
+
this.designItemsWithExtentions.add(designItem);
|
|
158
|
+
}
|
|
145
159
|
removeExtensionInstance(designItem, extension) {
|
|
146
160
|
for (let e of designItem.appliedDesignerExtensions) {
|
|
147
161
|
const idx = e[1].indexOf(extension);
|
|
@@ -341,6 +355,7 @@ export class ExtensionManager {
|
|
|
341
355
|
refreshAllExtensions(designItems, ignoredExtension) {
|
|
342
356
|
this.designerCanvas.overlayLayer.startBatch();
|
|
343
357
|
if (designItems) {
|
|
358
|
+
this.refreshExtensions(designItems, ExtensionType.Directly, null, ignoredExtension);
|
|
344
359
|
this.refreshExtensions(designItems, ExtensionType.Permanent, null, ignoredExtension);
|
|
345
360
|
this.refreshExtensions(designItems, ExtensionType.Selection, null, ignoredExtension);
|
|
346
361
|
this.refreshExtensions(designItems, ExtensionType.PrimarySelection, null, ignoredExtension);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare enum ExtensionType {
|
|
2
|
+
Directly = 0,//Extensions wich are applied directly, for example from Text Edit Tool
|
|
2
3
|
Permanent = 1,
|
|
3
4
|
Selection = 2,
|
|
4
5
|
PrimarySelection = 3,
|
|
@@ -22,7 +23,7 @@ export declare enum ExtensionType {
|
|
|
22
23
|
Placement = 12,
|
|
23
24
|
/**
|
|
24
25
|
* Extensions only when the container can be Entered.
|
|
25
|
-
* So for Example on a
|
|
26
|
+
* So for Example on a custom webcomponent wich uses a grid layout for it's root, but can not show children,
|
|
26
27
|
* do not display grid extension.
|
|
27
28
|
*/
|
|
28
29
|
PrimarySelectionAndCanBeEntered = 13,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export var ExtensionType;
|
|
2
2
|
(function (ExtensionType) {
|
|
3
|
+
ExtensionType[ExtensionType["Directly"] = 0] = "Directly";
|
|
3
4
|
ExtensionType[ExtensionType["Permanent"] = 1] = "Permanent";
|
|
4
5
|
ExtensionType[ExtensionType["Selection"] = 2] = "Selection";
|
|
5
6
|
ExtensionType[ExtensionType["PrimarySelection"] = 3] = "PrimarySelection";
|
|
@@ -23,7 +24,7 @@ export var ExtensionType;
|
|
|
23
24
|
ExtensionType[ExtensionType["Placement"] = 12] = "Placement";
|
|
24
25
|
/**
|
|
25
26
|
* Extensions only when the container can be Entered.
|
|
26
|
-
* So for Example on a
|
|
27
|
+
* So for Example on a custom webcomponent wich uses a grid layout for it's root, but can not show children,
|
|
27
28
|
* do not display grid extension.
|
|
28
29
|
*/
|
|
29
30
|
ExtensionType[ExtensionType["PrimarySelectionAndCanBeEntered"] = 13] = "PrimarySelectionAndCanBeEntered";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { IRect } from '../../../../interfaces/IRect.js';
|
|
2
1
|
import { IDesignItem } from '../../../item/IDesignItem.js';
|
|
3
2
|
import { IDesignerCanvas } from '../IDesignerCanvas.js';
|
|
4
3
|
import { AbstractExtension } from './AbstractExtension.js';
|
|
@@ -8,6 +7,5 @@ export declare class GrayOutExtension extends AbstractExtension {
|
|
|
8
7
|
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
9
8
|
extend(): void;
|
|
10
9
|
refresh(): void;
|
|
11
|
-
drawGrayOut(r: IRect): void;
|
|
12
10
|
dispose(): void;
|
|
13
11
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
|
|
1
2
|
import { AbstractExtension } from './AbstractExtension.js';
|
|
2
3
|
import { OverlayLayer } from "./OverlayLayer.js";
|
|
3
4
|
export class GrayOutExtension extends AbstractExtension {
|
|
@@ -12,18 +13,14 @@ export class GrayOutExtension extends AbstractExtension {
|
|
|
12
13
|
if (!this._path) {
|
|
13
14
|
this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
14
15
|
this._path.setAttribute('class', 'svg-gray-out');
|
|
16
|
+
this._path.setAttribute('fill-rule', 'evenodd');
|
|
15
17
|
this._addOverlay(this._path, OverlayLayer.Background);
|
|
16
18
|
}
|
|
17
|
-
let
|
|
18
|
-
this.drawGrayOut(normalizedRect);
|
|
19
|
-
}
|
|
20
|
-
drawGrayOut(r) {
|
|
19
|
+
let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
|
|
21
20
|
let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"M" + (r.x + r.width) + " " + r.y + "L" + (r.x + r.width) + " " + (r.y + r.height) + "L" + outsideRect.width + " " + (r.y + r.height) + "L" + outsideRect.width + " " + (r.y) + "L" + (r.x + r.width) + " " + r.y;
|
|
26
|
-
this._path.setAttribute("d", pathPoints);
|
|
21
|
+
let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
|
|
22
|
+
data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
|
|
23
|
+
this._path.setAttribute("d", data);
|
|
27
24
|
}
|
|
28
25
|
dispose() {
|
|
29
26
|
this._removeAllOverlays();
|
|
@@ -4,6 +4,7 @@ import { IDesignerExtension } from './IDesignerExtension.js';
|
|
|
4
4
|
export interface IExtensionManager {
|
|
5
5
|
applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
|
|
6
6
|
applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): any;
|
|
7
|
+
applyExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
|
|
7
8
|
removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): any;
|
|
8
9
|
removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): any;
|
|
9
10
|
removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
|
|
@@ -15,10 +15,11 @@ export declare class PointerTool implements ITool {
|
|
|
15
15
|
private _copiedItemsInserted;
|
|
16
16
|
private _previousEventName;
|
|
17
17
|
private _dragOverExtensionItem;
|
|
18
|
-
private
|
|
18
|
+
private _dragParentExtensionItem;
|
|
19
19
|
private _moveItemsOffset;
|
|
20
20
|
private _initialOffset;
|
|
21
21
|
private _started;
|
|
22
|
+
private _holdTimeout;
|
|
22
23
|
private _firstTimeInMove;
|
|
23
24
|
private _secondTimeInMove;
|
|
24
25
|
private _changeGroup;
|
|
@@ -14,11 +14,11 @@ export class PointerTool {
|
|
|
14
14
|
_copiedItemsInserted = false;
|
|
15
15
|
_previousEventName;
|
|
16
16
|
_dragOverExtensionItem;
|
|
17
|
-
|
|
17
|
+
_dragParentExtensionItem;
|
|
18
18
|
_moveItemsOffset = { x: 0, y: 0 };
|
|
19
19
|
_initialOffset;
|
|
20
20
|
_started = false;
|
|
21
|
-
;
|
|
21
|
+
_holdTimeout;
|
|
22
22
|
_firstTimeInMove;
|
|
23
23
|
_secondTimeInMove;
|
|
24
24
|
_changeGroup;
|
|
@@ -154,7 +154,11 @@ export class PointerTool {
|
|
|
154
154
|
drawSelectionTool.pointerEventHandler(designerView, event, currentElement);
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
|
-
async _pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint) {
|
|
157
|
+
async _pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint, raisedFromHold = false) {
|
|
158
|
+
if (this._holdTimeout) {
|
|
159
|
+
clearTimeout(this._holdTimeout);
|
|
160
|
+
this._holdTimeout = null;
|
|
161
|
+
}
|
|
158
162
|
if (event.altKey) {
|
|
159
163
|
if (event.type == EventNames.PointerDown) {
|
|
160
164
|
const currentSelection = designerCanvas.instanceServiceContainer.selectionService.primarySelection;
|
|
@@ -235,10 +239,10 @@ export class PointerTool {
|
|
|
235
239
|
const currentContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle));
|
|
236
240
|
if (currentContainerService) {
|
|
237
241
|
const dragItem = this._actionStartedDesignItem.parent;
|
|
238
|
-
if (this.
|
|
239
|
-
designerCanvas.extensionManager.removeExtension(this.
|
|
242
|
+
if (this._dragParentExtensionItem != dragItem) {
|
|
243
|
+
designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
|
|
240
244
|
designerCanvas.extensionManager.applyExtension(dragItem, ExtensionType.ContainerDrag, event);
|
|
241
|
-
this.
|
|
245
|
+
this._dragParentExtensionItem = dragItem;
|
|
242
246
|
}
|
|
243
247
|
else {
|
|
244
248
|
designerCanvas.extensionManager.refreshExtension(dragItem, ExtensionType.ContainerDrag);
|
|
@@ -266,15 +270,26 @@ export class PointerTool {
|
|
|
266
270
|
}
|
|
267
271
|
}
|
|
268
272
|
}
|
|
269
|
-
if (newContainerService
|
|
273
|
+
if (newContainerService) {
|
|
274
|
+
this._holdTimeout = setTimeout(() => {
|
|
275
|
+
this._pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint, true);
|
|
276
|
+
}, 1000);
|
|
277
|
+
}
|
|
278
|
+
if (newContainerService && (event.altKey || raisedFromHold)) {
|
|
270
279
|
//TODO: all items, fix position
|
|
271
280
|
const oldOffset = currentContainerService.getElementOffset(this._actionStartedDesignItem.parent, this._actionStartedDesignItem);
|
|
272
281
|
const newOffset = newContainerService.getElementOffset(newContainerElementDesignItem, this._actionStartedDesignItem);
|
|
273
282
|
this._moveItemsOffset = { x: newOffset.x - oldOffset.x + this._moveItemsOffset.x, y: newOffset.y - oldOffset.y + this._moveItemsOffset.y };
|
|
274
283
|
currentContainerService.leaveContainer(this._actionStartedDesignItem.parent, this._actionStartedDesignItems);
|
|
275
284
|
const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
|
|
276
|
-
newContainerService.enterContainer(newContainerElementDesignItem, this._actionStartedDesignItems);
|
|
285
|
+
newContainerService.enterContainer(newContainerElementDesignItem, this._actionStartedDesignItems, 'normal');
|
|
277
286
|
newContainerService.place(event, designerCanvas, this._actionStartedDesignItem.parent, this._initialPoint, this._initialOffset, cp, this._actionStartedDesignItems);
|
|
287
|
+
designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
|
|
288
|
+
designerCanvas.extensionManager.applyExtension(newContainerElementDesignItem, ExtensionType.ContainerDrag, event);
|
|
289
|
+
this._dragParentExtensionItem = newContainerElementDesignItem;
|
|
290
|
+
designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerDragOverAndCanBeEntered);
|
|
291
|
+
this._dragOverExtensionItem = null;
|
|
292
|
+
designerCanvas.extensionManager.refreshAllAppliedExtentions();
|
|
278
293
|
}
|
|
279
294
|
else {
|
|
280
295
|
const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
|
|
@@ -334,8 +349,8 @@ export class PointerTool {
|
|
|
334
349
|
this._changeGroup.abort();
|
|
335
350
|
this._changeGroup = null;
|
|
336
351
|
}
|
|
337
|
-
designerCanvas.extensionManager.removeExtension(this.
|
|
338
|
-
this.
|
|
352
|
+
designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
|
|
353
|
+
this._dragParentExtensionItem = null;
|
|
339
354
|
designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerDragOverAndCanBeEntered);
|
|
340
355
|
this._dragOverExtensionItem = null;
|
|
341
356
|
this._moveItemsOffset = { x: 0, y: 0 };
|
|
@@ -373,6 +388,7 @@ export class PointerTool {
|
|
|
373
388
|
let newContainerService = null;
|
|
374
389
|
const designerCanvas = designItem.instanceServiceContainer.designerCanvas;
|
|
375
390
|
const elementsFromPoint = designerCanvas.elementsFromPoint(event.x, event.y);
|
|
391
|
+
elementsFromPoint.push(designerCanvas.rootDesignItem.element);
|
|
376
392
|
for (let e of elementsFromPoint) {
|
|
377
393
|
if (e == designItem.element) {
|
|
378
394
|
continue;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventNames } from '../../../../enums/EventNames.js';
|
|
2
2
|
import { DesignItem } from '../../../item/DesignItem.js';
|
|
3
3
|
import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction.js';
|
|
4
|
-
import {
|
|
4
|
+
import { EditTextExtension } from '../extensions/EditText/EditTextExtension.js';
|
|
5
5
|
export class TextTool {
|
|
6
6
|
_textEditExtensions;
|
|
7
7
|
constructor(editExistingText) {
|
|
@@ -28,10 +28,8 @@ export class TextTool {
|
|
|
28
28
|
di.setStyle('left', currentPoint.x + 'px');
|
|
29
29
|
di.setStyle('top', currentPoint.y + 'px');
|
|
30
30
|
designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//should we configure the editTextExtension anywhere??
|
|
34
|
-
this._textEditExtensions = designerCanvas.extensionManager.applyExtension(di, ExtensionType.Doubleclick, event);
|
|
31
|
+
designerCanvas.extensionManager.applyExtensionInstance(di, new EditTextExtension(designerCanvas.extensionManager, designerCanvas, di));
|
|
32
|
+
designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
|
|
35
33
|
setTimeout(() => { span.focus(); }, 50);
|
|
36
34
|
}
|
|
37
35
|
else {
|
package/dist/elements/widgets/designerView/tools/toolBar/buttons/PointerToolButtonProvider.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { DesignerToolbarButton } from '../DesignerToolbarButton.js';
|
|
2
2
|
import { assetsPath } from "../../../../../../Constants.js";
|
|
3
|
+
import { PointerToolPopup } from "../popups/PointerToolPopup.js";
|
|
3
4
|
export class PointerToolButtonProvider {
|
|
4
5
|
provideButton(designerCanvas) {
|
|
5
|
-
|
|
6
|
+
const button = new DesignerToolbarButton(designerCanvas, { 'Pointer': { icon: assetsPath + 'images/tools/PointerTool.svg' } });
|
|
7
|
+
button.popup = PointerToolPopup;
|
|
8
|
+
return button;
|
|
6
9
|
}
|
|
7
10
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
export declare abstract class AbstractBaseToolPopup extends BaseCustomWebComponentConstructorAppend {
|
|
3
|
+
static style: CSSStyleSheet | CSSStyleSheet[];
|
|
4
|
+
constructor();
|
|
5
|
+
}
|