@node-projects/web-component-designer 0.1.129 → 0.1.131

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.
@@ -20,4 +20,6 @@ export declare function calculateGridInformation(designItem: IDesignItem): {
20
20
  row?: number;
21
21
  type: 'h' | 'v';
22
22
  }[];
23
+ xGap: number;
24
+ yGap: number;
23
25
  };
@@ -91,7 +91,7 @@ export function calculateGridInformation(designItem) {
91
91
  yGap += gp;
92
92
  yOffset += gp;
93
93
  }
94
- const retVal = { cells: [], gaps: [] };
94
+ const retVal = { cells: [], gaps: [], xGap, yGap };
95
95
  for (let rowIdx = 0; rowIdx < rows.length; rowIdx++) {
96
96
  const r = rows[rowIdx];
97
97
  let areas = null;
@@ -2,7 +2,6 @@ import type { IPoint } from '../../../interfaces/IPoint.js';
2
2
  import type { IPlacementService } from './IPlacementService.js';
3
3
  import type { IDesignItem } from '../../item/IDesignItem.js';
4
4
  import { IPlacementView } from '../../widgets/designerView/IPlacementView.js';
5
- import { IDesignerCanvas } from '../../widgets/designerView/IDesignerCanvas.js';
6
5
  export declare class DefaultPlacementService implements IPlacementService {
7
6
  serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration, item?: IDesignItem): boolean;
8
7
  isEnterableContainer(container: IDesignItem): boolean;
@@ -11,8 +10,8 @@ export declare class DefaultPlacementService implements IPlacementService {
11
10
  getElementOffset(container: IDesignItem, designItem?: IDesignItem): IPoint;
12
11
  private calculateTrack;
13
12
  placePoint(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): IPoint;
14
- startPlace(event: MouseEvent, designerCanvas: IDesignerCanvas, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
15
- place(event: MouseEvent, designerCanvas: IDesignerCanvas, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
13
+ startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
14
+ place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
16
15
  moveElements(designItems: IDesignItem[], position: IPoint, absolute: boolean): void;
17
16
  enterContainer(container: IDesignItem, items: IDesignItem[], mode: 'normal' | 'drop'): void;
18
17
  leaveContainer(container: IDesignItem, items: IDesignItem[]): void;
@@ -6,4 +6,5 @@ export interface IDesignerExtensionProvider {
6
6
  shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
7
7
  getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
8
8
  style?: CSSStyleSheet | CSSStyleSheet[];
9
+ svgDefs?: string;
9
10
  }
@@ -11,4 +11,5 @@ export declare class DisplayGridExtensionProvider implements IDesignerExtensionP
11
11
  shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
12
12
  getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
13
13
  readonly style: CSSStyleSheet;
14
+ readonly svgDefs = "\n <pattern id=\"pattern-stripe\" \n width=\"4\" height=\"4\" \n patternUnits=\"userSpaceOnUse\"\n patternTransform=\"rotate(45)\">\n <rect width=\"1\" height=\"4\" transform=\"translate(0,0)\" fill=\"white\"></rect>\n </pattern>\n <mask id=\"mask-stripe\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"url(#pattern-stripe)\" />\n </mask>";
14
15
  }
@@ -21,8 +21,18 @@ export class DisplayGridExtensionProvider {
21
21
  .svg-grid { stroke: var(--svg-grid-stroke-color); stroke-dasharray: 5; fill: var(--svg-grid-fill-color); }
22
22
  .svg-grid-current-cell { stroke: var(--svg-grid-stroke-color); stroke-dasharray: 5; fill: #e3ff4722; }
23
23
  .svg-grid-area { font-size: 8px; }
24
- .svg-grid-gap { stroke: var(--svg-grid-stroke-color); stroke-dasharray: 5; fill: #0000ff22; }
24
+ .svg-grid-gap { stroke: transparent; fill: var(--svg-grid-stroke-color); opacity: 0.3; mask: url(#mask-stripe) }
25
25
  .svg-grid-header { fill: var(--svg-grid-fill-color); stroke: var(--svg-grid-stroke-color); }
26
26
  .svg-grid-plus-sign { stroke: black; }
27
27
  `;
28
+ svgDefs = `
29
+ <pattern id="pattern-stripe"
30
+ width="4" height="4"
31
+ patternUnits="userSpaceOnUse"
32
+ patternTransform="rotate(45)">
33
+ <rect width="1" height="4" transform="translate(0,0)" fill="white"></rect>
34
+ </pattern>
35
+ <mask id="mask-stripe">
36
+ <rect x="0" y="0" width="100%" height="100%" fill="url(#pattern-stripe)" />
37
+ </mask>`;
28
38
  }
@@ -1,5 +1,6 @@
1
1
  import { EventNames } from "../../../../../enums/EventNames.js";
2
2
  import { getContentBoxContentOffsets } from "../../../../helper/ElementHelper.js";
3
+ import { calculateGridInformation } from "../../../../helper/GridHelper.js";
3
4
  import { roundValue } from "../../../../helper/LayoutHelper.js";
4
5
  import { getDesignerCanvasNormalizedTransformedCornerDOMPoints, getElementCombinedTransform, transformPointByInverseMatrix, normalizeToAbsolutePosition } from "../../../../helper/TransformHelper.js";
5
6
  import { AbstractExtension } from "../AbstractExtension.js";
@@ -45,7 +46,7 @@ export class GridChildResizeExtension extends AbstractExtension {
45
46
  //#endregion Circles
46
47
  }
47
48
  _drawResizerOverlay(x, y, cursor, oldCircle) {
48
- let circle = this._drawCircle(x, y, 3 / this.designerCanvas.zoomFactor, 'svg-primary-resizer', oldCircle);
49
+ let circle = this._drawCircle(x, y, 3 / this.designerCanvas.zoomFactor, 'svg-grid-resizer', oldCircle);
49
50
  circle.style.strokeWidth = (1 / this.designerCanvas.zoomFactor).toString();
50
51
  if (!oldCircle) {
51
52
  circle.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeResize(circle, event, cursor));
@@ -84,8 +85,6 @@ export class GridChildResizeExtension extends AbstractExtension {
84
85
  const transformOrigin = new DOMPoint(toArr[0], toArr[1]);
85
86
  this._initialComputedTransformOrigins.push(transformOrigin);
86
87
  this._initialTransformOrigins.push(this.extendedItem.element.style.transformOrigin);
87
- if (this.designerCanvas.alignOnSnap)
88
- this.designerCanvas.snapLines.calculateSnaplines(this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
89
88
  this.prepareResize(this.extendedItem, this._actionModeStarted);
90
89
  break;
91
90
  case EventNames.PointerMove:
@@ -103,50 +102,61 @@ export class GridChildResizeExtension extends AbstractExtension {
103
102
  deltaX = deltaX < deltaY ? deltaX : deltaY;
104
103
  deltaY = deltaX;
105
104
  }
106
- let i = 0;
107
- let width = null;
108
- let height = null;
109
- switch (this._actionModeStarted) {
110
- case 'e-resize':
111
- width = (this._initialSizes[i].width + deltaX);
112
- this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
113
- break;
114
- case 'se-resize':
115
- width = (this._initialSizes[i].width + deltaX);
116
- this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
117
- height = (this._initialSizes[i].height + deltaY);
118
- this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
119
- break;
120
- case 's-resize':
121
- height = (this._initialSizes[i].height + deltaY);
122
- this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
123
- break;
124
- case 'sw-resize':
125
- width = (this._initialSizes[i].width - deltaX);
126
- this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
127
- height = (this._initialSizes[i].height + deltaY);
128
- this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
129
- break;
130
- case 'w-resize':
131
- width = (this._initialSizes[i].width - deltaX);
132
- this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
133
- break;
134
- case 'nw-resize':
135
- width = (this._initialSizes[i].width - deltaX);
136
- this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
137
- height = (this._initialSizes[i].height - deltaY);
138
- this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
139
- break;
140
- case 'n-resize':
141
- height = (this._initialSizes[i].height - deltaY);
142
- this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
143
- break;
144
- case 'ne-resize':
145
- width = (this._initialSizes[i].width + deltaX);
146
- this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
147
- height = (this._initialSizes[i].height - deltaY);
148
- this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
149
- break;
105
+ let posX = 0;
106
+ let posY = 0;
107
+ let cellX = 0;
108
+ let cellY = 0;
109
+ const gridInformation = calculateGridInformation(this.extendedItem.parent);
110
+ const gridPos = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.parent.element);
111
+ const evPos = this.designerCanvas.getNormalizedEventCoordinates(event);
112
+ const cs = getComputedStyle(this.extendedItem.element);
113
+ this.extendedItem.element.style.gridColumnStart = cs.gridColumnStart;
114
+ this.extendedItem.element.style.gridColumnEnd = cs.gridColumnEnd === 'auto' ? '' + (parseInt(cs.gridColumnStart) + 1) : cs.gridColumnEnd;
115
+ this.extendedItem.element.style.gridRowStart = cs.gridRowStart;
116
+ this.extendedItem.element.style.gridRowEnd = cs.gridRowEnd === 'auto' ? '' + (parseInt(cs.gridRowStart) + 1) : cs.gridRowEnd;
117
+ if (this._actionModeStarted == 'nw-resize' || this._actionModeStarted == 'w-resize' || this._actionModeStarted == 'sw-resize') {
118
+ for (let i = 0; i < gridInformation.cells.length; i++) {
119
+ const cell = gridInformation.cells[i][0];
120
+ const cellMiddlePos = posX + (cell.width / 2);
121
+ if (evPos.x > gridPos.x + cellMiddlePos) {
122
+ cellX = i;
123
+ }
124
+ posX += cell.width + gridInformation.xGap;
125
+ }
126
+ this.extendedItem.element.style.gridColumnStart = '' + (cellX + 2);
127
+ }
128
+ if (this._actionModeStarted == 'nw-resize' || this._actionModeStarted == 'n-resize' || this._actionModeStarted == 'ne-resize') {
129
+ for (let i = 0; i < gridInformation.cells.length; i++) {
130
+ const cell = gridInformation.cells[i][0];
131
+ const cellMiddlePos = posY + (cell.height / 2);
132
+ if (evPos.y > gridPos.y + cellMiddlePos) {
133
+ cellY = i;
134
+ }
135
+ posY += cell.height + gridInformation.yGap;
136
+ }
137
+ this.extendedItem.element.style.gridRowStart = '' + (cellY + 2);
138
+ }
139
+ if (this._actionModeStarted == 'se-resize' || this._actionModeStarted == 'e-resize' || this._actionModeStarted == 'ne-resize') {
140
+ for (let i = 0; i < gridInformation.cells.length; i++) {
141
+ const cell = gridInformation.cells[i][0];
142
+ const cellMiddlePos = posX + (cell.width / 2);
143
+ if (evPos.x > gridPos.x + cellMiddlePos) {
144
+ cellX = i;
145
+ }
146
+ posX += cell.width + gridInformation.xGap;
147
+ }
148
+ this.extendedItem.element.style.gridColumnEnd = '' + (cellX + 2);
149
+ }
150
+ if (this._actionModeStarted == 'sw-resize' || this._actionModeStarted == 's-resize' || this._actionModeStarted == 'se-resize') {
151
+ for (let i = 0; i < gridInformation.cells[0].length; i++) {
152
+ const cell = gridInformation.cells[0][i];
153
+ const cellMiddlePos = posY + (cell.height / 2);
154
+ if (evPos.y > gridPos.y + cellMiddlePos) {
155
+ cellY = i;
156
+ }
157
+ posY += cell.height + gridInformation.yGap;
158
+ }
159
+ this.extendedItem.element.style.gridRowEnd = '' + (cellY + 2);
150
160
  }
151
161
  const resizedElements = [this.extendedItem, this.extendedItem.parent];
152
162
  this.extensionManager.refreshExtensions(resizedElements);
@@ -11,6 +11,6 @@ export class GridChildResizeExtensionProvider {
11
11
  return new GridChildResizeExtension(extensionManager, designerView, designItem);
12
12
  }
13
13
  style = css `
14
- .svg-primary-resizer { stroke: #3899ec; fill: white; pointer-events: all }
14
+ .svg-grid-resizer { stroke: #3899ec; fill: white; pointer-events: all }
15
15
  `;
16
16
  }
@@ -3,4 +3,5 @@ import { IDesignerPointerExtension } from "./IDesignerPointerExtension.js";
3
3
  export interface IDesignerPointerExtensionProvider {
4
4
  getExtension(designerView: IDesignerCanvas): IDesignerPointerExtension;
5
5
  style?: CSSStyleSheet;
6
+ svgDefs?: string;
6
7
  }
@@ -59,20 +59,45 @@ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
59
59
  this._initialize();
60
60
  }
61
61
  _initialize() {
62
- let styles = [OverlayLayerView.style];
62
+ const styles = [OverlayLayerView.style];
63
+ const alreadyApplied = new Set();
63
64
  for (const extList of this._serviceContainer.designerExtensions) {
64
65
  for (const ext of extList[1]) {
65
66
  if (ext.style) {
66
- if (Array.isArray(ext.style))
67
- styles.push(...ext.style);
68
- else
69
- styles.push(ext.style);
67
+ if (!alreadyApplied.has(ext.style)) {
68
+ alreadyApplied.add(ext.style);
69
+ if (Array.isArray(ext.style))
70
+ styles.push(...ext.style);
71
+ else
72
+ styles.push(ext.style);
73
+ }
74
+ }
75
+ if (ext.svgDefs) {
76
+ if (!alreadyApplied.has(ext.svgDefs)) {
77
+ alreadyApplied.add(ext.svgDefs);
78
+ const a = document.createElementNS("http://www.w3.org/2000/svg", "defs");
79
+ a.innerHTML = ext.svgDefs;
80
+ for (let n of [...a.children])
81
+ this._defs.appendChild(n);
82
+ }
70
83
  }
71
84
  }
72
85
  }
73
86
  for (const ext of this._serviceContainer.designerPointerExtensions) {
74
87
  if (ext.style) {
75
- styles.push(ext.style);
88
+ if (!alreadyApplied.has(ext.style)) {
89
+ alreadyApplied.add(ext.style);
90
+ styles.push(ext.style);
91
+ }
92
+ }
93
+ if (ext.svgDefs) {
94
+ if (!alreadyApplied.has(ext.svgDefs)) {
95
+ alreadyApplied.add(ext.svgDefs);
96
+ const a = document.createElementNS("http://www.w3.org/2000/svg", "defs");
97
+ a.innerHTML = ext.svgDefs;
98
+ for (let n of [...a.children])
99
+ this._defs.appendChild(n);
100
+ }
76
101
  }
77
102
  }
78
103
  this.shadowRoot.adoptedStyleSheets = styles;
package/dist/index.d.ts CHANGED
@@ -88,7 +88,7 @@ export type { IMultiplayerService } from "./elements/services/multiplayerService
88
88
  export * from "./elements/services/multiplayerService/MultiplayerService.js";
89
89
  export * from "./elements/services/propertiesService/DefaultEditorTypesService.js";
90
90
  export type { IEditorTypesService } from "./elements/services/propertiesService/IEditorTypesService.js";
91
- export type { IPropertiesService } from "./elements/services/propertiesService/IPropertiesService.js";
91
+ export type { IPropertiesService, RefreshMode } from "./elements/services/propertiesService/IPropertiesService.js";
92
92
  export type { IProperty } from "./elements/services/propertiesService/IProperty.js";
93
93
  export type { IPropertyEditor } from "./elements/services/propertiesService/IPropertyEditor.js";
94
94
  export type { IPropertyGroup } from "./elements/services/propertiesService/IPropertyGroup.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.129",
4
+ "version": "0.1.131",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",