@node-projects/web-component-designer 0.0.121 → 0.0.122

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.
@@ -41,6 +41,7 @@ export declare class DesignItem implements IDesignItem {
41
41
  set content(value: string);
42
42
  get innerHTML(): string;
43
43
  set innerHTML(value: string);
44
+ get isEmptyTextNode(): boolean;
44
45
  private _hideAtDesignTime;
45
46
  get hideAtDesignTime(): boolean;
46
47
  set hideAtDesignTime(value: boolean);
@@ -85,7 +85,7 @@ export class DesignItem {
85
85
  action = new InsertChildAction(designItem, this.parent, this.parent.indexOf(this));
86
86
  }
87
87
  else if (where == 'afterend') {
88
- action = new InsertChildAction(designItem, this.parent, this.parent.indexOf(this));
88
+ action = new InsertChildAction(designItem, this.parent, this.parent.indexOf(this) + 1);
89
89
  }
90
90
  this.instanceServiceContainer.undoService.execute(action);
91
91
  }
@@ -124,6 +124,9 @@ export class DesignItem {
124
124
  this.element.innerHTML = value;
125
125
  this.updateChildrenFromNodesChildren();
126
126
  }
127
+ get isEmptyTextNode() {
128
+ return this.nodeType === NodeType.TextNode && this.content?.trim() == '';
129
+ }
127
130
  _hideAtDesignTime;
128
131
  get hideAtDesignTime() {
129
132
  return this._hideAtDesignTime;
@@ -33,6 +33,7 @@ export interface IDesignItem {
33
33
  readonly hasContent: boolean;
34
34
  content: string;
35
35
  innerHTML?: string;
36
+ readonly isEmptyTextNode: boolean;
36
37
  readonly node: Node;
37
38
  readonly element: Element;
38
39
  serviceContainer: ServiceContainer;
@@ -0,0 +1,12 @@
1
+ import { InstanceServiceContainer } from "../InstanceServiceContainer";
2
+ import { ServiceContainer } from "../ServiceContainer";
3
+ import { IHtmlParserService } from "./IHtmlParserService";
4
+ import { IDesignItem } from '../../item/IDesignItem';
5
+ export declare class LitElementParserService implements IHtmlParserService {
6
+ private _parserUrl;
7
+ private _esprimaUrl;
8
+ constructor(parserUrl?: string, esprimaUrl?: string);
9
+ parse(module: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): Promise<IDesignItem[]>;
10
+ private _parseDiv;
11
+ _createDesignItemsRecursive(item: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, namespace: string): IDesignItem;
12
+ }
@@ -0,0 +1,106 @@
1
+ import { DesignItem } from '../../item/DesignItem';
2
+ import { CssAttributeParser } from "../../helper/CssAttributeParser";
3
+ import { newElementFromString } from "../../helper/ElementHelper";
4
+ // Alternative Parser, cause when you use the Browser, it instanciates the CusomElements, and some Elemnts remove
5
+ // attributes from their DOM, so you loose Data
6
+ export class LitElementParserService {
7
+ _parserUrl;
8
+ _esprimaUrl;
9
+ constructor(parserUrl = '../../../../../node-html-parser-esm/dist/index.js', esprimaUrl = '../../../../../esprima-next/dist/esm/esprima.js') {
10
+ this._parserUrl = parserUrl;
11
+ this._esprimaUrl = esprimaUrl;
12
+ }
13
+ async parse(module, serviceContainer, instanceServiceContainer) {
14
+ let esprima = await import(this._esprimaUrl);
15
+ const parsedModule = esprima.parseModule(module);
16
+ const classDecl = parsedModule.body.find(x => x.type == esprima.Syntax.ClassDeclaration);
17
+ const renderMethod = classDecl.body.body.find(x => x.type == esprima.Syntax.MethodDefinition && x.key.name == 'render');
18
+ const renderMethodStatement = renderMethod.value.body.body[0];
19
+ const taggedTemplate = renderMethodStatement.argument;
20
+ const templateLiteral = taggedTemplate.quasi;
21
+ const html = templateLiteral.quasis.map(x => x.value.raw).join();
22
+ //@ts-ignore
23
+ let parser = await import(this._parserUrl);
24
+ const parsed = parser.parse(html, { comment: true });
25
+ let designItems = [];
26
+ for (let p of parsed.childNodes) {
27
+ let di = this._createDesignItemsRecursive(p, serviceContainer, instanceServiceContainer, null);
28
+ if (di != null)
29
+ designItems.push(di);
30
+ else
31
+ console.warn("NodeHtmlParserService - could not parse element", p);
32
+ }
33
+ return designItems;
34
+ }
35
+ _parseDiv = document.createElement("div");
36
+ _createDesignItemsRecursive(item, serviceContainer, instanceServiceContainer, namespace) {
37
+ let designItem = null;
38
+ if (item.nodeType == 1) {
39
+ let element;
40
+ let manualCreatedElement = false;
41
+ if (!namespace)
42
+ element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
43
+ if (!element) {
44
+ if (namespace)
45
+ element = document.createElementNS(namespace, item.rawTagName);
46
+ else
47
+ element = document.createElement(item.rawTagName);
48
+ manualCreatedElement = true;
49
+ }
50
+ designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
51
+ let hideAtDesignTime = false;
52
+ let hideAtRunTime = false;
53
+ let lockAtDesignTime = false;
54
+ let style = '';
55
+ let attr = item.attributes;
56
+ for (let a in attr) {
57
+ if (a !== 'style') {
58
+ designItem.attributes.set(a, attr[a]);
59
+ if (manualCreatedElement) {
60
+ element.setAttribute(a, attr[a]);
61
+ }
62
+ if (a === 'node-projects-hide-at-design-time')
63
+ hideAtDesignTime = true;
64
+ else if (a === 'node-projects-hide-at-run-time')
65
+ hideAtRunTime = true;
66
+ else if (a === 'node-projects-lock-at-design-time')
67
+ lockAtDesignTime = true;
68
+ }
69
+ else {
70
+ style = attr[a];
71
+ }
72
+ }
73
+ if ((element instanceof HTMLElement || element instanceof SVGElement) && style) {
74
+ let styleParser = new CssAttributeParser();
75
+ styleParser.parse(style);
76
+ for (let s of styleParser.entries) {
77
+ designItem.styles.set(s.name, s.value);
78
+ if (manualCreatedElement) {
79
+ element.style[s.name] = s.value;
80
+ }
81
+ }
82
+ }
83
+ if (!lockAtDesignTime && (element instanceof HTMLElement || element instanceof SVGElement)) {
84
+ requestAnimationFrame(() => element.style.pointerEvents = 'auto');
85
+ }
86
+ designItem.hideAtDesignTime = hideAtDesignTime;
87
+ designItem.hideAtRunTime = hideAtRunTime;
88
+ designItem.lockAtDesignTime = lockAtDesignTime;
89
+ element.draggable = false; //even if it should be true, for better designer exp.
90
+ for (let c of item.childNodes) {
91
+ let di = this._createDesignItemsRecursive(c, serviceContainer, instanceServiceContainer, element instanceof SVGElement ? 'http://www.w3.org/2000/svg' : null);
92
+ designItem._insertChildInternal(di);
93
+ }
94
+ }
95
+ else if (item.nodeType == 3) {
96
+ this._parseDiv.innerHTML = item.rawText;
97
+ let element = this._parseDiv.childNodes[0];
98
+ designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
99
+ }
100
+ else if (item.nodeType == 8) {
101
+ let element = document.createComment(item.rawText);
102
+ designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
103
+ }
104
+ return designItem;
105
+ }
106
+ }
@@ -0,0 +1,11 @@
1
+ import { InstanceServiceContainer } from "../InstanceServiceContainer";
2
+ import { ServiceContainer } from "../ServiceContainer";
3
+ import { IHtmlParserService } from "./IHtmlParserService";
4
+ import { IDesignItem } from '../../item/IDesignItem';
5
+ export declare class NodeHtmlParserService implements IHtmlParserService {
6
+ private _parserUrl;
7
+ constructor(parserUrl?: string);
8
+ parse(html: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): Promise<IDesignItem[]>;
9
+ private _parseDiv;
10
+ _createDesignItemsRecursive(item: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, namespace: string): IDesignItem;
11
+ }
@@ -0,0 +1,96 @@
1
+ import { DesignItem } from '../../item/DesignItem';
2
+ import { CssAttributeParser } from "../../helper/CssAttributeParser";
3
+ import { newElementFromString } from "../../helper/ElementHelper";
4
+ // Alternative Parser, cause when you use the Browser, it instanciates the CusomElements, and some Elemnts remove
5
+ // attributes from their DOM, so you loose Data
6
+ export class NodeHtmlParserService {
7
+ _parserUrl;
8
+ constructor(parserUrl = '../../../../../node-html-parser-esm/dist/index.js') {
9
+ this._parserUrl = parserUrl;
10
+ }
11
+ async parse(html, serviceContainer, instanceServiceContainer) {
12
+ //@ts-ignore
13
+ let parser = await import(this._parserUrl);
14
+ const parsed = parser.parse(html, { comment: true });
15
+ let designItems = [];
16
+ for (let p of parsed.childNodes) {
17
+ let di = this._createDesignItemsRecursive(p, serviceContainer, instanceServiceContainer, null);
18
+ if (di != null)
19
+ designItems.push(di);
20
+ else
21
+ console.warn("NodeHtmlParserService - could not parse element", p);
22
+ }
23
+ return designItems;
24
+ }
25
+ _parseDiv = document.createElement("div");
26
+ _createDesignItemsRecursive(item, serviceContainer, instanceServiceContainer, namespace) {
27
+ let designItem = null;
28
+ if (item.nodeType == 1) {
29
+ let element;
30
+ let manualCreatedElement = false;
31
+ if (!namespace)
32
+ element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
33
+ if (!element) {
34
+ if (namespace)
35
+ element = document.createElementNS(namespace, item.rawTagName);
36
+ else
37
+ element = document.createElement(item.rawTagName);
38
+ manualCreatedElement = true;
39
+ }
40
+ designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
41
+ let hideAtDesignTime = false;
42
+ let hideAtRunTime = false;
43
+ let lockAtDesignTime = false;
44
+ let style = '';
45
+ let attr = item.attributes;
46
+ for (let a in attr) {
47
+ if (a !== 'style') {
48
+ designItem.attributes.set(a, attr[a]);
49
+ if (manualCreatedElement) {
50
+ element.setAttribute(a, attr[a]);
51
+ }
52
+ if (a === 'node-projects-hide-at-design-time')
53
+ hideAtDesignTime = true;
54
+ else if (a === 'node-projects-hide-at-run-time')
55
+ hideAtRunTime = true;
56
+ else if (a === 'node-projects-lock-at-design-time')
57
+ lockAtDesignTime = true;
58
+ }
59
+ else {
60
+ style = attr[a];
61
+ }
62
+ }
63
+ if ((element instanceof HTMLElement || element instanceof SVGElement) && style) {
64
+ let styleParser = new CssAttributeParser();
65
+ styleParser.parse(style);
66
+ for (let s of styleParser.entries) {
67
+ designItem.styles.set(s.name, s.value);
68
+ if (manualCreatedElement) {
69
+ element.style[s.name] = s.value;
70
+ }
71
+ }
72
+ }
73
+ if (!lockAtDesignTime && (element instanceof HTMLElement || element instanceof SVGElement)) {
74
+ requestAnimationFrame(() => element.style.pointerEvents = 'auto');
75
+ }
76
+ designItem.hideAtDesignTime = hideAtDesignTime;
77
+ designItem.hideAtRunTime = hideAtRunTime;
78
+ designItem.lockAtDesignTime = lockAtDesignTime;
79
+ element.draggable = false; //even if it should be true, for better designer exp.
80
+ for (let c of item.childNodes) {
81
+ let di = this._createDesignItemsRecursive(c, serviceContainer, instanceServiceContainer, element instanceof SVGElement ? 'http://www.w3.org/2000/svg' : null);
82
+ designItem._insertChildInternal(di);
83
+ }
84
+ }
85
+ else if (item.nodeType == 3) {
86
+ this._parseDiv.innerHTML = item.rawText;
87
+ let element = this._parseDiv.childNodes[0];
88
+ designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
89
+ }
90
+ else if (item.nodeType == 8) {
91
+ let element = document.createComment(item.rawText);
92
+ designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
93
+ }
94
+ return designItem;
95
+ }
96
+ }
@@ -1,3 +1,4 @@
1
+ import { DefaultPlacementService } from './DefaultPlacementService.js';
1
2
  export class FlexBoxPlacementService {
2
3
  enterContainer(container, items) {
3
4
  for (let i of items) {
@@ -9,6 +10,12 @@ export class FlexBoxPlacementService {
9
10
  }
10
11
  }
11
12
  leaveContainer(container, items) {
13
+ for (let i of items) {
14
+ if (!i.lastContainerSize) {
15
+ const rect = i.element.getBoundingClientRect();
16
+ i.lastContainerSize = { width: rect.width, height: rect.height };
17
+ }
18
+ }
12
19
  }
13
20
  serviceForContainer(container, containerStyle) {
14
21
  if (containerStyle.display == 'flex' || containerStyle.display == 'inline-flex')
@@ -28,17 +35,68 @@ export class FlexBoxPlacementService {
28
35
  return container.element.getBoundingClientRect();
29
36
  }
30
37
  placePoint(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
31
- return null;
38
+ const defaultPlacementService = container.serviceContainer.getLastServiceWhere('containerService', x => x instanceof DefaultPlacementService);
39
+ return defaultPlacementService.placePoint(event, placementView, container, startPoint, offsetInControl, newPoint, items);
32
40
  }
33
41
  place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
34
- /*let direction = getComputedStyle(container.element).flexDirection;
35
-
36
- const pos = (<IDesignerCanvas><unknown>placementView).getNormalizedEventCoordinates(event);
37
- const posElement = (<IDesignerCanvas><unknown>placementView).getNormalizedElementCoordinates(items[0].element)
38
-
39
- for (let e of container.element.children) {
40
-
41
- }*/
42
+ const pos = placementView.getNormalizedEventCoordinates(event);
43
+ const style = getComputedStyle(container.element);
44
+ const childrenWithPos = Array.from(container.children()).filter(x => !x.isEmptyTextNode).map(x => [x, placementView.getNormalizedElementCoordinates(x.element)]);
45
+ if (style.flexDirection == 'row') {
46
+ childrenWithPos.sort(x => x[1].x);
47
+ let elBefore = null;
48
+ for (let c of childrenWithPos) {
49
+ if (c[1].x + c[1].width / 2 < pos.x) {
50
+ elBefore = c;
51
+ }
52
+ }
53
+ let posBefore = childrenWithPos.indexOf(elBefore);
54
+ let posDrag = childrenWithPos.indexOf(childrenWithPos.find(x => x[0] == items[0]));
55
+ if (elBefore && elBefore[0] != items[0]) {
56
+ if (posBefore + 1 === posDrag)
57
+ return;
58
+ let cg = items[0].openGroup('move in flexbox');
59
+ items[0].remove();
60
+ elBefore[0].insertAdjacentElement(items[0], 'afterend');
61
+ cg.commit();
62
+ }
63
+ else if (elBefore == null) {
64
+ if (posDrag == 0)
65
+ return;
66
+ let cg = items[0].openGroup('move in flexbox');
67
+ items[0].remove();
68
+ container.insertChild(items[0], 0);
69
+ cg.commit();
70
+ }
71
+ }
72
+ else if (style.flexDirection == 'column') {
73
+ childrenWithPos.sort(x => x[1].y);
74
+ let elBefore = null;
75
+ for (let c of childrenWithPos) {
76
+ if (c[1].y + c[1].height / 2 < pos.y) {
77
+ elBefore = c;
78
+ }
79
+ }
80
+ let posBefore = childrenWithPos.indexOf(elBefore);
81
+ let posDrag = childrenWithPos.indexOf(childrenWithPos.find(x => x[0] == items[0]));
82
+ if (elBefore && elBefore[0] != items[0]) {
83
+ if (posBefore + 1 === posDrag)
84
+ return;
85
+ let cg = items[0].openGroup('move in flexbox');
86
+ items[0].remove();
87
+ elBefore[0].insertAdjacentElement(items[0], 'afterend');
88
+ cg.commit();
89
+ }
90
+ else if (elBefore == null) {
91
+ if (posDrag == 0)
92
+ return;
93
+ let cg = items[0].openGroup('move in flexbox');
94
+ items[0].remove();
95
+ container.insertChild(items[0], 0);
96
+ cg.commit();
97
+ }
98
+ }
99
+ placementView.extensionManager.refreshAllExtensions([container]);
42
100
  }
43
101
  finishPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
44
102
  }
@@ -3,7 +3,7 @@ import { IExtensionManager } from "./IExtensionManger";
3
3
  import { OverlayLayerView } from '../overlayLayerView';
4
4
  import { OverlayLayer } from './OverlayLayer';
5
5
  export declare abstract class AbstractExtensionBase {
6
- protected overlays: SVGGraphicsElement[];
6
+ protected overlays: SVGElement[];
7
7
  protected overlayLayerView: OverlayLayerView;
8
8
  protected extensionManager: IExtensionManager;
9
9
  protected designerCanvas: IDesignerCanvas;
@@ -13,4 +13,5 @@ export declare abstract class AbstractExtensionBase {
13
13
  protected _drawCircle(x: number, y: number, radius: number, className?: string, circle?: SVGCircleElement, overlayLayer?: OverlayLayer): SVGCircleElement;
14
14
  protected _drawRect(x: number, y: number, w: number, h: number, className?: string, rect?: SVGRectElement, overlayLayer?: OverlayLayer): SVGRectElement;
15
15
  protected _drawText(text: string, x: number, y: number, className?: string, textEl?: SVGTextElement, overlayLayer?: OverlayLayer): SVGTextElement;
16
+ protected _drawTextWithBackground(text: string, x: number, y: number, backgroundColor: string, className?: string, existingEls?: [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement], overlayLayer?: OverlayLayer): [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement];
16
17
  }
@@ -47,4 +47,11 @@ export class AbstractExtensionBase {
47
47
  }
48
48
  return newText;
49
49
  }
50
+ _drawTextWithBackground(text, x, y, backgroundColor, className, existingEls, overlayLayer) {
51
+ const newEls = this.overlayLayerView.drawTextWithBackground(text, x, y, backgroundColor, className, existingEls, overlayLayer);
52
+ if (!existingEls) {
53
+ this.overlays.push(...newEls);
54
+ }
55
+ return newEls;
56
+ }
50
57
  }
@@ -7,9 +7,7 @@ export declare class PositionExtension extends AbstractExtension {
7
7
  private _line2;
8
8
  private _line3;
9
9
  private _line4;
10
- private _rectX;
11
10
  private _textX;
12
- private _rectY;
13
11
  private _textY;
14
12
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
15
13
  extend(): void;
@@ -4,9 +4,7 @@ export class PositionExtension extends AbstractExtension {
4
4
  _line2;
5
5
  _line3;
6
6
  _line4;
7
- _rectX;
8
7
  _textX;
9
- _rectY;
10
8
  _textY;
11
9
  constructor(extensionManager, designerView, extendedItem) {
12
10
  super(extensionManager, designerView, extendedItem);
@@ -31,12 +29,12 @@ export class PositionExtension extends AbstractExtension {
31
29
  this._line4.style.strokeDasharray = '' + (4 / this.designerCanvas.scaleFactor);
32
30
  let x = Math.round(itemRect.x - itemParentRect.x);
33
31
  let y = Math.round(itemRect.y - itemParentRect.y);
34
- this._rectX = this._drawRect(itemParentRect.x + x / 2 - 10, itemRect.y + itemRect.height / 2 - 8, 20, 16, 'svg-position-text-rect', this._rectX);
35
- this._textX = this._drawText('' + x, itemParentRect.x + x / 2 - 9, itemRect.y + itemRect.height / 2 + 4, null, this._textX);
36
- this._textX.style.fontSize = '12px';
37
- this._rectY = this._drawRect(itemRect.x + itemRect.width / 2 - 10, itemParentRect.y + y / 2 - 8, 20, 16, 'svg-position-text-rect', this._rectY);
38
- this._textY = this._drawText('' + y, itemRect.x + itemRect.width / 2 - 10, itemParentRect.y + y / 2 + 4, null, this._textY);
39
- this._textY.style.fontSize = '12px';
32
+ this._textX = this._drawTextWithBackground('' + x, itemParentRect.x + x / 2, itemRect.y + itemRect.height / 2, 'white', 'svg-position-text', this._textX);
33
+ this._textX[2].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
34
+ this._textX[3].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
35
+ this._textY = this._drawTextWithBackground('' + y, itemRect.x + itemRect.width / 2, itemParentRect.y + y / 2, 'white', 'svg-position-text', this._textY);
36
+ this._textY[2].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
37
+ this._textY[3].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
40
38
  }
41
39
  dispose() {
42
40
  this._removeAllOverlays();
@@ -11,6 +11,6 @@ export class PositionExtensionProvider {
11
11
  return new PositionExtension(extensionManager, designerView, designItem);
12
12
  }
13
13
  style = css `
14
- .svg-position-text-rect { fill: white; }
14
+ .svg-position-text { text-anchor: middle; alignment-baseline: central; }
15
15
  `;
16
16
  }
@@ -10,10 +10,12 @@ export declare class OverlayLayerView extends BaseCustomWebComponentConstructorA
10
10
  private _gBackground;
11
11
  private _gNormal;
12
12
  private _gForeground;
13
+ private _defs;
14
+ private _id;
13
15
  constructor(serviceContainer: ServiceContainer);
14
16
  private _initialize;
15
17
  addOverlay(element: SVGGraphicsElement, overlayLayer?: OverlayLayer): void;
16
- removeOverlay(element: SVGGraphicsElement): void;
18
+ removeOverlay(element: SVGElement): void;
17
19
  removeAllNodesWithClass(className: string): void;
18
20
  removeAllOverlays(): void;
19
21
  createPoint(): DOMPointInit;
@@ -22,4 +24,5 @@ export declare class OverlayLayerView extends BaseCustomWebComponentConstructorA
22
24
  drawCircle(x: number, y: number, radius: number, className?: string, circle?: SVGCircleElement, overlayLayer?: OverlayLayer): SVGCircleElement;
23
25
  drawRect(x: number, y: number, w: number, h: number, className?: string, rect?: SVGRectElement, overlayLayer?: OverlayLayer): SVGRectElement;
24
26
  drawText(text: string, x: number, y: number, className?: string, textEl?: SVGTextElement, overlayLayer?: OverlayLayer): SVGTextElement;
27
+ drawTextWithBackground(text: string, x: number, y: number, backgroundColor: string, className?: string, existingEls?: [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement], overlayLayer?: OverlayLayer): [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement];
25
28
  }
@@ -3,6 +3,7 @@ import { OverlayLayer } from './extensions/OverlayLayer.js';
3
3
  export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
4
4
  static template = html `
5
5
  <svg id="svg" style="pointer-events: none;">
6
+ <defs id="defs"></defs>
6
7
  <g id="background"></g>
7
8
  <g id="normal"></g>
8
9
  <g id="foreground"></g>
@@ -27,6 +28,8 @@ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
27
28
  _gBackground;
28
29
  _gNormal;
29
30
  _gForeground;
31
+ _defs;
32
+ _id = 0;
30
33
  constructor(serviceContainer) {
31
34
  super();
32
35
  this._serviceContainer = serviceContainer;
@@ -34,6 +37,7 @@ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
34
37
  this._gBackground = this._getDomElement('background');
35
38
  this._gNormal = this._getDomElement('normal');
36
39
  this._gForeground = this._getDomElement('foreground');
40
+ this._defs = this._getDomElement('defs');
37
41
  this._initialize();
38
42
  }
39
43
  _initialize() {
@@ -143,5 +147,40 @@ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
143
147
  textEl.setAttribute('class', className);
144
148
  return textEl;
145
149
  }
150
+ drawTextWithBackground(text, x, y, backgroundColor, className, existingEls, overlayLayer) {
151
+ if (!existingEls) {
152
+ let filter = document.createElementNS("http://www.w3.org/2000/svg", "filter");
153
+ filter.setAttribute("x", "0");
154
+ filter.setAttribute("y", "0");
155
+ filter.setAttribute("width", "1");
156
+ filter.setAttribute("height", "1");
157
+ filter.setAttribute("id", "solid_" + (++this._id));
158
+ let flood = document.createElementNS("http://www.w3.org/2000/svg", "feFlood");
159
+ flood.setAttribute("flood-color", backgroundColor);
160
+ filter.appendChild(flood);
161
+ let composite = document.createElementNS("http://www.w3.org/2000/svg", "feComposite");
162
+ composite.setAttribute("in", "SourceGraphic");
163
+ composite.setAttribute("operator", "xor");
164
+ filter.appendChild(composite);
165
+ this._defs.appendChild(filter);
166
+ let textEl1 = document.createElementNS("http://www.w3.org/2000/svg", "text");
167
+ textEl1.setAttribute("filter", "url(#solid_" + this._id + ")");
168
+ let textEl2 = document.createElementNS("http://www.w3.org/2000/svg", "text");
169
+ this.addOverlay(textEl1, overlayLayer);
170
+ this.addOverlay(textEl2, overlayLayer);
171
+ existingEls = [filter, flood, textEl1, textEl2];
172
+ }
173
+ existingEls[2].setAttribute('x', x);
174
+ existingEls[3].setAttribute('x', x);
175
+ existingEls[2].setAttribute('y', y);
176
+ existingEls[3].setAttribute('y', y);
177
+ existingEls[2].textContent = text;
178
+ existingEls[3].textContent = text;
179
+ if (className) {
180
+ existingEls[2].setAttribute('class', className);
181
+ existingEls[3].setAttribute('class', className);
182
+ }
183
+ return existingEls;
184
+ }
146
185
  }
147
186
  customElements.define(OverlayLayerView.is, OverlayLayerView);
@@ -171,6 +171,9 @@ export class PointerTool {
171
171
  }
172
172
  case EventNames.PointerMove:
173
173
  {
174
+ if (event.buttons == 0) {
175
+ return;
176
+ }
174
177
  const elementMoved = currentPoint.x != this._initialPoint.x || currentPoint.y != this._initialPoint.y;
175
178
  if (this._actionType != PointerActionType.Drag && elementMoved) {
176
179
  this._actionType = PointerActionType.Drag;
@@ -377,7 +377,7 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
377
377
  ref: item
378
378
  });
379
379
  for (let i of item.children()) {
380
- if (i.nodeType !== NodeType.TextNode || i.content?.trim()) {
380
+ if (!i.isEmptyTextNode) {
381
381
  this._getChildren(i, newNode);
382
382
  }
383
383
  }
package/dist/index.d.ts CHANGED
@@ -56,6 +56,7 @@ export * from "./elements/services/htmlWriterService/HtmlWriterService.js";
56
56
  export * from "./elements/services/htmlWriterService/LitTsElementWriterService.js";
57
57
  export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
58
58
  export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
59
+ export * from "./elements/services/htmlParserService/LitElementParserService.js";
59
60
  export type { IHtmlParserService } from "./elements/services/htmlParserService/IHtmlParserService.js";
60
61
  export type { IIntializationService } from "./elements/services/initializationService/IIntializationService.js";
61
62
  export * from "./elements/services/instanceService/DefaultInstanceService.js";
package/dist/index.js CHANGED
@@ -35,6 +35,7 @@ export * from "./elements/services/htmlWriterService/HtmlWriterService.js";
35
35
  export * from "./elements/services/htmlWriterService/LitTsElementWriterService.js";
36
36
  export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
37
37
  export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
38
+ export * from "./elements/services/htmlParserService/LitElementParserService.js";
38
39
  export * from "./elements/services/instanceService/DefaultInstanceService.js";
39
40
  export * from "./elements/services/manifestParsers/WebcomponentManifestParserService.js";
40
41
  export * from "./elements/services/modelCommandService/DefaultModelCommandService.js";
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.0.121",
4
+ "version": "0.0.122",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",