@node-projects/web-component-designer 0.1.71 → 0.1.73

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.
@@ -12,7 +12,7 @@ export declare function addVectors(vectorA: [number, number], vectorB: [number,
12
12
  export declare function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element: HTMLElement, designerCanvas: IDesignerCanvas): DOMPoint;
13
13
  export declare function getResultingTransformationBetweenElementAndAllAncestors(element: HTMLElement, ancestor: HTMLElement, excludeAncestor?: boolean, cache?: Record<string | symbol, any>): DOMMatrix;
14
14
  export declare function getByParentsTransformedPointRelatedToCanvas(element: HTMLElement, point: DOMPoint, designerCanvas: IDesignerCanvas, cache?: Record<string | symbol, any>): IPoint;
15
- export declare function getDesignerCanvasNormalizedTransformedPoint(element: HTMLElement, point: IPoint, designerCanvas: IDesignerCanvas): IPoint;
15
+ export declare function getDesignerCanvasNormalizedTransformedPoint(element: HTMLElement, point: IPoint, designerCanvas: IDesignerCanvas, cache: Record<string | symbol, any>): IPoint;
16
16
  export declare function getElementSize(element: HTMLElement): {
17
17
  width: number;
18
18
  height: number;
@@ -177,8 +177,8 @@ export function getByParentsTransformedPointRelatedToCanvas(element, point, desi
177
177
  }
178
178
  return byParentTransformedPointRelatedToCanvas;
179
179
  }
180
- export function getDesignerCanvasNormalizedTransformedPoint(element, point, designerCanvas) {
181
- return getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, { x: -point.x, y: -point.y }, designerCanvas)[0];
180
+ export function getDesignerCanvasNormalizedTransformedPoint(element, point, designerCanvas, cache) {
181
+ return getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, { x: -point.x, y: -point.y }, designerCanvas, cache)[0];
182
182
  }
183
183
  export function getElementSize(element) {
184
184
  let width = element.offsetWidth;
@@ -1,4 +1,3 @@
1
- import { DomHelper } from '@node-projects/base-custom-webcomponent';
2
1
  export const provideSnaplinesWithDistance = 'provideSnaplinesWithDistance';
3
2
  export const provideSnaplinesWithDistanceDistance = 'provideSnaplinesWithDistanceDistance';
4
3
  export class SnaplinesProviderService {
@@ -13,8 +12,7 @@ export class SnaplinesProviderService {
13
12
  const positionsMiddleH = [];
14
13
  const positionsV = [];
15
14
  const positionsMiddleV = [];
16
- let ignoreElements = ignoredItems.map(x => x.element);
17
- for (let n of DomHelper.getAllChildNodes(containerItem.element, false, ignoreElements)) {
15
+ for (let n of containerItem.querySelectorAll('*')) {
18
16
  if (!ignMap.has(n)) {
19
17
  const p = n.getBoundingClientRect();
20
18
  const pLeft = (p.x - outerRect.x) / canvas.scaleFactor;
@@ -439,7 +439,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
439
439
  let maxX = 0, maxY = 0, minX = 0, minY = 0;
440
440
  this.canvasOffset = { x: 0, y: 0 };
441
441
  this.zoomFactor = 1;
442
- for (let n of DomHelper.getAllChildNodes(this.rootDesignItem.element)) {
442
+ for (let n of this.rootDesignItem.querySelectorAll('*')) {
443
443
  if (n instanceof Element) {
444
444
  const rect = n.getBoundingClientRect();
445
445
  minX = minX < rect.x ? minX : rect.x;
@@ -314,7 +314,6 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
314
314
  this._toolbar.initialize(this.serviceContainer, this);
315
315
  }
316
316
  getHTML() {
317
- //this.instanceServiceContainer.selectionService.setSelectedElements(null);
318
317
  if (this._designerCanvas.rootDesignItem.childCount > 0) {
319
318
  return DomConverter.ConvertToString(Array.from(this._designerCanvas.rootDesignItem.children()), true, true);
320
319
  }
@@ -9,4 +9,5 @@ export declare abstract class AbstractExtension extends AbstractExtensionBase im
9
9
  abstract extend(cache: Record<string | symbol, any>, event?: Event): any;
10
10
  abstract refresh(cache: Record<string | symbol, any>, event?: Event): any;
11
11
  abstract dispose(): any;
12
+ remove(): void;
12
13
  }
@@ -5,4 +5,7 @@ export class AbstractExtension extends AbstractExtensionBase {
5
5
  super(extensionManager, designerView);
6
6
  this.extendedItem = extendedItem;
7
7
  }
8
+ remove() {
9
+ this.extensionManager.removeExtensionInstance(this.extendedItem, this);
10
+ }
8
11
  }
@@ -12,6 +12,7 @@ export declare class ExtensionManager implements IExtensionManager {
12
12
  private _selectedElementsChanged;
13
13
  applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
14
14
  applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): void;
15
+ removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
15
16
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): void;
16
17
  removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): void;
17
18
  refreshExtension(designItem: IDesignItem, extensionType?: ExtensionType, event?: Event): void;
@@ -133,6 +133,24 @@ export class ExtensionManager {
133
133
  }
134
134
  this.designerCanvas.overlayLayer.endBatch();
135
135
  }
136
+ removeExtensionInstance(designItem, extension) {
137
+ for (let e of designItem.appliedDesignerExtensions) {
138
+ const idx = e[1].indexOf(extension);
139
+ if (idx >= 0) {
140
+ try {
141
+ extension.dispose();
142
+ }
143
+ catch (err) {
144
+ console.error(err);
145
+ }
146
+ e[1].splice(idx, 1);
147
+ if (e[1].length == 0)
148
+ designItem.appliedDesignerExtensions.delete(e[0]);
149
+ if (!designItem.appliedDesignerExtensions.size)
150
+ this.designItemsWithExtentions.delete(designItem);
151
+ }
152
+ }
153
+ }
136
154
  removeExtension(designItem, extensionType) {
137
155
  if (designItem) {
138
156
  if (extensionType) {
@@ -218,15 +236,20 @@ export class ExtensionManager {
218
236
  refreshExtension(designItem, extensionType, event) {
219
237
  if (designItem) {
220
238
  if (extensionType) {
221
- let exts = designItem.appliedDesignerExtensions.get(extensionType);
222
- if (exts) {
223
- const cache = {};
224
- for (let e of exts) {
225
- try {
226
- e.refresh(cache, event);
227
- }
228
- catch (err) {
229
- console.error(err);
239
+ if (!designItem.element.isConnected) {
240
+ this.removeExtension(designItem, extensionType);
241
+ }
242
+ else {
243
+ let exts = designItem.appliedDesignerExtensions.get(extensionType);
244
+ if (exts) {
245
+ const cache = {};
246
+ for (let e of exts) {
247
+ try {
248
+ e.refresh(cache, event);
249
+ }
250
+ catch (err) {
251
+ console.error(err);
252
+ }
230
253
  }
231
254
  }
232
255
  }
@@ -253,22 +276,27 @@ export class ExtensionManager {
253
276
  if (extensionType) {
254
277
  const cache = {};
255
278
  outer1: for (let i of designItems) {
256
- let exts = i.appliedDesignerExtensions.get(extensionType);
257
- if (exts) {
258
- for (let e of exts) {
259
- try {
260
- if (e != ignoredExtension)
261
- e.refresh(cache, event);
262
- if (timeout) {
263
- const end = performance.now();
264
- if (end - start > timeout) {
265
- console.warn("refreshExtensions() took too long, stopped refreshing");
266
- break outer1;
279
+ if (!i.element.isConnected) {
280
+ this.removeExtension(i, extensionType);
281
+ }
282
+ else {
283
+ let exts = i.appliedDesignerExtensions.get(extensionType);
284
+ if (exts) {
285
+ for (let e of exts) {
286
+ try {
287
+ if (e != ignoredExtension)
288
+ e.refresh(cache, event);
289
+ if (timeout) {
290
+ const end = performance.now();
291
+ if (end - start > timeout) {
292
+ console.warn("refreshExtensions() took too long, stopped refreshing");
293
+ break outer1;
294
+ }
267
295
  }
268
296
  }
269
- }
270
- catch (err) {
271
- console.error(err);
297
+ catch (err) {
298
+ console.error(err);
299
+ }
272
300
  }
273
301
  }
274
302
  }
@@ -6,6 +6,7 @@ export interface IExtensionManager {
6
6
  applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): any;
7
7
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): any;
8
8
  removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): any;
9
+ removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
9
10
  refreshExtension(designItem: IDesignItem, extensionType?: ExtensionType, event?: Event): any;
10
11
  refreshExtensions(designItems: IDesignItem[], extensionType?: ExtensionType, event?: Event, ignoredExtension?: IDesignerExtension, timeout?: number): any;
11
12
  refreshAllExtensions(designItems: IDesignItem[], ignoredExtension?: IDesignerExtension): any;
@@ -28,6 +28,10 @@ export class ResizeExtension extends AbstractExtension {
28
28
  refresh(cache, event) {
29
29
  //#region Resizer circles
30
30
  let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas, cache);
31
+ if (isNaN(transformedCornerPoints[0].x) || isNaN(transformedCornerPoints[1].x)) {
32
+ this.remove();
33
+ return;
34
+ }
31
35
  this._circle1 = this._drawResizerOverlay(transformedCornerPoints[0].x, transformedCornerPoints[0].y, 'nw-resize', this._circle1);
32
36
  this._circle2 = this._drawResizerOverlay((transformedCornerPoints[0].x + (transformedCornerPoints[1].x - transformedCornerPoints[0].x) / 2), (transformedCornerPoints[0].y + (transformedCornerPoints[1].y - transformedCornerPoints[0].y) / 2), 'n-resize', this._circle2);
33
37
  this._circle3 = this._drawResizerOverlay(transformedCornerPoints[1].x, transformedCornerPoints[1].y, 'ne-resize', this._circle3);
@@ -10,9 +10,9 @@ export declare class RotateExtension extends AbstractExtension {
10
10
  private _textAngle;
11
11
  private _actualRotationAngle;
12
12
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
13
- extend(): void;
14
- refresh(): void;
15
- _drawRotateOverlay(itemRect: DOMRect, oldRotateIcon: any): any;
13
+ extend(cache: Record<string | symbol, any>, event?: Event): void;
14
+ refresh(cache: Record<string | symbol, any>, event?: Event): void;
15
+ _drawRotateOverlay(itemRect: DOMRect, oldRotateIcon: any, cache: Record<string | symbol, any>): any;
16
16
  _pointerActionTypeRotate(event: PointerEvent): void;
17
17
  dispose(): void;
18
18
  }
@@ -11,17 +11,21 @@ export class RotateExtension extends AbstractExtension {
11
11
  constructor(extensionManager, designerView, extendedItem) {
12
12
  super(extensionManager, designerView, extendedItem);
13
13
  }
14
- extend() {
15
- this.refresh();
14
+ extend(cache, event) {
15
+ this.refresh(cache, event);
16
16
  }
17
- refresh() {
17
+ refresh(cache, event) {
18
18
  const rect = this.extendedItem.element.getBoundingClientRect();
19
19
  this._actualRotationAngle = getRotationAngleFromMatrix(null, new DOMMatrix(this.extendedItem.element.style.transform));
20
- this._rotateIcon = this._drawRotateOverlay(rect, this._rotateIcon);
20
+ this._rotateIcon = this._drawRotateOverlay(rect, this._rotateIcon, cache);
21
21
  }
22
- _drawRotateOverlay(itemRect, oldRotateIcon) {
23
- let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 10, y: 10 }, this.designerCanvas);
22
+ _drawRotateOverlay(itemRect, oldRotateIcon, cache) {
23
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 10, y: 10 }, this.designerCanvas, cache);
24
24
  let rotateIconPosition = transformedCornerPoints[0];
25
+ if (isNaN(transformedCornerPoints[0].x) || isNaN(transformedCornerPoints[1].x)) {
26
+ this.remove();
27
+ return;
28
+ }
25
29
  if (!oldRotateIcon) {
26
30
  const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
27
31
  const line = document.createElementNS("http://www.w3.org/2000/svg", "circle");
@@ -20,6 +20,10 @@ export class SelectionDefaultExtension extends AbstractExtension {
20
20
  }
21
21
  else
22
22
  transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas, cache);
23
+ if (isNaN(transformedCornerPoints[0].x) || isNaN(transformedCornerPoints[1].x)) {
24
+ this.remove();
25
+ return;
26
+ }
23
27
  this._line1 = this._drawLine(transformedCornerPoints[0].x, transformedCornerPoints[0].y, transformedCornerPoints[1].x, transformedCornerPoints[1].y, 'svg-selection', this._line1);
24
28
  this._line2 = this._drawLine(transformedCornerPoints[0].x, transformedCornerPoints[0].y, transformedCornerPoints[2].x, transformedCornerPoints[2].y, 'svg-selection', this._line2);
25
29
  this._line3 = this._drawLine(transformedCornerPoints[1].x, transformedCornerPoints[1].y, transformedCornerPoints[3].x, transformedCornerPoints[3].y, 'svg-selection', this._line3);
@@ -8,8 +8,8 @@ export declare class TransformOriginExtension extends AbstractExtension {
8
8
  private _circle2;
9
9
  private _oldValue;
10
10
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
11
- extend(): void;
11
+ extend(cache: Record<string | symbol, any>, event?: Event): void;
12
12
  pointerEvent(event: PointerEvent): void;
13
- refresh(): void;
13
+ refresh(cache: Record<string | symbol, any>, event?: Event): void;
14
14
  dispose(): void;
15
15
  }
@@ -10,10 +10,14 @@ export class TransformOriginExtension extends AbstractExtension {
10
10
  constructor(extensionManager, designerView, extendedItem) {
11
11
  super(extensionManager, designerView, extendedItem);
12
12
  }
13
- extend() {
13
+ extend(cache, event) {
14
14
  const computed = getComputedStyle(this.extendedItem.element);
15
15
  const to = computed.transformOrigin.split(' '); // This value remains the same regardless of scalefactor
16
- const toDOMPoint = getDesignerCanvasNormalizedTransformedPoint(this.extendedItem.element, { x: parseFloat(to[0]) * this.designerCanvas.zoomFactor, y: parseFloat(to[1]) * this.designerCanvas.zoomFactor }, this.designerCanvas);
16
+ const toDOMPoint = getDesignerCanvasNormalizedTransformedPoint(this.extendedItem.element, { x: parseFloat(to[0]) * this.designerCanvas.zoomFactor, y: parseFloat(to[1]) * this.designerCanvas.zoomFactor }, this.designerCanvas, cache);
17
+ if (isNaN(toDOMPoint.x) || isNaN(toDOMPoint.y)) {
18
+ this.remove();
19
+ return;
20
+ }
17
21
  this._circle = this._drawCircle(toDOMPoint.x, toDOMPoint.y, 5 / this.designerCanvas.zoomFactor, 'svg-transform-origin');
18
22
  this._circle.style.strokeWidth = (1 / this.designerCanvas.zoomFactor).toString();
19
23
  this._circle.style.cursor = 'pointer';
@@ -78,15 +82,17 @@ export class TransformOriginExtension extends AbstractExtension {
78
82
  }
79
83
  else
80
84
  this.extendedItem.updateStyleInSheetOrLocal('transform-origin', newX + 'px' + ' ' + newY + 'px');
81
- this.refresh();
85
+ this.refresh(null, null);
82
86
  this._startPos = null;
83
87
  }
84
88
  break;
85
89
  }
86
90
  }
87
- refresh() {
88
- this._removeAllOverlays();
89
- this.extend();
91
+ refresh(cache, event) {
92
+ if (this._circle) {
93
+ this._removeAllOverlays();
94
+ this.extend(cache, event);
95
+ }
90
96
  }
91
97
  dispose() {
92
98
  this._removeAllOverlays();
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.1.71",
4
+ "version": "0.1.73",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",