@tmagic/stage 1.8.0-beta.2 → 1.8.0-beta.21
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/es/ActionManager.js +14 -6
- package/dist/es/StageCore.js +19 -4
- package/dist/es/StageFlashHighlight.js +102 -0
- package/dist/es/StageMask.js +2 -2
- package/dist/es/const.js +3 -1
- package/dist/es/index.js +3 -3
- package/dist/es/moveable-able.js +1 -1
- package/dist/es/util.js +28 -1
- package/dist/tmagic-stage.umd.cjs +203 -21
- package/package.json +2 -2
- package/src/ActionManager.ts +20 -8
- package/src/StageCore.ts +29 -5
- package/src/StageFlashHighlight.ts +135 -0
- package/src/StageMask.ts +5 -3
- package/src/const.ts +3 -0
- package/src/moveable-able.css +1 -1
- package/src/types.ts +22 -1
- package/src/util.ts +43 -1
- package/types/index.d.ts +74 -6
package/dist/es/ActionManager.js
CHANGED
|
@@ -35,6 +35,8 @@ var ActionManager = class extends EventEmitter$1 {
|
|
|
35
35
|
containerHighlightDuration;
|
|
36
36
|
/** 将组件加入容器的操作方式 */
|
|
37
37
|
containerHighlightType;
|
|
38
|
+
/** 是否仅在新增组件时才启用将组件加入容器 */
|
|
39
|
+
containerHighlightAddOnly = false;
|
|
38
40
|
isAltKeydown = false;
|
|
39
41
|
getTargetElement;
|
|
40
42
|
getElementsFromPoint;
|
|
@@ -68,6 +70,7 @@ var ActionManager = class extends EventEmitter$1 {
|
|
|
68
70
|
this.containerHighlightClassName = config.containerHighlightClassName || "tmagic-stage-container-highlight";
|
|
69
71
|
this.containerHighlightDuration = config.containerHighlightDuration || defaultContainerHighlightDuration;
|
|
70
72
|
this.containerHighlightType = config.containerHighlightType;
|
|
73
|
+
this.containerHighlightAddOnly = config.containerHighlightAddOnly ?? false;
|
|
71
74
|
this.disabledMultiSelect = config.disabledMultiSelect ?? false;
|
|
72
75
|
this.alwaysMultiSelect = config.alwaysMultiSelect ?? false;
|
|
73
76
|
this.getTargetElement = config.getTargetElement;
|
|
@@ -299,10 +302,11 @@ var ActionManager = class extends EventEmitter$1 {
|
|
|
299
302
|
* 标记的作用:1、高亮容器,给用户一个加入容器的交互感知;2、释放鼠标后,通过标记的标志找到要加入的容器
|
|
300
303
|
* @param event 鼠标事件
|
|
301
304
|
* @param excludeElList 计算鼠标所在容器时要排除的元素列表
|
|
305
|
+
* @param isAdd 当前操作是否为新增组件(从组件列表拖入),开启 containerHighlightAddOnly 时只有新增才会标记
|
|
302
306
|
* @returns timeoutId,调用方在鼠标移走时要取消该timeout,阻止标记
|
|
303
307
|
*/
|
|
304
|
-
delayedMarkContainer(event, excludeElList = []) {
|
|
305
|
-
if (this.canAddToContainer()) return globalThis.setTimeout(() => {
|
|
308
|
+
delayedMarkContainer(event, excludeElList = [], isAdd = false) {
|
|
309
|
+
if (this.canAddToContainer(isAdd)) return globalThis.setTimeout(() => {
|
|
306
310
|
this.addContainerHighlightClassName(event, excludeElList);
|
|
307
311
|
}, this.containerHighlightDuration);
|
|
308
312
|
}
|
|
@@ -421,9 +425,12 @@ var ActionManager = class extends EventEmitter$1 {
|
|
|
421
425
|
} else this.selectedElList.push(el);
|
|
422
426
|
}
|
|
423
427
|
/**
|
|
424
|
-
* 当前状态下能否将组件加入容器,默认是鼠标悬停一段时间加入,alt模式则是按住alt
|
|
428
|
+
* 当前状态下能否将组件加入容器,默认是鼠标悬停一段时间加入,alt模式则是按住alt+鼠标悬停一段时间加入;
|
|
429
|
+
* 开启containerHighlightAddOnly时,画布中拖动已有组件不能加入容器
|
|
430
|
+
* @param isAdd 当前操作是否为新增组件
|
|
425
431
|
*/
|
|
426
|
-
canAddToContainer() {
|
|
432
|
+
canAddToContainer(isAdd = false) {
|
|
433
|
+
if (this.containerHighlightAddOnly && !isAdd) return false;
|
|
427
434
|
return this.containerHighlightType === ContainerHighlightType.DEFAULT || this.containerHighlightType === ContainerHighlightType.ALT && this.isAltKeydown;
|
|
428
435
|
}
|
|
429
436
|
/**
|
|
@@ -432,8 +439,9 @@ var ActionManager = class extends EventEmitter$1 {
|
|
|
432
439
|
*/
|
|
433
440
|
markContainerEnd() {
|
|
434
441
|
const doc = this.getRenderDocument();
|
|
435
|
-
if (doc
|
|
436
|
-
|
|
442
|
+
if (!doc) return null;
|
|
443
|
+
const markedContainer = removeClassNameByClassName(doc, this.containerHighlightClassName);
|
|
444
|
+
return this.canAddToContainer() ? markedContainer : null;
|
|
437
445
|
}
|
|
438
446
|
initMouseEvent() {
|
|
439
447
|
this.container.addEventListener("mousedown", this.mouseDownHandler);
|
package/dist/es/StageCore.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import "./const.js";
|
|
2
2
|
import ActionManager from "./ActionManager.js";
|
|
3
|
+
import StageFlashHighlight from "./StageFlashHighlight.js";
|
|
3
4
|
import StageMask from "./StageMask.js";
|
|
4
5
|
import StageRender from "./StageRender.js";
|
|
5
6
|
import { EventEmitter } from "events";
|
|
@@ -13,13 +14,17 @@ var StageCore = class extends EventEmitter {
|
|
|
13
14
|
renderer = null;
|
|
14
15
|
mask = null;
|
|
15
16
|
actionManager = null;
|
|
17
|
+
flashHighlight = null;
|
|
16
18
|
pageResizeObserver = null;
|
|
17
19
|
autoScrollIntoView;
|
|
18
20
|
customizedRender;
|
|
21
|
+
/** 非点击画布选中组件时,是否对选中区域做高亮闪烁提示,默认开启 */
|
|
22
|
+
disabledFlashTip;
|
|
19
23
|
constructor(config) {
|
|
20
24
|
super();
|
|
21
25
|
this.autoScrollIntoView = config.autoScrollIntoView;
|
|
22
26
|
this.customizedRender = config.render;
|
|
27
|
+
this.disabledFlashTip = config.disabledFlashTip ?? false;
|
|
23
28
|
this.renderer = new StageRender({
|
|
24
29
|
runtimeUrl: config.runtimeUrl,
|
|
25
30
|
zoom: config.zoom,
|
|
@@ -34,6 +39,10 @@ var StageCore = class extends EventEmitter {
|
|
|
34
39
|
disabledRule: config.disabledRule
|
|
35
40
|
});
|
|
36
41
|
this.actionManager = new ActionManager(this.getActionManagerConfig(config));
|
|
42
|
+
this.flashHighlight = new StageFlashHighlight({
|
|
43
|
+
container: this.mask.content,
|
|
44
|
+
updateDragEl: config.updateDragEl
|
|
45
|
+
});
|
|
37
46
|
this.initRenderEvent();
|
|
38
47
|
this.initActionEvent();
|
|
39
48
|
this.initMaskEvent();
|
|
@@ -42,7 +51,7 @@ var StageCore = class extends EventEmitter {
|
|
|
42
51
|
* 单选选中元素
|
|
43
52
|
* @param id 选中的id
|
|
44
53
|
*/
|
|
45
|
-
async select(id, event) {
|
|
54
|
+
async select(id, event, options = {}) {
|
|
46
55
|
if (!this.renderer) return;
|
|
47
56
|
let el = this.renderer.getTargetElement(id) || null;
|
|
48
57
|
if (!el) el = await new Promise((resolve) => {
|
|
@@ -73,6 +82,8 @@ var StageCore = class extends EventEmitter {
|
|
|
73
82
|
if (el) this.mask?.setLayout(el);
|
|
74
83
|
this.actionManager?.select(el, event);
|
|
75
84
|
if (el && (this.autoScrollIntoView || el.dataset.autoScrollIntoView)) this.mask?.observerIntersection(el);
|
|
85
|
+
const isPage = el === this.mask?.page || el?.className.includes("magic-ui-page");
|
|
86
|
+
if (el && !event && options.flash !== false && !this.disabledFlashTip && !isPage) this.flashHighlight?.flash(el);
|
|
76
87
|
}
|
|
77
88
|
/**
|
|
78
89
|
* 多选选中多个元素
|
|
@@ -160,10 +171,11 @@ var StageCore = class extends EventEmitter {
|
|
|
160
171
|
* 标记的作用:1、高亮容器,给用户一个加入容器的交互感知;2、释放鼠标后,通过标记的标志找到要加入的容器
|
|
161
172
|
* @param event 鼠标事件
|
|
162
173
|
* @param excludeElList 计算鼠标所在容器时要排除的元素列表
|
|
174
|
+
* @param isAdd 当前操作是否为新增组件(从组件列表拖入),开启 containerHighlightAddOnly 时只有新增才会标记
|
|
163
175
|
* @returns timeoutId,调用方在鼠标移走时要取消该timeout,阻止标记
|
|
164
176
|
*/
|
|
165
|
-
delayedMarkContainer(event, excludeElList = []) {
|
|
166
|
-
return this.actionManager?.delayedMarkContainer(event, excludeElList);
|
|
177
|
+
delayedMarkContainer(event, excludeElList = [], isAdd = false) {
|
|
178
|
+
return this.actionManager?.delayedMarkContainer(event, excludeElList, isAdd);
|
|
167
179
|
}
|
|
168
180
|
getMoveableOption(key) {
|
|
169
181
|
return this.actionManager?.getMoveableOption(key);
|
|
@@ -198,16 +210,18 @@ var StageCore = class extends EventEmitter {
|
|
|
198
210
|
* 销毁实例
|
|
199
211
|
*/
|
|
200
212
|
destroy() {
|
|
201
|
-
const { mask, renderer, actionManager, pageResizeObserver } = this;
|
|
213
|
+
const { mask, renderer, actionManager, flashHighlight, pageResizeObserver } = this;
|
|
202
214
|
renderer?.destroy();
|
|
203
215
|
mask?.destroy();
|
|
204
216
|
actionManager?.destroy();
|
|
217
|
+
flashHighlight?.destroy();
|
|
205
218
|
pageResizeObserver?.disconnect();
|
|
206
219
|
this.removeAllListeners();
|
|
207
220
|
this.container = void 0;
|
|
208
221
|
this.renderer = null;
|
|
209
222
|
this.mask = null;
|
|
210
223
|
this.actionManager = null;
|
|
224
|
+
this.flashHighlight = null;
|
|
211
225
|
this.pageResizeObserver = null;
|
|
212
226
|
}
|
|
213
227
|
on(eventName, listener) {
|
|
@@ -234,6 +248,7 @@ var StageCore = class extends EventEmitter {
|
|
|
234
248
|
containerHighlightClassName: config.containerHighlightClassName,
|
|
235
249
|
containerHighlightDuration: config.containerHighlightDuration,
|
|
236
250
|
containerHighlightType: config.containerHighlightType,
|
|
251
|
+
containerHighlightAddOnly: config.containerHighlightAddOnly,
|
|
237
252
|
moveableOptions: config.moveableOptions,
|
|
238
253
|
container: this.mask.content,
|
|
239
254
|
disabledDragStart: config.disabledDragStart,
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { FLASH_EL_ID_PREFIX, ZIndex } from "./const.js";
|
|
2
|
+
import TargetShadow from "./TargetShadow.js";
|
|
3
|
+
import { getDocument, injectStyle } from "@tmagic/core";
|
|
4
|
+
//#region packages/stage/src/StageFlashHighlight.ts
|
|
5
|
+
/** 闪烁提示节点的 class name */
|
|
6
|
+
var FLASH_TIP_CLASS_NAME = "tmagic-stage-flash-tip";
|
|
7
|
+
/** 闪烁动画名称 */
|
|
8
|
+
var FLASH_ANIMATION_NAME = "tmagic-stage-flash";
|
|
9
|
+
/** 闪烁动画时长(ms) */
|
|
10
|
+
var FLASH_DURATION = 1500;
|
|
11
|
+
/**
|
|
12
|
+
* 选中区域闪烁提示
|
|
13
|
+
* @description 当组件不是通过点击画布选中(如从图层树、面包屑等外部选中)时,在画布上对选中区域做一次高亮闪烁,
|
|
14
|
+
* 帮助用户快速定位组件在画布中的位置。
|
|
15
|
+
*/
|
|
16
|
+
var StageFlashHighlight = class {
|
|
17
|
+
/** 复用 TargetShadow 负责节点的定位校准(updateDragEl、fixed、滚动偏移等) */
|
|
18
|
+
targetShadow;
|
|
19
|
+
timer;
|
|
20
|
+
styleEl;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.targetShadow = new TargetShadow({
|
|
23
|
+
container: config.container,
|
|
24
|
+
updateDragEl: config.updateDragEl,
|
|
25
|
+
zIndex: ZIndex.SELECTED_EL,
|
|
26
|
+
idPrefix: FLASH_EL_ID_PREFIX
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 在目标元素所在区域做一次高亮闪烁
|
|
31
|
+
* @param el 选中组件的Dom节点元素
|
|
32
|
+
*/
|
|
33
|
+
flash(el) {
|
|
34
|
+
if (!el) return;
|
|
35
|
+
this.injectStyle();
|
|
36
|
+
this.clear();
|
|
37
|
+
const flashEl = this.targetShadow.update(el);
|
|
38
|
+
flashEl.classList.add(FLASH_TIP_CLASS_NAME);
|
|
39
|
+
flashEl.style.boxSizing = "border-box";
|
|
40
|
+
flashEl.style.pointerEvents = "none";
|
|
41
|
+
flashEl.style.border = "";
|
|
42
|
+
this.timer = globalThis.setTimeout(() => {
|
|
43
|
+
this.clear();
|
|
44
|
+
}, FLASH_DURATION);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 清除闪烁节点
|
|
48
|
+
*/
|
|
49
|
+
clear() {
|
|
50
|
+
if (this.timer) {
|
|
51
|
+
globalThis.clearTimeout(this.timer);
|
|
52
|
+
this.timer = void 0;
|
|
53
|
+
}
|
|
54
|
+
this.targetShadow.destroyEl();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 销毁实例
|
|
58
|
+
*/
|
|
59
|
+
destroy() {
|
|
60
|
+
this.clear();
|
|
61
|
+
this.targetShadow.destroy();
|
|
62
|
+
this.styleEl?.remove();
|
|
63
|
+
this.styleEl = void 0;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 注入闪烁动画样式(仅注入一次)
|
|
67
|
+
*/
|
|
68
|
+
injectStyle() {
|
|
69
|
+
if (this.styleEl) return;
|
|
70
|
+
this.styleEl = injectStyle(getDocument(), `
|
|
71
|
+
@keyframes ${FLASH_ANIMATION_NAME} {
|
|
72
|
+
0% {
|
|
73
|
+
opacity: 0;
|
|
74
|
+
background-color: rgba(146, 84, 222, 0);
|
|
75
|
+
}
|
|
76
|
+
20% {
|
|
77
|
+
opacity: 1;
|
|
78
|
+
background-color: rgba(146, 84, 222, 0.7);
|
|
79
|
+
}
|
|
80
|
+
45% {
|
|
81
|
+
opacity: 0.6;
|
|
82
|
+
background-color: rgba(146, 84, 222, 0.4);
|
|
83
|
+
}
|
|
84
|
+
70% {
|
|
85
|
+
opacity: 1;
|
|
86
|
+
background-color: rgba(146, 84, 222, 0.7);
|
|
87
|
+
}
|
|
88
|
+
100% {
|
|
89
|
+
opacity: 0;
|
|
90
|
+
background-color: rgba(146, 84, 222, 0);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
.${FLASH_TIP_CLASS_NAME} {
|
|
94
|
+
border: 2px solid #9254de;
|
|
95
|
+
border-radius: 2px;
|
|
96
|
+
animation: ${FLASH_ANIMATION_NAME} ${FLASH_DURATION}ms cubic-bezier(0.4, 0, 0.2, 1) both;
|
|
97
|
+
}
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
//#endregion
|
|
102
|
+
export { FLASH_TIP_CLASS_NAME, StageFlashHighlight as default };
|
package/dist/es/StageMask.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Mode, ZIndex } from "./const.js";
|
|
2
|
-
import { getScrollParent, isFixedParent } from "./util.js";
|
|
2
|
+
import { getScrollParent, isFixedParent, scrollElementIntoView } from "./util.js";
|
|
3
3
|
import Rule from "./Rule.js";
|
|
4
4
|
import { createDiv, getDocument, injectStyle } from "@tmagic/core";
|
|
5
5
|
//#region packages/stage/src/StageMask.ts
|
|
@@ -118,8 +118,8 @@ var StageMask = class extends Rule {
|
|
|
118
118
|
this.scrollIntoView(scrollParent);
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
|
-
el.scrollIntoView();
|
|
122
121
|
if (!this.pageScrollParent) return;
|
|
122
|
+
scrollElementIntoView(el, this.pageScrollParent);
|
|
123
123
|
this.scrollLeft = this.pageScrollParent.scrollLeft;
|
|
124
124
|
this.scrollTop = this.pageScrollParent.scrollTop;
|
|
125
125
|
this.scroll();
|
package/dist/es/const.js
CHANGED
|
@@ -5,6 +5,8 @@ var GHOST_EL_ID_PREFIX = "ghost_el_";
|
|
|
5
5
|
var DRAG_EL_ID_PREFIX = "drag_el_";
|
|
6
6
|
/** 高亮时需要在蒙层中创建一个占位节点,该节点的id前缀 */
|
|
7
7
|
var HIGHLIGHT_EL_ID_PREFIX = "highlight_el_";
|
|
8
|
+
/** 闪烁提示时需要在蒙层中创建一个占位节点,该节点的id前缀 */
|
|
9
|
+
var FLASH_EL_ID_PREFIX = "flash_el_";
|
|
8
10
|
var CONTAINER_HIGHLIGHT_CLASS_NAME = "tmagic-stage-container-highlight";
|
|
9
11
|
var PAGE_CLASS = "magic-ui-page";
|
|
10
12
|
/** 默认放到缩小倍数 */
|
|
@@ -88,4 +90,4 @@ var StageDragStatus = /* @__PURE__ */ function(StageDragStatus) {
|
|
|
88
90
|
return StageDragStatus;
|
|
89
91
|
}({});
|
|
90
92
|
//#endregion
|
|
91
|
-
export { AbleActionEventType, CONTAINER_HIGHLIGHT_CLASS_NAME, ContainerHighlightType, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, PAGE_CLASS, RenderType, SELECTED_CLASS, SelectStatus, StageDragStatus, ZIndex };
|
|
93
|
+
export { AbleActionEventType, CONTAINER_HIGHLIGHT_CLASS_NAME, ContainerHighlightType, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, FLASH_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, PAGE_CLASS, RenderType, SELECTED_CLASS, SelectStatus, StageDragStatus, ZIndex };
|
package/dist/es/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AbleActionEventType, CONTAINER_HIGHLIGHT_CLASS_NAME, ContainerHighlightType, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, PAGE_CLASS, RenderType, SELECTED_CLASS, SelectStatus, StageDragStatus, ZIndex } from "./const.js";
|
|
2
|
-
import { addSelectedClassName, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, up } from "./util.js";
|
|
1
|
+
import { AbleActionEventType, CONTAINER_HIGHLIGHT_CLASS_NAME, ContainerHighlightType, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, FLASH_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, PAGE_CLASS, RenderType, SELECTED_CLASS, SelectStatus, StageDragStatus, ZIndex } from "./const.js";
|
|
2
|
+
import { addSelectedClassName, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, scrollElementIntoView, up } from "./util.js";
|
|
3
3
|
import MoveableActionsAble_default from "./MoveableActionsAble.js";
|
|
4
4
|
import StageDragResize from "./StageDragResize.js";
|
|
5
5
|
import StageMask from "./StageMask.js";
|
|
@@ -9,4 +9,4 @@ export * from "moveable";
|
|
|
9
9
|
//#region packages/stage/src/index.ts
|
|
10
10
|
var src_default = StageCore;
|
|
11
11
|
//#endregion
|
|
12
|
-
export { AbleActionEventType, CONTAINER_HIGHLIGHT_CLASS_NAME, ContainerHighlightType, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, MoveableActionsAble_default as MoveableActionsAble, PAGE_CLASS, RenderType, SELECTED_CLASS, SelectStatus, StageDragResize, StageDragStatus, StageMask, StageRender, ZIndex, addSelectedClassName, src_default as default, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, up };
|
|
12
|
+
export { AbleActionEventType, CONTAINER_HIGHLIGHT_CLASS_NAME, ContainerHighlightType, DEFAULT_ZOOM, DRAG_EL_ID_PREFIX, FLASH_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, HIGHLIGHT_EL_ID_PREFIX, Mode, MouseButton, MoveableActionsAble_default as MoveableActionsAble, PAGE_CLASS, RenderType, SELECTED_CLASS, SelectStatus, StageDragResize, StageDragStatus, StageMask, StageRender, ZIndex, addSelectedClassName, src_default as default, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, scrollElementIntoView, up };
|
package/dist/es/moveable-able.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
//#region packages/stage/src/moveable-able.css?raw
|
|
2
|
-
var moveable_able_default = ".moveable-button {\n width: 20px;\n height: 20px;\n background:
|
|
2
|
+
var moveable_able_default = ".moveable-button {\n width: 20px;\n height: 20px;\n background: var(--el-color-primary,#4af);\n border-radius: 4px;\n appearance: none;\n border: 0;\n color: white;\n font-size: 12px;\n font-weight: bold;\n margin-left: 2px;\n position: relative;\n cursor: pointer;\n}\n.moveable-remove-button:before, .moveable-remove-button:after {\n content: \"\";\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n width: 14px;\n height: 2px;\n background: #fff;\n border-radius: 1px;\n cursor: pointer;\n}\n.moveable-remove-button:after {\n transform: translate(-50%, -50%) rotate(-45deg);\n}\n\n.moveable-select-parent-arrow-top-icon {\n transform: rotateZ(-45deg);\n width: 4px;\n height: 4px;\n border-color: #fff;\n border-width: 2px 2px 0 0;\n border-style: solid;\n position: absolute;\n left: 4px;\n top: 4px;\n}\n\n.moveable-select-parent-arrow-body-icon {\n width: 7px;\n height: 11px;\n border-color: #fff;\n border-width: 0 0 2px 2px;\n border-style: solid;\n}\n\n.moveable-drag-area-button {\n cursor: move;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon {\n width: 2px;\n height: 2px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-top {\n transform: rotateZ(-45deg) translateX(-50%);\n left: 50%;\n top: 3px;\n transform-origin: left;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-bottom {\n transform: rotateZ(135deg) translateX(-50%);\n transform-origin: left;\n left: 50%;\n top: auto;\n bottom: 3px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-right {\n transform: rotateZ(45deg) translateY(-50%);\n transform-origin: top;\n right: 3px;\n left: auto;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-top-icon-left {\n transform: rotateZ(235deg) translateY(-50%);\n transform-origin: top;\n left: 3px;\n top: 50%;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-horizontal {\n width: 2px;\n height: 11px;\n background-color: #fff;\n position: absolute;\n transform: translateX(-50%);\n left: 50%;\n top: 4px;\n}\n\n.moveable-drag-area-button .moveable-select-parent-arrow-body-icon-vertical {\n width: 11px;\n height: 2px;\n background-color: #fff;\n position: absolute;\n transform: translateY(-50%);\n left: 4px;\n top: 50%;;\n}\n\n.moveable-rerender-button img {\n position: absolute;\n left: 2px;\n top: 2px;\n}\n";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { moveable_able_default as default };
|
package/dist/es/util.js
CHANGED
|
@@ -91,6 +91,33 @@ var getScrollParent = (element, includeHidden = false) => {
|
|
|
91
91
|
}
|
|
92
92
|
return null;
|
|
93
93
|
};
|
|
94
|
+
/**
|
|
95
|
+
* 将元素滚动到指定滚动容器的可视区域内(仅垂直方向,滚动最小距离)
|
|
96
|
+
* @description 与原生 scrollIntoView 不同,只滚动指定的容器自身,不会连带滚动外层祖先滚动容器,
|
|
97
|
+
* 避免编辑器画布外层容器(如 stage 外层使用 transform 模拟滚动的容器)被浏览器自动滚动导致整个画布位移
|
|
98
|
+
* @param el 目标元素
|
|
99
|
+
* @param container 滚动容器
|
|
100
|
+
*/
|
|
101
|
+
var scrollElementIntoView = (el, container) => {
|
|
102
|
+
const { ownerDocument } = container;
|
|
103
|
+
const win = ownerDocument?.defaultView;
|
|
104
|
+
if (!ownerDocument || !win) return;
|
|
105
|
+
const elRect = el.getBoundingClientRect();
|
|
106
|
+
let viewTop = 0;
|
|
107
|
+
let viewHeight = 0;
|
|
108
|
+
if (container === ownerDocument.documentElement || container === ownerDocument.body) {
|
|
109
|
+
viewTop = 0;
|
|
110
|
+
viewHeight = win.innerHeight;
|
|
111
|
+
} else {
|
|
112
|
+
viewTop = container.getBoundingClientRect().top + container.clientTop;
|
|
113
|
+
viewHeight = container.clientHeight;
|
|
114
|
+
}
|
|
115
|
+
const viewBottom = viewTop + viewHeight;
|
|
116
|
+
let delta = 0;
|
|
117
|
+
if (elRect.top < viewTop) delta = elRect.top - viewTop;
|
|
118
|
+
else if (elRect.bottom > viewBottom) delta = Math.min(elRect.bottom - viewBottom, elRect.top - viewTop);
|
|
119
|
+
if (delta !== 0) container.scrollTop += delta;
|
|
120
|
+
};
|
|
94
121
|
var removeSelectedClassName = (doc) => {
|
|
95
122
|
const oldEl = doc.querySelector(`.${SELECTED_CLASS}`);
|
|
96
123
|
if (oldEl) {
|
|
@@ -189,4 +216,4 @@ var getBorderWidth = (el) => {
|
|
|
189
216
|
};
|
|
190
217
|
};
|
|
191
218
|
//#endregion
|
|
192
|
-
export { addSelectedClassName, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, up };
|
|
219
|
+
export { addSelectedClassName, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, scrollElementIntoView, up };
|