@node-projects/web-component-designer 0.1.162 → 0.1.165

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.
@@ -0,0 +1,20 @@
1
+ <html>
2
+
3
+ <head>
4
+ <script>
5
+ window.addEventListener("message",
6
+ (event) => {
7
+ const data = event.data;
8
+ const obj = JSON.parse(data);
9
+ switch (obj.type) {
10
+ case 'elementsFromPoint': {
11
+ const ret = document.elementsFromPoint(...obj.par);
12
+ }
13
+ }
14
+ }, false);
15
+ </script>
16
+ </head>
17
+
18
+ <body></body>
19
+
20
+ </html>
@@ -7,7 +7,6 @@ export function inDesigner(element) {
7
7
  }
8
8
  export function newElementFromString(text, document) {
9
9
  const range = document.createRange();
10
- range.selectNode(document.body);
11
10
  //@ts-ignore
12
11
  const fragment = range.createContextualFragment(text, { includeShadowRoots: true });
13
12
  return fragment.firstChild;
@@ -20,4 +20,3 @@ export declare function getElementSize(element: HTMLElement): {
20
20
  export declare function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element: HTMLElement, untransformedCornerPointsOffset: IPoint | null, designerCanvas: IDesignerCanvas, cache?: Record<string | symbol, any>): [DOMPoint, DOMPoint, DOMPoint, DOMPoint];
21
21
  export declare function extractTranslationFromDOMMatrix(matrix: DOMMatrix): DOMPoint;
22
22
  export declare function extractRotationAngleFromDOMMatrix(matrix: DOMMatrix): number;
23
- export declare function normalizeToAbsolutePosition(element: HTMLElement, normalizeProperty: "left" | "top"): string;
@@ -9,7 +9,7 @@ let identityMatrix = [
9
9
  ];
10
10
  export function getElementCombinedTransform(element) {
11
11
  //https://www.w3.org/TR/css-transforms-2/#ctm
12
- let s = getComputedStyle(element);
12
+ let s = element.ownerDocument.defaultView.getComputedStyle(element);
13
13
  let m = new DOMMatrix();
14
14
  if (s.translate != 'none' && s.translate) {
15
15
  m = m.multiply(new DOMMatrix('translate(' + s.translate + ')'));
@@ -37,9 +37,6 @@ export function combineTransforms(element, actualTransforms, requestedTransforma
37
37
  }
38
38
  export function transformPointByInverseMatrix(point, matrix) {
39
39
  const inverse = matrix.inverse();
40
- //fix chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=1395645
41
- inverse.m33 = 1;
42
- inverse.m44 = 1;
43
40
  return point.matrixTransform(inverse);
44
41
  }
45
42
  export function getRotationMatrix3d(axisOfRotation, angle) {
@@ -113,46 +110,37 @@ export function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransfo
113
110
  const designerCanvasNormalizedTransformedOrigin = new DOMPoint(transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.x - designerCanvas.containerBoundingRect.x, transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.y - designerCanvas.containerBoundingRect.y);
114
111
  return designerCanvasNormalizedTransformedOrigin;
115
112
  }
116
- //const elementMatrixCacheKey = Symbol('windowOffsetsCacheKey');
113
+ const elementMatrixCacheKey = Symbol('windowOffsetsCacheKey');
117
114
  export function getResultingTransformationBetweenElementAndAllAncestors(element, ancestor, excludeAncestor, cache = {}) {
118
- /*let ch: Map<any, [DOMMatrix]>;
115
+ let ch;
119
116
  if (cache)
120
- ch = cache[elementMatrixCacheKey] ??= new Map<any, [DOMMatrix]>();
117
+ ch = cache[elementMatrixCacheKey] ??= new Map();
121
118
  else
122
- ch = new Map<any, [DOMMatrix]>();*/
123
- let lst = [];
119
+ ch = new Map();
120
+ const res = ch.get(element);
121
+ if (res)
122
+ return res;
124
123
  let actualElement = element;
125
124
  let actualElementMatrix;
126
125
  let newElementMatrix;
127
126
  let originalElementAndAllParentsMultipliedMatrix;
128
127
  while (actualElement != ancestor && actualElement != null) {
129
- /*let cachedObj = ch.get(actualElement);
130
- if (cachedObj) {
131
- if (originalElementAndAllParentsMultipliedMatrix)
132
- originalElementAndAllParentsMultipliedMatrix = cachedObj[0].multiply(originalElementAndAllParentsMultipliedMatrix);
133
- else
134
- originalElementAndAllParentsMultipliedMatrix = cachedObj[0];
135
- lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
136
- break;
137
- }*/
138
128
  const newElement = getParentElementIncludingSlots(actualElement);
139
129
  if (newElement) {
140
130
  actualElementMatrix = getElementCombinedTransform(actualElement);
141
131
  newElementMatrix = getElementCombinedTransform(newElement);
142
- newElementMatrix.m41 = newElementMatrix.m42 = 0;
132
+ actualElementMatrix.m43 = 0;
133
+ newElementMatrix.m41 = newElementMatrix.m42 = newElementMatrix.m43 = 0;
143
134
  if (actualElement == element) {
144
- originalElementAndAllParentsMultipliedMatrix = actualElementMatrix.multiply(newElementMatrix);
135
+ originalElementAndAllParentsMultipliedMatrix = newElementMatrix.multiply(actualElementMatrix);
145
136
  }
146
137
  else if (newElement != ancestor || !excludeAncestor) {
147
- originalElementAndAllParentsMultipliedMatrix = originalElementAndAllParentsMultipliedMatrix.multiply(newElementMatrix);
138
+ originalElementAndAllParentsMultipliedMatrix = newElementMatrix.multiply(originalElementAndAllParentsMultipliedMatrix);
148
139
  }
149
- lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
150
- const cacheEntry = [originalElementAndAllParentsMultipliedMatrix];
151
- lst.push(cacheEntry);
152
- //ch.set(actualElement, cacheEntry);
153
140
  }
154
141
  actualElement = newElement;
155
142
  }
143
+ ch.set(element, originalElementAndAllParentsMultipliedMatrix);
156
144
  return originalElementAndAllParentsMultipliedMatrix;
157
145
  }
158
146
  export function getByParentsTransformedPointRelatedToCanvas(element, point, designerCanvas, cache) {
@@ -169,8 +157,10 @@ export function getByParentsTransformedPointRelatedToCanvas(element, point, desi
169
157
  const tfX = parseFloat(toSplit[0]);
170
158
  const tfY = parseFloat(toSplit[1]);
171
159
  const parentElementTransformOrigin = new DOMPoint(elementWindowOffset.offsetLeft - designerCanvas.outerRect.x + tfX, elementWindowOffset.offsetTop - designerCanvas.outerRect.y + tfY);
172
- if (actualElement == element) {
173
- const mtx = extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform));
160
+ //if (actualElement == element)
161
+ {
162
+ const transf = element.ownerDocument.defaultView.getComputedStyle(element).transform;
163
+ const mtx = extractTranslationFromDOMMatrix(new DOMMatrix(transf));
174
164
  parentElementTransformOrigin.x -= mtx.x;
175
165
  parentElementTransformOrigin.y -= mtx.y;
176
166
  }
@@ -260,23 +250,9 @@ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, u
260
250
  return transformedCornerPoints;
261
251
  }
262
252
  export function extractTranslationFromDOMMatrix(matrix) {
253
+ //TODO: maybe we also need m43 here??
263
254
  return new DOMPoint(matrix.m41, matrix.m42, 0, 0);
264
255
  }
265
256
  export function extractRotationAngleFromDOMMatrix(matrix) {
266
257
  return getRotationAngleFromMatrix(null, matrix);
267
258
  }
268
- export function normalizeToAbsolutePosition(element, normalizeProperty) {
269
- switch (normalizeProperty) {
270
- case "left":
271
- let left = getComputedStyle(element).left;
272
- element.style.removeProperty('right');
273
- element.style.left = left;
274
- return left;
275
- case "top":
276
- let top = getComputedStyle(element).top;
277
- element.style.removeProperty('bottom');
278
- element.style.top = top;
279
- return top;
280
- }
281
- return null;
282
- }
@@ -98,6 +98,7 @@ import { BasicWebcomponentPropertiesService } from './propertiesService/services
98
98
  import { PreviousElementSelectExtensionProvider } from '../widgets/designerView/extensions/PreviousElementSelectExtensionProvider.js';
99
99
  import { ForceCssContextMenu } from '../widgets/designerView/extensions/contextMenu/ForceCssContextMenu.js';
100
100
  import { OptionsContextMenuButton } from '../widgets/designerView/extensions/buttons/OptionsContextMenuButton.js';
101
+ import { ChildrenContextMenu } from '../widgets/designerView/extensions/contextMenu/ChildrenContextMenu.js';
101
102
  export function createDefaultServiceContainer() {
102
103
  let serviceContainer = new ServiceContainer();
103
104
  let defaultPlacementService = new DefaultPlacementService();
@@ -218,6 +219,7 @@ export function createDefaultServiceContainer() {
218
219
  new SelectAllChildrenContextMenu(),
219
220
  new SeperatorContextMenu(),
220
221
  new ItemsBelowContextMenu(),
222
+ new ChildrenContextMenu(),
221
223
  ];
222
224
  return serviceContainer;
223
225
  }
@@ -304,6 +304,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
304
304
  if (this._useIframe) {
305
305
  this._iframe = document.createElement('iframe');
306
306
  this._iframe.setAttribute("sandbox", "allow-same-origin");
307
+ //TODO: add option to allow scripts in iframes...
308
+ //this._iframe.setAttribute("sandbox", "allow-same-origin allow-scripts");
307
309
  this._canvas.appendChild(this._iframe);
308
310
  requestAnimationFrame(() => {
309
311
  this._window = this._iframe.contentWindow;
@@ -4,6 +4,7 @@ import { AbstractExtension } from './AbstractExtension.js';
4
4
  import { IExtensionManager } from './IExtensionManger.js';
5
5
  export declare class PreviousElementSelectExtension extends AbstractExtension {
6
6
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
7
+ private _path;
7
8
  private _rect;
8
9
  private _clickRect;
9
10
  private _g;
@@ -4,6 +4,7 @@ export class PreviousElementSelectExtension extends AbstractExtension {
4
4
  constructor(extensionManager, designerView, extendedItem) {
5
5
  super(extensionManager, designerView, extendedItem);
6
6
  }
7
+ _path;
7
8
  _rect;
8
9
  _clickRect;
9
10
  _g;
@@ -13,16 +14,18 @@ export class PreviousElementSelectExtension extends AbstractExtension {
13
14
  refresh(cache, event) {
14
15
  const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas, cache);
15
16
  if (!isNaN(transformedCornerPoints[1].x)) {
16
- if (this._valuesHaveChanges(transformedCornerPoints[1].x, transformedCornerPoints[1].y, this.designerCanvas.scaleFactor)) {
17
+ if (this._valuesHaveChanges(transformedCornerPoints[0].x, transformedCornerPoints[0].y, transformedCornerPoints[1].x, transformedCornerPoints[1].y, this.designerCanvas.scaleFactor)) {
18
+ const angle = Math.atan2((transformedCornerPoints[1].y - transformedCornerPoints[0].y), (transformedCornerPoints[1].x - transformedCornerPoints[0].x)) * 180 / Math.PI;
17
19
  const h = (16 / this.designerCanvas.scaleFactor);
18
- this._rect = this._drawRect(transformedCornerPoints[1].x - (15 / this.designerCanvas.scaleFactor), transformedCornerPoints[1].y - (16.5 / this.designerCanvas.scaleFactor), h, h, 'svg-previous-select', this._rect);
19
- this._clickRect = this._drawRect(transformedCornerPoints[1].x - (15 / this.designerCanvas.scaleFactor), transformedCornerPoints[1].y - (16.5 / this.designerCanvas.scaleFactor), h, h + 3, 'svg-invisible', this._clickRect);
20
+ this._rect = this._drawRect(0, 0, h, h, 'svg-previous-select', this._rect);
21
+ this._clickRect = this._drawRect(0, 0, h, h + 3, 'svg-invisible', this._clickRect);
20
22
  if (!this._g) {
21
23
  this._g = document.createElementNS("http://www.w3.org/2000/svg", "g");
22
24
  this._g.setAttribute('class', 'svg-previous-select');
23
- const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
24
- path.setAttribute('d', 'm4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z');
25
- this._g.appendChild(path);
25
+ this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
26
+ this._path.setAttribute('d', 'm4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z');
27
+ this._g.appendChild(this._rect);
28
+ this._g.appendChild(this._path);
26
29
  this._addOverlay(this._g);
27
30
  this._clickRect.onpointerdown = (e) => {
28
31
  e.preventDefault();
@@ -33,8 +36,12 @@ export class PreviousElementSelectExtension extends AbstractExtension {
33
36
  e.preventDefault();
34
37
  e.stopPropagation();
35
38
  };
39
+ this._g.appendChild(this._clickRect);
36
40
  }
37
- this._g.setAttribute('transform', 'translate(' + (transformedCornerPoints[1].x - (14.5 / this.designerCanvas.scaleFactor)) + ',' + (transformedCornerPoints[1].y - (15.5 / this.designerCanvas.scaleFactor)) + ') scale(' + 0.6 / this.designerCanvas.scaleFactor + ')');
41
+ this._path.style.scale = (0.6 / this.designerCanvas.scaleFactor).toString();
42
+ this._g.style.transform = 'translate(' + (transformedCornerPoints[1].x - (14.5 / this.designerCanvas.scaleFactor)) + 'px,' + (transformedCornerPoints[1].y - (15.5 / this.designerCanvas.scaleFactor)) + 'px) rotate(' + angle + 'deg)';
43
+ this._g.style.transformOrigin = '100% 100%';
44
+ this._g.style.transformBox = 'fill-box';
38
45
  }
39
46
  }
40
47
  }
@@ -9,6 +9,6 @@ export class PreviousElementSelectExtensionProvider {
9
9
  }
10
10
  static style = css `
11
11
  rect.svg-previous-select { stroke: none; fill: #3899ec; pointer-events: auto; }
12
- g.svg-previous-select { stroke: none; fill: white; }
12
+ g.svg-previous-select { fill: white; pointer-events: auto; }
13
13
  `;
14
14
  }
@@ -2,6 +2,7 @@ import { IDesignItem } from '../../../item/IDesignItem.js';
2
2
  import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
3
  import { AbstractExtension } from './AbstractExtension.js';
4
4
  import { IExtensionManager } from './IExtensionManger.js';
5
+ export declare function normalizeToAbsolutePosition(element: HTMLElement, normalizeProperty: "left" | "top"): string;
5
6
  export declare class ResizeExtension extends AbstractExtension {
6
7
  private resizeAllSelected;
7
8
  private _initialSizes;
@@ -1,8 +1,22 @@
1
1
  import { EventNames } from '../../../../enums/EventNames.js';
2
2
  import { getContentBoxContentOffsets } from '../../../helper/ElementHelper.js';
3
3
  import { roundValue } from '../../../helper/LayoutHelper.js';
4
- import { transformPointByInverseMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, normalizeToAbsolutePosition, getElementCombinedTransform } from "../../../helper/TransformHelper.js";
4
+ import { transformPointByInverseMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, getElementCombinedTransform } from "../../../helper/TransformHelper.js";
5
5
  import { AbstractExtension } from './AbstractExtension.js';
6
+ export function normalizeToAbsolutePosition(element, normalizeProperty) {
7
+ switch (normalizeProperty) {
8
+ case "left":
9
+ let left = getComputedStyle(element).left;
10
+ element.style.removeProperty('right');
11
+ element.style.left = left;
12
+ return left;
13
+ case "top":
14
+ let top = getComputedStyle(element).top;
15
+ element.style.removeProperty('bottom');
16
+ element.style.top = top;
17
+ return top;
18
+ }
19
+ }
6
20
  //TODO: use PlacementService, size is not always width/height could also be margin etc...
7
21
  // also when elment aligned to bottom, will it later also be?
8
22
  export class ResizeExtension extends AbstractExtension {
@@ -0,0 +1,9 @@
1
+ import { IContextMenuItem } from '../../../../helper/contextMenu/IContextMenuItem.js';
2
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
4
+ import { ContextmenuInitiator, IContextMenuExtension } from './IContextMenuExtension.js';
5
+ export declare class ChildrenContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ private _select;
9
+ }
@@ -0,0 +1,19 @@
1
+ import { DesignItem } from '../../../../item/DesignItem.js';
2
+ export class ChildrenContextMenu {
3
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
4
+ return initiator == 'designer';
5
+ }
6
+ provideContextMenuItems(event, designerCanvas, designItem) {
7
+ if (designItem) {
8
+ const lstItems = [...designItem.element.children];
9
+ if (lstItems.length > 0) {
10
+ return [{ title: 'children', children: [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (#' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))] }];
11
+ }
12
+ }
13
+ return [];
14
+ }
15
+ _select(designerView, element) {
16
+ const item = DesignItem.GetOrCreateDesignItem(element, element, designerView.serviceContainer, designerView.instanceServiceContainer);
17
+ designerView.instanceServiceContainer.selectionService.setSelectedElements([item]);
18
+ }
19
+ }
@@ -0,0 +1,9 @@
1
+ import { IContextMenuItem } from '../../../../helper/contextMenu/IContextMenuItem.js';
2
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
4
+ import { ContextmenuInitiator, IContextMenuExtension } from './IContextMenuExtension.js';
5
+ export declare class ItemsBelowContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ private _select;
9
+ }
@@ -0,0 +1,17 @@
1
+ import { DesignItem } from '../../../../item/DesignItem.js';
2
+ export class ItemsBelowContextMenu {
3
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
4
+ return initiator == 'designer';
5
+ }
6
+ provideContextMenuItems(event, designerCanvas, designItem) {
7
+ const lstItems = designerCanvas.elementsFromPoint(event.x, event.y);
8
+ if (lstItems.length > 0) {
9
+ return [{ title: 'items below', children: [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))] }];
10
+ }
11
+ return [];
12
+ }
13
+ _select(designerView, element) {
14
+ const item = DesignItem.GetOrCreateDesignItem(element, element, designerView.serviceContainer, designerView.instanceServiceContainer);
15
+ designerView.instanceServiceContainer.selectionService.setSelectedElements([item]);
16
+ }
17
+ }
@@ -6,7 +6,7 @@ export class ItemsBelowContextMenu {
6
6
  provideContextMenuItems(event, designerCanvas, designItem) {
7
7
  const lstItems = designerCanvas.elementsFromPoint(event.x, event.y);
8
8
  if (lstItems.length > 0) {
9
- return [{ title: 'items below', children: [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))] }];
9
+ return [{ title: 'items below', children: [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (#' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))] }];
10
10
  }
11
11
  return [];
12
12
  }
package/dist/index.d.ts CHANGED
@@ -275,6 +275,7 @@ export type { IContextMenuExtension, ContextmenuInitiator } from "./elements/wid
275
275
  export * from "./elements/widgets/designerView/extensions/contextMenu/ChildContextMenu.js";
276
276
  export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
277
277
  export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
278
+ export * from "./elements/widgets/designerView/extensions/contextMenu/ChildrenContextMenu.js";
278
279
  export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
279
280
  export * from "./elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js";
280
281
  export * from "./elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js";
package/dist/index.js CHANGED
@@ -214,6 +214,7 @@ export * from "./elements/widgets/designerView/extensions/EditText/EditTextExten
214
214
  export * from "./elements/widgets/designerView/extensions/contextMenu/ChildContextMenu.js";
215
215
  export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
216
216
  export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
217
+ export * from "./elements/widgets/designerView/extensions/contextMenu/ChildrenContextMenu.js";
217
218
  export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
218
219
  export * from "./elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js";
219
220
  export * from "./elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A WYSIWYG designer webcomponent for html components",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.1.162",
4
+ "version": "0.1.165",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",