@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.
- package/dist/elements/helper/CssUnitConverter.js +1 -1
- package/dist/elements/helper/ElementHelper.d.ts +1 -1
- package/dist/elements/helper/ElementHelper.js +30 -4
- package/dist/elements/helper/GridHelper.js +1 -2
- package/dist/elements/helper/LayoutHelper.js +2 -2
- package/dist/elements/helper/NpmPackageLoader.js +2 -2
- package/dist/elements/helper/SwitchContainerHelper.js +2 -3
- package/dist/elements/helper/TransformHelper.d.ts +3 -3
- package/dist/elements/helper/TransformHelper.js +39 -12
- package/dist/elements/item/DesignItem.d.ts +3 -1
- package/dist/elements/item/DesignItem.js +12 -6
- package/dist/elements/item/IDesignItem.d.ts +1 -0
- package/dist/elements/services/BaseServiceContainer.d.ts +1 -0
- package/dist/elements/services/BaseServiceContainer.js +6 -0
- package/dist/elements/services/bindingsService/SpecialTagsBindingService.js +1 -1
- package/dist/elements/services/dragDropService/DragDropService.js +1 -1
- package/dist/elements/services/elementsService/IElementDefinition.d.ts +0 -6
- package/dist/elements/services/htmlWriterService/HtmlWriterService.js +1 -1
- package/dist/elements/services/instanceService/DefaultInstanceService.js +1 -2
- package/dist/elements/services/placementService/DefaultPlacementService.js +2 -2
- package/dist/elements/services/propertiesService/propertyEditors/special/GridAssignedRowColumnPropertyEditor.js +1 -1
- package/dist/elements/services/propertiesService/propertyEditors/special/MetricsPropertyEditor.js +1 -1
- package/dist/elements/services/propertiesService/services/AbstractPropertiesService.d.ts +4 -3
- package/dist/elements/services/propertiesService/services/AbstractPropertiesService.js +15 -10
- package/dist/elements/services/propertiesService/services/AttributesPropertiesService.js +1 -1
- package/dist/elements/services/propertiesService/services/ContentAndIdPropertiesService.js +1 -1
- package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.js +1 -1
- package/dist/elements/services/propertiesService/services/NativeElementsPropertiesService.js +15 -0
- package/dist/elements/services/stylesheetService/AbstractStylesheetService.js +1 -1
- package/dist/elements/widgets/designerView/DomConverter.js +1 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +1 -1
- package/dist/elements/widgets/designerView/extensions/AbstractExtension.d.ts +2 -2
- package/dist/elements/widgets/designerView/extensions/AltToEnterContainerExtension.js +1 -1
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +4 -4
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -1
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +41 -11
- package/dist/elements/widgets/designerView/extensions/IDesignerExtension.d.ts +2 -2
- package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -1
- package/dist/elements/widgets/designerView/extensions/OverlayLayer.d.ts +1 -1
- package/dist/elements/widgets/designerView/extensions/OverlayLayer.js +1 -1
- package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.d.ts +2 -2
- package/dist/elements/widgets/designerView/extensions/SelectionDefaultExtension.js +4 -4
- package/dist/elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js +1 -4
- package/dist/elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtension.js +5 -5
- package/dist/elements/widgets/designerView/overlayLayerView.d.ts +6 -0
- package/dist/elements/widgets/designerView/overlayLayerView.js +39 -4
- package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/DrawLineTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/DrawRectTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/MagicWandSelectorTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/PointerTool.js +2 -2
- package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/TextTool.js +1 -1
- package/dist/elements/widgets/designerView/tools/ZoomTool.js +1 -1
- package/dist/elements/widgets/treeView/treeView.js +1 -1
- 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
|
-
/*
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
2
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
3
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
141
|
-
parentElementTransformOrigin.
|
|
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 +
|
|
198
|
-
y: p0OffsetsRelatedToCanvas.y +
|
|
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(
|
|
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:
|
|
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.
|
|
137
|
+
return this.view;
|
|
137
138
|
}
|
|
138
139
|
get name() {
|
|
139
|
-
return this.
|
|
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.
|
|
460
|
+
this.view.appendChild(designItem.view);
|
|
455
461
|
}
|
|
456
462
|
else {
|
|
457
463
|
let el = this._childArray[index];
|
|
458
|
-
this.
|
|
464
|
+
this.view.insertBefore(designItem.view, el.element);
|
|
459
465
|
this._childArray.splice(index, 0, designItem);
|
|
460
466
|
}
|
|
461
467
|
designItem._parent = this;
|
|
462
|
-
//
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
4
|
+
//TODO: multiple cell selection, grid area support, span support
|
|
5
5
|
_root;
|
|
6
6
|
constructor(property) {
|
|
7
7
|
super(property);
|
package/dist/elements/services/propertiesService/propertyEditors/special/MetricsPropertyEditor.js
CHANGED
|
@@ -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
|
-
//
|
|
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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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 =
|
|
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
|
-
|
|
124
|
-
clearTimeout(this.
|
|
125
|
-
this.
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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);
|
package/dist/elements/services/propertiesService/services/NativeElementsPropertiesService.js
CHANGED
|
@@ -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
|
}
|