@node-projects/web-component-designer 0.1.49 → 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.
@@ -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
- actualElementMatrix = getElementCombinedTransform(actualElement);
134
- newElementMatrix = getElementCombinedTransform(newElement);
135
- newElementMatrix.m41 = newElementMatrix.m42 = 0;
136
- if (actualElement == element) {
137
- originalElementAndAllParentsMultipliedMatrix = actualElementMatrix.multiply(newElementMatrix);
138
- }
139
- else if (newElement != ancestor || !excludeAncestor) {
140
- originalElementAndAllParentsMultipliedMatrix = originalElementAndAllParentsMultipliedMatrix.multiply(newElementMatrix);
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 { AbstractStylesheetService } from '../services/stylesheetService/AbstractStylesheetService.js';
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
- for (const c of this.element.childNodes) {
339
- const di = DesignItem.createDesignItemFromInstance(c, this.serviceContainer, this.instanceServiceContainer);
340
- this._childArray.push(di);
341
- di._parent = this;
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.appendChild(designItem.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.insertBefore(designItem.view, el.element);
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
- const realContent = this._childArray.reduce((a, b) => a + b.content, '');
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 = code;
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
  }
@@ -3,5 +3,5 @@ import type { ServiceContainer } from '../ServiceContainer.js';
3
3
  import type { InstanceServiceContainer } from '../InstanceServiceContainer.js';
4
4
  import { IDesignItem } from '../../item/IDesignItem.js';
5
5
  export interface IHtmlParserService extends IService {
6
- parse(html: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
6
+ parse(html: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean, positionOffset?: Number): Promise<IDesignItem[]>;
7
7
  }
@@ -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
- const parentStyle = getComputedStyle(designItems[0].element.parentElement);
48
- if (parentStyle.display.includes('grid'))
49
- lst = [...lst, this._gridChild[0]];
50
- else if (parentStyle.display.includes('flex'))
51
- lst = [...lst, this._flexChild[0]];
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
- const boundRect = this.extendedItem.element.getBoundingClientRect();
16
- let w = getTextWidth(this.extendedItem.name, '10px monospace');
17
- let elementWidth = Math.sqrt(Math.pow(transformedCornerPoints[1].x - transformedCornerPoints[0].x, 2) + Math.pow(transformedCornerPoints[1].y - transformedCornerPoints[0].y, 2));
18
- let text = this.extendedItem.name;
19
- this._width = Math.max(Math.min(elementWidth, w), extensionWidth);
20
- if (w > this._width)
21
- text = this.extendedItem.name.substring(0, 10) + '…';
22
- this._rect = this._drawRect(transformedCornerPoints[0].x, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-primary-selection-move', this._rect);
23
- 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);
24
- const title = document.createElementNS("http://www.w3.org/2000/svg", "title");
25
- title.textContent = this.extendedItem.name;
26
- this._text.appendChild(title);
27
- this._rect.addEventListener('pointerdown', (e) => this._pointerEvent(e));
28
- this._rect.addEventListener('pointermove', (e) => this._pointerEvent(e));
29
- this._rect.addEventListener('pointerup', (e) => this._pointerEvent(e));
30
- this.refresh();
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
- const h = (15 / this.designerCanvas.scaleFactor);
39
- const w = (this._width / this.designerCanvas.scaleFactor);
40
- this._rect.setAttribute('x', '' + transformedCornerPoints[0].x);
41
- this._rect.setAttribute('y', '' + transformedCornerPoints[0].y);
42
- this._rect.style.rotate = angle + 'deg';
43
- this._rect.style.transformBox = 'fill-box';
44
- this._rect.setAttribute('height', '' + h);
45
- this._rect.setAttribute('width', '' + w);
46
- this._rect.style.strokeWidth = (1 / this.designerCanvas.scaleFactor).toString();
47
- this._text.setAttribute('x', '' + transformedCornerPointsTx[0].x);
48
- this._text.setAttribute('y', '' + transformedCornerPointsTx[0].y);
49
- this._text.style.fontSize = (10 / this.designerCanvas.scaleFactor) + 'px';
50
- this._text.setAttribute('transform', 'rotate(' + angle + ' ' + transformedCornerPointsTx[0].x + ' ' + transformedCornerPointsTx[0].y + ')');
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
- this._rect = this._drawTransformedRect(transformedCornerPoints, 'svg-hover', this._rect);
15
- this._rect.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
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();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.1.49",
4
+ "version": "0.1.51",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",