@tmagic/editor 1.0.0-rc.5 → 1.0.0-rc.8

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.
Files changed (85) hide show
  1. package/dist/style.css +3 -0
  2. package/dist/tmagic-editor.es.js +160 -118
  3. package/dist/tmagic-editor.es.js.map +1 -1
  4. package/dist/tmagic-editor.umd.js +160 -120
  5. package/dist/tmagic-editor.umd.js.map +1 -1
  6. package/dist/types/src/Editor.vue.d.ts +36 -2
  7. package/dist/types/src/fields/Code.vue.d.ts +4 -4
  8. package/dist/types/src/fields/CodeLink.vue.d.ts +1 -3
  9. package/dist/types/src/layouts/PropsPanel.vue.d.ts +2 -4
  10. package/dist/types/src/layouts/workspace/Workspace.vue.d.ts +3 -31
  11. package/dist/types/src/services/history.d.ts +1 -18
  12. package/dist/types/src/services/props.d.ts +8 -2
  13. package/dist/types/src/type.d.ts +9 -0
  14. package/dist/types/src/utils/editor.d.ts +0 -6
  15. package/dist/types/src/utils/props.d.ts +8 -1
  16. package/package.json +11 -20
  17. package/src/Editor.vue +35 -9
  18. package/src/components/ContentMenu.vue +58 -25
  19. package/src/layouts/sidebar/LayerMenu.vue +3 -0
  20. package/src/layouts/workspace/Stage.vue +11 -31
  21. package/src/layouts/workspace/ViewerMenu.vue +3 -0
  22. package/src/layouts/workspace/Workspace.vue +2 -28
  23. package/src/services/editor.ts +3 -4
  24. package/src/services/props.ts +64 -9
  25. package/src/theme/workspace.scss +4 -0
  26. package/src/type.ts +10 -0
  27. package/src/utils/editor.ts +1 -50
  28. package/src/utils/props.ts +30 -7
  29. package/LICENSE +0 -5432
  30. package/coverage/clover.xml +0 -1593
  31. package/coverage/coverage-final.json +0 -36
  32. package/coverage/lcov-report/base.css +0 -224
  33. package/coverage/lcov-report/block-navigation.js +0 -87
  34. package/coverage/lcov-report/favicon.png +0 -0
  35. package/coverage/lcov-report/index.html +0 -206
  36. package/coverage/lcov-report/prettify.css +0 -1
  37. package/coverage/lcov-report/prettify.js +0 -2
  38. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  39. package/coverage/lcov-report/sorter.js +0 -196
  40. package/coverage/lcov-report/src/Editor.vue.html +0 -814
  41. package/coverage/lcov-report/src/components/ContentMenu.vue.html +0 -406
  42. package/coverage/lcov-report/src/components/Icon.vue.html +0 -172
  43. package/coverage/lcov-report/src/components/ScrollViewer.vue.html +0 -283
  44. package/coverage/lcov-report/src/components/ToolButton.vue.html +0 -772
  45. package/coverage/lcov-report/src/components/index.html +0 -161
  46. package/coverage/lcov-report/src/index.html +0 -131
  47. package/coverage/lcov-report/src/layouts/AddPageBox.vue.html +0 -214
  48. package/coverage/lcov-report/src/layouts/Framework.vue.html +0 -343
  49. package/coverage/lcov-report/src/layouts/NavMenu.vue.html +0 -208
  50. package/coverage/lcov-report/src/layouts/PropsPanel.vue.html +0 -319
  51. package/coverage/lcov-report/src/layouts/Resizer.vue.html +0 -268
  52. package/coverage/lcov-report/src/layouts/index.html +0 -176
  53. package/coverage/lcov-report/src/layouts/sidebar/ComponentListPanel.vue.html +0 -358
  54. package/coverage/lcov-report/src/layouts/sidebar/LayerMenu.vue.html +0 -421
  55. package/coverage/lcov-report/src/layouts/sidebar/LayerPanel.vue.html +0 -775
  56. package/coverage/lcov-report/src/layouts/sidebar/Sidebar.vue.html +0 -226
  57. package/coverage/lcov-report/src/layouts/sidebar/TabPane.vue.html +0 -289
  58. package/coverage/lcov-report/src/layouts/sidebar/index.html +0 -176
  59. package/coverage/lcov-report/src/layouts/workspace/PageBar.vue.html +0 -718
  60. package/coverage/lcov-report/src/layouts/workspace/Stage.vue.html +0 -766
  61. package/coverage/lcov-report/src/layouts/workspace/ViewerMenu.vue.html +0 -568
  62. package/coverage/lcov-report/src/layouts/workspace/Workspace.vue.html +0 -649
  63. package/coverage/lcov-report/src/layouts/workspace/index.html +0 -161
  64. package/coverage/lcov-report/src/services/BaseService.ts.html +0 -643
  65. package/coverage/lcov-report/src/services/componentList.ts.html +0 -229
  66. package/coverage/lcov-report/src/services/editor.ts.html +0 -2167
  67. package/coverage/lcov-report/src/services/events.ts.html +0 -331
  68. package/coverage/lcov-report/src/services/history.ts.html +0 -478
  69. package/coverage/lcov-report/src/services/index.html +0 -206
  70. package/coverage/lcov-report/src/services/props.ts.html +0 -415
  71. package/coverage/lcov-report/src/services/ui.ts.html +0 -580
  72. package/coverage/lcov-report/src/type.ts.html +0 -850
  73. package/coverage/lcov-report/src/utils/compose.ts.html +0 -184
  74. package/coverage/lcov-report/src/utils/config.ts.html +0 -172
  75. package/coverage/lcov-report/src/utils/editor.ts.html +0 -838
  76. package/coverage/lcov-report/src/utils/index.html +0 -221
  77. package/coverage/lcov-report/src/utils/index.ts.html +0 -151
  78. package/coverage/lcov-report/src/utils/logger.ts.html +0 -226
  79. package/coverage/lcov-report/src/utils/props.ts.html +0 -796
  80. package/coverage/lcov-report/src/utils/scroll-viewer.ts.html +0 -733
  81. package/coverage/lcov-report/src/utils/undo-redo.ts.html +0 -313
  82. package/coverage/lcov.info +0 -3846
  83. package/dist/types/src/components/ToolButton.vue.d.ts +0 -46
  84. package/dist/types/src/fields/UISelect.vue.d.ts +0 -35
  85. package/dist/types/src/layouts/workspace/PageBar.vue.d.ts +0 -18
package/dist/style.css CHANGED
@@ -414,6 +414,9 @@
414
414
  width: 100%;
415
415
  user-select: none;
416
416
  }
417
+ .m-editor-workspace:focus-visible {
418
+ outline: 0;
419
+ }
417
420
  .m-editor-page-bar {
418
421
  position: fixed;
419
422
  bottom: 0;
@@ -121,7 +121,7 @@ function _sfc_render$l(_ctx, _cache, $props, $setup, $data, $options) {
121
121
  }
122
122
  var CodeLink = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["render", _sfc_render$l]]);
123
123
 
124
- var UISelect_vue_vue_type_style_index_0_lang = '';
124
+ var UISelect_vue_vue_type_style_index_0_lang = /* #__PURE__ */ (() => ".m-fields-ui-select {\n cursor: pointer;\n}\n.m-fields-ui-select i {\n margin-right: 3px;\n}\n.m-fields-ui-select span {\n color: #2882e0;\n}")();
125
125
 
126
126
  const _sfc_main$k = defineComponent({
127
127
  name: "m-fields-ui-select",
@@ -627,7 +627,7 @@ var historyService = new History();
627
627
 
628
628
  class Props extends BaseService {
629
629
  constructor() {
630
- super(["setPropsConfig", "getPropsConfig", "setPropsValue", "getPropsValue"]);
630
+ super(["setPropsConfig", "getPropsConfig", "setPropsValue", "getPropsValue", "createId", "setNewItemId"]);
631
631
  this.state = reactive({
632
632
  propsConfigMap: {},
633
633
  propsValueMap: {}
@@ -666,12 +666,44 @@ class Props extends BaseService {
666
666
  }
667
667
  return value;
668
668
  }
669
- return cloneDeep({
670
- ...getDefaultPropsValue(type),
671
- ...mergeWith(this.state.propsValueMap[type] || {}, defaultValue)
672
- });
669
+ const data = cloneDeep(defaultValue);
670
+ await this.setNewItemId(data);
671
+ return {
672
+ ...getDefaultPropsValue(type, await this.createId(type)),
673
+ ...mergeWith(cloneDeep(this.state.propsValueMap[type] || {}), data)
674
+ };
675
+ }
676
+ async createId(type) {
677
+ return `${type}_${random(1e4, false)}`;
678
+ }
679
+ async setNewItemId(config, parent) {
680
+ const oldId = config.id;
681
+ config.id = await this.createId(config.type || "component");
682
+ if (isPop(config) && parent?.type === NodeType.PAGE) {
683
+ updatePopId(oldId, config.id, parent);
684
+ }
685
+ if (config.items && Array.isArray(config.items)) {
686
+ for (const item of config.items) {
687
+ await this.setNewItemId(item, config);
688
+ }
689
+ }
673
690
  }
674
691
  }
692
+ const updatePopId = (oldId, popId, pageConfig) => {
693
+ pageConfig.items?.forEach((config) => {
694
+ if (config.pop === oldId) {
695
+ config.pop = popId;
696
+ return;
697
+ }
698
+ if (config.popId === oldId) {
699
+ config.popId = popId;
700
+ return;
701
+ }
702
+ if (Array.isArray(config.items)) {
703
+ updatePopId(oldId, popId, config);
704
+ }
705
+ });
706
+ };
675
707
  var propsService = new Props();
676
708
 
677
709
  var LayerOffset = /* @__PURE__ */ ((LayerOffset2) => {
@@ -692,7 +724,6 @@ var Keys = /* @__PURE__ */ ((Keys2) => {
692
724
  })(Keys || {});
693
725
 
694
726
  const COPY_STORAGE_KEY = "$MagicEditorCopyData";
695
- const generateId = (type) => `${type}_${random(1e4, false)}`;
696
727
  const getPageList = (app) => {
697
728
  if (app.items && Array.isArray(app.items)) {
698
729
  return app.items.filter((item) => item.type === NodeType.PAGE);
@@ -712,32 +743,6 @@ const generatePageName = (pageNameList) => {
712
743
  return pageName;
713
744
  };
714
745
  const generatePageNameByApp = (app) => generatePageName(getPageNameList(getPageList(app)));
715
- const updatePopId = (oldId, popId, pageConfig) => {
716
- pageConfig.items?.forEach((config) => {
717
- if (config.pop === oldId) {
718
- config.pop = popId;
719
- return;
720
- }
721
- if (config.popId === oldId) {
722
- config.popId = popId;
723
- return;
724
- }
725
- if (Array.isArray(config.items)) {
726
- updatePopId(oldId, popId, config);
727
- }
728
- });
729
- };
730
- const setNewItemId = (config, parent) => {
731
- const oldId = config.id;
732
- config.id = generateId(config.type || "component");
733
- config.name = `${config.name?.replace(/_(\d+)$/, "")}_${config.id}`;
734
- if (isPop(config) && parent?.type === NodeType.PAGE) {
735
- updatePopId(oldId, config.id, parent);
736
- }
737
- if (config.items && Array.isArray(config.items)) {
738
- config.items.forEach((item) => setNewItemId(item, config));
739
- }
740
- };
741
746
  const isFixed = (node) => node.style?.position === "fixed";
742
747
  const getNodeIndex = (node, parent) => {
743
748
  const items = parent?.items || [];
@@ -1136,7 +1141,7 @@ class Editor$1 extends BaseService {
1136
1141
  console.error(e);
1137
1142
  return;
1138
1143
  }
1139
- setNewItemId(config, this.get("root"));
1144
+ await propsService.setNewItemId(config, this.get("root"));
1140
1145
  if (config.style) {
1141
1146
  config.style = {
1142
1147
  ...config.style,
@@ -1179,9 +1184,9 @@ class Editor$1 extends BaseService {
1179
1184
  const node = this.get("node");
1180
1185
  const brothers = parent?.items || [];
1181
1186
  const index = brothers.findIndex((item) => `${item.id}` === `${node?.id}`);
1182
- if (offset === LayerOffset.BOTTOM) {
1187
+ if (offset === LayerOffset.TOP) {
1183
1188
  brothers.splice(brothers.length - 1, 0, brothers.splice(index, 1)[0]);
1184
- } else if (offset === LayerOffset.TOP) {
1189
+ } else if (offset === LayerOffset.BOTTOM) {
1185
1190
  brothers.splice(0, 0, brothers.splice(index, 1)[0]);
1186
1191
  } else {
1187
1192
  brothers.splice(index + parseInt(`${offset}`, 10), 0, brothers.splice(index, 1)[0]);
@@ -1466,6 +1471,21 @@ const fillConfig = (config = []) => [
1466
1471
  text: "\u7C97\u7EC6"
1467
1472
  }
1468
1473
  ]
1474
+ },
1475
+ {
1476
+ type: "fieldset",
1477
+ legend: "\u53D8\u5F62",
1478
+ name: "transform",
1479
+ items: [
1480
+ {
1481
+ name: "rotate",
1482
+ text: "\u65CB\u8F6C\u89D2\u5EA6"
1483
+ },
1484
+ {
1485
+ name: "scale",
1486
+ text: "\u7F29\u653E"
1487
+ }
1488
+ ]
1469
1489
  }
1470
1490
  ]
1471
1491
  }
@@ -1526,12 +1546,18 @@ const fillConfig = (config = []) => [
1526
1546
  }
1527
1547
  ];
1528
1548
  const DEFAULT_CONFIG = fillConfig([]);
1529
- const getDefaultPropsValue = (type) => ({
1549
+ const getDefaultPropsValue = (type, id) => ["page", "container"].includes(type) ? {
1550
+ type,
1551
+ id,
1552
+ style: {},
1553
+ name: type,
1554
+ items: []
1555
+ } : {
1530
1556
  type,
1531
- id: generateId(type),
1557
+ id,
1532
1558
  style: {},
1533
1559
  name: type
1534
- });
1560
+ };
1535
1561
 
1536
1562
  const _sfc_main$i = defineComponent({
1537
1563
  components: { Plus },
@@ -2249,9 +2275,14 @@ const _sfc_main$a = defineComponent({
2249
2275
  menuData: {
2250
2276
  type: Array,
2251
2277
  default: () => []
2278
+ },
2279
+ isSubMenu: {
2280
+ type: Boolean,
2281
+ default: false
2252
2282
  }
2253
2283
  },
2254
- setup() {
2284
+ emits: ["hide", "show"],
2285
+ setup(props, { emit }) {
2255
2286
  const menu = ref();
2256
2287
  const subMenu = ref();
2257
2288
  const visible = ref(false);
@@ -2261,15 +2292,31 @@ const _sfc_main$a = defineComponent({
2261
2292
  top: "0"
2262
2293
  });
2263
2294
  const hide = () => {
2295
+ if (!visible.value)
2296
+ return;
2264
2297
  visible.value = false;
2298
+ subMenu.value?.hide();
2299
+ emit("hide");
2300
+ };
2301
+ const hideHandler = (e) => {
2302
+ const target = e.target;
2303
+ if (!visible.value || !target) {
2304
+ return;
2305
+ }
2306
+ if (menu.value?.contains(target) || subMenu.value?.$el?.contains(target)) {
2307
+ return;
2308
+ }
2309
+ hide();
2265
2310
  };
2266
2311
  onMounted(() => {
2267
- globalThis.addEventListener("mouseup", (e) => {
2268
- if (!visible.value || e.target && menu.value?.contains(e.target)) {
2269
- return;
2270
- }
2271
- hide();
2272
- }, true);
2312
+ if (props.isSubMenu)
2313
+ return;
2314
+ globalThis.addEventListener("mousedown", hideHandler, true);
2315
+ });
2316
+ onUnmounted(() => {
2317
+ if (props.isSubMenu)
2318
+ return;
2319
+ globalThis.removeEventListener("mousedown", hideHandler, true);
2273
2320
  });
2274
2321
  return {
2275
2322
  menu,
@@ -2279,18 +2326,21 @@ const _sfc_main$a = defineComponent({
2279
2326
  subMenuData,
2280
2327
  hide,
2281
2328
  show(e) {
2282
- visible.value = true;
2283
- nextTick(() => {
2284
- const menuHeight = menu.value?.clientHeight || 0;
2285
- let top = e.clientY;
2286
- if (menuHeight + e.clientY > document.body.clientHeight) {
2287
- top = document.body.clientHeight - menuHeight;
2288
- }
2289
- menuStyle.value = {
2290
- top: `${top}px`,
2291
- left: `${e.clientX + 2}px`
2292
- };
2293
- });
2329
+ setTimeout(() => {
2330
+ visible.value = true;
2331
+ nextTick(() => {
2332
+ const menuHeight = menu.value?.clientHeight || 0;
2333
+ let top = e.clientY;
2334
+ if (menuHeight + e.clientY > document.body.clientHeight) {
2335
+ top = document.body.clientHeight - menuHeight;
2336
+ }
2337
+ menuStyle.value = {
2338
+ top: `${top}px`,
2339
+ left: `${e.clientX}px`
2340
+ };
2341
+ emit("show");
2342
+ });
2343
+ }, 300);
2294
2344
  },
2295
2345
  showSubMenu(item) {
2296
2346
  const menuItem = item;
@@ -2332,8 +2382,10 @@ function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
2332
2382
  createVNode(_component_content_menu, {
2333
2383
  class: "sub-menu",
2334
2384
  ref: "subMenu",
2335
- "menu-data": _ctx.subMenuData
2336
- }, null, 8, ["menu-data"])
2385
+ "menu-data": _ctx.subMenuData,
2386
+ "is-sub-menu": true,
2387
+ onHide: _ctx.hide
2388
+ }, null, 8, ["menu-data", "onHide"])
2337
2389
  ]))
2338
2390
  ], 4)) : createCommentVNode("", true);
2339
2391
  }
@@ -2348,6 +2400,7 @@ const _sfc_main$9 = defineComponent({
2348
2400
  const isRoot = computed(() => node.value?.type === NodeType.ROOT);
2349
2401
  const isPage = computed(() => node.value?.type === NodeType.PAGE);
2350
2402
  const componentList = computed(() => services?.componentListService.getList() || []);
2403
+ const layerContentMenu = inject("layerContentMenu", []);
2351
2404
  const createMenuItems = (group) => group.items.map((component) => ({
2352
2405
  text: component.text,
2353
2406
  type: "button",
@@ -2412,7 +2465,8 @@ const _sfc_main$9 = defineComponent({
2412
2465
  handler: () => {
2413
2466
  node.value && services?.editorService.remove(node.value);
2414
2467
  }
2415
- }
2468
+ },
2469
+ ...layerContentMenu
2416
2470
  ]),
2417
2471
  show(e) {
2418
2472
  menu.value?.show(e);
@@ -3203,6 +3257,7 @@ const _sfc_main$3 = defineComponent({
3203
3257
  const node = computed(() => editorService?.get("node"));
3204
3258
  const parent = computed(() => editorService?.get("parent"));
3205
3259
  const isPage = computed(() => node.value?.type === NodeType.PAGE);
3260
+ const stageContentMenu = inject("stageContentMenu", []);
3206
3261
  onMounted(() => {
3207
3262
  const data = globalThis.localStorage.getItem(COPY_STORAGE_KEY);
3208
3263
  canPaste.value = data !== "undefined" && !!data;
@@ -3315,7 +3370,8 @@ const _sfc_main$3 = defineComponent({
3315
3370
  handler: () => {
3316
3371
  editorService?.get("stage").clearGuides();
3317
3372
  }
3318
- }
3373
+ },
3374
+ ...stageContentMenu
3319
3375
  ]),
3320
3376
  show(e) {
3321
3377
  menu.value?.show(e);
@@ -3338,25 +3394,9 @@ const _sfc_main$2 = defineComponent({
3338
3394
  ViewerMenu,
3339
3395
  ScrollViewer
3340
3396
  },
3341
- props: {
3342
- render: {
3343
- type: Function
3344
- },
3345
- runtimeUrl: String,
3346
- autoScrollIntoView: Boolean,
3347
- canSelect: {
3348
- type: Function,
3349
- default: (el) => Boolean(el.id)
3350
- },
3351
- moveableOptions: {
3352
- type: [Object, Function],
3353
- default: () => (core) => ({
3354
- container: core?.renderer?.contentWindow?.document.getElementById("app")
3355
- })
3356
- }
3357
- },
3358
- setup(props) {
3397
+ setup() {
3359
3398
  const services = inject("services");
3399
+ const stageOptions = inject("stageOptions");
3360
3400
  const stageWrap = ref();
3361
3401
  const stageContainer = ref();
3362
3402
  const menu = ref();
@@ -3373,22 +3413,23 @@ const _sfc_main$2 = defineComponent({
3373
3413
  return;
3374
3414
  if (!stageContainer.value)
3375
3415
  return;
3376
- if (!(props.runtimeUrl || props.render) || !root.value)
3416
+ if (!(stageOptions?.runtimeUrl || stageOptions?.render) || !root.value)
3377
3417
  return;
3378
3418
  stage = new StageCore({
3379
- render: props.render,
3380
- runtimeUrl: props.runtimeUrl,
3419
+ render: stageOptions.render,
3420
+ runtimeUrl: stageOptions.runtimeUrl,
3381
3421
  zoom: zoom.value,
3382
- autoScrollIntoView: props.autoScrollIntoView,
3422
+ autoScrollIntoView: stageOptions.autoScrollIntoView,
3383
3423
  canSelect: (el, event, stop) => {
3384
- const elCanSelect = props.canSelect(el);
3424
+ const elCanSelect = stageOptions.canSelect(el);
3385
3425
  if (uiSelectMode.value && elCanSelect && event.type === "mousedown") {
3386
3426
  document.dispatchEvent(new CustomEvent("ui-select", { detail: el }));
3387
3427
  return stop();
3388
3428
  }
3389
3429
  return elCanSelect;
3390
3430
  },
3391
- moveableOptions: props.moveableOptions
3431
+ moveableOptions: stageOptions.moveableOptions,
3432
+ updateDragEl: stageOptions.updateDragEl
3392
3433
  });
3393
3434
  services?.editorService.set("stage", markRaw(stage));
3394
3435
  stage?.mount(stageContainer.value);
@@ -3515,19 +3556,6 @@ const _sfc_main$1 = defineComponent({
3515
3556
  PageBar,
3516
3557
  MagicStage
3517
3558
  },
3518
- props: {
3519
- runtimeUrl: String,
3520
- autoScrollIntoView: Boolean,
3521
- render: {
3522
- type: Function
3523
- },
3524
- moveableOptions: {
3525
- type: [Object, Function]
3526
- },
3527
- canSelect: {
3528
- type: Function
3529
- }
3530
- },
3531
3559
  setup() {
3532
3560
  const services = inject("services");
3533
3561
  const workspace = ref();
@@ -3638,13 +3666,8 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
3638
3666
  const _component_page_bar = resolveComponent("page-bar");
3639
3667
  return openBlock(), createElementBlock("div", _hoisted_1, [
3640
3668
  (openBlock(), createBlock(_component_magic_stage, {
3641
- key: _ctx.page?.id,
3642
- "runtime-url": _ctx.runtimeUrl,
3643
- "auto-scroll-into-view": _ctx.autoScrollIntoView,
3644
- render: _ctx.render,
3645
- "moveable-options": _ctx.moveableOptions,
3646
- "can-select": _ctx.canSelect
3647
- }, null, 8, ["runtime-url", "auto-scroll-into-view", "render", "moveable-options", "can-select"])),
3669
+ key: _ctx.page?.id
3670
+ })),
3648
3671
  renderSlot(_ctx.$slots, "workspace-content"),
3649
3672
  createVNode(_component_page_bar, null, {
3650
3673
  "page-bar-title": withCtx(({ page }) => [
@@ -3813,6 +3836,14 @@ const _sfc_main = defineComponent({
3813
3836
  sidebar: {
3814
3837
  type: Object
3815
3838
  },
3839
+ layerContentMenu: {
3840
+ type: Array,
3841
+ default: () => []
3842
+ },
3843
+ stageContentMenu: {
3844
+ type: Array,
3845
+ default: () => []
3846
+ },
3816
3847
  menu: {
3817
3848
  type: Object,
3818
3849
  default: () => ({ left: [], right: [] })
@@ -3835,13 +3866,17 @@ const _sfc_main = defineComponent({
3835
3866
  default: () => ({})
3836
3867
  },
3837
3868
  moveableOptions: {
3838
- type: [Object, Function]
3869
+ type: [Object, Function],
3870
+ default: () => (core) => ({
3871
+ container: core?.renderer?.contentWindow?.document.getElementById("app")
3872
+ })
3839
3873
  },
3840
3874
  defaultSelected: {
3841
3875
  type: [Number, String]
3842
3876
  },
3843
3877
  canSelect: {
3844
- type: Function
3878
+ type: Function,
3879
+ default: (el) => Boolean(el.id)
3845
3880
  },
3846
3881
  stageRect: {
3847
3882
  type: [String, Object]
@@ -3849,6 +3884,9 @@ const _sfc_main = defineComponent({
3849
3884
  codeOptions: {
3850
3885
  type: Object,
3851
3886
  default: () => ({})
3887
+ },
3888
+ updateDragEl: {
3889
+ type: Function
3852
3890
  }
3853
3891
  },
3854
3892
  emits: ["props-panel-mounted", "update:modelValue"],
@@ -3898,6 +3936,16 @@ const _sfc_main = defineComponent({
3898
3936
  uiService
3899
3937
  };
3900
3938
  provide("services", services);
3939
+ provide("layerContentMenu", props.layerContentMenu);
3940
+ provide("stageContentMenu", props.stageContentMenu);
3941
+ provide("stageOptions", reactive({
3942
+ runtimeUrl: props.runtimeUrl,
3943
+ autoScrollIntoView: props.autoScrollIntoView,
3944
+ render: props.render,
3945
+ moveableOptions: props.moveableOptions,
3946
+ canSelect: props.canSelect,
3947
+ updateDragEl: props.updateDragEl
3948
+ }));
3901
3949
  return services;
3902
3950
  }
3903
3951
  });
@@ -3920,13 +3968,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
3920
3968
  ]),
3921
3969
  workspace: withCtx(() => [
3922
3970
  renderSlot(_ctx.$slots, "workspace", {}, () => [
3923
- createVNode(_component_workspace, {
3924
- "runtime-url": _ctx.runtimeUrl,
3925
- "auto-scroll-into-view": _ctx.autoScrollIntoView,
3926
- render: _ctx.render,
3927
- "moveable-options": _ctx.moveableOptions,
3928
- "can-select": _ctx.canSelect
3929
- }, {
3971
+ createVNode(_component_workspace, null, {
3930
3972
  "workspace-content": withCtx(() => [
3931
3973
  renderSlot(_ctx.$slots, "workspace-content", { editorService: _ctx.editorService })
3932
3974
  ]),
@@ -3937,7 +3979,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
3937
3979
  renderSlot(_ctx.$slots, "page-bar-popover", { page })
3938
3980
  ]),
3939
3981
  _: 3
3940
- }, 8, ["runtime-url", "auto-scroll-into-view", "render", "moveable-options", "can-select"])
3982
+ })
3941
3983
  ])
3942
3984
  ]),
3943
3985
  propsPanel: withCtx(() => [
@@ -3956,7 +3998,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
3956
3998
  }
3957
3999
  var Editor = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
3958
4000
 
3959
- var index$1 = '';
4001
+ var index$1 = /* #__PURE__ */ (() => ".m-editor-nav-menu {\n display: flex;\n z-index: 5;\n -webkit-box-pack: justify;\n justify-content: space-between;\n -webkit-box-align: center;\n align-items: center;\n background-color: #ffffff;\n font-size: 19.2px;\n color: #070303;\n font-weight: 400;\n box-sizing: border-box;\n margin: 0px;\n flex: 0 0 35px;\n border-bottom: 1px solid #d8dee8;\n}\n.m-editor-nav-menu > div {\n display: flex;\n height: 100%;\n z-index: 1;\n align-items: center;\n}\n.m-editor-nav-menu .menu-center {\n justify-content: center;\n}\n.m-editor-nav-menu .menu-right {\n justify-content: flex-end;\n}\n.m-editor-nav-menu .menu-item {\n flex-direction: row;\n -webkit-box-align: center;\n align-items: center;\n vertical-align: middle;\n font-size: 14px;\n line-height: 1;\n height: 100%;\n color: rgba(255, 255, 255, 0.7);\n box-sizing: inherit;\n z-index: 1;\n display: flex !important;\n transition: all 0.3s ease 0s;\n border-bottom: 2px solid transparent;\n margin: 0;\n}\n.m-editor-nav-menu .menu-item .is-disabled {\n opacity: 0.5;\n}\n.m-editor-nav-menu .menu-item .is-text {\n padding: 5px;\n}\n.m-editor-nav-menu .menu-item .is-text,\n.m-editor-nav-menu .menu-item i {\n color: #070303;\n}\n.m-editor-nav-menu .menu-item .icon {\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n height: 100%;\n padding: 0px 8px;\n}\n.m-editor-nav-menu .menu-item .menu-item-text {\n color: #070303;\n}\n.m-editor {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n.m-editor-content {\n width: 100%;\n height: calc(100% - 35px);\n display: flex;\n justify-self: space-between;\n}\n.m-editor-framework-center {\n position: relative;\n transform: translateZ(0);\n flex: 1;\n}\n.m-editor-framework-left {\n background-color: #ffffff;\n}\n.m-editor-framework-center .el-scrollbar__view {\n height: 100%;\n min-height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.m-editor-empty-panel {\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n height: calc(100% - 32px);\n}\n.m-editor-empty-content {\n display: flex;\n justify-content: space-evenly;\n flex-direction: row;\n width: 100%;\n}\n.m-editor-empty-button {\n border: 3px solid rgba(0, 0, 0, 0.2);\n padding: 10px 40px;\n color: rgba(0, 0, 0, 0.6);\n cursor: pointer;\n}\n.m-editor-empty-button i {\n height: 180px;\n line-height: 180px;\n font-size: 100px;\n}\n.m-editor-empty-button p {\n text-align: center;\n font-size: 20px;\n margin-top: 5px;\n}\n.m-editor-empty-button:hover {\n border-color: #2882e0;\n color: #2882e0;\n}\n.m-editor-sidebar {\n height: 100%;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header {\n background: #2882e0;\n border: 0;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header.is-left {\n width: 40px;\n margin-right: 0;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__nav-wrap {\n margin: 0;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__nav {\n border: 0;\n border-radius: 0;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .tab-label {\n margin-left: 2px;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__item.is-left {\n line-height: 15px;\n border: 0;\n height: auto;\n padding: 8px;\n color: rgb(255, 255, 255);\n box-sizing: border-box;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__item.is-left.is-left.is-active {\n background: #ffffff;\n border: 0;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__item.is-left.is-left.is-active i {\n color: #353140;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__item.is-left.is-left.is-active .magic-editor-tab-panel-title {\n color: #353140;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .el-tabs__item.is-left.is-left:first-child {\n border-right: 0;\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header i {\n font-size: 25px;\n color: rgba(255, 255, 255, 0.6);\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header i:hover {\n color: rgb(255, 255, 255);\n}\n.m-editor-sidebar.el-tabs--left .el-tabs__header .magic-editor-tab-panel-title {\n font-size: 12px;\n white-space: normal;\n}\n.m-editor-sidebar .el-scrollbar {\n height: 100%;\n}\n.m-editor-sidebar .el-tree {\n min-height: 100%;\n}\n.m-editor-sidebar .fold-icon {\n position: absolute;\n bottom: 8px;\n left: 0px;\n width: 45px;\n padding-left: 8px;\n color: #fff;\n font-size: 32px;\n opacity: 0.8;\n cursor: pointer;\n}\n.m-editor-sidebar .fold-icon:hover {\n background: rgba(0, 0, 0, 0.2);\n}\n.m-editor-sidebar .el-tabs__content,\n.m-editor-sidebar .el-tab-pane {\n height: 100%;\n}\n.magic-editor-layer-panel {\n background: #ffffff;\n}\n.magic-editor-layer-panel .search-input {\n background: #ffffff;\n color: #bbbbbb;\n padding: 10px;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n}\n.magic-editor-layer-panel .search-input .el-input__suffix {\n padding: 10px 5px;\n}\n.magic-editor-layer-panel .node-content {\n flex: 1;\n display: flex;\n width: 100%;\n}\n.magic-editor-layer-panel .node-content > div {\n width: 8px;\n}\n.magic-editor-layer-panel .node-content > span {\n width: calc(100% - 68px);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.magic-editor-layer-panel .node-content > i {\n margin-right: 10px;\n font-size: 20px;\n}\n.magic-editor-layer-panel .node-content > i.lock {\n color: #bbb;\n}\n.magic-editor-layer-panel,\n.magic-editor-layer-panel .el-tree {\n background-color: #ffffff;\n color: #313a40;\n}\n.magic-editor-layer-panel .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {\n background-color: #2882e0;\n color: #fff;\n}\n.magic-editor-layer-panel .cus-tree-node {\n width: 100%;\n overflow: hidden;\n}\n.magic-editor-layer-panel .cus-tree-node-hover {\n background-color: #f3f5f9;\n width: 100%;\n}\n.magic-editor-layer-panel .el-tree-node:focus > .el-tree-node__content {\n background-color: #2882e0;\n color: #fff;\n}\n.ui-tree-tip {\n width: 100%;\n height: 25px;\n margin-left: 10px;\n background: #ffffff;\n font-style: italic;\n color: #555554;\n position: absolute;\n top: 40px;\n left: 0;\n z-index: 1;\n}\n.ui-component-panel {\n height: 100%;\n border-top: 0 !important;\n margin-top: 50px;\n background-color: #ffffff;\n}\n.ui-component-panel .search-input {\n background: #f8fbff;\n color: #bbbbbb;\n padding: 10px;\n position: absolute;\n top: 0;\n left: 0;\n box-sizing: border-box;\n z-index: 1;\n}\n.ui-component-panel .search-input .el-input__prefix {\n padding: 10px;\n}\n.ui-component-panel .search-input .el-input__suffix {\n padding: 10px 5px;\n}\n.ui-component-panel .el-collapse-item > div:first-of-type {\n border-bottom: 1px solid #d9dbdd;\n margin-bottom: 10px;\n}\n.ui-component-panel .el-collapse-item__header {\n background: #ffffff;\n color: #070303;\n height: 25px;\n line-height: 25px;\n padding-left: 10px;\n font-size: 12px;\n}\n.ui-component-panel .el-collapse-item__header i {\n margin-right: 5px;\n font-size: 14px;\n}\n.ui-component-panel .el-collapse-item__wrap {\n background: #ffffff;\n border-bottom: 0;\n}\n.ui-component-panel .el-collapse-item__wrap .el-collapse-item__content {\n padding: 10px;\n display: flex;\n flex-wrap: wrap;\n}\n.ui-component-panel .el-collapse-item__wrap .component-item {\n display: flex;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 5px 10px;\n box-sizing: border-box;\n color: #070303;\n flex-direction: column;\n width: 42px;\n cursor: pointer;\n}\n.ui-component-panel .el-collapse-item__wrap .component-item i {\n font-size: 20px;\n background: #fff;\n height: 40px;\n width: 40px;\n line-height: 40px;\n border-radius: 5px;\n color: #909090;\n border: 1px solid #d9dbdd;\n display: flex;\n justify-content: space-evenly;\n align-items: center;\n margin-bottom: 5px;\n}\n.ui-component-panel .el-collapse-item__wrap .component-item i:hover {\n background: #2882e0;\n color: #fff;\n border-color: #4e8be1;\n}\n.ui-component-panel .el-collapse-item__wrap .component-item span {\n font-size: 12px;\n text-align: center;\n}\n.ui-component-panel .el-collapse-item__wrap .component-item .el-tooltip {\n width: 50px;\n height: 30px;\n line-height: 15px;\n display: block;\n white-space: normal;\n margin: 0;\n}\n.m-editor-resizer {\n border-left: 1px solid transparent;\n border-right: 1px solid transparent;\n width: 8px;\n margin: 0 -5px;\n height: 100%;\n opacity: 0.9;\n background: padding-box #d8dee8;\n box-sizing: border-box;\n cursor: col-resize;\n z-index: 1;\n}\n.m-editor-resizer:hover {\n border-color: #d8dee8;\n}\n.m-editor-resizer .icon-container {\n visibility: hidden;\n opacity: 0;\n transition: opacity 0.4s;\n width: 20px;\n height: 120px;\n line-height: 120px;\n text-align: center;\n background: #d8dee8;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n cursor: pointer;\n}\n.m-editor-resizer .icon-container.position-left {\n transform: translate(calc(-100% - 4px), -50%);\n}\n.m-editor-resizer .icon-container.position-right {\n transform: translate(calc(100% + 4px), -50%);\n}\n.m-editor-resizer .icon {\n color: #fff;\n font-size: 18px;\n}\n.magic-editor-resizer:hover .icon-container {\n visibility: visible;\n opacity: 1;\n}\n.m-editor-workspace {\n height: 100%;\n width: 100%;\n user-select: none;\n}\n.m-editor-workspace:focus-visible {\n outline: 0;\n}\n.m-editor-page-bar {\n position: fixed;\n bottom: 0;\n left: 0;\n display: flex;\n width: 100%;\n height: 32px;\n line-height: 32px;\n color: #070303;\n background-color: #f3f3f3;\n border-top: 1px solid #d9dbdd;\n z-index: 2;\n overflow: hidden;\n}\n.m-editor-page-bar-items {\n display: flex;\n transition: transform 0.3s;\n}\n.m-editor-page-bar-item {\n padding: 0 10px;\n cursor: pointer;\n border-right: 1px solid #d9dbdd;\n display: flex;\n justify-items: center;\n align-items: center;\n background-color: #f3f3f3;\n}\n.m-editor-page-bar-item.active {\n background-color: #fff;\n cursor: text;\n}\n.m-editor-page-bar-item.active .m-editor-page-bar-menu-icon {\n cursor: pointer;\n}\n.m-editor-page-bar-item-icon {\n position: relative;\n z-index: 1;\n}\n.m-editor-page-bar-item-title {\n max-width: 150px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n.page-bar-popover.el-popper.el-popover {\n padding: 10px 0;\n}\n.page-bar-popover .menu-item {\n cursor: pointer;\n transition: all 0.2s ease 0s;\n padding: 5px 14px;\n}\n.page-bar-popover .menu-item .el-button--text,\n.page-bar-popover .menu-item i {\n color: #070303;\n}\n.page-bar-popover .menu-item:hover {\n background-color: #f3f5f9;\n}\n.m-editor-props-panel {\n padding: 0 10px;\n}\n.m-editor-props-panel.small .el-form-item__label {\n font-size: 12px;\n}\n.m-editor-props-panel.small .m-fieldset legend {\n font-size: 12px;\n}\n.m-editor-props-panel.small .el-tabs__item {\n font-size: 12px;\n}\n.m-editor-props-panel .el-input__wrapper {\n border-radius: 0;\n}\n.m-editor-props-panel-popper.small span,\n.m-editor-props-panel-popper.small a,\n.m-editor-props-panel-popper.small p {\n font-size: 12px;\n}\n.magic-editor-content-menu {\n position: fixed;\n font-size: 12px;\n background: #fff;\n box-shadow: 0 2px 8px 2px rgba(68, 73, 77, 0.16);\n z-index: 9999;\n transform-origin: 0% 0%;\n font-weight: 600;\n padding: 4px 0px;\n overflow: auto;\n max-height: 100%;\n}\n.magic-editor-content-menu .menu-item {\n color: #333;\n display: flex;\n -webkit-box-align: center;\n align-items: center;\n cursor: pointer;\n min-width: 140px;\n transition: all 0.2s ease 0s;\n padding: 5px 14px;\n border-left: 2px solid transparent;\n}\n.magic-editor-content-menu .menu-item .el-button {\n width: 100%;\n justify-content: flex-start;\n}\n.magic-editor-content-menu .menu-item .el-button--text,\n.magic-editor-content-menu .menu-item i {\n color: #070303;\n}\n.magic-editor-content-menu .menu-item.divider {\n padding: 0 14px;\n}\n.magic-editor-content-menu .menu-item.divider .el-divider {\n margin: 0;\n}\n.magic-editor-content-menu .menu-item:hover {\n background-color: #f3f5f9;\n}\n.m-editor-stage {\n position: relative;\n width: 100%;\n height: calc(100% - 32px);\n overflow: hidden;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.m-editor-stage-container {\n width: 100%;\n height: 100%;\n z-index: 0;\n position: relative;\n border: 1px solid #d9dbdd;\n transition: transform 0.3s;\n box-sizing: content-box;\n}\n.m-editor-stage-container::-webkit-scrollbar {\n width: 0 !important;\n}\n.magic-code-editor {\n width: 100%;\n}\n.magic-code-editor .margin {\n margin: 0;\n}")();
3960
4002
 
3961
4003
  const defaultInstallOpt = {};
3962
4004
  var index = {
@@ -3972,5 +4014,5 @@ var index = {
3972
4014
  }
3973
4015
  };
3974
4016
 
3975
- export { COPY_STORAGE_KEY, ComponentListPanel, DEFAULT_CONFIG, Fixed2Other, Keys, LayerOffset, LayerPanel, Layout, PropsPanel, CodeEditor as TMagicCodeEditor, Editor as TMagicEditor, ToolButton, change2Fixed, debug, index as default, editorService, error, eventsService, fillConfig, generateId, generatePageName, generatePageNameByApp, getConfig, getDefaultPropsValue, getNodeIndex, getPageList, getPageNameList, historyService, info, initPosition, isFixed, log, propsService, setConfig, setLayout, setNewItemId, toRelative, uiService, warn };
4017
+ export { COPY_STORAGE_KEY, ComponentListPanel, DEFAULT_CONFIG, Fixed2Other, Keys, LayerOffset, LayerPanel, Layout, PropsPanel, CodeEditor as TMagicCodeEditor, Editor as TMagicEditor, ToolButton, change2Fixed, debug, index as default, editorService, error, eventsService, fillConfig, generatePageName, generatePageNameByApp, getConfig, getDefaultPropsValue, getNodeIndex, getPageList, getPageNameList, historyService, info, initPosition, isFixed, log, propsService, setConfig, setLayout, toRelative, uiService, warn };
3976
4018
  //# sourceMappingURL=tmagic-editor.es.js.map