@node-projects/web-component-designer 0.0.238 → 0.0.239

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 (47) hide show
  1. package/assets/images/layout/TransformTool.svg +21 -0
  2. package/dist/elements/helper/ElementHelper.d.ts +4 -0
  3. package/dist/elements/helper/ElementHelper.js +29 -0
  4. package/dist/elements/services/DefaultServiceBootstrap.js +7 -2
  5. package/dist/elements/services/ServiceContainer.d.ts +6 -3
  6. package/dist/elements/services/ServiceContainer.js +5 -2
  7. package/dist/elements/services/dragDropService/DragDropService.d.ts +8 -2
  8. package/dist/elements/services/dragDropService/DragDropService.js +79 -21
  9. package/dist/elements/services/dragDropService/ExternalDragDropService copy.d.ts +6 -0
  10. package/dist/elements/services/dragDropService/ExternalDragDropService copy.js +28 -0
  11. package/dist/elements/services/dragDropService/ExternalDragDropService.d.ts +6 -0
  12. package/dist/elements/services/dragDropService/ExternalDragDropService.js +28 -0
  13. package/dist/elements/services/dragDropService/IDragDropService.d.ts +6 -1
  14. package/dist/elements/services/dragDropService/IExternalDragDropService copy.d.ts +5 -0
  15. package/dist/elements/services/dragDropService/IExternalDragDropService copy.js +1 -0
  16. package/dist/elements/services/dragDropService/IExternalDragDropService.d.ts +5 -0
  17. package/dist/elements/services/dragDropService/IExternalDragDropService.js +1 -0
  18. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -0
  19. package/dist/elements/services/placementService/DefaultPlacementService.js +11 -0
  20. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -0
  21. package/dist/elements/services/placementService/FlexBoxPlacementService.js +2 -0
  22. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -0
  23. package/dist/elements/services/placementService/GridPlacementService.js +2 -0
  24. package/dist/elements/services/placementService/IPlacementService.d.ts +5 -4
  25. package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -2
  26. package/dist/elements/widgets/designerView/designerCanvas.js +36 -95
  27. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtension.d.ts +15 -0
  28. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtension.js +34 -0
  29. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtensionProvider.d.ts +10 -0
  30. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtensionProvider.js +13 -0
  31. package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtension.js +2 -2
  32. package/dist/elements/widgets/designerView/extensions/svg/LineExtension.js +2 -2
  33. package/dist/elements/widgets/designerView/extensions/svg/PathExtension.js +2 -2
  34. package/dist/elements/widgets/designerView/extensions/svg/RectExtension.js +2 -2
  35. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +2 -2
  36. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +2 -2
  37. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +2 -2
  38. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +2 -2
  39. package/dist/elements/widgets/designerView/tools/toolBar/DesignerToolbar.d.ts +1 -1
  40. package/dist/elements/widgets/designerView/tools/toolBar/DesignerToolbar.js +6 -6
  41. package/dist/elements/widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.d.ts +5 -0
  42. package/dist/elements/widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.js +10 -0
  43. package/dist/elements/widgets/designerView/tools/toolBar/popups/TransformToolPopup.d.ts +31 -0
  44. package/dist/elements/widgets/designerView/tools/toolBar/popups/TransformToolPopup.js +293 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.js +1 -0
  47. package/package.json +6 -6
@@ -0,0 +1,293 @@
1
+ import { html, BaseCustomWebComponentConstructorAppend, css } from '@node-projects/base-custom-webcomponent';
2
+ import { filterChildPlaceItems } from '../../../../../helper/LayoutHelper.js';
3
+ import { calculateOuterRect } from '../../../../../helper/ElementHelper.js';
4
+ export class TransformToolPopup extends BaseCustomWebComponentConstructorAppend {
5
+ _designerView;
6
+ _previousSelectionRect;
7
+ _selectionChanged;
8
+ _relativeButton;
9
+ _absoluteButton;
10
+ _applyButton;
11
+ _inputX;
12
+ _inputY;
13
+ _inputR;
14
+ _originTopLeft;
15
+ _originTopMid;
16
+ _originTopRight;
17
+ _originMidLeft;
18
+ _originMidMid;
19
+ _originMidRight;
20
+ _originBotLeft;
21
+ _originBotMid;
22
+ _originBotRight;
23
+ _transformMode;
24
+ _transformOrigin;
25
+ static style = css `
26
+ .container {
27
+ width: 220px;
28
+ min-height: 200px;
29
+ color: white;
30
+ background-color: rgb(64, 64, 64);
31
+ border: 1px solid black;
32
+ }
33
+ header {
34
+ text-align: center;
35
+ }
36
+ .inputs{
37
+ float: left;
38
+ margin-top: 5px;
39
+ align-items: center;
40
+ }
41
+ .input {
42
+ display: flex;
43
+ align-items: center;
44
+ margin-top: 5px;
45
+ }
46
+ .text {
47
+ margin-left: 5px;
48
+ font-size: 14px;
49
+ }
50
+ .strokecolor{
51
+ float: both;
52
+ }
53
+ .fillbrush{
54
+ float: both;
55
+ }
56
+ .strokethickness{
57
+ float: both;
58
+ }
59
+ #input-div{
60
+ display: grid;
61
+ grid-template-columns: 1fr 9fr;
62
+ grid-template-rows: 25px 25px 25px;
63
+ grid-row-gap: 2px;
64
+ font-size: small;
65
+ margin: 10px;
66
+ }
67
+ #button-div{
68
+ display: grid;
69
+ grid-template-columns: 1fr 1fr;
70
+ grid-template-rows: 25px;
71
+ font-size: small;
72
+ margin: 10px;
73
+ grid-column-gap: 5px
74
+ }
75
+ #apply-div{
76
+ font-size: small;
77
+ justify-content: center;
78
+ width: 100%;
79
+ margin-top: 10px;
80
+ margin-bottom: 10px;
81
+ display: flex;
82
+ }
83
+ #cube{
84
+ display: grid;
85
+ grid-template-columns: 20px 20px 20px;
86
+ grid-template-rows: 20px 20px 20px;
87
+ grid-gap: 10px;
88
+ padding: 10px;
89
+ top: -80px;
90
+ position: relative;
91
+ }
92
+ #cube-background{
93
+ width: 60px;
94
+ height: 60px;
95
+ background: gray;
96
+ margin-top: 20px;
97
+ margin-left: 20px;
98
+ }
99
+ `;
100
+ static template = html `
101
+ <div class="container">
102
+ <header>
103
+ <h2 id="title" style="margin:0px;">Transform</h2>
104
+ </header>
105
+ <main id="content-area">
106
+ <div id="input-div">
107
+ <span>X:</span>
108
+ <input type="number" id="transform-input-x">
109
+ <span>Y:</span>
110
+ <input type="number" id="transform-input-y">
111
+ <span>R:</span>
112
+ <input type="number" id="transform-input-r">
113
+ </div>
114
+ <div id="button-div">
115
+ <button id="transform-button-absolute">absolute</button>
116
+ <button id="transform-button-relative">relative</button>
117
+ </div>
118
+
119
+ <div style="justify-content: center; display: grid; height: 100px">
120
+ <div id="cube-background"></div>
121
+ <div id="cube">
122
+ <input id="origin-top-left" type="radio" name="origin-radio">
123
+ <input id="origin-top-mid" type="radio" name="origin-radio">
124
+ <input id="origin-top-right" type="radio" name="origin-radio">
125
+ <input id="origin-mid-left" type="radio" name="origin-radio">
126
+ <input id="origin-mid-mid" type="radio" name="origin-radio" checked>
127
+ <input id="origin-mid-right" type="radio" name="origin-radio">
128
+ <input id="origin-bot-left" type="radio" name="origin-radio">
129
+ <input id="origin-bot-mid" type="radio" name="origin-radio">
130
+ <input id="origin-bot-right" type="radio" name="origin-radio">
131
+ </div>
132
+ </div>
133
+
134
+ <div id="apply-div">
135
+ <button id="transform-button-apply" style="width:100px;">apply</button>
136
+ </div>
137
+ </main>
138
+ </div>`;
139
+ constructor() {
140
+ super();
141
+ this._relativeButton = this._getDomElement("transform-button-relative");
142
+ this._absoluteButton = this._getDomElement("transform-button-absolute");
143
+ this._applyButton = this._getDomElement("transform-button-apply");
144
+ this._inputX = this._getDomElement("transform-input-x");
145
+ this._inputY = this._getDomElement("transform-input-y");
146
+ this._inputR = this._getDomElement("transform-input-r");
147
+ this._originTopLeft = this._getDomElement("origin-top-left");
148
+ this._originTopMid = this._getDomElement("origin-top-mid");
149
+ this._originTopRight = this._getDomElement("origin-top-right");
150
+ this._originMidLeft = this._getDomElement("origin-mid-left");
151
+ this._originMidMid = this._getDomElement("origin-mid-mid");
152
+ this._originMidRight = this._getDomElement("origin-mid-right");
153
+ this._originBotLeft = this._getDomElement("origin-bot-left");
154
+ this._originBotMid = this._getDomElement("origin-bot-mid");
155
+ this._originBotRight = this._getDomElement("origin-bot-right");
156
+ this._relativeButton.onclick = () => this._changePositionMode("relative");
157
+ this._absoluteButton.onclick = () => this._changePositionMode("absolute");
158
+ this._applyButton.onclick = () => this._applyTransform();
159
+ this._transformMode = "relative";
160
+ this._changePositionMode(this._transformMode);
161
+ }
162
+ _changePositionMode(mode) {
163
+ if (mode == "relative") {
164
+ this._relativeButton.style.backgroundColor = "#6F8A9D";
165
+ this._relativeButton.style.color = "black";
166
+ this._absoluteButton.style.backgroundColor = "#A4B5C1";
167
+ this._absoluteButton.style.color = "#77716E";
168
+ }
169
+ else {
170
+ this._absoluteButton.style.backgroundColor = "#6F8A9D";
171
+ this._absoluteButton.style.color = "black";
172
+ this._relativeButton.style.backgroundColor = "#A4B5C1";
173
+ this._relativeButton.style.color = "#77716E";
174
+ }
175
+ this._transformMode = mode;
176
+ }
177
+ _applyTransform() {
178
+ this._checkOrigin();
179
+ this._designerView = this.getRootNode().host.designerView;
180
+ let selection = this._designerView.instanceServiceContainer.selectionService.selectedElements;
181
+ selection = filterChildPlaceItems(selection);
182
+ this._selectionChanged = false;
183
+ this._designerView.instanceServiceContainer.selectionService.onSelectionChanged.once(() => {
184
+ this._selectionChanged = true;
185
+ this._previousSelectionRect = null;
186
+ });
187
+ if (selection.length != 0) {
188
+ let inputPos = {
189
+ x: isNaN(this._inputX.valueAsNumber) ? null : this._inputX.valueAsNumber,
190
+ y: isNaN(this._inputY.valueAsNumber) ? null : this._inputY.valueAsNumber
191
+ };
192
+ let inputRotation = this._inputR.valueAsNumber ? this._inputR.valueAsNumber : 0;
193
+ let grp = selection[0].openGroup("Transform selection");
194
+ if (!this._previousSelectionRect || this._selectionChanged)
195
+ this._previousSelectionRect = calculateOuterRect(selection, this._designerView.designerCanvas);
196
+ let origin = this._calculateTransformOriginPosition(this._previousSelectionRect);
197
+ for (let item of selection) {
198
+ let itemPos = {
199
+ x: parseFloat(item.getStyle("left")),
200
+ y: parseFloat(item.getStyle("top")),
201
+ width: parseFloat(item.getStyle("width")),
202
+ height: parseFloat(item.getStyle("height"))
203
+ };
204
+ let itemRotStyle = item.getStyle("transform");
205
+ let itemRotation = 0;
206
+ if (itemRotStyle)
207
+ itemRotation = parseFloat(item.getStyle("transform").replaceAll("rotate(", "").replaceAll("deg)", ""));
208
+ let newPos = this._calculateTransform(this._previousSelectionRect, origin, itemPos, inputRotation, inputPos, this._transformMode);
209
+ item.setStyle("left", newPos.x.toString() + "px");
210
+ item.setStyle("top", newPos.y.toString() + "px");
211
+ let rotation;
212
+ if (this._transformMode == 'relative')
213
+ rotation = itemRotation + inputRotation;
214
+ else
215
+ rotation = inputRotation;
216
+ while (rotation >= 360)
217
+ rotation -= 360;
218
+ if (rotation != 0)
219
+ item.setStyle("transform", "rotate(" + rotation + "deg)");
220
+ else
221
+ item.removeStyle("transform");
222
+ }
223
+ grp.commit();
224
+ }
225
+ }
226
+ _calculateTransformOriginPosition(selectionRect) {
227
+ switch (this._transformOrigin) {
228
+ case "topLeft":
229
+ return { x: selectionRect.x, y: selectionRect.y };
230
+ case "topMid":
231
+ return { x: selectionRect.x + selectionRect.width / 2, y: selectionRect.y };
232
+ case "topRight":
233
+ return { x: selectionRect.x + selectionRect.width, y: selectionRect.y };
234
+ case "midLeft":
235
+ return { x: selectionRect.x, y: selectionRect.y + selectionRect.height / 2 };
236
+ case "midMid":
237
+ return { x: selectionRect.x + selectionRect.width / 2, y: selectionRect.y + selectionRect.height / 2 };
238
+ case "midRight":
239
+ return { x: selectionRect.x + selectionRect.width, y: selectionRect.y + selectionRect.height / 2 };
240
+ case "botLeft":
241
+ return { x: selectionRect.x, y: selectionRect.y + selectionRect.height };
242
+ case "botMid":
243
+ return { x: selectionRect.x + selectionRect.width / 2, y: selectionRect.y + selectionRect.height };
244
+ case "botRight":
245
+ return { x: selectionRect.x + selectionRect.width, y: selectionRect.y + selectionRect.height };
246
+ }
247
+ }
248
+ _checkOrigin() {
249
+ if (this._originTopLeft.checked)
250
+ this._transformOrigin = "topLeft";
251
+ else if (this._originTopMid.checked)
252
+ this._transformOrigin = "topMid";
253
+ else if (this._originTopRight.checked)
254
+ this._transformOrigin = "topRight";
255
+ else if (this._originMidLeft.checked)
256
+ this._transformOrigin = "midLeft";
257
+ else if (this._originMidMid.checked)
258
+ this._transformOrigin = "midMid";
259
+ else if (this._originMidRight.checked)
260
+ this._transformOrigin = "midRight";
261
+ else if (this._originBotLeft.checked)
262
+ this._transformOrigin = "botLeft";
263
+ else if (this._originBotMid.checked)
264
+ this._transformOrigin = "botMid";
265
+ else if (this._originBotRight.checked)
266
+ this._transformOrigin = "botRight";
267
+ }
268
+ _calculateTransform(selectionRect, origin, itemRect, rotation, inputPos, transformMode) {
269
+ let newPoint;
270
+ // convert deg in rad
271
+ rotation = rotation * (Math.PI / 180);
272
+ if (transformMode == 'absolute') {
273
+ if (inputPos.x)
274
+ inputPos.x = inputPos.x - selectionRect.x;
275
+ if (inputPos.y)
276
+ inputPos.y = inputPos.y - selectionRect.y;
277
+ }
278
+ origin = {
279
+ x: origin.x - itemRect.width / 2,
280
+ y: origin.y - itemRect.height / 2
281
+ };
282
+ let diffItemPosToOrigin = {
283
+ x: itemRect.x - origin.x,
284
+ y: itemRect.y - origin.y
285
+ };
286
+ newPoint = {
287
+ x: Math.cos(rotation) * diffItemPosToOrigin.x - Math.sin(rotation) * diffItemPosToOrigin.y + origin.x + inputPos.x,
288
+ y: Math.sin(rotation) * diffItemPosToOrigin.x + Math.cos(rotation) * diffItemPosToOrigin.y + origin.y + inputPos.y
289
+ };
290
+ return newPoint;
291
+ }
292
+ }
293
+ customElements.define('node-projects-designer-transformtool-popup', TransformToolPopup);
package/dist/index.d.ts CHANGED
@@ -44,6 +44,8 @@ export * from "./elements/services/demoProviderService/DemoProviderService.js";
44
44
  export type { IDemoProviderService } from "./elements/services/demoProviderService/IDemoProviderService.js";
45
45
  export * from "./elements/services/designItemDocumentPositionService/DesignItemDocumentPositionService.js";
46
46
  export type { IDesignItemDocumentPositionService } from "./elements/services/designItemDocumentPositionService/IDesignItemDocumentPositionService.js";
47
+ export * from "./elements/services/dragDropService/ExternalDragDropService.js";
48
+ export type { IExternalDragDropService } from "./elements/services/dragDropService/IExternalDragDropService.js";
47
49
  export * from "./elements/services/dragDropService/DragDropService.js";
48
50
  export type { IDragDropService } from "./elements/services/dragDropService/IDragDropService.js";
49
51
  export type { IElementInteractionService } from "./elements/services/elementInteractionService/IElementInteractionService.js";
package/dist/index.js CHANGED
@@ -29,6 +29,7 @@ export * from "./elements/services/copyPasteService/CopyPasteService.js";
29
29
  export * from "./elements/services/copyPasteService/CopyPasteAsJsonService.js";
30
30
  export * from "./elements/services/demoProviderService/DemoProviderService.js";
31
31
  export * from "./elements/services/designItemDocumentPositionService/DesignItemDocumentPositionService.js";
32
+ export * from "./elements/services/dragDropService/ExternalDragDropService.js";
32
33
  export * from "./elements/services/dragDropService/DragDropService.js";
33
34
  export * from "./elements/services/elementsService/JsonFileElementsService.js";
34
35
  export * from "./elements/services/elementsService/PreDefinedElementsService.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.238",
4
+ "version": "0.0.239",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",
@@ -13,7 +13,7 @@
13
13
  "prepublishOnly": "npm run build"
14
14
  },
15
15
  "dependencies": {
16
- "@node-projects/base-custom-webcomponent": "^0.10.9",
16
+ "@node-projects/base-custom-webcomponent": "^0.11.0",
17
17
  "construct-style-sheets-polyfill": "^3.1.0"
18
18
  },
19
19
  "devDependencies": {
@@ -25,8 +25,8 @@
25
25
  "@types/css-tree": "^2.3.1",
26
26
  "@types/jquery": "^3.5.16",
27
27
  "@types/jquery.fancytree": "0.0.7",
28
- "@types/node": "^20.3.1",
29
- "ace-builds": "^1.22.1",
28
+ "@types/node": "^20.3.3",
29
+ "ace-builds": "^1.23.1",
30
30
  "codemirror": "^6.0.1",
31
31
  "css-tree": "^2.3.1",
32
32
  "esprima-next": "^5.8.4",
@@ -36,8 +36,8 @@
36
36
  "jquery.fancytree": "^2.38.3",
37
37
  "mdn-data": "^2.0.32",
38
38
  "monaco-editor": "^0.39.0",
39
- "ts-jest": "^29.1.0",
40
- "typescript": "^5.1.3",
39
+ "ts-jest": "^29.1.1",
40
+ "typescript": "^5.1.6",
41
41
  "typescript-lit-html-plugin": "^0.9.0"
42
42
  },
43
43
  "repository": {