@tmagic/stage 1.3.10 → 1.3.11
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.js +10 -4
- package/dist/tmagic-stage.umd.cjs +9 -3
- package/package.json +4 -4
- package/src/ActionManager.ts +6 -0
- package/src/StageCore.ts +4 -1
- package/src/TargetShadow.ts +4 -2
- package/types/ActionManager.d.ts +1 -0
- package/types/StageCore.d.ts +2 -1
- package/dist/tmagic-stage.js.map +0 -1
- package/dist/tmagic-stage.umd.cjs.map +0 -1
package/dist/tmagic-stage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tmagic-stage.js","sources":["../src/const.ts","../src/util.ts","../src/TargetShadow.ts","../src/DragResizeHelper.ts","../src/moveable-able.css?raw","../src/MoveableActionsAble.ts","../src/MoveableOptionsManager.ts","../src/types.ts","../src/StageDragResize.ts","../src/StageHighlight.ts","../src/StageMultiDragResize.ts","../src/ActionManager.ts","../src/Rule.ts","../src/StageMask.ts","../src/style.css?raw","../src/StageRender.ts","../src/StageCore.ts"],"sourcesContent":["/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** 流式布局下拖动时需要clone一个镜像节点,镜像节点的id前缀 */\nexport const GHOST_EL_ID_PREFIX = 'ghost_el_';\n\n/** 拖动的时候需要在蒙层中创建一个占位节点,该节点的id前缀 */\nexport const DRAG_EL_ID_PREFIX = 'drag_el_';\n\n/** 高亮时需要在蒙层中创建一个占位节点,该节点的id前缀 */\nexport const HIGHLIGHT_EL_ID_PREFIX = 'highlight_el_';\n\nexport const CONTAINER_HIGHLIGHT_CLASS_NAME = 'tmagic-stage-container-highlight';\n\nexport const PAGE_CLASS = 'magic-ui-page';\n\n/** 默认放到缩小倍数 */\nexport const DEFAULT_ZOOM = 1;\n\n/** 参考线类型 */\nexport enum GuidesType {\n /** 水平 */\n HORIZONTAL = 'horizontal',\n /** 垂直 */\n VERTICAL = 'vertical',\n}\n\n/** css z-index */\nexport enum ZIndex {\n /** 蒙层,用于监听用户操作,需要置于顶层 */\n MASK = '99999',\n /** 选中的节点 */\n SELECTED_EL = '666',\n GHOST_EL = '700',\n DRAG_EL = '9',\n HIGHLIGHT_EL = '8',\n}\n\n/** 鼠标按键 */\nexport enum MouseButton {\n /** 左键 */\n LEFT = 0,\n /** z中健 */\n MIDDLE = 1,\n /** 右键 */\n RIGHT = 2,\n}\n\n/** 布局方式 */\nexport enum Mode {\n /** 绝对定位布局 */\n ABSOLUTE = 'absolute',\n /** 固定定位布局 */\n FIXED = 'fixed',\n /** 流式布局 */\n SORTABLE = 'sortable',\n}\n\n/** 选中节点的class name */\nexport const SELECTED_CLASS = 'tmagic-stage-selected-area';\n\nexport enum AbleActionEventType {\n SELECT_PARENT = 'select-parent',\n REMOVE = 'remove',\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { removeClassName } from '@tmagic/utils';\n\nimport { GHOST_EL_ID_PREFIX, Mode, SELECTED_CLASS, ZIndex } from './const';\nimport type { Offset, SortEventData, TargetElement } from './types';\n\nconst getParents = (el: Element, relative: Element) => {\n let cur: Element | null = el.parentElement;\n const parents: Element[] = [];\n while (cur && cur !== relative) {\n parents.push(cur);\n cur = cur.parentElement;\n }\n return parents;\n};\n\nexport const getOffset = (el: Element): Offset => {\n const htmlEl = el as HTMLElement;\n const { offsetParent } = htmlEl;\n\n const left = htmlEl.offsetLeft || 0;\n const top = htmlEl.offsetTop || 0;\n\n // 在 Webkit 中,如果元素为隐藏的(该元素或其祖先元素的 style.display 为 \"none\"),或者该元素的 style.position 被设为 \"fixed\",则该属性返回 null。\n // 在 IE 9 中,如果该元素的 style.position 被设置为 \"fixed\",则该属性返回 null。(display:none 无影响。)\n // body offsetParent 为 null\n if (offsetParent) {\n const parentOffset = getOffset(offsetParent as HTMLElement);\n return {\n left: left + parentOffset.left,\n top: top + parentOffset.top,\n };\n }\n\n return {\n left,\n top,\n };\n};\n\n// 将蒙层占位节点覆盖在原节点上方\nexport const getTargetElStyle = (el: TargetElement, zIndex?: ZIndex) => {\n const offset = getOffset(el);\n const { transform, border } = getComputedStyle(el);\n return `\n position: absolute;\n transform: ${transform};\n left: ${offset.left}px;\n top: ${offset.top}px;\n width: ${el.clientWidth}px;\n height: ${el.clientHeight}px;\n border: ${border};\n ${typeof zIndex !== 'undefined' ? `z-index: ${zIndex};` : ''}\n `;\n};\n\nexport const getAbsolutePosition = (el: HTMLElement, { top, left }: Offset) => {\n const { offsetParent } = el;\n\n // 在 Webkit 中,如果元素为隐藏的(该元素或其祖先元素的 style.display 为 \"none\"),或者该元素的 style.position 被设为 \"fixed\",则该属性返回 null。\n // 在 IE 9 中,如果该元素的 style.position 被设置为 \"fixed\",则该属性返回 null。(display:none 无影响。)\n // body offsetParent 为 null\n if (offsetParent) {\n const parentOffset = getOffset(offsetParent as HTMLElement);\n return {\n left: left - parentOffset.left,\n top: top - parentOffset.top,\n };\n }\n\n return { left, top };\n};\n\nexport const isAbsolute = (style: CSSStyleDeclaration): boolean => style.position === 'absolute';\n\nexport const isRelative = (style: CSSStyleDeclaration): boolean => style.position === 'relative';\n\nexport const isStatic = (style: CSSStyleDeclaration): boolean => style.position === 'static';\n\nexport const isFixed = (style: CSSStyleDeclaration): boolean => style.position === 'fixed';\n\nexport const isFixedParent = (el: Element) => {\n let fixed = false;\n let dom = el;\n while (dom) {\n fixed = isFixed(getComputedStyle(dom));\n if (fixed) {\n break;\n }\n const { parentElement } = dom;\n if (!parentElement || parentElement.tagName === 'BODY') {\n break;\n }\n dom = parentElement;\n }\n return fixed;\n};\n\nexport const getMode = (el: Element): Mode => {\n if (isFixedParent(el)) return Mode.FIXED;\n const style = getComputedStyle(el);\n if (isStatic(style) || isRelative(style)) return Mode.SORTABLE;\n return Mode.ABSOLUTE;\n};\n\nexport const getScrollParent = (element: HTMLElement, includeHidden = false): HTMLElement | null => {\n let style = getComputedStyle(element);\n const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;\n\n if (isFixed(style)) return null;\n\n for (let parent = element; parent.parentElement; ) {\n parent = parent.parentElement;\n\n if (parent.tagName === 'HTML') return parent;\n\n style = getComputedStyle(parent);\n\n if (isAbsolute(style) && isStatic(style)) continue;\n\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\n }\n\n return null;\n};\n\nexport const removeSelectedClassName = (doc: Document) => {\n const oldEl = doc.querySelector(`.${SELECTED_CLASS}`);\n\n if (oldEl) {\n removeClassName(oldEl, SELECTED_CLASS);\n if (oldEl.parentNode) removeClassName(oldEl.parentNode as Element, `${SELECTED_CLASS}-parent`);\n doc.querySelectorAll(`.${SELECTED_CLASS}-parents`).forEach((item) => {\n removeClassName(item, `${SELECTED_CLASS}-parents`);\n });\n }\n};\n\nexport const addSelectedClassName = (el: Element, doc: Document) => {\n el.classList.add(SELECTED_CLASS);\n (el.parentNode as Element)?.classList.add(`${SELECTED_CLASS}-parent`);\n getParents(el, doc.body).forEach((item) => {\n item.classList.add(`${SELECTED_CLASS}-parents`);\n });\n};\n\nexport const calcValueByFontsize = (doc: Document, value: number) => {\n const { fontSize } = doc.documentElement.style;\n\n if (fontSize) {\n const times = globalThis.parseFloat(fontSize) / 100;\n return Number((value / times).toFixed(2));\n }\n\n return value;\n};\n\n/**\n * 下移组件位置\n * @param {number} deltaTop 偏移量\n * @param {Object} detail 当前选中的组件配置\n */\nexport const down = (deltaTop: number, target: TargetElement): SortEventData | void => {\n let swapIndex = 0;\n let addUpH = target.clientHeight;\n const brothers = Array.from(target.parentNode?.children || []).filter(\n (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX),\n );\n const index = brothers.indexOf(target);\n // 往下移动\n const downEls = brothers.slice(index + 1) as HTMLElement[];\n\n for (let i = 0; i < downEls.length; i++) {\n const ele = downEls[i];\n // 是 fixed 不做处理\n if (ele.style?.position === 'fixed') {\n continue;\n }\n addUpH += ele.clientHeight / 2;\n if (deltaTop <= addUpH) {\n break;\n }\n addUpH += ele.clientHeight / 2;\n swapIndex = i;\n }\n return {\n src: target.id,\n dist: downEls.length && swapIndex > -1 ? downEls[swapIndex].id : target.id,\n };\n};\n\n/**\n * 上移组件位置\n * @param {Array} brothers 处于同一容器下的所有子组件配置\n * @param {number} index 当前组件所处的位置\n * @param {number} deltaTop 偏移量\n * @param {Object} detail 当前选中的组件配置\n */\nexport const up = (deltaTop: number, target: TargetElement): SortEventData | void => {\n const brothers = Array.from(target.parentNode?.children || []).filter(\n (node) => !node.id.startsWith(GHOST_EL_ID_PREFIX),\n );\n const index = brothers.indexOf(target);\n // 往上移动\n const upEls = brothers.slice(0, index) as HTMLElement[];\n\n let addUpH = target.clientHeight;\n let swapIndex = upEls.length - 1;\n\n for (let i = upEls.length - 1; i >= 0; i--) {\n const ele = upEls[i];\n if (!ele) continue;\n // 是 fixed 不做处理\n if (ele.style.position === 'fixed') continue;\n\n addUpH += ele.clientHeight / 2;\n if (-deltaTop <= addUpH) break;\n addUpH += ele.clientHeight / 2;\n\n swapIndex = i;\n }\n return {\n src: target.id,\n dist: upEls.length && swapIndex > -1 ? upEls[swapIndex].id : target.id,\n };\n};\n\nexport const isMoveableButton = (target: Element) =>\n target.classList.contains('moveable-button') || target.parentElement?.classList.contains('moveable-button');\n\nexport const getMarginValue = (el: Element) => {\n if (!el)\n return {\n marginLeft: 0,\n marginTop: 0,\n };\n\n const { marginLeft, marginTop } = getComputedStyle(el);\n\n const marginLeftValue = parseFloat(marginLeft) || 0;\n const marginTopValue = parseFloat(marginTop) || 0;\n\n return {\n marginLeft: marginLeftValue,\n marginTop: marginTopValue,\n };\n};\n\nexport const getBorderWidth = (el: Element) => {\n if (!el)\n return {\n borderLeftWidth: 0,\n borderRightWidth: 0,\n borderTopWidth: 0,\n borderBottomWidth: 0,\n };\n\n const { borderLeftWidth, borderRightWidth, borderTopWidth, borderBottomWidth } = getComputedStyle(el);\n\n return {\n borderLeftWidth: parseFloat(borderLeftWidth) || 0,\n borderRightWidth: parseFloat(borderRightWidth) || 0,\n borderTopWidth: parseFloat(borderTopWidth) || 0,\n borderBottomWidth: parseFloat(borderBottomWidth) || 0,\n };\n};\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Mode, ZIndex } from './const';\nimport type { TargetElement as ShadowElement, TargetShadowConfig, UpdateDragEl } from './types';\nimport { getTargetElStyle, isFixedParent } from './util';\n\n/**\n * 将选中的节点修正定位后,添加一个操作节点到蒙层上\n */\nexport default class TargetShadow {\n public el?: ShadowElement;\n public els: ShadowElement[] = [];\n\n private idPrefix = 'target_calibrate_';\n private container: HTMLElement;\n private scrollLeft = 0;\n private scrollTop = 0;\n private zIndex?: ZIndex;\n\n private updateDragEl?: UpdateDragEl;\n\n constructor(config: TargetShadowConfig) {\n this.container = config.container;\n\n if (config.updateDragEl) {\n this.updateDragEl = config.updateDragEl;\n }\n\n if (typeof config.zIndex !== 'undefined') {\n this.zIndex = config.zIndex;\n }\n\n if (config.idPrefix) {\n this.idPrefix = config.idPrefix;\n }\n\n this.container.addEventListener('customScroll', this.scrollHandler);\n }\n\n public update(target: ShadowElement): ShadowElement {\n this.el = this.updateEl(target, this.el);\n\n return this.el;\n }\n\n public updateGroup(targetGroup: ShadowElement[]): ShadowElement[] {\n if (this.els.length > targetGroup.length) {\n this.els.slice(targetGroup.length - 1).forEach((el) => {\n el.remove();\n });\n }\n\n this.els = targetGroup.map((target, index) => this.updateEl(target, this.els[index]));\n\n return this.els;\n }\n\n public destroyEl(): void {\n this.el?.remove();\n this.el = undefined;\n }\n\n public destroyEls(): void {\n this.els.forEach((el) => {\n el.remove();\n });\n this.els = [];\n }\n\n public destroy(): void {\n this.container.removeEventListener('customScroll', this.scrollHandler);\n this.destroyEl();\n this.destroyEls();\n }\n\n private updateEl(target: ShadowElement, src?: ShadowElement): ShadowElement {\n const el = src || globalThis.document.createElement('div');\n\n el.id = `${this.idPrefix}${target.id}`;\n\n el.style.cssText = getTargetElStyle(target, this.zIndex);\n\n if (typeof this.updateDragEl === 'function') {\n this.updateDragEl(el, target, this.container);\n }\n const isFixed = isFixedParent(target);\n const mode = this.container.dataset.mode || Mode.ABSOLUTE;\n if (isFixed && mode !== Mode.FIXED) {\n el.style.transform = `translate3d(${this.scrollLeft}px, ${this.scrollTop}px, 0)`;\n } else if (!isFixed && mode === Mode.FIXED) {\n el.style.transform = `translate3d(${-this.scrollLeft}px, ${-this.scrollTop}px, 0)`;\n }\n\n if (!globalThis.document.getElementById(el.id)) {\n this.container.append(el);\n }\n\n return el;\n }\n\n private scrollHandler = (e: any) => {\n this.scrollLeft = e.detail.scrollLeft;\n this.scrollTop = e.detail.scrollTop;\n };\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n OnDrag,\n OnDragGroup,\n OnDragGroupStart,\n OnDragStart,\n OnResize,\n OnResizeGroup,\n OnResizeGroupStart,\n OnResizeStart,\n OnRotate,\n OnRotateStart,\n OnScale,\n OnScaleStart,\n} from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, Mode, ZIndex } from './const';\nimport TargetShadow from './TargetShadow';\nimport { DragResizeHelperConfig, Rect, TargetElement } from './types';\nimport { calcValueByFontsize, getAbsolutePosition, getBorderWidth, getMarginValue, getOffset } from './util';\n\n/**\n * 拖拽/改变大小等操作发生时,moveable会抛出各种状态事件,DragResizeHelper负责响应这些事件,对目标节点target和拖拽节点targetShadow进行修改;\n * 其中目标节点是DragResizeHelper直接改的,targetShadow作为直接被操作的拖拽框,是调用moveableHelper改的;\n * 有个特殊情况是流式布局下,moveableHelper不支持,targetShadow也是DragResizeHelper直接改的\n */\nexport default class DragResizeHelper {\n /** 目标节点在蒙层上的占位节点,用于跟鼠标交互,避免鼠标事件直接作用到目标节点 */\n private targetShadow: TargetShadow;\n /** 要操作的原始目标节点 */\n private target!: HTMLElement;\n /** 多选:目标节点组 */\n private targetList: HTMLElement[] = [];\n /** 响应拖拽的状态事件,修改绝对定位布局下targetShadow的dom。\n * MoveableHelper里面的方法是成员属性,如果DragResizeHelper用继承的方式将无法通过super去调这些方法 */\n private moveableHelper: MoveableHelper;\n /** 流式布局下,目标节点的镜像节点 */\n private ghostEl: HTMLElement | undefined;\n /** 用于记录节点被改变前的位置 */\n private frameSnapShot = {\n left: 0,\n top: 0,\n };\n /** 多选模式下的多个节点 */\n private framesSnapShot: { left: number; top: number; id: string }[] = [];\n /** 布局方式:流式布局、绝对定位、固定定位 */\n private mode: Mode = Mode.ABSOLUTE;\n\n constructor(config: DragResizeHelperConfig) {\n this.moveableHelper = MoveableHelper.create({\n useBeforeRender: true,\n useRender: false,\n createAuto: true,\n });\n\n this.targetShadow = new TargetShadow({\n container: config.container,\n updateDragEl: config.updateDragEl,\n zIndex: ZIndex.DRAG_EL,\n idPrefix: DRAG_EL_ID_PREFIX,\n });\n }\n\n public destroy(): void {\n this.targetShadow.destroy();\n this.destroyGhostEl();\n this.moveableHelper.clear();\n }\n\n public destroyShadowEl(): void {\n this.targetShadow.destroyEl();\n }\n\n public getShadowEl(): TargetElement | undefined {\n return this.targetShadow.el;\n }\n\n public updateShadowEl(el: HTMLElement): void {\n this.destroyGhostEl();\n this.target = el;\n this.targetShadow.update(el);\n }\n\n public setMode(mode: Mode): void {\n this.mode = mode;\n }\n\n /**\n * 改变大小事件开始\n * @param e 包含了拖拽节点的dom,moveableHelper会直接修改拖拽节点\n */\n public onResizeStart(e: OnResizeStart): void {\n this.moveableHelper.onResizeStart(e);\n\n this.frameSnapShot.top = this.target.offsetTop;\n this.frameSnapShot.left = this.target.offsetLeft;\n }\n\n public onResize(e: OnResize): void {\n const { width, height, drag } = e;\n const { beforeTranslate } = drag;\n // 流式布局\n if (this.mode === Mode.SORTABLE) {\n this.target.style.top = '0px';\n if (this.targetShadow.el) {\n this.targetShadow.el.style.width = `${width}px`;\n this.targetShadow.el.style.height = `${height}px`;\n }\n } else {\n this.moveableHelper.onResize(e);\n const { marginLeft, marginTop } = getMarginValue(this.target);\n this.target.style.left = `${this.frameSnapShot.left + beforeTranslate[0] - marginLeft}px`;\n this.target.style.top = `${this.frameSnapShot.top + beforeTranslate[1] - marginTop}px`;\n }\n\n const { borderLeftWidth, borderRightWidth, borderTopWidth, borderBottomWidth } = getBorderWidth(this.target);\n\n this.target.style.width = `${width + borderLeftWidth + borderRightWidth}px`;\n this.target.style.height = `${height + borderTopWidth + borderBottomWidth}px`;\n }\n\n public onDragStart(e: OnDragStart): void {\n this.moveableHelper.onDragStart(e);\n\n if (this.mode === Mode.SORTABLE) {\n this.ghostEl = this.generateGhostEl(this.target);\n }\n\n this.frameSnapShot.top = this.target.offsetTop;\n this.frameSnapShot.left = this.target.offsetLeft;\n }\n\n public onDrag(e: OnDrag): void {\n // 流式布局\n if (this.ghostEl) {\n this.ghostEl.style.top = `${this.frameSnapShot.top + e.beforeTranslate[1]}px`;\n return;\n }\n\n this.moveableHelper.onDrag(e);\n\n const { marginLeft, marginTop } = getMarginValue(this.target);\n\n this.target.style.left = `${this.frameSnapShot.left + e.beforeTranslate[0] - marginLeft}px`;\n this.target.style.top = `${this.frameSnapShot.top + e.beforeTranslate[1] - marginTop}px`;\n }\n\n public onRotateStart(e: OnRotateStart): void {\n this.moveableHelper.onRotateStart(e);\n }\n\n public onRotate(e: OnRotate): void {\n this.moveableHelper.onRotate(e);\n const frame = this.moveableHelper.getFrame(e.target);\n this.target.style.transform = frame?.toCSSObject().transform || '';\n }\n\n public onScaleStart(e: OnScaleStart): void {\n this.moveableHelper.onScaleStart(e);\n }\n\n public onScale(e: OnScale): void {\n this.moveableHelper.onScale(e);\n const frame = this.moveableHelper.getFrame(e.target);\n this.target.style.transform = frame?.toCSSObject().transform || '';\n }\n\n public getGhostEl(): HTMLElement | undefined {\n return this.ghostEl;\n }\n\n public destroyGhostEl(): void {\n this.ghostEl?.remove();\n this.ghostEl = undefined;\n }\n\n public clear(): void {\n this.moveableHelper.clear();\n }\n\n public getFrame(el: HTMLElement | SVGElement): ReturnType<MoveableHelper['getFrame']> {\n return this.moveableHelper.getFrame(el);\n }\n\n public getShadowEls(): TargetElement[] {\n return this.targetShadow.els;\n }\n\n public updateGroup(els: HTMLElement[]): void {\n this.targetList = els;\n this.framesSnapShot = [];\n this.targetShadow.updateGroup(els);\n }\n\n public setTargetList(targetList: HTMLElement[]): void {\n this.targetList = targetList;\n }\n\n public clearMultiSelectStatus(): void {\n this.targetList = [];\n this.targetShadow.destroyEls();\n }\n\n public onResizeGroupStart(e: OnResizeGroupStart): void {\n const { events } = e;\n this.moveableHelper.onResizeGroupStart(e);\n this.setFramesSnapShot(events);\n }\n\n /**\n * 多选状态下通过拖拽边框改变大小,所有选中组件会一起改变大小\n */\n public onResizeGroup(e: OnResizeGroup): void {\n const { events } = e;\n // 拖动过程更新\n events.forEach((ev) => {\n const { width, height, beforeTranslate } = ev.drag;\n const frameSnapShot = this.framesSnapShot.find(\n (frameItem) => frameItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),\n );\n if (!frameSnapShot) return;\n const targeEl = this.targetList.find(\n (targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),\n );\n if (!targeEl) return;\n // 元素与其所属组同时加入多选列表时,只更新父元素\n const isParentIncluded = this.targetList.find((targetItem) => targetItem.id === targeEl.parentElement?.id);\n\n if (!isParentIncluded) {\n // 更新页面元素位置\n const { marginLeft, marginTop } = getMarginValue(targeEl);\n targeEl.style.left = `${frameSnapShot.left + beforeTranslate[0] - marginLeft}px`;\n targeEl.style.top = `${frameSnapShot.top + beforeTranslate[1] - marginTop}px`;\n }\n\n // 更新页面元素大小\n targeEl.style.width = `${width}px`;\n targeEl.style.height = `${height}px`;\n });\n this.moveableHelper.onResizeGroup(e);\n }\n\n public onDragGroupStart(e: OnDragGroupStart): void {\n const { events } = e;\n this.moveableHelper.onDragGroupStart(e);\n // 记录拖动前快照\n this.setFramesSnapShot(events);\n }\n\n public onDragGroup(e: OnDragGroup): void {\n const { events } = e;\n // 拖动过程更新\n events.forEach((ev) => {\n const frameSnapShot = this.framesSnapShot.find(\n (frameItem) => frameItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),\n );\n if (!frameSnapShot) return;\n const targeEl = this.targetList.find(\n (targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),\n );\n if (!targeEl) return;\n // 元素与其所属组同时加入多选列表时,只更新父元素\n const isParentIncluded = this.targetList.find((targetItem) => targetItem.id === targeEl.parentElement?.id);\n if (!isParentIncluded) {\n // 更新页面元素位置\n const { marginLeft, marginTop } = getMarginValue(targeEl);\n targeEl.style.left = `${frameSnapShot.left + ev.beforeTranslate[0] - marginLeft}px`;\n targeEl.style.top = `${frameSnapShot.top + ev.beforeTranslate[1] - marginTop}px`;\n }\n });\n this.moveableHelper.onDragGroup(e);\n }\n\n public getUpdatedElRect(el: HTMLElement, parentEl: HTMLElement | null, doc: Document): Rect {\n const offset = this.mode === Mode.SORTABLE ? { left: 0, top: 0 } : { left: el.offsetLeft, top: el.offsetTop };\n\n const { marginLeft, marginTop } = getMarginValue(el);\n\n let left = calcValueByFontsize(doc, offset.left) - marginLeft;\n let top = calcValueByFontsize(doc, offset.top) - marginTop;\n\n const { borderLeftWidth, borderRightWidth, borderTopWidth, borderBottomWidth } = getBorderWidth(el);\n\n const width = calcValueByFontsize(doc, el.clientWidth + borderLeftWidth + borderRightWidth);\n const height = calcValueByFontsize(doc, el.clientHeight + borderTopWidth + borderBottomWidth);\n\n let shadowEl = this.getShadowEl();\n const shadowEls = this.getShadowEls();\n\n if (shadowEls.length) {\n shadowEl = shadowEls.find((item) => item.id.endsWith(el.id));\n }\n\n if (parentEl && this.mode === Mode.ABSOLUTE && shadowEl) {\n const targetShadowHtmlEl = shadowEl as HTMLElement;\n const targetShadowElOffsetLeft = targetShadowHtmlEl.offsetLeft || 0;\n const targetShadowElOffsetTop = targetShadowHtmlEl.offsetTop || 0;\n\n const frame = this.getFrame(shadowEl);\n\n const [translateX, translateY] = frame?.properties.transform.translate.value;\n const { left: parentLeft, top: parentTop } = getOffset(parentEl);\n\n left =\n calcValueByFontsize(doc, targetShadowElOffsetLeft) +\n parseFloat(translateX) -\n calcValueByFontsize(doc, parentLeft);\n top =\n calcValueByFontsize(doc, targetShadowElOffsetTop) +\n parseFloat(translateY) -\n calcValueByFontsize(doc, parentTop);\n }\n\n return { width, height, left, top };\n }\n\n /**\n * 多选状态设置多个节点的快照\n */\n private setFramesSnapShot(events: OnDragStart[] | OnResizeStart[]): void {\n // 同一组被选中的目标元素多次拖拽和改变大小会触发多次setFramesSnapShot,只有第一次可以设置成功\n if (this.framesSnapShot.length > 0) return;\n // 记录拖动前快照\n events.forEach((ev) => {\n // 实际目标元素\n const matchEventTarget = this.targetList.find(\n (targetItem) => targetItem.id === ev.target.id.replace(DRAG_EL_ID_PREFIX, ''),\n );\n if (!matchEventTarget) return;\n this.framesSnapShot.push({\n left: matchEventTarget.offsetLeft,\n top: matchEventTarget.offsetTop,\n id: matchEventTarget.id,\n });\n });\n }\n\n /**\n * 流式布局把目标节点复制一份进行拖拽,在拖拽结束前不影响页面原布局样式\n */\n private generateGhostEl(el: HTMLElement): HTMLElement {\n if (this.ghostEl) {\n this.destroyGhostEl();\n }\n\n const ghostEl = el.cloneNode(true) as HTMLElement;\n this.setGhostElChildrenId(ghostEl);\n const { top, left } = getAbsolutePosition(el, getOffset(el));\n ghostEl.id = `${GHOST_EL_ID_PREFIX}${el.id}`;\n ghostEl.style.zIndex = ZIndex.GHOST_EL;\n ghostEl.style.opacity = '.5';\n ghostEl.style.position = 'absolute';\n ghostEl.style.left = `${left}px`;\n ghostEl.style.top = `${top}px`;\n ghostEl.style.marginLeft = '0';\n ghostEl.style.marginTop = '0';\n el.after(ghostEl);\n return ghostEl;\n }\n\n private setGhostElChildrenId(el: Element): void {\n for (const child of Array.from(el.children)) {\n if (child.id) {\n child.id = `${GHOST_EL_ID_PREFIX}${child.id}`;\n }\n\n if (child.children.length) {\n this.setGhostElChildrenId(child);\n }\n }\n }\n}\n","export 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}\\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\"","import { MoveableManagerInterface, Renderer } from 'moveable';\n\nimport { AbleActionEventType } from './const';\nimport ableCss from './moveable-able.css?raw';\n\nexport default (handler: (type: AbleActionEventType) => void) => ({\n name: 'actions',\n props: [],\n events: [],\n render(moveable: MoveableManagerInterface<any, any>, React: Renderer) {\n const rect = moveable.getRect();\n const { pos2 } = moveable.state;\n\n // use css for able\n const editableViewer = moveable.useCSS(\n 'div',\n `\n {\n position: absolute;\n left: 0px;\n top: 0px;\n will-change: transform;\n transform-origin: 0px 0px;\n display: flex;\n }\n ${ableCss}\n `,\n );\n // Add key (required)\n // Add class prefix moveable-(required)\n return React.createElement(\n editableViewer,\n {\n className: 'moveable-editable',\n style: {\n transform: `translate(${pos2[0] - 60}px, ${pos2[1] - 28}px) rotate(${rect.rotation}deg)`,\n },\n },\n [\n React.createElement(\n 'button',\n {\n className: 'moveable-button',\n title: '选中父组件',\n onClick: () => {\n handler(AbleActionEventType.SELECT_PARENT);\n },\n },\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-top-icon',\n }),\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-body-icon',\n }),\n ),\n React.createElement('button', {\n className: 'moveable-button moveable-remove-button',\n title: '删除',\n onClick: () => {\n handler(AbleActionEventType.REMOVE);\n },\n }),\n React.createElement(\n 'button',\n {\n className: 'moveable-button moveable-drag-area-button',\n title: '拖动',\n },\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-top-icon moveable-select-parent-arrow-top-icon-top',\n }),\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-top-icon moveable-select-parent-arrow-top-icon-bottom',\n }),\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-top-icon moveable-select-parent-arrow-top-icon-left',\n }),\n React.createElement('div', {\n className: ' moveable-select-parent-arrow-top-icon moveable-select-parent-arrow-top-icon-right',\n }),\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-body-icon-horizontal',\n }),\n React.createElement('div', {\n className: 'moveable-select-parent-arrow-body-icon-vertical',\n }),\n ),\n ],\n );\n },\n});\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nimport { merge } from 'lodash-es';\nimport type { ElementGuidelineValueOption, MoveableOptions, MoveableRefType } from 'moveable';\n\nimport { AbleActionEventType, GuidesType, Mode } from './const';\nimport MoveableActionsAble from './MoveableActionsAble';\nimport type { GetRootContainer, MoveableOptionsManagerConfig } from './types';\nimport { getOffset } from './util';\n\n/**\n * 单选和多选的父类,用于管理moveableOptions\n * @extends EventEmitter\n */\nexport default class MoveableOptionsManager extends EventEmitter {\n /** 布局方式:流式布局、绝对定位、固定定位 */\n public mode: Mode = Mode.ABSOLUTE;\n\n /** 画布容器 */\n protected container: HTMLElement;\n protected options: MoveableOptions = {};\n\n /** 水平参考线 */\n private horizontalGuidelines: number[] = [];\n /** 垂直参考线 */\n private verticalGuidelines: number[] = [];\n /** 对齐元素集合 */\n private elementGuidelines: HTMLElement[] = [];\n /** 由外部调用方(编辑器)传入进来的moveable默认参数,可以为空,也可以是一个回调函数 */\n private customizedOptions?: (() => MoveableOptions) | MoveableOptions;\n /** 获取整个画布的根元素(在StageCore的mount函数中挂载的container) */\n private getRootContainer: GetRootContainer;\n\n constructor(config: MoveableOptionsManagerConfig) {\n super();\n this.customizedOptions = config.moveableOptions;\n this.container = config.container;\n this.getRootContainer = config.getRootContainer;\n }\n\n public getOption<K extends keyof MoveableOptions>(key: K): MoveableOptions[K] {\n return this.options[key];\n }\n\n /**\n * 设置水平/垂直参考线\n * @param type 参考线类型\n * @param guidelines 参考线坐标数组\n */\n public setGuidelines(type: GuidesType, guidelines: number[]): void {\n if (type === GuidesType.HORIZONTAL) {\n this.horizontalGuidelines = guidelines;\n } else if (type === GuidesType.VERTICAL) {\n this.verticalGuidelines = guidelines;\n }\n\n this.emit('update-moveable');\n }\n\n /**\n * 清除横向和纵向的参考线\n */\n public clearGuides(): void {\n this.horizontalGuidelines = [];\n this.verticalGuidelines = [];\n\n this.emit('update-moveable');\n }\n\n /**\n * 设置有哪些元素要辅助对齐\n * @param selectedElList 选中的元素列表,需要排除在对齐元素之外\n */\n protected setElementGuidelines(selectedElList: HTMLElement[]): void {\n this.elementGuidelines.forEach((node) => {\n node.remove();\n });\n this.elementGuidelines = [];\n\n // 设置选中元素的周围元素,用于选中元素跟周围元素对齐辅助\n const elementGuidelines: Array<ElementGuidelineValueOption | MoveableRefType<Element>> =\n this.getCustomizeOptions()?.elementGuidelines || Array.from(selectedElList[0]?.parentElement?.children || []);\n\n if (this.mode === Mode.ABSOLUTE) {\n this.container.append(this.createGuidelineElements(selectedElList, elementGuidelines));\n }\n }\n\n /**\n * 获取moveable参数\n * @param isMultiSelect 是否多选模式\n * @param runtimeOptions 调用时实时传进来的的moveable参数\n * @returns moveable所需参数\n */\n protected getOptions(isMultiSelect: boolean, runtimeOptions: MoveableOptions = {}): MoveableOptions {\n const defaultOptions = this.getDefaultOptions(isMultiSelect);\n const customizedOptions = this.getCustomizeOptions();\n\n this.options = merge(defaultOptions, customizedOptions, runtimeOptions);\n return this.options;\n }\n\n /**\n * 获取单选和多选的moveable公共参数\n * @returns moveable公共参数\n */\n private getDefaultOptions(isMultiSelect: boolean): MoveableOptions {\n const isSortable = this.mode === Mode.SORTABLE;\n\n const commonOptions = {\n draggable: true,\n resizable: true,\n rootContainer: this.getRootContainer(),\n zoom: 1,\n throttleDrag: 0,\n snappable: true,\n horizontalGuidelines: this.horizontalGuidelines,\n verticalGuidelines: this.verticalGuidelines,\n elementGuidelines: this.elementGuidelines,\n bounds: {\n top: 0,\n left: 0,\n right: this.container.clientWidth,\n bottom: isSortable ? undefined : this.container.clientHeight,\n },\n };\n const differenceOptions = isMultiSelect ? this.getMultiOptions() : this.getSingleOptions();\n\n return merge(commonOptions, differenceOptions);\n }\n\n /**\n * 获取单选下的差异化参数\n * @returns {MoveableOptions} moveable options参数\n */\n private getSingleOptions(): MoveableOptions {\n const isAbsolute = this.mode === Mode.ABSOLUTE;\n const isFixed = this.mode === Mode.FIXED;\n\n return {\n origin: false,\n dragArea: false,\n scalable: false,\n rotatable: false,\n snapGap: isAbsolute || isFixed,\n snapThreshold: 5,\n snapDigit: 0,\n isDisplaySnapDigit: isAbsolute,\n snapDirections: {\n top: isAbsolute,\n right: isAbsolute,\n bottom: isAbsolute,\n left: isAbsolute,\n center: isAbsolute,\n middle: isAbsolute,\n },\n elementSnapDirections: {\n top: isAbsolute,\n right: isAbsolute,\n bottom: isAbsolute,\n left: isAbsolute,\n },\n isDisplayInnerSnapDigit: true,\n dragTarget: '.moveable-drag-area-button',\n dragTargetSelf: true,\n props: {\n actions: true,\n },\n\n ables: [MoveableActionsAble(this.actionHandler.bind(this))],\n };\n }\n\n /**\n * 获取多选下的差异化参数\n * @returns {MoveableOptions} moveable options参数\n */\n private getMultiOptions(): MoveableOptions {\n return {\n defaultGroupRotate: 0,\n defaultGroupOrigin: '50% 50%',\n startDragRotate: 0,\n throttleDragRotate: 0,\n origin: true,\n padding: { left: 0, top: 0, right: 0, bottom: 0 },\n };\n }\n\n /**\n * 获取业务方自定义的moveable参数\n */\n private getCustomizeOptions(): MoveableOptions | undefined {\n if (typeof this.customizedOptions === 'function') {\n return this.customizedOptions();\n }\n return this.customizedOptions;\n }\n\n /**\n * 这是给selectParentAbles的回调函数,用于触发选中父元素事件\n */\n private actionHandler(type: AbleActionEventType): void {\n this.emit(type);\n }\n\n /**\n * 为需要辅助对齐的元素创建div\n * @param selectedElList 选中的元素列表,需要排除在对齐元素之外\n * @param allElList 全部元素列表\n * @returns frame 辅助对齐元素集合的页面片\n */\n private createGuidelineElements(\n selectedElList: HTMLElement[],\n allElList: Array<ElementGuidelineValueOption | MoveableRefType<Element>>,\n ): DocumentFragment {\n const frame = globalThis.document.createDocumentFragment();\n\n for (const element of allElList) {\n let node: MoveableRefType<Element> =\n (element as ElementGuidelineValueOption).element || (element as MoveableRefType<Element>);\n\n if (!node || typeof node === 'string') continue;\n\n if (typeof node === 'function') {\n node = node();\n }\n\n if (this.isInElementList(node as Element, selectedElList)) continue;\n\n const { width, height } = (node as Element).getBoundingClientRect();\n\n if (!width || !height) continue;\n\n const { left, top } = getOffset(node as Element);\n const elementGuideline = globalThis.document.createElement('div');\n elementGuideline.style.cssText = `position: absolute;width: ${width}px;height: ${height}px;top: ${top}px;left: ${left}px`;\n this.elementGuidelines.push(elementGuideline);\n frame.append(elementGuideline);\n }\n\n return frame;\n }\n\n /**\n * 判断一个元素是否在元素列表里面\n * @param ele 元素\n * @param eleList 元素列表\n * @returns 是否在元素列表里面\n */\n private isInElementList(ele: Element, eleList: Element[]): boolean {\n for (const eleItem of eleList) {\n if (ele === eleItem) return true;\n }\n return false;\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { GuidesOptions } from '@scena/guides';\nimport type { MoveableOptions } from 'moveable';\n\nimport Core from '@tmagic/core';\nimport type { Id, MApp, MContainer, MNode } from '@tmagic/schema';\n\nimport { GuidesType, ZIndex } from './const';\nimport DragResizeHelper from './DragResizeHelper';\nimport StageCore from './StageCore';\n\nexport type TargetElement = HTMLElement | SVGElement;\n\nexport type CanSelect = (el: HTMLElement, event: MouseEvent, stop: () => boolean) => boolean | Promise<boolean>;\nexport type IsContainer = (el: HTMLElement) => boolean | Promise<boolean>;\nexport type CustomizeRender = (renderer: StageCore) => Promise<HTMLElement> | HTMLElement;\n/** 业务方自定义的moveableOptions,可以是配置,也可以是回调函数 */\nexport type CustomizeMoveableOptions =\n | ((config?: CustomizeMoveableOptionsCallbackConfig) => MoveableOptions)\n | MoveableOptions\n | undefined;\n/** render提供给的接口,如果是id则转成el,如果是el则直接返回 */\nexport type GetTargetElement = (idOrEl: Id | HTMLElement) => HTMLElement;\n/** render提供的接口,通过坐标获得坐标下所有HTML元素数组 */\nexport type GetElementsFromPoint = (point: Point) => HTMLElement[];\nexport type GetRenderDocument = () => Document | undefined;\nexport type DelayedMarkContainer = (event: MouseEvent, exclude: Element[]) => NodeJS.Timeout | undefined;\nexport type MarkContainerEnd = () => HTMLElement | null;\nexport type GetRootContainer = () => HTMLDivElement | undefined;\n\n/** 将组件添加到容器的方式 */\nexport enum ContainerHighlightType {\n /** 默认方式:组件在容器上方悬停一段时间后加入 */\n DEFAULT = 'default',\n /** 按住alt键,并在容器上方悬停一段时间后加入 */\n ALT = 'alt',\n}\n\nexport enum RenderType {\n IFRAME = 'iframe',\n NATIVE = 'native',\n}\n\nexport type UpdateDragEl = (el: TargetElement, target: TargetElement, container: HTMLElement) => void;\n\nexport interface StageCoreConfig {\n /** 需要对齐的dom节点的CSS选择器字符串 */\n snapElementQuerySelector?: string;\n /** 放大倍数,默认1倍 */\n zoom?: number;\n canSelect?: CanSelect;\n isContainer: IsContainer;\n containerHighlightClassName?: string;\n containerHighlightDuration?: number;\n containerHighlightType?: ContainerHighlightType;\n moveableOptions?: CustomizeMoveableOptions;\n /** runtime 的HTML地址,可以是一个HTTP地址,如果和编辑器不同域,需要设置跨域,也可以是一个相对或绝对路径 */\n runtimeUrl?: string;\n render?: (renderer: StageCore) => Promise<HTMLElement> | HTMLElement;\n autoScrollIntoView?: boolean;\n updateDragEl?: UpdateDragEl;\n disabledDragStart?: boolean;\n renderType?: RenderType;\n guidesOptions?: Partial<GuidesOptions>;\n disabledMultiSelect?: boolean;\n}\n\nexport interface ActionManagerConfig {\n container: HTMLElement;\n containerHighlightClassName?: string;\n containerHighlightDuration?: number;\n containerHighlightType?: ContainerHighlightType;\n moveableOptions?: CustomizeMoveableOptions;\n disabledDragStart?: boolean;\n disabledMultiSelect?: boolean;\n canSelect?: CanSelect;\n isContainer: IsContainer;\n getRootContainer: GetRootContainer;\n getRenderDocument: GetRenderDocument;\n updateDragEl?: UpdateDragEl;\n getTargetElement: GetTargetElement;\n getElementsFromPoint: GetElementsFromPoint;\n}\n\nexport interface MoveableOptionsManagerConfig {\n container: HTMLElement;\n moveableOptions?: CustomizeMoveableOptions;\n getRootContainer: GetRootContainer;\n}\n\nexport interface CustomizeMoveableOptionsCallbackConfig {\n targetEl?: HTMLElement;\n targetElId?: string;\n targetEls?: HTMLElement[];\n targetElIds?: string[];\n isMulti: boolean;\n document?: Document;\n}\n\nexport interface StageRenderConfig {\n runtimeUrl?: string;\n zoom: number | undefined;\n renderType?: RenderType;\n customizedRender?: () => Promise<HTMLElement | null>;\n}\n\nexport interface StageMaskConfig {\n core: StageCore;\n}\n\nexport interface StageDragResizeConfig {\n container: HTMLElement;\n dragResizeHelper: DragResizeHelper;\n moveableOptions?: CustomizeMoveableOptions;\n disabledDragStart?: boolean;\n getRootContainer: GetRootContainer;\n getRenderDocument: GetRenderDocument;\n markContainerEnd: MarkContainerEnd;\n delayedMarkContainer: DelayedMarkContainer;\n}\n\nexport interface StageMultiDragResizeConfig {\n container: HTMLElement;\n dragResizeHelper: DragResizeHelper;\n moveableOptions?: CustomizeMoveableOptions;\n getRootContainer: GetRootContainer;\n getRenderDocument: GetRenderDocument;\n markContainerEnd: MarkContainerEnd;\n delayedMarkContainer: DelayedMarkContainer;\n}\n\nexport interface DragResizeHelperConfig {\n container: HTMLElement;\n updateDragEl?: UpdateDragEl;\n}\n\n/** 选择状态 */\nexport enum SelectStatus {\n /** 单选 */\n SELECT = 'select',\n /** 多选 */\n MULTI_SELECT = 'multiSelect',\n}\n\n/** 拖动状态 */\nexport enum StageDragStatus {\n /** 开始拖动 */\n START = 'start',\n /** 拖动中 */\n ING = 'ing',\n /** 拖动结束 */\n END = 'end',\n}\n\nexport type Rect = {\n width: number;\n height: number;\n} & Offset;\n\nexport interface Offset {\n left: number;\n top: number;\n}\n\nexport interface Point {\n clientX: number;\n clientY: number;\n}\n\nexport interface GuidesEventData {\n type: GuidesType;\n guides: number[];\n}\n\nexport interface UpdateEventData {\n data: {\n el: HTMLElement;\n style: {\n width?: number;\n height?: number;\n left?: number;\n top?: number;\n transform?: {\n rotate?: string;\n scale?: string;\n };\n };\n ghostEl?: HTMLElement;\n }[];\n parentEl: HTMLElement | null;\n}\n\nexport interface RemoveEventData {\n data: {\n el: HTMLElement;\n }[];\n}\n\nexport interface SortEventData {\n src: Id;\n dist: Id;\n root?: MApp;\n}\n\nexport interface UpdateData {\n config: MNode;\n parent?: MContainer;\n parentId?: Id;\n root: MApp;\n}\n\nexport interface RemoveData {\n id: Id;\n parentId: Id;\n root: MApp;\n}\n\nexport interface Runtime {\n getApp?: () => Core | undefined;\n beforeSelect?: (el: HTMLElement) => Promise<boolean> | boolean;\n updateRootConfig?: (config: MApp) => void;\n updatePageId?: (id: Id) => void;\n select?: (id: Id) => Promise<HTMLElement> | HTMLElement;\n add?: (data: UpdateData) => void;\n update?: (data: UpdateData) => void;\n sortNode?: (data: SortEventData) => void;\n remove?: (data: RemoveData) => void;\n}\n\nexport interface Magic {\n /** 当前页面的根节点变化时调用该方法,编辑器会同步该el和stage的大小,该方法由stage注入到iframe.contentWindow中 */\n onPageElUpdate: (el: HTMLElement) => void;\n\n onRuntimeReady: (runtime: Runtime) => void;\n}\n\nexport interface RuntimeWindow extends Window {\n magic: Magic;\n}\n\nexport interface StageHighlightConfig {\n container: HTMLElement;\n updateDragEl?: UpdateDragEl;\n getRootContainer: GetRootContainer;\n}\n\nexport interface TargetShadowConfig {\n container: HTMLElement;\n zIndex?: ZIndex;\n updateDragEl?: UpdateDragEl;\n idPrefix?: string;\n}\n\nexport interface RuleOptions {\n guidesOptions?: Partial<GuidesOptions>;\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable no-param-reassign */\nimport Moveable, { MoveableOptions } from 'moveable';\n\nimport { Mode } from './const';\nimport DragResizeHelper from './DragResizeHelper';\nimport MoveableOptionsManager from './MoveableOptionsManager';\nimport type { DelayedMarkContainer, GetRenderDocument, MarkContainerEnd, StageDragResizeConfig } from './types';\nimport { StageDragStatus } from './types';\nimport { down, getMode, up } from './util';\n\n/**\n * 管理单选操作,响应选中操作,初始化moveableOption参数并初始化moveable,处理moveable回调事件对组件进行更新\n * @extends MoveableOptionsManager\n */\nexport default class StageDragResize extends MoveableOptionsManager {\n /** 目标节点 */\n private target?: HTMLElement;\n /** Moveable拖拽类实例 */\n private moveable?: Moveable;\n /** 拖动状态 */\n private dragStatus: StageDragStatus = StageDragStatus.END;\n private dragResizeHelper: DragResizeHelper;\n private disabledDragStart?: boolean;\n private getRenderDocument: GetRenderDocument;\n private markContainerEnd: MarkContainerEnd;\n private delayedMarkContainer: DelayedMarkContainer;\n\n constructor(config: StageDragResizeConfig) {\n super(config);\n\n this.getRenderDocument = config.getRenderDocument;\n this.markContainerEnd = config.markContainerEnd;\n this.delayedMarkContainer = config.delayedMarkContainer;\n this.disabledDragStart = config.disabledDragStart;\n\n this.dragResizeHelper = config.dragResizeHelper;\n\n this.on('update-moveable', () => {\n if (this.moveable) {\n this.updateMoveable();\n }\n });\n }\n\n public getTarget() {\n return this.target;\n }\n\n /**\n * 将选中框渲染并覆盖到选中的组件Dom节点上方\n * 当选中的节点不是absolute时,会创建一个新的节点出来作为拖拽目标\n * @param el 选中组件的Dom节点元素\n * @param event 鼠标事件\n */\n public select(el: HTMLElement, event?: MouseEvent): void {\n // 从不能拖动到能拖动的节点之间切换,要重新创建moveable,不然dragStart不生效\n if (!this.moveable || el !== this.target) {\n this.initMoveable(el);\n } else {\n this.updateMoveable(el);\n }\n\n if (event && !this.disabledDragStart) {\n this.moveable?.dragStart(event);\n }\n }\n\n /**\n * 初始化选中框并渲染出来\n */\n public updateMoveable(el = this.target): void {\n if (!this.moveable) return;\n if (!el) throw new Error('未选中任何节点');\n\n const options: MoveableOptions = this.init(el);\n\n Object.entries(options).forEach(([key, value]) => {\n (this.moveable as any)[key] = value;\n });\n this.moveable.updateRect();\n }\n\n public clearSelectStatus(): void {\n if (!this.moveable) return;\n this.dragResizeHelper.destroyShadowEl();\n this.moveable.target = null;\n this.moveable.updateRect();\n }\n\n public getDragStatus(): StageDragStatus {\n return this.dragStatus;\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.dragResizeHelper.destroy();\n this.dragStatus = StageDragStatus.END;\n this.removeAllListeners();\n }\n\n private init(el: HTMLElement): MoveableOptions {\n // 如果有滚动条会导致resize时获取到width,height不准确\n if (/(auto|scroll)/.test(el.style.overflow)) {\n el.style.overflow = 'hidden';\n }\n\n this.target = el;\n this.mode = getMode(el);\n\n this.dragResizeHelper.updateShadowEl(el);\n this.dragResizeHelper.setMode(this.mode);\n\n this.setElementGuidelines([this.target as HTMLElement]);\n\n return this.getOptions(false, {\n target: this.dragResizeHelper.getShadowEl(),\n });\n }\n\n private initMoveable(el: HTMLElement) {\n const options: MoveableOptions = this.init(el);\n this.dragResizeHelper.clear();\n\n this.moveable?.destroy();\n\n this.moveable = new Moveable(this.container, {\n ...options,\n });\n\n this.bindResizeEvent();\n this.bindDragEvent();\n this.bindRotateEvent();\n this.bindScaleEvent();\n }\n\n private bindResizeEvent(): void {\n if (!this.moveable) throw new Error('moveable 未初始化');\n\n this.moveable\n .on('resizeStart', (e) => {\n if (!this.target) return;\n\n this.dragStatus = StageDragStatus.START;\n this.dragResizeHelper.onResizeStart(e);\n })\n .on('resize', (e) => {\n if (!this.moveable || !this.target || !this.dragResizeHelper.getShadowEl()) return;\n\n this.dragStatus = StageDragStatus.ING;\n\n this.dragResizeHelper.onResize(e);\n })\n .on('resizeEnd', () => {\n this.dragStatus = StageDragStatus.END;\n this.update(true);\n });\n }\n\n private bindDragEvent(): void {\n if (!this.moveable) throw new Error('moveable 未初始化');\n\n let timeout: NodeJS.Timeout | undefined;\n\n this.moveable\n .on('dragStart', (e) => {\n if (!this.target) throw new Error('未选中组件');\n\n this.dragStatus = StageDragStatus.START;\n\n this.dragResizeHelper.onDragStart(e);\n this.emit('drag-start', e);\n })\n .on('drag', (e) => {\n if (!this.target || !this.dragResizeHelper.getShadowEl()) return;\n\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n timeout = this.delayedMarkContainer(e.inputEvent, [this.target]);\n\n this.dragStatus = StageDragStatus.ING;\n\n this.dragResizeHelper.onDrag(e);\n })\n .on('dragEnd', () => {\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n\n const parentEl = this.markContainerEnd();\n // 点击不拖动时会触发dragStart和dragEnd,但是不会有drag事件\n if (this.dragStatus === StageDragStatus.ING) {\n if (parentEl) {\n this.update(false, parentEl);\n } else {\n switch (this.mode) {\n case Mode.SORTABLE:\n this.sort();\n break;\n default:\n this.update();\n }\n }\n }\n\n this.dragStatus = StageDragStatus.END;\n this.dragResizeHelper.destroyGhostEl();\n });\n }\n\n private bindRotateEvent(): void {\n if (!this.moveable) throw new Error('moveable 未初始化');\n\n this.moveable\n .on('rotateStart', (e) => {\n this.dragStatus = StageDragStatus.START;\n this.dragResizeHelper.onRotateStart(e);\n })\n .on('rotate', (e) => {\n if (!this.target || !this.dragResizeHelper.getShadowEl()) return;\n this.dragStatus = StageDragStatus.ING;\n this.dragResizeHelper.onRotate(e);\n })\n .on('rotateEnd', (e) => {\n this.dragStatus = StageDragStatus.END;\n const frame = this.dragResizeHelper?.getFrame(e.target);\n this.emit('update', {\n data: [\n {\n el: this.target,\n style: {\n transform: frame?.get('transform'),\n },\n },\n ],\n });\n });\n }\n\n private bindScaleEvent(): void {\n if (!this.moveable) throw new Error('moveable 未初始化');\n\n this.moveable\n .on('scaleStart', (e) => {\n this.dragStatus = StageDragStatus.START;\n this.dragResizeHelper.onScaleStart(e);\n })\n .on('scale', (e) => {\n if (!this.target || !this.dragResizeHelper.getShadowEl()) return;\n this.dragStatus = StageDragStatus.ING;\n this.dragResizeHelper.onScale(e);\n })\n .on('scaleEnd', (e) => {\n this.dragStatus = StageDragStatus.END;\n const frame = this.dragResizeHelper.getFrame(e.target);\n this.emit('update', {\n data: [\n {\n el: this.target,\n style: {\n transform: frame?.get('transform'),\n },\n },\n ],\n });\n });\n }\n\n private sort(): void {\n if (!this.target || !this.dragResizeHelper.getGhostEl()) throw new Error('未知错误');\n const { top } = this.dragResizeHelper.getGhostEl()!.getBoundingClientRect();\n const { top: oriTop } = this.target.getBoundingClientRect();\n const deltaTop = top - oriTop;\n if (Math.abs(deltaTop) >= this.target.clientHeight / 2) {\n if (deltaTop > 0) {\n this.emit('sort', down(deltaTop, this.target));\n } else {\n this.emit('sort', up(deltaTop, this.target));\n }\n } else {\n this.emit('sort', {\n src: this.target.id,\n dist: this.target.id,\n });\n }\n }\n\n private update(isResize = false, parentEl: HTMLElement | null = null): void {\n if (!this.target) return;\n\n const doc = this.getRenderDocument();\n\n if (!doc) return;\n\n const rect = this.dragResizeHelper.getUpdatedElRect(this.target, parentEl, doc);\n\n this.emit('update', {\n data: [\n {\n el: this.target,\n style: isResize ? rect : { left: rect.left, top: rect.top },\n },\n ],\n parentEl,\n });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EventEmitter } from 'events';\n\nimport Moveable from 'moveable';\n\nimport { HIGHLIGHT_EL_ID_PREFIX, ZIndex } from './const';\nimport TargetShadow from './TargetShadow';\nimport type { GetRootContainer, StageHighlightConfig } from './types';\n\nexport default class StageHighlight extends EventEmitter {\n public container: HTMLElement;\n public target?: HTMLElement;\n public moveable?: Moveable;\n public targetShadow?: TargetShadow;\n private getRootContainer: GetRootContainer;\n\n constructor(config: StageHighlightConfig) {\n super();\n\n this.container = config.container;\n this.getRootContainer = config.getRootContainer;\n\n this.targetShadow = new TargetShadow({\n container: config.container,\n updateDragEl: config.updateDragEl,\n zIndex: ZIndex.HIGHLIGHT_EL,\n idPrefix: HIGHLIGHT_EL_ID_PREFIX,\n });\n }\n\n /**\n * 高亮鼠标悬停的组件\n * @param el 选中组件的Dom节点元素\n */\n public highlight(el: HTMLElement): void {\n if (!el || el === this.target) return;\n this.target = el;\n\n this.targetShadow?.update(el);\n if (this.moveable) {\n this.moveable.zoom = 2;\n this.moveable.updateRect();\n } else {\n this.moveable = new Moveable(this.container, {\n target: this.targetShadow?.el,\n origin: false,\n rootContainer: this.getRootContainer(),\n zoom: 2,\n });\n }\n }\n\n /**\n * 清空高亮\n */\n public clearHighlight(): void {\n if (!this.moveable || !this.target) return;\n this.moveable.zoom = 0;\n this.moveable.updateRect();\n this.target = undefined;\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.targetShadow?.destroy();\n this.moveable = undefined;\n this.targetShadow = undefined;\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Moveable from 'moveable';\n\nimport { DRAG_EL_ID_PREFIX, Mode } from './const';\nimport DragResizeHelper from './DragResizeHelper';\nimport MoveableOptionsManager from './MoveableOptionsManager';\nimport {\n DelayedMarkContainer,\n GetRenderDocument,\n MarkContainerEnd,\n MoveableOptionsManagerConfig,\n StageDragStatus,\n StageMultiDragResizeConfig,\n} from './types';\nimport { getMode } from './util';\n\nexport default class StageMultiDragResize extends MoveableOptionsManager {\n /** 画布容器 */\n public container: HTMLElement;\n /** 多选:目标节点组 */\n public targetList: HTMLElement[] = [];\n /** Moveable多选拖拽类实例 */\n public moveableForMulti?: Moveable;\n public dragStatus: StageDragStatus = StageDragStatus.END;\n private dragResizeHelper: DragResizeHelper;\n private getRenderDocument: GetRenderDocument;\n private delayedMarkContainer: DelayedMarkContainer;\n private markContainerEnd: MarkContainerEnd;\n\n constructor(config: StageMultiDragResizeConfig) {\n const moveableOptionsManagerConfig: MoveableOptionsManagerConfig = {\n container: config.container,\n moveableOptions: config.moveableOptions,\n getRootContainer: config.getRootContainer,\n };\n super(moveableOptionsManagerConfig);\n\n this.delayedMarkContainer = config.delayedMarkContainer;\n this.markContainerEnd = config.markContainerEnd;\n this.container = config.container;\n this.getRenderDocument = config.getRenderDocument;\n\n this.dragResizeHelper = config.dragResizeHelper;\n\n this.on('update-moveable', () => {\n if (this.moveableForMulti) {\n this.updateMoveable();\n }\n });\n }\n\n /**\n * 多选\n * @param els\n */\n public multiSelect(els: HTMLElement[]): void {\n if (els.length === 0) {\n return;\n }\n this.mode = getMode(els[0]);\n this.targetList = els;\n\n this.dragResizeHelper.updateGroup(els);\n\n this.setElementGuidelines(this.targetList);\n\n this.moveableForMulti?.destroy();\n this.dragResizeHelper.clear();\n this.moveableForMulti = new Moveable(\n this.container,\n this.getOptions(true, {\n target: this.dragResizeHelper.getShadowEls(),\n }),\n );\n\n let timeout: NodeJS.Timeout | undefined;\n\n this.moveableForMulti\n .on('resizeGroupStart', (e) => {\n this.dragResizeHelper.onResizeGroupStart(e);\n this.dragStatus = StageDragStatus.START;\n })\n .on('resizeGroup', (e) => {\n this.dragResizeHelper.onResizeGroup(e);\n this.dragStatus = StageDragStatus.ING;\n })\n .on('resizeGroupEnd', () => {\n this.update(true);\n this.dragStatus = StageDragStatus.END;\n })\n .on('dragGroupStart', (e) => {\n this.dragResizeHelper.onDragGroupStart(e);\n this.dragStatus = StageDragStatus.START;\n })\n .on('dragGroup', (e) => {\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n timeout = this.delayedMarkContainer(e.inputEvent, this.targetList);\n\n this.dragResizeHelper.onDragGroup(e);\n this.dragStatus = StageDragStatus.ING;\n })\n .on('dragGroupEnd', () => {\n const parentEl = this.markContainerEnd();\n this.update(false, parentEl);\n this.dragStatus = StageDragStatus.END;\n })\n .on('clickGroup', (e) => {\n const { inputTarget, targets } = e;\n // 如果有多个元素被选中,同时点击的元素在选中元素中的其中一项,可能是多选态切换为该元素的单选态,抛事件给上一层继续判断是否切换\n if (targets.length > 1 && targets.includes(inputTarget)) {\n this.emit('change-to-select', inputTarget.id.replace(DRAG_EL_ID_PREFIX, ''), e.inputEvent);\n }\n });\n }\n\n public canSelect(el: HTMLElement, selectedEl: HTMLElement | undefined): boolean {\n const currentTargetMode = getMode(el);\n let selectedElMode = '';\n\n // 流式布局不支持多选\n if (currentTargetMode === Mode.SORTABLE) {\n return false;\n }\n\n if (this.targetList.length === 0 && selectedEl) {\n // 单选后添加到多选的情况\n selectedElMode = getMode(selectedEl);\n } else if (this.targetList.length > 0) {\n // 已加入多选列表的布局模式是一样的,取第一个判断\n selectedElMode = getMode(this.targetList[0]);\n }\n // 定位模式不同,不可混选\n if (currentTargetMode !== selectedElMode) {\n return false;\n }\n return true;\n }\n\n public updateMoveable(eleList = this.targetList) {\n if (!this.moveableForMulti) return;\n if (!eleList) throw new Error('未选中任何节点');\n\n this.targetList = eleList;\n this.dragResizeHelper.setTargetList(eleList);\n\n const options = this.getOptions(true, {\n target: this.dragResizeHelper.getShadowEls(),\n });\n\n Object.entries(options).forEach(([key, value]) => {\n (this.moveableForMulti as any)[key] = value;\n });\n this.moveableForMulti.updateRect();\n }\n\n /**\n * 清除多选状态\n */\n public clearSelectStatus(): void {\n if (!this.moveableForMulti) return;\n this.dragResizeHelper.clearMultiSelectStatus();\n this.moveableForMulti.target = null;\n this.moveableForMulti.updateTarget();\n this.targetList = [];\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveableForMulti?.destroy();\n this.dragResizeHelper.destroy();\n }\n\n /**\n * 拖拽完成后将更新的位置信息暴露给上层业务方,业务方可以接收事件进行保存\n * @param isResize 是否进行大小缩放\n */\n private update(isResize = false, parentEl: HTMLElement | null = null): void {\n if (this.targetList.length === 0) return;\n\n const doc = this.getRenderDocument();\n if (!doc) return;\n\n const data = this.targetList.map((targetItem) => {\n const rect = this.dragResizeHelper.getUpdatedElRect(targetItem, parentEl, doc);\n return {\n el: targetItem,\n style: isResize ? rect : { left: rect.left, top: rect.top },\n };\n });\n this.emit('update', { data, parentEl });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport EventEmitter from 'events';\n\nimport KeyController from 'keycon';\nimport { throttle } from 'lodash-es';\nimport type { MoveableOptions, OnDragStart } from 'moveable';\n\nimport { Env } from '@tmagic/core';\nimport type { Id } from '@tmagic/schema';\nimport { addClassName, getDocument, removeClassNameByClassName } from '@tmagic/utils';\n\nimport { CONTAINER_HIGHLIGHT_CLASS_NAME, GHOST_EL_ID_PREFIX, GuidesType, MouseButton, PAGE_CLASS } from './const';\nimport DragResizeHelper from './DragResizeHelper';\nimport StageDragResize from './StageDragResize';\nimport StageHighlight from './StageHighlight';\nimport StageMultiDragResize from './StageMultiDragResize';\nimport {\n ActionManagerConfig,\n CanSelect,\n ContainerHighlightType,\n CustomizeMoveableOptions,\n CustomizeMoveableOptionsCallbackConfig,\n GetElementsFromPoint,\n GetRenderDocument,\n GetTargetElement,\n IsContainer,\n Point,\n RemoveEventData,\n SelectStatus,\n StageDragStatus,\n UpdateEventData,\n} from './types';\nimport { isMoveableButton } from './util';\n\nconst throttleTime = 100;\nconst defaultContainerHighlightDuration = 800;\n\n/**\n * 管理蒙层mask之上的操作:1、监听键盘鼠标事件,判断形成单选、多选、高亮操作;2、管理单选、多选、高亮三个类协同工作。\n * @extends EventEmitter\n */\nexport default class ActionManager extends EventEmitter {\n private dr: StageDragResize;\n private multiDr?: StageMultiDragResize;\n private highlightLayer: StageHighlight;\n /** 单选、多选、高亮的容器(蒙层的content) */\n private container: HTMLElement;\n /** 当前选中的节点 */\n private selectedEl: HTMLElement | undefined;\n /** 多选选中的节点组 */\n private selectedElList: HTMLElement[] = [];\n /** 当前高亮的节点 */\n private highlightedEl: HTMLElement | undefined;\n /** 当前是否处于多选状态 */\n private isMultiSelectStatus = false;\n /** 当拖拽组件到容器上方进入可加入容器状态时,给容器添加的一个class名称 */\n private containerHighlightClassName: string;\n /** 当拖拽组件到容器上方时,需要悬停多久才能将组件加入容器 */\n private containerHighlightDuration: number;\n /** 将组件加入容器的操作方式 */\n private containerHighlightType?: ContainerHighlightType;\n private isAltKeydown = false;\n private getTargetElement: GetTargetElement;\n private getElementsFromPoint: GetElementsFromPoint;\n private canSelect: CanSelect;\n private isContainer: IsContainer;\n private getRenderDocument: GetRenderDocument;\n private disabledMultiSelect = false;\n private config: ActionManagerConfig;\n\n private mouseMoveHandler = throttle(async (event: MouseEvent): Promise<void> => {\n if ((event.target as HTMLDivElement)?.classList?.contains('moveable-direction')) {\n return;\n }\n\n const el = await this.getElementFromPoint(event);\n if (!el) {\n this.clearHighlight();\n return;\n }\n\n this.emit('mousemove', event);\n this.highlight(el);\n }, throttleTime);\n\n constructor(config: ActionManagerConfig) {\n super();\n this.config = config;\n this.container = config.container;\n this.containerHighlightClassName = config.containerHighlightClassName || CONTAINER_HIGHLIGHT_CLASS_NAME;\n this.containerHighlightDuration = config.containerHighlightDuration || defaultContainerHighlightDuration;\n this.containerHighlightType = config.containerHighlightType;\n this.disabledMultiSelect = config.disabledMultiSelect ?? false;\n this.getTargetElement = config.getTargetElement;\n this.getElementsFromPoint = config.getElementsFromPoint;\n this.canSelect = config.canSelect || ((el: HTMLElement) => !!el.id);\n this.getRenderDocument = config.getRenderDocument;\n this.isContainer = config.isContainer;\n\n this.dr = this.createDr(config);\n\n if (!this.disabledMultiSelect) {\n this.multiDr = this.createMultiDr(config);\n }\n\n this.highlightLayer = new StageHighlight({\n container: config.container,\n updateDragEl: config.updateDragEl,\n getRootContainer: config.getRootContainer,\n });\n\n this.initMouseEvent();\n this.initKeyEvent();\n }\n\n public disableMultiSelect() {\n this.disabledMultiSelect = true;\n if (this.multiDr) {\n this.multiDr.destroy();\n this.multiDr = undefined;\n }\n }\n\n public enableMultiSelect() {\n this.disabledMultiSelect = false;\n\n if (!this.multiDr) {\n this.multiDr = this.createMultiDr(this.config);\n }\n }\n\n /**\n * 设置水平/垂直参考线\n * @param type 参考线类型\n * @param guidelines 参考线坐标数组\n */\n public setGuidelines(type: GuidesType, guidelines: number[]): void {\n this.dr.setGuidelines(type, guidelines);\n this.multiDr?.setGuidelines(type, guidelines);\n }\n\n /**\n * 清空所有参考线\n */\n public clearGuides(): void {\n this.dr.clearGuides();\n this.multiDr?.clearGuides();\n }\n\n /**\n * 更新moveable,外部主要调用场景是元素配置变更、页面大小变更\n * @param el 变更的元素\n */\n public updateMoveable(el?: HTMLElement): void {\n this.dr.updateMoveable(el);\n // 多选时不可配置元素,因此不存在多选元素变更,不需要传el\n this.multiDr?.updateMoveable();\n }\n\n /**\n * 判断是否单选选中的元素\n */\n public isSelectedEl(el: HTMLElement): boolean {\n // 有可能dom已经重新渲染,不再是原来的dom了,所以这里判断id,而不是判断el === this.selectedDom\n return el.id === this.selectedEl?.id;\n }\n\n public setSelectedEl(el?: HTMLElement): void {\n this.selectedEl = el;\n }\n\n public getSelectedEl(): HTMLElement | undefined {\n return this.selectedEl;\n }\n\n public getSelectedElList(): HTMLElement[] {\n return this.selectedElList;\n }\n\n public getMoveableOption<K extends keyof MoveableOptions>(key: K): MoveableOptions[K] | undefined {\n if (this.dr.getTarget()) {\n return this.dr.getOption(key);\n }\n if (this.multiDr?.targetList.length) {\n return this.multiDr.getOption(key);\n }\n }\n\n /**\n * 获取鼠标下方第一个可选中元素,如果元素层叠,返回到是最上层元素\n * @param event 鼠标事件\n * @returns 鼠标下方第一个可选中元素\n */\n public async getElementFromPoint(event: MouseEvent): Promise<HTMLElement | undefined> {\n const els = this.getElementsFromPoint(event as Point);\n\n this.emit('get-elements-from-point', els);\n\n let stopped = false;\n const stop = () => (stopped = true);\n for (const el of els) {\n if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.isElCanSelect(el, event, stop))) {\n if (stopped) break;\n return el;\n }\n }\n }\n\n /**\n * 判断一个元素能否在当前场景被选中\n * @param el 被判断的元素\n * @param event 鼠标事件\n * @param stop 通过该元素如果得知剩下的元素都不可被选中,通知调用方终止对剩下元素的判断\n * @returns 能否选中\n */\n public async isElCanSelect(el: HTMLElement, event: MouseEvent, stop: () => boolean): Promise<boolean> {\n // 执行业务方传入的判断逻辑\n const canSelectByProp = await this.canSelect(el, event, stop);\n if (!canSelectByProp) return false;\n // 多选规则\n if (this.isMultiSelectStatus) {\n return this.canMultiSelect(el, stop);\n }\n return true;\n }\n\n /**\n * 判断一个元素是否可以被多选,如果当前元素是page,则调stop函数告诉调用方不必继续判断其它元素了\n */\n public canMultiSelect(el: HTMLElement, stop: () => boolean): boolean {\n // 多选状态下不可以选中magic-ui-page,并停止继续向上层选中\n if (el.className.includes(PAGE_CLASS)) {\n stop();\n return false;\n }\n const selectedEl = this.getSelectedEl();\n // 先单击选中了页面(magic-ui-page),再按住多选键多选时,任一元素均可选中\n if (selectedEl?.className.includes(PAGE_CLASS)) {\n return true;\n }\n return this.multiDr?.canSelect(el, selectedEl) || false;\n }\n\n public select(el: HTMLElement, event: MouseEvent | undefined): void {\n this.setSelectedEl(el);\n this.clearSelectStatus(SelectStatus.MULTI_SELECT);\n this.dr.select(el, event);\n }\n\n public multiSelect(idOrElList: HTMLElement[] | Id[]): void {\n this.selectedElList = idOrElList.map((idOrEl) => this.getTargetElement(idOrEl));\n this.clearSelectStatus(SelectStatus.SELECT);\n this.multiDr?.multiSelect(this.selectedElList);\n }\n\n public getHighlightEl(): HTMLElement | undefined {\n return this.highlightedEl;\n }\n\n public setHighlightEl(el: HTMLElement | undefined): void {\n this.highlightedEl = el;\n }\n\n public highlight(idOrEl: Id | HTMLElement): void {\n let el;\n try {\n el = this.getTargetElement(idOrEl);\n } catch (error) {\n this.clearHighlight();\n return;\n }\n\n // 选中组件不高亮、多选拖拽状态不高亮\n if (el === this.getSelectedEl() || this.multiDr?.dragStatus === StageDragStatus.ING) {\n this.clearHighlight();\n return;\n }\n if (el === this.highlightedEl || !el) return;\n\n this.highlightLayer.highlight(el);\n this.highlightedEl = el;\n this.emit('highlight', el);\n }\n\n public clearHighlight(): void {\n this.setHighlightEl(undefined);\n this.highlightLayer.clearHighlight();\n }\n\n /**\n * 用于在切换选择模式时清除上一次的状态\n * @param selectType 需要清理的选择模式\n */\n public clearSelectStatus(selectType: SelectStatus): void {\n if (selectType === SelectStatus.MULTI_SELECT) {\n this.multiDr?.clearSelectStatus();\n this.selectedElList = [];\n } else {\n this.dr.clearSelectStatus();\n }\n }\n\n /**\n * 找到鼠标下方的容器,通过添加className对容器进行标记\n * @param event 鼠标事件\n * @param excludeElList 计算鼠标点所在容器时要排除的元素列表\n */\n public async addContainerHighlightClassName(event: MouseEvent, excludeElList: Element[]): Promise<void> {\n const doc = this.getRenderDocument();\n if (!doc) return;\n\n const els = this.getElementsFromPoint(event);\n\n for (const el of els) {\n if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.isContainer(el)) && !excludeElList.includes(el)) {\n addClassName(el, doc, this.containerHighlightClassName);\n break;\n }\n }\n }\n\n /**\n * 鼠标拖拽着元素,在容器上方悬停,延迟一段时间后,对容器进行标记,如果悬停时间够长将标记成功,悬停时间短,调用方通过返回的timeoutId取消标记\n * 标记的作用:1、高亮容器,给用户一个加入容器的交互感知;2、释放鼠标后,通过标记的标志找到要加入的容器\n * @param event 鼠标事件\n * @param excludeElList 计算鼠标所在容器时要排除的元素列表\n * @returns timeoutId,调用方在鼠标移走时要取消该timeout,阻止标记\n */\n public delayedMarkContainer(event: MouseEvent, excludeElList: Element[] = []): NodeJS.Timeout | undefined {\n if (this.canAddToContainer()) {\n return globalThis.setTimeout(() => {\n this.addContainerHighlightClassName(event, excludeElList);\n }, this.containerHighlightDuration);\n }\n return undefined;\n }\n\n public getDragStatus() {\n return this.dr.getDragStatus();\n }\n\n public destroy(): void {\n this.container.removeEventListener('mousedown', this.mouseDownHandler);\n this.container.removeEventListener('mousemove', this.mouseMoveHandler);\n this.container.removeEventListener('mouseleave', this.mouseLeaveHandler);\n this.container.removeEventListener('wheel', this.mouseWheelHandler);\n this.dr.destroy();\n this.multiDr?.destroy();\n this.highlightLayer.destroy();\n }\n\n private createDr(config: ActionManagerConfig) {\n const createDrHelper = () =>\n new DragResizeHelper({\n container: config.container,\n updateDragEl: config.updateDragEl,\n });\n\n const dr = new StageDragResize({\n container: config.container,\n disabledDragStart: config.disabledDragStart,\n moveableOptions: this.changeCallback(config.moveableOptions, false),\n dragResizeHelper: createDrHelper(),\n getRootContainer: config.getRootContainer,\n getRenderDocument: config.getRenderDocument,\n markContainerEnd: this.markContainerEnd.bind(this),\n delayedMarkContainer: this.delayedMarkContainer.bind(this),\n });\n\n dr.on('update', (data: UpdateEventData) => {\n // 点击组件并立即拖动的场景,要保证select先被触发,延迟update通知\n setTimeout(() => this.emit('update', data));\n })\n .on('sort', (data: UpdateEventData) => {\n // 点击组件并立即拖动的场景,要保证select先被触发,延迟update通知\n setTimeout(() => this.emit('sort', data));\n })\n .on('select-parent', () => {\n this.emit('select-parent');\n })\n .on('remove', () => {\n const drTarget = this.dr.getTarget();\n if (!drTarget) return;\n const data: RemoveEventData = {\n data: [{ el: drTarget }],\n };\n this.emit('remove', data);\n })\n .on('drag-start', (e: OnDragStart) => {\n this.emit('drag-start', e);\n });\n\n return dr;\n }\n\n private createMultiDr(config: ActionManagerConfig) {\n const createDrHelper = () =>\n new DragResizeHelper({\n container: config.container,\n updateDragEl: config.updateDragEl,\n });\n const multiDr = new StageMultiDragResize({\n container: config.container,\n moveableOptions: this.changeCallback(config.moveableOptions, true),\n dragResizeHelper: createDrHelper(),\n getRootContainer: config.getRootContainer,\n getRenderDocument: config.getRenderDocument,\n markContainerEnd: this.markContainerEnd.bind(this),\n delayedMarkContainer: this.delayedMarkContainer.bind(this),\n });\n\n multiDr\n ?.on('update', (data: UpdateEventData) => {\n this.emit('multi-update', data);\n })\n .on('change-to-select', async (id: Id, e: MouseEvent) => {\n // 如果还在多选状态,不触发切换到单选\n if (this.isMultiSelectStatus) return false;\n const el = this.getTargetElement(id);\n this.emit('change-to-select', el, e);\n });\n\n return multiDr;\n }\n\n private changeCallback(options: CustomizeMoveableOptions, isMulti: boolean): CustomizeMoveableOptions {\n // 在actionManager才能获取到各种参数,在这里传好参数有比较好的扩展性\n if (typeof options === 'function') {\n return () => {\n // 要再判断一次,不然过不了ts检查\n if (typeof options === 'function') {\n const cfg: CustomizeMoveableOptionsCallbackConfig = {\n targetEl: this.selectedEl,\n targetElId: this.selectedEl?.id,\n targetEls: this.selectedElList,\n targetElIds: this.selectedElList?.map((item) => item.id),\n isMulti,\n document: this.getRenderDocument(),\n };\n return options(cfg);\n }\n return options;\n };\n }\n return options;\n }\n\n /**\n * 在执行多选逻辑前,先准备好多选选中元素\n * @param el 新选中的元素\n * @returns 多选选中的元素列表\n */\n private async beforeMultiSelect(event: MouseEvent): Promise<void> {\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n\n // 如果已有单选选中元素,不是magic-ui-page就可以加入多选列表\n if (this.selectedEl && !this.selectedEl.className.includes(PAGE_CLASS)) {\n this.selectedElList.push(this.selectedEl as HTMLElement);\n this.setSelectedEl(undefined);\n }\n // 判断元素是否已在多选列表\n const existIndex = this.selectedElList.findIndex((selectedDom) => selectedDom.id === el.id);\n if (existIndex !== -1) {\n // 再次点击取消选中\n this.selectedElList.splice(existIndex, 1);\n } else {\n this.selectedElList.push(el);\n }\n }\n\n /**\n * 当前状态下能否将组件加入容器,默认是鼠标悬停一段时间加入,alt模式则是按住alt+鼠标悬停一段时间加入\n */\n private canAddToContainer(): boolean {\n return (\n this.containerHighlightType === ContainerHighlightType.DEFAULT ||\n (this.containerHighlightType === ContainerHighlightType.ALT && this.isAltKeydown)\n );\n }\n\n /**\n * 结束对container的标记状态\n * @returns 标记的容器元素,没有标记的容器时返回null\n */\n private markContainerEnd(): HTMLElement | null {\n const doc = this.getRenderDocument();\n if (doc && this.canAddToContainer()) {\n return removeClassNameByClassName(doc, this.containerHighlightClassName);\n }\n return null;\n }\n\n private initMouseEvent(): void {\n this.container.addEventListener('mousedown', this.mouseDownHandler);\n this.container.addEventListener('mousemove', this.mouseMoveHandler);\n this.container.addEventListener('mouseleave', this.mouseLeaveHandler);\n this.container.addEventListener('wheel', this.mouseWheelHandler);\n }\n\n /**\n * 初始化键盘事件监听\n */\n private initKeyEvent(): void {\n const { isMac } = new Env();\n const ctrl = isMac ? 'meta' : 'ctrl';\n\n // 多选启用状态监听\n KeyController.global.keydown(ctrl, (e) => {\n e.inputEvent.preventDefault();\n if (!this.disabledMultiSelect) {\n this.isMultiSelectStatus = true;\n }\n });\n // ctrl+tab切到其他窗口,需要将多选状态置为false\n KeyController.global.on('blur', () => {\n if (!this.disabledMultiSelect) {\n this.isMultiSelectStatus = false;\n }\n });\n KeyController.global.keyup(ctrl, (e) => {\n e.inputEvent.preventDefault();\n if (!this.disabledMultiSelect) {\n this.isMultiSelectStatus = false;\n }\n });\n\n // alt健监听,用于启用拖拽组件加入容器状态\n KeyController.global.keydown('alt', (e) => {\n e.inputEvent.preventDefault();\n this.isAltKeydown = true;\n });\n\n KeyController.global.keyup('alt', (e) => {\n e.inputEvent.preventDefault();\n this.markContainerEnd();\n this.isAltKeydown = false;\n });\n }\n\n /**\n * 在down事件中集中cpu处理画布中选中操作渲染,在up事件中再通知外面的编辑器更新\n */\n private mouseDownHandler = async (event: MouseEvent): Promise<void> => {\n this.clearHighlight();\n event.stopImmediatePropagation();\n event.stopPropagation();\n\n if (this.isStopTriggerSelect(event)) return;\n\n // 点击状态下不触发高亮事件\n this.container.removeEventListener('mousemove', this.mouseMoveHandler);\n\n // 判断触发多选还是单选\n if (this.isMultiSelectStatus) {\n await this.beforeMultiSelect(event);\n if (this.selectedElList.length > 0) {\n this.emit('before-multi-select', this.selectedElList);\n }\n } else {\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n this.emit('before-select', el, event);\n }\n getDocument().addEventListener('mouseup', this.mouseUpHandler);\n };\n\n private isStopTriggerSelect(event: MouseEvent): boolean {\n if (event.button !== MouseButton.LEFT && event.button !== MouseButton.RIGHT) return true;\n if (!event.target) return true;\n\n const targetClassList = (event.target as HTMLDivElement).classList;\n\n // 如果单击多选选中区域,则不需要再触发选中了,要支持此处单击后进行拖动\n if (!this.isMultiSelectStatus && targetClassList.contains('moveable-area')) {\n return true;\n }\n // 点击对象如果是边框锚点,则可能是resize; 点击对象是功能按钮\n if (targetClassList.contains('moveable-control') || isMoveableButton(event.target as Element)) {\n return true;\n }\n return false;\n }\n\n /**\n * 在up事件中负责对外通知选中事件,通知画布之外的编辑器更新\n */\n private mouseUpHandler = (event: MouseEvent): void => {\n getDocument().removeEventListener('mouseup', this.mouseUpHandler);\n this.container.addEventListener('mousemove', this.mouseMoveHandler);\n if (this.isMultiSelectStatus) {\n this.emit('multi-select', this.selectedElList, event);\n } else {\n this.emit('select', this.selectedEl, event);\n }\n };\n\n private mouseLeaveHandler = (event: MouseEvent) => {\n setTimeout(() => this.clearHighlight(), throttleTime);\n this.emit('mouseleave', event);\n };\n\n private mouseWheelHandler = () => {\n this.clearHighlight();\n };\n}\n","import EventEmitter from 'events';\n\nimport Guides, { type GuidesEvents, type GuidesOptions } from '@scena/guides';\n\nimport { GuidesType } from './const';\nimport type { RuleOptions } from './types';\n\nexport default class Rule extends EventEmitter {\n public hGuides: Guides;\n public vGuides: Guides;\n public horizontalGuidelines: number[] = [];\n public verticalGuidelines: number[] = [];\n\n private container: HTMLDivElement;\n private containerResizeObserver: ResizeObserver;\n private isShowGuides = true;\n private guidesOptions?: Partial<GuidesOptions>;\n\n constructor(container: HTMLDivElement, options?: RuleOptions) {\n super();\n\n this.guidesOptions = options?.guidesOptions || {};\n\n this.container = container;\n this.hGuides = this.createGuides(GuidesType.HORIZONTAL, this.horizontalGuidelines);\n this.vGuides = this.createGuides(GuidesType.VERTICAL, this.verticalGuidelines);\n\n this.containerResizeObserver = new ResizeObserver(() => {\n this.vGuides.resize();\n this.hGuides.resize();\n });\n\n this.containerResizeObserver.observe(this.container);\n }\n\n /**\n * 是否显示辅助线\n * @param isShowGuides 是否显示\n */\n public showGuides(isShowGuides = true) {\n this.isShowGuides = isShowGuides;\n\n this.hGuides.setState({\n showGuides: isShowGuides,\n });\n\n this.vGuides.setState({\n showGuides: isShowGuides,\n });\n }\n\n public setGuides([hLines, vLines]: [number[], number[]]) {\n this.horizontalGuidelines = hLines;\n this.verticalGuidelines = vLines;\n\n this.hGuides.setState({\n defaultGuides: hLines,\n });\n\n this.vGuides.setState({\n defaultGuides: vLines,\n });\n\n this.emit('change-guides', {\n type: GuidesType.HORIZONTAL,\n guides: hLines,\n });\n\n this.emit('change-guides', {\n type: GuidesType.VERTICAL,\n guides: vLines,\n });\n }\n\n /**\n * 清空所有参考线\n */\n public clearGuides() {\n this.setGuides([[], []]);\n }\n\n /**\n * 是否显示标尺\n * @param show 是否显示\n */\n public showRule(show = true) {\n // 当尺子隐藏时发现大小变化,显示后会变形,所以这里做重新初始化处理\n if (show) {\n this.hGuides.destroy();\n this.hGuides = this.createGuides(GuidesType.HORIZONTAL, this.horizontalGuidelines);\n\n this.vGuides.destroy();\n this.vGuides = this.createGuides(GuidesType.VERTICAL, this.verticalGuidelines);\n } else {\n this.hGuides.setState({\n rulerStyle: {\n visibility: 'hidden',\n },\n });\n\n this.vGuides.setState({\n rulerStyle: {\n visibility: 'hidden',\n },\n });\n }\n }\n\n public scrollRule(scrollTop: number) {\n this.hGuides.scrollGuides(scrollTop);\n this.hGuides.scroll(0);\n\n this.vGuides.scrollGuides(0);\n this.vGuides.scroll(scrollTop);\n }\n\n public destroy(): void {\n this.hGuides.off('changeGuides', this.hGuidesChangeGuidesHandler);\n this.vGuides.off('changeGuides', this.vGuidesChangeGuidesHandler);\n this.containerResizeObserver.disconnect();\n this.removeAllListeners();\n }\n\n private getGuidesStyle = (type: GuidesType) => ({\n position: 'fixed',\n zIndex: 1,\n left: type === GuidesType.HORIZONTAL ? 0 : '-30px',\n top: type === GuidesType.HORIZONTAL ? '-30px' : 0,\n width: type === GuidesType.HORIZONTAL ? '100%' : '30px',\n height: type === GuidesType.HORIZONTAL ? '30px' : '100%',\n });\n\n private createGuides = (type: GuidesType, defaultGuides: number[] = []): Guides => {\n const guides = new Guides(this.container, {\n type,\n defaultGuides,\n displayDragPos: true,\n backgroundColor: '#fff',\n lineColor: '#000',\n textColor: '#000',\n style: this.getGuidesStyle(type),\n showGuides: this.isShowGuides,\n ...this.guidesOptions,\n });\n\n const changEventHandler = {\n [GuidesType.HORIZONTAL]: this.hGuidesChangeGuidesHandler,\n [GuidesType.VERTICAL]: this.vGuidesChangeGuidesHandler,\n }[type];\n\n if (changEventHandler) {\n guides.on('changeGuides', changEventHandler);\n }\n\n return guides;\n };\n\n private hGuidesChangeGuidesHandler = (e: GuidesEvents['changeGuides']) => {\n this.horizontalGuidelines = e.guides;\n this.emit('change-guides', {\n type: GuidesType.HORIZONTAL,\n guides: this.horizontalGuidelines,\n });\n };\n\n private vGuidesChangeGuidesHandler = (e: GuidesEvents['changeGuides']) => {\n this.verticalGuidelines = e.guides;\n this.emit('change-guides', {\n type: GuidesType.VERTICAL,\n guides: this.verticalGuidelines,\n });\n };\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createDiv, getDocument, injectStyle } from '@tmagic/utils';\n\nimport { Mode, ZIndex } from './const';\nimport Rule from './Rule';\nimport type { RuleOptions } from './types';\nimport { getScrollParent, isFixedParent } from './util';\n\nconst wrapperClassName = 'editor-mask-wrapper';\n\nconst hideScrollbar = () => {\n injectStyle(getDocument(), `.${wrapperClassName}::-webkit-scrollbar { width: 0 !important; display: none }`);\n};\n\nconst createContent = (): HTMLDivElement =>\n createDiv({\n className: 'editor-mask',\n cssText: `\n position: absolute;\n top: 0;\n left: 0;\n transform: translate3d(0, 0, 0);\n `,\n });\n\nconst createWrapper = (): HTMLDivElement => {\n const el = createDiv({\n className: wrapperClassName,\n cssText: `\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n overflow: hidden;\n z-index: ${ZIndex.MASK};\n `,\n });\n\n hideScrollbar();\n\n return el;\n};\n\n/**\n * 蒙层\n * @description 用于拦截页面的点击动作,避免点击时触发组件自身动作;在编辑器中点击组件应当是选中组件;\n */\nexport default class StageMask extends Rule {\n public content: HTMLDivElement = createContent();\n public wrapper: HTMLDivElement;\n public page: HTMLElement | null = null;\n public scrollTop = 0;\n public scrollLeft = 0;\n public width = 0;\n public height = 0;\n public wrapperHeight = 0;\n public wrapperWidth = 0;\n public maxScrollTop = 0;\n public maxScrollLeft = 0;\n\n private mode: Mode = Mode.ABSOLUTE;\n private pageScrollParent: HTMLElement | null = null;\n private intersectionObserver: IntersectionObserver | null = null;\n private wrapperResizeObserver: ResizeObserver | null = null;\n\n constructor(options?: RuleOptions) {\n const wrapper = createWrapper();\n super(wrapper, options);\n\n this.wrapper = wrapper;\n\n this.content.addEventListener('wheel', this.mouseWheelHandler);\n this.wrapper.appendChild(this.content);\n }\n\n public setMode(mode: Mode) {\n this.mode = mode;\n this.scroll();\n\n this.content.dataset.mode = mode;\n\n if (mode === Mode.FIXED) {\n this.content.style.width = `${this.wrapperWidth}px`;\n this.content.style.height = `${this.wrapperHeight}px`;\n } else {\n this.content.style.width = `${this.width}px`;\n this.content.style.height = `${this.height}px`;\n }\n }\n\n /**\n * 初始化视窗和蒙层监听,监听元素是否在视窗区域、监听mask蒙层所在的wrapper大小变化\n * @description 初始化视窗和蒙层监听\n * @param page 页面Dom节点\n */\n public observe(page: HTMLElement): void {\n if (!page) return;\n\n this.page = page;\n this.initObserverIntersection();\n this.initObserverWrapper();\n }\n\n /**\n * 处理页面大小变更,同步页面和mask大小\n * @param entries ResizeObserverEntry,获取页面最新大小\n */\n public pageResize(entries: ResizeObserverEntry[]): void {\n const [entry] = entries;\n const { clientHeight, clientWidth } = entry.target;\n this.setHeight(clientHeight);\n this.setWidth(clientWidth);\n\n this.scroll();\n }\n\n /**\n * 监听一个组件是否在画布可视区域内\n * @param el 被选中的组件,可能是左侧目录树中选中的\n */\n public observerIntersection(el: HTMLElement): void {\n this.intersectionObserver?.observe(el);\n }\n\n /**\n * 挂载Dom节点\n * @param el 将蒙层挂载到该Dom节点上\n */\n public mount(el: HTMLDivElement): void {\n if (!this.content) throw new Error('content 不存在');\n\n el.appendChild(this.wrapper);\n }\n\n public setLayout(el: HTMLElement): void {\n this.setMode(isFixedParent(el) ? Mode.FIXED : Mode.ABSOLUTE);\n }\n\n public scrollIntoView(el: Element): void {\n el.scrollIntoView();\n if (!this.pageScrollParent) return;\n this.scrollLeft = this.pageScrollParent.scrollLeft;\n this.scrollTop = this.pageScrollParent.scrollTop;\n this.scroll();\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.content?.remove();\n this.page = null;\n this.pageScrollParent = null;\n this.wrapperResizeObserver?.disconnect();\n\n super.destroy();\n }\n\n /**\n * 监听选中元素是否在画布可视区域内,如果目标元素不在可视区域内,通过滚动使该元素出现在可视区域\n */\n private initObserverIntersection(): void {\n this.pageScrollParent = getScrollParent(this.page as HTMLElement) || null;\n this.intersectionObserver?.disconnect();\n\n if (typeof IntersectionObserver !== 'undefined') {\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const { target, intersectionRatio } = entry;\n if (intersectionRatio <= 0) {\n this.scrollIntoView(target);\n }\n this.intersectionObserver?.unobserve(target);\n });\n },\n {\n root: this.pageScrollParent,\n rootMargin: '0px',\n threshold: 1.0,\n },\n );\n }\n }\n\n /**\n * 监听mask的容器大小变化\n */\n private initObserverWrapper(): void {\n this.wrapperResizeObserver?.disconnect();\n if (typeof ResizeObserver !== 'undefined') {\n this.wrapperResizeObserver = new ResizeObserver((entries) => {\n const [entry] = entries;\n const { clientHeight, clientWidth } = entry.target;\n this.wrapperHeight = clientHeight;\n this.wrapperWidth = clientWidth;\n this.setMaxScrollLeft();\n this.setMaxScrollTop();\n });\n this.wrapperResizeObserver.observe(this.wrapper);\n }\n }\n\n private scroll() {\n this.fixScrollValue();\n\n let { scrollLeft, scrollTop } = this;\n\n if (this.pageScrollParent) {\n this.pageScrollParent.scrollTo({\n top: scrollTop,\n left: scrollLeft,\n });\n }\n\n if (this.mode === Mode.FIXED) {\n scrollLeft = 0;\n scrollTop = 0;\n }\n\n this.scrollRule(scrollTop);\n this.scrollTo(scrollLeft, scrollTop);\n }\n\n private scrollTo(scrollLeft: number, scrollTop: number): void {\n this.content.style.transform = `translate3d(${-scrollLeft}px, ${-scrollTop}px, 0)`;\n\n const event = new CustomEvent<{\n scrollLeft: number;\n scrollTop: number;\n }>('customScroll', {\n detail: {\n scrollLeft: this.scrollLeft,\n scrollTop: this.scrollTop,\n },\n });\n this.content.dispatchEvent(event);\n }\n\n /**\n * 设置蒙层高度\n * @param height 高度\n */\n private setHeight(height: number): void {\n this.height = height;\n this.setMaxScrollTop();\n this.content.style.height = `${height}px`;\n }\n\n /**\n * 设置蒙层宽度\n * @param width 宽度\n */\n private setWidth(width: number): void {\n this.width = width;\n this.setMaxScrollLeft();\n this.content.style.width = `${width}px`;\n }\n\n /**\n * 计算并设置最大滚动宽度\n */\n private setMaxScrollLeft(): void {\n this.maxScrollLeft = Math.max(this.width - this.wrapperWidth, 0);\n }\n\n /**\n * 计算并设置最大滚动高度\n */\n private setMaxScrollTop(): void {\n this.maxScrollTop = Math.max(this.height - this.wrapperHeight, 0);\n }\n\n /**\n * 修复滚动距离\n * 由于滚动容器变化等因素,会导致当前滚动的距离不正确\n */\n private fixScrollValue(): void {\n if (this.scrollTop < 0) this.scrollTop = 0;\n if (this.scrollLeft < 0) this.scrollLeft = 0;\n if (this.maxScrollTop < this.scrollTop) this.scrollTop = this.maxScrollTop;\n if (this.maxScrollLeft < this.scrollLeft) this.scrollLeft = this.maxScrollLeft;\n }\n\n private mouseWheelHandler = (event: WheelEvent) => {\n if (!this.page) throw new Error('page 未初始化');\n\n const { deltaY, deltaX } = event;\n\n if (this.page.clientHeight < this.wrapperHeight && deltaY) return;\n if (this.page.clientWidth < this.wrapperWidth && deltaX) return;\n\n if (this.maxScrollTop > 0) {\n this.scrollTop = this.scrollTop + deltaY;\n }\n\n if (this.maxScrollLeft > 0) {\n this.scrollLeft = this.scrollLeft + deltaX;\n }\n\n this.scroll();\n this.emit('scroll', event);\n };\n}\n","export 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\"","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EventEmitter } from 'events';\n\nimport { Id } from '@tmagic/schema';\nimport { getHost, injectStyle, isSameDomain } from '@tmagic/utils';\n\nimport { DEFAULT_ZOOM } from './const';\nimport style from './style.css?raw';\nimport {\n type Point,\n type RemoveData,\n RenderType,\n type Runtime,\n type RuntimeWindow,\n type StageRenderConfig,\n type UpdateData,\n} from './types';\nimport { addSelectedClassName, removeSelectedClassName } from './util';\n\nexport default class StageRender extends EventEmitter {\n /** 组件的js、css执行的环境,直接渲染为当前window,iframe渲染则为iframe.contentWindow */\n public contentWindow: RuntimeWindow | null = null;\n public runtime: Runtime | null = null;\n public iframe?: HTMLIFrameElement;\n public nativeContainer?: HTMLDivElement;\n\n private runtimeUrl?: string;\n private zoom = DEFAULT_ZOOM;\n private renderType: RenderType;\n private customizedRender?: () => Promise<HTMLElement | null>;\n\n constructor({ runtimeUrl, zoom, customizedRender, renderType = RenderType.IFRAME }: StageRenderConfig) {\n super();\n\n this.renderType = renderType;\n this.runtimeUrl = runtimeUrl || '';\n this.customizedRender = customizedRender;\n this.setZoom(zoom);\n\n if (this.renderType === RenderType.IFRAME) {\n this.createIframe();\n } else if (this.renderType === RenderType.NATIVE) {\n this.createNativeContainer();\n }\n }\n\n public getMagicApi = () => ({\n onPageElUpdate: (el: HTMLElement) => this.emit('page-el-update', el),\n onRuntimeReady: (runtime: Runtime) => {\n this.runtime = runtime;\n // @ts-ignore\n globalThis.runtime = runtime;\n this.emit('runtime-ready', runtime);\n },\n });\n\n public async add(data: UpdateData): Promise<void> {\n const runtime = await this.getRuntime();\n return runtime?.add?.(data);\n }\n\n public async remove(data: RemoveData): Promise<void> {\n const runtime = await this.getRuntime();\n return runtime?.remove?.(data);\n }\n\n public async update(data: UpdateData): Promise<void> {\n const runtime = await this.getRuntime();\n // 更新画布中的组件\n runtime?.update?.(data);\n }\n\n public async select(els: HTMLElement[]): Promise<void> {\n const runtime = await this.getRuntime();\n\n for (const el of els) {\n await runtime?.select?.(el.id);\n if (runtime?.beforeSelect) {\n await runtime.beforeSelect(el);\n }\n this.flagSelectedEl(el);\n }\n }\n\n public setZoom(zoom: number = DEFAULT_ZOOM): void {\n this.zoom = zoom;\n }\n\n /**\n * 挂载Dom节点\n * @param el 将页面挂载到该Dom节点上\n */\n public async mount(el: HTMLDivElement) {\n if (this.iframe) {\n if (!isSameDomain(this.runtimeUrl) && this.runtimeUrl) {\n // 不同域,使用srcdoc发起异步请求,需要目标地址支持跨域\n let html = await fetch(this.runtimeUrl).then((res) => res.text());\n // 使用base, 解决相对路径或绝对路径的问题\n const base = `${location.protocol}//${getHost(this.runtimeUrl)}`;\n html = html.replace('<head>', `<head>\\n<base href=\"${base}\">`);\n this.iframe.srcdoc = html;\n }\n\n el.appendChild<HTMLIFrameElement>(this.iframe);\n\n this.postTmagicRuntimeReady();\n } else if (this.nativeContainer) {\n el.appendChild(this.nativeContainer);\n }\n }\n\n public getRuntime = (): Promise<Runtime> => {\n if (this.runtime) return Promise.resolve(this.runtime);\n return new Promise((resolve) => {\n const listener = (runtime: Runtime) => {\n this.off('runtime-ready', listener);\n resolve(runtime);\n };\n this.on('runtime-ready', listener);\n });\n };\n\n public getDocument(): Document | undefined {\n return this.contentWindow?.document;\n }\n\n /**\n * 通过坐标获得坐标下所有HTML元素数组\n * @param point 坐标\n * @returns 坐标下方所有HTML元素数组,会包含父元素直至html,元素层叠时返回顺序是从上到下\n */\n public getElementsFromPoint(point: Point): HTMLElement[] {\n let x = point.clientX;\n let y = point.clientY;\n\n if (this.iframe) {\n const rect = this.iframe.getClientRects()[0];\n if (rect) {\n x = x - rect.left;\n y = y - rect.top;\n }\n }\n\n return this.getDocument()?.elementsFromPoint(x / this.zoom, y / this.zoom) as HTMLElement[];\n }\n\n public getTargetElement(idOrEl: Id | HTMLElement): HTMLElement {\n if (typeof idOrEl === 'string' || typeof idOrEl === 'number') {\n const el = this.getDocument()?.getElementById(`${idOrEl}`);\n if (!el) throw new Error(`不存在ID为${idOrEl}的元素`);\n return el;\n }\n return idOrEl;\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.iframe?.removeEventListener('load', this.iframeLoadHandler);\n this.contentWindow = null;\n this.iframe?.remove();\n this.iframe = undefined;\n this.removeAllListeners();\n }\n\n private createIframe(): HTMLIFrameElement {\n this.iframe = globalThis.document.createElement('iframe');\n // 同源,直接加载\n this.iframe.src = this.runtimeUrl && isSameDomain(this.runtimeUrl) ? this.runtimeUrl : '';\n this.iframe.style.cssText = `\n border: 0;\n width: 100%;\n height: 100%;\n `;\n\n this.iframe.addEventListener('load', this.iframeLoadHandler);\n\n return this.iframe;\n }\n\n private async createNativeContainer() {\n this.contentWindow = globalThis as unknown as RuntimeWindow;\n this.nativeContainer = globalThis.document.createElement('div');\n\n this.contentWindow.magic = this.getMagicApi();\n\n if (this.customizedRender) {\n const el = await this.customizedRender();\n if (el) {\n this.nativeContainer.appendChild(el);\n }\n }\n }\n\n /**\n * 在runtime中对被选中的元素进行标记,部分组件有对选中态进行特殊显示的需求\n * @param el 被选中的元素\n */\n private flagSelectedEl(el: HTMLElement): void {\n const doc = this.getDocument();\n if (doc) {\n removeSelectedClassName(doc);\n addSelectedClassName(el, doc);\n }\n }\n\n private iframeLoadHandler = async () => {\n if (!this.contentWindow?.magic) {\n this.postTmagicRuntimeReady();\n }\n\n if (!this.contentWindow) return;\n\n if (this.customizedRender) {\n const el = await this.customizedRender();\n if (el) {\n this.contentWindow.document?.body?.appendChild(el);\n }\n }\n\n this.emit('onload');\n\n injectStyle(this.contentWindow.document, style);\n };\n\n private postTmagicRuntimeReady() {\n this.contentWindow = this.iframe?.contentWindow as RuntimeWindow;\n\n this.contentWindow.magic = this.getMagicApi();\n\n this.contentWindow.postMessage(\n {\n tmagicRuntimeReady: true,\n },\n '*',\n );\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EventEmitter } from 'events';\n\nimport type { MoveableOptions, OnDragStart } from 'moveable';\n\nimport type { Id } from '@tmagic/schema';\n\nimport ActionManager from './ActionManager';\nimport { DEFAULT_ZOOM } from './const';\nimport StageMask from './StageMask';\nimport StageRender from './StageRender';\nimport type {\n ActionManagerConfig,\n CustomizeRender,\n GuidesEventData,\n Point,\n RemoveData,\n RemoveEventData,\n Runtime,\n StageCoreConfig,\n UpdateData,\n UpdateEventData,\n} from './types';\n\n/**\n * 负责管理画布,管理renderer、mask、actionManager三个核心类,并负责统一对外通信,包括提供接口和抛事件\n */\nexport default class StageCore extends EventEmitter {\n public container?: HTMLDivElement;\n public renderer: StageRender;\n public mask: StageMask;\n\n private actionManager: ActionManager;\n private pageResizeObserver: ResizeObserver | null = null;\n private autoScrollIntoView: boolean | undefined;\n private customizedRender?: CustomizeRender;\n\n constructor(config: StageCoreConfig) {\n super();\n\n this.autoScrollIntoView = config.autoScrollIntoView;\n this.customizedRender = config.render;\n\n this.renderer = new StageRender({\n runtimeUrl: config.runtimeUrl,\n zoom: config.zoom,\n renderType: config.renderType,\n customizedRender: async (): Promise<HTMLElement | null> => {\n if (this?.customizedRender) {\n return await this.customizedRender(this);\n }\n return null;\n },\n });\n this.mask = new StageMask({\n guidesOptions: config.guidesOptions,\n });\n this.actionManager = new ActionManager(this.getActionManagerConfig(config));\n\n this.initRenderEvent();\n this.initActionEvent();\n this.initMaskEvent();\n }\n\n /**\n * 单选选中元素\n * @param idOrEl 选中的id或者元素\n */\n public async select(idOrEl: Id | HTMLElement, event?: MouseEvent): Promise<void> {\n const el = this.renderer.getTargetElement(idOrEl);\n if (el === this.actionManager.getSelectedEl()) return;\n\n await this.renderer.select([el]);\n\n this.mask.setLayout(el);\n\n this.actionManager.select(el, event);\n\n if (this.autoScrollIntoView || el.dataset.autoScrollIntoView) {\n this.mask.observerIntersection(el);\n }\n }\n\n /**\n * 多选选中多个元素\n * @param idOrElList 选中元素的id或元素列表\n */\n public async multiSelect(idOrElList: HTMLElement[] | Id[]): Promise<void> {\n const els = idOrElList.map((idOrEl) => this.renderer.getTargetElement(idOrEl));\n if (els.length === 0) return;\n\n const lastEl = els[els.length - 1];\n // 是否减少了组件选择\n const isReduceSelect = els.length < this.actionManager.getSelectedElList().length;\n await this.renderer.select(els);\n\n this.mask.setLayout(lastEl);\n\n this.actionManager.multiSelect(idOrElList);\n\n if ((this.autoScrollIntoView || lastEl.dataset.autoScrollIntoView) && !isReduceSelect) {\n this.mask.observerIntersection(lastEl);\n }\n }\n\n /**\n * 高亮选中元素\n * @param el 要高亮的元素\n */\n public highlight(idOrEl: Id | HTMLElement): void {\n this.actionManager.highlight(idOrEl);\n }\n\n public clearHighlight(): void {\n this.actionManager.clearHighlight();\n }\n\n /**\n * 更新组件\n * @param data 更新组件的数据\n */\n public async update(data: UpdateData): Promise<void> {\n const { config } = data;\n\n await this.renderer.update(data);\n // 通过setTimeout等画布中组件完成渲染更新\n setTimeout(() => {\n const el = this.renderer.getTargetElement(`${config.id}`);\n if (el && this.actionManager.isSelectedEl(el)) {\n // 更新了组件的布局,需要重新设置mask是否可以滚动\n this.mask.setLayout(el);\n // 组件有更新,需要set\n this.actionManager.setSelectedEl(el);\n this.actionManager.updateMoveable(el);\n }\n });\n }\n\n /**\n * 往画布增加一个组件\n * @param data 组件信息数据\n */\n public async add(data: UpdateData): Promise<void> {\n return await this.renderer.add(data);\n }\n\n /**\n * 从画布删除一个组件\n * @param data 组件信息数据\n */\n public async remove(data: RemoveData): Promise<void> {\n return await this.renderer.remove(data);\n }\n\n public setZoom(zoom: number = DEFAULT_ZOOM): void {\n this.renderer.setZoom(zoom);\n }\n\n /**\n * 挂载Dom节点\n * @param el 将stage挂载到该Dom节点上\n */\n public async mount(el: HTMLDivElement) {\n this.container = el;\n const { mask, renderer } = this;\n\n await renderer.mount(el);\n mask.mount(el);\n\n this.emit('mounted');\n }\n\n /**\n * 清空所有参考线\n */\n public clearGuides() {\n this.mask.clearGuides();\n this.actionManager.clearGuides();\n }\n\n /**\n * @deprecated 废弃接口,建议用delayedMarkContainer代替\n */\n public getAddContainerHighlightClassNameTimeout(\n event: MouseEvent,\n excludeElList: Element[] = [],\n ): NodeJS.Timeout | undefined {\n return this.delayedMarkContainer(event, excludeElList);\n }\n\n /**\n * 鼠标拖拽着元素,在容器上方悬停,延迟一段时间后,对容器进行标记,如果悬停时间够长将标记成功,悬停时间短,调用方通过返回的timeoutId取消标记\n * 标记的作用:1、高亮容器,给用户一个加入容器的交互感知;2、释放鼠标后,通过标记的标志找到要加入的容器\n * @param event 鼠标事件\n * @param excludeElList 计算鼠标所在容器时要排除的元素列表\n * @returns timeoutId,调用方在鼠标移走时要取消该timeout,阻止标记\n */\n public delayedMarkContainer(event: MouseEvent, excludeElList: Element[] = []): NodeJS.Timeout | undefined {\n return this.actionManager.delayedMarkContainer(event, excludeElList);\n }\n\n public getMoveableOption<K extends keyof MoveableOptions>(key: K): MoveableOptions[K] | undefined {\n return this.actionManager.getMoveableOption(key);\n }\n\n public getDragStatus() {\n return this.actionManager.getDragStatus();\n }\n\n public disableMultiSelect() {\n this.actionManager.disableMultiSelect();\n }\n\n public enableMultiSelect() {\n this.actionManager.enableMultiSelect();\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n const { mask, renderer, actionManager, pageResizeObserver } = this;\n\n renderer.destroy();\n mask.destroy();\n actionManager.destroy();\n pageResizeObserver?.disconnect();\n\n this.removeAllListeners();\n\n this.container = undefined;\n }\n\n /**\n * 监听页面大小变化\n */\n private observePageResize(page: HTMLElement): void {\n if (typeof ResizeObserver !== 'undefined') {\n this.pageResizeObserver = new ResizeObserver((entries) => {\n this.mask.pageResize(entries);\n this.actionManager.updateMoveable();\n });\n\n this.pageResizeObserver.observe(page);\n }\n }\n\n private getActionManagerConfig(config: StageCoreConfig): ActionManagerConfig {\n const actionManagerConfig: ActionManagerConfig = {\n containerHighlightClassName: config.containerHighlightClassName,\n containerHighlightDuration: config.containerHighlightDuration,\n containerHighlightType: config.containerHighlightType,\n moveableOptions: config.moveableOptions,\n container: this.mask.content,\n disabledDragStart: config.disabledDragStart,\n disabledMultiSelect: config.disabledMultiSelect,\n canSelect: config.canSelect,\n isContainer: config.isContainer,\n updateDragEl: config.updateDragEl,\n getRootContainer: () => this.container,\n getRenderDocument: () => this.renderer.getDocument(),\n getTargetElement: (idOrEl: Id | HTMLElement) => this.renderer.getTargetElement(idOrEl),\n getElementsFromPoint: (point: Point) => this.renderer.getElementsFromPoint(point),\n };\n\n return actionManagerConfig;\n }\n\n private initRenderEvent(): void {\n this.renderer.on('runtime-ready', (runtime: Runtime) => {\n this.emit('runtime-ready', runtime);\n });\n this.renderer.on('page-el-update', (el: HTMLElement) => {\n this.mask?.observe(el);\n this.observePageResize(el);\n\n this.emit('page-el-update', el);\n });\n }\n\n private initMaskEvent(): void {\n this.mask.on('change-guides', (data: GuidesEventData) => {\n this.actionManager.setGuidelines(data.type, data.guides);\n this.emit('change-guides', data);\n });\n }\n\n /**\n * 初始化操作相关事件监听\n */\n private initActionEvent(): void {\n this.initActionManagerEvent();\n this.initDrEvent();\n this.initMulDrEvent();\n this.initHighlightEvent();\n this.initMouseEvent();\n }\n\n /**\n * 初始化ActionManager类本身抛出来的事件监听\n */\n private initActionManagerEvent(): void {\n this.actionManager\n .on('before-select', (idOrEl: Id | HTMLElement, event?: MouseEvent) => {\n this.select(idOrEl, event);\n })\n .on('select', (selectedEl: HTMLElement, event: MouseEvent) => {\n this.emit('select', selectedEl, event);\n })\n .on('before-multi-select', (idOrElList: HTMLElement[] | Id[]) => {\n this.multiSelect(idOrElList);\n })\n .on('multi-select', (selectedElList: HTMLElement[], event: MouseEvent) => {\n this.emit('multi-select', selectedElList, event);\n });\n }\n\n /**\n * 初始化DragResize类通过ActionManager抛出来的事件监听\n */\n private initDrEvent(): void {\n this.actionManager\n .on('update', (data: UpdateEventData) => {\n this.emit('update', data);\n })\n .on('sort', (data: UpdateEventData) => {\n this.emit('sort', data);\n })\n .on('select-parent', () => {\n this.emit('select-parent');\n })\n .on('remove', (data: RemoveEventData) => {\n this.emit('remove', data);\n });\n }\n\n /**\n * 初始化MultiDragResize类通过ActionManager抛出来的事件监听\n */\n private initMulDrEvent(): void {\n this.actionManager\n // 多选切换到单选\n .on('change-to-select', (el: HTMLElement, e: MouseEvent) => {\n this.select(el);\n // 先保证画布内完成渲染,再通知外部更新\n setTimeout(() => this.emit('select', el, e));\n })\n .on('multi-update', (data: UpdateEventData) => {\n this.emit('update', data);\n });\n }\n\n /**\n * 初始化Highlight类通过ActionManager抛出来的事件监听\n */\n private initHighlightEvent(): void {\n this.actionManager.on('highlight', async (highlightEl: HTMLElement) => {\n this.emit('highlight', highlightEl);\n });\n }\n\n /**\n * 初始化Highlight类通过ActionManager抛出来的事件监听\n */\n private initMouseEvent(): void {\n this.actionManager\n .on('mousemove', (event: MouseEvent) => {\n this.emit('mousemove', event);\n })\n .on('mouseleave', (event: MouseEvent) => {\n this.emit('mouseleave', event);\n })\n .on('drag-start', (e: OnDragStart) => {\n this.emit('drag-start', e);\n });\n }\n}\n"],"names":["GuidesType","ZIndex","MouseButton","Mode","AbleActionEventType","ContainerHighlightType","RenderType","SelectStatus","StageDragStatus","EventEmitter"],"mappings":"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"}
|