@node-projects/web-component-designer 0.1.96 → 0.1.97

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.
@@ -6,3 +6,4 @@ import { IDesignItem } from "../item/IDesignItem.js";
6
6
  export declare function filterChildPlaceItems(items: IDesignItem[]): IDesignItem[];
7
7
  export declare function getDesignItemCurrentPos(designItem: IDesignItem, mode: 'position' | 'transform' | 'margin' | 'padding'): IPoint;
8
8
  export declare function placeDesignItem(container: IDesignItem, designItem: IDesignItem, offset: IPoint, mode: 'position' | 'transform' | 'margin' | 'padding'): void;
9
+ export declare function roundValue(designItem: IDesignItem, value: number): string | number;
@@ -71,15 +71,21 @@ export function placeDesignItem(container, designItem, offset, mode) {
71
71
  if (!hasPositionedLayout)
72
72
  designItem.setStyle('position', 'absolute');
73
73
  if (oldLeft || oldRight == null)
74
- designItem.setStyle('left', (offset.x + (oldLeft ?? 0) + containerLeft) + "px");
74
+ designItem.setStyle('left', roundValue(designItem, offset.x + (oldLeft ?? 0) + containerLeft) + "px");
75
75
  if (oldTop || oldBottom == null)
76
- designItem.setStyle('top', (offset.y + (oldTop ?? 0) + containerTop) + "px");
76
+ designItem.setStyle('top', roundValue(designItem, offset.y + (oldTop ?? 0) + containerTop) + "px");
77
77
  if (oldRight)
78
- designItem.setStyle('right', ((oldRight ?? 0) - offset.x + containerRight) + "px");
78
+ designItem.setStyle('right', roundValue(designItem, (oldRight ?? 0) - offset.x + containerRight) + "px");
79
79
  if (oldBottom)
80
- designItem.setStyle('bottom', ((oldBottom ?? 0) - offset.y + containerBottom) + "px");
80
+ designItem.setStyle('bottom', roundValue(designItem, (oldBottom ?? 0) - offset.y + containerBottom) + "px");
81
81
  }
82
82
  }
83
+ export function roundValue(designItem, value) {
84
+ if (designItem.serviceContainer.options.roundPixelsToDecimalPlaces >= 0) {
85
+ return value.toFixed(designItem.serviceContainer.options.roundPixelsToDecimalPlaces);
86
+ }
87
+ return value;
88
+ }
83
89
  /*function placeViaPosition(container: IDesignItem, designItem: IDesignItem, offset: IPoint, mode: 'position' | 'transform' | 'margin' | 'padding') {
84
90
 
85
91
  }*/
@@ -85,6 +85,7 @@ import { DragDropService } from './dragDropService/DragDropService.js';
85
85
  import { EventsService } from './eventsService/EventsService.js';
86
86
  import { SimpleDemoProviderService } from './demoProviderService/SimpleDemoProviderService.js';
87
87
  import { DrawElementTool } from '../widgets/designerView/tools/DrawElementTool.js';
88
+ import { RoundPixelsDesignViewConfigButton } from '../widgets/designerView/extensions/buttons/RoundPixelsDesignViewConfigButton.js';
88
89
  export function createDefaultServiceContainer() {
89
90
  let serviceContainer = new ServiceContainer();
90
91
  let defaultPlacementService = new DefaultPlacementService();
@@ -180,7 +181,7 @@ export function createDefaultServiceContainer() {
180
181
  serviceContainer.designerPointerExtensions.push(
181
182
  //new CursorLinePointerExtensionProvider()
182
183
  );
183
- serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new StylesheetServiceDesignViewConfigButtons());
184
+ serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new StylesheetServiceDesignViewConfigButtons(), new ButtonSeperatorProvider(30), new RoundPixelsDesignViewConfigButton());
184
185
  serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(22), new TextToolButtonProvider(), new SeperatorToolProvider(22), new TransformToolButtonProvider());
185
186
  serviceContainer.designerContextMenuExtensions = [
186
187
  new CopyPasteContextMenu(),
@@ -93,6 +93,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
93
93
  readonly globalContext: GlobalContext;
94
94
  readonly options: {
95
95
  zoomDesignerBackground: boolean;
96
+ roundPixelsToDecimalPlaces: number;
96
97
  };
97
98
  readonly designerTools: Map<string | NamedTools, ITool | (new (IElementDefinition: any) => ITool)>;
98
99
  get bindingService(): IBindingService;
@@ -22,7 +22,8 @@ export class ServiceContainer extends BaseServiceContainer {
22
22
  designerContextMenuExtensions;
23
23
  globalContext = new GlobalContext(this);
24
24
  options = {
25
- zoomDesignerBackground: true
25
+ zoomDesignerBackground: true,
26
+ roundPixelsToDecimalPlaces: -1
26
27
  };
27
28
  designerTools = new Map();
28
29
  get bindingService() {
@@ -1,5 +1,6 @@
1
1
  import { EventNames } from '../../../../enums/EventNames.js';
2
2
  import { getContentBoxContentOffsets } from '../../../helper/ElementHelper.js';
3
+ import { roundValue } from '../../../helper/LayoutHelper.js';
3
4
  import { transformPointByInverseMatrix, getDesignerCanvasNormalizedTransformedCornerDOMPoints, normalizeToAbsolutePosition, getElementCombinedTransform } from "../../../helper/TransformHelper.js";
4
5
  import { AbstractExtension } from './AbstractExtension.js';
5
6
  //TODO: use PlacementService, size is not always width/height could also be margin etc...
@@ -124,108 +125,108 @@ export class ResizeExtension extends AbstractExtension {
124
125
  switch (this._actionModeStarted) {
125
126
  case 'e-resize':
126
127
  width = (this._initialSizes[i].width + deltaX);
127
- this.extendedItem.element.style.width = width + 'px';
128
+ this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
128
129
  if (this.resizeAllSelected) {
129
130
  i++;
130
131
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
131
132
  if (designItem !== this.extendedItem) {
132
- designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
133
+ designItem.element.style.width = roundValue(this.extendedItem, this._initialSizes[i].width + deltaX) + 'px';
133
134
  }
134
135
  }
135
136
  }
136
137
  break;
137
138
  case 'se-resize':
138
139
  width = (this._initialSizes[i].width + deltaX);
139
- this.extendedItem.element.style.width = width + 'px';
140
+ this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
140
141
  height = (this._initialSizes[i].height + deltaY);
141
- this.extendedItem.element.style.height = height + 'px';
142
+ this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
142
143
  if (this.resizeAllSelected) {
143
144
  i++;
144
145
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
145
146
  if (designItem !== this.extendedItem) {
146
- designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
147
- designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
147
+ designItem.element.style.width = roundValue(this.extendedItem, this._initialSizes[i].width + deltaX) + 'px';
148
+ designItem.element.style.height = roundValue(this.extendedItem, this._initialSizes[i].height + deltaY) + 'px';
148
149
  }
149
150
  }
150
151
  }
151
152
  break;
152
153
  case 's-resize':
153
154
  height = (this._initialSizes[i].height + deltaY);
154
- this.extendedItem.element.style.height = height + 'px';
155
+ this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
155
156
  if (this.resizeAllSelected) {
156
157
  i++;
157
158
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
158
159
  if (designItem !== this.extendedItem) {
159
- designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
160
+ designItem.element.style.height = roundValue(this.extendedItem, this._initialSizes[i].height + deltaY) + 'px';
160
161
  }
161
162
  }
162
163
  }
163
164
  break;
164
165
  case 'sw-resize':
165
166
  width = (this._initialSizes[i].width - deltaX);
166
- this.extendedItem.element.style.width = width + 'px';
167
+ this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
167
168
  height = (this._initialSizes[i].height + deltaY);
168
- this.extendedItem.element.style.height = height + 'px';
169
+ this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
169
170
  if (this.resizeAllSelected) {
170
171
  i++;
171
172
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
172
173
  if (designItem !== this.extendedItem) {
173
- designItem.element.style.width = this._initialSizes[i].width - deltaX + 'px';
174
- designItem.element.style.height = this._initialSizes[i].height + deltaY + 'px';
174
+ designItem.element.style.width = roundValue(this.extendedItem, this._initialSizes[i].width - deltaX) + 'px';
175
+ designItem.element.style.height = roundValue(this.extendedItem, this._initialSizes[i].height + deltaY) + 'px';
175
176
  }
176
177
  }
177
178
  }
178
179
  break;
179
180
  case 'w-resize':
180
181
  width = (this._initialSizes[i].width - deltaX);
181
- this.extendedItem.element.style.width = width + 'px';
182
+ this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
182
183
  if (this.resizeAllSelected) {
183
184
  i++;
184
185
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
185
186
  if (designItem !== this.extendedItem) {
186
- designItem.element.style.width = this._initialSizes[i].width - deltaX + 'px';
187
+ designItem.element.style.width = roundValue(this.extendedItem, this._initialSizes[i].width - deltaX) + 'px';
187
188
  }
188
189
  }
189
190
  }
190
191
  break;
191
192
  case 'nw-resize':
192
193
  width = (this._initialSizes[i].width - deltaX);
193
- this.extendedItem.element.style.width = width + 'px';
194
+ this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
194
195
  height = (this._initialSizes[i].height - deltaY);
195
- this.extendedItem.element.style.height = height + 'px';
196
+ this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
196
197
  if (this.resizeAllSelected) {
197
198
  i++;
198
199
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
199
200
  if (designItem !== this.extendedItem) {
200
- designItem.element.style.width = this._initialSizes[i].width - deltaX + 'px';
201
- designItem.element.style.height = this._initialSizes[i].height - deltaY + 'px';
201
+ designItem.element.style.width = roundValue(this.extendedItem, this._initialSizes[i].width - deltaX) + 'px';
202
+ designItem.element.style.height = roundValue(this.extendedItem, this._initialSizes[i].height - deltaY) + 'px';
202
203
  }
203
204
  }
204
205
  }
205
206
  break;
206
207
  case 'n-resize':
207
208
  height = (this._initialSizes[i].height - deltaY);
208
- this.extendedItem.element.style.height = height + 'px';
209
+ this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
209
210
  if (this.resizeAllSelected) {
210
211
  i++;
211
212
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
212
213
  if (designItem !== this.extendedItem) {
213
- designItem.element.style.height = this._initialSizes[i].height - deltaY + 'px';
214
+ designItem.element.style.height = roundValue(this.extendedItem, this._initialSizes[i].height - deltaY) + 'px';
214
215
  }
215
216
  }
216
217
  }
217
218
  break;
218
219
  case 'ne-resize':
219
220
  width = (this._initialSizes[i].width + deltaX);
220
- this.extendedItem.element.style.width = width + 'px';
221
+ this.extendedItem.element.style.width = roundValue(this.extendedItem, width) + 'px';
221
222
  height = (this._initialSizes[i].height - deltaY);
222
- this.extendedItem.element.style.height = height + 'px';
223
+ this.extendedItem.element.style.height = roundValue(this.extendedItem, height) + 'px';
223
224
  if (this.resizeAllSelected) {
224
225
  i++;
225
226
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
226
227
  if (designItem !== this.extendedItem) {
227
- designItem.element.style.width = this._initialSizes[i].width + deltaX + 'px';
228
- designItem.element.style.height = this._initialSizes[i].height - deltaY + 'px';
228
+ designItem.element.style.width = roundValue(this.extendedItem, this._initialSizes[i].width + deltaX) + 'px';
229
+ designItem.element.style.height = roundValue(this.extendedItem, this._initialSizes[i].height - deltaY) + 'px';
229
230
  }
230
231
  }
231
232
  }
@@ -242,8 +243,8 @@ export class ResizeExtension extends AbstractExtension {
242
243
  let cg = this.extendedItem.openGroup((this.resizeAllSelected && this.designerCanvas.instanceServiceContainer.selectionService.selectedElements.length > 1) ? "Resize Elements" : "Resize &lt;" + this.extendedItem.name + "&gt;");
243
244
  this.extendedItem.setStyle('width', this.extendedItem.element.style.width);
244
245
  this.extendedItem.setStyle('height', this.extendedItem.element.style.height);
245
- this.extendedItem.setStyle('left', normalizeToAbsolutePosition(this.extendedItem.element, 'left'));
246
- this.extendedItem.setStyle('top', normalizeToAbsolutePosition(this.extendedItem.element, 'top'));
246
+ this.extendedItem.setStyle('left', roundValue(this.extendedItem, parseFloat(normalizeToAbsolutePosition(this.extendedItem.element, 'left'))) + 'px');
247
+ this.extendedItem.setStyle('top', roundValue(this.extendedItem, parseFloat(normalizeToAbsolutePosition(this.extendedItem.element, 'top'))) + 'px');
247
248
  let p3Abs = new DOMPoint(this.extendedItem.element.offsetLeft + parseFloat(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[0].replace('px', '')), this.extendedItem.element.offsetTop + parseFloat(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[1].replace('px', '')));
248
249
  this.extendedItem.element.style.transformOrigin = this._initialTransformOrigins[0];
249
250
  let p1Abs = new DOMPoint(this.extendedItem.element.offsetLeft + parseFloat(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[0].replace('px', '')), this.extendedItem.element.offsetTop + parseFloat(getComputedStyle(this.extendedItem.element).transformOrigin.split(' ')[1].replace('px', '')));
@@ -268,8 +269,8 @@ export class ResizeExtension extends AbstractExtension {
268
269
  if (designItem !== this.extendedItem) {
269
270
  designItem.setStyle('width', designItem.element.style.width);
270
271
  designItem.setStyle('height', designItem.element.style.height);
271
- designItem.setStyle('left', normalizeToAbsolutePosition(designItem.element, 'left'));
272
- designItem.setStyle('top', normalizeToAbsolutePosition(designItem.element, 'top'));
272
+ designItem.setStyle('left', roundValue(this.extendedItem, parseFloat(normalizeToAbsolutePosition(designItem.element, 'left'))) + 'px');
273
+ designItem.setStyle('top', roundValue(this.extendedItem, parseFloat(normalizeToAbsolutePosition(designItem.element, 'top'))) + 'px');
273
274
  }
274
275
  }
275
276
  }
@@ -0,0 +1,7 @@
1
+ import { DesignerView } from "../../designerView.js";
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
4
+ export declare class RoundPixelsDesignViewConfigButton implements IDesignViewConfigButtonsProvider {
5
+ constructor();
6
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
7
+ }
@@ -0,0 +1,16 @@
1
+ export class RoundPixelsDesignViewConfigButton {
2
+ constructor() { }
3
+ provideButtons(designerView, designerCanvas) {
4
+ const btn = document.createElement('div');
5
+ btn.className = 'toolbar-control';
6
+ btn.title = 'round pixels to';
7
+ const ip = document.createElement('input');
8
+ ip.type = 'number';
9
+ ip.step = '1';
10
+ ip.min = '-1';
11
+ ip.valueAsNumber = designerView.serviceContainer.options.roundPixelsToDecimalPlaces;
12
+ ip.onchange = () => designerView.serviceContainer.options.roundPixelsToDecimalPlaces = ip.valueAsNumber;
13
+ btn.appendChild(ip);
14
+ return [btn];
15
+ }
16
+ }
@@ -0,0 +1,5 @@
1
+ import { AbstractDesignViewConfigButton } from "./AbstractDesignViewConfigButton.js";
2
+ export declare const enableStylesheetService = "enableStylesheetService";
3
+ export declare class StylesheetServiceDesignViewConfigButtons extends AbstractDesignViewConfigButton {
4
+ constructor();
5
+ }
@@ -0,0 +1,7 @@
1
+ import { AbstractDesignViewConfigButton } from "./AbstractDesignViewConfigButton.js";
2
+ export const enableStylesheetService = 'enableStylesheetService';
3
+ export class StylesheetServiceDesignViewConfigButtons extends AbstractDesignViewConfigButton {
4
+ constructor() {
5
+ super(enableStylesheetService, "ss", "modify Stylesheet");
6
+ }
7
+ }
@@ -1,4 +1,5 @@
1
1
  import { EventNames } from '../../../../enums/EventNames.js';
2
+ import { roundValue } from '../../../helper/LayoutHelper.js';
2
3
  import { OverlayLayer } from '../extensions/OverlayLayer.js';
3
4
  export class DrawElementTool {
4
5
  _elementDefinition;
@@ -38,8 +39,8 @@ export class DrawElementTool {
38
39
  this._changeGroup = designerCanvas.rootDesignItem.openGroup("Insert Item");
39
40
  this._createdItem = await designerCanvas.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(this._elementDefinition, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer));
40
41
  this._createdItem.setStyle('position', 'absolute');
41
- this._createdItem.setStyle('left', evPos.x + 'px');
42
- this._createdItem.setStyle('top', evPos.y + 'px');
42
+ this._createdItem.setStyle('left', roundValue(this._createdItem, evPos.x) + 'px');
43
+ this._createdItem.setStyle('top', roundValue(this._createdItem, evPos.y) + 'px');
43
44
  this._createdItem.setStyle('width', '0');
44
45
  this._createdItem.setStyle('height', '0');
45
46
  this._createdItem.element.style.overflow = 'hidden';
@@ -54,20 +55,20 @@ export class DrawElementTool {
54
55
  this._rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
55
56
  designerCanvas.overlayLayer.addOverlay(this.constructor.name, this._rect, OverlayLayer.Foreground);
56
57
  this._rect.setAttribute('class', 'svg-draw-new-element');
57
- this._rect.setAttribute('x', (this._startPosition.x));
58
- this._rect.setAttribute('y', (this._startPosition.y));
58
+ this._rect.setAttribute('x', roundValue(this._createdItem, this._startPosition.x));
59
+ this._rect.setAttribute('y', roundValue(this._createdItem, this._startPosition.y));
59
60
  }
60
- const w = evPos.x - this._startPosition.x;
61
- const h = evPos.y - this._startPosition.y;
62
- if (w >= 0) {
61
+ const w = roundValue(this._createdItem, evPos.x - this._startPosition.x);
62
+ const h = roundValue(this._createdItem, evPos.y - this._startPosition.y);
63
+ if (parseFloat('' + w) >= 0) {
63
64
  this._rect.setAttribute('width', w);
64
65
  this._createdItem.setStyle('width', w + 'px');
65
66
  }
66
- if (h >= 0) {
67
+ if (parseFloat('' + h) >= 0) {
67
68
  this._rect.setAttribute('height', h);
68
69
  this._createdItem.setStyle('height', h + 'px');
69
70
  }
70
- if (w > 5 || h > 5)
71
+ if (parseFloat('' + w) > 5 || parseFloat('' + h) > 5)
71
72
  this.sizeOverlapThreshold = true;
72
73
  }
73
74
  }
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.96",
4
+ "version": "0.1.97",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",