@tmagic/stage 1.7.7 → 1.7.8-beta.2

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.
@@ -0,0 +1,91 @@
1
+ //#region packages/stage/src/const.ts
2
+ /** 流式布局下拖动时需要clone一个镜像节点,镜像节点的id前缀 */
3
+ var GHOST_EL_ID_PREFIX = "ghost_el_";
4
+ /** 拖动的时候需要在蒙层中创建一个占位节点,该节点的id前缀 */
5
+ var DRAG_EL_ID_PREFIX = "drag_el_";
6
+ /** 高亮时需要在蒙层中创建一个占位节点,该节点的id前缀 */
7
+ var HIGHLIGHT_EL_ID_PREFIX = "highlight_el_";
8
+ var CONTAINER_HIGHLIGHT_CLASS_NAME = "tmagic-stage-container-highlight";
9
+ var PAGE_CLASS = "magic-ui-page";
10
+ /** 默认放到缩小倍数 */
11
+ var DEFAULT_ZOOM = 1;
12
+ /** 参考线类型 */
13
+ var GuidesType = /* @__PURE__ */ function(GuidesType) {
14
+ /** 水平 */
15
+ GuidesType["HORIZONTAL"] = "horizontal";
16
+ /** 垂直 */
17
+ GuidesType["VERTICAL"] = "vertical";
18
+ return GuidesType;
19
+ }({});
20
+ /** css z-index */
21
+ var ZIndex = /* @__PURE__ */ function(ZIndex) {
22
+ /** 蒙层,用于监听用户操作,需要置于顶层 */
23
+ ZIndex["MASK"] = "99999";
24
+ /** 选中的节点 */
25
+ ZIndex["SELECTED_EL"] = "666";
26
+ ZIndex["GHOST_EL"] = "700";
27
+ ZIndex["DRAG_EL"] = "9";
28
+ ZIndex["HIGHLIGHT_EL"] = "8";
29
+ return ZIndex;
30
+ }({});
31
+ /** 鼠标按键 */
32
+ var MouseButton = /* @__PURE__ */ function(MouseButton) {
33
+ /** 左键 */
34
+ MouseButton[MouseButton["LEFT"] = 0] = "LEFT";
35
+ /** z中健 */
36
+ MouseButton[MouseButton["MIDDLE"] = 1] = "MIDDLE";
37
+ /** 右键 */
38
+ MouseButton[MouseButton["RIGHT"] = 2] = "RIGHT";
39
+ return MouseButton;
40
+ }({});
41
+ /** 布局方式 */
42
+ var Mode = /* @__PURE__ */ function(Mode) {
43
+ /** 绝对定位布局 */
44
+ Mode["ABSOLUTE"] = "absolute";
45
+ /** 固定定位布局 */
46
+ Mode["FIXED"] = "fixed";
47
+ /** 流式布局 */
48
+ Mode["SORTABLE"] = "sortable";
49
+ return Mode;
50
+ }({});
51
+ /** 选中节点的class name */
52
+ var SELECTED_CLASS = "tmagic-stage-selected-area";
53
+ var AbleActionEventType = /* @__PURE__ */ function(AbleActionEventType) {
54
+ AbleActionEventType["SELECT_PARENT"] = "select-parent";
55
+ AbleActionEventType["REMOVE"] = "remove";
56
+ AbleActionEventType["RERENDER"] = "rerender";
57
+ return AbleActionEventType;
58
+ }({});
59
+ /** 将组件添加到容器的方式 */
60
+ var ContainerHighlightType = /* @__PURE__ */ function(ContainerHighlightType) {
61
+ /** 默认方式:组件在容器上方悬停一段时间后加入 */
62
+ ContainerHighlightType["DEFAULT"] = "default";
63
+ /** 按住alt键,并在容器上方悬停一段时间后加入 */
64
+ ContainerHighlightType["ALT"] = "alt";
65
+ return ContainerHighlightType;
66
+ }({});
67
+ var RenderType = /* @__PURE__ */ function(RenderType) {
68
+ RenderType["IFRAME"] = "iframe";
69
+ RenderType["NATIVE"] = "native";
70
+ return RenderType;
71
+ }({});
72
+ /** 选择状态 */
73
+ var SelectStatus = /* @__PURE__ */ function(SelectStatus) {
74
+ /** 单选 */
75
+ SelectStatus["SELECT"] = "select";
76
+ /** 多选 */
77
+ SelectStatus["MULTI_SELECT"] = "multiSelect";
78
+ return SelectStatus;
79
+ }({});
80
+ /** 拖动状态 */
81
+ var StageDragStatus = /* @__PURE__ */ function(StageDragStatus) {
82
+ /** 开始拖动 */
83
+ StageDragStatus["START"] = "start";
84
+ /** 拖动中 */
85
+ StageDragStatus["ING"] = "ing";
86
+ /** 拖动结束 */
87
+ StageDragStatus["END"] = "end";
88
+ return StageDragStatus;
89
+ }({});
90
+ //#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 };
@@ -0,0 +1,12 @@
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";
3
+ import MoveableActionsAble_default from "./MoveableActionsAble.js";
4
+ import StageDragResize from "./StageDragResize.js";
5
+ import StageMask from "./StageMask.js";
6
+ import StageRender from "./StageRender.js";
7
+ import StageCore from "./StageCore.js";
8
+ export * from "moveable";
9
+ //#region packages/stage/src/index.ts
10
+ var src_default = StageCore;
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 };
@@ -0,0 +1,4 @@
1
+ //#region packages/stage/src/moveable-able.css?raw
2
+ var moveable_able_default = ".moveable-button {\n width: 20px;\n height: 20px;\n background: #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
+ //#endregion
4
+ export { moveable_able_default as default };
@@ -0,0 +1,4 @@
1
+ //#region packages/stage/src/style.css?raw
2
+ var style_default = ".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 pointer-events: none;\n}\n\n.magic-ui-container.magic-layout-relative {\n min-height: 50px;\n}\n";
3
+ //#endregion
4
+ export { style_default as default };
@@ -0,0 +1,192 @@
1
+ import { GHOST_EL_ID_PREFIX, Mode, SELECTED_CLASS } from "./const.js";
2
+ import { getIdFromEl, removeClassName } from "@tmagic/core";
3
+ //#region packages/stage/src/util.ts
4
+ var getParents = (el, relative) => {
5
+ let cur = el.parentElement;
6
+ const parents = [];
7
+ while (cur && cur !== relative) {
8
+ parents.push(cur);
9
+ cur = cur.parentElement;
10
+ }
11
+ return parents;
12
+ };
13
+ var getOffset = (el) => {
14
+ const htmlEl = el;
15
+ const { offsetParent } = htmlEl;
16
+ const left = htmlEl.offsetLeft || 0;
17
+ const top = htmlEl.offsetTop || 0;
18
+ if (offsetParent) {
19
+ const parentOffset = getOffset(offsetParent);
20
+ return {
21
+ left: left + parentOffset.left,
22
+ top: top + parentOffset.top
23
+ };
24
+ }
25
+ return {
26
+ left,
27
+ top
28
+ };
29
+ };
30
+ var getTargetElStyle = (el, zIndex) => {
31
+ const offset = getOffset(el);
32
+ const { transform, border } = getComputedStyle(el);
33
+ return `
34
+ position: absolute;
35
+ transform: ${transform};
36
+ left: ${offset.left}px;
37
+ top: ${offset.top}px;
38
+ width: ${el.clientWidth}px;
39
+ height: ${el.clientHeight}px;
40
+ border: ${border};
41
+ opacity: 0;
42
+ ${typeof zIndex !== "undefined" ? `z-index: ${zIndex};` : ""}
43
+ `;
44
+ };
45
+ var getAbsolutePosition = (el, { top, left }) => {
46
+ const { offsetParent } = el;
47
+ if (offsetParent) {
48
+ const parentOffset = getOffset(offsetParent);
49
+ return {
50
+ left: left - parentOffset.left,
51
+ top: top - parentOffset.top
52
+ };
53
+ }
54
+ return {
55
+ left,
56
+ top
57
+ };
58
+ };
59
+ var isAbsolute = (style) => style.position === "absolute";
60
+ var isRelative = (style) => style.position === "relative";
61
+ var isStatic = (style) => style.position === "static";
62
+ var isFixed = (style) => style.position === "fixed";
63
+ var isFixedParent = (el) => {
64
+ let fixed = false;
65
+ let dom = el;
66
+ while (dom) {
67
+ fixed = isFixed(getComputedStyle(dom));
68
+ if (fixed) break;
69
+ const { parentElement } = dom;
70
+ if (!parentElement || parentElement.tagName === "BODY") break;
71
+ dom = parentElement;
72
+ }
73
+ return fixed;
74
+ };
75
+ var getMode = (el) => {
76
+ if (isFixedParent(el)) return Mode.FIXED;
77
+ const style = getComputedStyle(el);
78
+ if (isStatic(style) || isRelative(style)) return Mode.SORTABLE;
79
+ return Mode.ABSOLUTE;
80
+ };
81
+ var getScrollParent = (element, includeHidden = false) => {
82
+ let style = getComputedStyle(element);
83
+ const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;
84
+ if (isFixed(style)) return null;
85
+ for (let parent = element; parent.parentElement;) {
86
+ parent = parent.parentElement;
87
+ if (parent.tagName === "HTML") return parent;
88
+ style = getComputedStyle(parent);
89
+ if (isAbsolute(style) && isStatic(style)) continue;
90
+ if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;
91
+ }
92
+ return null;
93
+ };
94
+ var removeSelectedClassName = (doc) => {
95
+ const oldEl = doc.querySelector(`.${SELECTED_CLASS}`);
96
+ if (oldEl) {
97
+ removeClassName(oldEl, SELECTED_CLASS);
98
+ if (oldEl.parentNode) removeClassName(oldEl.parentNode, `${SELECTED_CLASS}-parent`);
99
+ doc.querySelectorAll(`.${SELECTED_CLASS}-parents`).forEach((item) => {
100
+ removeClassName(item, `${SELECTED_CLASS}-parents`);
101
+ });
102
+ }
103
+ };
104
+ var addSelectedClassName = (el, doc) => {
105
+ el.classList.add(SELECTED_CLASS);
106
+ el.parentNode?.classList.add(`${SELECTED_CLASS}-parent`);
107
+ getParents(el, doc.body).forEach((item) => {
108
+ item.classList.add(`${SELECTED_CLASS}-parents`);
109
+ });
110
+ };
111
+ /**
112
+ * 下移组件位置
113
+ * @param {number} deltaTop 偏移量
114
+ * @param {Object} detail 当前选中的组件配置
115
+ */
116
+ var down = (deltaTop, target) => {
117
+ let swapIndex = 0;
118
+ let addUpH = target.clientHeight;
119
+ const brothers = Array.from(target.parentNode?.children || []).filter((child) => !getIdFromEl()(child)?.startsWith(GHOST_EL_ID_PREFIX));
120
+ const index = brothers.indexOf(target);
121
+ const downEls = brothers.slice(index + 1);
122
+ for (let i = 0; i < downEls.length; i++) {
123
+ const ele = downEls[i];
124
+ if (ele.style?.position === "fixed") continue;
125
+ addUpH += ele.clientHeight / 2;
126
+ if (deltaTop <= addUpH) break;
127
+ addUpH += ele.clientHeight / 2;
128
+ swapIndex = i;
129
+ }
130
+ const src = getIdFromEl()(target) || "";
131
+ return {
132
+ src,
133
+ dist: downEls.length && swapIndex > -1 ? getIdFromEl()(downEls[swapIndex]) || "" : src
134
+ };
135
+ };
136
+ /**
137
+ * 上移组件位置
138
+ * @param {Array} brothers 处于同一容器下的所有子组件配置
139
+ * @param {number} index 当前组件所处的位置
140
+ * @param {number} deltaTop 偏移量
141
+ * @param {Object} detail 当前选中的组件配置
142
+ */
143
+ var up = (deltaTop, target) => {
144
+ const brothers = Array.from(target.parentNode?.children || []).filter((child) => !getIdFromEl()(child)?.startsWith(GHOST_EL_ID_PREFIX));
145
+ const index = brothers.indexOf(target);
146
+ const upEls = brothers.slice(0, index);
147
+ let addUpH = target.clientHeight;
148
+ let swapIndex = upEls.length - 1;
149
+ for (let i = upEls.length - 1; i >= 0; i--) {
150
+ const ele = upEls[i];
151
+ if (!ele) continue;
152
+ if (ele.style.position === "fixed") continue;
153
+ addUpH += ele.clientHeight / 2;
154
+ if (-deltaTop <= addUpH) break;
155
+ addUpH += ele.clientHeight / 2;
156
+ swapIndex = i;
157
+ }
158
+ const src = getIdFromEl()(target) || "";
159
+ return {
160
+ src,
161
+ dist: upEls.length && swapIndex > -1 ? getIdFromEl()(upEls[swapIndex]) || "" : src
162
+ };
163
+ };
164
+ var isMoveableButton = (target) => target.classList.contains("moveable-button") || target.parentElement?.classList.contains("moveable-button");
165
+ var getMarginValue = (el) => {
166
+ if (!el) return {
167
+ marginLeft: 0,
168
+ marginTop: 0
169
+ };
170
+ const { marginLeft, marginTop } = getComputedStyle(el);
171
+ return {
172
+ marginLeft: parseFloat(marginLeft) || 0,
173
+ marginTop: parseFloat(marginTop) || 0
174
+ };
175
+ };
176
+ var getBorderWidth = (el) => {
177
+ if (!el) return {
178
+ borderLeftWidth: 0,
179
+ borderRightWidth: 0,
180
+ borderTopWidth: 0,
181
+ borderBottomWidth: 0
182
+ };
183
+ const { borderLeftWidth, borderRightWidth, borderTopWidth, borderBottomWidth } = getComputedStyle(el);
184
+ return {
185
+ borderLeftWidth: parseFloat(borderLeftWidth) || 0,
186
+ borderRightWidth: parseFloat(borderRightWidth) || 0,
187
+ borderTopWidth: parseFloat(borderTopWidth) || 0,
188
+ borderBottomWidth: parseFloat(borderBottomWidth) || 0
189
+ };
190
+ };
191
+ //#endregion
192
+ export { addSelectedClassName, down, getAbsolutePosition, getBorderWidth, getMarginValue, getMode, getOffset, getScrollParent, getTargetElStyle, isAbsolute, isFixed, isFixedParent, isMoveableButton, isRelative, isStatic, removeSelectedClassName, up };