@easy-editor/plugin-dashboard 0.0.16 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,123 @@
1
1
  # @easy-editor/plugin-dashboard
2
2
 
3
- Dashboard plugin for EasyEditor.
3
+ Dashboard plugin for EasyEditor. This plugin provides dashboard functionality for managing elements on a canvas-like editor interface, with features like:
4
+
5
+ - Element positioning and drag-and-drop
6
+ - Grouping and ungrouping elements
7
+ - Element layering (move to top, bottom, etc.)
8
+ - Guidelines and element alignment
9
+ - Visual feedback and layout management
10
+
11
+ ## Features
12
+
13
+ ### Positioning and Movement
14
+
15
+ The dashboard plugin handles precise positioning of elements on your canvas with:
16
+
17
+ - Drag-and-drop movement with position tracking
18
+ - Automatic alignment guides with element snapping
19
+ - Coordinate-based positioning with `x`, `y`, `width`, and `height` properties
20
+
21
+ ### Element Grouping
22
+
23
+ Easily organize your design by grouping elements together:
24
+
25
+ | Action | Description |
26
+ |--------|-------------|
27
+ | Group Elements | Combine multiple elements into a single manageable group |
28
+ | Ungroup | Split a group back into individual elements |
29
+ | Nested Groups | Support for groups within groups |
30
+
31
+ ### Element Layering
32
+
33
+ Control the stacking order of elements on your dashboard:
34
+
35
+ | Method | Description |
36
+ |--------|-------------|
37
+ | `levelTop()` | Move element to the front |
38
+ | `levelBottom()` | Send element to the back |
39
+ | `levelUp()` | Move element up one layer |
40
+ | `levelDown()` | Move element down one layer |
41
+ | `moveToLevel(level)` | Move element to a specific layer |
42
+
43
+ ### Guide Lines
44
+
45
+ The plugin provides smart guide lines that help with precise element alignment:
46
+
47
+ - Automatic alignment to element edges and centers
48
+ - Configurable guide lines at specific positions
49
+ - Visual feedback during element movement
50
+
51
+ ## Usage Example
52
+
53
+ ```typescript
54
+ import { DashboardPlugin } from '@easy-editor/plugin-dashboard';
55
+
56
+ // Define your group component metadata
57
+ const groupMeta = {
58
+ componentName: 'Group',
59
+ title: 'Group',
60
+ category: 'inner',
61
+ configure: {
62
+ advanced: {
63
+ view: GroupComponent
64
+ }
65
+ }
66
+ };
67
+
68
+ // Initialize the plugin with required configuration
69
+ DashboardPlugin({
70
+ group: {
71
+ meta: groupMeta,
72
+ initSchema: {
73
+ componentName: 'Group',
74
+ title: 'Group',
75
+ isGroup: true,
76
+ },
77
+ }
78
+ })
79
+ ```
80
+
81
+ ## Configuration Options
82
+
83
+ The plugin accepts a configuration object with the following properties:
84
+
85
+ ### Group Component
86
+
87
+ The `group` property is required and defines how groups will be handled in the dashboard:
88
+
89
+ ```typescript
90
+ {
91
+ group: {
92
+ // Component metadata for the group
93
+ meta: ComponentMetadata;
94
+
95
+ // Initial schema for new groups
96
+ initSchema: NodeSchema;
97
+ }
98
+ }
99
+ ```
100
+
101
+ ## API Extensions
102
+
103
+ The dashboard plugin extends several core interfaces with additional methods:
104
+
105
+ ### Document Extensions
106
+
107
+ - `document.group(nodeIdList)` - Group multiple nodes together
108
+ - `document.ungroup(group)` - Ungroup a group node
109
+
110
+ ### Node Extensions
111
+
112
+ - `node.isGroup` - Boolean indicating if node is a group
113
+ - `node.getDashboardRect()` - Get positioning rectangle
114
+ - `node.updateDashboardRect(rect)` - Update positioning
115
+ - `node.getNodesInGroup()` - Get direct child nodes in a group
116
+ - `node.getAllNodesInGroup()` - Get all nested nodes in a group
117
+ - `node.getCurrentGroup()` - Get immediate parent group
118
+ - `node.getTopGroup()` - Get top-most parent group
119
+ - `node.getAllGroups()` - Get all parent groups
120
+
121
+ ### Designer Extensions
122
+
123
+ - `designer.guideline` - Access to guidelines functionality
@@ -2,8 +2,6 @@
2
2
 
3
3
  var core = require('@easy-editor/core');
4
4
  var mobx = require('mobx');
5
- var react = require('react');
6
- var jsxRuntime = require('react/jsx-runtime');
7
5
 
8
6
  function _applyDecs2311(e, t, n, r, o, i) {
9
7
  var a,
@@ -377,35 +375,6 @@ class GuideLine {
377
375
  }
378
376
  }
379
377
 
380
- const Group = /*#__PURE__*/react.forwardRef((props, ref) => {
381
- return /*#__PURE__*/jsxRuntime.jsx("div", {
382
- ref: ref,
383
- style: {
384
- position: 'relative',
385
- width: '100%',
386
- height: '100%'
387
- },
388
- children: props?.children
389
- });
390
- });
391
-
392
- const configure = {
393
- props: [
394
- ],
395
- component: {},
396
- supports: {},
397
- advanced: {
398
- view: Group
399
- }
400
- };
401
-
402
- const meta = {
403
- componentName: 'Group',
404
- title: '分组',
405
- category: '内置',
406
- configure
407
- };
408
-
409
378
  const updateNodeRect = (node, offset = {
410
379
  x: 0,
411
380
  y: 0
@@ -442,47 +411,42 @@ const updateNodeRectByDOM = (node, offset = {
442
411
  domNode.style.top = `${offset.y}px`;
443
412
  };
444
413
 
445
- const defaultGroupSchema = {
446
- componentName: 'Group',
447
- title: '分组',
448
- isGroup: true
449
- };
450
414
  const DashboardPlugin = options => {
451
415
  const {
452
- group = {}
416
+ group
453
417
  } = options || {};
454
418
  const {
455
- schema: groupSchema = defaultGroupSchema
419
+ meta: groupMeta,
420
+ initSchema: groupInitSchema
456
421
  } = group || {};
422
+ if (!groupMeta || !groupInitSchema) {
423
+ throw new Error('group meta and group init schema are required');
424
+ }
457
425
  return {
458
426
  name: 'DashboardPlugin',
459
427
  deps: [],
460
428
  init(ctx) {
461
429
  const {
462
- designer,
463
- simulator,
464
- componentMetaManager,
465
- hotkey,
466
- logger
430
+ materials,
431
+ project
467
432
  } = ctx;
468
433
  const {
469
- viewport
470
- } = simulator;
471
- hotkey.bind('ctrl+d', e => {
472
- e.preventDefault();
473
- logger.log('ctrl+d');
474
- });
475
- designer.onEvent(core.DESIGNER_EVENT.INIT, designer => {
476
- designer.guideline = new GuideLine(designer);
477
- });
478
- componentMetaManager.createComponentMeta(meta);
479
- simulator.addComponent('Group', Group);
434
+ designer
435
+ } = project;
436
+ materials.createComponentMeta(groupMeta);
480
437
  const startOffsetNodeData = {
481
438
  x: 0,
482
439
  y: 0
483
440
  };
484
441
  designer.dragon.onDragstart(e => {
485
442
  if (!e.shell) return;
443
+ const {
444
+ simulator
445
+ } = project;
446
+ if (!simulator) return;
447
+ const {
448
+ viewport
449
+ } = simulator;
486
450
  const {
487
451
  dragObject
488
452
  } = e;
@@ -613,6 +577,10 @@ const DashboardPlugin = options => {
613
577
  }
614
578
  });
615
579
  designer.dragon.onDragend(e => {
580
+ const {
581
+ simulator
582
+ } = project;
583
+ if (!simulator) return;
616
584
  const {
617
585
  dragObject,
618
586
  esc
@@ -645,15 +613,16 @@ const DashboardPlugin = options => {
645
613
  extend
646
614
  }) {
647
615
  const {
648
- Node,
649
- Designer
616
+ Node
650
617
  } = extendClass;
651
- const originalInit = Designer.prototype.init;
618
+ let guideline = null;
652
619
  extend('Designer', {
653
- init: {
654
- value() {
655
- originalInit.call(this);
656
- this.guideline = new GuideLine(this);
620
+ guideline: {
621
+ get() {
622
+ if (!guideline) {
623
+ guideline = new GuideLine(this);
624
+ }
625
+ return guideline;
657
626
  }
658
627
  }
659
628
  });
@@ -665,7 +634,7 @@ const DashboardPlugin = options => {
665
634
  if (typeof nodeIdList[0] === 'string') {
666
635
  nodeList = nodeIdList.map(id => this.getNode(id));
667
636
  }
668
- const groupNode = this.createNode(groupSchema);
637
+ const groupNode = this.createNode(groupInitSchema);
669
638
  let maxZIndex = Number.POSITIVE_INFINITY;
670
639
  for (const node of nodeList) {
671
640
  if (node.index < maxZIndex) {
@@ -914,4 +883,3 @@ const calculateDashboardRectBox = nodes => {
914
883
  };
915
884
 
916
885
  module.exports = DashboardPlugin;
917
- //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -1,10 +1,27 @@
1
- import { type NodeSchema, type PluginCreator } from '@easy-editor/core';
1
+ import { type ComponentMetadata, type NodeSchema, type PluginCreator } from '@easy-editor/core';
2
2
  export * from './type';
3
3
  interface DashboardPluginOptions {
4
- group?: {
5
- schema?: NodeSchema;
4
+ /**
5
+ * 分组组件,用于大屏设计。允许将多个组件组合在一起,便于整体管理和移动。
6
+ */
7
+ group: {
8
+ /**
9
+ * 分组元数据
10
+ */
11
+ meta: ComponentMetadata;
12
+ /**
13
+ * 创建分组时的初始化 schema
14
+ * @example
15
+ * ```ts
16
+ * {
17
+ * componentName: 'Group',
18
+ * title: '分组',
19
+ * isGroup: true,
20
+ * }
21
+ * ```
22
+ */
23
+ initSchema: NodeSchema;
6
24
  };
7
- xxx?: string;
8
25
  }
9
26
  declare const DashboardPlugin: PluginCreator<DashboardPluginOptions>;
10
27
  export default DashboardPlugin;
package/dist/index.js CHANGED
@@ -1,7 +1,5 @@
1
1
  import { DESIGNER_EVENT, DragObjectType, getConvertedExtraKey } from '@easy-editor/core';
2
2
  import { observable, computed, action } from 'mobx';
3
- import { forwardRef } from 'react';
4
- import { jsx } from 'react/jsx-runtime';
5
3
 
6
4
  function _applyDecs2311(e, t, n, r, o, i) {
7
5
  var a,
@@ -375,35 +373,6 @@ class GuideLine {
375
373
  }
376
374
  }
377
375
 
378
- const Group = /*#__PURE__*/forwardRef((props, ref) => {
379
- return /*#__PURE__*/jsx("div", {
380
- ref: ref,
381
- style: {
382
- position: 'relative',
383
- width: '100%',
384
- height: '100%'
385
- },
386
- children: props?.children
387
- });
388
- });
389
-
390
- const configure = {
391
- props: [
392
- ],
393
- component: {},
394
- supports: {},
395
- advanced: {
396
- view: Group
397
- }
398
- };
399
-
400
- const meta = {
401
- componentName: 'Group',
402
- title: '分组',
403
- category: '内置',
404
- configure
405
- };
406
-
407
376
  const updateNodeRect = (node, offset = {
408
377
  x: 0,
409
378
  y: 0
@@ -440,47 +409,42 @@ const updateNodeRectByDOM = (node, offset = {
440
409
  domNode.style.top = `${offset.y}px`;
441
410
  };
442
411
 
443
- const defaultGroupSchema = {
444
- componentName: 'Group',
445
- title: '分组',
446
- isGroup: true
447
- };
448
412
  const DashboardPlugin = options => {
449
413
  const {
450
- group = {}
414
+ group
451
415
  } = options || {};
452
416
  const {
453
- schema: groupSchema = defaultGroupSchema
417
+ meta: groupMeta,
418
+ initSchema: groupInitSchema
454
419
  } = group || {};
420
+ if (!groupMeta || !groupInitSchema) {
421
+ throw new Error('group meta and group init schema are required');
422
+ }
455
423
  return {
456
424
  name: 'DashboardPlugin',
457
425
  deps: [],
458
426
  init(ctx) {
459
427
  const {
460
- designer,
461
- simulator,
462
- componentMetaManager,
463
- hotkey,
464
- logger
428
+ materials,
429
+ project
465
430
  } = ctx;
466
431
  const {
467
- viewport
468
- } = simulator;
469
- hotkey.bind('ctrl+d', e => {
470
- e.preventDefault();
471
- logger.log('ctrl+d');
472
- });
473
- designer.onEvent(DESIGNER_EVENT.INIT, designer => {
474
- designer.guideline = new GuideLine(designer);
475
- });
476
- componentMetaManager.createComponentMeta(meta);
477
- simulator.addComponent('Group', Group);
432
+ designer
433
+ } = project;
434
+ materials.createComponentMeta(groupMeta);
478
435
  const startOffsetNodeData = {
479
436
  x: 0,
480
437
  y: 0
481
438
  };
482
439
  designer.dragon.onDragstart(e => {
483
440
  if (!e.shell) return;
441
+ const {
442
+ simulator
443
+ } = project;
444
+ if (!simulator) return;
445
+ const {
446
+ viewport
447
+ } = simulator;
484
448
  const {
485
449
  dragObject
486
450
  } = e;
@@ -611,6 +575,10 @@ const DashboardPlugin = options => {
611
575
  }
612
576
  });
613
577
  designer.dragon.onDragend(e => {
578
+ const {
579
+ simulator
580
+ } = project;
581
+ if (!simulator) return;
614
582
  const {
615
583
  dragObject,
616
584
  esc
@@ -643,15 +611,16 @@ const DashboardPlugin = options => {
643
611
  extend
644
612
  }) {
645
613
  const {
646
- Node,
647
- Designer
614
+ Node
648
615
  } = extendClass;
649
- const originalInit = Designer.prototype.init;
616
+ let guideline = null;
650
617
  extend('Designer', {
651
- init: {
652
- value() {
653
- originalInit.call(this);
654
- this.guideline = new GuideLine(this);
618
+ guideline: {
619
+ get() {
620
+ if (!guideline) {
621
+ guideline = new GuideLine(this);
622
+ }
623
+ return guideline;
655
624
  }
656
625
  }
657
626
  });
@@ -663,7 +632,7 @@ const DashboardPlugin = options => {
663
632
  if (typeof nodeIdList[0] === 'string') {
664
633
  nodeList = nodeIdList.map(id => this.getNode(id));
665
634
  }
666
- const groupNode = this.createNode(groupSchema);
635
+ const groupNode = this.createNode(groupInitSchema);
667
636
  let maxZIndex = Number.POSITIVE_INFINITY;
668
637
  for (const node of nodeList) {
669
638
  if (node.index < maxZIndex) {
package/package.json CHANGED
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "name": "@easy-editor/plugin-dashboard",
3
- "version": "0.0.16",
4
- "description": "Dashboard plugin for EasyEditor.",
3
+ "version": "1.0.0",
4
+ "description": "Dashboard plugin for EasyEditor",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
7
15
  "files": [
8
16
  "dist",
9
17
  "LICENSE",
@@ -32,13 +40,8 @@
32
40
  "url": "https://github.com/Easy-Editor/EasyEditor/issues"
33
41
  },
34
42
  "peerDependencies": {
35
- "@easy-editor/core": "^0.0.15",
36
43
  "mobx": "^6.13.5",
37
- "react": "^18 || ^19",
38
- "@types/react": "^18 || ^19"
39
- },
40
- "devDependencies": {
41
- "@easy-editor/core": "0.0.15"
44
+ "@easy-editor/core": "^1.0.0"
42
45
  },
43
46
  "scripts": {
44
47
  "dev": "deno run --watch ./src/index.ts",
@@ -51,14 +54,6 @@
51
54
  "types:src": "tsc --project tsconfig.build.json",
52
55
  "test-types": "tsc --project tsconfig.test.json"
53
56
  },
54
- "types": "dist/index.d.ts",
55
- "typings": "dist/index.d.ts",
56
57
  "module": "dist/index.js",
57
- "exports": {
58
- ".": {
59
- "import": "./dist/index.js",
60
- "require": "./dist/cjs/index.js",
61
- "default": "./dist/index.js"
62
- }
63
- }
58
+ "unpkg": "dist/index.js"
64
59
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/designer/guideline.ts","../../src/materials/group/component.tsx","../../src/materials/group/configure.ts","../../src/materials/group/meta.ts","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["import { DESIGNER_EVENT, type Designer, type Viewport } from '@easy-editor/core'\nimport { action, computed, observable } from 'mobx'\n\ntype GuideLineType = 'horizontal' | 'vertical'\n\ninterface GuideLineItem {\n id: string\n type: GuideLineType\n position: number\n}\n\ninterface AlignmentLine {\n type: GuideLineType\n position: number\n}\n\ninterface AdsorptionLine {\n /**\n * 吸附位置\n * - 0: 左 | 上\n * - 1: 中\n * - 2: 右 | 下\n */\n adsorption: number\n position: number\n}\n\nexport class GuideLine {\n /**\n * 是否启用辅助线\n */\n @observable accessor enabled = true\n\n /**\n * 自定义辅助线数组\n */\n @observable.shallow accessor guideLines: GuideLineItem[] = []\n\n @computed\n get guideLinesMap() {\n const result = Object.groupBy(this.guideLines, item => item.type)\n return {\n verticalLinesMap: new Map(result.vertical?.map(item => [item.position, item])),\n horizontalLinesMap: new Map(result.horizontal?.map(item => [item.position, item])),\n }\n }\n\n /**\n * Document Node 的辅助线信息\n */\n @observable.shallow accessor nodeLineMap = {\n verticalLinesMap: new Map<number, AlignmentLine>(),\n horizontalLinesMap: new Map<number, AlignmentLine>(),\n }\n\n /**\n * 实时显示的吸附辅助线\n */\n @observable accessor adsorptionLines = {\n verticalLines: new Set<number>(),\n horizontalLines: new Set<number>(),\n }\n\n get currentDocument() {\n return this.designer.currentDocument\n }\n\n constructor(readonly designer: Designer) {\n // 添加画布视口的辅助线\n this.designer.onEvent(DESIGNER_EVENT.VIEWPORT_MOUNT, ({ viewport }: { viewport: Viewport }) => {\n this.addGuideLine({\n id: 'viewport-vertical-left',\n type: 'vertical',\n position: 0,\n })\n this.addGuideLine({\n id: 'viewport-vertical-middle',\n type: 'vertical',\n position: viewport.width / 2,\n })\n this.addGuideLine({\n id: 'viewport-vertical-right',\n type: 'vertical',\n position: viewport.width,\n })\n this.addGuideLine({\n id: 'viewport-horizontal-top',\n type: 'horizontal',\n position: 0,\n })\n this.addGuideLine({\n id: 'viewport-horizontal-middle',\n type: 'horizontal',\n position: viewport.height / 2,\n })\n this.addGuideLine({\n id: 'viewport-horizontal-bottom',\n type: 'horizontal',\n position: viewport.height,\n })\n })\n }\n\n /**\n * 添加额外的辅助线,用于尺寸调整\n */\n @action\n addGuideLine(guideLine: GuideLineItem) {\n this.guideLines.push(guideLine)\n }\n\n /**\n * 删除辅助线\n */\n @action\n removeGuideLine(id: string) {\n const index = this.guideLines.findIndex(item => item.id === id)\n if (index !== -1) {\n this.guideLines.splice(index, 1)\n }\n }\n\n /**\n * 修改辅助线\n */\n @action\n updateGuideLine(id: string, guideLine: GuideLineItem) {\n const index = this.guideLines.findIndex(item => item.id === id)\n if (index !== -1) {\n this.guideLines[index] = guideLine\n }\n }\n\n /**\n * 计算页面组件的辅助线信息\n */\n @action\n calculateGuideLineInfo() {\n if (!this.enabled) return\n\n const verticalLinesMap = new Map<number, AlignmentLine>()\n const horizontalLinesMap = new Map<number, AlignmentLine>()\n\n // 获取画布上所有的组件,得到每个可以被参照对齐的组件的位置信息\n const nodes = [...this.currentDocument!.nodesMap.values()]\n\n // 将选中的组合和组件抛开计算之外\n const selected: string[] = []\n for (const node of this.designer.selection.getNodes()) {\n if (node.isGroup) {\n selected.push(...node.getAllNodesInGroup().map(node => node.id))\n } else {\n selected.push(node.id)\n }\n }\n\n nodes\n .filter(node => !node.hidden)\n .forEach(node => {\n if (selected.includes(node.id) || node.isRoot || node.isGroup) return\n\n const nodeRect = node.getDashboardRect()\n const verticalNodeLines = [nodeRect.left, nodeRect.left + nodeRect.width / 2, nodeRect.right]\n const horizontalNodeLines = [nodeRect.top, nodeRect.top + nodeRect.height / 2, nodeRect.bottom]\n\n for (const line of verticalNodeLines) {\n const position = Math.round(line)\n verticalLinesMap.set(position, {\n type: 'vertical',\n position,\n })\n }\n for (const line of horizontalNodeLines) {\n const position = Math.round(line)\n horizontalLinesMap.set(position, {\n type: 'horizontal',\n position,\n })\n }\n })\n\n this.nodeLineMap.verticalLinesMap = verticalLinesMap\n this.nodeLineMap.horizontalLinesMap = horizontalLinesMap\n }\n\n /**\n * 组件的吸附距离\n */\n private adsorptionSize = 10\n\n /**\n * 设置画布上要实时展示的对齐辅助线,返回要吸附的距离\n * @param rect 为拖动过程中组件的位置信息\n * @param adsorption 指定需要吸附位置\n * - 0: 左 | 上\n * - 1: 中\n * - 2: 右 | 下\n */\n @action\n getAdsorptionPosition(rect: DOMRect, adsorption?: number | Array<number>) {\n if (typeof adsorption === 'number') {\n adsorption = [adsorption]\n }\n\n this.resetAdsorptionLines()\n\n const adsorptionVerticalLines: AdsorptionLine[] = []\n const adsorptionHorizontalLines: AdsorptionLine[] = []\n const currentVerticalLine = [rect.left, rect.left + rect.width / 2, rect.right]\n const currentHorizontalLine = [rect.top, rect.top + rect.height / 2, rect.bottom]\n\n // 计算需要显示的辅助线和吸附信息\n currentVerticalLine.forEach((item, index) => {\n let minDistance = Number.POSITIVE_INFINITY\n\n this.nodeLineMap.verticalLinesMap.forEach((_, pos) => {\n const distance = Math.abs(item - pos)\n if (distance !== 0 && distance < this.adsorptionSize && distance < minDistance) {\n minDistance = pos\n }\n })\n this.guideLinesMap.verticalLinesMap.forEach((_, pos) => {\n const distance = Math.abs(item - pos)\n if (distance !== 0 && distance < this.adsorptionSize && distance < minDistance) {\n minDistance = pos\n }\n })\n\n if (\n minDistance !== Number.POSITIVE_INFINITY &&\n adsorptionVerticalLines.findIndex(item => item.position === minDistance) === -1\n ) {\n adsorptionVerticalLines.push({\n adsorption: index,\n position: minDistance,\n })\n }\n })\n currentHorizontalLine.forEach((item, index) => {\n let minDistance = -1\n\n this.nodeLineMap.horizontalLinesMap.forEach((_, pos) => {\n if (Math.abs(item - pos) < this.adsorptionSize) {\n minDistance = pos\n }\n })\n this.guideLinesMap.horizontalLinesMap.forEach((_, pos) => {\n const distance = Math.abs(item - pos)\n if (distance < this.adsorptionSize && distance < minDistance) {\n minDistance = pos\n }\n })\n\n if (minDistance !== -1 && adsorptionHorizontalLines.findIndex(item => item.position === minDistance) === -1) {\n adsorptionHorizontalLines.push({\n adsorption: index,\n position: minDistance,\n })\n }\n })\n\n const isAdsorption = adsorptionVerticalLines.length > 0 || adsorptionHorizontalLines.length > 0\n const adsorb: Record<'x' | 'y', AdsorptionLine | undefined> = { x: undefined, y: undefined }\n if (isAdsorption) {\n // 将吸附的辅助线添加到吸附辅助线集合中,用于显示到页面上\n adsorptionVerticalLines.forEach(item => this.adsorptionLines.verticalLines.add(item.position))\n adsorptionHorizontalLines.forEach(item => this.adsorptionLines.horizontalLines.add(item.position))\n\n // 如果吸附,则计算吸附的距离\n if (adsorptionVerticalLines.length > 0) {\n if (adsorption) {\n adsorb.x = adsorptionVerticalLines.find(item => adsorption.includes(item.adsorption))!\n } else {\n const adsorptionPosition = Math.min(...adsorptionVerticalLines.map(item => item.position))\n adsorb.x = adsorptionVerticalLines.find(item => item.position === adsorptionPosition)!\n }\n }\n if (adsorptionHorizontalLines.length > 0) {\n if (adsorption) {\n adsorb.y = adsorptionHorizontalLines.find(item => adsorption.includes(item.adsorption))!\n } else {\n const adsorptionPosition = Math.min(...adsorptionHorizontalLines.map(item => item.position))\n adsorb.y = adsorptionHorizontalLines.find(item => item.position === adsorptionPosition)!\n }\n }\n }\n\n return {\n isAdsorption,\n adsorb,\n }\n\n // let fillX: number | undefined\n // let fillY: number | undefined\n\n // adsorptionVerticalLine.forEach(item => {\n // if (Math.abs(item - rect.left) < this.adsorptionSize) {\n // fillX = item\n // }\n\n // if (Math.abs(item - rect.right) < this.adsorptionSize) {\n // fillX = item - rect.width\n // }\n\n // const center = rect.left + rect.width / 2\n\n // if (Math.abs(item - center) < this.adsorptionSize) {\n // fillX = item - rect.width / 2\n // }\n // })\n\n // adsorptionHorizontalLine.forEach(item => {\n // if (Math.abs(item - rect.top) < this.adsorptionSize) {\n // fillY = item\n // }\n\n // if (Math.abs(item - rect.bottom) < this.adsorptionSize) {\n // fillY = item - rect.height\n // }\n\n // const center = rect.top + rect.height / 2\n\n // if (Math.abs(item - center) < this.adsorptionSize) {\n // fillY = item - rect.height / 2\n // }\n // })\n }\n\n @action\n resetAdsorptionLines() {\n this.adsorptionLines.verticalLines.clear()\n this.adsorptionLines.horizontalLines.clear()\n }\n}\n","import { type PropsWithChildren, type Ref, forwardRef } from 'react'\n\ninterface GroupProps extends PropsWithChildren {}\n\nconst Group = forwardRef((props: GroupProps, ref: Ref<HTMLDivElement>) => {\n return (\n <div ref={ref} style={{ position: 'relative', width: '100%', height: '100%' }}>\n {props?.children}\n </div>\n )\n})\n\nexport default Group\n","import type { Configure } from '@easy-editor/core'\nimport Group from './component'\n\nconst configure: Configure = {\n props: [\n // {\n // name: 'test',\n // title: '分组',\n // type: 'group',\n // items: [],\n // },\n ],\n component: {},\n supports: {},\n advanced: {\n view: Group,\n },\n}\n\nexport default configure\n","import type { ComponentMetadata } from '@easy-editor/core'\nimport configure from './configure'\n\nconst meta: ComponentMetadata = {\n componentName: 'Group',\n title: '分组',\n category: '内置',\n configure,\n}\n\nexport default meta\n","import type { Node } from '@easy-editor/core'\n\n/**\n * 更新节点在 dashboard 中的位置\n * @param node 节点\n * @param offset 节点相对于画布的偏移量\n * @param groupOffset 节点相对于其父组节点的偏移量\n */\nexport const updateNodeRect = (node: Node, offset = { x: 0, y: 0 }) => {\n if (node.isGroup) {\n const nodeRect = node.getDashboardRect()\n const delta = {\n x: offset.x - nodeRect.x,\n y: offset.y - nodeRect.y,\n }\n\n for (const childNode of node.getAllNodesInGroup()) {\n const childRect = childNode.getDashboardRect()\n childNode.updateDashboardRect({\n x: childRect.x + delta.x,\n y: childRect.y + delta.y,\n })\n }\n } else {\n node.updateDashboardRect({\n x: offset.x,\n y: offset.y,\n })\n }\n}\n\n/**\n * 更新节点 DOM 在 dashboard 中的位置\n * @param node 节点\n * @param offset 节点相对于画布的偏移量\n * @param groupOffset 节点相对于其父组节点的偏移量\n */\nexport const updateNodeRectByDOM = (node: Node, offset = { x: 0, y: 0 }) => {\n const domNode = node.getDashboardContainer()\n if (!domNode) {\n return\n }\n\n domNode.style.left = `${offset.x}px`\n domNode.style.top = `${offset.y}px`\n}\n","import {\n DESIGNER_EVENT,\n type Designer,\n type Document,\n DragObjectType,\n type DropLocation,\n type Node,\n type NodeSchema,\n type OffsetObserver,\n type PluginCreator,\n type Simulator,\n getConvertedExtraKey,\n} from '@easy-editor/core'\nimport { GuideLine } from './designer/guideline'\nimport { GroupComponent, GroupComponentMeta } from './materials/group'\nimport { updateNodeRect, updateNodeRectByDOM } from './utils'\n\nexport * from './type'\n\ninterface DashboardPluginOptions {\n group?: {\n schema?: NodeSchema\n }\n\n // TODO: 配置分组内容(schema、meta)\n xxx?: string\n}\n\nconst defaultGroupSchema = {\n componentName: 'Group',\n title: '分组',\n isGroup: true,\n}\n\nconst DashboardPlugin: PluginCreator<DashboardPluginOptions> = options => {\n const { group = {} } = options || {}\n const { schema: groupSchema = defaultGroupSchema } = group || {}\n\n return {\n name: 'DashboardPlugin',\n deps: [],\n init(ctx) {\n const { designer, simulator, componentMetaManager, hotkey, logger } = ctx\n const { viewport } = simulator\n\n // test hotkey\n hotkey.bind('ctrl+d', e => {\n e.preventDefault()\n logger.log('ctrl+d')\n })\n\n // add guideline\n designer.onEvent(DESIGNER_EVENT.INIT, (designer: Designer) => {\n designer.guideline = new GuideLine(designer)\n })\n\n // add componentMeta\n componentMetaManager.createComponentMeta(GroupComponentMeta)\n simulator.addComponent('Group', GroupComponent)\n\n /* ---------------------------- NodeData to Node ---------------------------- */\n const startOffsetNodeData = { x: 0, y: 0 }\n\n designer.dragon.onDragstart(e => {\n if (!e.shell) return\n\n const { dragObject } = e\n const shellRect = simulator.computeComponentInstanceRect(e.shell)\n\n if (dragObject && dragObject.type === DragObjectType.NodeData) {\n startOffsetNodeData.x = (e.globalX! - shellRect?.left!) / viewport.scale\n startOffsetNodeData.y = (e.globalY! - shellRect?.top!) / viewport.scale\n }\n })\n\n designer.onEvent(DESIGNER_EVENT.INSERT_NODE_BEFORE, (e: DropLocation) => {\n const { event } = e\n const { dragObject } = event\n\n // add dashboard rect\n if (dragObject && dragObject.type === DragObjectType.NodeData) {\n const nodeData = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data]\n for (const schema of nodeData) {\n if (!schema) continue\n if (!schema.$dashboard) {\n schema.$dashboard = {}\n }\n if (!schema.$dashboard.rect) {\n schema.$dashboard.rect = {}\n }\n schema.$dashboard.rect.x = event.canvasX! - startOffsetNodeData.x\n schema.$dashboard.rect.y = event.canvasY! - startOffsetNodeData.y\n }\n }\n })\n\n /* ----------------------------------- DND ---------------------------------- */\n let startNodes: { [key: string]: DOMRect } = {}\n let startOffsetNodes: { [key: string]: { x: number; y: number } } = {}\n let lastOffsetNodes: { [key: string]: { x: number; y: number } } = {}\n\n designer.dragon.onDragstart(e => {\n const { dragObject } = e\n\n if (dragObject && dragObject.type === DragObjectType.Node) {\n // 计算辅助线位置\n designer.guideline.calculateGuideLineInfo()\n\n for (const node of dragObject.nodes!) {\n if (!node) continue\n\n // 计算鼠标偏移量\n const rect = node.getDashboardRect()\n if (rect) {\n startNodes[node.id] = rect\n startOffsetNodes[node.id] = { x: e.canvasX! - rect.x, y: e.canvasY! - rect.y }\n }\n }\n\n // 计算整个拖拽包围盒的 Rect\n const boxRect = calculateDashboardRectBox(dragObject.nodes as Node[])\n if (boxRect) {\n startNodes.box = boxRect\n startOffsetNodes.box = { x: e.canvasX! - boxRect.x, y: e.canvasY! - boxRect.y }\n }\n }\n })\n\n designer.dragon.onDrag(e => {\n const { dragObject } = e\n if (dragObject && dragObject.type === DragObjectType.Node) {\n // 根据拖拽包围盒的 Rect 计算吸附位置\n const { x: boxStartX = 0, y: boxStartY = 0, width = 0, height = 0 } = startNodes.box\n const { x: boxX = 0, y: boxY = 0 } = startOffsetNodes.box\n const { isAdsorption, adsorb } = designer.guideline.getAdsorptionPosition(\n new DOMRect(e.canvasX! - boxX, e.canvasY! - boxY, width, height),\n )\n\n // 根据辅助线位置,计算对应吸附位置\n let adsorbX = undefined\n let adsorbY = undefined\n if (isAdsorption) {\n if (adsorb.x) {\n if (adsorb.x.adsorption === 0) {\n adsorbX = adsorb.x.position\n } else if (adsorb.x.adsorption === 1) {\n adsorbX = adsorb.x.position - width / 2\n } else if (adsorb.x.adsorption === 2) {\n adsorbX = adsorb.x.position - width\n }\n }\n if (adsorb.y) {\n if (adsorb.y.adsorption === 0) {\n adsorbY = adsorb.y.position\n } else if (adsorb.y.adsorption === 1) {\n adsorbY = adsorb.y.position - height / 2\n } else if (adsorb.y.adsorption === 2) {\n adsorbY = adsorb.y.position - height\n }\n }\n }\n\n for (const node of dragObject.nodes!) {\n if (!node) continue\n\n // 更新节点位置\n const { x: nodeStartX = 0, y: nodeStartY = 0 } = startNodes[node.id]\n const { x, y } = startOffsetNodes[node.id]\n let offsetX = e.canvasX! - x\n let offsetY = e.canvasY! - y\n\n if (isAdsorption) {\n // 吸附位置 需要减去拖拽包围盒的 Rect 的偏移量 得到节点吸附位置\n offsetX = adsorbX ? adsorbX + nodeStartX - boxStartX : offsetX\n offsetY = adsorbY ? adsorbY + nodeStartY - boxStartY : offsetY\n }\n updateNodeRectByDOM(node, { x: offsetX, y: offsetY })\n lastOffsetNodes[node.id] = { x: offsetX, y: offsetY }\n }\n }\n })\n\n designer.dragon.onDragend(e => {\n const { dragObject, esc } = e\n\n if (dragObject && dragObject.type === DragObjectType.Node) {\n for (const node of dragObject.nodes!) {\n if (!node) continue\n\n if (esc) {\n // dom 的话,因为没有更新内部节点值,所以直接重新渲染就行了\n simulator.rerender()\n } else {\n const { x: lastX = 0, y: lastY = 0 } = lastOffsetNodes[node.id]\n updateNodeRect(node, { x: lastX, y: lastY })\n }\n }\n\n // 清空辅助线\n designer.guideline.resetAdsorptionLines()\n }\n\n startNodes = {}\n startOffsetNodes = {}\n lastOffsetNodes = {}\n })\n },\n extend({ extendClass, extend }) {\n const { Node, Designer } = extendClass\n\n /* -------------------------------- Designer -------------------------------- */\n const originalInit = Designer.prototype.init\n extend('Designer', {\n init: {\n value(this: Designer) {\n originalInit.call(this)\n\n this.guideline = new GuideLine(this)\n },\n },\n })\n\n /* -------------------------------- Document -------------------------------- */\n extend('Document', {\n group: {\n value(this: Document, nodeIdList: Node[] | string[]) {\n if (nodeIdList.length === 0) return\n\n let nodeList: Node[] = []\n if (typeof nodeIdList[0] === 'string') {\n nodeList = (nodeIdList as string[]).map(id => this.getNode(id)!)\n }\n\n const groupNode = this.createNode(groupSchema)\n\n // 计算所有节点的 index,确定分组的插入位置\n let maxZIndex = Number.POSITIVE_INFINITY\n for (const node of nodeList) {\n if (node.index < maxZIndex) {\n maxZIndex = node.index\n }\n if (node && !node.isRoot) {\n this.migrateNode(node, groupNode)\n }\n }\n\n this.rootNode?.insert(groupNode, maxZIndex)\n\n return groupNode\n },\n },\n ungroup: {\n value(this: Document, group: Node | string) {\n let groupNode: Node | null\n if (typeof group === 'string') {\n groupNode = this.getNode(group)\n } else {\n groupNode = group\n }\n\n if (!groupNode || !groupNode.isGroup || !groupNode.children) return\n\n const nodes = groupNode.childrenNodes\n // TODO: 这里写法很奇怪,因为children是响应式的,所以迁移之后,children也会更新\n while (nodes.length > 0) {\n if (groupNode.parent) {\n this.migrateNode(nodes[0], groupNode.parent)\n }\n }\n\n this.removeNode(groupNode)\n },\n },\n })\n\n /* ---------------------------------- Node ---------------------------------- */\n const originalInitProps = Node.prototype.initBuiltinProps\n extend('Node', {\n // Dashboard\n getDashboardContainer: {\n value(this: Node) {\n const domNodes = this.getDOMNode()\n return domNodes.length > 0 ? domNodes[0] : null\n },\n },\n getDashboardRect: {\n value(this: Node) {\n if (!this.isGroup) {\n const rect = this.getExtraPropValue('$dashboard.rect') as any\n return new DOMRect(rect.x ?? 0, rect.y ?? 0, rect.width ?? 0, rect.height ?? 0)\n }\n\n let [minX, minY, maxX, maxY] = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ]\n\n for (const child of this.childrenNodes) {\n const childRect = child.getDashboardRect()\n\n minX = Math.min(minX, childRect.x)\n minY = Math.min(minY, childRect.y)\n maxX = Math.max(maxX, childRect.x + childRect.width)\n maxY = Math.max(maxY, childRect.y + childRect.height)\n }\n\n return new DOMRect(minX, minY, maxX - minX, maxY - minY)\n },\n },\n updateDashboardRect: {\n value(this: Node, rect: Partial<DOMRect>) {\n if (this.isGroup) return\n\n if (typeof rect.x === 'number') {\n this.setExtraPropValue('$dashboard.rect.x', rect.x)\n }\n if (typeof rect.y === 'number') {\n this.setExtraPropValue('$dashboard.rect.y', rect.y)\n }\n if (typeof rect.width === 'number') {\n this.setExtraPropValue('$dashboard.rect.width', rect.width)\n }\n if (typeof rect.height === 'number') {\n this.setExtraPropValue('$dashboard.rect.height', rect.height)\n }\n },\n },\n // Group\n isGroup: {\n get(this: Node) {\n return this.getExtraPropValue('isGroup')\n },\n },\n getCurrentGroup: {\n value(this: Node) {\n let parent = this.parent\n while (parent && !parent.isGroup) {\n parent = parent.parent\n }\n return parent\n },\n },\n getTopGroup: {\n value(this: Node) {\n let parent = this.parent\n let topGroup: Node | null = null\n while (parent) {\n if (parent.isGroup) {\n topGroup = parent\n }\n parent = parent.parent\n }\n return topGroup\n },\n },\n getAllGroups: {\n value(this: Node) {\n const groups: Node[] = []\n let parent = this.parent\n while (parent) {\n if (parent.isGroup) {\n groups.push(parent)\n }\n parent = parent.parent\n }\n return groups\n },\n },\n getNodesInGroup: {\n value(this: Node) {\n if (!this.isGroup) return []\n\n const nodes: Node[] = []\n for (const node of this.childrenNodes) {\n if (!node.isGroup) {\n nodes.push(node)\n }\n }\n return nodes\n },\n },\n getAllNodesInGroup: {\n value(this: Node) {\n if (!this.isGroup) return []\n\n const nodes: Node[] = []\n for (const node of this.childrenNodes) {\n if (node.isGroup) {\n nodes.push(...node.getAllNodesInGroup())\n } else {\n nodes.push(node)\n }\n }\n return nodes\n },\n },\n initBuiltinProps: {\n value(this: Node) {\n // 实现类似 super.initBuiltinProps 的效果\n // 调用父类的 initBuiltinProps 方法\n originalInitProps.call(this)\n\n this.props.has(getConvertedExtraKey('isGroup')) || this.props.add(getConvertedExtraKey('isGroup'), false)\n },\n },\n // Level\n moveToLevel: {\n value(this: Node, level: number) {\n if (level < -1 || level >= this.parent!.childrenNodes.length) return\n if (this.index === level) return\n if (this.isRoot) return\n\n this.parent!.insert(this, level)\n },\n },\n levelTop: {\n value(this: Node) {\n this.moveToLevel(0)\n },\n },\n levelBottom: {\n value(this: Node) {\n this.moveToLevel(-1)\n },\n },\n levelUp: {\n value(this: Node) {\n this.moveToLevel(this.index - 1)\n },\n },\n levelDown: {\n value(this: Node) {\n this.moveToLevel(this.index + 1)\n },\n },\n })\n\n /* ----------------------------- OffsetObserver ----------------------------- */\n extend('OffsetObserver', {\n computeRect: {\n value(this: OffsetObserver) {\n // return this.node.getDashboardRect()\n const { node, instance } = this.nodeInstance\n const host = node.document?.simulator!\n const rect = host.computeComponentInstanceRect(instance!)\n\n const { viewport } = node.document.simulator!\n const local = viewport.toLocalPoint({ clientX: rect!.x, clientY: rect!.y })\n\n return new DOMRect(\n local.clientX,\n local.clientY,\n rect!.width / viewport.scale,\n rect!.height / viewport.scale,\n )\n },\n },\n height: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.height : this._height\n },\n },\n width: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.width : this._width\n },\n },\n top: {\n get(this: OffsetObserver) {\n return this.isRoot ? 0 : this._top\n },\n },\n left: {\n get(this: OffsetObserver) {\n return this.isRoot ? 0 : this._left\n },\n },\n bottom: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.height : this._bottom\n },\n },\n right: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.width : this._right\n },\n },\n })\n\n /* -------------------------------- Simulator ------------------------------- */\n extend('Simulator', {\n getDashboardStyle: {\n get(this: Simulator) {\n return this.get('dashboardStyle') || {}\n },\n },\n })\n /* -------------------------------- Viewport -------------------------------- */\n /**\n * 这里需要对坐标转换的偏移做额外的处理,因为在大屏的使用中,外层画布容器使用到了 translate(-50%, -50%) 进行居中定位,但是\n * 在计算坐标的时候,需要减去这个偏移量,否则会导致坐标转换不准确\n */\n // Object.defineProperties(Viewport.prototype, {\n // // 局部坐标 -> 缩放(×scale) -> 加上视口偏移(+rect.left/top) -> 减去居中偏移(-centerOffset) -> 全局坐标\n // toGlobalPoint: {\n // value(this: Viewport, point: Point) {\n // if (!this.viewportElement) {\n // return point\n // }\n\n // const rect = this.bounds\n // const centerOffsetX = rect.width * 0.5\n // const centerOffsetY = rect.height * 0.5\n\n // return {\n // clientX: point.clientX * this.scale + rect.left - centerOffsetX,\n // clientY: point.clientY * this.scale + rect.top - centerOffsetY,\n // }\n // },\n // },\n // // 全局坐标 -> 减去视口偏移(-rect.left/top) -> 加上居中偏移(+centerOffset) -> 缩放还原(/scale) -> 局部坐标\n // toLocalPoint: {\n // value(this: Viewport, point: Point): Point {\n // if (!this.viewportElement) {\n // return point\n // }\n\n // const rect = this.bounds\n // const centerOffsetX = rect.width * 0.5\n // const centerOffsetY = rect.height * 0.5\n\n // return {\n // clientX: (point.clientX - rect.left + centerOffsetX) / this.scale,\n // clientY: (point.clientY - rect.top + centerOffsetY) / this.scale,\n // }\n // },\n // },\n // })\n },\n }\n}\n\nexport default DashboardPlugin\n\n/**\n * 计算节点的外围矩形 Rect,包括分支节点、多个节点计算\n * @param nodes 分组节点\n * @returns 外围矩形 {DOMRect}\n */\nconst calculateDashboardRectBox = (nodes: Node[]) => {\n let [minX, minY, maxX, maxY] = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ]\n\n for (const node of nodes) {\n const rect = node.getDashboardRect()\n minX = Math.min(minX, rect.x)\n minY = Math.min(minY, rect.y)\n maxX = Math.max(maxX, rect.x + rect.width)\n maxY = Math.max(maxY, rect.y + rect.height)\n }\n\n return new DOMRect(minX, minY, maxX - minX, maxY - minY)\n}\n"],"names":["GuideLine","_init_enabled","_init_extra_enabled","_init_guideLines","_init_extra_guideLines","_init_nodeLineMap","_init_extra_nodeLineMap","_init_adsorptionLines","_init_extra_adsorptionLines","_initProto","_applyDecs","observable","shallow","computed","action","e","enabled","v","A","guideLines","B","guideLinesMap","result","Object","groupBy","item","type","verticalLinesMap","Map","vertical","map","position","horizontalLinesMap","horizontal","nodeLineMap","C","verticalLines","Set","horizontalLines","adsorptionLines","D","currentDocument","designer","constructor","onEvent","DESIGNER_EVENT","VIEWPORT_MOUNT","viewport","addGuideLine","id","width","height","guideLine","push","removeGuideLine","index","findIndex","splice","updateGuideLine","calculateGuideLineInfo","nodes","nodesMap","values","selected","node","selection","getNodes","isGroup","getAllNodesInGroup","filter","hidden","forEach","includes","isRoot","nodeRect","getDashboardRect","verticalNodeLines","left","right","horizontalNodeLines","top","bottom","line","Math","round","set","adsorptionSize","getAdsorptionPosition","rect","adsorption","resetAdsorptionLines","adsorptionVerticalLines","adsorptionHorizontalLines","currentVerticalLine","currentHorizontalLine","minDistance","Number","POSITIVE_INFINITY","_","pos","distance","abs","isAdsorption","length","adsorb","x","undefined","y","add","find","adsorptionPosition","min","clear","Group","forwardRef","props","ref","_jsx","style","children","configure","component","supports","advanced","view","meta","componentName","title","category","updateNodeRect","offset","delta","childNode","childRect","updateDashboardRect","updateNodeRectByDOM","domNode","getDashboardContainer","defaultGroupSchema","DashboardPlugin","options","group","schema","groupSchema","name","deps","init","ctx","simulator","componentMetaManager","hotkey","logger","bind","preventDefault","log","INIT","guideline","createComponentMeta","GroupComponentMeta","addComponent","GroupComponent","startOffsetNodeData","dragon","onDragstart","shell","dragObject","shellRect","computeComponentInstanceRect","DragObjectType","NodeData","globalX","scale","globalY","INSERT_NODE_BEFORE","event","nodeData","Array","isArray","data","$dashboard","canvasX","canvasY","startNodes","startOffsetNodes","lastOffsetNodes","Node","boxRect","calculateDashboardRectBox","box","onDrag","boxStartX","boxStartY","boxX","boxY","DOMRect","adsorbX","adsorbY","nodeStartX","nodeStartY","offsetX","offsetY","onDragend","esc","rerender","lastX","lastY","extend","extendClass","Designer","originalInit","prototype","value","call","nodeIdList","nodeList","getNode","groupNode","createNode","maxZIndex","migrateNode","rootNode","insert","ungroup","childrenNodes","parent","removeNode","originalInitProps","initBuiltinProps","domNodes","getDOMNode","getExtraPropValue","minX","minY","maxX","maxY","NEGATIVE_INFINITY","child","max","setExtraPropValue","get","getCurrentGroup","getTopGroup","topGroup","getAllGroups","groups","getNodesInGroup","has","getConvertedExtraKey","moveToLevel","level","levelTop","levelBottom","levelUp","levelDown","computeRect","instance","nodeInstance","host","document","local","toLocalPoint","clientX","clientY","_height","_width","_top","_left","_bottom","_right","getDashboardStyle"],"mappings":"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"}