@node-projects/web-component-designer 0.0.90 → 0.0.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/elements/helper/KeyNameHelper.d.ts +0 -0
- package/dist/elements/helper/KeyNameHelper.js +1 -0
- package/dist/elements/helper/TransformHelper.d.ts +3 -0
- package/dist/elements/helper/TransformHelper.js +7 -0
- package/dist/elements/helper/contextMenu/ContextMenuHelper.js +2 -4
- package/dist/elements/helper/contextMenu/IContextmenuItem.d.ts +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +6 -0
- package/dist/elements/services/htmlWriterService/HtmlWriterService.js +3 -2
- package/dist/elements/widgets/codeView/code-view-monaco.js +3 -3
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +1 -0
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +1 -0
- package/dist/elements/widgets/designerView/designerCanvas.js +10 -1
- package/dist/elements/widgets/designerView/designerView.d.ts +2 -0
- package/dist/elements/widgets/designerView/designerView.js +35 -29
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js +0 -4
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.d.ts +1 -1
- package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +13 -10
- package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu copy.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu copy.js +15 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js +4 -5
- package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js +1 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js +0 -1
- package/dist/elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js +10 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu copy.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu copy.js +14 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.d.ts +8 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js +27 -0
- package/dist/elements/widgets/designerView/tools/TextTool.d.ts +0 -1
- package/dist/elements/widgets/designerView/tools/TextTool.js +15 -16
- package/dist/elements/widgets/paletteView/paletteTreeView.js +5 -2
- package/dist/elements/widgets/treeView/treeView.js +1 -3
- package/dist/elements/widgets/treeView/treeViewExtended.d.ts +1 -0
- package/dist/elements/widgets/treeView/treeViewExtended.js +13 -6
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# web-component-designer
|
|
2
2
|
|
|
3
|
-
## Caution - this is a preview Version, a
|
|
3
|
+
## Caution - this is a preview Version, a RC1 is now planed for May 2022 - it's already usable but big Refactoring could still happen
|
|
4
|
+
|
|
4
5
|
|
|
5
6
|
A HTML WebComponent for Designing Webcomponents and HTML Pages.
|
|
6
7
|
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -1 +1,4 @@
|
|
|
1
|
+
import { IPoint } from "../../index.js";
|
|
1
2
|
export declare function combineTransforms(helperElement: HTMLElement, element: HTMLElement, transform1: string, transform2: string): void;
|
|
3
|
+
export declare function getDomMatrix(element: HTMLElement): DOMMatrix;
|
|
4
|
+
export declare function convertCoordinates(point: IPoint, matrix: DOMMatrix): DOMPoint;
|
|
@@ -12,3 +12,10 @@ export function combineTransforms(helperElement, element, transform1, transform2
|
|
|
12
12
|
const result = matrix2.multiply(matrix1);
|
|
13
13
|
element.style.transform = result.toString();
|
|
14
14
|
}
|
|
15
|
+
export function getDomMatrix(element) {
|
|
16
|
+
return new DOMMatrix(window.getComputedStyle(element).transform);
|
|
17
|
+
}
|
|
18
|
+
export function convertCoordinates(point, matrix) {
|
|
19
|
+
let domPoint = new DOMPoint(point.x, point.y);
|
|
20
|
+
return domPoint.matrixTransform(matrix.inverse());
|
|
21
|
+
}
|
|
@@ -103,10 +103,8 @@ export class ContextMenuHelper {
|
|
|
103
103
|
window.removeEventListener('resize', this._closeBound);
|
|
104
104
|
window.removeEventListener('mousedown', this._closeOnDownBound);
|
|
105
105
|
window.removeEventListener('mouseup', this._closeOnUpBound);
|
|
106
|
-
if (this.
|
|
107
|
-
|
|
108
|
-
else
|
|
109
|
-
this._shadowRoot.removeChild(this._element);
|
|
106
|
+
if (this._element.parentElement)
|
|
107
|
+
this._element.parentElement.removeChild(this._element);
|
|
110
108
|
});
|
|
111
109
|
}
|
|
112
110
|
show() {
|
|
@@ -53,6 +53,8 @@ import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
|
|
|
53
53
|
import { HtmlWriterService } from './htmlWriterService/HtmlWriterService.js';
|
|
54
54
|
import { RectContextMenu } from '../widgets/designerView/extensions/contextMenu/RectContextMenu.js';
|
|
55
55
|
import { PathContextMenu } from '../widgets/designerView/extensions/contextMenu/PathContextMenu.js';
|
|
56
|
+
import { SeperatorContextMenu } from '../widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js';
|
|
57
|
+
import { ZoomToElementContextMenu } from '../widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js';
|
|
56
58
|
export function createDefaultServiceContainer() {
|
|
57
59
|
let serviceContainer = new ServiceContainer();
|
|
58
60
|
serviceContainer.register("propertyService", new PolymerPropertiesService());
|
|
@@ -124,10 +126,14 @@ export function createDefaultServiceContainer() {
|
|
|
124
126
|
serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons());
|
|
125
127
|
serviceContainer.designerContextMenuExtensions = [
|
|
126
128
|
new CopyPasteContextMenu(),
|
|
129
|
+
new SeperatorContextMenu(),
|
|
130
|
+
new ZoomToElementContextMenu(),
|
|
131
|
+
new SeperatorContextMenu(),
|
|
127
132
|
new ZMoveContextMenu(),
|
|
128
133
|
new MultipleItemsSelectedContextMenu(),
|
|
129
134
|
new PathContextMenu(),
|
|
130
135
|
new RectContextMenu(),
|
|
136
|
+
new SeperatorContextMenu(),
|
|
131
137
|
new ItemsBelowContextMenu(),
|
|
132
138
|
];
|
|
133
139
|
return serviceContainer;
|
|
@@ -68,11 +68,12 @@ export class HtmlWriterService extends AbstractHtmlWriterService {
|
|
|
68
68
|
}
|
|
69
69
|
else if (designItem.hasContent) {
|
|
70
70
|
indentedTextWriter.write(DomConverter.normalizeContentValue(designItem.content));
|
|
71
|
+
//this._conditionalyWriteNewline(indentedTextWriter, designItem);
|
|
71
72
|
}
|
|
72
73
|
if (!DomConverter.IsSelfClosingElement(designItem.name))
|
|
73
74
|
indentedTextWriter.write('</' + designItem.name + '>');
|
|
74
|
-
if (!contentSingleTextNode)
|
|
75
|
-
|
|
75
|
+
//if (!contentSingleTextNode)
|
|
76
|
+
this._conditionalyWriteNewline(indentedTextWriter, designItem);
|
|
76
77
|
}
|
|
77
78
|
if (designItemsAssignmentList) {
|
|
78
79
|
designItemsAssignmentList.set(designItem, { start: start, length: indentedTextWriter.position - start - 1 });
|
|
@@ -104,10 +104,10 @@ export class CodeViewMonaco extends BaseCustomWebComponentLazyAppend {
|
|
|
104
104
|
}
|
|
105
105
|
setSelection(position) {
|
|
106
106
|
let model = this._monacoEditor.getModel();
|
|
107
|
-
let
|
|
108
|
-
let
|
|
107
|
+
let point1 = model.getPositionAt(position.start);
|
|
108
|
+
let point2 = model.getPositionAt(position.start + position.length);
|
|
109
109
|
this._monacoEditor.setSelection({ startLineNumber: point1.lineNumber, startColumn: point1.column, endLineNumber: point2.lineNumber, endColumn: point2.column });
|
|
110
|
-
this._monacoEditor.
|
|
110
|
+
setTimeout(() => this._monacoEditor.revealLine(point1.lineNumber), 20);
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
customElements.define('node-projects-code-view-monaco', CodeViewMonaco);
|
|
@@ -39,6 +39,7 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
|
|
|
39
39
|
elementFromPoint(x: number, y: number): Element;
|
|
40
40
|
getItemsBelowMouse(event: MouseEvent): Element[];
|
|
41
41
|
zoomTowardsPoint(point: IPoint, scalechange: number): void;
|
|
42
|
+
zoomPoint(canvasPoint: IPoint, newZoom: number): void;
|
|
42
43
|
zoomOntoRectangle(startPoint: IPoint, endPoint: IPoint): void;
|
|
43
44
|
showDesignItemContextMenu(designItem: IDesignItem, event: MouseEvent): void;
|
|
44
45
|
}
|
|
@@ -99,5 +99,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
|
|
|
99
99
|
removeOverlay(element: SVGGraphicsElement): void;
|
|
100
100
|
getItemsBelowMouse(event: MouseEvent): Element[];
|
|
101
101
|
zoomOntoRectangle(startPoint: IPoint, endPoint: IPoint): void;
|
|
102
|
+
zoomPoint(canvasPoint: IPoint, newZoom: number): void;
|
|
102
103
|
zoomTowardsPoint(canvasPoint: IPoint, newZoom: number): void;
|
|
103
104
|
}
|
|
@@ -394,6 +394,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
394
394
|
this._canvasContainer.style.bottom = this._outercanvas2.offsetHeight >= this._canvasContainer.offsetHeight ? '0' : '';
|
|
395
395
|
this._canvasContainer.style.right = this._outercanvas2.offsetWidth >= this._canvasContainer.offsetWidth ? '0' : '';
|
|
396
396
|
this._updateTransform();
|
|
397
|
+
this._fillCalculationrects();
|
|
397
398
|
this.onZoomFactorChanged.emit(this._zoomFactor);
|
|
398
399
|
}
|
|
399
400
|
_updateTransform() {
|
|
@@ -791,7 +792,15 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
791
792
|
x: (rect.width / 2) + rect.x,
|
|
792
793
|
y: (rect.height / 2) + rect.y
|
|
793
794
|
};
|
|
794
|
-
this.
|
|
795
|
+
this.zoomPoint(rectCenter, zoomFactor);
|
|
796
|
+
}
|
|
797
|
+
zoomPoint(canvasPoint, newZoom) {
|
|
798
|
+
this.zoomFactor = newZoom;
|
|
799
|
+
const newCanvasOffset = {
|
|
800
|
+
x: -(canvasPoint.x) + this.outerRect.width / this.zoomFactor / 2,
|
|
801
|
+
y: -(canvasPoint.y) + this.outerRect.height / this.zoomFactor / 2
|
|
802
|
+
};
|
|
803
|
+
this.canvasOffset = newCanvasOffset;
|
|
795
804
|
}
|
|
796
805
|
zoomTowardsPoint(canvasPoint, newZoom) {
|
|
797
806
|
const scaleChange = newZoom / this.zoomFactor;
|
|
@@ -20,6 +20,8 @@ export declare class DesignerView extends BaseCustomWebComponentConstructorAppen
|
|
|
20
20
|
static readonly style: CSSStyleSheet;
|
|
21
21
|
static readonly template: HTMLTemplateElement;
|
|
22
22
|
constructor();
|
|
23
|
+
zoomReset(): void;
|
|
24
|
+
zoomToFit(): void;
|
|
23
25
|
private _onScrollbar;
|
|
24
26
|
private _onWheel;
|
|
25
27
|
get designerWidth(): string;
|
|
@@ -179,38 +179,11 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
179
179
|
};
|
|
180
180
|
let zoomReset = this._getDomElement('zoomReset');
|
|
181
181
|
zoomReset.onclick = () => {
|
|
182
|
-
this.
|
|
183
|
-
this._designerCanvas.zoomFactor = 1;
|
|
184
|
-
this._sVert.value = 0.5;
|
|
185
|
-
this._sHor.value = 0.5;
|
|
186
|
-
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
182
|
+
this.zoomReset();
|
|
187
183
|
};
|
|
188
184
|
let zoomFit = this._getDomElement('zoomFit');
|
|
189
185
|
zoomFit.onclick = () => {
|
|
190
|
-
|
|
191
|
-
this._designerCanvas.canvasOffset = { x: 0, y: 0 };
|
|
192
|
-
this._designerCanvas.zoomFactor = 1;
|
|
193
|
-
for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
|
|
194
|
-
if (n instanceof Element) {
|
|
195
|
-
const rect = n.getBoundingClientRect();
|
|
196
|
-
minX = minX < rect.x ? minX : rect.x;
|
|
197
|
-
minY = minY < rect.y ? minY : rect.y;
|
|
198
|
-
maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
|
|
199
|
-
maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
const cvRect = this.designerCanvas.getBoundingClientRect();
|
|
203
|
-
maxX -= cvRect.x;
|
|
204
|
-
maxY -= cvRect.y;
|
|
205
|
-
let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
|
|
206
|
-
let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
|
|
207
|
-
const dimensions = this.designerCanvas.getDesignSurfaceDimensions();
|
|
208
|
-
if (dimensions.width)
|
|
209
|
-
scaleX = cvRect.width / dimensions.width;
|
|
210
|
-
if (dimensions.height)
|
|
211
|
-
scaleY = cvRect.height / dimensions.height;
|
|
212
|
-
this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
|
|
213
|
-
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
186
|
+
this.zoomToFit();
|
|
214
187
|
};
|
|
215
188
|
this.addEventListener(EventNames.Wheel, event => this._onWheel(event));
|
|
216
189
|
let alignSnap = this._getDomElement('alignSnap');
|
|
@@ -225,6 +198,39 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
|
|
|
225
198
|
this._sVert.addEventListener('scrollbar-input', (e) => this._onScrollbar(e));
|
|
226
199
|
this._sHor.addEventListener('scrollbar-input', (e) => this._onScrollbar(e));
|
|
227
200
|
}
|
|
201
|
+
zoomReset() {
|
|
202
|
+
this._designerCanvas.canvasOffset = { x: 0, y: 0 };
|
|
203
|
+
this._designerCanvas.zoomFactor = 1;
|
|
204
|
+
this._sVert.value = 0.5;
|
|
205
|
+
this._sHor.value = 0.5;
|
|
206
|
+
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
207
|
+
}
|
|
208
|
+
zoomToFit() {
|
|
209
|
+
let maxX = 0, maxY = 0, minX = 0, minY = 0;
|
|
210
|
+
this._designerCanvas.canvasOffset = { x: 0, y: 0 };
|
|
211
|
+
this._designerCanvas.zoomFactor = 1;
|
|
212
|
+
for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
|
|
213
|
+
if (n instanceof Element) {
|
|
214
|
+
const rect = n.getBoundingClientRect();
|
|
215
|
+
minX = minX < rect.x ? minX : rect.x;
|
|
216
|
+
minY = minY < rect.y ? minY : rect.y;
|
|
217
|
+
maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
|
|
218
|
+
maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const cvRect = this.designerCanvas.getBoundingClientRect();
|
|
222
|
+
maxX -= cvRect.x;
|
|
223
|
+
maxY -= cvRect.y;
|
|
224
|
+
let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
|
|
225
|
+
let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
|
|
226
|
+
const dimensions = this.designerCanvas.getDesignSurfaceDimensions();
|
|
227
|
+
if (dimensions.width)
|
|
228
|
+
scaleX = cvRect.width / dimensions.width;
|
|
229
|
+
if (dimensions.height)
|
|
230
|
+
scaleY = cvRect.height / dimensions.height;
|
|
231
|
+
this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
|
|
232
|
+
this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
|
|
233
|
+
}
|
|
228
234
|
_onScrollbar(e) {
|
|
229
235
|
if (e?.detail == 'incrementLarge')
|
|
230
236
|
e.target.value += 0.25;
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js
CHANGED
|
@@ -35,13 +35,9 @@ export class EditTextWithStyloExtension extends AbstractExtension {
|
|
|
35
35
|
this.overlays.push(foreignObject);
|
|
36
36
|
this._drawClickOverlayRects();
|
|
37
37
|
this._rect1.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
38
|
-
this._rect1.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
39
38
|
this._rect2.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
40
|
-
this._rect2.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
41
39
|
this._rect3.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
42
|
-
this._rect3.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
43
40
|
this._rect4.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
44
|
-
this._rect4.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
45
41
|
requestAnimationFrame(() => {
|
|
46
42
|
const stylo = foreignObject.querySelector('stylo-editor');
|
|
47
43
|
//@ts-ignore
|
|
@@ -16,7 +16,7 @@ export declare class ResizeExtension extends AbstractExtension {
|
|
|
16
16
|
private _circle6;
|
|
17
17
|
private _circle7;
|
|
18
18
|
private _circle8;
|
|
19
|
-
constructor(extensionManager: IExtensionManager,
|
|
19
|
+
constructor(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, extendedItem: IDesignItem, resizeAllSelected: boolean);
|
|
20
20
|
extend(): void;
|
|
21
21
|
refresh(): void;
|
|
22
22
|
_drawResizerOverlay(x: number, y: number, cursor: string, oldCircle?: SVGCircleElement): SVGCircleElement;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventNames } from "../../../../enums/EventNames";
|
|
2
|
+
import { convertCoordinates, getDomMatrix } from "../../../helper/TransformHelper.js";
|
|
2
3
|
import { AbstractExtension } from './AbstractExtension';
|
|
3
4
|
export class ResizeExtension extends AbstractExtension {
|
|
4
5
|
resizeAllSelected;
|
|
@@ -14,8 +15,8 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
14
15
|
_circle6;
|
|
15
16
|
_circle7;
|
|
16
17
|
_circle8;
|
|
17
|
-
constructor(extensionManager,
|
|
18
|
-
super(extensionManager,
|
|
18
|
+
constructor(extensionManager, designerCanvas, extendedItem, resizeAllSelected) {
|
|
19
|
+
super(extensionManager, designerCanvas, extendedItem);
|
|
19
20
|
this.resizeAllSelected = resizeAllSelected;
|
|
20
21
|
}
|
|
21
22
|
extend() {
|
|
@@ -88,39 +89,41 @@ export class ResizeExtension extends AbstractExtension {
|
|
|
88
89
|
const diff = containerService.placePoint(event, this.designerCanvas, this.extendedItem.parent, this._initialPoint, { x: 0, y: 0 }, currentPoint, this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
|
|
89
90
|
let trackX = diff.x - this._initialPoint.x - this._offsetPoint.x;
|
|
90
91
|
let trackY = diff.y - this._initialPoint.y - this._offsetPoint.y;
|
|
92
|
+
let matrix = getDomMatrix(this.extendedItem.element);
|
|
93
|
+
let transformedTrack = convertCoordinates({ x: trackX, y: trackY }, matrix);
|
|
91
94
|
let i = 0;
|
|
92
95
|
switch (this._actionModeStarted) {
|
|
93
96
|
case 'se-resize':
|
|
94
|
-
this.extendedItem.element.style.width = this._initialSizes[i].width +
|
|
95
|
-
this.extendedItem.element.style.height = this._initialSizes[i].height +
|
|
97
|
+
this.extendedItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
|
|
98
|
+
this.extendedItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
|
|
96
99
|
if (this.resizeAllSelected) {
|
|
97
100
|
for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
|
|
98
101
|
i++;
|
|
99
102
|
if (designItem !== this.extendedItem) {
|
|
100
|
-
designItem.element.style.width = this._initialSizes[i].width +
|
|
101
|
-
designItem.element.style.height = this._initialSizes[i].height +
|
|
103
|
+
designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
|
|
104
|
+
designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
|
|
102
105
|
}
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
108
|
break;
|
|
106
109
|
case 's-resize':
|
|
107
|
-
this.extendedItem.element.style.height = this._initialSizes[i].height +
|
|
110
|
+
this.extendedItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
|
|
108
111
|
if (this.resizeAllSelected) {
|
|
109
112
|
i++;
|
|
110
113
|
for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
|
|
111
114
|
if (designItem !== this.extendedItem) {
|
|
112
|
-
designItem.element.style.height = this._initialSizes[i].height +
|
|
115
|
+
designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
|
|
113
116
|
}
|
|
114
117
|
}
|
|
115
118
|
}
|
|
116
119
|
break;
|
|
117
120
|
case 'e-resize':
|
|
118
|
-
this.extendedItem.element.style.width = this._initialSizes[i].width +
|
|
121
|
+
this.extendedItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
|
|
119
122
|
if (this.resizeAllSelected) {
|
|
120
123
|
i++;
|
|
121
124
|
for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
|
|
122
125
|
if (designItem !== this.extendedItem) {
|
|
123
|
-
designItem.element.style.width = this._initialSizes[i].width +
|
|
126
|
+
designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
|
|
124
127
|
}
|
|
125
128
|
}
|
|
126
129
|
}
|
package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu copy.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
|
|
2
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
3
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
4
|
+
import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
|
|
5
|
+
export declare class CopyPasteContextMenu implements IContextMenuExtension {
|
|
6
|
+
shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
|
|
7
|
+
provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
|
|
8
|
+
}
|
package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu copy.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CommandType } from "../../../../../commandHandling/CommandType";
|
|
2
|
+
export class CopyPasteContextMenu {
|
|
3
|
+
shouldProvideContextmenu(event, designerView, designItem, initiator) {
|
|
4
|
+
return true;
|
|
5
|
+
}
|
|
6
|
+
provideContextMenuItems(event, designerView, designItem) {
|
|
7
|
+
return [
|
|
8
|
+
{ title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); }, shortCut: 'Ctrl + C' },
|
|
9
|
+
{ title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); }, shortCut: 'Ctrl + X' },
|
|
10
|
+
{ title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); }, shortCut: 'Ctrl + V' },
|
|
11
|
+
{ title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); }, shortCut: 'Del' },
|
|
12
|
+
{ title: '-' }
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -5,11 +5,10 @@ export class CopyPasteContextMenu {
|
|
|
5
5
|
}
|
|
6
6
|
provideContextMenuItems(event, designerView, designItem) {
|
|
7
7
|
return [
|
|
8
|
-
{ title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); } },
|
|
9
|
-
{ title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); } },
|
|
10
|
-
{ title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); } },
|
|
11
|
-
{ title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); } },
|
|
12
|
-
{ title: '-' }
|
|
8
|
+
{ title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); }, shortCut: 'Ctrl + C' },
|
|
9
|
+
{ title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); }, shortCut: 'Ctrl + X' },
|
|
10
|
+
{ title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); }, shortCut: 'Ctrl + V' },
|
|
11
|
+
{ title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); }, shortCut: 'Del' },
|
|
13
12
|
];
|
|
14
13
|
}
|
|
15
14
|
}
|
|
@@ -7,7 +7,7 @@ export class ItemsBelowContextMenu {
|
|
|
7
7
|
const lstItems = designerCanvas.getItemsBelowMouse(event);
|
|
8
8
|
if (lstItems.length > 0) {
|
|
9
9
|
//TODO: create a submenu 'select items below...'
|
|
10
|
-
return [
|
|
10
|
+
return [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))];
|
|
11
11
|
}
|
|
12
12
|
return [];
|
|
13
13
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
|
|
2
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
3
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
4
|
+
import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
|
|
5
|
+
export declare class SeperatorContextMenu implements IContextMenuExtension {
|
|
6
|
+
shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
|
|
7
|
+
provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
|
|
2
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
3
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
4
|
+
import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
|
|
5
|
+
export declare class ZMoveContextMenu implements IContextMenuExtension {
|
|
6
|
+
shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
|
|
7
|
+
provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CommandType } from "../../../../../commandHandling/CommandType";
|
|
2
|
+
export class ZMoveContextMenu {
|
|
3
|
+
shouldProvideContextmenu(event, designerView, designItem, initiator) {
|
|
4
|
+
return true;
|
|
5
|
+
}
|
|
6
|
+
provideContextMenuItems(event, designerView, designItem) {
|
|
7
|
+
return [
|
|
8
|
+
{ title: 'to front', action: () => { designerView.executeCommand({ type: CommandType.moveToFront }); } },
|
|
9
|
+
{ title: 'move forward', action: () => { designerView.executeCommand({ type: CommandType.moveForward }); } },
|
|
10
|
+
{ title: 'move backward', action: () => { designerView.executeCommand({ type: CommandType.moveBackward }); } },
|
|
11
|
+
{ title: 'to back', action: () => { designerView.executeCommand({ type: CommandType.moveToBack }); } },
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
}
|
package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
|
|
2
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
3
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
4
|
+
import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
|
|
5
|
+
export declare class ZoomToElementContextMenu implements IContextMenuExtension {
|
|
6
|
+
shouldProvideContextmenu(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
|
|
7
|
+
provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const offset = 10;
|
|
2
|
+
export class ZoomToElementContextMenu {
|
|
3
|
+
shouldProvideContextmenu(event, designerCanvas, designItem, initiator) {
|
|
4
|
+
return true;
|
|
5
|
+
}
|
|
6
|
+
provideContextMenuItems(event, designerCanvas, designItem) {
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
title: 'zoom to', action: () => {
|
|
10
|
+
const coord = designerCanvas.getNormalizedElementCoordinates(designItem.element);
|
|
11
|
+
const startPoint = { x: coord.x - offset, y: coord.y - offset };
|
|
12
|
+
const endPoint = { x: coord.x + coord.width + offset, y: coord.y + coord.height + offset };
|
|
13
|
+
let rect = {
|
|
14
|
+
x: startPoint.x < endPoint.x ? startPoint.x : endPoint.x,
|
|
15
|
+
y: startPoint.y < endPoint.y ? startPoint.y : endPoint.y,
|
|
16
|
+
width: Math.abs(startPoint.x - endPoint.x),
|
|
17
|
+
height: Math.abs(startPoint.y - endPoint.y),
|
|
18
|
+
};
|
|
19
|
+
let zFactorWidth = designerCanvas.outerRect.width / rect.width;
|
|
20
|
+
let zFactorHeight = designerCanvas.outerRect.height / rect.height;
|
|
21
|
+
let zoomFactor = zFactorWidth >= zFactorHeight ? zFactorHeight : zFactorWidth;
|
|
22
|
+
designerCanvas.zoomPoint({ x: coord.x + coord.width / 2, y: coord.y + coord.height / 2 }, zoomFactor);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -6,7 +6,6 @@ export declare class TextTool implements ITool {
|
|
|
6
6
|
activated(serviceContainer: ServiceContainer): void;
|
|
7
7
|
dispose(): void;
|
|
8
8
|
readonly cursor = "text";
|
|
9
|
-
private _text;
|
|
10
9
|
pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
|
|
11
10
|
keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
|
|
12
11
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { EventNames } from '../../../../enums/EventNames.js';
|
|
2
|
+
import { DesignItem } from '../../../item/DesignItem.js';
|
|
3
|
+
import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction.js';
|
|
4
|
+
import { ExtensionType } from '../extensions/ExtensionType.js';
|
|
2
5
|
export class TextTool {
|
|
3
6
|
constructor() {
|
|
4
7
|
}
|
|
@@ -7,26 +10,22 @@ export class TextTool {
|
|
|
7
10
|
dispose() {
|
|
8
11
|
}
|
|
9
12
|
cursor = 'text';
|
|
10
|
-
_text;
|
|
11
13
|
pointerEventHandler(designerCanvas, event, currentElement) {
|
|
12
14
|
const currentPoint = designerCanvas.getNormalizedEventCoordinates(event);
|
|
13
|
-
//const offset = 50;
|
|
14
|
-
addEventListener("keyup", function (event) {
|
|
15
|
-
if (event.key === 'Enter') {
|
|
16
|
-
console.log("Enter Pressed");
|
|
17
|
-
event.preventDefault();
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
15
|
switch (event.type) {
|
|
21
16
|
case EventNames.PointerDown:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
//
|
|
17
|
+
const span = document.createElement('span');
|
|
18
|
+
const di = DesignItem.createDesignItemFromInstance(span, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
|
|
19
|
+
di.setStyle('position', 'absolute');
|
|
20
|
+
di.setStyle('left', currentPoint.x + 'px');
|
|
21
|
+
di.setStyle('top', currentPoint.y + 'px');
|
|
22
|
+
designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
|
|
23
|
+
designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
|
|
24
|
+
//TODO - don't apply doubleclick extension (maybe it is not the doubleclick one) - apply edit text extesion directly
|
|
25
|
+
designerCanvas.extensionManager.applyExtension(di, ExtensionType.Doubleclick);
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
span.focus();
|
|
28
|
+
}, 50);
|
|
30
29
|
break;
|
|
31
30
|
}
|
|
32
31
|
}
|
|
@@ -120,8 +120,11 @@ export class PaletteTreeView extends BaseCustomWebComponentConstructorAppend {
|
|
|
120
120
|
catch (err) {
|
|
121
121
|
console.warn('Error loading elements', err);
|
|
122
122
|
}
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
try {
|
|
124
|
+
//@ts-ignore
|
|
125
|
+
newNode.updateCounters();
|
|
126
|
+
}
|
|
127
|
+
catch { }
|
|
125
128
|
}
|
|
126
129
|
}
|
|
127
130
|
}
|
|
@@ -132,9 +132,7 @@ export class TreeView extends BaseCustomWebComponentLazyAppend {
|
|
|
132
132
|
this.createTree(value.contentService.rootDesignItem);
|
|
133
133
|
}
|
|
134
134
|
selectionChanged(event) {
|
|
135
|
-
|
|
136
|
-
this._selectTreeElements(event.selectedElements.map(x => this._mapElementTreeitem.get(x.element)));
|
|
137
|
-
}
|
|
135
|
+
this._selectTreeElements(event.selectedElements.map(x => this._mapElementTreeitem.get(x.element)));
|
|
138
136
|
}
|
|
139
137
|
_recomputeTree(parent, activeElement) {
|
|
140
138
|
this._mapElementTreeitem = new Map();
|
|
@@ -14,6 +14,7 @@ export declare class TreeViewExtended extends BaseCustomWebComponentConstructorA
|
|
|
14
14
|
static readonly style: CSSStyleSheet;
|
|
15
15
|
static readonly template: HTMLTemplateElement;
|
|
16
16
|
constructor();
|
|
17
|
+
_filterNodes(): void;
|
|
17
18
|
_showHideAtDesignTimeState(img: HTMLImageElement, designItem: IDesignItem): void;
|
|
18
19
|
_switchHideAtDesignTimeState(img: HTMLImageElement, designItem: IDesignItem): void;
|
|
19
20
|
_showLockAtDesignTimeState(img: HTMLImageElement, designItem: IDesignItem): void;
|
|
@@ -98,12 +98,20 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
|
|
|
98
98
|
import("jquery.fancytree/dist/skin-win8/ui.fancytree.css", { assert: { type: 'css' } }).then(x => this.shadowRoot.adoptedStyleSheets = [x.default, this.constructor.style]);
|
|
99
99
|
this._filter = this._getDomElement('input');
|
|
100
100
|
this._filter.onkeyup = () => {
|
|
101
|
-
|
|
101
|
+
this._filterNodes();
|
|
102
|
+
};
|
|
103
|
+
this._treeDiv = this._getDomElement('treetable');
|
|
104
|
+
}
|
|
105
|
+
_filterNodes() {
|
|
106
|
+
let match = this._filter.value;
|
|
107
|
+
if (match) {
|
|
102
108
|
this._tree.filterNodes((node) => {
|
|
103
109
|
return new RegExp(match, "i").test(node.title);
|
|
104
110
|
});
|
|
105
|
-
}
|
|
106
|
-
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this._tree.clearFilter();
|
|
114
|
+
}
|
|
107
115
|
}
|
|
108
116
|
_showHideAtDesignTimeState(img, designItem) {
|
|
109
117
|
if (designItem.hideAtDesignTime)
|
|
@@ -337,9 +345,7 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
|
|
|
337
345
|
this.createTree(value.contentService.rootDesignItem);
|
|
338
346
|
}
|
|
339
347
|
selectionChanged(event) {
|
|
340
|
-
|
|
341
|
-
this._highlight(event.selectedElements);
|
|
342
|
-
}
|
|
348
|
+
this._highlight(event.selectedElements);
|
|
343
349
|
}
|
|
344
350
|
_recomputeTree(rootItem) {
|
|
345
351
|
this._tree.getRootNode().removeChildren();
|
|
@@ -347,6 +353,7 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
|
|
|
347
353
|
this._tree.expandAll();
|
|
348
354
|
//@ts-ignore
|
|
349
355
|
this._tree.getRootNode().updateCounters();
|
|
356
|
+
this._filterNodes();
|
|
350
357
|
}
|
|
351
358
|
_getChildren(item, currentNode) {
|
|
352
359
|
if (currentNode == null) {
|
package/dist/index.d.ts
CHANGED
|
@@ -156,7 +156,11 @@ export type { IContextMenuExtension, ContextmenuInitiator } from "./elements/wid
|
|
|
156
156
|
export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
|
|
157
157
|
export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
|
|
158
158
|
export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
|
|
159
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js";
|
|
160
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js";
|
|
161
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js";
|
|
159
162
|
export * from "./elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu.js";
|
|
163
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js";
|
|
160
164
|
export type { IDesignerPointerExtension } from "./elements/widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtension.js";
|
|
161
165
|
export type { IDesignerPointerExtensionProvider } from "./elements/widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtensionProvider.js";
|
|
162
166
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js";
|
package/dist/index.js
CHANGED
|
@@ -116,7 +116,11 @@ export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithS
|
|
|
116
116
|
export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
|
|
117
117
|
export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
|
|
118
118
|
export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
|
|
119
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js";
|
|
120
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js";
|
|
121
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js";
|
|
119
122
|
export * from "./elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu.js";
|
|
123
|
+
export * from "./elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js";
|
|
120
124
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js";
|
|
121
125
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtension.js";
|
|
122
126
|
export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "A UI designer for Polymer apps",
|
|
3
3
|
"name": "@node-projects/web-component-designer",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.93",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"author": "",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"prepublishOnly": "npm run build"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@node-projects/base-custom-webcomponent": "^0.
|
|
16
|
+
"@node-projects/base-custom-webcomponent": "^0.6.0",
|
|
17
17
|
"construct-style-sheets-polyfill": "^3.1.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"@node-projects/node-html-parser-esm": "^2.4.1",
|
|
22
22
|
"@papyrs/stylo": "^0.0.8",
|
|
23
23
|
"@types/codemirror": "^5.60.5",
|
|
24
|
-
"@types/jquery": "^3.5.
|
|
24
|
+
"@types/jquery": "^3.5.14",
|
|
25
25
|
"@types/jquery.fancytree": "0.0.7",
|
|
26
26
|
"ace-builds": "^1.4.14",
|
|
27
|
-
"codemirror": "^5.65.
|
|
27
|
+
"codemirror": "^5.65.2",
|
|
28
28
|
"esprima-next": "^5.8.1",
|
|
29
29
|
"html2canvas": "*",
|
|
30
30
|
"jest": "^27.5.1",
|