@tmagic/stage 1.0.0-beta.13 → 1.0.0-beta.16

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.
@@ -6,6 +6,7 @@ import Guides from '@scena/guides';
6
6
 
7
7
  const GHOST_EL_ID_PREFIX = "ghost_el_";
8
8
  const DRAG_EL_ID_PREFIX = "drag_el_";
9
+ const HIGHLIGHT_EL_ID_PREFIX = "highlight_el_";
9
10
  const DEFAULT_ZOOM = 1;
10
11
  var GuidesType = /* @__PURE__ */ ((GuidesType2) => {
11
12
  GuidesType2["HORIZONTAL"] = "horizontal";
@@ -168,9 +169,9 @@ class StageDragResize extends EventEmitter {
168
169
  this.horizontalGuidelines = [];
169
170
  this.verticalGuidelines = [];
170
171
  this.elementGuidelines = [];
172
+ this.mode = Mode.ABSOLUTE;
171
173
  this.moveableOptions = {};
172
174
  this.dragStatus = "end" /* END */;
173
- this.mode = Mode.ABSOLUTE;
174
175
  this.core = config.core;
175
176
  this.container = config.container;
176
177
  this.dragEl = globalThis.document.createElement("div");
@@ -392,6 +393,7 @@ class StageDragResize extends EventEmitter {
392
393
  top: ${offset.top}px;
393
394
  width: ${width}px;
394
395
  height: ${height}px;
396
+ z-index: 9;
395
397
  `;
396
398
  this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;
397
399
  }
@@ -506,11 +508,97 @@ const up = (deltaTop, target) => {
506
508
  };
507
509
  };
508
510
 
511
+ class TargetCalibrate extends EventEmitter {
512
+ constructor(config) {
513
+ super();
514
+ this.parent = config.parent;
515
+ this.mask = config.mask;
516
+ this.dr = config.dr;
517
+ this.operationEl = globalThis.document.createElement("div");
518
+ this.parent.append(this.operationEl);
519
+ }
520
+ update(el, prefix) {
521
+ const { width, height } = el.getBoundingClientRect();
522
+ const { left, top } = this.getOffset(el);
523
+ this.operationEl.style.cssText = `
524
+ position: absolute;
525
+ left: ${left}px;
526
+ top: ${top}px;
527
+ width: ${width}px;
528
+ height: ${height}px;
529
+ `;
530
+ this.operationEl.id = `${prefix}${el.id}`;
531
+ return this.operationEl;
532
+ }
533
+ destroy() {
534
+ this.operationEl?.remove();
535
+ }
536
+ getOffset(el) {
537
+ const { transform } = getComputedStyle(el);
538
+ const { offsetParent } = el;
539
+ let left = el.offsetLeft;
540
+ let top = el.offsetTop;
541
+ if (transform.indexOf("matrix") > -1) {
542
+ let a = 1;
543
+ let b = 1;
544
+ let c = 1;
545
+ let d = 1;
546
+ let e = 0;
547
+ let f = 0;
548
+ transform.replace(/matrix\((.+), (.+), (.+), (.+), (.+), (.+)\)/, ($0, $1, $2, $3, $4, $5, $6) => {
549
+ a = +$1;
550
+ b = +$2;
551
+ c = +$3;
552
+ d = +$4;
553
+ e = +$5;
554
+ f = +$6;
555
+ return transform;
556
+ });
557
+ left = a * left + c * top + e;
558
+ top = b * left + d * top + f;
559
+ }
560
+ if (offsetParent) {
561
+ const parentOffset = this.getOffset(offsetParent);
562
+ return {
563
+ left: left + parentOffset.left,
564
+ top: top + parentOffset.top
565
+ };
566
+ }
567
+ if (this.dr.mode === Mode.FIXED) {
568
+ if (getMode(el) === Mode.FIXED) {
569
+ return {
570
+ left,
571
+ top
572
+ };
573
+ }
574
+ return {
575
+ left: left - this.mask.scrollLeft,
576
+ top: top - this.mask.scrollTop
577
+ };
578
+ }
579
+ if (getMode(el) === Mode.FIXED) {
580
+ return {
581
+ left: left + this.mask.scrollLeft,
582
+ top: top + this.mask.scrollTop
583
+ };
584
+ }
585
+ return {
586
+ left,
587
+ top
588
+ };
589
+ }
590
+ }
591
+
509
592
  class StageHighlight extends EventEmitter {
510
593
  constructor(config) {
511
594
  super();
512
595
  this.core = config.core;
513
596
  this.container = config.container;
597
+ this.calibrationTarget = new TargetCalibrate({
598
+ parent: this.core.mask.content,
599
+ mask: this.core.mask,
600
+ dr: this.core.dr
601
+ });
514
602
  }
515
603
  highlight(el) {
516
604
  if (!el || el === this.target)
@@ -518,9 +606,10 @@ class StageHighlight extends EventEmitter {
518
606
  this.target = el;
519
607
  this.moveable?.destroy();
520
608
  this.moveable = new Moveable(this.container, {
521
- target: this.target,
522
- scrollable: true,
523
- origin: false
609
+ target: this.calibrationTarget.update(el, HIGHLIGHT_EL_ID_PREFIX),
610
+ origin: false,
611
+ rootContainer: this.core.container,
612
+ zoom: 1
524
613
  });
525
614
  }
526
615
  clearHighlight() {
@@ -532,6 +621,7 @@ class StageHighlight extends EventEmitter {
532
621
  }
533
622
  destroy() {
534
623
  this.moveable?.destroy();
624
+ this.calibrationTarget.destroy();
535
625
  }
536
626
  }
537
627
 
@@ -1 +1 @@
1
- {"version":3,"file":"tmagic-stage.es.js","sources":["../src/const.ts","../src/util.ts","../src/StageDragResize.ts","../src/StageHighlight.ts","../src/Rule.ts","../src/StageMask.ts","../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\nexport const DRAG_EL_ID_PREFIX = 'drag_el_';\n\n// 默认放到缩小倍数\nexport const DEFAULT_ZOOM = 1;\n\nexport enum GuidesType {\n HORIZONTAL = 'horizontal',\n VERTICAL = 'vertical',\n}\n\nexport enum ZIndex {\n MASK = '99999',\n SELECTED_EL = '666',\n}\n\nexport enum MouseButton {\n LEFT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n}\n\nexport enum Mode {\n ABSOLUTE = 'absolute',\n FIXED = 'fixed',\n SORTABLE = 'sortable',\n}\n\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 { Mode, SELECTED_CLASS } from './const';\nimport type { Offset } from './types';\n\nexport const getOffset = (el: HTMLElement): Offset => {\n const { transform } = getComputedStyle(el);\n const { offsetParent } = el;\n\n let left = el.offsetLeft;\n let top = el.offsetTop;\n\n if (transform.indexOf('matrix') > -1) {\n let a = 1;\n let b = 1;\n let c = 1;\n let d = 1;\n let e = 0;\n let f = 0;\n transform.replace(\n /matrix\\((.+), (.+), (.+), (.+), (.+), (.+)\\)/,\n ($0: string, $1: string, $2: string, $3: string, $4: string, $5: string, $6: string): string => {\n a = +$1;\n b = +$2;\n c = +$3;\n d = +$4;\n e = +$5;\n f = +$6;\n return transform;\n },\n );\n\n left = a * left + c * top + e;\n top = b * left + d * top + f;\n }\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\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 getHost = (targetUrl: string) => targetUrl.match(/\\/\\/([^/]+)/)?.[1];\n\nexport const isSameDomain = (targetUrl = '', source = globalThis.location.host) => {\n const isHttpUrl = /^(http[s]?:)?\\/\\//.test(targetUrl);\n\n if (!isHttpUrl) return true;\n\n return getHost(targetUrl) === source;\n};\n\nexport const isAbsolute = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'absolute';\n};\n\nexport const isRelative = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'relative';\n};\n\nexport const isStatic = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'static';\n};\n\nexport const isFixed = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'fixed';\n};\n\nexport const isFixedParent = (el: HTMLElement) => {\n let fixed = false;\n let dom = el;\n while (dom) {\n fixed = isFixed(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 if (isStatic(el) || isRelative(el)) 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(element)) return null;\n for (let parent = element; parent.parentElement; ) {\n parent = parent.parentElement;\n style = getComputedStyle(parent);\n if (isAbsolute(element) && isStatic(element)) {\n continue;\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\n }\n\n return null;\n};\n\nexport const createDiv = ({ className, cssText }: { className: string; cssText: string }) => {\n const el = globalThis.document.createElement('div');\n el.className = className;\n el.style.cssText = cssText;\n return el;\n};\n\nexport const removeSelectedClassName = (doc: Document) => {\n const oldEl = doc.querySelector(`.${SELECTED_CLASS}`);\n\n if (oldEl) {\n oldEl.classList.remove(SELECTED_CLASS);\n (oldEl.parentNode as HTMLDivElement)?.classList.remove(`${SELECTED_CLASS}-parent`);\n }\n};\n\nexport const addSelectedClassName = (el: Element) => {\n el.classList.add(SELECTED_CLASS);\n (el.parentNode as Element)?.classList.add(`${SELECTED_CLASS}-parent`);\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 type { MoveableOptions } from 'moveable';\nimport Moveable from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode } from './const';\nimport StageCore from './StageCore';\nimport type { Offset, Runtime, SortEventData, StageDragResizeConfig } from './types';\nimport { getAbsolutePosition, getMode, getOffset } from './util';\n\nenum ActionStatus {\n START = 'start',\n ING = 'ing',\n END = 'end',\n}\n\n/**\n * 选中框\n */\nexport default class StageDragResize extends EventEmitter {\n public core: StageCore;\n public container: HTMLElement;\n public target?: HTMLElement;\n public dragEl: HTMLElement;\n public moveable?: Moveable;\n public horizontalGuidelines: number[] = [];\n public verticalGuidelines: number[] = [];\n public elementGuidelines: HTMLElement[] = [];\n\n private moveableOptions: MoveableOptions = {};\n private dragStatus: ActionStatus = ActionStatus.END;\n private ghostEl: HTMLElement | undefined;\n private mode: Mode = Mode.ABSOLUTE;\n private moveableHelper?: MoveableHelper;\n\n constructor(config: StageDragResizeConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n\n this.dragEl = globalThis.document.createElement('div');\n this.container.append(this.dragEl);\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 this.init(el);\n\n // 从不能拖动到能拖动的节点之间切换,要重新创建moveable,不然dragStart不生效\n if (!this.moveable || this.target !== oldTarget) {\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 this.updateMoveable();\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 /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.destroyGhostEl();\n this.destroyDragEl();\n this.dragStatus = ActionStatus.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 this.updateDragEl(el);\n\n this.moveableOptions = this.getOptions({\n target: this.dragEl,\n });\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 }\n\n private bindResizeEvent(): void {\n if (!this.moveable) throw new Error('moveable 为初始化');\n\n const frame = {\n translate: [0, 0],\n };\n\n this.moveable\n .on('resizeStart', (e) => {\n if (e.dragStart) {\n const rect = this.moveable!.getRect();\n const offset = getAbsolutePosition(e.target as HTMLElement, rect);\n e.dragStart.set([offset.left, offset.top]);\n }\n })\n .on('resize', ({ width, height, drag }) => {\n if (!this.moveable || !this.target || !this.dragEl) return;\n\n const { beforeTranslate } = drag;\n frame.translate = beforeTranslate;\n this.dragStatus = ActionStatus.ING;\n\n this.target.style.width = `${width}px`;\n this.target.style.height = `${height}px`;\n this.dragEl.style.width = `${width}px`;\n this.dragEl.style.height = `${height}px`;\n\n // 流式布局\n if (this.mode === Mode.SORTABLE) {\n this.dragEl.style.top = `${beforeTranslate[1]}px`;\n this.target.style.top = `0px`;\n return;\n }\n\n this.dragEl.style.left = `${beforeTranslate[0]}px`;\n this.dragEl.style.top = `${beforeTranslate[1]}px`;\n\n const offset = getAbsolutePosition(this.target, { left: beforeTranslate[0], top: beforeTranslate[1] });\n\n this.target.style.left = `${offset.left}px`;\n this.target.style.top = `${offset.top}px`;\n })\n .on('resizeEnd', () => {\n this.dragStatus = ActionStatus.END;\n this.update(true);\n });\n }\n\n private bindDragEvent(): void {\n if (!this.moveable) throw new Error('moveable 为初始化');\n\n let offset: Offset | null = null;\n\n this.moveable\n .on('dragStart', (e) => {\n if (!this.target) throw new Error('未选中组件');\n\n this.dragStatus = ActionStatus.START;\n\n this.moveableHelper?.onDragStart(e);\n\n if (this.mode === Mode.SORTABLE) {\n this.ghostEl = this.generateGhostEl(this.target);\n }\n })\n .on('drag', (e) => {\n if (!this.target || !this.dragEl) return;\n\n if (!offset) {\n offset = getAbsolutePosition(this.target, { left: 0, top: 0 });\n }\n\n this.dragStatus = ActionStatus.ING;\n\n const { left, top } = e;\n\n // 流式布局\n if (this.ghostEl) {\n this.dragEl.style.top = `${top}px`;\n this.ghostEl.style.top = `${top + offset.top}px`;\n return;\n }\n\n this.moveableHelper?.onDrag(e);\n\n this.target.style.left = `${left + offset.left}px`;\n this.target.style.top = `${top + offset.top}px`;\n })\n .on('dragEnd', () => {\n // 点击不拖动时会触发dragStart和dragEnd,但是不会有drag事件\n if (this.dragStatus === ActionStatus.ING) {\n switch (this.mode) {\n case Mode.SORTABLE:\n this.sort();\n break;\n default:\n this.update();\n }\n }\n offset = null;\n\n this.dragStatus = ActionStatus.END;\n this.destroyGhostEl();\n });\n }\n\n private getSnapElements(runtime: Runtime, el?: HTMLElement): HTMLElement[] {\n const { renderer, mask } = this.core;\n const getSnapElements =\n runtime?.getSnapElements ||\n (() => {\n const doc = renderer.contentWindow?.document;\n return doc ? Array.from(doc.querySelectorAll('[id]')) : [];\n });\n return getSnapElements(el).filter(\n (element) => element !== this.target && !this.target?.contains(element) && element !== mask.page,\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): void {\n const rect = this.moveable!.getRect();\n const offset =\n this.mode === Mode.SORTABLE ? { left: 0, top: 0 } : getAbsolutePosition(this.target as HTMLElement, rect);\n\n const left = this.calcValueByFontsize(offset.left);\n const top = this.calcValueByFontsize(offset.top);\n const width = this.calcValueByFontsize(rect.width);\n const height = this.calcValueByFontsize(rect.height);\n\n this.emit('update', {\n el: this.target,\n style: isResize ? { left, top, width, height } : { left, top },\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 const { top, left } = getAbsolutePosition(el, getOffset(el));\n ghostEl.id = `${GHOST_EL_ID_PREFIX}${el.id}`;\n ghostEl.style.zIndex = '5';\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 destroyGhostEl(): void {\n this.ghostEl?.remove();\n this.ghostEl = undefined;\n }\n\n private updateDragEl(el: HTMLElement) {\n const { width, height } = el.getBoundingClientRect();\n const offset = getOffset(el);\n\n this.dragEl.style.cssText = `\n position: absolute;\n left: ${offset.left}px;\n top: ${offset.top}px;\n width: ${width}px;\n height: ${height}px;\n `;\n\n this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;\n }\n\n private destroyDragEl(): void {\n this.dragEl?.remove();\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\n let { moveableOptions = {} } = this.core.config;\n\n if (typeof moveableOptions === 'function') {\n moveableOptions = moveableOptions(this.core);\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 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 left: 0,\n right: this.container.clientWidth,\n bottom: this.container.clientHeight,\n ...(moveableOptions.bounds || {}),\n },\n ...options,\n ...moveableOptions,\n };\n }\n\n private calcValueByFontsize(value: number) {\n const { contentWindow } = this.core.renderer;\n const fontSize = contentWindow?.document.documentElement.style.fontSize;\n\n if (fontSize) {\n const times = globalThis.parseFloat(fontSize) / 100;\n return (value / times).toFixed(2);\n }\n\n return value;\n }\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 Moveable from 'moveable';\n\nimport StageCore from './StageCore';\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\n constructor(config: StageHighlightConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\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 this.moveable = new Moveable(this.container, {\n target: this.target,\n scrollable: true,\n origin: false,\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 }\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);\n this.vGuides = this.createGuides(GuidesType.VERTICAL);\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 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 /**\n * 清空所有参考线\n */\n public clearGuides() {\n this.horizontalGuidelines = [];\n this.verticalGuidelines = [];\n\n this.vGuides.setState({\n defaultGuides: [],\n });\n\n this.hGuides.setState({\n defaultGuides: [],\n });\n\n this.emit('changeGuides', {\n type: GuidesType.VERTICAL,\n guides: [],\n });\n\n this.emit('changeGuides', {\n type: GuidesType.HORIZONTAL,\n guides: [],\n });\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 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 { throttle } from 'lodash-es';\n\nimport { Mode, MouseButton, ZIndex } from './const';\nimport Rule from './Rule';\nimport type StageCore from './StageCore';\nimport type { StageMaskConfig } from './types';\nimport { createDiv, getScrollParent, isFixedParent } from './util';\n\nconst wrapperClassName = 'editor-mask-wrapper';\nconst throttleTime = 100;\n\nconst hideScrollbar = () => {\n const style = globalThis.document.createElement('style');\n style.innerHTML = `\n .${wrapperClassName}::-webkit-scrollbar { width: 0 !important; display: none }\n `;\n globalThis.document.head.appendChild(style);\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\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\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\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.fixScrollValue();\n this.scroll();\n this.core.dr.updateMoveable();\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 /**\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 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 = this.width - this.wrapperWidth;\n }\n\n /**\n * 计算并设置最大滚动高度\n */\n private setMaxScrollTop(): void {\n this.maxScrollTop = this.height - this.wrapperHeight;\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\n event.stopImmediatePropagation();\n event.stopPropagation();\n\n if (event.button !== MouseButton.LEFT && event.button !== MouseButton.RIGHT) return;\n\n // 点击的对象如果是选中框,则不需要再触发选中了,而可能是拖动行为\n if ((event.target as HTMLDivElement).className.indexOf('moveable-control') !== -1) {\n return;\n }\n\n this.content.removeEventListener('mousemove', this.highlightHandler);\n\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 this.emit('select');\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.fixScrollValue();\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 { SELECTED_CLASS, ZIndex } from './const';\nimport StageCore from './StageCore';\nimport type { Runtime, RuntimeWindow, StageRenderConfig } from './types';\nimport { getHost, isSameDomain } from './util';\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 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.contentWindow = this.iframe?.contentWindow as RuntimeWindow;\n\n this.contentWindow.magic = this.getMagicApi();\n } else {\n throw Error('mount 失败');\n }\n }\n\n public getRuntime = (): Promise<Runtime> => {\n if (this.runtime) return Promise.resolve(this.runtime);\n return new Promise((resolve) => {\n const listener = (runtime: Runtime) => {\n this.off('runtime-ready', listener);\n resolve(runtime);\n };\n this.on('runtime-ready', listener);\n });\n };\n\n /**\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 this.emit('onload');\n\n if (this.render) {\n const el = await this.render(this.core);\n if (el) {\n this.iframe?.contentDocument?.body?.appendChild(el);\n }\n }\n\n if (this.contentWindow) {\n const style = this.contentWindow.document.createElement('style');\n style.id = 'tmagic-stage-render';\n style.innerHTML = `\n .${SELECTED_CLASS}, .${SELECTED_CLASS}-parent {\n z-index: ${ZIndex.SELECTED_EL};\n }\n `;\n this.contentWindow.document.head.appendChild(style);\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 { Id } from '@tmagic/schema';\n\nimport { DEFAULT_ZOOM, GHOST_EL_ID_PREFIX } from './const';\nimport StageDragResize from './StageDragResize';\nimport StageHighlight from './StageHighlight';\nimport StageMask from './StageMask';\nimport StageRender from './StageRender';\nimport {\n CanSelect,\n GuidesEventData,\n RemoveData,\n Runtime,\n SortEventData,\n StageCoreConfig,\n UpdateData,\n UpdateEventData,\n} from './types';\nimport { addSelectedClassName, removeSelectedClassName } from './util';\n\nexport default class StageCore extends EventEmitter {\n public selectedDom: Element | undefined;\n public highlightedDom: Element | undefined;\n\n public renderer: StageRender;\n public mask: StageMask;\n public dr: StageDragResize;\n public highlightLayer: StageHighlight;\n public config: StageCoreConfig;\n public zoom = DEFAULT_ZOOM;\n public container?: HTMLDivElement;\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\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 });\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', (event: MouseEvent) => {\n this.setElementFromPoint(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 await this.setElementFromPoint(event);\n if (this.highlightedDom === this.selectedDom) {\n this.highlightLayer.clearHighlight();\n return;\n }\n this.highlightLayer.highlight(this.highlightedDom as HTMLElement);\n this.emit('highlight', this.highlightedDom);\n })\n .on('clearHighlight', async () => {\n this.highlightLayer.clearHighlight();\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\n public async setElementFromPoint(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 const els = doc?.elementsFromPoint(x / zoom, y / zoom) as HTMLElement[];\n\n let stopped = false;\n const stop = () => (stopped = true);\n for (const el of els) {\n if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.canSelect(el, event, stop))) {\n if (stopped) break;\n if (event.type === 'mousemove') {\n this.highlight(el);\n break;\n }\n this.select(el, event);\n break;\n }\n }\n }\n\n /**\n * 选中组件\n * @param idOrEl 组件Dom节点的id属性,或者Dom节点\n */\n public async select(idOrEl: Id | HTMLElement, event?: MouseEvent): Promise<void> {\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 this.selectedDom = el;\n\n if (this.renderer.contentWindow) {\n removeSelectedClassName(this.renderer.contentWindow.document);\n if (this.selectedDom) {\n addSelectedClassName(this.selectedDom);\n }\n }\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) 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 * 挂载Dom节点\n * @param el 将stage挂载到该Dom节点上\n */\n public mount(el: HTMLDivElement): void {\n this.container = el;\n const { mask, renderer } = this;\n\n 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 /**\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.es.js","sources":["../src/const.ts","../src/util.ts","../src/StageDragResize.ts","../src/TargetCalibrate.ts","../src/StageHighlight.ts","../src/Rule.ts","../src/StageMask.ts","../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\nexport const DRAG_EL_ID_PREFIX = 'drag_el_';\n\nexport const HIGHLIGHT_EL_ID_PREFIX = 'highlight_el_';\n\n// 默认放到缩小倍数\nexport const DEFAULT_ZOOM = 1;\n\nexport enum GuidesType {\n HORIZONTAL = 'horizontal',\n VERTICAL = 'vertical',\n}\n\nexport enum ZIndex {\n MASK = '99999',\n SELECTED_EL = '666',\n}\n\nexport enum MouseButton {\n LEFT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n}\n\nexport enum Mode {\n ABSOLUTE = 'absolute',\n FIXED = 'fixed',\n SORTABLE = 'sortable',\n}\n\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 { Mode, SELECTED_CLASS } from './const';\nimport type { Offset } from './types';\n\nexport const getOffset = (el: HTMLElement): Offset => {\n const { transform } = getComputedStyle(el);\n const { offsetParent } = el;\n\n let left = el.offsetLeft;\n let top = el.offsetTop;\n\n if (transform.indexOf('matrix') > -1) {\n let a = 1;\n let b = 1;\n let c = 1;\n let d = 1;\n let e = 0;\n let f = 0;\n transform.replace(\n /matrix\\((.+), (.+), (.+), (.+), (.+), (.+)\\)/,\n ($0: string, $1: string, $2: string, $3: string, $4: string, $5: string, $6: string): string => {\n a = +$1;\n b = +$2;\n c = +$3;\n d = +$4;\n e = +$5;\n f = +$6;\n return transform;\n },\n );\n\n left = a * left + c * top + e;\n top = b * left + d * top + f;\n }\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\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 getHost = (targetUrl: string) => targetUrl.match(/\\/\\/([^/]+)/)?.[1];\n\nexport const isSameDomain = (targetUrl = '', source = globalThis.location.host) => {\n const isHttpUrl = /^(http[s]?:)?\\/\\//.test(targetUrl);\n\n if (!isHttpUrl) return true;\n\n return getHost(targetUrl) === source;\n};\n\nexport const isAbsolute = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'absolute';\n};\n\nexport const isRelative = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'relative';\n};\n\nexport const isStatic = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'static';\n};\n\nexport const isFixed = (el?: HTMLElement): boolean => {\n if (!el) return false;\n return getComputedStyle(el).position === 'fixed';\n};\n\nexport const isFixedParent = (el: HTMLElement) => {\n let fixed = false;\n let dom = el;\n while (dom) {\n fixed = isFixed(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 if (isStatic(el) || isRelative(el)) 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(element)) return null;\n for (let parent = element; parent.parentElement; ) {\n parent = parent.parentElement;\n style = getComputedStyle(parent);\n if (isAbsolute(element) && isStatic(element)) {\n continue;\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\n }\n\n return null;\n};\n\nexport const createDiv = ({ className, cssText }: { className: string; cssText: string }) => {\n const el = globalThis.document.createElement('div');\n el.className = className;\n el.style.cssText = cssText;\n return el;\n};\n\nexport const removeSelectedClassName = (doc: Document) => {\n const oldEl = doc.querySelector(`.${SELECTED_CLASS}`);\n\n if (oldEl) {\n oldEl.classList.remove(SELECTED_CLASS);\n (oldEl.parentNode as HTMLDivElement)?.classList.remove(`${SELECTED_CLASS}-parent`);\n }\n};\n\nexport const addSelectedClassName = (el: Element) => {\n el.classList.add(SELECTED_CLASS);\n (el.parentNode as Element)?.classList.add(`${SELECTED_CLASS}-parent`);\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 type { MoveableOptions } from 'moveable';\nimport Moveable from 'moveable';\nimport MoveableHelper from 'moveable-helper';\n\nimport { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode } from './const';\nimport StageCore from './StageCore';\nimport type { Offset, Runtime, SortEventData, StageDragResizeConfig } from './types';\nimport { getAbsolutePosition, getMode, getOffset } from './util';\n\nenum ActionStatus {\n START = 'start',\n ING = 'ing',\n END = 'end',\n}\n\n/**\n * 选中框\n */\nexport default class StageDragResize extends EventEmitter {\n public core: StageCore;\n public container: HTMLElement;\n public target?: HTMLElement;\n public dragEl: HTMLElement;\n public moveable?: Moveable;\n public horizontalGuidelines: number[] = [];\n public verticalGuidelines: number[] = [];\n public elementGuidelines: HTMLElement[] = [];\n public mode: Mode = Mode.ABSOLUTE;\n\n private moveableOptions: MoveableOptions = {};\n private dragStatus: ActionStatus = ActionStatus.END;\n private ghostEl: HTMLElement | undefined;\n private moveableHelper?: MoveableHelper;\n\n constructor(config: StageDragResizeConfig) {\n super();\n\n this.core = config.core;\n this.container = config.container;\n\n this.dragEl = globalThis.document.createElement('div');\n this.container.append(this.dragEl);\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 this.init(el);\n\n // 从不能拖动到能拖动的节点之间切换,要重新创建moveable,不然dragStart不生效\n if (!this.moveable || this.target !== oldTarget) {\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 this.updateMoveable();\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 /**\n * 销毁实例\n */\n public destroy(): void {\n this.moveable?.destroy();\n this.destroyGhostEl();\n this.destroyDragEl();\n this.dragStatus = ActionStatus.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 this.updateDragEl(el);\n\n this.moveableOptions = this.getOptions({\n target: this.dragEl,\n });\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 }\n\n private bindResizeEvent(): void {\n if (!this.moveable) throw new Error('moveable 为初始化');\n\n const frame = {\n translate: [0, 0],\n };\n\n this.moveable\n .on('resizeStart', (e) => {\n if (e.dragStart) {\n const rect = this.moveable!.getRect();\n const offset = getAbsolutePosition(e.target as HTMLElement, rect);\n e.dragStart.set([offset.left, offset.top]);\n }\n })\n .on('resize', ({ width, height, drag }) => {\n if (!this.moveable || !this.target || !this.dragEl) return;\n\n const { beforeTranslate } = drag;\n frame.translate = beforeTranslate;\n this.dragStatus = ActionStatus.ING;\n\n this.target.style.width = `${width}px`;\n this.target.style.height = `${height}px`;\n this.dragEl.style.width = `${width}px`;\n this.dragEl.style.height = `${height}px`;\n\n // 流式布局\n if (this.mode === Mode.SORTABLE) {\n this.dragEl.style.top = `${beforeTranslate[1]}px`;\n this.target.style.top = `0px`;\n return;\n }\n\n this.dragEl.style.left = `${beforeTranslate[0]}px`;\n this.dragEl.style.top = `${beforeTranslate[1]}px`;\n\n const offset = getAbsolutePosition(this.target, { left: beforeTranslate[0], top: beforeTranslate[1] });\n\n this.target.style.left = `${offset.left}px`;\n this.target.style.top = `${offset.top}px`;\n })\n .on('resizeEnd', () => {\n this.dragStatus = ActionStatus.END;\n this.update(true);\n });\n }\n\n private bindDragEvent(): void {\n if (!this.moveable) throw new Error('moveable 为初始化');\n\n let offset: Offset | null = null;\n\n this.moveable\n .on('dragStart', (e) => {\n if (!this.target) throw new Error('未选中组件');\n\n this.dragStatus = ActionStatus.START;\n\n this.moveableHelper?.onDragStart(e);\n\n if (this.mode === Mode.SORTABLE) {\n this.ghostEl = this.generateGhostEl(this.target);\n }\n })\n .on('drag', (e) => {\n if (!this.target || !this.dragEl) return;\n\n if (!offset) {\n offset = getAbsolutePosition(this.target, { left: 0, top: 0 });\n }\n\n this.dragStatus = ActionStatus.ING;\n\n const { left, top } = e;\n\n // 流式布局\n if (this.ghostEl) {\n this.dragEl.style.top = `${top}px`;\n this.ghostEl.style.top = `${top + offset.top}px`;\n return;\n }\n\n this.moveableHelper?.onDrag(e);\n\n this.target.style.left = `${left + offset.left}px`;\n this.target.style.top = `${top + offset.top}px`;\n })\n .on('dragEnd', () => {\n // 点击不拖动时会触发dragStart和dragEnd,但是不会有drag事件\n if (this.dragStatus === ActionStatus.ING) {\n switch (this.mode) {\n case Mode.SORTABLE:\n this.sort();\n break;\n default:\n this.update();\n }\n }\n offset = null;\n\n this.dragStatus = ActionStatus.END;\n this.destroyGhostEl();\n });\n }\n\n private getSnapElements(runtime: Runtime, el?: HTMLElement): HTMLElement[] {\n const { renderer, mask } = this.core;\n const getSnapElements =\n runtime?.getSnapElements ||\n (() => {\n const doc = renderer.contentWindow?.document;\n return doc ? Array.from(doc.querySelectorAll('[id]')) : [];\n });\n return getSnapElements(el).filter(\n (element) => element !== this.target && !this.target?.contains(element) && element !== mask.page,\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): void {\n const rect = this.moveable!.getRect();\n const offset =\n this.mode === Mode.SORTABLE ? { left: 0, top: 0 } : getAbsolutePosition(this.target as HTMLElement, rect);\n\n const left = this.calcValueByFontsize(offset.left);\n const top = this.calcValueByFontsize(offset.top);\n const width = this.calcValueByFontsize(rect.width);\n const height = this.calcValueByFontsize(rect.height);\n\n this.emit('update', {\n el: this.target,\n style: isResize ? { left, top, width, height } : { left, top },\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 const { top, left } = getAbsolutePosition(el, getOffset(el));\n ghostEl.id = `${GHOST_EL_ID_PREFIX}${el.id}`;\n ghostEl.style.zIndex = '5';\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 destroyGhostEl(): void {\n this.ghostEl?.remove();\n this.ghostEl = undefined;\n }\n\n private updateDragEl(el: HTMLElement) {\n const { width, height } = el.getBoundingClientRect();\n const offset = getOffset(el);\n\n this.dragEl.style.cssText = `\n position: absolute;\n left: ${offset.left}px;\n top: ${offset.top}px;\n width: ${width}px;\n height: ${height}px;\n z-index: 9;\n `;\n\n this.dragEl.id = `${DRAG_EL_ID_PREFIX}${el.id}`;\n }\n\n private destroyDragEl(): void {\n this.dragEl?.remove();\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\n let { moveableOptions = {} } = this.core.config;\n\n if (typeof moveableOptions === 'function') {\n moveableOptions = moveableOptions(this.core);\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 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 left: 0,\n right: this.container.clientWidth,\n bottom: this.container.clientHeight,\n ...(moveableOptions.bounds || {}),\n },\n ...options,\n ...moveableOptions,\n };\n }\n\n private calcValueByFontsize(value: number) {\n const { contentWindow } = this.core.renderer;\n const fontSize = contentWindow?.document.documentElement.style.fontSize;\n\n if (fontSize) {\n const times = globalThis.parseFloat(fontSize) / 100;\n return (value / times).toFixed(2);\n }\n\n return value;\n }\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 { Mode } from './const';\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 operationEl: HTMLElement;\n\n constructor(config: TargetCalibrateConfig) {\n super();\n\n this.parent = config.parent;\n this.mask = config.mask;\n this.dr = config.dr;\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 { width, height } = el.getBoundingClientRect();\n const { left, top } = this.getOffset(el);\n this.operationEl.style.cssText = `\n position: absolute;\n left: ${left}px;\n top: ${top}px;\n width: ${width}px;\n height: ${height}px;\n `;\n\n this.operationEl.id = `${prefix}${el.id}`;\n return this.operationEl;\n }\n\n public destroy(): void {\n this.operationEl?.remove();\n }\n\n private getOffset(el: HTMLElement): Offset {\n const { transform } = getComputedStyle(el);\n const { offsetParent } = el;\n\n let left = el.offsetLeft;\n let top = el.offsetTop;\n\n if (transform.indexOf('matrix') > -1) {\n let a = 1;\n let b = 1;\n let c = 1;\n let d = 1;\n let e = 0;\n let f = 0;\n transform.replace(\n /matrix\\((.+), (.+), (.+), (.+), (.+), (.+)\\)/,\n ($0: string, $1: string, $2: string, $3: string, $4: string, $5: string, $6: string): string => {\n a = +$1;\n b = +$2;\n c = +$3;\n d = +$4;\n e = +$5;\n f = +$6;\n return transform;\n },\n );\n\n left = a * left + c * top + e;\n top = b * left + d * top + f;\n }\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\n/* eslint-disable no-param-reassign */\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 });\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: 1,\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);\n this.vGuides = this.createGuides(GuidesType.VERTICAL);\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 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 /**\n * 清空所有参考线\n */\n public clearGuides() {\n this.horizontalGuidelines = [];\n this.verticalGuidelines = [];\n\n this.vGuides.setState({\n defaultGuides: [],\n });\n\n this.hGuides.setState({\n defaultGuides: [],\n });\n\n this.emit('changeGuides', {\n type: GuidesType.VERTICAL,\n guides: [],\n });\n\n this.emit('changeGuides', {\n type: GuidesType.HORIZONTAL,\n guides: [],\n });\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 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 { throttle } from 'lodash-es';\n\nimport { Mode, MouseButton, ZIndex } from './const';\nimport Rule from './Rule';\nimport type StageCore from './StageCore';\nimport type { StageMaskConfig } from './types';\nimport { createDiv, getScrollParent, isFixedParent } from './util';\n\nconst wrapperClassName = 'editor-mask-wrapper';\nconst throttleTime = 100;\n\nconst hideScrollbar = () => {\n const style = globalThis.document.createElement('style');\n style.innerHTML = `\n .${wrapperClassName}::-webkit-scrollbar { width: 0 !important; display: none }\n `;\n globalThis.document.head.appendChild(style);\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\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\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\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.fixScrollValue();\n this.scroll();\n this.core.dr.updateMoveable();\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 /**\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 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 = this.width - this.wrapperWidth;\n }\n\n /**\n * 计算并设置最大滚动高度\n */\n private setMaxScrollTop(): void {\n this.maxScrollTop = this.height - this.wrapperHeight;\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\n event.stopImmediatePropagation();\n event.stopPropagation();\n\n if (event.button !== MouseButton.LEFT && event.button !== MouseButton.RIGHT) return;\n\n // 点击的对象如果是选中框,则不需要再触发选中了,而可能是拖动行为\n if ((event.target as HTMLDivElement).className.indexOf('moveable-control') !== -1) {\n return;\n }\n\n this.content.removeEventListener('mousemove', this.highlightHandler);\n\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 this.emit('select');\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.fixScrollValue();\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 { SELECTED_CLASS, ZIndex } from './const';\nimport StageCore from './StageCore';\nimport type { Runtime, RuntimeWindow, StageRenderConfig } from './types';\nimport { getHost, isSameDomain } from './util';\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 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.contentWindow = this.iframe?.contentWindow as RuntimeWindow;\n\n this.contentWindow.magic = this.getMagicApi();\n } else {\n throw Error('mount 失败');\n }\n }\n\n public getRuntime = (): Promise<Runtime> => {\n if (this.runtime) return Promise.resolve(this.runtime);\n return new Promise((resolve) => {\n const listener = (runtime: Runtime) => {\n this.off('runtime-ready', listener);\n resolve(runtime);\n };\n this.on('runtime-ready', listener);\n });\n };\n\n /**\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 this.emit('onload');\n\n if (this.render) {\n const el = await this.render(this.core);\n if (el) {\n this.iframe?.contentDocument?.body?.appendChild(el);\n }\n }\n\n if (this.contentWindow) {\n const style = this.contentWindow.document.createElement('style');\n style.id = 'tmagic-stage-render';\n style.innerHTML = `\n .${SELECTED_CLASS}, .${SELECTED_CLASS}-parent {\n z-index: ${ZIndex.SELECTED_EL};\n }\n `;\n this.contentWindow.document.head.appendChild(style);\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 { Id } from '@tmagic/schema';\n\nimport { DEFAULT_ZOOM, GHOST_EL_ID_PREFIX } from './const';\nimport StageDragResize from './StageDragResize';\nimport StageHighlight from './StageHighlight';\nimport StageMask from './StageMask';\nimport StageRender from './StageRender';\nimport {\n CanSelect,\n GuidesEventData,\n RemoveData,\n Runtime,\n SortEventData,\n StageCoreConfig,\n UpdateData,\n UpdateEventData,\n} from './types';\nimport { addSelectedClassName, removeSelectedClassName } from './util';\n\nexport default class StageCore extends EventEmitter {\n public selectedDom: Element | undefined;\n public highlightedDom: Element | undefined;\n\n public renderer: StageRender;\n public mask: StageMask;\n public dr: StageDragResize;\n public highlightLayer: StageHighlight;\n public config: StageCoreConfig;\n public zoom = DEFAULT_ZOOM;\n public container?: HTMLDivElement;\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\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 });\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', (event: MouseEvent) => {\n this.setElementFromPoint(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 await this.setElementFromPoint(event);\n if (this.highlightedDom === this.selectedDom) {\n this.highlightLayer.clearHighlight();\n return;\n }\n this.highlightLayer.highlight(this.highlightedDom as HTMLElement);\n this.emit('highlight', this.highlightedDom);\n })\n .on('clearHighlight', async () => {\n this.highlightLayer.clearHighlight();\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\n public async setElementFromPoint(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 const els = doc?.elementsFromPoint(x / zoom, y / zoom) as HTMLElement[];\n\n let stopped = false;\n const stop = () => (stopped = true);\n for (const el of els) {\n if (!el.id.startsWith(GHOST_EL_ID_PREFIX) && (await this.canSelect(el, event, stop))) {\n if (stopped) break;\n if (event.type === 'mousemove') {\n this.highlight(el);\n break;\n }\n this.select(el, event);\n break;\n }\n }\n }\n\n /**\n * 选中组件\n * @param idOrEl 组件Dom节点的id属性,或者Dom节点\n */\n public async select(idOrEl: Id | HTMLElement, event?: MouseEvent): Promise<void> {\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 this.selectedDom = el;\n\n if (this.renderer.contentWindow) {\n removeSelectedClassName(this.renderer.contentWindow.document);\n if (this.selectedDom) {\n addSelectedClassName(this.selectedDom);\n }\n }\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) 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 * 挂载Dom节点\n * @param el 将stage挂载到该Dom节点上\n */\n public mount(el: HTMLDivElement): void {\n this.container = el;\n const { mask, renderer } = this;\n\n 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 /**\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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"}