@node-projects/web-component-designer 0.1.50 → 0.1.51
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/TransformHelper.js +21 -17
- package/dist/elements/item/DesignItem.js +36 -10
- package/dist/elements/services/demoProviderService/SimpleDemoProviderService.js +7 -1
- package/dist/elements/services/propertiesService/PropertyGroupsService.js +7 -5
- package/dist/elements/widgets/designerView/designerCanvas.js +1 -1
- package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +33 -29
- package/dist/elements/widgets/designerView/extensions/HighlightElementExtension.js +4 -2
- package/package.json +1 -1
|
@@ -9,16 +9,16 @@ export function getElementCombinedTransform(element) {
|
|
|
9
9
|
//https://www.w3.org/TR/css-transforms-2/#ctm
|
|
10
10
|
let s = getComputedStyle(element);
|
|
11
11
|
let m = new DOMMatrix();
|
|
12
|
-
if (s.translate != 'none') {
|
|
12
|
+
if (s.translate != 'none' && s.translate) {
|
|
13
13
|
m = m.multiply(new DOMMatrix('translate(' + s.translate + ')'));
|
|
14
14
|
}
|
|
15
|
-
if (s.rotate != 'none') {
|
|
15
|
+
if (s.rotate != 'none' && s.rotate) {
|
|
16
16
|
m = m.multiply(new DOMMatrix('rotate(' + s.rotate + ')'));
|
|
17
17
|
}
|
|
18
|
-
if (s.scale != 'none') {
|
|
18
|
+
if (s.scale != 'none' && s.scale) {
|
|
19
19
|
m = m.multiply(new DOMMatrix('scale(' + s.scale + ')'));
|
|
20
20
|
}
|
|
21
|
-
if (s.transform != 'none') {
|
|
21
|
+
if (s.transform != 'none' && s.transform) {
|
|
22
22
|
m = m.multiply(new DOMMatrix(s.transform));
|
|
23
23
|
}
|
|
24
24
|
return m;
|
|
@@ -119,7 +119,7 @@ export function getResultingTransformationBetweenElementAndAllAncestors(element,
|
|
|
119
119
|
let actualElementMatrix;
|
|
120
120
|
let newElementMatrix;
|
|
121
121
|
let originalElementAndAllParentsMultipliedMatrix;
|
|
122
|
-
while (actualElement != ancestor) {
|
|
122
|
+
while (actualElement != ancestor && actualElement != null) {
|
|
123
123
|
let cachedObj = ch.get(actualElement);
|
|
124
124
|
if (cachedObj) {
|
|
125
125
|
if (originalElementAndAllParentsMultipliedMatrix)
|
|
@@ -130,19 +130,21 @@ export function getResultingTransformationBetweenElementAndAllAncestors(element,
|
|
|
130
130
|
break;
|
|
131
131
|
}
|
|
132
132
|
const newElement = getParentElementIncludingSlots(actualElement);
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
133
|
+
if (newElement) {
|
|
134
|
+
actualElementMatrix = getElementCombinedTransform(actualElement);
|
|
135
|
+
newElementMatrix = getElementCombinedTransform(newElement);
|
|
136
|
+
newElementMatrix.m41 = newElementMatrix.m42 = 0;
|
|
137
|
+
if (actualElement == element) {
|
|
138
|
+
originalElementAndAllParentsMultipliedMatrix = actualElementMatrix.multiply(newElementMatrix);
|
|
139
|
+
}
|
|
140
|
+
else if (newElement != ancestor || !excludeAncestor) {
|
|
141
|
+
originalElementAndAllParentsMultipliedMatrix = originalElementAndAllParentsMultipliedMatrix.multiply(newElementMatrix);
|
|
142
|
+
}
|
|
143
|
+
lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
|
|
144
|
+
const cacheEntry = [originalElementAndAllParentsMultipliedMatrix];
|
|
145
|
+
lst.push(cacheEntry);
|
|
146
|
+
ch.set(actualElement, cacheEntry);
|
|
141
147
|
}
|
|
142
|
-
lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
|
|
143
|
-
const cacheEntry = [originalElementAndAllParentsMultipliedMatrix];
|
|
144
|
-
lst.push(cacheEntry);
|
|
145
|
-
ch.set(actualElement, cacheEntry);
|
|
146
148
|
actualElement = newElement;
|
|
147
149
|
}
|
|
148
150
|
return originalElementAndAllParentsMultipliedMatrix;
|
|
@@ -154,6 +156,8 @@ export function getByParentsTransformedPointRelatedToCanvas(element, point, desi
|
|
|
154
156
|
let byParentTransformedPointRelatedToCanvas = { x: 0, y: 0 };
|
|
155
157
|
while (actualElement != canvas) {
|
|
156
158
|
const parentElement = getParentElementIncludingSlots(actualElement);
|
|
159
|
+
if (!parentElement)
|
|
160
|
+
break;
|
|
157
161
|
const elementWindowOffset = getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement, designerCanvas.zoomFactor, cache);
|
|
158
162
|
const toSplit = getComputedStyle(parentElement).transformOrigin.split(' ');
|
|
159
163
|
const tfX = parseFloat(toSplit[0]);
|
|
@@ -8,8 +8,7 @@ import { InsertChildAction } from '../services/undoService/transactionItems/Inse
|
|
|
8
8
|
import { DomConverter } from '../widgets/designerView/DomConverter.js';
|
|
9
9
|
import { DeleteAction } from '../services/undoService/transactionItems/DeleteAction.js';
|
|
10
10
|
import { enableStylesheetService } from '../widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js';
|
|
11
|
-
import {
|
|
12
|
-
import { TypedEvent, cssFromString } from '@node-projects/base-custom-webcomponent';
|
|
11
|
+
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
13
12
|
import { TextContentChangeAction } from '../services/undoService/transactionItems/TextContentChangeAction.js';
|
|
14
13
|
const hideAtDesignTimeAttributeName = 'node-projects-hide-at-design-time';
|
|
15
14
|
const hideAtRunTimeAttributeName = 'node-projects-hide-at-run-time';
|
|
@@ -306,6 +305,15 @@ export class DesignItem {
|
|
|
306
305
|
}
|
|
307
306
|
static createDesignItemFromInstance(node, serviceContainer, instanceServiceContainer) {
|
|
308
307
|
let designItem = new DesignItem(node, node, serviceContainer, instanceServiceContainer);
|
|
308
|
+
if (node instanceof HTMLTemplateElement && node.getAttribute('shadowrootmode') == 'open') {
|
|
309
|
+
try {
|
|
310
|
+
const shadow = node.parentNode.attachShadow({ mode: 'open' });
|
|
311
|
+
shadow.appendChild(node.content.cloneNode(true));
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
console.error("error attaching shadowdom", err);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
309
317
|
if (designItem.nodeType == NodeType.Element) {
|
|
310
318
|
for (let a of designItem.element.attributes) {
|
|
311
319
|
if (a.name !== 'style') {
|
|
@@ -335,10 +343,19 @@ export class DesignItem {
|
|
|
335
343
|
updateChildrenFromNodesChildren() {
|
|
336
344
|
this._childArray = [];
|
|
337
345
|
if (this.nodeType == NodeType.Element) {
|
|
338
|
-
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
346
|
+
if (this.element instanceof HTMLTemplateElement) {
|
|
347
|
+
for (const c of this.element.content.childNodes) {
|
|
348
|
+
const di = DesignItem.createDesignItemFromInstance(c, this.serviceContainer, this.instanceServiceContainer);
|
|
349
|
+
this._childArray.push(di);
|
|
350
|
+
di._parent = this;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
for (const c of this.element.childNodes) {
|
|
355
|
+
const di = DesignItem.createDesignItemFromInstance(c, this.serviceContainer, this.instanceServiceContainer);
|
|
356
|
+
this._childArray.push(di);
|
|
357
|
+
di._parent = this;
|
|
358
|
+
}
|
|
342
359
|
}
|
|
343
360
|
}
|
|
344
361
|
this._refreshIfStyleSheet();
|
|
@@ -495,11 +512,19 @@ export class DesignItem {
|
|
|
495
512
|
}
|
|
496
513
|
if (index == null || this._childArray.length == 0 || index >= this._childArray.length) {
|
|
497
514
|
this._childArray.push(designItem);
|
|
498
|
-
this.view
|
|
515
|
+
if (this.view instanceof HTMLTemplateElement) {
|
|
516
|
+
this.view.content.appendChild(designItem.view);
|
|
517
|
+
}
|
|
518
|
+
else
|
|
519
|
+
this.view.appendChild(designItem.view);
|
|
499
520
|
}
|
|
500
521
|
else {
|
|
501
522
|
let el = this._childArray[index];
|
|
502
|
-
this.view
|
|
523
|
+
if (this.view instanceof HTMLTemplateElement) {
|
|
524
|
+
this.view.content.insertBefore(designItem.view, el.element);
|
|
525
|
+
}
|
|
526
|
+
else
|
|
527
|
+
this.view.insertBefore(designItem.view, el.element);
|
|
503
528
|
this._childArray.splice(index, 0, designItem);
|
|
504
529
|
}
|
|
505
530
|
designItem._parent = this;
|
|
@@ -529,9 +554,10 @@ export class DesignItem {
|
|
|
529
554
|
if (this.name == 'style' || this.parent?.name == 'style') {
|
|
530
555
|
//Update Stylesheetservice with sheet info
|
|
531
556
|
//Patch this sheetdata
|
|
532
|
-
|
|
557
|
+
//TODO: do not patch styles in templates, this needs to be recursive, cause the style does not need to be on the root
|
|
558
|
+
/*const realContent = this._childArray.reduce((a, b) => a + b.content, '');
|
|
533
559
|
this.view.textContent = AbstractStylesheetService.buildPatchedStyleSheet([cssFromString(realContent)]);
|
|
534
|
-
this.instanceServiceContainer.designerCanvas.lazyTriggerReparseDocumentStylesheets()
|
|
560
|
+
this.instanceServiceContainer.designerCanvas.lazyTriggerReparseDocumentStylesheets();*/
|
|
535
561
|
}
|
|
536
562
|
else if (this.name == 'link') {
|
|
537
563
|
}
|
|
@@ -21,7 +21,13 @@ export class SimpleDemoProviderService {
|
|
|
21
21
|
.map(x => cssFromString(x.content)));
|
|
22
22
|
}
|
|
23
23
|
shadowRoot.adoptedStyleSheets = styles;
|
|
24
|
-
shadowRoot.innerHTML =
|
|
24
|
+
shadowRoot.innerHTML = '';
|
|
25
|
+
//@ts-ignore
|
|
26
|
+
const myDocument = new DOMParser().parseFromString(code, 'text/html', { includeShadowRoots: true });
|
|
27
|
+
const fragment = document.createDocumentFragment();
|
|
28
|
+
for (let e of myDocument.childNodes)
|
|
29
|
+
fragment.appendChild(e);
|
|
30
|
+
shadowRoot.appendChild(fragment);
|
|
25
31
|
contentDiv.style.display = '';
|
|
26
32
|
}
|
|
27
33
|
}
|
|
@@ -44,11 +44,13 @@ export class PropertyGroupsService {
|
|
|
44
44
|
let lst = this._pgList;
|
|
45
45
|
if (designItems[0].element instanceof SVGElement)
|
|
46
46
|
lst = this._svgPgList;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
if (designItems[0].element.parentElement) {
|
|
48
|
+
const parentStyle = getComputedStyle(designItems[0].element.parentElement);
|
|
49
|
+
if (parentStyle.display.includes('grid'))
|
|
50
|
+
lst = [...lst, this._gridChild[0]];
|
|
51
|
+
else if (parentStyle.display.includes('flex'))
|
|
52
|
+
lst = [...lst, this._flexChild[0]];
|
|
53
|
+
}
|
|
52
54
|
return lst;
|
|
53
55
|
}
|
|
54
56
|
}
|
|
@@ -1037,7 +1037,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
1037
1037
|
if (this._lastHoverDesignItem != currentDesignItem) {
|
|
1038
1038
|
if (this._lastHoverDesignItem)
|
|
1039
1039
|
this.extensionManager.removeExtension(this._lastHoverDesignItem, ExtensionType.MouseOver);
|
|
1040
|
-
if (currentDesignItem && currentDesignItem != this.rootDesignItem && DomHelper.getHost(element.parentNode) !== this.overlayLayer)
|
|
1040
|
+
if (currentDesignItem && currentDesignItem != this.rootDesignItem && (!element.parentNode || DomHelper.getHost(element.parentNode) !== this.overlayLayer))
|
|
1041
1041
|
this.extensionManager.applyExtension(currentDesignItem, ExtensionType.MouseOver, event);
|
|
1042
1042
|
this._lastHoverDesignItem = currentDesignItem;
|
|
1043
1043
|
}
|
|
@@ -12,22 +12,24 @@ export class ElementDragTitleExtension extends AbstractExtension {
|
|
|
12
12
|
}
|
|
13
13
|
extend() {
|
|
14
14
|
const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
15
|
+
if (!isNaN(transformedCornerPoints[0].x)) {
|
|
16
|
+
const boundRect = this.extendedItem.element.getBoundingClientRect();
|
|
17
|
+
let w = getTextWidth(this.extendedItem.name, '10px monospace');
|
|
18
|
+
let elementWidth = Math.sqrt(Math.pow(transformedCornerPoints[1].x - transformedCornerPoints[0].x, 2) + Math.pow(transformedCornerPoints[1].y - transformedCornerPoints[0].y, 2));
|
|
19
|
+
let text = this.extendedItem.name;
|
|
20
|
+
this._width = Math.max(Math.min(elementWidth, w), extensionWidth);
|
|
21
|
+
if (w > this._width)
|
|
22
|
+
text = this.extendedItem.name.substring(0, 10) + '…';
|
|
23
|
+
this._rect = this._drawRect(transformedCornerPoints[0].x, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-primary-selection-move', this._rect);
|
|
24
|
+
this._text = this._drawText(text, (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, (boundRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 5, 'svg-text-primary', this._text);
|
|
25
|
+
const title = document.createElementNS("http://www.w3.org/2000/svg", "title");
|
|
26
|
+
title.textContent = this.extendedItem.name;
|
|
27
|
+
this._text.appendChild(title);
|
|
28
|
+
this._rect.addEventListener('pointerdown', (e) => this._pointerEvent(e));
|
|
29
|
+
this._rect.addEventListener('pointermove', (e) => this._pointerEvent(e));
|
|
30
|
+
this._rect.addEventListener('pointerup', (e) => this._pointerEvent(e));
|
|
31
|
+
this.refresh();
|
|
32
|
+
}
|
|
31
33
|
}
|
|
32
34
|
_drawMoveOverlay(itemRect) {
|
|
33
35
|
}
|
|
@@ -35,19 +37,21 @@ export class ElementDragTitleExtension extends AbstractExtension {
|
|
|
35
37
|
const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 0, y: 16 }, this.designerCanvas);
|
|
36
38
|
const angle = Math.atan2((transformedCornerPoints[1].y - transformedCornerPoints[0].y), (transformedCornerPoints[1].x - transformedCornerPoints[0].x)) * 180 / Math.PI;
|
|
37
39
|
const transformedCornerPointsTx = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 0, y: 5 }, this.designerCanvas);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
if (!isNaN(transformedCornerPoints[0].x)) {
|
|
41
|
+
const h = (15 / this.designerCanvas.scaleFactor);
|
|
42
|
+
const w = (this._width / this.designerCanvas.scaleFactor);
|
|
43
|
+
this._rect.setAttribute('x', '' + transformedCornerPoints[0].x);
|
|
44
|
+
this._rect.setAttribute('y', '' + transformedCornerPoints[0].y);
|
|
45
|
+
this._rect.style.rotate = angle + 'deg';
|
|
46
|
+
this._rect.style.transformBox = 'fill-box';
|
|
47
|
+
this._rect.setAttribute('height', '' + h);
|
|
48
|
+
this._rect.setAttribute('width', '' + w);
|
|
49
|
+
this._rect.style.strokeWidth = (1 / this.designerCanvas.scaleFactor).toString();
|
|
50
|
+
this._text.setAttribute('x', '' + transformedCornerPointsTx[0].x);
|
|
51
|
+
this._text.setAttribute('y', '' + transformedCornerPointsTx[0].y);
|
|
52
|
+
this._text.style.fontSize = (10 / this.designerCanvas.scaleFactor) + 'px';
|
|
53
|
+
this._text.setAttribute('transform', 'rotate(' + angle + ' ' + transformedCornerPointsTx[0].x + ' ' + transformedCornerPointsTx[0].y + ')');
|
|
54
|
+
}
|
|
51
55
|
}
|
|
52
56
|
_pointerEvent(event) {
|
|
53
57
|
event.preventDefault();
|
|
@@ -11,8 +11,10 @@ export class HighlightElementExtension extends AbstractExtension {
|
|
|
11
11
|
}
|
|
12
12
|
refresh() {
|
|
13
13
|
let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: offset, y: offset }, this.designerCanvas);
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
if (!isNaN(transformedCornerPoints[0].x)) {
|
|
15
|
+
this._rect = this._drawTransformedRect(transformedCornerPoints, 'svg-hover', this._rect);
|
|
16
|
+
this._rect.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
|
|
17
|
+
}
|
|
16
18
|
}
|
|
17
19
|
dispose() {
|
|
18
20
|
this._removeAllOverlays();
|