@node-projects/web-component-designer 0.0.150 → 0.0.152

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 (60) hide show
  1. package/dist/elements/helper/ElementHelper.d.ts +5 -0
  2. package/dist/elements/helper/ElementHelper.js +20 -0
  3. package/dist/elements/helper/GridHelper.js +2 -2
  4. package/dist/elements/helper/LayoutHelper.js +8 -2
  5. package/dist/elements/helper/TransformHelper.d.ts +17 -3
  6. package/dist/elements/helper/TransformHelper.js +204 -13
  7. package/dist/elements/services/DefaultServiceBootstrap.js +10 -2
  8. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -0
  9. package/dist/elements/services/placementService/DefaultPlacementService.js +24 -8
  10. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -0
  11. package/dist/elements/services/placementService/FlexBoxPlacementService.js +2 -0
  12. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -0
  13. package/dist/elements/services/placementService/GridPlacementService.js +2 -0
  14. package/dist/elements/services/placementService/IPlacementService.d.ts +1 -0
  15. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +4 -0
  16. package/dist/elements/widgets/designerView/IPlacementView.d.ts +0 -1
  17. package/dist/elements/widgets/designerView/designerCanvas.d.ts +2 -2
  18. package/dist/elements/widgets/designerView/designerCanvas.js +10 -8
  19. package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.d.ts +2 -0
  20. package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.js +8 -0
  21. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +1 -0
  22. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +2 -1
  23. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +1 -0
  24. package/dist/elements/widgets/designerView/extensions/FlexboxExtension.d.ts +11 -0
  25. package/dist/elements/widgets/designerView/extensions/FlexboxExtension.js +20 -0
  26. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.d.ts +6 -0
  27. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js +21 -0
  28. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionProvider.d.ts +11 -0
  29. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionProvider.js +17 -0
  30. package/dist/elements/widgets/designerView/extensions/GrayOutDragOverContainerExtension.js +3 -2
  31. package/dist/elements/widgets/designerView/extensions/GridExtension copy.d.ts +10 -0
  32. package/dist/elements/widgets/designerView/extensions/GridExtension copy.js +30 -0
  33. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons copy.d.ts +6 -0
  34. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons copy.js +21 -0
  35. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.d.ts +11 -0
  36. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider copy.js +18 -0
  37. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.js +2 -1
  38. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.js +3 -2
  39. package/dist/elements/widgets/designerView/extensions/MouseOverExtension.js +3 -4
  40. package/dist/elements/widgets/designerView/extensions/PlacementExtension.d.ts +11 -0
  41. package/dist/elements/widgets/designerView/extensions/PlacementExtension.js +22 -0
  42. package/dist/elements/widgets/designerView/extensions/PlacementExtensionProvider.d.ts +10 -0
  43. package/dist/elements/widgets/designerView/extensions/PlacementExtensionProvider.js +13 -0
  44. package/dist/elements/widgets/designerView/extensions/ResizeExtension.d.ts +3 -1
  45. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +201 -41
  46. package/dist/elements/widgets/designerView/extensions/RotateExtension.d.ts +8 -2
  47. package/dist/elements/widgets/designerView/extensions/RotateExtension.js +77 -43
  48. package/dist/elements/widgets/designerView/extensions/RotateExtensionProvider.js +1 -0
  49. package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.d.ts +4 -1
  50. package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.js +14 -9
  51. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +30 -20
  52. package/dist/elements/widgets/designerView/overlayLayerView.d.ts +1 -0
  53. package/dist/elements/widgets/designerView/overlayLayerView.js +10 -0
  54. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
  55. package/dist/elements/widgets/designerView/tools/PointerTool.js +16 -0
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.js +3 -0
  58. package/dist/interfaces/IPoint3D.d.ts +5 -0
  59. package/dist/interfaces/IPoint3D.js +1 -0
  60. package/package.json +1 -1
@@ -9,3 +9,8 @@ export declare function isInlineAfter(element: HTMLElement): boolean;
9
9
  export declare function getElementDisplaytype(element: HTMLElement): ElementDisplayType;
10
10
  export declare function isEmptyTextNode(node: Node): boolean;
11
11
  export declare function getActiveElement(): Element;
12
+ export declare function getParentElementIncludingSlots(element: Element): Element;
13
+ export declare function getElementsWindowOffsetWithoutSelfAndParentTransformations(element: any): {
14
+ offsetLeft: number;
15
+ offsetTop: number;
16
+ };
@@ -33,3 +33,23 @@ export function getActiveElement() {
33
33
  }
34
34
  return activeElement;
35
35
  }
36
+ export function getParentElementIncludingSlots(element) {
37
+ if (element.assignedSlot)
38
+ return element.assignedSlot;
39
+ if (element.parentElement == null) {
40
+ if (element.parentNode instanceof ShadowRoot) {
41
+ return element.parentNode.host;
42
+ }
43
+ }
44
+ return element.parentElement;
45
+ }
46
+ export function getElementsWindowOffsetWithoutSelfAndParentTransformations(element) {
47
+ var offsetLeft = 0;
48
+ var offsetTop = 0;
49
+ while (element) {
50
+ offsetLeft += element.offsetLeft;
51
+ offsetTop += element.offsetTop;
52
+ element = element.offsetParent;
53
+ }
54
+ return { offsetLeft: offsetLeft, offsetTop: offsetTop };
55
+ }
@@ -75,7 +75,7 @@ export function CalculateGridInformation(designItem) {
75
75
  for (let xIdx = 0; xIdx < rows.length; xIdx++) {
76
76
  const r = rows[xIdx];
77
77
  let areas = null;
78
- if (gridA) {
78
+ if (gridA && gridA[rw + 1]) {
79
79
  areas = gridA[rw + 1].split(' ');
80
80
  }
81
81
  let x = 0;
@@ -94,7 +94,7 @@ export function CalculateGridInformation(designItem) {
94
94
  retVal.gaps.push({ x: x + xOffset + paddingLeft, y: y + yOffset - yGap + paddingTop, width: currX, height: yGap });
95
95
  }
96
96
  let name = null;
97
- if (areas) {
97
+ if (areas && areas[cl]) {
98
98
  const nm = areas[cl].trim();
99
99
  if (nm != '.') {
100
100
  name = nm;
@@ -58,8 +58,14 @@ export function placeDesignItem(container, designItem, offset, mode) {
58
58
  }
59
59
  if (!hasPositionedLayout)
60
60
  designItem.setStyle('position', 'absolute');
61
- designItem.setStyle('left', (offset.x + (oldLeft ?? 0) + containerLeft) + "px");
62
- designItem.setStyle('top', (offset.y + (oldTop ?? 0) + containerTop) + "px");
61
+ if (oldLeft || oldRight == null)
62
+ designItem.setStyle('left', (offset.x + (oldLeft ?? 0) + containerLeft) + "px");
63
+ if (oldTop || oldBottom == null)
64
+ designItem.setStyle('top', (offset.y + (oldTop ?? 0) + containerTop) + "px");
65
+ if (oldRight)
66
+ designItem.setStyle('right', ((oldRight ?? 0) - offset.x + containerRight) + "px");
67
+ if (oldBottom)
68
+ designItem.setStyle('bottom', ((oldBottom ?? 0) - offset.y + containerBottom) + "px");
63
69
  }
64
70
  }
65
71
  /*function placeViaPosition(container: IDesignItem, designItem: IDesignItem, offset: IPoint, mode: 'position' | 'transform' | 'margin' | 'padding') {
@@ -1,4 +1,18 @@
1
- import { IPoint } from "../../index.js";
2
- export declare function combineTransforms(helperElement: HTMLElement, element: HTMLElement, transform1: string, transform2: string): void;
1
+ import { IPoint } from "../../interfaces/IPoint.js";
2
+ import { IDesignerCanvas } from "../widgets/designerView/IDesignerCanvas.js";
3
+ export declare function combineTransforms(element: HTMLElement, actualTransforms: string, requestedTransformation: string): void;
3
4
  export declare function getDomMatrix(element: HTMLElement): DOMMatrix;
4
- export declare function convertCoordinates(point: IPoint, matrix: DOMMatrix): DOMPoint;
5
+ export declare function convertCoordinates(point: DOMPoint, matrix: DOMMatrix): DOMPoint;
6
+ export declare function getRotationMatrix3d(axisOfRotation: 'x' | 'y' | 'z' | 'X' | 'Y' | 'Z', angle: number): any[];
7
+ export declare function rotateElementByMatrix3d(element: HTMLElement, matrix: number[]): void;
8
+ export declare function matrixArrayToCssMatrix(matrixArray: number[]): string;
9
+ export declare function cssMatrixToMatrixArray(cssMatrix: string): number[];
10
+ export declare function getRotationAngleFromMatrix(matrixArray: number[], domMatrix: DOMMatrix): any;
11
+ export declare function addVectors(vectorA: [number, number], vectorB: [number, number]): [number, number];
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;
15
+ export declare function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element: HTMLElement, untransformedCornerPointsOffset: number, designerCanvas: IDesignerCanvas): [DOMPoint, DOMPoint, DOMPoint, DOMPoint];
16
+ export declare function extractTranslationFromDOMMatrix(matrix: DOMMatrix): DOMPoint;
17
+ export declare function extractRotationAngleFromDOMMatrix(matrix: DOMMatrix): number;
18
+ export declare function normalizeToAbsolutePosition(element: HTMLElement, normalizeProperty: "left" | "top"): string;
@@ -1,21 +1,212 @@
1
- export function combineTransforms(helperElement, element, transform1, transform2) {
2
- if (transform1 == null || transform1 == '') {
3
- element.style.transform = transform2;
1
+ import { getElementsWindowOffsetWithoutSelfAndParentTransformations, getParentElementIncludingSlots } from "./ElementHelper.js";
2
+ let identityMatrix = [
3
+ 1, 0, 0, 0,
4
+ 0, 1, 0, 0,
5
+ 0, 0, 1, 0,
6
+ 0, 0, 0, 1
7
+ ];
8
+ export function combineTransforms(element, actualTransforms, requestedTransformation) {
9
+ if (actualTransforms == null || actualTransforms == '') {
10
+ element.style.transform = requestedTransformation;
4
11
  return;
5
12
  }
6
- helperElement.style.transform = '';
7
- helperElement.style.transform = transform1;
8
- const matrix1 = new DOMMatrix(window.getComputedStyle(helperElement).transform);
9
- helperElement.style.transform = '';
10
- helperElement.style.transform = transform2;
11
- const matrix2 = new DOMMatrix(window.getComputedStyle(helperElement).transform);
12
- const result = matrix2.multiply(matrix1);
13
- element.style.transform = result.toString();
13
+ const actualTransformationMatrix = new DOMMatrix(actualTransforms);
14
+ const requestedTransformationMatrix = new DOMMatrix(requestedTransformation);
15
+ const newTransformationMatrix = requestedTransformationMatrix.multiply(actualTransformationMatrix);
16
+ element.style.transform = newTransformationMatrix.toString();
14
17
  }
15
18
  export function getDomMatrix(element) {
16
19
  return new DOMMatrix(window.getComputedStyle(element).transform);
17
20
  }
18
21
  export function convertCoordinates(point, matrix) {
19
- let domPoint = new DOMPoint(point.x, point.y);
20
- return domPoint.matrixTransform(matrix.inverse());
22
+ return point.matrixTransform(matrix.inverse());
23
+ }
24
+ export function getRotationMatrix3d(axisOfRotation, angle) {
25
+ const angleInRadians = angle / 180 * Math.PI;
26
+ const sin = Math.sin;
27
+ const cos = Math.cos;
28
+ let rotationMatrix3d = [];
29
+ switch (axisOfRotation.toLowerCase()) {
30
+ case 'x':
31
+ rotationMatrix3d = [
32
+ 1, 0, 0, 0,
33
+ 0, cos(angleInRadians), -sin(angleInRadians), 0,
34
+ 0, sin(angleInRadians), cos(angleInRadians), 0,
35
+ 0, 0, 0, 1
36
+ ];
37
+ break;
38
+ case 'y':
39
+ rotationMatrix3d = [
40
+ cos(angleInRadians), 0, sin(angleInRadians), 0,
41
+ 0, 1, 0, 0,
42
+ -sin(angleInRadians), 0, cos(angleInRadians), 0,
43
+ 0, 0, 0, 1
44
+ ];
45
+ break;
46
+ case 'z':
47
+ rotationMatrix3d = [
48
+ cos(angleInRadians), -sin(angleInRadians), 0, 0,
49
+ sin(angleInRadians), cos(angleInRadians), 0, 0,
50
+ 0, 0, 1, 0,
51
+ 0, 0, 0, 1
52
+ ];
53
+ break;
54
+ default:
55
+ rotationMatrix3d = null;
56
+ break;
57
+ }
58
+ return rotationMatrix3d;
59
+ }
60
+ export function rotateElementByMatrix3d(element, matrix) {
61
+ element.style.transform = matrixArrayToCssMatrix(matrix);
62
+ }
63
+ export function matrixArrayToCssMatrix(matrixArray) {
64
+ return "matrix3d(" + matrixArray.join(',') + ")";
65
+ }
66
+ export function cssMatrixToMatrixArray(cssMatrix) {
67
+ if (!cssMatrix.includes('matrix')) {
68
+ if (cssMatrix != 'none')
69
+ console.error('cssMatrixToMatrixArray: no css matrix passed');
70
+ return identityMatrix;
71
+ }
72
+ let matrixArray = cssMatrix.match(/^matrix.*\((.*)\)/)[1].split(',').map(Number);
73
+ return matrixArray;
74
+ }
75
+ export function getRotationAngleFromMatrix(matrixArray, domMatrix) {
76
+ let angle = null;
77
+ const a = domMatrix != null ? domMatrix.a : matrixArray[0];
78
+ const b = domMatrix != null ? domMatrix.b : matrixArray[1];
79
+ angle = Math.round(Math.atan2(b, a) * (180 / Math.PI));
80
+ return angle;
81
+ }
82
+ export function addVectors(vectorA, vectorB) {
83
+ return [vectorA[0] + vectorB[0], vectorA[1] + vectorB[1]];
84
+ }
85
+ export function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element, designerCanvas) {
86
+ const top0 = new DOMPointReadOnly(-parseInt(getComputedStyle(element).transformOrigin.split(' ')[0]), -parseInt(getComputedStyle(element).transformOrigin.split(' ')[1]), 0, 0);
87
+ const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element);
88
+ const transformOriginAbsolutRelatedToWindowWithoutAnyTransformation = new DOMPoint(p0Offsets.offsetLeft - top0.x, p0Offsets.offsetTop - top0.y);
89
+ const designerCanvasNormalizedTransformedOrigin = new DOMPoint(transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.x - designerCanvas.containerBoundingRect.x, transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.y - designerCanvas.containerBoundingRect.y);
90
+ return designerCanvasNormalizedTransformedOrigin;
91
+ }
92
+ export function getResultingTransformationBetweenElementAndAllAncestors(element, ancestor, excludeAncestor) {
93
+ let actualElement = element;
94
+ let actualElementMatrix;
95
+ let originalElementAndAllParentsMultipliedMatrix;
96
+ while (actualElement != ancestor) {
97
+ const newElement = getParentElementIncludingSlots(actualElement);
98
+ actualElementMatrix = new DOMMatrix(getComputedStyle(actualElement).transform);
99
+ if (actualElement == element) {
100
+ originalElementAndAllParentsMultipliedMatrix = actualElementMatrix.multiply(new DOMMatrix(getComputedStyle(newElement).transform));
101
+ }
102
+ else if (newElement != ancestor || !excludeAncestor) {
103
+ originalElementAndAllParentsMultipliedMatrix = originalElementAndAllParentsMultipliedMatrix.multiply(new DOMMatrix(getComputedStyle(newElement).transform));
104
+ }
105
+ actualElement = newElement;
106
+ }
107
+ return originalElementAndAllParentsMultipliedMatrix;
108
+ }
109
+ export function getByParentsTransformedPointRelatedToCanvas(element, point, designerCanvas) {
110
+ const canvas = element.closest('#node-projects-designer-canvas-canvas');
111
+ let actualElement = element;
112
+ let parentElementTransformOriginToPointVectorTransformed;
113
+ let byParentTransformedPointRelatedToCanvas = { x: 0, y: 0 };
114
+ while (actualElement != canvas) {
115
+ const parentElement = getParentElementIncludingSlots(actualElement);
116
+ const parentElementTransformOrigin = new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement).offsetLeft - designerCanvas.outerRect.x + parseInt(getComputedStyle(parentElement).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement).offsetTop - designerCanvas.outerRect.y + parseInt(getComputedStyle(parentElement).transformOrigin.split(' ')[1]));
117
+ parentElementTransformOrigin.x -= extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform)).x;
118
+ parentElementTransformOrigin.y -= extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform)).y;
119
+ const parentElementTransformOriginToPointVector = new DOMPointReadOnly(-parentElementTransformOrigin.x + (element == actualElement ? point.x : byParentTransformedPointRelatedToCanvas.x), -parentElementTransformOrigin.y + (element == actualElement ? point.y : byParentTransformedPointRelatedToCanvas.y));
120
+ parentElementTransformOriginToPointVectorTransformed = parentElementTransformOriginToPointVector.matrixTransform(new DOMMatrix(getComputedStyle(parentElement).transform));
121
+ byParentTransformedPointRelatedToCanvas = new DOMPoint(parentElementTransformOrigin.x + parentElementTransformOriginToPointVectorTransformed.x, parentElementTransformOrigin.y + parentElementTransformOriginToPointVectorTransformed.y);
122
+ actualElement = parentElement;
123
+ }
124
+ return byParentTransformedPointRelatedToCanvas;
125
+ }
126
+ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, untransformedCornerPointsOffset, designerCanvas) {
127
+ const topleft = 0;
128
+ const topright = 1;
129
+ const bottomleft = 2;
130
+ const bottomright = 3;
131
+ const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element);
132
+ const p0OffsetsRelatedToCanvas = DOMPoint.fromPoint({
133
+ x: p0Offsets.offsetLeft - designerCanvas.containerBoundingRect.left,
134
+ y: p0Offsets.offsetTop - designerCanvas.containerBoundingRect.top
135
+ });
136
+ let width = parseInt(getComputedStyle(element).width.replace('px', ''));
137
+ let height = parseInt(getComputedStyle(element).height.replace('px', ''));
138
+ if (getComputedStyle(element).boxSizing == 'content-box') {
139
+ width += parseInt(getComputedStyle(element).paddingLeft.replace('px', ''))
140
+ + parseInt(getComputedStyle(element).marginLeft.replace('px', ''))
141
+ + parseInt(getComputedStyle(element).borderLeft.replace('px', ''))
142
+ + parseInt(getComputedStyle(element).paddingRight.replace('px', ''))
143
+ + parseInt(getComputedStyle(element).marginRight.replace('px', ''))
144
+ + parseInt(getComputedStyle(element).borderRight.replace('px', ''));
145
+ height += parseInt(getComputedStyle(element).paddingTop.replace('px', ''))
146
+ + parseInt(getComputedStyle(element).marginTop.replace('px', ''))
147
+ + parseInt(getComputedStyle(element).borderTop.replace('px', ''))
148
+ + parseInt(getComputedStyle(element).paddingBottom.replace('px', ''))
149
+ + parseInt(getComputedStyle(element).marginBottom.replace('px', ''))
150
+ + parseInt(getComputedStyle(element).borderBottom.replace('px', ''));
151
+ }
152
+ const elementWithoutTransformCornerDOMPoints = [];
153
+ elementWithoutTransformCornerDOMPoints[topleft] = DOMPoint.fromPoint({
154
+ x: p0OffsetsRelatedToCanvas.x - untransformedCornerPointsOffset,
155
+ y: p0OffsetsRelatedToCanvas.y - untransformedCornerPointsOffset
156
+ });
157
+ elementWithoutTransformCornerDOMPoints[topright] = DOMPoint.fromPoint({
158
+ x: p0OffsetsRelatedToCanvas.x + width + untransformedCornerPointsOffset,
159
+ y: p0OffsetsRelatedToCanvas.y - untransformedCornerPointsOffset
160
+ });
161
+ elementWithoutTransformCornerDOMPoints[bottomleft] = DOMPoint.fromPoint({
162
+ x: p0OffsetsRelatedToCanvas.x - untransformedCornerPointsOffset,
163
+ y: p0OffsetsRelatedToCanvas.y + height + untransformedCornerPointsOffset
164
+ });
165
+ elementWithoutTransformCornerDOMPoints[bottomright] = DOMPoint.fromPoint({
166
+ x: p0OffsetsRelatedToCanvas.x + width + untransformedCornerPointsOffset,
167
+ y: p0OffsetsRelatedToCanvas.y + height + untransformedCornerPointsOffset
168
+ });
169
+ const transformOriginWithoutTransformRelatedToCanvas = DOMPointReadOnly.fromPoint({
170
+ x: p0OffsetsRelatedToCanvas.x + parseInt(getComputedStyle(element).transformOrigin.split(' ')[0]),
171
+ y: p0OffsetsRelatedToCanvas.y + parseInt(getComputedStyle(element).transformOrigin.split(' ')[1]),
172
+ z: 0,
173
+ w: 0
174
+ });
175
+ const designerCanvasNormalizedTransformOrigin = getByParentsTransformedPointRelatedToCanvas(element, new DOMPoint(getElementsWindowOffsetWithoutSelfAndParentTransformations(element).offsetLeft - designerCanvas.outerRect.left + parseInt(getComputedStyle(element).transformOrigin.split(' ')[0]), getElementsWindowOffsetWithoutSelfAndParentTransformations(element).offsetTop - designerCanvas.outerRect.top + parseInt(getComputedStyle(element).transformOrigin.split(' ')[1])), designerCanvas);
176
+ let top0 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topleft].y));
177
+ let top1 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topright].y));
178
+ let top2 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomleft].y));
179
+ let top3 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomright].y));
180
+ let originalElementAndAllParentsMultipliedMatrix = getResultingTransformationBetweenElementAndAllAncestors(element, designerCanvas.canvas, true);
181
+ let top0Transformed = top0.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
182
+ let top1Transformed = top1.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
183
+ let top2Transformed = top2.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
184
+ let top3Transformed = top3.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
185
+ let transformedCornerPoints = [];
186
+ transformedCornerPoints[0] = new DOMPoint(designerCanvasNormalizedTransformOrigin.x + top0Transformed.x, designerCanvasNormalizedTransformOrigin.y + top0Transformed.y);
187
+ transformedCornerPoints[1] = new DOMPoint(designerCanvasNormalizedTransformOrigin.x + top1Transformed.x, designerCanvasNormalizedTransformOrigin.y + top1Transformed.y);
188
+ transformedCornerPoints[2] = new DOMPoint(designerCanvasNormalizedTransformOrigin.x + top2Transformed.x, designerCanvasNormalizedTransformOrigin.y + top2Transformed.y);
189
+ transformedCornerPoints[3] = new DOMPoint(designerCanvasNormalizedTransformOrigin.x + top3Transformed.x, designerCanvasNormalizedTransformOrigin.y + top3Transformed.y);
190
+ return transformedCornerPoints;
191
+ }
192
+ export function extractTranslationFromDOMMatrix(matrix) {
193
+ return new DOMPoint(matrix.m41, matrix.m42, 0, 0);
194
+ }
195
+ export function extractRotationAngleFromDOMMatrix(matrix) {
196
+ return getRotationAngleFromMatrix(null, matrix);
197
+ }
198
+ export function normalizeToAbsolutePosition(element, normalizeProperty) {
199
+ switch (normalizeProperty) {
200
+ case "left":
201
+ let left = getComputedStyle(element).left;
202
+ element.style.removeProperty('right');
203
+ element.style.left = left;
204
+ return left;
205
+ case "top":
206
+ let top = getComputedStyle(element).top;
207
+ element.style.removeProperty('bottom');
208
+ element.style.top = top;
209
+ return top;
210
+ }
211
+ return null;
21
212
  }
@@ -69,6 +69,9 @@ import { LineExtensionProvider } from '../widgets/designerView/extensions/svg/Li
69
69
  import { RectExtentionProvider } from '../widgets/designerView/extensions/svg/RectExtensionProvider.js';
70
70
  import { EllipsisExtensionProvider } from '../widgets/designerView/extensions/svg/EllipsisExtensionProvider.js';
71
71
  import { PropertyGroupsService } from './propertiesService/PropertyGroupsService.js';
72
+ import { PlacementExtensionProvider } from '../widgets/designerView/extensions/PlacementExtensionProvider.js';
73
+ import { FlexboxExtensionProvider } from '../widgets/designerView/extensions/FlexboxExtensionProvider.js';
74
+ import { FlexboxExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js';
72
75
  export function createDefaultServiceContainer() {
73
76
  let serviceContainer = new ServiceContainer();
74
77
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -99,6 +102,7 @@ export function createDefaultServiceContainer() {
99
102
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
100
103
  new ElementDragTitleExtensionProvider(),
101
104
  new GridExtensionProvider(),
105
+ new FlexboxExtensionProvider(),
102
106
  new TransformOriginExtensionProvider(),
103
107
  new CanvasExtensionProvider(),
104
108
  new PositionExtensionProvider(),
@@ -113,11 +117,15 @@ export function createDefaultServiceContainer() {
113
117
  new SelectionDefaultExtensionProvider()
114
118
  ]);
115
119
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionContainer, [
116
- new GridExtensionProvider()
120
+ new GridExtensionProvider(),
121
+ new FlexboxExtensionProvider()
117
122
  ]);
118
123
  serviceContainer.designerExtensions.set(ExtensionType.MouseOver, [
119
124
  new MouseOverExtensionProvider()
120
125
  ]);
126
+ serviceContainer.designerExtensions.set(ExtensionType.Placement, [
127
+ new PlacementExtensionProvider()
128
+ ]);
121
129
  serviceContainer.designerExtensions.set(ExtensionType.ContainerDrag, [
122
130
  new GrayOutExtensionProvider()
123
131
  ]);
@@ -146,7 +154,7 @@ export function createDefaultServiceContainer() {
146
154
  serviceContainer.designerPointerExtensions.push(
147
155
  //new CursorLinePointerExtensionProvider()
148
156
  );
149
- serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons());
157
+ serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons());
150
158
  serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(5), new TextToolButtonProvider());
151
159
  serviceContainer.designerContextMenuExtensions = [
152
160
  new CopyPasteContextMenu(),
@@ -10,6 +10,7 @@ export declare class DefaultPlacementService implements IPlacementService {
10
10
  getElementOffset(container: IDesignItem, designItem?: IDesignItem): IPoint;
11
11
  private calculateTrack;
12
12
  placePoint(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): IPoint;
13
+ startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
13
14
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
14
15
  enterContainer(container: IDesignItem, items: IDesignItem[]): void;
15
16
  leaveContainer(container: IDesignItem, items: IDesignItem[]): void;
@@ -1,6 +1,7 @@
1
1
  import { DomConverter } from '../../widgets/designerView/DomConverter.js';
2
- import { combineTransforms } from '../../helper/TransformHelper.js';
2
+ import { combineTransforms, extractTranslationFromDOMMatrix, getResultingTransformationBetweenElementAndAllAncestors } from '../../helper/TransformHelper.js';
3
3
  import { filterChildPlaceItems, placeDesignItem } from '../../helper/LayoutHelper.js';
4
+ import { ExtensionType } from '../../widgets/designerView/extensions/ExtensionType.js';
4
5
  export class DefaultPlacementService {
5
6
  serviceForContainer(container, containerStyle) {
6
7
  if (containerStyle.display === 'grid' || containerStyle.display === 'inline-grid' ||
@@ -83,15 +84,25 @@ export class DefaultPlacementService {
83
84
  }
84
85
  return { x: trackX, y: trackY };
85
86
  }
87
+ startPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
88
+ }
86
89
  place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
87
90
  //TODO:, this should revert all undo actions while active
88
91
  //maybe a undo actions returns itself or an id so it could be changed?
89
92
  let track = this.calculateTrack(event, placementView, startPoint, offsetInControl, newPoint, items[0]);
90
- let filterdItems = filterChildPlaceItems(items);
91
- //TODO: -> maybe get existing transform via getComputedStyle???
92
- for (const designItem of filterdItems) {
93
- const newTransform = 'translate(' + track.x + 'px, ' + track.y + 'px)';
94
- combineTransforms(placementView.transformHelperElement, designItem.element, designItem.styles.get('transform'), newTransform);
93
+ let filteredItems = filterChildPlaceItems(items);
94
+ for (const designItem of filteredItems) {
95
+ const canvas = designItem.element.closest('#node-projects-designer-canvas-canvas');
96
+ let originalElementAndAllAncestorsMultipliedMatrix = getResultingTransformationBetweenElementAndAllAncestors(designItem.element.parentElement, canvas, true);
97
+ let transformMatrixParentTransformsCompensated = null;
98
+ if (originalElementAndAllAncestorsMultipliedMatrix) {
99
+ transformMatrixParentTransformsCompensated = new DOMPoint(track.x, track.y, 0, 0).matrixTransform(originalElementAndAllAncestorsMultipliedMatrix.inverse());
100
+ }
101
+ else {
102
+ transformMatrixParentTransformsCompensated = new DOMPoint(track.x, track.y, 0, 0);
103
+ }
104
+ const translationMatrix = new DOMMatrix().translate(transformMatrixParentTransformsCompensated.x, transformMatrixParentTransformsCompensated.y);
105
+ combineTransforms(designItem.element, designItem.styles.get('transform'), translationMatrix.toString());
95
106
  }
96
107
  }
97
108
  enterContainer(container, items) {
@@ -108,11 +119,16 @@ export class DefaultPlacementService {
108
119
  leaveContainer(container, items) {
109
120
  }
110
121
  finishPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
111
- let track = this.calculateTrack(event, placementView, startPoint, offsetInControl, newPoint, items[0]);
112
122
  let filterdItems = filterChildPlaceItems(items);
113
123
  for (const designItem of filterdItems) {
124
+ let translation = extractTranslationFromDOMMatrix(new DOMMatrix(designItem.element.style.transform));
125
+ const stylesMapOffset = extractTranslationFromDOMMatrix(new DOMMatrix(designItem.styles.get('transform') ?? ''));
114
126
  designItem.element.style.transform = designItem.styles.get('transform') ?? '';
115
- placeDesignItem(container, designItem, track, 'position');
127
+ let track = { x: translation.x, y: translation.y };
128
+ placeDesignItem(container, designItem, { x: track.x - stylesMapOffset.x, y: track.y - stylesMapOffset.y }, 'position');
129
+ }
130
+ for (const item of items) {
131
+ placementView.extensionManager.removeExtension(item, ExtensionType.Placement);
116
132
  }
117
133
  }
118
134
  }
@@ -11,6 +11,7 @@ export declare class FlexBoxPlacementService implements IPlacementService {
11
11
  canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
12
12
  getElementOffset(container: IDesignItem, designItem?: IDesignItem): IPoint;
13
13
  placePoint(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): IPoint;
14
+ startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
14
15
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
15
16
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
16
17
  }
@@ -38,6 +38,8 @@ export class FlexBoxPlacementService {
38
38
  const defaultPlacementService = container.serviceContainer.getLastServiceWhere('containerService', x => x instanceof DefaultPlacementService);
39
39
  return defaultPlacementService.placePoint(event, placementView, container, startPoint, offsetInControl, newPoint, items);
40
40
  }
41
+ startPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
42
+ }
41
43
  place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
42
44
  const pos = placementView.getNormalizedEventCoordinates(event);
43
45
  const style = getComputedStyle(container.element);
@@ -11,6 +11,7 @@ export declare class GridPlacementService implements IPlacementService {
11
11
  canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
12
12
  getElementOffset(container: IDesignItem, designItem?: IDesignItem): IPoint;
13
13
  placePoint(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): IPoint;
14
+ startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
14
15
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
15
16
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
16
17
  }
@@ -42,6 +42,8 @@ export class GridPlacementService {
42
42
  const defaultPlacementService = container.serviceContainer.getLastServiceWhere('containerService', x => x instanceof DefaultPlacementService);
43
43
  return defaultPlacementService.placePoint(event, placementView, container, startPoint, offsetInControl, newPoint, items);
44
44
  }
45
+ startPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
46
+ }
45
47
  place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
46
48
  const gridInformation = CalculateGridInformation(container);
47
49
  const pos = placementView.getNormalizedEventCoordinates(event);
@@ -11,6 +11,7 @@ export interface IPlacementService extends IService {
11
11
  leaveContainer(container: IDesignItem, items: IDesignItem[]): any;
12
12
  getElementOffset(container: IDesignItem, designItem?: IDesignItem): IPoint;
13
13
  placePoint(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): IPoint;
14
+ startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): any;
14
15
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): any;
15
16
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): any;
16
17
  }
@@ -26,8 +26,11 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
26
26
  readonly alignOnSnap: boolean;
27
27
  readonly onContentChanged: TypedEvent<void>;
28
28
  zoomFactor: number;
29
+ designerOffsetWidth: number;
30
+ designerOffsetHeight: number;
29
31
  readonly scaleFactor: number;
30
32
  canvasOffset: IPoint;
33
+ canvas: HTMLElement;
31
34
  eatEvents: Element;
32
35
  initialize(serviceContainer: ServiceContainer): any;
33
36
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
@@ -37,6 +40,7 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
37
40
  realWidth: number;
38
41
  realHeight: number;
39
42
  };
43
+ getNormalizedElementCoordinates(element: Element, ignoreScalefactor?: boolean): IRect;
40
44
  captureActiveTool(tool: ITool): any;
41
45
  releaseActiveTool(): any;
42
46
  getDesignSurfaceDimensions(): ISize;
@@ -10,5 +10,4 @@ export interface IPlacementView {
10
10
  snapLines: Snaplines;
11
11
  readonly zoomFactor: number;
12
12
  readonly scaleFactor: number;
13
- readonly transformHelperElement: HTMLDivElement;
14
13
  }
@@ -29,7 +29,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
29
29
  overlayLayer: OverlayLayerView;
30
30
  rootDesignItem: IDesignItem;
31
31
  eatEvents: Element;
32
- transformHelperElement: HTMLDivElement;
33
32
  private _zoomFactor;
34
33
  private _scaleFactor;
35
34
  private _canvasOffset;
@@ -44,6 +43,7 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
44
43
  set canvasOffsetUnzoomed(value: IPoint);
45
44
  onContentChanged: TypedEvent<void>;
46
45
  onZoomFactorChanged: TypedEvent<number>;
46
+ get canvas(): HTMLElement;
47
47
  private _canvas;
48
48
  private _canvasContainer;
49
49
  private _outercanvas2;
@@ -100,7 +100,7 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
100
100
  * Converts the Event x/y coordinates, to the mouse position in the viewport
101
101
  */
102
102
  getViewportCoordinates(event: MouseEvent): IPoint;
103
- getNormalizedElementCoordinates(element: Element): IRect;
103
+ getNormalizedElementCoordinates(element: Element, ignoreScalefactor?: boolean): IRect;
104
104
  getNormalizedElementCoordinatesAndRealSizes(element: Element): IRect & {
105
105
  realWidth: number;
106
106
  realHeight: number;
@@ -36,7 +36,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
36
36
  overlayLayer;
37
37
  rootDesignItem;
38
38
  eatEvents;
39
- transformHelperElement;
40
39
  _zoomFactor = 1; //if scale or zoom css property is used this needs to be the value
41
40
  _scaleFactor = 1; //if scale css property is used this need to be the scale value
42
41
  _canvasOffset = { x: 0, y: 0 };
@@ -67,6 +66,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
67
66
  }
68
67
  onContentChanged = new TypedEvent();
69
68
  onZoomFactorChanged = new TypedEvent();
69
+ get canvas() {
70
+ return this._canvas;
71
+ }
70
72
  // Private Variables
71
73
  _canvas;
72
74
  _canvasContainer;
@@ -103,6 +105,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
103
105
  width: 100%;
104
106
  height: 100%;
105
107
  transform-origin: 0 0;
108
+ position: relative;
106
109
  }
107
110
 
108
111
  #node-projects-designer-canvas-canvas.dragFileActive {
@@ -136,11 +139,12 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
136
139
  height: 100%;
137
140
  top: 0;
138
141
  }
139
-
140
- #node-projects-designer-canvas-transformHelper {
142
+
143
+ #node-projects-designer-canvas-helper-element {
141
144
  height: 0;
142
145
  width: 0;
143
- }`;
146
+ }
147
+ `;
144
148
  static template = html `
145
149
  <div style="display: flex;flex-direction: column;width: 100%;height: 100%;">
146
150
  <div style="width: 100%;height: 100%;">
@@ -152,7 +156,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
152
156
  </div>
153
157
  <div id="node-projects-designer-canvas-clickOverlay" tabindex="0" style="pointer-events: auto;"></div>
154
158
  </div>
155
- <div id="node-projects-designer-canvas-transformHelper"></div>
156
159
  </div>`;
157
160
  extensionManager;
158
161
  _pointerextensions;
@@ -164,7 +167,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
164
167
  this._canvasContainer = this._getDomElement('node-projects-designer-canvas-canvasContainer');
165
168
  this._outercanvas2 = this._getDomElement('node-projects-designer-canvas-outercanvas2');
166
169
  this.clickOverlay = this._getDomElement('node-projects-designer-canvas-clickOverlay');
167
- this.transformHelperElement = this._getDomElement('node-projects-designer-canvas-transformHelper');
168
170
  this._onKeyDownBound = this.onKeyDown.bind(this);
169
171
  this._onKeyUpBound = this.onKeyUp.bind(this);
170
172
  this._onDblClickBound = this._onDblClick.bind(this);
@@ -768,9 +770,9 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
768
770
  y: (event.clientY - this.outerRect.y)
769
771
  };
770
772
  }
771
- getNormalizedElementCoordinates(element) {
773
+ getNormalizedElementCoordinates(element, ignoreScalefactor) {
772
774
  const targetRect = element.getBoundingClientRect();
773
- return { x: (targetRect.x - this.containerBoundingRect.x) / this.scaleFactor, y: (targetRect.y - this.containerBoundingRect.y) / this.scaleFactor, width: targetRect.width / this.scaleFactor, height: targetRect.height / this.scaleFactor };
775
+ return { x: (targetRect.x - this.containerBoundingRect.x) / (ignoreScalefactor ? 1 : this.scaleFactor), y: (targetRect.y - this.containerBoundingRect.y) / (ignoreScalefactor ? 1 : this.scaleFactor), width: targetRect.width / (ignoreScalefactor ? 1 : this.scaleFactor), height: targetRect.height / (ignoreScalefactor ? 1 : this.scaleFactor) };
774
776
  }
775
777
  getNormalizedElementCoordinatesAndRealSizes(element) {
776
778
  let ret = this.getNormalizedElementCoordinates(element);
@@ -2,6 +2,7 @@ import { IDesignerCanvas } from "../IDesignerCanvas";
2
2
  import { IExtensionManager } from "./IExtensionManger";
3
3
  import { OverlayLayerView } from '../overlayLayerView';
4
4
  import { OverlayLayer } from './OverlayLayer';
5
+ import { IPoint } from "../../../../interfaces/IPoint";
5
6
  export declare abstract class AbstractExtensionBase {
6
7
  protected overlays: SVGElement[];
7
8
  protected overlayLayerView: OverlayLayerView;
@@ -14,4 +15,5 @@ export declare abstract class AbstractExtensionBase {
14
15
  protected _drawRect(x: number, y: number, w: number, h: number, className?: string, rect?: SVGRectElement, overlayLayer?: OverlayLayer): SVGRectElement;
15
16
  protected _drawText(text: string, x: number, y: number, className?: string, textEl?: SVGTextElement, overlayLayer?: OverlayLayer): SVGTextElement;
16
17
  protected _drawTextWithBackground(text: string, x: number, y: number, backgroundColor: string, className?: string, existingEls?: [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement], overlayLayer?: OverlayLayer): [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement];
18
+ protected _drawTransformedRect(points: [IPoint, IPoint, IPoint, IPoint], className?: string, path?: SVGPathElement, overlayLayer?: OverlayLayer): SVGPathElement;
17
19
  }
@@ -54,4 +54,12 @@ export class AbstractExtensionBase {
54
54
  }
55
55
  return newEls;
56
56
  }
57
+ _drawTransformedRect(points, className, path, overlayLayer) {
58
+ let data = "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + "Z";
59
+ const newPath = this.overlayLayerView.drawPath(data, className, path, overlayLayer);
60
+ if (!path) {
61
+ this.overlays.push(newPath);
62
+ }
63
+ return newPath;
64
+ }
57
65
  }