@tmagic/stage 1.1.0-beta.1 → 1.1.0-beta.4
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.
- package/dist/tmagic-stage.es.js +292 -95
- package/dist/tmagic-stage.es.js.map +1 -1
- package/dist/tmagic-stage.umd.js +298 -97
- package/dist/tmagic-stage.umd.js.map +1 -1
- package/dist/types/src/StageCore.d.ts +12 -2
- package/dist/types/src/StageDragResize.d.ts +7 -18
- package/dist/types/src/StageMask.d.ts +1 -0
- package/dist/types/src/StageMultiDragResize.d.ts +42 -0
- package/dist/types/src/const.d.ts +1 -0
- package/dist/types/src/types.d.ts +3 -1
- package/dist/types/src/util.d.ts +16 -1
- package/package.json +5 -4
- package/src/StageCore.ts +84 -16
- package/src/StageDragResize.ts +40 -118
- package/src/StageMask.ts +23 -6
- package/src/StageMultiDragResize.ts +185 -0
- package/src/const.ts +2 -0
- package/src/types.ts +3 -1
- package/src/util.ts +87 -2
package/dist/tmagic-stage.es.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import EventEmitter$1, { EventEmitter } from 'events';
|
|
2
|
+
import { removeClassName, removeClassNameByClassName, createDiv, injectStyle, isSameDomain, getHost, addClassName } from '@tmagic/utils';
|
|
2
3
|
import Moveable from 'moveable';
|
|
3
4
|
import MoveableHelper from 'moveable-helper';
|
|
4
|
-
import
|
|
5
|
+
import KeyController from 'keycon';
|
|
5
6
|
import { throttle } from 'lodash-es';
|
|
6
7
|
import Guides from '@scena/guides';
|
|
7
8
|
|
|
@@ -9,6 +10,7 @@ const GHOST_EL_ID_PREFIX = "ghost_el_";
|
|
|
9
10
|
const DRAG_EL_ID_PREFIX = "drag_el_";
|
|
10
11
|
const HIGHLIGHT_EL_ID_PREFIX = "highlight_el_";
|
|
11
12
|
const CONTAINER_HIGHLIGHT_CLASS = "tmagic-stage-container-highlight";
|
|
13
|
+
const PAGE_CLASS = "magic-ui-page";
|
|
12
14
|
const DEFAULT_ZOOM = 1;
|
|
13
15
|
var GuidesType = /* @__PURE__ */ ((GuidesType2) => {
|
|
14
16
|
GuidesType2["HORIZONTAL"] = "horizontal";
|
|
@@ -61,6 +63,19 @@ const getOffset = (el) => {
|
|
|
61
63
|
top
|
|
62
64
|
};
|
|
63
65
|
};
|
|
66
|
+
const getTargetElStyle = (el) => {
|
|
67
|
+
const offset = getOffset(el);
|
|
68
|
+
const { transform } = getComputedStyle(el);
|
|
69
|
+
return `
|
|
70
|
+
position: absolute;
|
|
71
|
+
transform: ${transform};
|
|
72
|
+
left: ${offset.left}px;
|
|
73
|
+
top: ${offset.top}px;
|
|
74
|
+
width: ${el.clientWidth}px;
|
|
75
|
+
height: ${el.clientHeight}px;
|
|
76
|
+
z-index: ${ZIndex.DRAG_EL};
|
|
77
|
+
`;
|
|
78
|
+
};
|
|
64
79
|
const getAbsolutePosition = (el, { top, left }) => {
|
|
65
80
|
const { offsetParent } = el;
|
|
66
81
|
if (offsetParent) {
|
|
@@ -141,6 +156,52 @@ const calcValueByFontsize = (doc, value) => {
|
|
|
141
156
|
}
|
|
142
157
|
return value;
|
|
143
158
|
};
|
|
159
|
+
const down = (deltaTop, target) => {
|
|
160
|
+
let swapIndex = 0;
|
|
161
|
+
let addUpH = target.clientHeight;
|
|
162
|
+
const brothers = Array.from(target.parentNode?.children || []).filter((node) => !node.id.startsWith(GHOST_EL_ID_PREFIX));
|
|
163
|
+
const index = brothers.indexOf(target);
|
|
164
|
+
const downEls = brothers.slice(index + 1);
|
|
165
|
+
for (let i = 0; i < downEls.length; i++) {
|
|
166
|
+
const ele = downEls[i];
|
|
167
|
+
if (ele.style?.position === "fixed") {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
addUpH += ele.clientHeight / 2;
|
|
171
|
+
if (deltaTop <= addUpH) {
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
addUpH += ele.clientHeight / 2;
|
|
175
|
+
swapIndex = i;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
src: target.id,
|
|
179
|
+
dist: downEls.length && swapIndex > -1 ? downEls[swapIndex].id : target.id
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
const up = (deltaTop, target) => {
|
|
183
|
+
const brothers = Array.from(target.parentNode?.children || []).filter((node) => !node.id.startsWith(GHOST_EL_ID_PREFIX));
|
|
184
|
+
const index = brothers.indexOf(target);
|
|
185
|
+
const upEls = brothers.slice(0, index);
|
|
186
|
+
let addUpH = target.clientHeight;
|
|
187
|
+
let swapIndex = upEls.length - 1;
|
|
188
|
+
for (let i = upEls.length - 1; i >= 0; i--) {
|
|
189
|
+
const ele = upEls[i];
|
|
190
|
+
if (!ele)
|
|
191
|
+
continue;
|
|
192
|
+
if (ele.style.position === "fixed")
|
|
193
|
+
continue;
|
|
194
|
+
addUpH += ele.clientHeight / 2;
|
|
195
|
+
if (-deltaTop <= addUpH)
|
|
196
|
+
break;
|
|
197
|
+
addUpH += ele.clientHeight / 2;
|
|
198
|
+
swapIndex = i;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
src: target.id,
|
|
202
|
+
dist: upEls.length && swapIndex > -1 ? upEls[swapIndex].id : target.id
|
|
203
|
+
};
|
|
204
|
+
};
|
|
144
205
|
|
|
145
206
|
class StageDragResize extends EventEmitter {
|
|
146
207
|
constructor(config) {
|
|
@@ -153,8 +214,7 @@ class StageDragResize extends EventEmitter {
|
|
|
153
214
|
this.dragStatus = "end" /* END */;
|
|
154
215
|
this.core = config.core;
|
|
155
216
|
this.container = config.container;
|
|
156
|
-
this.
|
|
157
|
-
this.container.append(this.dragEl);
|
|
217
|
+
this.mask = config.mask;
|
|
158
218
|
}
|
|
159
219
|
select(el, event) {
|
|
160
220
|
const oldTarget = this.target;
|
|
@@ -205,6 +265,16 @@ class StageDragResize extends EventEmitter {
|
|
|
205
265
|
this.moveableOptions.verticalGuidelines = [];
|
|
206
266
|
this.updateMoveable();
|
|
207
267
|
}
|
|
268
|
+
clearSelectStatus() {
|
|
269
|
+
if (!this.moveable)
|
|
270
|
+
return;
|
|
271
|
+
this.destroyDragEl();
|
|
272
|
+
this.moveable.target = null;
|
|
273
|
+
this.moveable.updateTarget();
|
|
274
|
+
}
|
|
275
|
+
destroyDragEl() {
|
|
276
|
+
this.dragEl?.remove();
|
|
277
|
+
}
|
|
208
278
|
destroy() {
|
|
209
279
|
this.moveable?.destroy();
|
|
210
280
|
this.destroyGhostEl();
|
|
@@ -218,7 +288,14 @@ class StageDragResize extends EventEmitter {
|
|
|
218
288
|
}
|
|
219
289
|
this.mode = getMode(el);
|
|
220
290
|
this.destroyGhostEl();
|
|
221
|
-
this.
|
|
291
|
+
this.destroyDragEl();
|
|
292
|
+
this.dragEl = globalThis.document.createElement("div");
|
|
293
|
+
this.container.append(this.dragEl);
|
|
294
|
+
this.dragEl.style.cssText = getTargetElStyle(el);
|
|
295
|
+
this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;
|
|
296
|
+
if (typeof this.core.config.updateDragEl === "function") {
|
|
297
|
+
this.core.config.updateDragEl(this.dragEl, el);
|
|
298
|
+
}
|
|
222
299
|
this.moveableOptions = this.getOptions({
|
|
223
300
|
target: this.dragEl
|
|
224
301
|
});
|
|
@@ -317,15 +394,7 @@ class StageDragResize extends EventEmitter {
|
|
|
317
394
|
globalThis.clearTimeout(timeout);
|
|
318
395
|
timeout = void 0;
|
|
319
396
|
}
|
|
320
|
-
timeout =
|
|
321
|
-
const els = this.core.getElementsFromPoint(e.inputEvent);
|
|
322
|
-
for (const el of els) {
|
|
323
|
-
if (doc && !el.id.startsWith(GHOST_EL_ID_PREFIX) && el !== this.target && await this.core.isContainer(el)) {
|
|
324
|
-
addClassName(el, doc, this.core.containerHighlightClassName);
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}, this.core.containerHighlightDuration);
|
|
397
|
+
timeout = this.core.getAddContainerHighlightClassNameTimeout(e.inputEvent, [this.target]);
|
|
329
398
|
this.dragStatus = "ing" /* ING */;
|
|
330
399
|
if (this.ghostEl) {
|
|
331
400
|
this.ghostEl.style.top = `${frame.top + e.beforeTranslate[1]}px`;
|
|
@@ -456,6 +525,7 @@ class StageDragResize extends EventEmitter {
|
|
|
456
525
|
this.destroyGhostEl();
|
|
457
526
|
}
|
|
458
527
|
const ghostEl = el.cloneNode(true);
|
|
528
|
+
this.setGhostElChildrenId(ghostEl);
|
|
459
529
|
const { top, left } = getAbsolutePosition(el, getOffset(el));
|
|
460
530
|
ghostEl.id = `${GHOST_EL_ID_PREFIX}${el.id}`;
|
|
461
531
|
ghostEl.style.zIndex = ZIndex.GHOST_EL;
|
|
@@ -466,30 +536,20 @@ class StageDragResize extends EventEmitter {
|
|
|
466
536
|
el.after(ghostEl);
|
|
467
537
|
return ghostEl;
|
|
468
538
|
}
|
|
539
|
+
setGhostElChildrenId(el) {
|
|
540
|
+
for (const child of el.children) {
|
|
541
|
+
if (child.id) {
|
|
542
|
+
child.id = `${GHOST_EL_ID_PREFIX}${child.id}`;
|
|
543
|
+
}
|
|
544
|
+
if (child.children.length) {
|
|
545
|
+
this.setGhostElChildrenId(child);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
469
549
|
destroyGhostEl() {
|
|
470
550
|
this.ghostEl?.remove();
|
|
471
551
|
this.ghostEl = void 0;
|
|
472
552
|
}
|
|
473
|
-
updateDragEl(el) {
|
|
474
|
-
const offset = getOffset(el);
|
|
475
|
-
const { transform } = getComputedStyle(el);
|
|
476
|
-
this.dragEl.style.cssText = `
|
|
477
|
-
position: absolute;
|
|
478
|
-
transform: ${transform};
|
|
479
|
-
left: ${offset.left}px;
|
|
480
|
-
top: ${offset.top}px;
|
|
481
|
-
width: ${el.clientWidth}px;
|
|
482
|
-
height: ${el.clientHeight}px;
|
|
483
|
-
z-index: ${ZIndex.DRAG_EL};
|
|
484
|
-
`;
|
|
485
|
-
this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;
|
|
486
|
-
if (typeof this.core.config.updateDragEl === "function") {
|
|
487
|
-
this.core.config.updateDragEl(this.dragEl, el);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
destroyDragEl() {
|
|
491
|
-
this.dragEl?.remove();
|
|
492
|
-
}
|
|
493
553
|
getOptions(options = {}) {
|
|
494
554
|
if (!this.target)
|
|
495
555
|
return {};
|
|
@@ -540,7 +600,7 @@ class StageDragResize extends EventEmitter {
|
|
|
540
600
|
bounds: {
|
|
541
601
|
top: 0,
|
|
542
602
|
left: -1,
|
|
543
|
-
right: this.container.clientWidth,
|
|
603
|
+
right: this.container.clientWidth - 1,
|
|
544
604
|
bottom: this.container.clientHeight,
|
|
545
605
|
...moveableOptions.bounds || {}
|
|
546
606
|
},
|
|
@@ -549,52 +609,6 @@ class StageDragResize extends EventEmitter {
|
|
|
549
609
|
};
|
|
550
610
|
}
|
|
551
611
|
}
|
|
552
|
-
const down = (deltaTop, target) => {
|
|
553
|
-
let swapIndex = 0;
|
|
554
|
-
let addUpH = target.clientHeight;
|
|
555
|
-
const brothers = Array.from(target.parentNode?.children || []).filter((node) => !node.id.startsWith(GHOST_EL_ID_PREFIX));
|
|
556
|
-
const index = brothers.indexOf(target);
|
|
557
|
-
const downEls = brothers.slice(index + 1);
|
|
558
|
-
for (let i = 0; i < downEls.length; i++) {
|
|
559
|
-
const ele = downEls[i];
|
|
560
|
-
if (ele.style?.position === "fixed") {
|
|
561
|
-
continue;
|
|
562
|
-
}
|
|
563
|
-
addUpH += ele.clientHeight / 2;
|
|
564
|
-
if (deltaTop <= addUpH) {
|
|
565
|
-
break;
|
|
566
|
-
}
|
|
567
|
-
addUpH += ele.clientHeight / 2;
|
|
568
|
-
swapIndex = i;
|
|
569
|
-
}
|
|
570
|
-
return {
|
|
571
|
-
src: target.id,
|
|
572
|
-
dist: downEls.length && swapIndex > -1 ? downEls[swapIndex].id : target.id
|
|
573
|
-
};
|
|
574
|
-
};
|
|
575
|
-
const up = (deltaTop, target) => {
|
|
576
|
-
const brothers = Array.from(target.parentNode?.children || []).filter((node) => !node.id.startsWith(GHOST_EL_ID_PREFIX));
|
|
577
|
-
const index = brothers.indexOf(target);
|
|
578
|
-
const upEls = brothers.slice(0, index);
|
|
579
|
-
let addUpH = target.clientHeight;
|
|
580
|
-
let swapIndex = upEls.length - 1;
|
|
581
|
-
for (let i = upEls.length - 1; i >= 0; i--) {
|
|
582
|
-
const ele = upEls[i];
|
|
583
|
-
if (!ele)
|
|
584
|
-
continue;
|
|
585
|
-
if (ele.style.position === "fixed")
|
|
586
|
-
continue;
|
|
587
|
-
addUpH += ele.clientHeight / 2;
|
|
588
|
-
if (-deltaTop <= addUpH)
|
|
589
|
-
break;
|
|
590
|
-
addUpH += ele.clientHeight / 2;
|
|
591
|
-
swapIndex = i;
|
|
592
|
-
}
|
|
593
|
-
return {
|
|
594
|
-
src: target.id,
|
|
595
|
-
dist: upEls.length && swapIndex > -1 ? upEls[swapIndex].id : target.id
|
|
596
|
-
};
|
|
597
|
-
};
|
|
598
612
|
|
|
599
613
|
class TargetCalibrate extends EventEmitter {
|
|
600
614
|
constructor(config) {
|
|
@@ -854,6 +868,7 @@ class StageMask extends Rule {
|
|
|
854
868
|
this.maxScrollTop = 0;
|
|
855
869
|
this.maxScrollLeft = 0;
|
|
856
870
|
this.intersectionObserver = null;
|
|
871
|
+
this.shiftKeyDown = false;
|
|
857
872
|
this.mode = Mode.ABSOLUTE;
|
|
858
873
|
this.pageResizeObserver = null;
|
|
859
874
|
this.wrapperResizeObserver = null;
|
|
@@ -866,12 +881,19 @@ class StageMask extends Rule {
|
|
|
866
881
|
event.stopPropagation();
|
|
867
882
|
if (event.button !== MouseButton.LEFT && event.button !== MouseButton.RIGHT)
|
|
868
883
|
return;
|
|
884
|
+
if (!this.shiftKeyDown && event.target.className.indexOf("moveable-area") !== -1) {
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
869
887
|
if (event.target.className.indexOf("moveable-control") !== -1) {
|
|
870
888
|
return;
|
|
871
889
|
}
|
|
872
890
|
this.content.removeEventListener("mousemove", this.highlightHandler);
|
|
873
|
-
this.
|
|
874
|
-
|
|
891
|
+
if (this.shiftKeyDown) {
|
|
892
|
+
this.emit("beforeMultiSelect", event);
|
|
893
|
+
} else {
|
|
894
|
+
this.emit("beforeSelect", event);
|
|
895
|
+
globalThis.document.addEventListener("mouseup", this.mouseUpHandler);
|
|
896
|
+
}
|
|
875
897
|
};
|
|
876
898
|
this.mouseUpHandler = () => {
|
|
877
899
|
globalThis.document.removeEventListener("mouseup", this.mouseUpHandler);
|
|
@@ -906,6 +928,14 @@ class StageMask extends Rule {
|
|
|
906
928
|
this.content.addEventListener("wheel", this.mouseWheelHandler);
|
|
907
929
|
this.content.addEventListener("mousemove", this.highlightHandler);
|
|
908
930
|
this.content.addEventListener("mouseleave", this.mouseLeaveHandler);
|
|
931
|
+
KeyController.global.keydown("shift", (e) => {
|
|
932
|
+
e.inputEvent.preventDefault();
|
|
933
|
+
this.shiftKeyDown = true;
|
|
934
|
+
});
|
|
935
|
+
KeyController.global.keyup("shift", (e) => {
|
|
936
|
+
e.inputEvent.preventDefault();
|
|
937
|
+
this.shiftKeyDown = false;
|
|
938
|
+
});
|
|
909
939
|
}
|
|
910
940
|
setMode(mode) {
|
|
911
941
|
this.mode = mode;
|
|
@@ -1036,6 +1066,118 @@ class StageMask extends Rule {
|
|
|
1036
1066
|
}
|
|
1037
1067
|
}
|
|
1038
1068
|
|
|
1069
|
+
class StageMultiDragResize extends EventEmitter {
|
|
1070
|
+
constructor(config) {
|
|
1071
|
+
super();
|
|
1072
|
+
this.targetList = [];
|
|
1073
|
+
this.dragElList = [];
|
|
1074
|
+
this.core = config.core;
|
|
1075
|
+
this.container = config.container;
|
|
1076
|
+
this.mask = config.mask;
|
|
1077
|
+
}
|
|
1078
|
+
multiSelect(els) {
|
|
1079
|
+
this.targetList = els;
|
|
1080
|
+
this.core.dr.destroyDragEl();
|
|
1081
|
+
this.destroyDragElList();
|
|
1082
|
+
this.dragElList = els.map((elItem) => {
|
|
1083
|
+
const dragElDiv = globalThis.document.createElement("div");
|
|
1084
|
+
this.container.append(dragElDiv);
|
|
1085
|
+
dragElDiv.style.cssText = getTargetElStyle(elItem);
|
|
1086
|
+
dragElDiv.id = `${DRAG_EL_ID_PREFIX}${elItem.id}`;
|
|
1087
|
+
if (typeof this.core.config.updateDragEl === "function") {
|
|
1088
|
+
this.core.config.updateDragEl(dragElDiv, elItem);
|
|
1089
|
+
}
|
|
1090
|
+
return dragElDiv;
|
|
1091
|
+
});
|
|
1092
|
+
this.moveableForMulti?.destroy();
|
|
1093
|
+
this.multiMoveableHelper?.clear();
|
|
1094
|
+
this.moveableForMulti = new Moveable(this.container, {
|
|
1095
|
+
target: this.dragElList,
|
|
1096
|
+
defaultGroupRotate: 0,
|
|
1097
|
+
defaultGroupOrigin: "50% 50%",
|
|
1098
|
+
draggable: true,
|
|
1099
|
+
resizable: true,
|
|
1100
|
+
throttleDrag: 0,
|
|
1101
|
+
startDragRotate: 0,
|
|
1102
|
+
throttleDragRotate: 0,
|
|
1103
|
+
zoom: 1,
|
|
1104
|
+
origin: true,
|
|
1105
|
+
padding: { left: 0, top: 0, right: 0, bottom: 0 }
|
|
1106
|
+
});
|
|
1107
|
+
this.multiMoveableHelper = MoveableHelper.create({
|
|
1108
|
+
useBeforeRender: true,
|
|
1109
|
+
useRender: false,
|
|
1110
|
+
createAuto: true
|
|
1111
|
+
});
|
|
1112
|
+
const frames = [];
|
|
1113
|
+
this.moveableForMulti.on("dragGroupStart", (params) => {
|
|
1114
|
+
const { events } = params;
|
|
1115
|
+
this.multiMoveableHelper?.onDragGroupStart(params);
|
|
1116
|
+
events.forEach((ev) => {
|
|
1117
|
+
const matchEventTarget = this.targetList.find((targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ""));
|
|
1118
|
+
if (!matchEventTarget)
|
|
1119
|
+
return;
|
|
1120
|
+
frames.push({
|
|
1121
|
+
left: matchEventTarget.offsetLeft,
|
|
1122
|
+
top: matchEventTarget.offsetTop,
|
|
1123
|
+
id: matchEventTarget.id
|
|
1124
|
+
});
|
|
1125
|
+
});
|
|
1126
|
+
}).on("dragGroup", (params) => {
|
|
1127
|
+
const { events } = params;
|
|
1128
|
+
events.forEach((ev) => {
|
|
1129
|
+
const frameSnapShot = frames.find((frameItem) => frameItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ""));
|
|
1130
|
+
if (!frameSnapShot)
|
|
1131
|
+
return;
|
|
1132
|
+
const targeEl = this.targetList.find((targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ""));
|
|
1133
|
+
if (!targeEl)
|
|
1134
|
+
return;
|
|
1135
|
+
const isParentIncluded = this.targetList.find((targetItem) => targetItem.id === targeEl.parentElement?.id);
|
|
1136
|
+
if (!isParentIncluded) {
|
|
1137
|
+
targeEl.style.left = `${frameSnapShot.left + ev.beforeTranslate[0]}px`;
|
|
1138
|
+
targeEl.style.top = `${frameSnapShot.top + ev.beforeTranslate[1]}px`;
|
|
1139
|
+
}
|
|
1140
|
+
});
|
|
1141
|
+
this.multiMoveableHelper?.onDragGroup(params);
|
|
1142
|
+
}).on("dragGroupEnd", () => {
|
|
1143
|
+
this.update();
|
|
1144
|
+
});
|
|
1145
|
+
}
|
|
1146
|
+
clearSelectStatus() {
|
|
1147
|
+
if (!this.moveableForMulti)
|
|
1148
|
+
return;
|
|
1149
|
+
this.destroyDragElList();
|
|
1150
|
+
this.moveableForMulti.target = null;
|
|
1151
|
+
this.moveableForMulti.updateTarget();
|
|
1152
|
+
}
|
|
1153
|
+
destroy() {
|
|
1154
|
+
this.moveableForMulti?.destroy();
|
|
1155
|
+
this.destroyDragElList();
|
|
1156
|
+
}
|
|
1157
|
+
destroyDragElList() {
|
|
1158
|
+
this.dragElList.forEach((dragElItem) => dragElItem?.remove());
|
|
1159
|
+
}
|
|
1160
|
+
update(isResize = false) {
|
|
1161
|
+
if (this.targetList.length === 0)
|
|
1162
|
+
return;
|
|
1163
|
+
const { contentWindow } = this.core.renderer;
|
|
1164
|
+
const doc = contentWindow?.document;
|
|
1165
|
+
if (!doc)
|
|
1166
|
+
return;
|
|
1167
|
+
this.targetList.forEach((targetItem) => {
|
|
1168
|
+
const offset = { left: targetItem.offsetLeft, top: targetItem.offsetTop };
|
|
1169
|
+
const left = calcValueByFontsize(doc, offset.left);
|
|
1170
|
+
const top = calcValueByFontsize(doc, offset.top);
|
|
1171
|
+
const width = calcValueByFontsize(doc, targetItem.clientWidth);
|
|
1172
|
+
const height = calcValueByFontsize(doc, targetItem.clientHeight);
|
|
1173
|
+
this.emit("update", {
|
|
1174
|
+
el: targetItem,
|
|
1175
|
+
style: isResize ? { left, top, width, height } : { left, top }
|
|
1176
|
+
});
|
|
1177
|
+
});
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1039
1181
|
var style = ".tmagic-stage-container-highlight::after {\n content: '';\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n background-color: #000;\n opacity: .1;\n}\n";
|
|
1040
1182
|
|
|
1041
1183
|
class StageRender extends EventEmitter {
|
|
@@ -1115,6 +1257,7 @@ class StageRender extends EventEmitter {
|
|
|
1115
1257
|
class StageCore extends EventEmitter {
|
|
1116
1258
|
constructor(config) {
|
|
1117
1259
|
super();
|
|
1260
|
+
this.selectedDomList = [];
|
|
1118
1261
|
this.zoom = DEFAULT_ZOOM;
|
|
1119
1262
|
this.config = config;
|
|
1120
1263
|
this.setZoom(config.zoom);
|
|
@@ -1124,7 +1267,8 @@ class StageCore extends EventEmitter {
|
|
|
1124
1267
|
this.containerHighlightDuration = config.containerHighlightDuration;
|
|
1125
1268
|
this.renderer = new StageRender({ core: this });
|
|
1126
1269
|
this.mask = new StageMask({ core: this });
|
|
1127
|
-
this.dr = new StageDragResize({ core: this, container: this.mask.content });
|
|
1270
|
+
this.dr = new StageDragResize({ core: this, container: this.mask.content, mask: this.mask });
|
|
1271
|
+
this.multiDr = new StageMultiDragResize({ core: this, container: this.mask.content, mask: this.mask });
|
|
1128
1272
|
this.highlightLayer = new StageHighlight({ core: this, container: this.mask.wrapper });
|
|
1129
1273
|
this.renderer.on("runtime-ready", (runtime) => {
|
|
1130
1274
|
this.emit("runtime-ready", runtime);
|
|
@@ -1132,29 +1276,57 @@ class StageCore extends EventEmitter {
|
|
|
1132
1276
|
this.renderer.on("page-el-update", (el) => {
|
|
1133
1277
|
this.mask?.observe(el);
|
|
1134
1278
|
});
|
|
1135
|
-
this.mask.on("beforeSelect", (event) => {
|
|
1136
|
-
this.
|
|
1279
|
+
this.mask.on("beforeSelect", async (event) => {
|
|
1280
|
+
this.clearSelectStatus("multiSelect");
|
|
1281
|
+
const el = await this.getElementFromPoint(event);
|
|
1282
|
+
if (!el)
|
|
1283
|
+
return;
|
|
1284
|
+
this.select(el, event);
|
|
1137
1285
|
}).on("select", () => {
|
|
1138
1286
|
this.emit("select", this.selectedDom);
|
|
1139
1287
|
}).on("changeGuides", (data) => {
|
|
1140
1288
|
this.dr.setGuidelines(data.type, data.guides);
|
|
1141
1289
|
this.emit("changeGuides", data);
|
|
1142
1290
|
}).on("highlight", async (event) => {
|
|
1143
|
-
await this.
|
|
1291
|
+
const el = await this.getElementFromPoint(event, "mousemove");
|
|
1292
|
+
if (!el)
|
|
1293
|
+
return;
|
|
1294
|
+
await this.highlight(el);
|
|
1144
1295
|
if (this.highlightedDom === this.selectedDom) {
|
|
1145
1296
|
this.highlightLayer.clearHighlight();
|
|
1146
1297
|
return;
|
|
1147
1298
|
}
|
|
1148
|
-
this.highlightLayer.highlight(this.highlightedDom);
|
|
1149
1299
|
this.emit("highlight", this.highlightedDom);
|
|
1150
1300
|
}).on("clearHighlight", async () => {
|
|
1151
1301
|
this.highlightLayer.clearHighlight();
|
|
1302
|
+
}).on("beforeMultiSelect", async (event) => {
|
|
1303
|
+
const el = await this.getElementFromPoint(event);
|
|
1304
|
+
if (!el)
|
|
1305
|
+
return;
|
|
1306
|
+
if (el.className.includes(PAGE_CLASS))
|
|
1307
|
+
return;
|
|
1308
|
+
this.clearSelectStatus("select");
|
|
1309
|
+
if (this.selectedDom && !this.selectedDom.className.includes(PAGE_CLASS)) {
|
|
1310
|
+
this.selectedDomList.push(this.selectedDom);
|
|
1311
|
+
this.selectedDom = void 0;
|
|
1312
|
+
}
|
|
1313
|
+
const existIndex = this.selectedDomList.findIndex((selectedDom) => selectedDom.id === el.id);
|
|
1314
|
+
if (existIndex !== -1) {
|
|
1315
|
+
this.selectedDomList.splice(existIndex, 1);
|
|
1316
|
+
} else {
|
|
1317
|
+
this.selectedDomList.push(el);
|
|
1318
|
+
}
|
|
1319
|
+
this.multiDr.multiSelect(this.selectedDomList);
|
|
1320
|
+
this.emit("multiSelect", this.selectedDomList);
|
|
1152
1321
|
});
|
|
1153
1322
|
this.dr.on("update", (data) => {
|
|
1154
1323
|
setTimeout(() => this.emit("update", data));
|
|
1155
1324
|
}).on("sort", (data) => {
|
|
1156
1325
|
setTimeout(() => this.emit("sort", data));
|
|
1157
1326
|
});
|
|
1327
|
+
this.multiDr.on("update", (data) => {
|
|
1328
|
+
setTimeout(() => this.emit("update", data));
|
|
1329
|
+
});
|
|
1158
1330
|
}
|
|
1159
1331
|
getElementsFromPoint(event) {
|
|
1160
1332
|
const { renderer, zoom } = this;
|
|
@@ -1170,7 +1342,7 @@ class StageCore extends EventEmitter {
|
|
|
1170
1342
|
}
|
|
1171
1343
|
return doc?.elementsFromPoint(x / zoom, y / zoom);
|
|
1172
1344
|
}
|
|
1173
|
-
async
|
|
1345
|
+
async getElementFromPoint(event, type) {
|
|
1174
1346
|
const els = this.getElementsFromPoint(event);
|
|
1175
1347
|
let stopped = false;
|
|
1176
1348
|
const stop = () => stopped = true;
|
|
@@ -1178,12 +1350,10 @@ class StageCore extends EventEmitter {
|
|
|
1178
1350
|
if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && await this.canSelect(el, event, stop)) {
|
|
1179
1351
|
if (stopped)
|
|
1180
1352
|
break;
|
|
1181
|
-
if (event.type ===
|
|
1182
|
-
|
|
1183
|
-
break;
|
|
1353
|
+
if (event.type === type) {
|
|
1354
|
+
return el;
|
|
1184
1355
|
}
|
|
1185
|
-
|
|
1186
|
-
break;
|
|
1356
|
+
return el;
|
|
1187
1357
|
}
|
|
1188
1358
|
}
|
|
1189
1359
|
}
|
|
@@ -1197,6 +1367,7 @@ class StageCore extends EventEmitter {
|
|
|
1197
1367
|
await runtime.beforeSelect(el);
|
|
1198
1368
|
}
|
|
1199
1369
|
this.mask.setLayout(el);
|
|
1370
|
+
this.multiDr.destroyDragElList();
|
|
1200
1371
|
this.dr.select(el, event);
|
|
1201
1372
|
if (this.config.autoScrollIntoView || el.dataset.autoScrollIntoView) {
|
|
1202
1373
|
this.mask.intersectionObserver?.observe(el);
|
|
@@ -1231,7 +1402,7 @@ class StageCore extends EventEmitter {
|
|
|
1231
1402
|
this.highlightLayer.clearHighlight();
|
|
1232
1403
|
return;
|
|
1233
1404
|
}
|
|
1234
|
-
if (el === this.highlightedDom)
|
|
1405
|
+
if (el === this.highlightedDom || !el)
|
|
1235
1406
|
return;
|
|
1236
1407
|
this.highlightLayer.highlight(el);
|
|
1237
1408
|
this.highlightedDom = el;
|
|
@@ -1248,6 +1419,14 @@ class StageCore extends EventEmitter {
|
|
|
1248
1419
|
setZoom(zoom = DEFAULT_ZOOM) {
|
|
1249
1420
|
this.zoom = zoom;
|
|
1250
1421
|
}
|
|
1422
|
+
clearSelectStatus(selectType) {
|
|
1423
|
+
if (selectType === "multiSelect") {
|
|
1424
|
+
this.multiDr.clearSelectStatus();
|
|
1425
|
+
this.selectedDomList = [];
|
|
1426
|
+
} else {
|
|
1427
|
+
this.dr.clearSelectStatus();
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1251
1430
|
async mount(el) {
|
|
1252
1431
|
this.container = el;
|
|
1253
1432
|
const { mask, renderer } = this;
|
|
@@ -1259,6 +1438,24 @@ class StageCore extends EventEmitter {
|
|
|
1259
1438
|
this.mask.clearGuides();
|
|
1260
1439
|
this.dr.clearGuides();
|
|
1261
1440
|
}
|
|
1441
|
+
async addContainerHighlightClassName(event, exclude) {
|
|
1442
|
+
const els = this.getElementsFromPoint(event);
|
|
1443
|
+
const { renderer } = this;
|
|
1444
|
+
const doc = renderer.contentWindow?.document;
|
|
1445
|
+
if (!doc)
|
|
1446
|
+
return;
|
|
1447
|
+
for (const el of els) {
|
|
1448
|
+
if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && await this.isContainer(el) && !exclude.includes(el)) {
|
|
1449
|
+
addClassName(el, doc, this.containerHighlightClassName);
|
|
1450
|
+
break;
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
getAddContainerHighlightClassNameTimeout(event, exclude = []) {
|
|
1455
|
+
return globalThis.setTimeout(() => {
|
|
1456
|
+
this.addContainerHighlightClassName(event, exclude);
|
|
1457
|
+
}, this.containerHighlightDuration);
|
|
1458
|
+
}
|
|
1262
1459
|
destroy() {
|
|
1263
1460
|
const { mask, renderer, dr, highlightLayer } = this;
|
|
1264
1461
|
renderer.destroy();
|
|
@@ -1279,5 +1476,5 @@ class StageCore extends EventEmitter {
|
|
|
1279
1476
|
}
|
|
1280
1477
|
}
|
|
1281
1478
|
|
|
1282
|
-
export { CONTAINER_HIGHLIGHT_CLASS, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, SELECTED_CLASS, StageDragResize, StageMask, StageRender, ZIndex, addSelectedClassName, calcValueByFontsize, StageCore as default, getAbsolutePosition, getMode, getOffset, getScrollParent, isAbsolute, isFixed, isFixedParent, isRelative, isStatic, removeSelectedClassName };
|
|
1479
|
+
export { CONTAINER_HIGHLIGHT_CLASS, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, PAGE_CLASS, SELECTED_CLASS, StageDragResize, StageMask, StageRender, ZIndex, addSelectedClassName, calcValueByFontsize, StageCore as default, down, getAbsolutePosition, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isRelative, isStatic, removeSelectedClassName, up };
|
|
1283
1480
|
//# sourceMappingURL=tmagic-stage.es.js.map
|