@tmagic/stage 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"tmagic-stage.mjs","sources":["../src/const.ts","../src/types.ts","../src/util.ts","../src/StageDragResize.ts","../src/TargetCalibrate.ts","../src/StageHighlight.ts","../src/Rule.ts","../src/StageMask.ts","../src/StageMultiDragResize.ts","../src/style.css?used&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) 2021 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 = '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}\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","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 { MoveableOptions } from 'moveable';\n\nimport Core from '@tmagic/core';\nimport type { Id, MApp, MContainer, MNode } from '@tmagic/schema';\n\nimport { GuidesType } from './const';\nimport StageCore from './StageCore';\nimport StageDragResize from './StageDragResize';\nimport StageMask from './StageMask';\n\nexport type CanSelect = (el: HTMLElement, event: MouseEvent, stop: () => boolean) => boolean | Promise<boolean>;\nexport type IsContainer = (el: HTMLElement) => boolean | Promise<boolean>;\n\nexport enum ContainerHighlightType {\n DEFAULT = 'default',\n ALT = 'alt',\n}\n\nexport type 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?: ((core?: StageCore) => MoveableOptions) | MoveableOptions;\n multiMoveableOptions?: ((core?: StageCore) => MoveableOptions) | MoveableOptions;\n /** runtime 的HTML地址,可以是一个HTTP地址,如果和编辑器不同域,需要设置跨域,也可以是一个相对或绝对路径 */\n runtimeUrl?: string;\n render?: (renderer: StageCore) => Promise<HTMLElement> | HTMLElement;\n autoScrollIntoView?: boolean;\n updateDragEl?: (el: HTMLDivElement, target: HTMLElement) => void;\n};\n\nexport interface StageRenderConfig {\n core: StageCore;\n}\n\nexport interface StageMaskConfig {\n core: StageCore;\n}\n\nexport interface StageDragResizeConfig {\n core: StageCore;\n container: HTMLElement;\n mask: StageMask;\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 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 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;\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 core: StageCore;\n container: HTMLElement;\n}\n\nexport interface TargetCalibrateConfig {\n parent: HTMLElement;\n mask: StageMask;\n dr: StageDragResize;\n core: StageCore;\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 } 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: HTMLElement): Offset => {\n const { offsetParent } = el;\n\n const left = el.offsetLeft;\n const top = el.offsetTop;\n\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: HTMLElement) => {\n const offset = getOffset(el);\n const { transform } = 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 z-index: ${ZIndex.DRAG_EL};\n `;\n};\n\nexport const getAbsolutePosition = (el: HTMLElement, { top, left }: Offset) => {\n const { offsetParent } = el;\n\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: HTMLElement) => {\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: HTMLElement): 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 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: HTMLElement | SVGElement): 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: HTMLElement | SVGElement): 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","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 { EventEmitter } from 'events';\n\nimport KeyController from 'keycon';\nimport type { MoveableOptions } from 'moveable';\nimport Moveable from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { removeClassNameByClassName } from '@tmagic/utils';\n\nimport { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode, ZIndex } from './const';\nimport StageCore from './StageCore';\nimport StageMask from './StageMask';\nimport type { StageDragResizeConfig } from './types';\nimport { ContainerHighlightType, StageDragStatus } from './types';\nimport { calcValueByFontsize, down, getAbsolutePosition, getMode, getOffset, getTargetElStyle, up } from './util';\n\n/**\n * 选中框\n */\nexport default class StageDragResize extends EventEmitter {\n public core: StageCore;\n public mask: StageMask;\n /** 画布容器 */\n public container: HTMLElement;\n /** 目标节点 */\n public target?: HTMLElement;\n /** 目标节点在蒙层中的占位节点 */\n public dragEl?: HTMLDivElement;\n /** Moveable拖拽类实例 */\n public moveable?: Moveable;\n /** 水平参考线 */\n public horizontalGuidelines: number[] = [];\n /** 垂直参考线 */\n public verticalGuidelines: number[] = [];\n /** 对齐元素集合 */\n public elementGuidelines: HTMLElement[] = [];\n /** 布局方式:流式布局、绝对定位、固定定位 */\n public mode: Mode = Mode.ABSOLUTE;\n\n private moveableOptions: MoveableOptions = {};\n /** 拖动状态 */\n private dragStatus: StageDragStatus = StageDragStatus.END;\n /** 流式布局下,目标节点的镜像节点 */\n private ghostEl: HTMLElement | undefined;\n private moveableHelper?: MoveableHelper;\n private isContainerHighlight: Boolean = false;\n\n constructor(config: StageDragResizeConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n this.mask = config.mask;\n\n KeyController.global.keydown('alt', (e) => {\n e.inputEvent.preventDefault();\n this.isContainerHighlight = true;\n });\n KeyController.global.keyup('alt', (e) => {\n e.inputEvent.preventDefault();\n\n const doc = this.core.renderer.contentWindow?.document;\n if (doc && this.canContainerHighlight()) {\n removeClassNameByClassName(doc, this.core.containerHighlightClassName);\n }\n this.isContainerHighlight = false;\n });\n }\n\n /**\n * 将选中框渲染并覆盖到选中的组件Dom节点上方\n * 当选中的节点是不是absolute时,会创建一个新的节点出来作为拖拽目标\n * @param el 选中组件的Dom节点元素\n * @param event 鼠标事件\n */\n public select(el: HTMLElement, event?: MouseEvent): void {\n const oldTarget = this.target;\n this.target = el;\n\n // 从不能拖动到能拖动的节点之间切换,要重新创建moveable,不然dragStart不生效\n if (!this.moveable || this.target !== oldTarget) {\n this.init(el);\n this.moveableHelper = MoveableHelper.create({\n useBeforeRender: true,\n useRender: false,\n createAuto: true,\n });\n\n this.initMoveable();\n } else {\n this.updateMoveable();\n }\n\n if (event) {\n this.moveable?.dragStart(event);\n }\n }\n\n /**\n * 初始化选中框并渲染出来\n */\n public updateMoveable(el = this.target): void {\n if (!this.moveable) throw new Error('未初始化moveable');\n if (!el) throw new Error('未选中任何节点');\n\n this.target = el;\n\n this.init(el);\n\n Object.entries(this.moveableOptions).forEach(([key, value]) => {\n (this.moveable as any)[key] = value;\n });\n this.moveable.updateTarget();\n }\n\n public setGuidelines(type: GuidesType, guidelines: number[]): void {\n if (type === GuidesType.HORIZONTAL) {\n this.horizontalGuidelines = guidelines;\n this.moveableOptions.horizontalGuidelines = guidelines;\n } else if (type === GuidesType.VERTICAL) {\n this.verticalGuidelines = guidelines;\n this.moveableOptions.verticalGuidelines = guidelines;\n }\n\n if (this.moveable) {\n this.updateMoveable();\n }\n }\n\n public clearGuides() {\n this.horizontalGuidelines = [];\n this.verticalGuidelines = [];\n this.moveableOptions.horizontalGuidelines = [];\n this.moveableOptions.verticalGuidelines = [];\n this.updateMoveable();\n }\n\n public clearSelectStatus(): void {\n if (!this.moveable) return;\n this.destroyDragEl();\n this.moveable.target = null;\n this.moveable.updateTarget();\n }\n\n public destroyDragEl(): void {\n this.dragEl?.remove();\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.destroyGhostEl();\n this.destroyDragEl();\n this.dragStatus = StageDragStatus.END;\n this.removeAllListeners();\n }\n\n private init(el: HTMLElement): void {\n // 如果有滚动条会导致resize时获取到width,height不准确\n if (/(auto|scroll)/.test(el.style.overflow)) {\n el.style.overflow = 'hidden';\n }\n this.mode = getMode(el);\n\n this.destroyGhostEl();\n this.destroyDragEl();\n this.dragEl = globalThis.document.createElement('div');\n this.container.append(this.dragEl);\n this.dragEl.style.cssText = getTargetElStyle(el);\n this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;\n\n if (typeof this.core.config.updateDragEl === 'function') {\n this.core.config.updateDragEl(this.dragEl, el);\n }\n this.moveableOptions = this.getOptions({\n target: this.dragEl,\n });\n }\n\n private setElementGuidelines(nodes: HTMLElement[]) {\n this.elementGuidelines.forEach((node) => {\n node.remove();\n });\n this.elementGuidelines = [];\n\n if (this.mode === Mode.ABSOLUTE) {\n this.container.append(this.createGuidelineElements(nodes));\n }\n }\n\n private createGuidelineElements(nodes: HTMLElement[]) {\n const frame = globalThis.document.createDocumentFragment();\n\n for (const node of nodes) {\n const { width, height } = node.getBoundingClientRect();\n if (node === this.target) continue;\n const { left, top } = getOffset(node as HTMLElement);\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 private initMoveable() {\n this.moveable?.destroy();\n\n this.moveable = new Moveable(this.container, {\n ...this.moveableOptions,\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 const frame = {\n left: 0,\n top: 0,\n };\n\n this.moveable\n .on('resizeStart', (e) => {\n if (!this.target) return;\n\n this.dragStatus = StageDragStatus.START;\n this.moveableHelper?.onResizeStart(e);\n\n frame.top = this.target.offsetTop;\n frame.left = this.target.offsetLeft;\n })\n .on('resize', (e) => {\n const { width, height, drag } = e;\n if (!this.moveable || !this.target || !this.dragEl) return;\n\n const { beforeTranslate } = drag;\n this.dragStatus = StageDragStatus.ING;\n\n // 流式布局\n if (this.mode === Mode.SORTABLE) {\n this.target.style.top = '0px';\n this.dragEl.style.width = `${width}px`;\n this.dragEl.style.height = `${height}px`;\n } else {\n this.moveableHelper?.onResize(e);\n this.target.style.left = `${frame.left + beforeTranslate[0]}px`;\n this.target.style.top = `${frame.top + beforeTranslate[1]}px`;\n }\n\n this.target.style.width = `${width}px`;\n this.target.style.height = `${height}px`;\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 const frame = {\n left: 0,\n top: 0,\n };\n\n let timeout: NodeJS.Timeout | undefined;\n\n const { contentWindow } = this.core.renderer;\n const doc = contentWindow?.document;\n\n this.moveable\n .on('dragStart', (e) => {\n if (!this.target) throw new Error('未选中组件');\n\n this.dragStatus = StageDragStatus.START;\n\n this.moveableHelper?.onDragStart(e);\n\n if (this.mode === Mode.SORTABLE) {\n this.ghostEl = this.generateGhostEl(this.target);\n }\n\n frame.top = this.target.offsetTop;\n frame.left = this.target.offsetLeft;\n })\n .on('drag', (e) => {\n if (!this.target || !this.dragEl) return;\n\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (this.canContainerHighlight()) {\n timeout = this.core.getAddContainerHighlightClassNameTimeout(e.inputEvent, [this.target]);\n }\n\n this.dragStatus = StageDragStatus.ING;\n\n // 流式布局\n if (this.ghostEl) {\n this.ghostEl.style.top = `${frame.top + e.beforeTranslate[1]}px`;\n return;\n }\n\n this.moveableHelper?.onDrag(e);\n\n this.target.style.left = `${frame.left + e.beforeTranslate[0]}px`;\n this.target.style.top = `${frame.top + e.beforeTranslate[1]}px`;\n })\n .on('dragEnd', () => {\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n\n let parentEl: HTMLElement | null = null;\n\n if (doc && this.canContainerHighlight()) {\n parentEl = removeClassNameByClassName(doc, this.core.containerHighlightClassName);\n }\n\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.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.moveableHelper?.onRotateStart(e);\n })\n .on('rotate', (e) => {\n if (!this.target || !this.dragEl) return;\n this.dragStatus = StageDragStatus.ING;\n this.moveableHelper?.onRotate(e);\n const frame = this.moveableHelper?.getFrame(e.target);\n this.target.style.transform = frame?.toCSSObject().transform || '';\n })\n .on('rotateEnd', (e) => {\n this.dragStatus = StageDragStatus.END;\n const frame = this.moveableHelper?.getFrame(e.target);\n this.emit('update', {\n el: this.target,\n style: {\n transform: frame?.get('transform'),\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.moveableHelper?.onScaleStart(e);\n })\n .on('scale', (e) => {\n if (!this.target || !this.dragEl) return;\n this.dragStatus = StageDragStatus.ING;\n this.moveableHelper?.onScale(e);\n const frame = this.moveableHelper?.getFrame(e.target);\n this.target.style.transform = frame?.toCSSObject().transform || '';\n })\n .on('scaleEnd', (e) => {\n this.dragStatus = StageDragStatus.END;\n const frame = this.moveableHelper?.getFrame(e.target);\n this.emit('update', {\n el: this.target,\n style: {\n transform: frame?.get('transform'),\n },\n });\n });\n }\n\n private sort(): void {\n if (!this.target || !this.ghostEl) throw new Error('未知错误');\n const { top } = this.ghostEl.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 { contentWindow } = this.core.renderer;\n const doc = contentWindow?.document;\n\n if (!doc) return;\n\n const offset =\n this.mode === Mode.SORTABLE ? { left: 0, top: 0 } : { left: this.target.offsetLeft, top: this.target.offsetTop };\n\n let left = calcValueByFontsize(doc, offset.left);\n let top = calcValueByFontsize(doc, offset.top);\n const width = calcValueByFontsize(doc, this.target.clientWidth);\n const height = calcValueByFontsize(doc, this.target.clientHeight);\n\n if (parentEl && this.mode === Mode.ABSOLUTE && this.dragEl) {\n const [translateX, translateY] = this.moveableHelper?.getFrame(this.dragEl).properties.transform.translate.value;\n const { left: parentLeft, top: parentTop } = getOffset(parentEl);\n left =\n calcValueByFontsize(doc, this.dragEl.offsetLeft) +\n parseFloat(translateX) -\n calcValueByFontsize(doc, parentLeft);\n top =\n calcValueByFontsize(doc, this.dragEl.offsetTop) + parseFloat(translateY) - calcValueByFontsize(doc, parentTop);\n }\n\n this.emit('update', {\n data: [\n {\n el: this.target,\n style: isResize ? { left, top, width, height } : { left, top },\n },\n ],\n parentEl,\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 el.after(ghostEl);\n return ghostEl;\n }\n\n private setGhostElChildrenId(el: Element) {\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 private destroyGhostEl(): void {\n this.ghostEl?.remove();\n this.ghostEl = undefined;\n }\n\n private getOptions(options: MoveableOptions = {}): MoveableOptions {\n if (!this.target) return {};\n\n const isAbsolute = this.mode === Mode.ABSOLUTE;\n const isFixed = this.mode === Mode.FIXED;\n const isSortable = this.mode === Mode.SORTABLE;\n\n let { moveableOptions = {} } = this.core.config;\n\n if (typeof moveableOptions === 'function') {\n moveableOptions = moveableOptions(this.core);\n }\n\n const elementGuidelines: any = moveableOptions.elementGuidelines || this.target.parentElement?.children || [];\n\n this.setElementGuidelines(elementGuidelines);\n\n if (moveableOptions.elementGuidelines) {\n delete moveableOptions.elementGuidelines;\n }\n\n return {\n origin: false,\n rootContainer: this.core.container,\n zoom: 1,\n dragArea: false,\n draggable: true,\n resizable: true,\n scalable: false,\n rotatable: false,\n snappable: isAbsolute || isFixed,\n snapGap: isAbsolute || isFixed,\n snapThreshold: 5,\n snapDigit: 0,\n throttleDrag: 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 horizontalGuidelines: this.horizontalGuidelines,\n verticalGuidelines: this.verticalGuidelines,\n elementGuidelines: this.elementGuidelines,\n\n bounds: {\n top: 0,\n // 设置0的话无法移动到left为0,所以只能设置为-1\n left: -1,\n right: this.container.clientWidth - 1,\n bottom: isSortable ? undefined : this.container.clientHeight,\n ...(moveableOptions.bounds || {}),\n },\n ...options,\n ...moveableOptions,\n };\n }\n\n private canContainerHighlight() {\n return (\n this.core.containerHighlightType === ContainerHighlightType.DEFAULT ||\n (this.core.containerHighlightType === ContainerHighlightType.ALT && this.isContainerHighlight)\n );\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 { Mode, ZIndex } from './const';\nimport StageCore from './StageCore';\nimport StageDragResize from './StageDragResize';\nimport StageMask from './StageMask';\nimport type { Offset, TargetCalibrateConfig } from './types';\nimport { getMode } from './util';\n\n/**\n * 将选中的节点修正定位后,添加一个操作节点到蒙层上\n */\nexport default class TargetCalibrate extends EventEmitter {\n public parent: HTMLElement;\n public mask: StageMask;\n public dr: StageDragResize;\n public core: StageCore;\n public operationEl: HTMLDivElement;\n\n constructor(config: TargetCalibrateConfig) {\n super();\n\n this.parent = config.parent;\n this.mask = config.mask;\n this.dr = config.dr;\n this.core = config.core;\n\n this.operationEl = globalThis.document.createElement('div');\n this.parent.append(this.operationEl);\n }\n\n public update(el: HTMLElement, prefix: String): HTMLElement {\n const { left, top } = this.getOffset(el);\n const { transform } = getComputedStyle(el);\n this.operationEl.style.cssText = `\n position: absolute;\n transform: ${transform};\n left: ${left}px;\n top: ${top}px;\n width: ${el.clientWidth}px;\n height: ${el.clientHeight}px;\n z-index: ${ZIndex.DRAG_EL};\n `;\n\n this.operationEl.id = `${prefix}${el.id}`;\n\n if (typeof this.core.config.updateDragEl === 'function') {\n this.core.config.updateDragEl(this.operationEl, el);\n }\n\n return this.operationEl;\n }\n\n public destroy(): void {\n this.operationEl?.remove();\n }\n\n private getOffset(el: HTMLElement): Offset {\n const { offsetParent } = el;\n\n const left = el.offsetLeft;\n const top = el.offsetTop;\n\n if (offsetParent) {\n const parentOffset = this.getOffset(offsetParent as HTMLElement);\n return {\n left: left + parentOffset.left,\n top: top + parentOffset.top,\n };\n }\n\n // 选中固定定位元素后editor-mask高度被置为视窗大小\n if (this.dr.mode === Mode.FIXED) {\n // 弹窗的情况\n if (getMode(el) === Mode.FIXED) {\n return {\n left,\n top,\n };\n }\n\n return {\n left: left - this.mask.scrollLeft,\n top: top - this.mask.scrollTop,\n };\n }\n\n // 无父元素的固定定位需按滚动值计算\n if (getMode(el) === Mode.FIXED) {\n return {\n left: left + this.mask.scrollLeft,\n top: top + this.mask.scrollTop,\n };\n }\n\n return {\n left,\n top,\n };\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 } from './const';\nimport StageCore from './StageCore';\nimport TargetCalibrate from './TargetCalibrate';\nimport type { StageHighlightConfig } from './types';\nexport default class StageHighlight extends EventEmitter {\n public core: StageCore;\n public container: HTMLElement;\n public target?: HTMLElement;\n public moveable?: Moveable;\n public calibrationTarget: TargetCalibrate;\n\n constructor(config: StageHighlightConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n this.calibrationTarget = new TargetCalibrate({\n parent: this.core.mask.content,\n mask: this.core.mask,\n dr: this.core.dr,\n core: this.core,\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 this.moveable?.destroy();\n\n this.moveable = new Moveable(this.container, {\n target: this.calibrationTarget.update(el, HIGHLIGHT_EL_ID_PREFIX),\n origin: false,\n rootContainer: this.core.container,\n zoom: 2,\n });\n }\n\n /**\n * 清空高亮\n */\n public clearHighlight(): void {\n if (!this.moveable) return;\n this.target = undefined;\n this.moveable.target = null;\n this.moveable.updateTarget();\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.calibrationTarget.destroy();\n }\n}\n","import EventEmitter from 'events';\n\nimport Guides, { GuidesEvents } from '@scena/guides';\n\nimport { GuidesType } from './const';\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\n constructor(container: HTMLDivElement) {\n super();\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.hGuides.on('changeGuides', this.hGuidesChangeGuidesHandler);\n this.vGuides.on('changeGuides', this.vGuidesChangeGuidesHandler);\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 show 是否显示\n */\n public showGuides(show = true) {\n this.hGuides.setState({\n showGuides: show,\n });\n\n this.vGuides.setState({\n showGuides: show,\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('changeGuides', {\n type: GuidesType.HORIZONTAL,\n guides: hLines,\n });\n\n this.emit('changeGuides', {\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 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 });\n\n private hGuidesChangeGuidesHandler = (e: GuidesEvents['changeGuides']) => {\n this.horizontalGuidelines = e.guides;\n this.emit('changeGuides', {\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('changeGuides', {\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) 2021 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 KeyController from 'keycon';\nimport { throttle } from 'lodash-es';\n\nimport { createDiv, injectStyle } from '@tmagic/utils';\n\nimport { Mode, MouseButton, ZIndex } from './const';\nimport Rule from './Rule';\nimport type StageCore from './StageCore';\nimport type { StageMaskConfig } from './types';\nimport { getScrollParent, isFixedParent } from './util';\n\nconst wrapperClassName = 'editor-mask-wrapper';\nconst throttleTime = 100;\n\nconst hideScrollbar = () => {\n injectStyle(globalThis.document, `.${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 core: StageCore;\n public page: HTMLElement | null = null;\n public pageScrollParent: 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 public intersectionObserver: IntersectionObserver | null = null;\n public isMultiSelectStatus: Boolean = false;\n\n private mode: Mode = Mode.ABSOLUTE;\n private pageResizeObserver: ResizeObserver | null = null;\n private wrapperResizeObserver: ResizeObserver | null = null;\n /**\n * 高亮事件处理函数\n * @param event 事件对象\n */\n private highlightHandler = throttle((event: MouseEvent): void => {\n this.emit('highlight', event);\n }, throttleTime);\n\n constructor(config: StageMaskConfig) {\n const wrapper = createWrapper();\n super(wrapper);\n\n this.wrapper = wrapper;\n this.core = config.core;\n\n this.content.addEventListener('mousedown', this.mouseDownHandler);\n this.wrapper.appendChild(this.content);\n this.content.addEventListener('wheel', this.mouseWheelHandler);\n this.content.addEventListener('mousemove', this.highlightHandler);\n this.content.addEventListener('mouseleave', this.mouseLeaveHandler);\n\n const isMac = /mac os x/.test(navigator.userAgent.toLowerCase());\n\n const ctrl = isMac ? 'meta' : 'ctrl';\n\n KeyController.global.keydown(ctrl, (e) => {\n e.inputEvent.preventDefault();\n this.isMultiSelectStatus = true;\n });\n KeyController.global.keyup(ctrl, (e) => {\n e.inputEvent.preventDefault();\n this.isMultiSelectStatus = false;\n });\n }\n\n public setMode(mode: Mode) {\n this.mode = mode;\n this.scroll();\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 * 监听页面大小变化\n * @description 同步页面与mask的大小\n * @param page 页面Dom节点\n */\n public observe(page: HTMLElement): void {\n if (!page) return;\n\n this.page = page;\n this.pageScrollParent = getScrollParent(page) || this.core.renderer.contentWindow?.document.documentElement || null;\n this.pageResizeObserver?.disconnect();\n this.wrapperResizeObserver?.disconnect();\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 if (typeof ResizeObserver !== 'undefined') {\n this.pageResizeObserver = new ResizeObserver((entries) => {\n const [entry] = entries;\n const { clientHeight, clientWidth } = entry.target;\n this.setHeight(clientHeight);\n this.setWidth(clientWidth);\n\n this.scroll();\n if (this.core.dr.moveable) {\n this.core.dr.updateMoveable();\n }\n });\n\n this.pageResizeObserver.observe(page);\n\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 /**\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.pageResizeObserver?.disconnect();\n this.wrapperResizeObserver?.disconnect();\n\n this.content.removeEventListener('mouseleave', this.mouseLeaveHandler);\n super.destroy();\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\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 /**\n * 点击事件处理函数\n * @param event 事件对象\n */\n private mouseDownHandler = (event: MouseEvent): void => {\n this.emit('clearHighlight');\n event.stopImmediatePropagation();\n event.stopPropagation();\n\n if (event.button !== MouseButton.LEFT && event.button !== MouseButton.RIGHT) return;\n\n // 如果单击多选选中区域,则不需要再触发选中了,而可能是拖动行为\n if (!this.isMultiSelectStatus && (event.target as HTMLDivElement).className.indexOf('moveable-area') !== -1) {\n return;\n }\n // 点击对象如果是边框锚点,则可能是resize\n if ((event.target as HTMLDivElement).className.indexOf('moveable-control') !== -1) {\n return;\n }\n\n this.content.removeEventListener('mousemove', this.highlightHandler);\n\n // 判断触发多选还是单选\n if (this.isMultiSelectStatus) {\n this.emit('beforeMultiSelect', event);\n } else {\n this.emit('beforeSelect', event);\n }\n // 如果是右键点击,这里的mouseup事件监听没有效果\n globalThis.document.addEventListener('mouseup', this.mouseUpHandler);\n };\n\n private mouseUpHandler = (): void => {\n globalThis.document.removeEventListener('mouseup', this.mouseUpHandler);\n this.content.addEventListener('mousemove', this.highlightHandler);\n if (!this.isMultiSelectStatus) {\n this.emit('select');\n }\n };\n\n private mouseWheelHandler = (event: WheelEvent) => {\n this.emit('clearHighlight');\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\n this.emit('scroll', event);\n };\n\n private mouseLeaveHandler = () => {\n setTimeout(() => this.emit('clearHighlight'), throttleTime);\n };\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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, OnResizeStart } from 'moveable';\nimport Moveable from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { DRAG_EL_ID_PREFIX, PAGE_CLASS } from './const';\nimport StageCore from './StageCore';\nimport StageMask from './StageMask';\nimport { StageDragResizeConfig, StageDragStatus } from './types';\nimport { calcValueByFontsize, getMode, getTargetElStyle } from './util';\n\nexport default class StageMultiDragResize extends EventEmitter {\n public core: StageCore;\n public mask: StageMask;\n /** 画布容器 */\n public container: HTMLElement;\n /** 多选:目标节点组 */\n public targetList: HTMLElement[] = [];\n /** 多选:目标节点在蒙层中的占位节点组 */\n public dragElList: HTMLDivElement[] = [];\n /** Moveable多选拖拽类实例 */\n public moveableForMulti?: Moveable;\n /** 拖动状态 */\n public dragStatus: StageDragStatus = StageDragStatus.END;\n private multiMoveableHelper?: MoveableHelper;\n\n constructor(config: StageDragResizeConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n this.mask = config.mask;\n }\n\n /**\n * 多选\n * @param els\n */\n public multiSelect(els: HTMLElement[]): void {\n this.targetList = els;\n this.core.dr.destroyDragEl();\n this.destroyDragElList();\n // 生成虚拟多选节点\n this.dragElList = els.map((elItem) => {\n const dragElDiv = globalThis.document.createElement('div');\n this.container.append(dragElDiv);\n dragElDiv.style.cssText = getTargetElStyle(elItem);\n dragElDiv.id = `${DRAG_EL_ID_PREFIX}${elItem.id}`;\n // 业务方校准\n if (typeof this.core.config.updateDragEl === 'function') {\n this.core.config.updateDragEl(dragElDiv, elItem);\n }\n return dragElDiv;\n });\n this.moveableForMulti?.destroy();\n this.multiMoveableHelper?.clear();\n this.moveableForMulti = new Moveable(\n this.container,\n this.getOptions({\n target: this.dragElList,\n }),\n );\n this.multiMoveableHelper = MoveableHelper.create({\n useBeforeRender: true,\n useRender: false,\n createAuto: true,\n });\n const frames: { left: number; top: number; id: string }[] = [];\n\n const setFrames = (events: OnDragStart[] | OnResizeStart[]) => {\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 frames.push({\n left: matchEventTarget.offsetLeft,\n top: matchEventTarget.offsetTop,\n id: matchEventTarget.id,\n });\n });\n };\n\n this.moveableForMulti\n .on('resizeGroupStart', (params) => {\n const { events } = params;\n this.multiMoveableHelper?.onResizeGroupStart(params);\n setFrames(events);\n this.dragStatus = StageDragStatus.START;\n })\n .on('resizeGroup', (params) => {\n const { events } = params;\n // 拖动过程更新\n events.forEach((ev) => {\n const { width, height, beforeTranslate } = ev.drag;\n const frameSnapShot = frames.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 targeEl.style.left = `${frameSnapShot.left + beforeTranslate[0]}px`;\n targeEl.style.top = `${frameSnapShot.top + beforeTranslate[1]}px`;\n }\n\n // 更新页面元素位置\n targeEl.style.width = `${width}px`;\n targeEl.style.height = `${height}px`;\n });\n this.multiMoveableHelper?.onResizeGroup(params);\n this.dragStatus = StageDragStatus.ING;\n })\n .on('resizeGroupEnd', () => {\n this.update(true);\n this.dragStatus = StageDragStatus.END;\n })\n .on('dragGroupStart', (params) => {\n const { events } = params;\n this.multiMoveableHelper?.onDragGroupStart(params);\n // 记录拖动前快照\n setFrames(events);\n this.dragStatus = StageDragStatus.START;\n })\n .on('dragGroup', (params) => {\n const { events } = params;\n // 拖动过程更新\n events.forEach((ev) => {\n const frameSnapShot = frames.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 targeEl.style.left = `${frameSnapShot.left + ev.beforeTranslate[0]}px`;\n targeEl.style.top = `${frameSnapShot.top + ev.beforeTranslate[1]}px`;\n }\n });\n this.multiMoveableHelper?.onDragGroup(params);\n this.dragStatus = StageDragStatus.ING;\n })\n .on('dragGroupEnd', () => {\n this.update();\n this.dragStatus = StageDragStatus.END;\n })\n .on('clickGroup', (params) => {\n const { inputTarget, targets } = params;\n // 如果此时mask不处于多选状态下,且有多个元素被选中,同时点击的元素在选中元素中的其中一项,代表多选态切换为该元素的单选态\n if (!this.mask.isMultiSelectStatus && targets.length > 1 && targets.includes(inputTarget)) {\n this.emit('select', inputTarget.id.replace(DRAG_EL_ID_PREFIX, ''));\n }\n });\n }\n\n public canSelect(el: HTMLElement, stop: () => boolean): Boolean {\n // 多选状态下不可以选中magic-ui-page,并停止继续向上层选中\n if (el.className.includes(PAGE_CLASS)) {\n this.core.highlightedDom = undefined;\n this.core.highlightLayer.clearHighlight();\n stop();\n return false;\n }\n const currentTargetMode = getMode(el);\n let selectedDomMode = '';\n if (this.core.selectedDom?.className.includes(PAGE_CLASS)) {\n // 先单击选中了页面(magic-ui-page),再按住多选键多选时,任一元素均可选中\n return true;\n }\n if (this.targetList.length === 0 && this.core.selectedDom) {\n // 单选后添加到多选的情况\n selectedDomMode = getMode(this.core.selectedDom);\n } else if (this.targetList.length > 0) {\n // 已加入多选列表的布局模式是一样的,取第一个判断\n selectedDomMode = getMode(this.targetList[0]);\n }\n // 定位模式不同,不可混选\n if (currentTargetMode !== selectedDomMode) {\n return false;\n }\n return true;\n }\n\n /**\n * 清除多选状态\n */\n public clearSelectStatus(): void {\n if (!this.moveableForMulti) return;\n this.destroyDragElList();\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.destroyDragElList();\n }\n\n /**\n * 清除蒙层占位节点\n */\n public destroyDragElList(): void {\n this.dragElList.forEach((dragElItem) => dragElItem?.remove());\n }\n\n /**\n * 拖拽完成后将更新的位置信息暴露给上层业务方,业务方可以接收事件进行保存\n * @param isResize 是否进行大小缩放\n */\n private update(isResize = false): void {\n if (this.targetList.length === 0) return;\n\n const { contentWindow } = this.core.renderer;\n const doc = contentWindow?.document;\n if (!doc) return;\n\n this.emit('update', {\n data: this.targetList.map((targetItem) => {\n const offset = { left: targetItem.offsetLeft, top: targetItem.offsetTop };\n const left = calcValueByFontsize(doc, offset.left);\n const top = calcValueByFontsize(doc, offset.top);\n const width = calcValueByFontsize(doc, targetItem.clientWidth);\n const height = calcValueByFontsize(doc, targetItem.clientHeight);\n return {\n el: targetItem,\n style: isResize ? { left, top, width, height } : { left, top },\n };\n }),\n parentEl: null,\n });\n }\n\n /**\n * 获取moveable options参数\n * @param {MoveableOptions} options\n * @return {MoveableOptions} moveable options参数\n */\n private getOptions(options: MoveableOptions = {}): MoveableOptions {\n let { multiMoveableOptions = {} } = this.core.config;\n\n if (typeof multiMoveableOptions === 'function') {\n multiMoveableOptions = multiMoveableOptions(this.core);\n }\n\n return {\n defaultGroupRotate: 0,\n defaultGroupOrigin: '50% 50%',\n draggable: true,\n resizable: true,\n throttleDrag: 0,\n startDragRotate: 0,\n throttleDragRotate: 0,\n zoom: 1,\n origin: true,\n padding: { left: 0, top: 0, right: 0, bottom: 0 },\n snappable: true,\n bounds: {\n top: 0,\n // 设置0的话无法移动到left为0,所以只能设置为-1\n left: -1,\n right: this.container.clientWidth - 1,\n bottom: this.container.clientHeight,\n ...(multiMoveableOptions.bounds || {}),\n },\n ...options,\n ...multiMoveableOptions,\n };\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) 2021 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 { getHost, injectStyle, isSameDomain } from '@tmagic/utils';\n\nimport StageCore from './StageCore';\nimport style from './style.css?raw';\nimport type { Runtime, RuntimeWindow, StageRenderConfig } from './types';\n\nexport default class StageRender extends EventEmitter {\n /** 组件的js、css执行的环境,直接渲染为当前window,iframe渲染则为iframe.contentWindow */\n public contentWindow: RuntimeWindow | null = null;\n\n public runtime: Runtime | null = null;\n\n public iframe?: HTMLIFrameElement;\n\n public runtimeUrl?: string;\n\n public core: StageCore;\n\n private render?: (renderer: StageCore) => Promise<HTMLElement> | HTMLElement;\n\n constructor({ core }: StageRenderConfig) {\n super();\n\n this.core = core;\n this.runtimeUrl = core.config.runtimeUrl || '';\n this.render = core.config.render;\n\n this.iframe = globalThis.document.createElement('iframe');\n // 同源,直接加载\n this.iframe.src = 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.loadHandler);\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 /**\n * 挂载Dom节点\n * @param el 将页面挂载到该Dom节点上\n */\n public async mount(el: HTMLDivElement) {\n if (!this.iframe) {\n throw Error('mount 失败');\n }\n\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 }\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 /**\n * 销毁实例\n */\n public destroy(): void {\n this.iframe?.removeEventListener('load', this.loadHandler);\n this.contentWindow = null;\n this.iframe?.remove();\n this.iframe = undefined;\n this.removeAllListeners();\n }\n\n private loadHandler = async () => {\n if (!this.contentWindow?.magic) {\n this.postTmagicRuntimeReady();\n }\n\n if (!this.contentWindow) return;\n\n if (this.render) {\n const el = await this.render(this.core);\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) 2021 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 { Id } from '@tmagic/schema';\nimport { addClassName } from '@tmagic/utils';\n\nimport { CONTAINER_HIGHLIGHT_CLASS, DEFAULT_ZOOM, GHOST_EL_ID_PREFIX, PAGE_CLASS } from './const';\nimport StageDragResize from './StageDragResize';\nimport StageHighlight from './StageHighlight';\nimport StageMask from './StageMask';\nimport StageMultiDragResize from './StageMultiDragResize';\nimport StageRender from './StageRender';\nimport {\n CanSelect,\n ContainerHighlightType,\n GuidesEventData,\n IsContainer,\n RemoveData,\n Runtime,\n SortEventData,\n StageCoreConfig,\n StageDragStatus,\n UpdateData,\n UpdateEventData,\n} from './types';\nimport { addSelectedClassName, removeSelectedClassName } from './util';\n\nexport default class StageCore extends EventEmitter {\n public container?: HTMLDivElement;\n // 当前选中的节点\n public selectedDom: HTMLElement | undefined;\n // 多选选中的节点组\n public selectedDomList: HTMLElement[] = [];\n public highlightedDom: Element | undefined;\n public renderer: StageRender;\n public mask: StageMask;\n public dr: StageDragResize;\n public multiDr: StageMultiDragResize;\n public highlightLayer: StageHighlight;\n public config: StageCoreConfig;\n public zoom = DEFAULT_ZOOM;\n public containerHighlightClassName: string;\n public containerHighlightDuration: number;\n public containerHighlightType?: ContainerHighlightType;\n public isContainer: IsContainer;\n\n private canSelect: CanSelect;\n\n constructor(config: StageCoreConfig) {\n super();\n\n this.config = config;\n\n this.setZoom(config.zoom);\n this.canSelect = config.canSelect || ((el: HTMLElement) => !!el.id);\n this.isContainer = config.isContainer;\n this.containerHighlightClassName = config.containerHighlightClassName || CONTAINER_HIGHLIGHT_CLASS;\n this.containerHighlightDuration = config.containerHighlightDuration || 800;\n this.containerHighlightType = config.containerHighlightType;\n\n this.renderer = new StageRender({ core: this });\n this.mask = new StageMask({ core: this });\n this.dr = new StageDragResize({ core: this, container: this.mask.content, mask: this.mask });\n this.multiDr = new StageMultiDragResize({ core: this, container: this.mask.content, mask: this.mask });\n this.highlightLayer = new StageHighlight({ core: this, container: this.mask.wrapper });\n\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 });\n\n this.mask\n .on('beforeSelect', async (event: MouseEvent) => {\n this.clearSelectStatus('multiSelect');\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n this.select(el, event);\n })\n .on('select', () => {\n this.emit('select', this.selectedDom);\n })\n .on('changeGuides', (data: GuidesEventData) => {\n this.dr.setGuidelines(data.type, data.guides);\n this.emit('changeGuides', data);\n })\n .on('highlight', async (event: MouseEvent) => {\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n // 如果多选组件处于拖拽状态时不进行组件高亮\n if (this.multiDr.dragStatus === StageDragStatus.ING) return;\n await this.highlight(el);\n if (this.highlightedDom === this.selectedDom) {\n this.highlightLayer.clearHighlight();\n return;\n }\n this.emit('highlight', this.highlightedDom);\n })\n .on('clearHighlight', async () => {\n this.highlightLayer.clearHighlight();\n })\n .on('beforeMultiSelect', async (event: MouseEvent) => {\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n // 如果已有单选选中元素,不是magic-ui-page就可以加入多选列表\n if (this.selectedDom && !this.selectedDom.className.includes(PAGE_CLASS)) {\n this.selectedDomList.push(this.selectedDom as HTMLElement);\n this.selectedDom = undefined;\n }\n // 判断元素是否已在多选列表\n const existIndex = this.selectedDomList.findIndex((selectedDom) => selectedDom.id === el.id);\n if (existIndex !== -1) {\n // 再次点击取消选中\n this.selectedDomList.splice(existIndex, 1);\n } else {\n this.selectedDomList.push(el);\n }\n this.multiSelect(this.selectedDomList);\n });\n\n // 要先触发select,在触发update\n this.dr\n .on('update', (data: UpdateEventData) => {\n setTimeout(() => this.emit('update', data));\n })\n .on('sort', (data: UpdateEventData) => {\n setTimeout(() => this.emit('sort', data));\n });\n\n this.multiDr\n .on('update', (data: UpdateEventData) => {\n setTimeout(() => this.emit('update', data));\n })\n .on('select', async (id: Id) => {\n const el = await this.getTargetElement(id);\n this.select(el); // 选中\n setTimeout(() => this.emit('select', el)); // set node\n });\n }\n\n public getElementsFromPoint(event: MouseEvent) {\n const { renderer, zoom } = this;\n\n const doc = renderer.contentWindow?.document;\n let x = event.clientX;\n let y = event.clientY;\n\n if (renderer.iframe) {\n const rect = renderer.iframe.getClientRects()[0];\n if (rect) {\n x = x - rect.left;\n y = y - rect.top;\n }\n }\n\n return doc?.elementsFromPoint(x / zoom, y / zoom) as HTMLElement[];\n }\n\n public async getElementFromPoint(event: MouseEvent) {\n const els = this.getElementsFromPoint(event);\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 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.mask.isMultiSelectStatus) {\n return this.multiDr.canSelect(el, stop);\n }\n return true;\n }\n\n /**\n * 选中组件\n * @param idOrEl 组件Dom节点的id属性,或者Dom节点\n */\n public async select(idOrEl: Id | HTMLElement, event?: MouseEvent): Promise<void> {\n this.clearSelectStatus('multiSelect');\n const el = await this.getTargetElement(idOrEl);\n\n if (el === this.selectedDom) return;\n\n const runtime = await this.renderer.getRuntime();\n\n await runtime?.select?.(el.id);\n\n if (runtime?.beforeSelect) {\n await runtime.beforeSelect(el);\n }\n\n this.mask.setLayout(el);\n this.dr.select(el, event);\n\n if (this.config.autoScrollIntoView || el.dataset.autoScrollIntoView) {\n this.mask.intersectionObserver?.observe(el);\n }\n\n this.selectedDom = el;\n\n if (this.renderer.contentWindow) {\n removeSelectedClassName(this.renderer.contentWindow.document);\n if (this.selectedDom) {\n addSelectedClassName(this.selectedDom, this.renderer.contentWindow.document);\n }\n }\n }\n\n /**\n * 多选\n * @param domList 多选节点\n */\n public async multiSelect(idOrElList: HTMLElement[] | Id[]): Promise<void> {\n this.clearSelectStatus('select');\n const elList = await Promise.all(idOrElList.map(async (idOrEl) => await this.getTargetElement(idOrEl)));\n this.multiDr.multiSelect(elList);\n this.emit('multiSelect', elList);\n }\n\n /**\n * 更新选中的节点\n * @param data 更新的数据\n */\n public update(data: UpdateData): Promise<void> {\n const { config } = data;\n\n return this.renderer?.getRuntime().then((runtime) => {\n runtime?.update?.(data);\n // 更新配置后,需要等组件渲染更新\n setTimeout(() => {\n const el = this.renderer.contentWindow?.document.getElementById(`${config.id}`);\n // 有可能dom已经重新渲染,不再是原来的dom了,所以这里判断id,而不是判断el === this.selectedDom\n if (el && el.id === this.selectedDom?.id) {\n this.selectedDom = el;\n // 更新了组件的布局,需要重新设置mask是否可以滚动\n this.mask.setLayout(el);\n this.dr.updateMoveable(el);\n }\n }, 0);\n });\n }\n\n /**\n * 高亮选中组件\n * @param el 页面Dom节点\n */\n public async highlight(idOrEl: HTMLElement | Id): Promise<void> {\n let el;\n try {\n el = await this.getTargetElement(idOrEl);\n } catch (error) {\n this.highlightLayer.clearHighlight();\n return;\n }\n if (el === this.highlightedDom || !el) return;\n this.highlightLayer.highlight(el);\n this.highlightedDom = el;\n }\n\n public sortNode(data: SortEventData): Promise<void> {\n return this.renderer?.getRuntime().then((runtime) => runtime?.sortNode?.(data));\n }\n\n public add(data: UpdateData): Promise<void> {\n return this.renderer?.getRuntime().then((runtime) => runtime?.add?.(data));\n }\n\n public remove(data: RemoveData): Promise<void> {\n return this.renderer?.getRuntime().then((runtime) => runtime?.remove?.(data));\n }\n\n public setZoom(zoom: number = DEFAULT_ZOOM): void {\n this.zoom = zoom;\n }\n\n /**\n * 用于在切换选择模式时清除上一次的状态\n * @param selectType 需要清理的选择模式 多选:multiSelect,单选:select\n */\n public clearSelectStatus(selectType: String) {\n if (selectType === 'multiSelect') {\n this.multiDr.clearSelectStatus();\n this.selectedDomList = [];\n } else {\n this.dr.clearSelectStatus();\n }\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.dr.clearGuides();\n }\n\n public async addContainerHighlightClassName(event: MouseEvent, exclude: Element[]) {\n const els = this.getElementsFromPoint(event);\n const { renderer } = this;\n const doc = renderer.contentWindow?.document;\n\n if (!doc) return;\n\n for (const el of els) {\n if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.isContainer(el)) && !exclude.includes(el)) {\n addClassName(el, doc, this.containerHighlightClassName);\n break;\n }\n }\n }\n\n public getAddContainerHighlightClassNameTimeout(event: MouseEvent, exclude: Element[] = []): NodeJS.Timeout {\n return globalThis.setTimeout(() => {\n this.addContainerHighlightClassName(event, exclude);\n }, this.containerHighlightDuration);\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n const { mask, renderer, dr, highlightLayer } = this;\n\n renderer.destroy();\n mask.destroy();\n dr.destroy();\n highlightLayer.destroy();\n\n this.removeAllListeners();\n\n this.container = undefined;\n }\n\n private async getTargetElement(idOrEl: Id | HTMLElement): Promise<HTMLElement> {\n if (typeof idOrEl === 'string' || typeof idOrEl === 'number') {\n const el = this.renderer.contentWindow?.document.getElementById(`${idOrEl}`);\n if (!el) throw new Error(`不存在ID为${idOrEl}的元素`);\n return el;\n }\n return idOrEl;\n }\n}\n"],"names":["EventEmitter"],"mappings":"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"}
1
+ {"version":3,"file":"tmagic-stage.mjs","sources":["../src/const.ts","../src/types.ts","../src/util.ts","../src/StageDragResize.ts","../src/TargetCalibrate.ts","../src/StageHighlight.ts","../src/Rule.ts","../src/StageMask.ts","../src/StageMultiDragResize.ts","../src/style.css?used&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) 2021 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 = '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","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 { MoveableOptions } from 'moveable';\n\nimport Core from '@tmagic/core';\nimport type { Id, MApp, MContainer, MNode } from '@tmagic/schema';\n\nimport { GuidesType } from './const';\nimport StageCore from './StageCore';\nimport StageDragResize from './StageDragResize';\nimport StageMask from './StageMask';\n\nexport type CanSelect = (el: HTMLElement, event: MouseEvent, stop: () => boolean) => boolean | Promise<boolean>;\nexport type IsContainer = (el: HTMLElement) => boolean | Promise<boolean>;\n\nexport enum ContainerHighlightType {\n DEFAULT = 'default',\n ALT = 'alt',\n}\n\nexport type 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?: ((core?: StageCore) => MoveableOptions) | MoveableOptions;\n multiMoveableOptions?: ((core?: StageCore) => MoveableOptions) | MoveableOptions;\n /** runtime 的HTML地址,可以是一个HTTP地址,如果和编辑器不同域,需要设置跨域,也可以是一个相对或绝对路径 */\n runtimeUrl?: string;\n render?: (renderer: StageCore) => Promise<HTMLElement> | HTMLElement;\n autoScrollIntoView?: boolean;\n updateDragEl?: (el: HTMLDivElement, target: HTMLElement) => void;\n};\n\nexport interface StageRenderConfig {\n core: StageCore;\n}\n\nexport interface StageMaskConfig {\n core: StageCore;\n}\n\nexport interface StageDragResizeConfig {\n core: StageCore;\n container: HTMLElement;\n mask: StageMask;\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 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 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;\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 core: StageCore;\n container: HTMLElement;\n}\n\nexport interface TargetCalibrateConfig {\n parent: HTMLElement;\n mask: StageMask;\n dr: StageDragResize;\n core: StageCore;\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 } 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: HTMLElement): Offset => {\n const { offsetParent } = el;\n\n const left = el.offsetLeft;\n const top = el.offsetTop;\n\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: HTMLElement) => {\n const offset = getOffset(el);\n const { transform } = 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 z-index: ${ZIndex.DRAG_EL};\n `;\n};\n\nexport const getAbsolutePosition = (el: HTMLElement, { top, left }: Offset) => {\n const { offsetParent } = el;\n\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: HTMLElement) => {\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: HTMLElement): 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 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: HTMLElement | SVGElement): 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: HTMLElement | SVGElement): 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","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 { EventEmitter } from 'events';\n\nimport KeyController from 'keycon';\nimport type { MoveableOptions } from 'moveable';\nimport Moveable from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { removeClassNameByClassName } from '@tmagic/utils';\n\nimport { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode, ZIndex } from './const';\nimport StageCore from './StageCore';\nimport StageMask from './StageMask';\nimport type { StageDragResizeConfig } from './types';\nimport { ContainerHighlightType, StageDragStatus } from './types';\nimport { calcValueByFontsize, down, getAbsolutePosition, getMode, getOffset, getTargetElStyle, up } from './util';\n\n/**\n * 选中框\n */\nexport default class StageDragResize extends EventEmitter {\n public core: StageCore;\n public mask: StageMask;\n /** 画布容器 */\n public container: HTMLElement;\n /** 目标节点 */\n public target?: HTMLElement;\n /** 目标节点在蒙层中的占位节点 */\n public dragEl?: HTMLDivElement;\n /** Moveable拖拽类实例 */\n public moveable?: Moveable;\n /** 水平参考线 */\n public horizontalGuidelines: number[] = [];\n /** 垂直参考线 */\n public verticalGuidelines: number[] = [];\n /** 对齐元素集合 */\n public elementGuidelines: HTMLElement[] = [];\n /** 布局方式:流式布局、绝对定位、固定定位 */\n public mode: Mode = Mode.ABSOLUTE;\n\n private moveableOptions: MoveableOptions = {};\n /** 拖动状态 */\n private dragStatus: StageDragStatus = StageDragStatus.END;\n /** 流式布局下,目标节点的镜像节点 */\n private ghostEl: HTMLElement | undefined;\n private moveableHelper?: MoveableHelper;\n private isContainerHighlight: Boolean = false;\n\n constructor(config: StageDragResizeConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n this.mask = config.mask;\n\n KeyController.global.keydown('alt', (e) => {\n e.inputEvent.preventDefault();\n this.isContainerHighlight = true;\n });\n KeyController.global.keyup('alt', (e) => {\n e.inputEvent.preventDefault();\n\n const doc = this.core.renderer.contentWindow?.document;\n if (doc && this.canContainerHighlight()) {\n removeClassNameByClassName(doc, this.core.containerHighlightClassName);\n }\n this.isContainerHighlight = false;\n });\n }\n\n /**\n * 将选中框渲染并覆盖到选中的组件Dom节点上方\n * 当选中的节点是不是absolute时,会创建一个新的节点出来作为拖拽目标\n * @param el 选中组件的Dom节点元素\n * @param event 鼠标事件\n */\n public select(el: HTMLElement, event?: MouseEvent): void {\n const oldTarget = this.target;\n this.target = el;\n\n if (!this.dragEl) {\n this.dragEl = globalThis.document.createElement('div');\n this.container.append(this.dragEl);\n }\n\n // 从不能拖动到能拖动的节点之间切换,要重新创建moveable,不然dragStart不生效\n if (!this.moveable || this.target !== oldTarget) {\n this.init(el);\n this.moveableHelper = MoveableHelper.create({\n useBeforeRender: true,\n useRender: false,\n createAuto: true,\n });\n\n this.initMoveable();\n } else {\n this.updateMoveable();\n }\n\n if (event) {\n this.moveable?.dragStart(event);\n }\n }\n\n /**\n * 初始化选中框并渲染出来\n */\n public updateMoveable(el = this.target): void {\n if (!this.moveable) throw new Error('未初始化moveable');\n if (!el) throw new Error('未选中任何节点');\n\n this.target = el;\n\n this.init(el);\n\n Object.entries(this.moveableOptions).forEach(([key, value]) => {\n (this.moveable as any)[key] = value;\n });\n this.moveable.updateTarget();\n }\n\n public setGuidelines(type: GuidesType, guidelines: number[]): void {\n if (type === GuidesType.HORIZONTAL) {\n this.horizontalGuidelines = guidelines;\n this.moveableOptions.horizontalGuidelines = guidelines;\n } else if (type === GuidesType.VERTICAL) {\n this.verticalGuidelines = guidelines;\n this.moveableOptions.verticalGuidelines = guidelines;\n }\n\n if (this.moveable) {\n this.updateMoveable();\n }\n }\n\n public clearGuides() {\n this.horizontalGuidelines = [];\n this.verticalGuidelines = [];\n this.moveableOptions.horizontalGuidelines = [];\n this.moveableOptions.verticalGuidelines = [];\n this.updateMoveable();\n }\n\n public clearSelectStatus(): void {\n if (!this.moveable) return;\n this.destroyDragEl();\n this.dragEl = undefined;\n this.moveable.target = null;\n this.moveable.updateTarget();\n }\n\n public destroyDragEl(): void {\n this.dragEl?.remove();\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.destroyGhostEl();\n this.destroyDragEl();\n this.dragStatus = StageDragStatus.END;\n this.removeAllListeners();\n }\n\n private init(el: HTMLElement): void {\n // 如果有滚动条会导致resize时获取到width,height不准确\n if (/(auto|scroll)/.test(el.style.overflow)) {\n el.style.overflow = 'hidden';\n }\n this.mode = getMode(el);\n\n this.destroyGhostEl();\n\n if (!this.dragEl) {\n return;\n }\n\n this.dragEl.style.cssText = getTargetElStyle(el);\n this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;\n\n if (typeof this.core.config.updateDragEl === 'function') {\n this.core.config.updateDragEl(this.dragEl, el);\n }\n this.moveableOptions = this.getOptions({\n target: this.dragEl,\n });\n }\n\n private setElementGuidelines(nodes: HTMLElement[]) {\n this.elementGuidelines.forEach((node) => {\n node.remove();\n });\n this.elementGuidelines = [];\n\n if (this.mode === Mode.ABSOLUTE) {\n this.container.append(this.createGuidelineElements(nodes));\n }\n }\n\n private createGuidelineElements(nodes: HTMLElement[]) {\n const frame = globalThis.document.createDocumentFragment();\n\n for (const node of nodes) {\n const { width, height } = node.getBoundingClientRect();\n if (node === this.target) continue;\n const { left, top } = getOffset(node as HTMLElement);\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 private initMoveable() {\n this.moveable?.destroy();\n\n this.moveable = new Moveable(this.container, {\n ...this.moveableOptions,\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 const frame = {\n left: 0,\n top: 0,\n };\n\n this.moveable\n .on('resizeStart', (e) => {\n if (!this.target) return;\n\n this.dragStatus = StageDragStatus.START;\n this.moveableHelper?.onResizeStart(e);\n\n frame.top = this.target.offsetTop;\n frame.left = this.target.offsetLeft;\n })\n .on('resize', (e) => {\n const { width, height, drag } = e;\n if (!this.moveable || !this.target || !this.dragEl) return;\n\n const { beforeTranslate } = drag;\n this.dragStatus = StageDragStatus.ING;\n\n // 流式布局\n if (this.mode === Mode.SORTABLE) {\n this.target.style.top = '0px';\n this.dragEl.style.width = `${width}px`;\n this.dragEl.style.height = `${height}px`;\n } else {\n this.moveableHelper?.onResize(e);\n this.target.style.left = `${frame.left + beforeTranslate[0]}px`;\n this.target.style.top = `${frame.top + beforeTranslate[1]}px`;\n }\n\n this.target.style.width = `${width}px`;\n this.target.style.height = `${height}px`;\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 const frame = {\n left: 0,\n top: 0,\n };\n\n let timeout: NodeJS.Timeout | undefined;\n\n const { contentWindow } = this.core.renderer;\n const doc = contentWindow?.document;\n\n this.moveable\n .on('dragStart', (e) => {\n if (!this.target) throw new Error('未选中组件');\n\n this.dragStatus = StageDragStatus.START;\n\n this.moveableHelper?.onDragStart(e);\n\n if (this.mode === Mode.SORTABLE) {\n this.ghostEl = this.generateGhostEl(this.target);\n }\n\n frame.top = this.target.offsetTop;\n frame.left = this.target.offsetLeft;\n })\n .on('drag', (e) => {\n if (!this.target || !this.dragEl) return;\n\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (this.canContainerHighlight()) {\n timeout = this.core.getAddContainerHighlightClassNameTimeout(e.inputEvent, [this.target]);\n }\n\n this.dragStatus = StageDragStatus.ING;\n\n // 流式布局\n if (this.ghostEl) {\n this.ghostEl.style.top = `${frame.top + e.beforeTranslate[1]}px`;\n return;\n }\n\n this.moveableHelper?.onDrag(e);\n\n this.target.style.left = `${frame.left + e.beforeTranslate[0]}px`;\n this.target.style.top = `${frame.top + e.beforeTranslate[1]}px`;\n })\n .on('dragEnd', () => {\n if (timeout) {\n globalThis.clearTimeout(timeout);\n timeout = undefined;\n }\n\n let parentEl: HTMLElement | null = null;\n\n if (doc && this.canContainerHighlight()) {\n parentEl = removeClassNameByClassName(doc, this.core.containerHighlightClassName);\n }\n\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.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.moveableHelper?.onRotateStart(e);\n })\n .on('rotate', (e) => {\n if (!this.target || !this.dragEl) return;\n this.dragStatus = StageDragStatus.ING;\n this.moveableHelper?.onRotate(e);\n const frame = this.moveableHelper?.getFrame(e.target);\n this.target.style.transform = frame?.toCSSObject().transform || '';\n })\n .on('rotateEnd', (e) => {\n this.dragStatus = StageDragStatus.END;\n const frame = this.moveableHelper?.getFrame(e.target);\n this.emit('update', {\n el: this.target,\n style: {\n transform: frame?.get('transform'),\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.moveableHelper?.onScaleStart(e);\n })\n .on('scale', (e) => {\n if (!this.target || !this.dragEl) return;\n this.dragStatus = StageDragStatus.ING;\n this.moveableHelper?.onScale(e);\n const frame = this.moveableHelper?.getFrame(e.target);\n this.target.style.transform = frame?.toCSSObject().transform || '';\n })\n .on('scaleEnd', (e) => {\n this.dragStatus = StageDragStatus.END;\n const frame = this.moveableHelper?.getFrame(e.target);\n this.emit('update', {\n el: this.target,\n style: {\n transform: frame?.get('transform'),\n },\n });\n });\n }\n\n private sort(): void {\n if (!this.target || !this.ghostEl) throw new Error('未知错误');\n const { top } = this.ghostEl.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 { contentWindow } = this.core.renderer;\n const doc = contentWindow?.document;\n\n if (!doc) return;\n\n const offset =\n this.mode === Mode.SORTABLE ? { left: 0, top: 0 } : { left: this.target.offsetLeft, top: this.target.offsetTop };\n\n let left = calcValueByFontsize(doc, offset.left);\n let top = calcValueByFontsize(doc, offset.top);\n const width = calcValueByFontsize(doc, this.target.clientWidth);\n const height = calcValueByFontsize(doc, this.target.clientHeight);\n\n if (parentEl && this.mode === Mode.ABSOLUTE && this.dragEl) {\n const [translateX, translateY] = this.moveableHelper?.getFrame(this.dragEl).properties.transform.translate.value;\n const { left: parentLeft, top: parentTop } = getOffset(parentEl);\n left =\n calcValueByFontsize(doc, this.dragEl.offsetLeft) +\n parseFloat(translateX) -\n calcValueByFontsize(doc, parentLeft);\n top =\n calcValueByFontsize(doc, this.dragEl.offsetTop) + parseFloat(translateY) - calcValueByFontsize(doc, parentTop);\n }\n\n this.emit('update', {\n data: [\n {\n el: this.target,\n style: isResize ? { left, top, width, height } : { left, top },\n },\n ],\n parentEl,\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 el.after(ghostEl);\n return ghostEl;\n }\n\n private setGhostElChildrenId(el: Element) {\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 private destroyGhostEl(): void {\n this.ghostEl?.remove();\n this.ghostEl = undefined;\n }\n\n private getOptions(options: MoveableOptions = {}): MoveableOptions {\n if (!this.target) return {};\n\n const isAbsolute = this.mode === Mode.ABSOLUTE;\n const isFixed = this.mode === Mode.FIXED;\n const isSortable = this.mode === Mode.SORTABLE;\n\n let { moveableOptions = {} } = this.core.config;\n\n if (typeof moveableOptions === 'function') {\n moveableOptions = moveableOptions(this.core);\n }\n\n const elementGuidelines: any = moveableOptions.elementGuidelines || this.target.parentElement?.children || [];\n\n this.setElementGuidelines(elementGuidelines);\n\n if (moveableOptions.elementGuidelines) {\n delete moveableOptions.elementGuidelines;\n }\n\n return {\n origin: false,\n rootContainer: this.core.container,\n zoom: 1,\n dragArea: false,\n draggable: true,\n resizable: true,\n scalable: false,\n rotatable: false,\n snappable: isAbsolute || isFixed,\n snapGap: isAbsolute || isFixed,\n snapThreshold: 5,\n snapDigit: 0,\n throttleDrag: 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 horizontalGuidelines: this.horizontalGuidelines,\n verticalGuidelines: this.verticalGuidelines,\n elementGuidelines: this.elementGuidelines,\n\n bounds: {\n top: 0,\n // 设置0的话无法移动到left为0,所以只能设置为-1\n left: -1,\n right: this.container.clientWidth - 1,\n bottom: isSortable ? undefined : this.container.clientHeight,\n ...(moveableOptions.bounds || {}),\n },\n ...options,\n ...moveableOptions,\n };\n }\n\n private canContainerHighlight() {\n return (\n this.core.containerHighlightType === ContainerHighlightType.DEFAULT ||\n (this.core.containerHighlightType === ContainerHighlightType.ALT && this.isContainerHighlight)\n );\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 { Mode, ZIndex } from './const';\nimport StageCore from './StageCore';\nimport StageDragResize from './StageDragResize';\nimport StageMask from './StageMask';\nimport type { Offset, TargetCalibrateConfig } from './types';\nimport { getMode } from './util';\n\n/**\n * 将选中的节点修正定位后,添加一个操作节点到蒙层上\n */\nexport default class TargetCalibrate extends EventEmitter {\n public parent: HTMLElement;\n public mask: StageMask;\n public dr: StageDragResize;\n public core: StageCore;\n public operationEl: HTMLDivElement;\n\n constructor(config: TargetCalibrateConfig) {\n super();\n\n this.parent = config.parent;\n this.mask = config.mask;\n this.dr = config.dr;\n this.core = config.core;\n\n this.operationEl = globalThis.document.createElement('div');\n this.parent.append(this.operationEl);\n }\n\n public update(el: HTMLElement, prefix: String): HTMLElement {\n const { left, top } = this.getOffset(el);\n const { transform } = getComputedStyle(el);\n this.operationEl.style.cssText = `\n position: absolute;\n transform: ${transform};\n left: ${left}px;\n top: ${top}px;\n width: ${el.clientWidth}px;\n height: ${el.clientHeight}px;\n z-index: ${ZIndex.HIGHLIGHT_EL};\n `;\n\n this.operationEl.id = `${prefix}${el.id}`;\n\n if (typeof this.core.config.updateDragEl === 'function') {\n this.core.config.updateDragEl(this.operationEl, el);\n }\n\n return this.operationEl;\n }\n\n public destroy(): void {\n this.operationEl?.remove();\n }\n\n private getOffset(el: HTMLElement): Offset {\n const { offsetParent } = el;\n\n const left = el.offsetLeft;\n const top = el.offsetTop;\n\n if (offsetParent) {\n const parentOffset = this.getOffset(offsetParent as HTMLElement);\n return {\n left: left + parentOffset.left,\n top: top + parentOffset.top,\n };\n }\n\n // 选中固定定位元素后editor-mask高度被置为视窗大小\n if (this.dr.mode === Mode.FIXED) {\n // 弹窗的情况\n if (getMode(el) === Mode.FIXED) {\n return {\n left,\n top,\n };\n }\n\n return {\n left: left - this.mask.scrollLeft,\n top: top - this.mask.scrollTop,\n };\n }\n\n // 无父元素的固定定位需按滚动值计算\n if (getMode(el) === Mode.FIXED) {\n return {\n left: left + this.mask.scrollLeft,\n top: top + this.mask.scrollTop,\n };\n }\n\n return {\n left,\n top,\n };\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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 } from './const';\nimport StageCore from './StageCore';\nimport TargetCalibrate from './TargetCalibrate';\nimport type { StageHighlightConfig } from './types';\nexport default class StageHighlight extends EventEmitter {\n public core: StageCore;\n public container: HTMLElement;\n public target?: HTMLElement;\n public moveable?: Moveable;\n public calibrationTarget: TargetCalibrate;\n\n constructor(config: StageHighlightConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n this.calibrationTarget = new TargetCalibrate({\n parent: this.core.mask.content,\n mask: this.core.mask,\n dr: this.core.dr,\n core: this.core,\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 this.moveable?.destroy();\n\n this.moveable = new Moveable(this.container, {\n target: this.calibrationTarget.update(el, HIGHLIGHT_EL_ID_PREFIX),\n origin: false,\n rootContainer: this.core.container,\n zoom: 2,\n });\n }\n\n /**\n * 清空高亮\n */\n public clearHighlight(): void {\n if (!this.moveable) return;\n this.target = undefined;\n this.moveable.target = null;\n this.moveable.updateTarget();\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.calibrationTarget.destroy();\n }\n}\n","import EventEmitter from 'events';\n\nimport Guides, { GuidesEvents } from '@scena/guides';\n\nimport { GuidesType } from './const';\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\n constructor(container: HTMLDivElement) {\n super();\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.hGuides.on('changeGuides', this.hGuidesChangeGuidesHandler);\n this.vGuides.on('changeGuides', this.vGuidesChangeGuidesHandler);\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 show 是否显示\n */\n public showGuides(show = true) {\n this.hGuides.setState({\n showGuides: show,\n });\n\n this.vGuides.setState({\n showGuides: show,\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('changeGuides', {\n type: GuidesType.HORIZONTAL,\n guides: hLines,\n });\n\n this.emit('changeGuides', {\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 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 });\n\n private hGuidesChangeGuidesHandler = (e: GuidesEvents['changeGuides']) => {\n this.horizontalGuidelines = e.guides;\n this.emit('changeGuides', {\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('changeGuides', {\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) 2021 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 KeyController from 'keycon';\nimport { throttle } from 'lodash-es';\n\nimport { createDiv, injectStyle } from '@tmagic/utils';\n\nimport { Mode, MouseButton, ZIndex } from './const';\nimport Rule from './Rule';\nimport type StageCore from './StageCore';\nimport type { StageMaskConfig } from './types';\nimport { getScrollParent, isFixedParent } from './util';\n\nconst wrapperClassName = 'editor-mask-wrapper';\nconst throttleTime = 100;\n\nconst hideScrollbar = () => {\n injectStyle(globalThis.document, `.${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 core: StageCore;\n public page: HTMLElement | null = null;\n public pageScrollParent: 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 public intersectionObserver: IntersectionObserver | null = null;\n public isMultiSelectStatus: Boolean = false;\n\n private mode: Mode = Mode.ABSOLUTE;\n private pageResizeObserver: ResizeObserver | null = null;\n private wrapperResizeObserver: ResizeObserver | null = null;\n /**\n * 高亮事件处理函数\n * @param event 事件对象\n */\n private highlightHandler = throttle((event: MouseEvent): void => {\n this.emit('highlight', event);\n }, throttleTime);\n\n constructor(config: StageMaskConfig) {\n const wrapper = createWrapper();\n super(wrapper);\n\n this.wrapper = wrapper;\n this.core = config.core;\n\n this.content.addEventListener('mousedown', this.mouseDownHandler);\n this.wrapper.appendChild(this.content);\n this.content.addEventListener('wheel', this.mouseWheelHandler);\n this.content.addEventListener('mousemove', this.highlightHandler);\n this.content.addEventListener('mouseleave', this.mouseLeaveHandler);\n\n const isMac = /mac os x/.test(navigator.userAgent.toLowerCase());\n\n const ctrl = isMac ? 'meta' : 'ctrl';\n\n KeyController.global.keydown(ctrl, (e) => {\n e.inputEvent.preventDefault();\n this.isMultiSelectStatus = true;\n });\n KeyController.global.keyup(ctrl, (e) => {\n e.inputEvent.preventDefault();\n this.isMultiSelectStatus = false;\n });\n }\n\n public setMode(mode: Mode) {\n this.mode = mode;\n this.scroll();\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 * 监听页面大小变化\n * @description 同步页面与mask的大小\n * @param page 页面Dom节点\n */\n public observe(page: HTMLElement): void {\n if (!page) return;\n\n this.page = page;\n this.pageScrollParent = getScrollParent(page) || this.core.renderer.contentWindow?.document.documentElement || null;\n this.pageResizeObserver?.disconnect();\n this.wrapperResizeObserver?.disconnect();\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 if (typeof ResizeObserver !== 'undefined') {\n this.pageResizeObserver = new ResizeObserver((entries) => {\n const [entry] = entries;\n const { clientHeight, clientWidth } = entry.target;\n this.setHeight(clientHeight);\n this.setWidth(clientWidth);\n\n this.scroll();\n if (this.core.dr.moveable) {\n this.core.dr.updateMoveable();\n }\n });\n\n this.pageResizeObserver.observe(page);\n\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 /**\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.pageResizeObserver?.disconnect();\n this.wrapperResizeObserver?.disconnect();\n\n this.content.removeEventListener('mouseleave', this.mouseLeaveHandler);\n super.destroy();\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\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 /**\n * 点击事件处理函数\n * @param event 事件对象\n */\n private mouseDownHandler = (event: MouseEvent): void => {\n this.emit('clearHighlight');\n event.stopImmediatePropagation();\n event.stopPropagation();\n\n if (event.button !== MouseButton.LEFT && event.button !== MouseButton.RIGHT) return;\n\n // 如果单击多选选中区域,则不需要再触发选中了,而可能是拖动行为\n if (!this.isMultiSelectStatus && (event.target as HTMLDivElement).className.indexOf('moveable-area') !== -1) {\n return;\n }\n // 点击对象如果是边框锚点,则可能是resize\n if ((event.target as HTMLDivElement).className.indexOf('moveable-control') !== -1) {\n return;\n }\n\n this.content.removeEventListener('mousemove', this.highlightHandler);\n\n // 判断触发多选还是单选\n if (this.isMultiSelectStatus) {\n this.emit('beforeMultiSelect', event);\n } else {\n this.emit('beforeSelect', event);\n }\n // 如果是右键点击,这里的mouseup事件监听没有效果\n globalThis.document.addEventListener('mouseup', this.mouseUpHandler);\n };\n\n private mouseUpHandler = (): void => {\n globalThis.document.removeEventListener('mouseup', this.mouseUpHandler);\n this.content.addEventListener('mousemove', this.highlightHandler);\n if (!this.isMultiSelectStatus) {\n this.emit('select');\n }\n };\n\n private mouseWheelHandler = (event: WheelEvent) => {\n this.emit('clearHighlight');\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\n this.emit('scroll', event);\n };\n\n private mouseLeaveHandler = () => {\n setTimeout(() => this.emit('clearHighlight'), throttleTime);\n };\n}\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 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, OnResizeStart } from 'moveable';\nimport Moveable from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { DRAG_EL_ID_PREFIX, PAGE_CLASS } from './const';\nimport StageCore from './StageCore';\nimport StageMask from './StageMask';\nimport { StageDragResizeConfig, StageDragStatus } from './types';\nimport { calcValueByFontsize, getMode, getTargetElStyle } from './util';\n\nexport default class StageMultiDragResize extends EventEmitter {\n public core: StageCore;\n public mask: StageMask;\n /** 画布容器 */\n public container: HTMLElement;\n /** 多选:目标节点组 */\n public targetList: HTMLElement[] = [];\n /** 多选:目标节点在蒙层中的占位节点组 */\n public dragElList: HTMLDivElement[] = [];\n /** Moveable多选拖拽类实例 */\n public moveableForMulti?: Moveable;\n /** 拖动状态 */\n public dragStatus: StageDragStatus = StageDragStatus.END;\n private multiMoveableHelper?: MoveableHelper;\n\n constructor(config: StageDragResizeConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n this.mask = config.mask;\n }\n\n /**\n * 多选\n * @param els\n */\n public multiSelect(els: HTMLElement[]): void {\n this.targetList = els;\n this.core.dr.destroyDragEl();\n this.destroyDragElList();\n // 生成虚拟多选节点\n this.dragElList = els.map((elItem) => {\n const dragElDiv = globalThis.document.createElement('div');\n this.container.append(dragElDiv);\n dragElDiv.style.cssText = getTargetElStyle(elItem);\n dragElDiv.id = `${DRAG_EL_ID_PREFIX}${elItem.id}`;\n // 业务方校准\n if (typeof this.core.config.updateDragEl === 'function') {\n this.core.config.updateDragEl(dragElDiv, elItem);\n }\n return dragElDiv;\n });\n this.moveableForMulti?.destroy();\n this.multiMoveableHelper?.clear();\n this.moveableForMulti = new Moveable(\n this.container,\n this.getOptions({\n target: this.dragElList,\n }),\n );\n this.multiMoveableHelper = MoveableHelper.create({\n useBeforeRender: true,\n useRender: false,\n createAuto: true,\n });\n const frames: { left: number; top: number; id: string }[] = [];\n\n const setFrames = (events: OnDragStart[] | OnResizeStart[]) => {\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 frames.push({\n left: matchEventTarget.offsetLeft,\n top: matchEventTarget.offsetTop,\n id: matchEventTarget.id,\n });\n });\n };\n\n this.moveableForMulti\n .on('resizeGroupStart', (params) => {\n const { events } = params;\n this.multiMoveableHelper?.onResizeGroupStart(params);\n setFrames(events);\n this.dragStatus = StageDragStatus.START;\n })\n .on('resizeGroup', (params) => {\n const { events } = params;\n // 拖动过程更新\n events.forEach((ev) => {\n const { width, height, beforeTranslate } = ev.drag;\n const frameSnapShot = frames.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 targeEl.style.left = `${frameSnapShot.left + beforeTranslate[0]}px`;\n targeEl.style.top = `${frameSnapShot.top + beforeTranslate[1]}px`;\n }\n\n // 更新页面元素位置\n targeEl.style.width = `${width}px`;\n targeEl.style.height = `${height}px`;\n });\n this.multiMoveableHelper?.onResizeGroup(params);\n this.dragStatus = StageDragStatus.ING;\n })\n .on('resizeGroupEnd', () => {\n this.update(true);\n this.dragStatus = StageDragStatus.END;\n })\n .on('dragGroupStart', (params) => {\n const { events } = params;\n this.multiMoveableHelper?.onDragGroupStart(params);\n // 记录拖动前快照\n setFrames(events);\n this.dragStatus = StageDragStatus.START;\n })\n .on('dragGroup', (params) => {\n const { events } = params;\n // 拖动过程更新\n events.forEach((ev) => {\n const frameSnapShot = frames.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 targeEl.style.left = `${frameSnapShot.left + ev.beforeTranslate[0]}px`;\n targeEl.style.top = `${frameSnapShot.top + ev.beforeTranslate[1]}px`;\n }\n });\n this.multiMoveableHelper?.onDragGroup(params);\n this.dragStatus = StageDragStatus.ING;\n })\n .on('dragGroupEnd', () => {\n this.update();\n this.dragStatus = StageDragStatus.END;\n })\n .on('clickGroup', (params) => {\n const { inputTarget, targets } = params;\n // 如果此时mask不处于多选状态下,且有多个元素被选中,同时点击的元素在选中元素中的其中一项,代表多选态切换为该元素的单选态\n if (!this.mask.isMultiSelectStatus && targets.length > 1 && targets.includes(inputTarget)) {\n this.emit('select', inputTarget.id.replace(DRAG_EL_ID_PREFIX, ''));\n }\n });\n }\n\n public canSelect(el: HTMLElement, stop: () => boolean): Boolean {\n // 多选状态下不可以选中magic-ui-page,并停止继续向上层选中\n if (el.className.includes(PAGE_CLASS)) {\n this.core.highlightedDom = undefined;\n this.core.highlightLayer.clearHighlight();\n stop();\n return false;\n }\n const currentTargetMode = getMode(el);\n let selectedDomMode = '';\n if (this.core.selectedDom?.className.includes(PAGE_CLASS)) {\n // 先单击选中了页面(magic-ui-page),再按住多选键多选时,任一元素均可选中\n return true;\n }\n if (this.targetList.length === 0 && this.core.selectedDom) {\n // 单选后添加到多选的情况\n selectedDomMode = getMode(this.core.selectedDom);\n } else if (this.targetList.length > 0) {\n // 已加入多选列表的布局模式是一样的,取第一个判断\n selectedDomMode = getMode(this.targetList[0]);\n }\n // 定位模式不同,不可混选\n if (currentTargetMode !== selectedDomMode) {\n return false;\n }\n return true;\n }\n\n /**\n * 清除多选状态\n */\n public clearSelectStatus(): void {\n if (!this.moveableForMulti) return;\n this.destroyDragElList();\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.destroyDragElList();\n }\n\n /**\n * 清除蒙层占位节点\n */\n public destroyDragElList(): void {\n this.dragElList.forEach((dragElItem) => dragElItem?.remove());\n }\n\n /**\n * 拖拽完成后将更新的位置信息暴露给上层业务方,业务方可以接收事件进行保存\n * @param isResize 是否进行大小缩放\n */\n private update(isResize = false): void {\n if (this.targetList.length === 0) return;\n\n const { contentWindow } = this.core.renderer;\n const doc = contentWindow?.document;\n if (!doc) return;\n\n this.emit('update', {\n data: this.targetList.map((targetItem) => {\n const offset = { left: targetItem.offsetLeft, top: targetItem.offsetTop };\n const left = calcValueByFontsize(doc, offset.left);\n const top = calcValueByFontsize(doc, offset.top);\n const width = calcValueByFontsize(doc, targetItem.clientWidth);\n const height = calcValueByFontsize(doc, targetItem.clientHeight);\n return {\n el: targetItem,\n style: isResize ? { left, top, width, height } : { left, top },\n };\n }),\n parentEl: null,\n });\n }\n\n /**\n * 获取moveable options参数\n * @param {MoveableOptions} options\n * @return {MoveableOptions} moveable options参数\n */\n private getOptions(options: MoveableOptions = {}): MoveableOptions {\n let { multiMoveableOptions = {} } = this.core.config;\n\n if (typeof multiMoveableOptions === 'function') {\n multiMoveableOptions = multiMoveableOptions(this.core);\n }\n\n return {\n defaultGroupRotate: 0,\n defaultGroupOrigin: '50% 50%',\n draggable: true,\n resizable: true,\n throttleDrag: 0,\n startDragRotate: 0,\n throttleDragRotate: 0,\n zoom: 1,\n origin: true,\n padding: { left: 0, top: 0, right: 0, bottom: 0 },\n snappable: true,\n bounds: {\n top: 0,\n // 设置0的话无法移动到left为0,所以只能设置为-1\n left: -1,\n right: this.container.clientWidth - 1,\n bottom: this.container.clientHeight,\n ...(multiMoveableOptions.bounds || {}),\n },\n ...options,\n ...multiMoveableOptions,\n };\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) 2021 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 { getHost, injectStyle, isSameDomain } from '@tmagic/utils';\n\nimport StageCore from './StageCore';\nimport style from './style.css?raw';\nimport type { Runtime, RuntimeWindow, StageRenderConfig } from './types';\n\nexport default class StageRender extends EventEmitter {\n /** 组件的js、css执行的环境,直接渲染为当前window,iframe渲染则为iframe.contentWindow */\n public contentWindow: RuntimeWindow | null = null;\n\n public runtime: Runtime | null = null;\n\n public iframe?: HTMLIFrameElement;\n\n public runtimeUrl?: string;\n\n public core: StageCore;\n\n private render?: (renderer: StageCore) => Promise<HTMLElement> | HTMLElement;\n\n constructor({ core }: StageRenderConfig) {\n super();\n\n this.core = core;\n this.runtimeUrl = core.config.runtimeUrl || '';\n this.render = core.config.render;\n\n this.iframe = globalThis.document.createElement('iframe');\n // 同源,直接加载\n this.iframe.src = 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.loadHandler);\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 /**\n * 挂载Dom节点\n * @param el 将页面挂载到该Dom节点上\n */\n public async mount(el: HTMLDivElement) {\n if (!this.iframe) {\n throw Error('mount 失败');\n }\n\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 }\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 /**\n * 销毁实例\n */\n public destroy(): void {\n this.iframe?.removeEventListener('load', this.loadHandler);\n this.contentWindow = null;\n this.iframe?.remove();\n this.iframe = undefined;\n this.removeAllListeners();\n }\n\n private loadHandler = async () => {\n if (!this.contentWindow?.magic) {\n this.postTmagicRuntimeReady();\n }\n\n if (!this.contentWindow) return;\n\n if (this.render) {\n const el = await this.render(this.core);\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) 2021 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 { Id } from '@tmagic/schema';\nimport { addClassName } from '@tmagic/utils';\n\nimport { CONTAINER_HIGHLIGHT_CLASS, DEFAULT_ZOOM, GHOST_EL_ID_PREFIX, PAGE_CLASS } from './const';\nimport StageDragResize from './StageDragResize';\nimport StageHighlight from './StageHighlight';\nimport StageMask from './StageMask';\nimport StageMultiDragResize from './StageMultiDragResize';\nimport StageRender from './StageRender';\nimport {\n CanSelect,\n ContainerHighlightType,\n GuidesEventData,\n IsContainer,\n RemoveData,\n Runtime,\n SortEventData,\n StageCoreConfig,\n StageDragStatus,\n UpdateData,\n UpdateEventData,\n} from './types';\nimport { addSelectedClassName, removeSelectedClassName } from './util';\n\nexport default class StageCore extends EventEmitter {\n public container?: HTMLDivElement;\n // 当前选中的节点\n public selectedDom: HTMLElement | undefined;\n // 多选选中的节点组\n public selectedDomList: HTMLElement[] = [];\n public highlightedDom: Element | undefined;\n public renderer: StageRender;\n public mask: StageMask;\n public dr: StageDragResize;\n public multiDr: StageMultiDragResize;\n public highlightLayer: StageHighlight;\n public config: StageCoreConfig;\n public zoom = DEFAULT_ZOOM;\n public containerHighlightClassName: string;\n public containerHighlightDuration: number;\n public containerHighlightType?: ContainerHighlightType;\n public isContainer: IsContainer;\n\n private canSelect: CanSelect;\n\n constructor(config: StageCoreConfig) {\n super();\n\n this.config = config;\n\n this.setZoom(config.zoom);\n this.canSelect = config.canSelect || ((el: HTMLElement) => !!el.id);\n this.isContainer = config.isContainer;\n this.containerHighlightClassName = config.containerHighlightClassName || CONTAINER_HIGHLIGHT_CLASS;\n this.containerHighlightDuration = config.containerHighlightDuration || 800;\n this.containerHighlightType = config.containerHighlightType;\n\n this.renderer = new StageRender({ core: this });\n this.mask = new StageMask({ core: this });\n this.dr = new StageDragResize({ core: this, container: this.mask.content, mask: this.mask });\n this.multiDr = new StageMultiDragResize({ core: this, container: this.mask.content, mask: this.mask });\n this.highlightLayer = new StageHighlight({ core: this, container: this.mask.wrapper });\n\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 });\n\n this.mask\n .on('beforeSelect', async (event: MouseEvent) => {\n this.clearSelectStatus('multiSelect');\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n this.select(el, event);\n })\n .on('select', () => {\n this.emit('select', this.selectedDom);\n })\n .on('changeGuides', (data: GuidesEventData) => {\n this.dr.setGuidelines(data.type, data.guides);\n this.emit('changeGuides', data);\n })\n .on('highlight', async (event: MouseEvent) => {\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n // 如果多选组件处于拖拽状态时不进行组件高亮\n if (this.multiDr.dragStatus === StageDragStatus.ING) return;\n await this.highlight(el);\n if (this.highlightedDom === this.selectedDom) {\n this.highlightLayer.clearHighlight();\n return;\n }\n this.emit('highlight', this.highlightedDom);\n })\n .on('clearHighlight', async () => {\n this.highlightLayer.clearHighlight();\n })\n .on('beforeMultiSelect', async (event: MouseEvent) => {\n const el = await this.getElementFromPoint(event);\n if (!el) return;\n // 如果已有单选选中元素,不是magic-ui-page就可以加入多选列表\n if (this.selectedDom && !this.selectedDom.className.includes(PAGE_CLASS)) {\n this.selectedDomList.push(this.selectedDom as HTMLElement);\n this.selectedDom = undefined;\n }\n // 判断元素是否已在多选列表\n const existIndex = this.selectedDomList.findIndex((selectedDom) => selectedDom.id === el.id);\n if (existIndex !== -1) {\n // 再次点击取消选中\n this.selectedDomList.splice(existIndex, 1);\n } else {\n this.selectedDomList.push(el);\n }\n this.multiSelect(this.selectedDomList);\n });\n\n // 要先触发select,在触发update\n this.dr\n .on('update', (data: UpdateEventData) => {\n setTimeout(() => this.emit('update', data));\n })\n .on('sort', (data: UpdateEventData) => {\n setTimeout(() => this.emit('sort', data));\n });\n\n this.multiDr\n .on('update', (data: UpdateEventData) => {\n setTimeout(() => this.emit('update', data));\n })\n .on('select', async (id: Id) => {\n const el = await this.getTargetElement(id);\n this.select(el); // 选中\n setTimeout(() => this.emit('select', el)); // set node\n });\n }\n\n public getElementsFromPoint(event: MouseEvent) {\n const { renderer, zoom } = this;\n\n const doc = renderer.contentWindow?.document;\n let x = event.clientX;\n let y = event.clientY;\n\n if (renderer.iframe) {\n const rect = renderer.iframe.getClientRects()[0];\n if (rect) {\n x = x - rect.left;\n y = y - rect.top;\n }\n }\n\n return doc?.elementsFromPoint(x / zoom, y / zoom) as HTMLElement[];\n }\n\n public async getElementFromPoint(event: MouseEvent) {\n const els = this.getElementsFromPoint(event);\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 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.mask.isMultiSelectStatus) {\n return this.multiDr.canSelect(el, stop);\n }\n return true;\n }\n\n /**\n * 选中组件\n * @param idOrEl 组件Dom节点的id属性,或者Dom节点\n */\n public async select(idOrEl: Id | HTMLElement, event?: MouseEvent): Promise<void> {\n this.clearSelectStatus('multiSelect');\n const el = await this.getTargetElement(idOrEl);\n\n if (el === this.selectedDom) return;\n\n const runtime = await this.renderer.getRuntime();\n\n await runtime?.select?.(el.id);\n\n if (runtime?.beforeSelect) {\n await runtime.beforeSelect(el);\n }\n\n this.mask.setLayout(el);\n this.dr.select(el, event);\n\n if (this.config.autoScrollIntoView || el.dataset.autoScrollIntoView) {\n this.mask.intersectionObserver?.observe(el);\n }\n\n this.selectedDom = el;\n\n if (this.renderer.contentWindow) {\n removeSelectedClassName(this.renderer.contentWindow.document);\n if (this.selectedDom) {\n addSelectedClassName(this.selectedDom, this.renderer.contentWindow.document);\n }\n }\n }\n\n /**\n * 多选\n * @param domList 多选节点\n */\n public async multiSelect(idOrElList: HTMLElement[] | Id[]): Promise<void> {\n this.clearSelectStatus('select');\n const elList = await Promise.all(idOrElList.map(async (idOrEl) => await this.getTargetElement(idOrEl)));\n this.multiDr.multiSelect(elList);\n this.emit('multiSelect', elList);\n }\n\n /**\n * 更新选中的节点\n * @param data 更新的数据\n */\n public update(data: UpdateData): Promise<void> {\n const { config } = data;\n\n return this.renderer?.getRuntime().then((runtime) => {\n runtime?.update?.(data);\n // 更新配置后,需要等组件渲染更新\n setTimeout(() => {\n const el = this.renderer.contentWindow?.document.getElementById(`${config.id}`);\n // 有可能dom已经重新渲染,不再是原来的dom了,所以这里判断id,而不是判断el === this.selectedDom\n if (el && el.id === this.selectedDom?.id) {\n this.selectedDom = el;\n // 更新了组件的布局,需要重新设置mask是否可以滚动\n this.mask.setLayout(el);\n this.dr.updateMoveable(el);\n }\n }, 0);\n });\n }\n\n /**\n * 高亮选中组件\n * @param el 页面Dom节点\n */\n public async highlight(idOrEl: HTMLElement | Id): Promise<void> {\n let el;\n try {\n el = await this.getTargetElement(idOrEl);\n } catch (error) {\n this.highlightLayer.clearHighlight();\n return;\n }\n if (el === this.highlightedDom || !el) return;\n this.highlightLayer.highlight(el);\n this.highlightedDom = el;\n }\n\n public sortNode(data: SortEventData): Promise<void> {\n return this.renderer?.getRuntime().then((runtime) => runtime?.sortNode?.(data));\n }\n\n public add(data: UpdateData): Promise<void> {\n return this.renderer?.getRuntime().then((runtime) => runtime?.add?.(data));\n }\n\n public remove(data: RemoveData): Promise<void> {\n return this.renderer?.getRuntime().then((runtime) => runtime?.remove?.(data));\n }\n\n public setZoom(zoom: number = DEFAULT_ZOOM): void {\n this.zoom = zoom;\n }\n\n /**\n * 用于在切换选择模式时清除上一次的状态\n * @param selectType 需要清理的选择模式 多选:multiSelect,单选:select\n */\n public clearSelectStatus(selectType: String) {\n if (selectType === 'multiSelect') {\n this.multiDr.clearSelectStatus();\n this.selectedDomList = [];\n } else {\n this.dr.clearSelectStatus();\n }\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.dr.clearGuides();\n }\n\n public async addContainerHighlightClassName(event: MouseEvent, exclude: Element[]) {\n const els = this.getElementsFromPoint(event);\n const { renderer } = this;\n const doc = renderer.contentWindow?.document;\n\n if (!doc) return;\n\n for (const el of els) {\n if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.isContainer(el)) && !exclude.includes(el)) {\n addClassName(el, doc, this.containerHighlightClassName);\n break;\n }\n }\n }\n\n public getAddContainerHighlightClassNameTimeout(event: MouseEvent, exclude: Element[] = []): NodeJS.Timeout {\n return globalThis.setTimeout(() => {\n this.addContainerHighlightClassName(event, exclude);\n }, this.containerHighlightDuration);\n }\n\n /**\n * 销毁实例\n */\n public destroy(): void {\n const { mask, renderer, dr, highlightLayer } = this;\n\n renderer.destroy();\n mask.destroy();\n dr.destroy();\n highlightLayer.destroy();\n\n this.removeAllListeners();\n\n this.container = undefined;\n }\n\n private async getTargetElement(idOrEl: Id | HTMLElement): Promise<HTMLElement> {\n if (typeof idOrEl === 'string' || typeof idOrEl === 'number') {\n const el = this.renderer.contentWindow?.document.getElementById(`${idOrEl}`);\n if (!el) throw new Error(`不存在ID为${idOrEl}的元素`);\n return el;\n }\n return idOrEl;\n }\n}\n"],"names":["EventEmitter"],"mappings":"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"}