@node-projects/web-component-designer 0.1.11 → 0.1.13

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.
Files changed (58) hide show
  1. package/dist/elements/helper/CssUnitConverter.js +1 -1
  2. package/dist/elements/helper/ElementHelper.d.ts +1 -1
  3. package/dist/elements/helper/ElementHelper.js +30 -4
  4. package/dist/elements/helper/GridHelper.js +1 -2
  5. package/dist/elements/helper/LayoutHelper.js +2 -2
  6. package/dist/elements/helper/NpmPackageLoader.js +2 -2
  7. package/dist/elements/helper/SwitchContainerHelper.js +2 -3
  8. package/dist/elements/helper/TransformHelper.d.ts +3 -3
  9. package/dist/elements/helper/TransformHelper.js +39 -12
  10. package/dist/elements/item/DesignItem.d.ts +3 -1
  11. package/dist/elements/item/DesignItem.js +12 -6
  12. package/dist/elements/item/IDesignItem.d.ts +1 -0
  13. package/dist/elements/services/BaseServiceContainer.d.ts +1 -0
  14. package/dist/elements/services/BaseServiceContainer.js +6 -0
  15. package/dist/elements/services/bindingsService/SpecialTagsBindingService.js +1 -1
  16. package/dist/elements/services/dragDropService/DragDropService.js +1 -1
  17. package/dist/elements/services/elementsService/IElementDefinition.d.ts +0 -6
  18. package/dist/elements/services/htmlWriterService/HtmlWriterService.js +1 -1
  19. package/dist/elements/services/instanceService/DefaultInstanceService.js +1 -2
  20. package/dist/elements/services/placementService/DefaultPlacementService.js +2 -2
  21. package/dist/elements/services/propertiesService/propertyEditors/special/GridAssignedRowColumnPropertyEditor.js +1 -1
  22. package/dist/elements/services/propertiesService/propertyEditors/special/MetricsPropertyEditor.js +1 -1
  23. package/dist/elements/services/propertiesService/services/AbstractPropertiesService.d.ts +4 -3
  24. package/dist/elements/services/propertiesService/services/AbstractPropertiesService.js +15 -10
  25. package/dist/elements/services/propertiesService/services/AttributesPropertiesService.js +1 -1
  26. package/dist/elements/services/propertiesService/services/ContentAndIdPropertiesService.js +1 -1
  27. package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.js +1 -1
  28. package/dist/elements/services/propertiesService/services/NativeElementsPropertiesService.js +15 -0
  29. package/dist/elements/services/stylesheetService/AbstractStylesheetService.js +1 -1
  30. package/dist/elements/widgets/designerView/DomConverter.js +1 -1
  31. package/dist/elements/widgets/designerView/designerCanvas.js +1 -1
  32. package/dist/elements/widgets/designerView/extensions/AbstractExtension.d.ts +2 -2
  33. package/dist/elements/widgets/designerView/extensions/AltToEnterContainerExtension.js +1 -1
  34. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +4 -4
  35. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -1
  36. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +41 -11
  37. package/dist/elements/widgets/designerView/extensions/IDesignerExtension.d.ts +2 -2
  38. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -1
  39. package/dist/elements/widgets/designerView/extensions/OverlayLayer.d.ts +1 -1
  40. package/dist/elements/widgets/designerView/extensions/OverlayLayer.js +1 -1
  41. package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.d.ts +2 -2
  42. package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.js +4 -4
  43. package/dist/elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js +1 -4
  44. package/dist/elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtension.js +5 -5
  45. package/dist/elements/widgets/designerView/overlayLayerView.d.ts +6 -0
  46. package/dist/elements/widgets/designerView/overlayLayerView.js +39 -4
  47. package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -1
  48. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -1
  49. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -1
  50. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +1 -1
  51. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -1
  52. package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +1 -1
  53. package/dist/elements/widgets/designerView/tools/PointerTool.js +2 -2
  54. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +1 -1
  55. package/dist/elements/widgets/designerView/tools/TextTool.js +1 -1
  56. package/dist/elements/widgets/designerView/tools/ZoomTool.js +1 -1
  57. package/dist/elements/widgets/treeView/treeView.js +1 -1
  58. package/package.json +1 -1
@@ -23,7 +23,7 @@ export function convertCssUnitToPixel(cssValue, target, percentTarget) {
23
23
  'lh': value => value * parseFloat(getComputedStyle(target).lineHeight),
24
24
  'rlh': value => value * parseFloat(getComputedStyle(document.documentElement).lineHeight),
25
25
  '%': value => value / 100 * (percentTarget == 'height' ? target.getBoundingClientRect().height : target.getBoundingClientRect().width),
26
- /* todo
26
+ /*TODO: container units
27
27
  //find parent with computed style where container-type is inline-size or size (regarding to query type)
28
28
  //use this size for calculation
29
29
  'cqw':
@@ -15,7 +15,7 @@ export declare function getElementDisplaytype(element: HTMLElement): ElementDisp
15
15
  export declare function isEmptyTextNode(node: Node): boolean;
16
16
  export declare function getActiveElement(): Element;
17
17
  export declare function getParentElementIncludingSlots(element: Element): Element;
18
- export declare function getElementsWindowOffsetWithoutSelfAndParentTransformations(element: any, zoom: number): {
18
+ export declare function getElementsWindowOffsetWithoutSelfAndParentTransformations(element: any, zoom: number, cache?: Record<string | symbol, any>): {
19
19
  offsetLeft: number;
20
20
  offsetTop: number;
21
21
  };
@@ -55,25 +55,45 @@ export function getParentElementIncludingSlots(element) {
55
55
  }
56
56
  return element.parentElement;
57
57
  }
58
- export function getElementsWindowOffsetWithoutSelfAndParentTransformations(element, zoom) {
58
+ const windowOffsetsCacheKey = Symbol('windowOffsetsCacheKey');
59
+ export function getElementsWindowOffsetWithoutSelfAndParentTransformations(element, zoom, cache = {}) {
59
60
  let offsetLeft = 0;
60
61
  let offsetTop = 0;
62
+ let ch = cache[windowOffsetsCacheKey] ??= new Map();
63
+ let lst = [];
61
64
  while (element) {
65
+ let cachedObj = ch.get(element);
66
+ if (cachedObj) {
67
+ offsetLeft += cachedObj.offsetLeft;
68
+ offsetTop += cachedObj.offsetTop;
69
+ lst.forEach(x => { x.offsetLeft += cachedObj.offsetLeft; x.offsetTop += cachedObj.offsetTop; });
70
+ break;
71
+ }
62
72
  if (element instanceof SVGSVGElement) {
63
- //todo - fix without transformation
73
+ //TODO: !huge Perf impact! - fix without transformation
64
74
  let t = element.style.transform;
65
75
  element.style.transform = '';
66
76
  const bcEl = element.getBoundingClientRect();
67
77
  const bcPar = element.parentElement.getBoundingClientRect();
68
78
  element.style.transform = t;
69
- offsetLeft += (bcEl.left - bcPar.left) / zoom;
70
- offsetTop += (bcEl.top - bcPar.top) / zoom;
79
+ const currLeft = (bcEl.left - bcPar.left) / zoom;
80
+ const currTop = (bcEl.top - bcPar.top) / zoom;
81
+ offsetLeft += currLeft;
82
+ offsetTop += currTop;
83
+ lst.forEach(x => { x.offsetLeft += currLeft; x.offsetTop += currTop; });
84
+ const cacheEntry = { offsetLeft: currLeft, offsetTop: currTop };
85
+ lst.push(cacheEntry);
86
+ ch.set(element, cacheEntry);
71
87
  element = element.parentElement;
72
88
  }
73
89
  else if (element instanceof SVGGraphicsElement) {
74
90
  let bbox = element.getBBox();
75
91
  offsetLeft += bbox.x;
76
92
  offsetTop += bbox.y;
93
+ lst.forEach(x => { x.offsetLeft += bbox.x; x.offsetTop += bbox.y; });
94
+ const cacheEntry = { offsetLeft: bbox.x, offsetTop: bbox.y };
95
+ lst.push(cacheEntry);
96
+ ch.set(element, cacheEntry);
77
97
  element = element.ownerSVGElement;
78
98
  }
79
99
  else if (element instanceof HTMLBodyElement) {
@@ -83,6 +103,12 @@ export function getElementsWindowOffsetWithoutSelfAndParentTransformations(eleme
83
103
  element = element.parentElement;
84
104
  }
85
105
  else {
106
+ const currLeft = element.offsetLeft;
107
+ const currTop = element.offsetTop;
108
+ lst.forEach(x => { x.offsetLeft += currLeft; x.offsetTop += currTop; });
109
+ const cacheEntry = { offsetLeft: currLeft, offsetTop: currTop };
110
+ lst.push(cacheEntry);
111
+ ch.set(element, cacheEntry);
86
112
  offsetLeft += element.offsetLeft;
87
113
  offsetTop += element.offsetTop;
88
114
  element = element.offsetParent;
@@ -18,8 +18,7 @@ export function getElementGridInformation(element) {
18
18
  return { colSpan, rowSpan };
19
19
  }
20
20
  export function calculateGridInformation(designItem) {
21
- //todo:
22
- //same name should combine columns/rows
21
+ //TODO: same name should combine columns/rows
23
22
  let itemRect = designItem.instanceServiceContainer.designerCanvas.getNormalizedElementCoordinates(designItem.element);
24
23
  let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(designItem.element, null, designItem.instanceServiceContainer.designerCanvas);
25
24
  const computedStyle = getComputedStyle(designItem.element);
@@ -1,5 +1,5 @@
1
- //todo
2
- //this function should return the correct property to change a layout, for example left/right when left or right is used,
1
+ //TODO: this function should return the correct property to change a layout,
2
+ // for example left/right when left or right is used,
3
3
  //maybe margin on grid? or transform??
4
4
  export function filterChildPlaceItems(items) {
5
5
  const filterdPlaceItems = [];
@@ -119,7 +119,7 @@ export class NpmPackageLoader {
119
119
  }
120
120
  }
121
121
  if (serviceContainer && paletteTree) {
122
- //todo: should be retriggered by service container, or changeing list in container
122
+ //TODO: should be retriggered by service container, or changeing list in container
123
123
  paletteTree.loadControls(serviceContainer, serviceContainer.elementsServices);
124
124
  }
125
125
  /* Package Hacks */
@@ -230,7 +230,7 @@ export class NpmPackageLoader {
230
230
  const map = importShim.getImportMap().imports;
231
231
  const importMap = { imports: {}, scopes: {} };
232
232
  if (!map.hasOwnProperty(packageJsonObj.name)) {
233
- //todo - use exports of package.json for importMap
233
+ //TODO: use exports of package.json for importMap
234
234
  if (packageJsonObj.exports) {
235
235
  /* "exports": {
236
236
  ".": {
@@ -1,7 +1,6 @@
1
1
  export function switchContainer(items, newContainer, resizeNewContainer = false, newContainerOffset = 0) {
2
- //todo...
3
- //- switch to other containers? like grid, flexbox, ...
4
- //- position non absolute, or absolute from bottom or right
2
+ //TODO: switch to other containers like grid, flexbox, ...
3
+ //TODO: position non absolute, or absolute from bottom or right
5
4
  for (let i of items) {
6
5
  if (i == newContainer || i.element.contains(newContainer.element)) {
7
6
  console.warn('could not move items into of itself or a child');
@@ -10,14 +10,14 @@ export declare function cssMatrixToMatrixArray(cssMatrix: string): number[];
10
10
  export declare function getRotationAngleFromMatrix(matrixArray: number[], domMatrix: DOMMatrix): any;
11
11
  export declare function addVectors(vectorA: [number, number], vectorB: [number, number]): [number, number];
12
12
  export declare function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element: HTMLElement, designerCanvas: IDesignerCanvas): DOMPoint;
13
- export declare function getResultingTransformationBetweenElementAndAllAncestors(element: HTMLElement, ancestor: HTMLElement, excludeAncestor?: boolean): DOMMatrix;
14
- export declare function getByParentsTransformedPointRelatedToCanvas(element: HTMLElement, point: DOMPoint, designerCanvas: IDesignerCanvas): IPoint;
13
+ export declare function getResultingTransformationBetweenElementAndAllAncestors(element: HTMLElement, ancestor: HTMLElement, excludeAncestor?: boolean, cache?: Record<string | symbol, any>): DOMMatrix;
14
+ export declare function getByParentsTransformedPointRelatedToCanvas(element: HTMLElement, point: DOMPoint, designerCanvas: IDesignerCanvas, cache?: Record<string | symbol, any>): IPoint;
15
15
  export declare function getDesignerCanvasNormalizedTransformedPoint(element: HTMLElement, point: IPoint, designerCanvas: IDesignerCanvas): IPoint;
16
16
  export declare function getElementSize(element: HTMLElement): {
17
17
  width: number;
18
18
  height: number;
19
19
  };
20
- export declare function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element: HTMLElement, untransformedCornerPointsOffset: IPoint | null, designerCanvas: IDesignerCanvas): [DOMPoint, DOMPoint, DOMPoint, DOMPoint];
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
23
  export declare function normalizeToAbsolutePosition(element: HTMLElement, normalizeProperty: "left" | "top"): string;
@@ -102,18 +102,33 @@ export function addVectors(vectorA, vectorB) {
102
102
  return [vectorA[0] + vectorB[0], vectorA[1] + vectorB[1]];
103
103
  }
104
104
  export function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element, designerCanvas) {
105
- const top0 = new DOMPointReadOnly(-parseFloat(getComputedStyle(element).transformOrigin.split(' ')[0]), -parseFloat(getComputedStyle(element).transformOrigin.split(' ')[1]), 0, 0);
105
+ const toSplit = getComputedStyle(element).transformOrigin.split(' ');
106
+ const tfX = parseFloat(toSplit[0]);
107
+ const tfY = parseFloat(toSplit[1]);
108
+ const top0 = new DOMPointReadOnly(-tfX, -tfY, 0, 0);
106
109
  const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element, designerCanvas.zoomFactor);
107
110
  const transformOriginAbsolutRelatedToWindowWithoutAnyTransformation = new DOMPoint(p0Offsets.offsetLeft - top0.x, p0Offsets.offsetTop - top0.y);
108
111
  const designerCanvasNormalizedTransformedOrigin = new DOMPoint(transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.x - designerCanvas.containerBoundingRect.x, transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.y - designerCanvas.containerBoundingRect.y);
109
112
  return designerCanvasNormalizedTransformedOrigin;
110
113
  }
111
- export function getResultingTransformationBetweenElementAndAllAncestors(element, ancestor, excludeAncestor) {
114
+ const elemntMatrixCacheKey = Symbol('windowOffsetsCacheKey');
115
+ export function getResultingTransformationBetweenElementAndAllAncestors(element, ancestor, excludeAncestor, cache = {}) {
116
+ let ch = cache[elemntMatrixCacheKey] ??= new Map();
117
+ let lst = [];
112
118
  let actualElement = element;
113
119
  let actualElementMatrix;
114
120
  let newElementMatrix;
115
121
  let originalElementAndAllParentsMultipliedMatrix;
116
122
  while (actualElement != ancestor) {
123
+ let cachedObj = ch.get(actualElement);
124
+ if (cachedObj) {
125
+ if (originalElementAndAllParentsMultipliedMatrix)
126
+ originalElementAndAllParentsMultipliedMatrix = cachedObj[0].multiply(originalElementAndAllParentsMultipliedMatrix);
127
+ else
128
+ originalElementAndAllParentsMultipliedMatrix = cachedObj[0];
129
+ lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
130
+ break;
131
+ }
117
132
  const newElement = getParentElementIncludingSlots(actualElement);
118
133
  actualElementMatrix = getElementCombinedTransform(actualElement);
119
134
  newElementMatrix = getElementCombinedTransform(newElement);
@@ -124,21 +139,30 @@ export function getResultingTransformationBetweenElementAndAllAncestors(element,
124
139
  else if (newElement != ancestor || !excludeAncestor) {
125
140
  originalElementAndAllParentsMultipliedMatrix = originalElementAndAllParentsMultipliedMatrix.multiply(newElementMatrix);
126
141
  }
142
+ lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
143
+ const cacheEntry = [originalElementAndAllParentsMultipliedMatrix];
144
+ lst.push(cacheEntry);
145
+ ch.set(actualElement, cacheEntry);
127
146
  actualElement = newElement;
128
147
  }
129
148
  return originalElementAndAllParentsMultipliedMatrix;
130
149
  }
131
- export function getByParentsTransformedPointRelatedToCanvas(element, point, designerCanvas) {
150
+ export function getByParentsTransformedPointRelatedToCanvas(element, point, designerCanvas, cache) {
132
151
  const canvas = element.closest('#node-projects-designer-canvas-canvas');
133
152
  let actualElement = element;
134
153
  let parentElementTransformOriginToPointVectorTransformed;
135
154
  let byParentTransformedPointRelatedToCanvas = { x: 0, y: 0 };
136
155
  while (actualElement != canvas) {
137
156
  const parentElement = getParentElementIncludingSlots(actualElement);
138
- const parentElementTransformOrigin = new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement, designerCanvas.zoomFactor).offsetLeft - designerCanvas.outerRect.x + parseFloat(getComputedStyle(parentElement).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement, designerCanvas.zoomFactor).offsetTop - designerCanvas.outerRect.y + parseFloat(getComputedStyle(parentElement).transformOrigin.split(' ')[1]));
157
+ const elementWindowOffset = getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement, designerCanvas.zoomFactor, cache);
158
+ const toSplit = getComputedStyle(parentElement).transformOrigin.split(' ');
159
+ const tfX = parseFloat(toSplit[0]);
160
+ const tfY = parseFloat(toSplit[1]);
161
+ const parentElementTransformOrigin = new DOMPoint(elementWindowOffset.offsetLeft - designerCanvas.outerRect.x + tfX, elementWindowOffset.offsetTop - designerCanvas.outerRect.y + tfY);
139
162
  if (actualElement == element) {
140
- parentElementTransformOrigin.x -= extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform)).x;
141
- parentElementTransformOrigin.y -= extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform)).y;
163
+ const mtx = extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform));
164
+ parentElementTransformOrigin.x -= mtx.x;
165
+ parentElementTransformOrigin.y -= mtx.y;
142
166
  }
143
167
  const parentElementTransformOriginToPointVector = new DOMPointReadOnly(-parentElementTransformOrigin.x + (element == actualElement ? point.x : byParentTransformedPointRelatedToCanvas.x), -parentElementTransformOrigin.y + (element == actualElement ? point.y : byParentTransformedPointRelatedToCanvas.y));
144
168
  parentElementTransformOriginToPointVectorTransformed = parentElementTransformOriginToPointVector.matrixTransform(new DOMMatrix(getComputedStyle(parentElement).transform));
@@ -164,13 +188,13 @@ export function getElementSize(element) {
164
188
  }
165
189
  return { width, height };
166
190
  }
167
- export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, untransformedCornerPointsOffset, designerCanvas) {
191
+ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, untransformedCornerPointsOffset, designerCanvas, cache) {
168
192
  const topleft = 0;
169
193
  const topright = 1;
170
194
  const bottomleft = 2;
171
195
  const bottomright = 3;
172
196
  const intUntransformedCornerPointsOffset = untransformedCornerPointsOffset ? { x: untransformedCornerPointsOffset.x / designerCanvas.scaleFactor, y: untransformedCornerPointsOffset.y / designerCanvas.scaleFactor } : { x: 0, y: 0 };
173
- const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element, designerCanvas.zoomFactor);
197
+ const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element, designerCanvas.zoomFactor, cache);
174
198
  const p0OffsetsRelatedToCanvas = DOMPoint.fromPoint({
175
199
  x: p0Offsets.offsetLeft - designerCanvas.containerBoundingRect.left,
176
200
  y: p0Offsets.offsetTop - designerCanvas.containerBoundingRect.top
@@ -193,18 +217,21 @@ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, u
193
217
  x: p0OffsetsRelatedToCanvas.x + width + intUntransformedCornerPointsOffset.x,
194
218
  y: p0OffsetsRelatedToCanvas.y + height + intUntransformedCornerPointsOffset.y
195
219
  });
220
+ const toSplit = getComputedStyle(element).transformOrigin.split(' ');
221
+ const tfX = parseFloat(toSplit[0]);
222
+ const tfY = parseFloat(toSplit[1]);
196
223
  const transformOriginWithoutTransformRelatedToCanvas = DOMPointReadOnly.fromPoint({
197
- x: p0OffsetsRelatedToCanvas.x + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[0]),
198
- y: p0OffsetsRelatedToCanvas.y + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[1]),
224
+ x: p0OffsetsRelatedToCanvas.x + tfX,
225
+ y: p0OffsetsRelatedToCanvas.y + tfY,
199
226
  z: 0,
200
227
  w: 0
201
228
  });
202
- const designerCanvasNormalizedTransformOrigin = getByParentsTransformedPointRelatedToCanvas(element, new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(element, designerCanvas.zoomFactor).offsetLeft - designerCanvas.outerRect.left + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(element, designerCanvas.zoomFactor).offsetTop - designerCanvas.outerRect.top + parseFloat(getComputedStyle(element).transformOrigin.split(' ')[1])), designerCanvas);
229
+ const designerCanvasNormalizedTransformOrigin = getByParentsTransformedPointRelatedToCanvas(element, new DOMPoint(p0Offsets.offsetLeft - designerCanvas.outerRect.left + tfX, p0Offsets.offsetTop - designerCanvas.outerRect.top + tfY), designerCanvas, cache);
203
230
  let top0 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topleft].y));
204
231
  let top1 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topright].y));
205
232
  let top2 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomleft].y));
206
233
  let top3 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomright].y));
207
- let originalElementAndAllParentsMultipliedMatrix = getResultingTransformationBetweenElementAndAllAncestors(element, designerCanvas.canvas, true);
234
+ let originalElementAndAllParentsMultipliedMatrix = getResultingTransformationBetweenElementAndAllAncestors(element, designerCanvas.canvas, true, cache);
208
235
  let top0Transformed = top0.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
209
236
  let top1Transformed = top1.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
210
237
  let top2Transformed = top2.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
@@ -15,6 +15,7 @@ export declare class DesignItem implements IDesignItem {
15
15
  lastContainerSize: ISize;
16
16
  parsedNode: any;
17
17
  node: Node;
18
+ view: Node;
18
19
  serviceContainer: ServiceContainer;
19
20
  instanceServiceContainer: InstanceServiceContainer;
20
21
  appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
@@ -73,6 +74,7 @@ export declare class DesignItem implements IDesignItem {
73
74
  static createDesignItemFromInstance(node: Node, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): DesignItem;
74
75
  updateChildrenFromNodesChildren(): void;
75
76
  constructor(node: Node, parsedNode: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer);
77
+ setView(node: Element): void;
76
78
  openGroup(title: string): ChangeGroup;
77
79
  getOrCreateDesignItem(node: Node): IDesignItem;
78
80
  static GetOrCreateDesignItem(node: Node, parsedNode: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): IDesignItem;
@@ -88,7 +90,7 @@ export declare class DesignItem implements IDesignItem {
88
90
  getAllStyles(): IStyleRule[];
89
91
  setAttribute(name: string, value?: string | null): void;
90
92
  removeAttribute(name: string): void;
91
- _insertChildInternal(designItem: IDesignItem, index?: number): void;
93
+ _insertChildInternal(designItem: DesignItem, index?: number): void;
92
94
  _removeChildInternal(designItem: IDesignItem): void;
93
95
  _refreshIfStyleSheet(): void;
94
96
  getPlacementService(style?: CSSStyleDeclaration): IPlacementService;
@@ -18,6 +18,7 @@ export class DesignItem {
18
18
  lastContainerSize;
19
19
  parsedNode;
20
20
  node;
21
+ view;
21
22
  serviceContainer;
22
23
  instanceServiceContainer;
23
24
  appliedDesignerExtensions = new Map();
@@ -133,10 +134,10 @@ export class DesignItem {
133
134
  }
134
135
  static _designItemMap = new WeakMap();
135
136
  get element() {
136
- return this.node;
137
+ return this.view;
137
138
  }
138
139
  get name() {
139
- return this.element.localName;
140
+ return this.node.localName;
140
141
  }
141
142
  get id() {
142
143
  return this.element.id;
@@ -320,6 +321,7 @@ export class DesignItem {
320
321
  }
321
322
  constructor(node, parsedNode, serviceContainer, instanceServiceContainer) {
322
323
  this.node = node;
324
+ this.view = node;
323
325
  this.parsedNode = parsedNode;
324
326
  this.serviceContainer = serviceContainer;
325
327
  this.instanceServiceContainer = instanceServiceContainer;
@@ -327,6 +329,10 @@ export class DesignItem {
327
329
  this._styles = new Map();
328
330
  DesignItem._designItemMap.set(node, this);
329
331
  }
332
+ setView(node) {
333
+ this.view = node;
334
+ DesignItem._designItemMap.set(node, this);
335
+ }
330
336
  openGroup(title) {
331
337
  return this.instanceServiceContainer.undoService.openGroup(title);
332
338
  }
@@ -451,15 +457,15 @@ export class DesignItem {
451
457
  }
452
458
  if (index == null || this._childArray.length == 0 || index >= this._childArray.length) {
453
459
  this._childArray.push(designItem);
454
- this.element.appendChild(designItem.node);
460
+ this.view.appendChild(designItem.view);
455
461
  }
456
462
  else {
457
463
  let el = this._childArray[index];
458
- this.node.insertBefore(designItem.node, el.element);
464
+ this.view.insertBefore(designItem.view, el.element);
459
465
  this._childArray.splice(index, 0, designItem);
460
466
  }
461
467
  designItem._parent = this;
462
- //todo: is this still needed???
468
+ //TODO: is this still needed???
463
469
  if (this.instanceServiceContainer.selectionService.primarySelection == designItem) {
464
470
  designItem.instanceServiceContainer.designerCanvas.extensionManager.applyExtension(designItem.parent, ExtensionType.PrimarySelectionContainer);
465
471
  if (designItem.getPlacementService().isEnterableContainer(this))
@@ -486,7 +492,7 @@ export class DesignItem {
486
492
  //Update Stylesheetservice with sheet info
487
493
  //Patch this sheetdata
488
494
  const realContent = this._childArray.reduce((a, b) => a + b.content, '');
489
- this.node.textContent = AbstractStylesheetService.buildPatchedStyleSheet([cssFromString(realContent)]);
495
+ this.view.textContent = AbstractStylesheetService.buildPatchedStyleSheet([cssFromString(realContent)]);
490
496
  this.instanceServiceContainer.designerCanvas.lazyTriggerReparseDocumentStylesheets();
491
497
  }
492
498
  else if (this.name == 'link') {
@@ -11,6 +11,7 @@ import { IPlacementService } from '../services/placementService/IPlacementServic
11
11
  import { TypedEvent } from '@node-projects/base-custom-webcomponent';
12
12
  export interface IDesignItem {
13
13
  lastContainerSize: ISize;
14
+ setView(node: Element): any;
14
15
  replaceNode(newNode: Node): any;
15
16
  nodeReplaced: TypedEvent<void>;
16
17
  clone(): Promise<IDesignItem>;
@@ -8,6 +8,7 @@ export declare class BaseServiceContainer<NameMap> {
8
8
  getLastService<K extends keyof NameMap>(service: K): NameMap[K];
9
9
  getServices<K extends keyof NameMap>(service: K): NameMap[K][];
10
10
  register<K extends keyof NameMap>(name: K, service: NameMap[K]): void;
11
+ registerLast<K extends keyof NameMap>(name: K, service: NameMap[K]): void;
11
12
  registerMultiple<K extends keyof NameMap>(names: K[], service: NameMap[K]): void;
12
13
  forSomeServicesTillResult<K extends keyof NameMap, Y>(service: K, callback: (service: NameMap[K]) => Y): Y;
13
14
  getLastServiceWhere<K extends keyof NameMap, Y>(service: K, callback: (service: NameMap[K]) => Y): NameMap[K];
@@ -17,6 +17,12 @@ export class BaseServiceContainer {
17
17
  this._services.get(name).push(service);
18
18
  this.servicesChanged.emit({ serviceName: name });
19
19
  }
20
+ registerLast(name, service) {
21
+ if (!this._services.has(name))
22
+ this._services.set(name, []);
23
+ this._services.get(name).unshift(service);
24
+ this.servicesChanged.emit({ serviceName: name });
25
+ }
20
26
  registerMultiple(names, service) {
21
27
  for (const name of names) {
22
28
  if (!this._services.has(name))
@@ -1,6 +1,6 @@
1
1
  import { BindingTarget } from "../../item/BindingTarget.js";
2
2
  import { BindingMode } from "../../item/BindingMode.js";
3
- /* Service wich read binings from special HTMl elements -> like tag-binding */
3
+ /* Service wich read bindings from special HTML elements -> like tag-binding */
4
4
  //TODO: refactor so we could use it
5
5
  export class SpecialTagsBindingService {
6
6
  static type = 'visu-tagbinding-binding';
@@ -72,7 +72,7 @@ export class DragDropService {
72
72
  const containerStyle = getComputedStyle(newContainerElementDesignItem.element);
73
73
  newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle));
74
74
  if (newContainerService) {
75
- //TODO: Maybe the check for SVG Elemnt should be in "canEnterByDrop"?
75
+ //TODO: Maybe the check for SVG Element should be in "canEnterByDrop"?
76
76
  if (newContainerService.isEnterableContainer(newContainerElementDesignItem) && !(newContainerElementDesignItem.element instanceof SVGElement)) {
77
77
  break;
78
78
  }
@@ -16,12 +16,6 @@ export interface IElementDefinition {
16
16
  defaultWidth?: string;
17
17
  defaultHeight?: string;
18
18
  ghostElement?: Element;
19
- /**
20
- * every component normal get's the property '_inNodeProjectsDesignerView' set. if it should not be the case on this component set this to true
21
- * a component could have special logic when this is true
22
- * TODO: maybe remove this, if someone needs such a function, he could use it's own instance provider...
23
- */
24
- doNotSetInNodeProjectsDesignerViewOnInstance?: boolean;
25
19
  /**
26
20
  * Name of the Tool activated when selecting the element.
27
21
  * If none, the DrawElementTool is used
@@ -30,7 +30,7 @@ export class HtmlWriterService extends AbstractHtmlWriterService {
30
30
  this.internalWrite(indentedTextWriter, d, updatePositions);
31
31
  }
32
32
  }
33
- //todo special case for style/script nodes, keep whitespace
33
+ //TODO: special case for style/script nodes, keep whitespace
34
34
  internalWrite(indentedTextWriter, designItem, updatePositions) {
35
35
  let start = indentedTextWriter.position;
36
36
  let end = indentedTextWriter.position;
@@ -46,8 +46,7 @@ export class DefaultInstanceService {
46
46
  }
47
47
  const elementString = '<' + definition.tag + attr + '></' + definition.tag + '>';
48
48
  const element = newElementFromString(elementString);
49
- if (!definition.doNotSetInNodeProjectsDesignerViewOnInstance)
50
- element._inNodeProjectsDesignerView = true;
49
+ element._inNodeProjectsDesignerView = true;
51
50
  if (definition.defaultWidth)
52
51
  element.style.width = definition.defaultWidth;
53
52
  if (definition.defaultHeight)
@@ -20,7 +20,7 @@ export class DefaultPlacementService {
20
20
  canEnter(container, items) {
21
21
  if (!this.isEnterableContainer(container))
22
22
  return false;
23
- if (!items.every(x => !x.element.contains(container.element)))
23
+ if (!items.every(x => !x.element.contains(container.element) && x !== container))
24
24
  return false;
25
25
  return true;
26
26
  }
@@ -86,7 +86,7 @@ export class DefaultPlacementService {
86
86
  startPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
87
87
  }
88
88
  place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
89
- //TODO:, this should revert all undo actions while active
89
+ //TODO: this should revert all undo actions while active
90
90
  //maybe a undo actions returns itself or an id so it could be changed?
91
91
  let track = this.calculateTrack(event, placementView, startPoint, offsetInControl, newPoint, items[0]);
92
92
  if (event.shiftKey) {
@@ -1,7 +1,7 @@
1
1
  import { BasePropertyEditor } from '../BasePropertyEditor.js';
2
2
  import { getElementGridInformation } from '../../../../helper/GridHelper.js';
3
3
  export class GridAssignedRowColumnPropertyEditor extends BasePropertyEditor {
4
- //Todo: multiple cell selection, grid area support, span support
4
+ //TODO: multiple cell selection, grid area support, span support
5
5
  _root;
6
6
  constructor(property) {
7
7
  super(property);
@@ -1,7 +1,7 @@
1
1
  import { BasePropertyEditor } from '../BasePropertyEditor.js';
2
2
  import { MetricsEditor } from '../../../../controls/MetricsEditor.js';
3
3
  export class MetricsPropertyEditor extends BasePropertyEditor {
4
- //Todo: metrics editor does not work at all yet
4
+ //TODO: metrics editor does not work at all yet
5
5
  constructor(property) {
6
6
  super(property);
7
7
  const selector = new MetricsEditor();
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { IPropertiesService, RefreshMode } from '../IPropertiesService.js';
3
2
  import { IProperty } from '../IProperty.js';
4
3
  import { IDesignItem } from '../../../item/IDesignItem.js';
@@ -7,8 +6,10 @@ import { BindingTarget } from '../../../item/BindingTarget.js';
7
6
  import { IBinding } from '../../../item/IBinding.js';
8
7
  import { IPropertyGroup } from '../IPropertyGroup.js';
9
8
  export declare abstract class AbstractPropertiesService implements IPropertiesService {
10
- _stylesCache: Map<IDesignItem, Set<string>>;
11
- _cacheClearTimer: NodeJS.Timeout;
9
+ private static _stylesCache;
10
+ private _cssCacheClearTimer;
11
+ private static _bindingsCache;
12
+ private _bindingsCacheClearTimer;
12
13
  abstract getRefreshMode(designItem: IDesignItem): RefreshMode;
13
14
  abstract isHandledElement(designItem: IDesignItem): boolean;
14
15
  protected _notifyChangedProperty(designItem: IDesignItem, property: IProperty, value: any): void;
@@ -4,8 +4,10 @@ import { BindingTarget } from '../../../item/BindingTarget.js';
4
4
  import { PropertyType } from '../PropertyType.js';
5
5
  import { NodeType } from '../../../item/NodeType.js';
6
6
  export class AbstractPropertiesService {
7
- _stylesCache = new Map;
8
- _cacheClearTimer;
7
+ static _stylesCache = new Map;
8
+ _cssCacheClearTimer;
9
+ static _bindingsCache = new Map;
10
+ _bindingsCacheClearTimer;
9
11
  _notifyChangedProperty(designItem, property, value) {
10
12
  }
11
13
  getProperty(designItem, name) {
@@ -104,10 +106,13 @@ export class AbstractPropertiesService {
104
106
  break;
105
107
  }
106
108
  ;
107
- //todo: optimize perf, do not call bindings service for each property.
108
- const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
109
- return s.getBindings(designItems[0]);
110
- });
109
+ let bindings = AbstractPropertiesService._bindingsCache.get(designItems[0]);
110
+ if (!bindings) {
111
+ bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => s.getBindings(designItems[0]));
112
+ AbstractPropertiesService._bindingsCache.set(designItems[0], bindings);
113
+ clearTimeout(this._bindingsCacheClearTimer);
114
+ this._bindingsCacheClearTimer = setTimeout(() => AbstractPropertiesService._bindingsCache.clear(), 30);
115
+ }
111
116
  if (property.propertyType == PropertyType.cssValue) {
112
117
  if (bindings && bindings.find(x => x.target == BindingTarget.css && x.targetName == property.name))
113
118
  return ValueType.bound;
@@ -117,12 +122,12 @@ export class AbstractPropertiesService {
117
122
  return ValueType.bound;
118
123
  }
119
124
  if (!all && property.propertyType == PropertyType.cssValue) {
120
- let styles = this._stylesCache.get(designItems[0]);
125
+ let styles = AbstractPropertiesService._stylesCache.get(designItems[0]);
121
126
  if (!styles) {
122
127
  styles = new Set(designItems[0].getAllStyles().filter(x => x.selector != null).flatMap(x => x.declarations).map(x => x.name));
123
- this._stylesCache.set(designItems[0], styles);
124
- clearTimeout(this._cacheClearTimer);
125
- this._cacheClearTimer = setTimeout(() => this._stylesCache.clear(), 30);
128
+ AbstractPropertiesService._stylesCache.set(designItems[0], styles);
129
+ clearTimeout(this._cssCacheClearTimer);
130
+ this._cssCacheClearTimer = setTimeout(() => AbstractPropertiesService._stylesCache.clear(), 30);
126
131
  }
127
132
  let cssValue = styles.has(property.name);
128
133
  if (cssValue)
@@ -56,7 +56,7 @@ export class AttributesPropertiesService {
56
56
  all = all && has;
57
57
  some = some || has;
58
58
  });
59
- //todo: optimize perf, do not call bindings service for each property.
59
+ //TODO: optimize perf, do not call bindings service for each property.
60
60
  const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
61
61
  return s.getBindings(designItems[0]);
62
62
  });
@@ -64,7 +64,7 @@ export class ContentAndIdPropertiesService extends AbstractPropertiesService {
64
64
  all = all && has;
65
65
  some = some || has;
66
66
  });
67
- //todo: optimize perf, do not call bindings service for each property.
67
+ //TODO: optimize perf, do not call bindings service for each property.
68
68
  const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
69
69
  return s.getBindings(designItems[0]);
70
70
  });
@@ -44,7 +44,7 @@ export class CssCurrentPropertiesService extends CommonPropertiesService {
44
44
  // No selector means local style, styleDeclaration is null means new property
45
45
  if (property.styleRule?.selector !== null && property.styleDeclaration) {
46
46
  // styleDeclaration stored Propertygrid is not refreshed after entering a new value, so we need to reload
47
- // TODO: we do not respect if a same style is found in a media query or another @rule, maybe we need a refresh in the stylesheet parser
47
+ //TODO: we do not respect if a same style is found in a media query or another @rule, maybe we need a refresh in the stylesheet parser
48
48
  const decls = designItems[0].instanceServiceContainer.stylesheetService?.getDeclarations(designItems[0], property.styleDeclaration.name);
49
49
  const currentDecl = decls.find(x => x.parent.selector == property.styleDeclaration.parent.selector && x.parent.stylesheetName == property.styleDeclaration.parent.stylesheetName);
50
50
  designItems[0].instanceServiceContainer.stylesheetService.updateDeclarationValue(currentDecl, value, false);
@@ -178,6 +178,13 @@ export class NativeElementsPropertiesService extends CommonPropertiesService {
178
178
  case 'br':
179
179
  case 'img':
180
180
  case 'iframe':
181
+ case 'h1':
182
+ case 'h2':
183
+ case 'h3':
184
+ case 'h4':
185
+ case 'h5':
186
+ case 'h6':
187
+ case 'p':
181
188
  return true;
182
189
  }
183
190
  return false;
@@ -205,6 +212,14 @@ export class NativeElementsPropertiesService extends CommonPropertiesService {
205
212
  return this.imgProperties;
206
213
  case 'iframe':
207
214
  return this.iframeProperties;
215
+ case 'h1':
216
+ case 'h2':
217
+ case 'h3':
218
+ case 'h4':
219
+ case 'h5':
220
+ case 'h6':
221
+ case 'p':
222
+ return [];
208
223
  }
209
224
  return null;
210
225
  }