@node-projects/web-component-designer 0.1.153 → 0.1.155

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/dist/elements/helper/LayoutHelper.js +2 -2
  2. package/dist/elements/item/DesignItem.js +1 -1
  3. package/dist/elements/services/DefaultServiceBootstrap.js +5 -1
  4. package/dist/elements/widgets/debugView/debug-view.js +24 -5
  5. package/dist/elements/widgets/designerView/designerCanvas.js +2 -2
  6. package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.d.ts +1 -0
  7. package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.js +7 -0
  8. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +11 -0
  9. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension copy.d.ts +15 -0
  10. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension copy.js +68 -0
  11. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +4 -2
  12. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtensionProvider copy.d.ts +10 -0
  13. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtensionProvider copy.js +13 -0
  14. package/dist/elements/widgets/designerView/extensions/PreviousElementSelectExtension.d.ts +12 -0
  15. package/dist/elements/widgets/designerView/extensions/PreviousElementSelectExtension.js +38 -0
  16. package/dist/elements/widgets/designerView/extensions/PreviousElementSelectExtensionProvider.d.ts +10 -0
  17. package/dist/elements/widgets/designerView/extensions/PreviousElementSelectExtensionProvider.js +14 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +2 -0
  20. package/package.json +1 -1
@@ -34,8 +34,8 @@ export function placeDesignItem(container, designItem, offset, mode) {
34
34
  if (mode === 'position') {
35
35
  let positionedContainerElement = container.element;
36
36
  let computedStylePositionedContainer = getComputedStyle(container.element);
37
- while (computedStylePositionedContainer.position !== 'relative' && computedStylePositionedContainer.position !== 'absolute') {
38
- positionedContainerElement = positionedContainerElement.parentElement;
37
+ if (computedStylePositionedContainer.position !== 'relative' && computedStylePositionedContainer.position !== 'absolute') {
38
+ positionedContainerElement = positionedContainerElement.offsetParent;
39
39
  computedStylePositionedContainer = getComputedStyle(positionedContainerElement);
40
40
  }
41
41
  let oldLeft = null;
@@ -268,7 +268,7 @@ export class DesignItem {
268
268
  const range = document.createRange();
269
269
  range.selectNode(document.body);
270
270
  const fragment = range.createContextualFragment(value);
271
- for (const n of fragment.childNodes) {
271
+ for (const n of [...fragment.childNodes]) {
272
272
  let di = DesignItem.createDesignItemFromInstance(n, this.serviceContainer, this.instanceServiceContainer);
273
273
  this.insertChild(di);
274
274
  }
@@ -95,6 +95,7 @@ import { PaddingExtensionProvider } from '../widgets/designerView/extensions/Pad
95
95
  import { GridChildResizeExtensionProvider } from '../widgets/designerView/extensions/grid/GridChildResizeExtensionProvider.js';
96
96
  import { AlignItemsContextMenu } from '../widgets/designerView/extensions/contextMenu/AlignItemsContextMenu.js';
97
97
  import { BasicWebcomponentPropertiesService } from './propertiesService/services/BasicWebcomponentPropertiesService.js';
98
+ import { PreviousElementSelectExtensionProvider } from '../widgets/designerView/extensions/PreviousElementSelectExtensionProvider.js';
98
99
  export function createDefaultServiceContainer() {
99
100
  let serviceContainer = new ServiceContainer();
100
101
  let defaultPlacementService = new DefaultPlacementService();
@@ -131,6 +132,7 @@ export function createDefaultServiceContainer() {
131
132
  ]);
132
133
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
133
134
  new ConditionExtensionProvider(new ElementDragTitleExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
135
+ new PreviousElementSelectExtensionProvider(),
134
136
  new TransformOriginExtensionProvider(true),
135
137
  new MarginExtensionProvider(),
136
138
  new PaddingExtensionProvider(),
@@ -160,7 +162,9 @@ export function createDefaultServiceContainer() {
160
162
  new FlexboxExtensionProvider()
161
163
  ]);
162
164
  serviceContainer.designerExtensions.set(ExtensionType.MouseOver, [
163
- new HighlightElementExtensionProvider()
165
+ new HighlightElementExtensionProvider(),
166
+ new ElementDragTitleExtensionProvider(),
167
+ new PreviousElementSelectExtensionProvider()
164
168
  ]);
165
169
  serviceContainer.designerExtensions.set(ExtensionType.Placement, [
166
170
  new PlacementExtensionProvider()
@@ -38,6 +38,18 @@ const getClosestStackingContext = function (node) {
38
38
  if (computedStyle.transform !== 'none') {
39
39
  return { node: node, reason: `transform: ${computedStyle.transform}` };
40
40
  }
41
+ // elements with a scale value other than "none".
42
+ if (computedStyle.scale !== 'none') {
43
+ return { node: node, reason: `scale: ${computedStyle.scale}` };
44
+ }
45
+ // elements with a transform value other than "none".
46
+ if (computedStyle.translate !== 'none') {
47
+ return { node: node, reason: `translate: ${computedStyle.translate}` };
48
+ }
49
+ // elements with a transform value other than "none".
50
+ if (computedStyle.rotate !== 'none') {
51
+ return { node: node, reason: `rotate: ${computedStyle.rotate}` };
52
+ }
41
53
  // elements with a mix-blend-mode value other than "normal".
42
54
  if (computedStyle.mixBlendMode !== 'normal') {
43
55
  return { node: node, reason: `mixBlendMode: ${computedStyle.mixBlendMode}` };
@@ -46,6 +58,10 @@ const getClosestStackingContext = function (node) {
46
58
  if (computedStyle.filter !== 'none') {
47
59
  return { node: node, reason: `filter: ${computedStyle.filter}` };
48
60
  }
61
+ // elements with a filter value other than "none".
62
+ if (computedStyle.backdropFilter !== 'none') {
63
+ return { node: node, reason: `backdropFilter: ${computedStyle.backdropFilter}` };
64
+ }
49
65
  // elements with a perspective value other than "none".
50
66
  if (computedStyle.perspective !== 'none') {
51
67
  return { node: node, reason: `perspective: ${computedStyle.perspective}` };
@@ -75,7 +91,7 @@ const getClosestStackingContext = function (node) {
75
91
  return { node: node, reason: `isolation: ${computedStyle.isolation}` };
76
92
  }
77
93
  // transform or opacity in will-change even if you don't specify values for these attributes directly.
78
- if (computedStyle.willChange === 'transform' || computedStyle.willChange === 'opacity') {
94
+ if (computedStyle.willChange === 'transform' || computedStyle.willChange === 'opacity' || computedStyle.willChange === 'scale' || computedStyle.willChange === 'translate' || computedStyle.willChange === 'rotate') {
79
95
  return { node: node, reason: `willChange: ${computedStyle.willChange}` };
80
96
  }
81
97
  // an item with a z-index value other than "auto".
@@ -131,6 +147,7 @@ export class DebugView extends BaseCustomWebComponentConstructorAppend {
131
147
  overflow: auto;
132
148
  height: 100%;
133
149
  display: block;
150
+ font-size: 12px;
134
151
  }
135
152
  table {
136
153
  font-family: Arial, Helvetica, sans-serif;
@@ -162,8 +179,8 @@ export class DebugView extends BaseCustomWebComponentConstructorAppend {
162
179
  }`;
163
180
  _ready;
164
181
  computedStyle;
165
- createsStackingContext;
166
- createsStackingContextReason;
182
+ createsStackingContext = '';
183
+ createsStackingContextReason = '';
167
184
  parentStackingContext;
168
185
  parentStackingContextText;
169
186
  selectedElementOffsetParent;
@@ -200,7 +217,8 @@ export class DebugView extends BaseCustomWebComponentConstructorAppend {
200
217
  if (element && element.nodeType != 8 && element.nodeType != 11) {
201
218
  this.computedStyle = getComputedStyle(element);
202
219
  this.selectedElementOffsetParent = element.offsetParent;
203
- if (this.selectedElementOffsetParent == designItem.instanceServiceContainer.designerCanvas.rootDesignItem.element) {
220
+ if (this.selectedElementOffsetParent == designItem.instanceServiceContainer.designerCanvas.rootDesignItem.element ||
221
+ this.selectedElementOffsetParent == designItem.instanceServiceContainer.designerCanvas.rootDesignItem.element.parentElement) {
204
222
  this.selectedElementOffsetParentText = null;
205
223
  this.selectedElementOffsetParent = null;
206
224
  }
@@ -214,7 +232,8 @@ export class DebugView extends BaseCustomWebComponentConstructorAppend {
214
232
  if (this.createsStackingContext && element.nodeName !== 'HTML') {
215
233
  this.parentStackingContext = getClosestStackingContext(element.parentNode).node;
216
234
  }
217
- if (this.parentStackingContext == designItem.instanceServiceContainer.designerCanvas.rootDesignItem.element.parentElement.parentElement) {
235
+ if (this.parentStackingContext == designItem.instanceServiceContainer.designerCanvas.rootDesignItem.element.parentElement ||
236
+ this.parentStackingContext == designItem.instanceServiceContainer.designerCanvas.rootDesignItem.element.parentElement.parentElement) {
218
237
  this.parentStackingContextText = null;
219
238
  this.parentStackingContext = null;
220
239
  }
@@ -256,10 +256,10 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
256
256
  <div id="node-projects-designer-canvas-outercanvas2" style="width:100%;height:100%;position:relative; margin: 0 !important; padding: 0 !important; border: none !important; isolation: isolate !important;">
257
257
  <div id="node-projects-designer-canvas-canvasContainer"
258
258
  style="width: 100%;height: 100%;position: absolute;top: 0;left: 0;user-select: none; margin: 0 !important; padding: 0 !important; border: none !important;">
259
- <div id="node-projects-designer-canvas-canvas" part="canvas"></div>
259
+ <div title="" id="node-projects-designer-canvas-canvas" part="canvas"></div>
260
260
  </div>
261
261
  </div>
262
- <div id="node-projects-designer-canvas-clickOverlay" tabindex="0" style="pointer-events: auto; margin: 0 !important; padding: 0 !important; border: none !important;"></div>
262
+ <div id="node-projects-designer-canvas-clickOverlay" title="" tabindex="0" style="pointer-events: auto; margin: 0 !important; padding: 0 !important; border: none !important;"></div>
263
263
  </div>
264
264
 
265
265
  <div id="node-projects-designer-search-container" style="display: none;">
@@ -17,6 +17,7 @@ export declare abstract class AbstractExtensionBase {
17
17
  protected _drawLine(x1: number, y1: number, x2: number, y2: number, className?: string, line?: SVGLineElement, overlayLayer?: OverlayLayer): SVGLineElement;
18
18
  protected _drawCircle(x: number, y: number, radius: number, className?: string, circle?: SVGCircleElement, overlayLayer?: OverlayLayer): SVGCircleElement;
19
19
  protected _drawRect(x: number, y: number, w: number, h: number, className?: string, rect?: SVGRectElement, overlayLayer?: OverlayLayer): SVGRectElement;
20
+ protected _drawPath(data: string, className?: string, path?: SVGPathElement, overlayLayer?: OverlayLayer): SVGPathElement;
20
21
  protected _drawText(text: string, x: number, y: number, className?: string, textEl?: SVGTextElement, overlayLayer?: OverlayLayer): SVGTextElement;
21
22
  protected _drawHTML(html: string | HTMLElement, x: number, y: number, w: number, h: number, className?: string, htmlObj?: SVGForeignObjectElement, overlayLayer?: OverlayLayer): SVGForeignObjectElement;
22
23
  protected _drawTextWithBackground(text: string, x: number, y: number, backgroundColor: string, className?: string, existingEls?: [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement], overlayLayer?: OverlayLayer): [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement];
@@ -66,6 +66,13 @@ export class AbstractExtensionBase {
66
66
  }
67
67
  return newRect;
68
68
  }
69
+ _drawPath(data, className, path, overlayLayer) {
70
+ const newPath = this.overlayLayerView.drawPath(this.constructor.name, data, className, path, overlayLayer);
71
+ if (!path) {
72
+ this.overlays.push(newPath);
73
+ }
74
+ return newPath;
75
+ }
69
76
  _drawText(text, x, y, className, textEl, overlayLayer) {
70
77
  const newText = this.overlayLayerView.drawText(this.constructor.name, text, x, y, className, textEl, overlayLayer);
71
78
  if (!textEl) {
@@ -94,6 +94,17 @@ export class EditTextExtension extends AbstractExtension {
94
94
  }
95
95
  commitchanges() {
96
96
  this._removeAllOverlays();
97
+ this.extendedItem.element.normalize();
98
+ let stop = false;
99
+ outer: while (!stop) {
100
+ for (let e of this.extendedItem.element.querySelectorAll('*')) {
101
+ if (e.childNodes.length == 0) {
102
+ e.remove();
103
+ continue outer;
104
+ }
105
+ }
106
+ stop = true;
107
+ }
97
108
  const newHTML = this.extendedItem.element.innerHTML;
98
109
  this.extendedItem.editContentFinish();
99
110
  this.extendedItem.innerHTML = newHTML;
@@ -0,0 +1,15 @@
1
+ import { IDesignItem } from '../../../item/IDesignItem.js';
2
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
+ import { AbstractExtension } from './AbstractExtension.js';
4
+ import { IExtensionManager } from './IExtensionManger.js';
5
+ export declare class ElementDragTitleExtension extends AbstractExtension {
6
+ private _rect;
7
+ private _text;
8
+ private _width;
9
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
10
+ extend(cache: Record<string | symbol, any>, event?: Event): void;
11
+ _drawMoveOverlay(itemRect: DOMRect): void;
12
+ refresh(cache: Record<string | symbol, any>, event?: Event): void;
13
+ _pointerEvent(event: PointerEvent): void;
14
+ dispose(): void;
15
+ }
@@ -0,0 +1,68 @@
1
+ import { getTextWidth } from '../../../helper/TextHelper.js';
2
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
3
+ import { NamedTools } from "../tools/NamedTools.js";
4
+ import { AbstractExtension } from './AbstractExtension.js';
5
+ const extensionWidth = 60;
6
+ export class ElementDragTitleExtension extends AbstractExtension {
7
+ _rect;
8
+ _text;
9
+ _width;
10
+ constructor(extensionManager, designerView, extendedItem) {
11
+ super(extensionManager, designerView, extendedItem);
12
+ }
13
+ extend(cache, event) {
14
+ const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas, cache);
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
+ if (this.extendedItem.id)
21
+ text = '#' + this.extendedItem.id;
22
+ this._width = Math.max(Math.min(elementWidth, w), extensionWidth);
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._drawHTML('<div style="position:relative"><span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transform-origin: 0 0;">' + text + '</span></div>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
25
+ this._text.style.overflow = 'visible';
26
+ this._rect2 = this._drawRect(transformedCornerPoints[0].x + 60, transformedCornerPoints[0].y - 16, 15, 15, 'svg-primary-selection-move', this._rect2);
27
+ this._path = this._drawPath('m4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z', 'svg-primary-selection-move', this._path);
28
+ //<svg viewBox="0 0 24 24"><path d=""></path></svg>
29
+ this._rect.addEventListener('pointerdown', (e) => this._pointerEvent(e));
30
+ this._rect.addEventListener('pointermove', (e) => this._pointerEvent(e));
31
+ this._rect.addEventListener('pointerup', (e) => this._pointerEvent(e));
32
+ this.refresh(cache, event);
33
+ }
34
+ }
35
+ _drawMoveOverlay(itemRect) {
36
+ }
37
+ refresh(cache, event) {
38
+ const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 0, y: 16 }, this.designerCanvas, cache);
39
+ const angle = Math.atan2((transformedCornerPoints[1].y - transformedCornerPoints[0].y), (transformedCornerPoints[1].x - transformedCornerPoints[0].x)) * 180 / Math.PI;
40
+ if (!isNaN(transformedCornerPoints[0].x)) {
41
+ if (this._valuesHaveChanges(transformedCornerPoints[0].x, transformedCornerPoints[0].y, angle)) {
42
+ const h = (15 / this.designerCanvas.scaleFactor);
43
+ const w = (this._width / this.designerCanvas.scaleFactor);
44
+ this._rect.setAttribute('x', '' + transformedCornerPoints[0].x);
45
+ this._rect.setAttribute('y', '' + transformedCornerPoints[0].y);
46
+ this._rect.style.rotate = angle + 'deg';
47
+ this._rect.style.transformBox = 'fill-box';
48
+ this._rect.setAttribute('height', '' + h);
49
+ this._rect.setAttribute('width', '' + w);
50
+ this._rect.style.strokeWidth = (1 / this.designerCanvas.scaleFactor).toString();
51
+ this._text.setAttribute('x', '' + transformedCornerPoints[0].x);
52
+ this._text.setAttribute('y', '' + transformedCornerPoints[0].y);
53
+ this._text.style.fontSize = (10 / this.designerCanvas.scaleFactor) + 'px';
54
+ this._text.setAttribute('height', '' + h);
55
+ this._text.setAttribute('width', '' + w);
56
+ this._text.children[0].children[0].style.rotate = angle + 'deg';
57
+ }
58
+ }
59
+ }
60
+ _pointerEvent(event) {
61
+ event.preventDefault();
62
+ event.stopPropagation();
63
+ this.designerCanvas.serviceContainer.designerTools.get(NamedTools.Pointer).pointerEventHandler(this.designerCanvas, event, this.extendedItem.element);
64
+ }
65
+ dispose() {
66
+ this._removeAllOverlays();
67
+ }
68
+ }
@@ -17,9 +17,11 @@ export class ElementDragTitleExtension extends AbstractExtension {
17
17
  let w = getTextWidth(this.extendedItem.name, '10px monospace');
18
18
  let elementWidth = Math.sqrt(Math.pow(transformedCornerPoints[1].x - transformedCornerPoints[0].x, 2) + Math.pow(transformedCornerPoints[1].y - transformedCornerPoints[0].y, 2));
19
19
  let text = this.extendedItem.name;
20
+ if (this.extendedItem.id)
21
+ text = '#' + this.extendedItem.id;
20
22
  this._width = Math.max(Math.min(elementWidth, w), extensionWidth);
21
23
  this._rect = this._drawRect(transformedCornerPoints[0].x, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-primary-selection-move', this._rect);
22
- this._text = this._drawHTML('<div style="position:relative"><span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transform-origin: 0 0;">' + text + '</span></div>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
24
+ this._text = this._drawHTML('<div style="position:relative"><span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transform-origin: 0 0; padding-left: 2px;">' + text + '</span></div>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
23
25
  this._text.style.overflow = 'visible';
24
26
  this._rect.addEventListener('pointerdown', (e) => this._pointerEvent(e));
25
27
  this._rect.addEventListener('pointermove', (e) => this._pointerEvent(e));
@@ -33,7 +35,7 @@ export class ElementDragTitleExtension extends AbstractExtension {
33
35
  const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: 0, y: 16 }, this.designerCanvas, cache);
34
36
  const angle = Math.atan2((transformedCornerPoints[1].y - transformedCornerPoints[0].y), (transformedCornerPoints[1].x - transformedCornerPoints[0].x)) * 180 / Math.PI;
35
37
  if (!isNaN(transformedCornerPoints[0].x)) {
36
- if (this._valuesHaveChanges(transformedCornerPoints[0].x, transformedCornerPoints[0].y, angle)) {
38
+ if (this._valuesHaveChanges(transformedCornerPoints[0].x, transformedCornerPoints[0].y, angle, this.designerCanvas.scaleFactor)) {
37
39
  const h = (15 / this.designerCanvas.scaleFactor);
38
40
  const w = (this._width / this.designerCanvas.scaleFactor);
39
41
  this._rect.setAttribute('x', '' + transformedCornerPoints[0].x);
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from './IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from './IDesignerExtension.js';
5
+ import { IExtensionManager } from './IExtensionManger.js';
6
+ export declare class ElementDragTitleExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ static readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,13 @@
1
+ import { ElementDragTitleExtension } from './ElementDragTitleExtension.js';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ export class ElementDragTitleExtensionProvider {
4
+ shouldExtend(extensionManager, designerView, designItem) {
5
+ return !designItem.isRootItem && !(designItem.element instanceof HTMLTemplateElement);
6
+ }
7
+ getExtension(extensionManager, designerView, designItem) {
8
+ return new ElementDragTitleExtension(extensionManager, designerView, designItem);
9
+ }
10
+ static style = css `
11
+ .svg-text-primary { stroke: none; color: white; font-family: monospace; }
12
+ `;
13
+ }
@@ -0,0 +1,12 @@
1
+ import { IDesignItem } from '../../../item/IDesignItem.js';
2
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
+ import { AbstractExtension } from './AbstractExtension.js';
4
+ import { IExtensionManager } from './IExtensionManger.js';
5
+ export declare class PreviousElementSelectExtension extends AbstractExtension {
6
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
7
+ private _rect;
8
+ private _g;
9
+ extend(cache: Record<string | symbol, any>, event?: Event): void;
10
+ refresh(cache: Record<string | symbol, any>, event?: Event): void;
11
+ dispose(): void;
12
+ }
@@ -0,0 +1,38 @@
1
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
2
+ import { AbstractExtension } from './AbstractExtension.js';
3
+ export class PreviousElementSelectExtension extends AbstractExtension {
4
+ constructor(extensionManager, designerView, extendedItem) {
5
+ super(extensionManager, designerView, extendedItem);
6
+ }
7
+ _rect;
8
+ _g;
9
+ extend(cache, event) {
10
+ this.refresh(cache, event);
11
+ }
12
+ refresh(cache, event) {
13
+ const transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas, cache);
14
+ if (!isNaN(transformedCornerPoints[1].x)) {
15
+ if (this._valuesHaveChanges(transformedCornerPoints[0].x, transformedCornerPoints[0].y, this.designerCanvas.scaleFactor)) {
16
+ const h = (16 / this.designerCanvas.scaleFactor);
17
+ this._rect = this._drawRect(transformedCornerPoints[1].x - (15 / this.designerCanvas.scaleFactor), transformedCornerPoints[1].y - (16.5 / this.designerCanvas.scaleFactor), h, h, 'svg-previous-select', this._rect);
18
+ if (!this._g) {
19
+ this._g = document.createElementNS("http://www.w3.org/2000/svg", "g");
20
+ this._g.setAttribute('class', 'svg-previous-select');
21
+ const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
22
+ path.setAttribute('d', 'm4 12 1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z');
23
+ this._g.appendChild(path);
24
+ this._addOverlay(this._g);
25
+ this._rect.onpointerdown = (e) => {
26
+ e.preventDefault();
27
+ e.stopPropagation();
28
+ this.extendedItem.instanceServiceContainer.selectionService.setSelectedElements([this.extendedItem.parent]);
29
+ };
30
+ }
31
+ this._g.setAttribute('transform', 'translate(' + (transformedCornerPoints[1].x - (14.5 / this.designerCanvas.scaleFactor)) + ',' + (transformedCornerPoints[1].y - (15.5 / this.designerCanvas.scaleFactor)) + ') scale(' + 0.6 / this.designerCanvas.scaleFactor + ')');
32
+ }
33
+ }
34
+ }
35
+ dispose() {
36
+ this._removeAllOverlays();
37
+ }
38
+ }
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from './IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from './IDesignerExtension.js';
5
+ import { IExtensionManager } from './IExtensionManger.js';
6
+ export declare class PreviousElementSelectExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ static readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,14 @@
1
+ import { PreviousElementSelectExtension } from './PreviousElementSelectExtension.js';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ export class PreviousElementSelectExtensionProvider {
4
+ shouldExtend(extensionManager, designerView, designItem) {
5
+ return !designItem.isRootItem && !(designItem.element instanceof HTMLTemplateElement);
6
+ }
7
+ getExtension(extensionManager, designerView, designItem) {
8
+ return new PreviousElementSelectExtension(extensionManager, designerView, designItem);
9
+ }
10
+ static style = css `
11
+ rect.svg-previous-select { stroke: none; fill: #3899ec; pointer-events: auto; }
12
+ g.svg-previous-select { stroke: none; fill: white; }
13
+ `;
14
+ }
package/dist/index.d.ts CHANGED
@@ -242,6 +242,8 @@ export * from "./elements/widgets/designerView/extensions/TransformOriginExtensi
242
242
  export * from "./elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js";
243
243
  export * from "./elements/widgets/designerView/extensions/PlacementExtension.js";
244
244
  export * from "./elements/widgets/designerView/extensions/PlacementExtensionProvider.js";
245
+ export * from "./elements/widgets/designerView/extensions/PreviousElementSelectExtension.js";
246
+ export * from "./elements/widgets/designerView/extensions/PreviousElementSelectExtensionProvider.js";
245
247
  export * from "./elements/widgets/designerView/extensions/block/BlockToolbarExtension.js";
246
248
  export * from "./elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js";
247
249
  export * from "./elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js";
package/dist/index.js CHANGED
@@ -183,6 +183,8 @@ export * from "./elements/widgets/designerView/extensions/TransformOriginExtensi
183
183
  export * from "./elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js";
184
184
  export * from "./elements/widgets/designerView/extensions/PlacementExtension.js";
185
185
  export * from "./elements/widgets/designerView/extensions/PlacementExtensionProvider.js";
186
+ export * from "./elements/widgets/designerView/extensions/PreviousElementSelectExtension.js";
187
+ export * from "./elements/widgets/designerView/extensions/PreviousElementSelectExtensionProvider.js";
186
188
  export * from "./elements/widgets/designerView/extensions/block/BlockToolbarExtension.js";
187
189
  export * from "./elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js";
188
190
  export * from "./elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A WYSIWYG designer webcomponent for html components",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.1.153",
4
+ "version": "0.1.155",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",