@tmagic/editor 1.8.0-manmanyu.9 → 1.8.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.
Files changed (279) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +22 -13
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +10 -5
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -6
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +21 -122
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +21 -5
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +62 -16
  7. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  8. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +3 -2
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +5 -4
  11. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
  13. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
  14. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +1 -1
  15. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/es/components/ViewForm.js +5 -0
  18. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +56 -0
  19. package/dist/es/editorProps.js +7 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +1 -1
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +30 -113
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
  25. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +7 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +4 -2
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +12 -4
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +9 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +2 -2
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +5 -3
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +9 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +10 -110
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +52 -363
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +3 -6
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +4 -35
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +3 -3
  41. package/dist/es/fields/StyleSetter/configs.js +663 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +1 -1
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +1 -1
  44. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +1 -1
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +1 -1
  46. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +1 -1
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +1 -1
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
  50. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +1 -1
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
  59. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
  60. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
  62. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
  64. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  67. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  68. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +29 -106
  69. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +8 -11
  70. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +30 -89
  71. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +29 -297
  72. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -82
  73. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +8 -24
  74. package/dist/es/fields/UISelect.js +0 -1
  75. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +1 -1
  76. package/dist/es/fields/configs/codeSelect.js +98 -0
  77. package/dist/es/fields/configs/displayConds.js +158 -0
  78. package/dist/es/fields/configs/eventSelect.js +225 -0
  79. package/dist/es/fields/configs/stickyAddButton.js +21 -0
  80. package/dist/es/fields/headless-validation.js +139 -0
  81. package/dist/es/headless.js +2 -0
  82. package/dist/es/hooks/use-code-block-edit.js +4 -2
  83. package/dist/es/hooks/use-compare-form.js +101 -0
  84. package/dist/es/hooks/use-form-context.js +29 -0
  85. package/dist/es/hooks/use-stage.js +1 -0
  86. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  87. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  88. package/dist/es/icons/DatasourceIcon.js +1 -1
  89. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/index.js +16 -8
  91. package/dist/es/initService.js +52 -16
  92. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  93. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +26 -10
  94. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +11 -8
  95. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  96. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  97. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +8 -5
  99. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +26 -10
  101. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +11 -13
  102. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +1 -1
  103. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/history-list/composables.js +1 -1
  105. package/dist/es/layouts/history-list/useHistoryRevert.js +38 -33
  106. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  107. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +1 -1
  108. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  109. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  111. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -20
  112. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +53 -35
  113. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  114. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  115. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +21 -36
  116. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  118. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  119. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +9 -4
  121. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  122. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  123. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  124. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  125. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  126. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  127. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
  128. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +6 -4
  129. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  130. package/dist/es/layouts/sidebar/layer/use-drag.js +11 -10
  131. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  132. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  133. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  134. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  135. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +55 -9
  136. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  137. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  138. package/dist/es/plugin.js +35 -23
  139. package/dist/es/services/codeBlock.js +8 -3
  140. package/dist/es/services/dataSource.js +3 -0
  141. package/dist/es/services/dep.js +162 -41
  142. package/dist/es/services/editor.js +344 -113
  143. package/dist/es/services/events.js +4 -4
  144. package/dist/es/services/history.js +17 -1
  145. package/dist/es/services/keybinding.js +3 -3
  146. package/dist/es/services/props.js +2 -1
  147. package/dist/es/services/storage.js +2 -2
  148. package/dist/es/services/ui.js +7 -2
  149. package/dist/es/style.css +277 -114
  150. package/dist/es/utils/code-block.js +14 -7
  151. package/dist/es/utils/config.js +4 -1
  152. package/dist/es/utils/const.js +2 -2
  153. package/dist/es/utils/content-menu.js +2 -2
  154. package/dist/es/utils/data-source/index.js +34 -12
  155. package/dist/es/utils/dep/collect-worker-client.js +154 -0
  156. package/dist/es/utils/dep/idle-task.js +70 -22
  157. package/dist/es/utils/dep/worker.js +1 -1
  158. package/dist/es/utils/editor.js +4 -2
  159. package/dist/es/utils/event.js +135 -0
  160. package/dist/es/utils/monaco-editor.js +22 -6
  161. package/dist/es/utils/operator.js +2 -2
  162. package/dist/es/utils/props.js +50 -106
  163. package/dist/es/utils/type-match-rules.js +356 -0
  164. package/dist/style.css +277 -114
  165. package/dist/themes/magic-admin.css +978 -175
  166. package/dist/tmagic-editor-headless.umd.cjs +10880 -0
  167. package/dist/tmagic-editor.umd.cjs +12695 -10896
  168. package/package.json +18 -13
  169. package/src/Editor.vue +23 -6
  170. package/src/components/CodeBlockEditor.vue +3 -0
  171. package/src/components/CodeParams.vue +10 -4
  172. package/src/components/CompareForm.vue +20 -190
  173. package/src/components/ContentMenu.vue +34 -6
  174. package/src/components/FloatingBox.vue +71 -7
  175. package/src/components/ScrollBar.vue +0 -67
  176. package/src/components/ViewForm.vue +54 -0
  177. package/src/editorProps.ts +23 -10
  178. package/src/fields/Code.vue +1 -1
  179. package/src/fields/CodeSelect.vue +20 -113
  180. package/src/fields/CodeSelectCol.vue +1 -1
  181. package/src/fields/CondOpSelect.vue +5 -26
  182. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +2 -2
  183. package/src/fields/DataSourceFieldSelect/Index.vue +4 -1
  184. package/src/fields/DataSourceFields.vue +5 -1
  185. package/src/fields/DataSourceInput.vue +10 -28
  186. package/src/fields/DataSourceMethodSelect.vue +1 -1
  187. package/src/fields/DataSourceMethods.vue +6 -2
  188. package/src/fields/DataSourceMocks.vue +3 -0
  189. package/src/fields/DataSourceSelect.vue +1 -1
  190. package/src/fields/DisplayConds.vue +17 -139
  191. package/src/fields/EventSelect.vue +29 -416
  192. package/src/fields/KeyValue.vue +1 -1
  193. package/src/fields/StyleSetter/Index.vue +2 -8
  194. package/src/fields/StyleSetter/components/Border.vue +4 -38
  195. package/src/fields/StyleSetter/components/Box.vue +1 -1
  196. package/src/fields/StyleSetter/components/Position.vue +1 -1
  197. package/src/fields/StyleSetter/configs.ts +690 -0
  198. package/src/fields/StyleSetter/pro/Background.vue +9 -64
  199. package/src/fields/StyleSetter/pro/Border.vue +5 -16
  200. package/src/fields/StyleSetter/pro/Font.vue +11 -71
  201. package/src/fields/StyleSetter/pro/Layout.vue +10 -230
  202. package/src/fields/StyleSetter/pro/Position.vue +11 -82
  203. package/src/fields/StyleSetter/pro/Transform.vue +6 -34
  204. package/src/fields/UISelect.vue +0 -12
  205. package/src/fields/configs/codeSelect.ts +127 -0
  206. package/src/fields/configs/displayConds.ts +184 -0
  207. package/src/fields/configs/eventSelect.ts +309 -0
  208. package/src/fields/configs/stickyAddButton.ts +32 -0
  209. package/src/fields/headless-validation.ts +177 -0
  210. package/src/headless.ts +33 -0
  211. package/src/hooks/index.ts +1 -0
  212. package/src/hooks/use-compare-form.ts +166 -0
  213. package/src/hooks/use-form-context.ts +56 -0
  214. package/src/hooks/use-stage.ts +1 -0
  215. package/src/index.ts +9 -0
  216. package/src/initService.ts +73 -18
  217. package/src/layouts/CodeEditor.vue +32 -6
  218. package/src/layouts/Framework.vue +7 -6
  219. package/src/layouts/history-list/BucketTab.vue +2 -2
  220. package/src/layouts/history-list/HistoryDiffDialog.vue +33 -15
  221. package/src/layouts/history-list/HistoryListPanel.vue +16 -18
  222. package/src/layouts/history-list/useHistoryRevert.ts +57 -41
  223. package/src/layouts/props-panel/FormPanel.vue +75 -20
  224. package/src/layouts/props-panel/PropsPanel.vue +81 -30
  225. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  226. package/src/layouts/sidebar/ComponentListPanel.vue +6 -2
  227. package/src/layouts/sidebar/Sidebar.vue +5 -3
  228. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  229. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  230. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
  231. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +3 -3
  232. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  233. package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
  234. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  235. package/src/layouts/sidebar/layer/LayerPanel.vue +5 -2
  236. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  237. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  238. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  239. package/src/layouts/workspace/viewer/Stage.vue +80 -10
  240. package/src/layouts/workspace/viewer/ViewerMenu.vue +7 -7
  241. package/src/plugin.ts +35 -25
  242. package/src/services/codeBlock.ts +4 -0
  243. package/src/services/dataSource.ts +3 -0
  244. package/src/services/dep.ts +292 -47
  245. package/src/services/editor.ts +383 -120
  246. package/src/services/events.ts +8 -7
  247. package/src/services/history.ts +22 -1
  248. package/src/services/keybinding.ts +3 -3
  249. package/src/services/ui.ts +26 -5
  250. package/src/theme/code-block.scss +0 -37
  251. package/src/theme/display-conds.scss +4 -0
  252. package/src/theme/event.scss +25 -33
  253. package/src/theme/floating-box.scss +9 -1
  254. package/src/theme/framework.scss +4 -1
  255. package/src/theme/layer-node-content.scss +14 -0
  256. package/src/theme/nav-menu.scss +5 -1
  257. package/src/theme/props-panel.scss +17 -3
  258. package/src/theme/scroll-bar.scss +64 -0
  259. package/src/theme/theme.scss +3 -0
  260. package/src/theme/themes/magic-admin/index.scss +109 -9
  261. package/src/theme/ui-select.scss +9 -0
  262. package/src/type.ts +216 -6
  263. package/src/utils/code-block.ts +1 -0
  264. package/src/utils/config.ts +9 -1
  265. package/src/utils/const.ts +3 -3
  266. package/src/utils/content-menu.ts +2 -2
  267. package/src/utils/data-source/index.ts +31 -12
  268. package/src/utils/dep/collect-worker-client.ts +215 -0
  269. package/src/utils/dep/idle-task.ts +104 -35
  270. package/src/utils/dep/worker.ts +113 -9
  271. package/src/utils/event.ts +237 -0
  272. package/src/utils/index.ts +2 -0
  273. package/src/utils/monaco-editor.ts +27 -0
  274. package/src/utils/operator.ts +2 -2
  275. package/src/utils/props.ts +61 -122
  276. package/src/utils/type-match-rules.ts +697 -0
  277. package/types/headless.d.ts +17 -0
  278. package/types/index.d.ts +1199 -724
  279. package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
@@ -132,6 +132,7 @@
132
132
  v-model:height="columnLeftHeight"
133
133
  :width="columnLeftWidth"
134
134
  :title="config.text"
135
+ :framework-width="frameworkWidth"
135
136
  :position="{
136
137
  left: floatBoxStates[config.$key].left,
137
138
  top: floatBoxStates[config.$key].top,
@@ -154,7 +155,7 @@
154
155
 
155
156
  <script setup lang="ts">
156
157
  import { computed, nextTick, ref, watch } from 'vue';
157
- import { Close, Coin, EditPen, Goods, List } from '@element-plus/icons-vue';
158
+ import { Box, Close, Coin, EditPen, Finished } from '@element-plus/icons-vue';
158
159
 
159
160
  import FloatingBox from '@editor/components/FloatingBox.vue';
160
161
  import MIcon from '@editor/components/Icon.vue';
@@ -221,6 +222,7 @@ const taskLength = computed(() => depService.get('taskLength'));
221
222
  const tipsBarVisible = ref(true);
222
223
 
223
224
  const columnLeftWidth = computed(() => uiService.get('columnWidth')[ColumnLayout.LEFT]);
225
+ const frameworkWidth = computed(() => uiService.get('frameworkRect')?.width || 0);
224
226
  const { height: editorContentHeight } = useEditorContentHeight();
225
227
  const columnLeftHeight = ref(0);
226
228
 
@@ -251,7 +253,7 @@ const getItemConfig = (data: SideItem): SideComponent => {
251
253
  [SideItemKey.COMPONENT_LIST]: {
252
254
  $key: SideItemKey.COMPONENT_LIST,
253
255
  type: 'component',
254
- icon: Goods,
256
+ icon: Box,
255
257
  text: '组件',
256
258
  component: ComponentListPanel,
257
259
  slots: {},
@@ -259,7 +261,7 @@ const getItemConfig = (data: SideItem): SideComponent => {
259
261
  layer: {
260
262
  $key: SideItemKey.LAYER,
261
263
  type: 'component',
262
- icon: List,
264
+ icon: Finished,
263
265
  text: '已选组件',
264
266
  props: {
265
267
  layerContentMenu: props.layerContentMenu,
@@ -82,7 +82,7 @@ const props = defineProps<{
82
82
  customContentMenu: CustomContentMenuFunction;
83
83
  }>();
84
84
 
85
- const eventBus = inject<EventBus>('eventBus');
85
+ const eventBus = inject<EventBus | null>('eventBus', null);
86
86
 
87
87
  const { codeBlockService } = useServices();
88
88
 
@@ -121,8 +121,11 @@ const {
121
121
  nodeContentMenuHandler,
122
122
  menuData: contentMenuData,
123
123
  contentMenuHideHandler,
124
+ getTarget,
124
125
  } = useContentMenu((id: string) => {
125
126
  codeBlockListRef.value?.deleteCode(id, { historySource: 'tree-contextmenu' });
126
127
  });
127
- const menuData = computed<(MenuButton | MenuComponent)[]>(() => props.customContentMenu(contentMenuData, 'code-block'));
128
+ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
129
+ props.customContentMenu(contentMenuData, 'code-block', getTarget),
130
+ );
128
131
  </script>
@@ -3,13 +3,21 @@ import { CopyDocument, Delete, Edit } from '@element-plus/icons-vue';
3
3
  import { cloneDeep } from 'lodash-es';
4
4
 
5
5
  import ContentMenu from '@editor/components/ContentMenu.vue';
6
- import type { EventBus, MenuButton, MenuComponent, TreeNodeData } from '@editor/type';
6
+ import type { ContentMenuTarget, EventBus, MenuButton, MenuComponent, TreeNodeData } from '@editor/type';
7
7
 
8
8
  export const useContentMenu = (deleteCode: (id: string) => void) => {
9
- const eventBus = inject<EventBus>('eventBus');
9
+ const eventBus = inject<EventBus | null>('eventBus', null);
10
10
  const menuRef = useTemplateRef<InstanceType<typeof ContentMenu>>('menu');
11
11
 
12
12
  let selectId = '';
13
+ let selectData: TreeNodeData | null = null;
14
+
15
+ const getTarget = (): ContentMenuTarget | null => {
16
+ if (!selectId) {
17
+ return null;
18
+ }
19
+ return { id: selectId, data: selectData ?? undefined };
20
+ };
13
21
 
14
22
  const menuData: (MenuButton | MenuComponent)[] = [
15
23
  {
@@ -65,19 +73,23 @@ export const useContentMenu = (deleteCode: (id: string) => void) => {
65
73
  menuRef.value?.show(event);
66
74
  if (data.id) {
67
75
  selectId = `${data.id}`;
76
+ selectData = data;
68
77
  } else {
69
78
  selectId = '';
79
+ selectData = null;
70
80
  }
71
81
  }
72
82
  };
73
83
 
74
84
  const contentMenuHideHandler = () => {
75
85
  selectId = '';
86
+ selectData = null;
76
87
  };
77
88
 
78
89
  return {
79
90
  menuData,
80
91
  nodeContentMenuHandler,
81
92
  contentMenuHideHandler,
93
+ getTarget,
82
94
  };
83
95
  };
@@ -1,9 +1,11 @@
1
1
  <template>
2
2
  <FloatingBox
3
+ :body-style="{ padding: '0 16px' }"
3
4
  v-model:visible="boxVisible"
4
5
  v-model:width="width"
5
6
  v-model:height="editorHeight"
6
7
  :title="title"
8
+ :framework-width="frameworkWidth"
7
9
  :position="boxPosition"
8
10
  >
9
11
  <template #body>
@@ -65,6 +67,7 @@ const { height: editorHeight } = useEditorContentHeight();
65
67
 
66
68
  const parentFloating = inject<Ref<HTMLDivElement | null>>('parentFloating', ref(null));
67
69
  const { boxPosition, calcBoxPosition } = useNextFloatBoxPosition(uiService, parentFloating);
70
+ const frameworkWidth = computed(() => uiService.get('frameworkRect')?.width || 0);
68
71
 
69
72
  /** 供「方法定义」tab 内的字段消费,用于打开数据源详情后自动打开指定方法 */
70
73
  provide(
@@ -75,7 +75,7 @@ const props = defineProps<{
75
75
  customContentMenu: CustomContentMenuFunction;
76
76
  }>();
77
77
 
78
- const eventBus = inject<EventBus>('eventBus');
78
+ const eventBus = inject<EventBus | null>('eventBus', null);
79
79
  const { dataSourceService } = useServices();
80
80
 
81
81
  const { editDialog, dataSourceValues, dialogTitle, editable, editHandler, submitDataSourceHandler } =
@@ -171,8 +171,8 @@ eventBus?.on('remove-data-source', (id: string) => {
171
171
  removeHandler(id);
172
172
  });
173
173
 
174
- const { nodeContentMenuHandler, menuData: contentMenuData, contentMenuHideHandler } = useContentMenu();
174
+ const { nodeContentMenuHandler, menuData: contentMenuData, contentMenuHideHandler, getTarget } = useContentMenu();
175
175
  const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
176
- props.customContentMenu(contentMenuData, 'data-source'),
176
+ props.customContentMenu(contentMenuData, 'data-source', getTarget),
177
177
  );
178
178
  </script>
@@ -3,13 +3,21 @@ import { CopyDocument, Delete, Edit } from '@element-plus/icons-vue';
3
3
  import { cloneDeep } from 'lodash-es';
4
4
 
5
5
  import ContentMenu from '@editor/components/ContentMenu.vue';
6
- import type { EventBus, MenuButton, MenuComponent, TreeNodeData } from '@editor/type';
6
+ import type { ContentMenuTarget, EventBus, MenuButton, MenuComponent, TreeNodeData } from '@editor/type';
7
7
 
8
8
  export const useContentMenu = () => {
9
- const eventBus = inject<EventBus>('eventBus');
9
+ const eventBus = inject<EventBus | null>('eventBus', null);
10
10
  const menuRef = useTemplateRef<InstanceType<typeof ContentMenu>>('menu');
11
11
 
12
12
  let selectId = '';
13
+ let selectData: TreeNodeData | null = null;
14
+
15
+ const getTarget = (): ContentMenuTarget | null => {
16
+ if (!selectId) {
17
+ return null;
18
+ }
19
+ return { id: selectId, data: selectData ?? undefined };
20
+ };
13
21
 
14
22
  const menuData: (MenuButton | MenuComponent)[] = [
15
23
  {
@@ -63,19 +71,23 @@ export const useContentMenu = () => {
63
71
  menuRef.value?.show(event);
64
72
  if (data.id) {
65
73
  selectId = `${data.id}`;
74
+ selectData = data;
66
75
  } else {
67
76
  selectId = '';
77
+ selectData = null;
68
78
  }
69
79
  }
70
80
  };
71
81
 
72
82
  const contentMenuHideHandler = () => {
73
83
  selectId = '';
84
+ selectData = null;
74
85
  };
75
86
 
76
87
  return {
77
88
  menuData,
78
89
  nodeContentMenuHandler,
79
90
  contentMenuHideHandler,
91
+ getTarget,
80
92
  };
81
93
  };
@@ -6,7 +6,7 @@
6
6
  import { computed, markRaw, useTemplateRef } from 'vue';
7
7
  import { Files, Plus } from '@element-plus/icons-vue';
8
8
 
9
- import { isPage, isPageFragment } from '@tmagic/utils';
9
+ import { isPageOrFragment } from '@tmagic/utils';
10
10
 
11
11
  import ContentMenu from '@editor/components/ContentMenu.vue';
12
12
  import { useServices } from '@editor/hooks/use-services';
@@ -101,7 +101,7 @@ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
101
101
  type: 'button',
102
102
  text: '全部折叠',
103
103
  icon: FolderMinusIcon,
104
- display: () => isPage(node.value) || isPageFragment(node.value),
104
+ display: () => isPageOrFragment(node.value),
105
105
  handler: () => {
106
106
  emit('collapse-all');
107
107
  },
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <span class="m-editor-layer-node-content" :class="{ 'is-invalid': hasError }">
3
+ <span class="m-editor-layer-node-label">{{ label }}</span>
4
+ <TMagicTooltip v-if="hasError" placement="top">
5
+ <template #content>
6
+ <span v-html="errorMessage"></span>
7
+ </template>
8
+ <MIcon class="m-editor-layer-node-error-icon" :icon="WarningFilled"></MIcon>
9
+ </TMagicTooltip>
10
+ </span>
11
+ </template>
12
+
13
+ <script setup lang="ts">
14
+ import { computed } from 'vue';
15
+ import { WarningFilled } from '@element-plus/icons-vue';
16
+
17
+ import { stripValidateSuggestion, TMagicTooltip } from '@tmagic/design';
18
+
19
+ import MIcon from '@editor/components/Icon.vue';
20
+ import { useServices } from '@editor/hooks/use-services';
21
+ import type { TreeNodeData } from '@editor/type';
22
+
23
+ defineOptions({
24
+ name: 'MEditorLayerNodeContent',
25
+ });
26
+
27
+ const props = defineProps<{
28
+ data: TreeNodeData;
29
+ }>();
30
+
31
+ const { editorService } = useServices();
32
+
33
+ const label = computed(() => `${props.data.name} (${props.data.id})`);
34
+
35
+ /** 读取集中存储的校验错误状态,建立响应式依赖 */
36
+ const invalidInfo = computed(() => editorService.get('invalidNodeIds').get(props.data.id));
37
+
38
+ const hasError = computed(() => Boolean(invalidInfo.value?.props || invalidInfo.value?.style));
39
+
40
+ /**
41
+ * 去掉单条校验文案中的「修改建议」部分。
42
+ *
43
+ * 错误文案可能是多条错误以 `<br>` 拼接的 HTML,每条本身形如 `主文案\n\n建议`。
44
+ * 组件树 tooltip 仅展示错误描述,不展示修改建议(建议仅在错误汇总面板展示),
45
+ * 故先按 `<br>` 拆分,每段用 `stripValidateSuggestion` 截断建议后再拼回。
46
+ */
47
+ const stripSuggestion = (text?: string): string =>
48
+ String(text ?? '')
49
+ .split(/<br\s*\/?>/i)
50
+ .map((segment) => stripValidateSuggestion(segment))
51
+ .join('<br>');
52
+
53
+ /** 合并属性表单与样式表单的错误文案(去掉建议,本身可能仍是含 <br> 的 HTML) */
54
+ const errorMessage = computed(() =>
55
+ [stripSuggestion(invalidInfo.value?.props), stripSuggestion(invalidInfo.value?.style)].filter(Boolean).join('<br>'),
56
+ );
57
+ </script>
@@ -33,7 +33,9 @@
33
33
  </template>
34
34
 
35
35
  <template #tree-node-label="{ data: nodeData }">
36
- <slot name="layer-node-label" :data="nodeData"></slot>
36
+ <slot name="layer-node-label" :data="nodeData">
37
+ <LayerNodeContent :data="nodeData"></LayerNodeContent>
38
+ </slot>
37
39
  </template>
38
40
  </Tree>
39
41
 
@@ -69,6 +71,7 @@ import type {
69
71
  } from '@editor/type';
70
72
 
71
73
  import LayerMenu from './LayerMenu.vue';
74
+ import LayerNodeContent from './LayerNodeContent.vue';
72
75
  import LayerNodeTool from './LayerNodeTool.vue';
73
76
  import { useClick } from './use-click';
74
77
  import { useDrag } from './use-drag';
@@ -117,7 +120,7 @@ const filterNodeMethod = (v: string, data: MNode): boolean => {
117
120
  name = 'container';
118
121
  }
119
122
 
120
- return `${data.id}${name}${data.type}`.includes(v);
123
+ return `${data.id}${name}${data.type || ''}`.toLocaleLowerCase().includes(v.toLocaleLowerCase());
121
124
  };
122
125
 
123
126
  const { filterTextChangeHandler } = useFilter(nodeData, nodeStatusMap, filterNodeMethod);
@@ -2,7 +2,7 @@ import { computed, type ComputedRef, nextTick, type Ref, type ShallowRef } from
2
2
  import { throttle } from 'lodash-es';
3
3
 
4
4
  import { Id, MNode } from '@tmagic/core';
5
- import { getElById, isPage, isPageFragment } from '@tmagic/utils';
5
+ import { getElById, isPageOrFragment } from '@tmagic/utils';
6
6
 
7
7
  import type { LayerNodeStatus, Services, TreeNodeData } from '@editor/type';
8
8
  import { UI_SELECT_MODE_EVENT_NAME } from '@editor/utils/const';
@@ -36,7 +36,7 @@ export const useClick = (
36
36
  };
37
37
 
38
38
  const multiSelect = async (data: MNode) => {
39
- if (isPage(data) || isPageFragment(data)) {
39
+ if (isPageOrFragment(data)) {
40
40
  return;
41
41
  }
42
42
 
@@ -50,7 +50,7 @@ export const useClick = (
50
50
  return;
51
51
  }
52
52
 
53
- if (isPage(node) || isPageFragment(node)) {
53
+ if (isPageOrFragment(node)) {
54
54
  return;
55
55
  }
56
56
 
@@ -1,7 +1,7 @@
1
1
  import { computed, onBeforeUnmount, ref, watch } from 'vue';
2
2
 
3
3
  import type { Id, MApp, MNode, MPage, MPageFragment } from '@tmagic/core';
4
- import { getNodePath, isPage, isPageFragment, traverseNode } from '@tmagic/utils';
4
+ import { getNodePath, isPageOrFragment, traverseNode } from '@tmagic/utils';
5
5
 
6
6
  import type { LayerNodeStatus, Services } from '@editor/type';
7
7
  import { updateStatus } from '@editor/utils/tree';
@@ -136,7 +136,7 @@ export const useNodeStatus = ({ editorService }: Services) => {
136
136
 
137
137
  const addHandler = (newNodes: MNode[]) => {
138
138
  newNodes.forEach((node) => {
139
- if (isPage(node) || isPageFragment(node)) return;
139
+ if (isPageOrFragment(node)) return;
140
140
 
141
141
  traverseNode(node, (node: MNode) => {
142
142
  nodeStatusMap.value?.set(node.id, {
@@ -8,6 +8,7 @@
8
8
  ref="box"
9
9
  v-model:visible="visible"
10
10
  title="当前位置下的组件"
11
+ :framework-width="frameworkWidth"
11
12
  :position="menuPosition"
12
13
  >
13
14
  <template #body>
@@ -36,7 +37,9 @@ import { useNodeStatus } from '@editor/layouts/sidebar/layer/use-node-status';
36
37
  import type { TreeNodeData } from '@editor/type';
37
38
 
38
39
  const services = useServices();
39
- const { editorService } = services;
40
+ const { editorService, uiService } = services;
41
+
42
+ const frameworkWidth = computed(() => uiService.get('frameworkRect')?.width || 0);
40
43
 
41
44
  const visible = ref(false);
42
45
  const buttonVisible = ref(false);
@@ -56,7 +56,14 @@ import { calcValueByFontsize, getIdFromEl } from '@tmagic/utils';
56
56
  import ScrollViewer from '@editor/components/ScrollViewer.vue';
57
57
  import { useServices } from '@editor/hooks';
58
58
  import { useStage } from '@editor/hooks/use-stage';
59
- import type { CustomContentMenuFunction, MenuButton, MenuComponent, StageOptions, StageSlots } from '@editor/type';
59
+ import type {
60
+ AddMNode,
61
+ CustomContentMenuFunction,
62
+ MenuButton,
63
+ MenuComponent,
64
+ StageOptions,
65
+ StageSlots,
66
+ } from '@editor/type';
60
67
  import { DragType, Layout } from '@editor/type';
61
68
  import { getEditorConfig } from '@editor/utils/config';
62
69
  import { KeyBindingContainerKey } from '@editor/utils/keybinding-config';
@@ -270,11 +277,56 @@ const resizeObserver = new globalThis.ResizeObserver((entries) => {
270
277
  }
271
278
  });
272
279
 
280
+ const parseDSL = getEditorConfig('parseDSL');
281
+
282
+ /**
283
+ * 本次拖拽是否由编辑器文档内部发起
284
+ *
285
+ * drop 的 text/json 里可能带函数(组件配置的事件、钩子等),还原只能交给 parseDSL,
286
+ * 而 parseDSL 的默认实现是 eval;HTML 拖放又允许其他源的页面在 DataTransfer 中投递
287
+ * 自定义 MIME 数据,跨源页面只要诱导用户拖拽一次,就能让 eval 执行任意脚本。
288
+ *
289
+ * 跨源页面既不会在本文档触发 dragstart,也无法往本文档创建的 DataTransfer 中写数据,
290
+ * 因此只有起源于本文档的拖拽才交给 parseDSL 还原。
291
+ * 同源拖拽源写入的 text/json 由业务保证可信。
292
+ */
293
+ let isInternalDrag = false;
294
+ let internalDragSession = 0;
295
+ let clearInternalDragTimer: ReturnType<typeof setTimeout> | undefined;
296
+
297
+ const documentDragStartHandler = () => {
298
+ internalDragSession += 1;
299
+ isInternalDrag = true;
300
+ if (clearInternalDragTimer !== undefined) {
301
+ globalThis.clearTimeout(clearInternalDragTimer);
302
+ clearInternalDragTimer = undefined;
303
+ }
304
+ };
305
+
306
+ const documentDragEndHandler = () => {
307
+ // WebKit 可能先 dragend 再 drop;推迟到下一个宏任务再清标志,
308
+ // 让同一次拖拽的 drop 仍能消费。session 防止误清掉下一次 dragstart。
309
+ const session = internalDragSession;
310
+ if (clearInternalDragTimer !== undefined) {
311
+ globalThis.clearTimeout(clearInternalDragTimer);
312
+ }
313
+ clearInternalDragTimer = globalThis.setTimeout(() => {
314
+ clearInternalDragTimer = undefined;
315
+ if (session === internalDragSession) {
316
+ isInternalDrag = false;
317
+ }
318
+ }, 0);
319
+ };
320
+
273
321
  onMounted(() => {
274
322
  if (stageWrapRef.value?.container) {
275
323
  resizeObserver.observe(stageWrapRef.value.container);
276
324
  keybindingService.registerEl(KeyBindingContainerKey.STAGE, stageWrapRef.value.container);
277
325
  }
326
+
327
+ // 用捕获阶段监听,确保拖拽源自身的 dragstart 无论是否阻止冒泡都能被记录
328
+ globalThis.document.addEventListener('dragstart', documentDragStartHandler, true);
329
+ globalThis.document.addEventListener('dragend', documentDragEndHandler, true);
278
330
  });
279
331
 
280
332
  onBeforeUnmount(() => {
@@ -283,9 +335,15 @@ onBeforeUnmount(() => {
283
335
  resizeObserver.disconnect();
284
336
  editorService.set('stage', null);
285
337
  keybindingService.unregisterEl('stage');
286
- });
287
338
 
288
- const parseDSL = getEditorConfig('parseDSL');
339
+ if (clearInternalDragTimer !== undefined) {
340
+ globalThis.clearTimeout(clearInternalDragTimer);
341
+ clearInternalDragTimer = undefined;
342
+ }
343
+
344
+ globalThis.document.removeEventListener('dragstart', documentDragStartHandler, true);
345
+ globalThis.document.removeEventListener('dragend', documentDragEndHandler, true);
346
+ });
289
347
 
290
348
  const contextmenuHandler = (e: MouseEvent) => {
291
349
  e.preventDefault();
@@ -299,15 +357,27 @@ const dragoverHandler = (e: DragEvent) => {
299
357
  };
300
358
 
301
359
  const dropHandler = async (e: DragEvent) => {
360
+ // 画布上的任意 drop 都消费本次内部拖拽标记(含空 text/json),避免残留到下一次 drop
361
+ const allowed = isInternalDrag;
362
+ isInternalDrag = false;
363
+
302
364
  if (!e.dataTransfer) return;
303
365
 
304
366
  const data = e.dataTransfer.getData('text/json');
305
367
 
306
- if (!data) return;
368
+ // 外部源投递的拖拽数据不可信,不能交给 parseDSL(默认实现为 eval)
369
+ if (!data || !allowed) return;
370
+
371
+ let config: { dragType?: string; data?: AddMNode } | undefined;
372
+ try {
373
+ config = parseDSL(`(${data})`);
374
+ } catch {
375
+ return;
376
+ }
307
377
 
308
- const config = parseDSL(`(${data})`);
378
+ if (!config || config.dragType !== DragType.COMPONENT_LIST || !config.data) return;
309
379
 
310
- if (!config || config.dragType !== DragType.COMPONENT_LIST) return;
380
+ const dragData = config.data;
311
381
 
312
382
  e.preventDefault();
313
383
 
@@ -349,7 +419,7 @@ const dropHandler = async (e: DragEvent) => {
349
419
 
350
420
  const containerRect = stageContainerEl.value.getBoundingClientRect();
351
421
  const { scrollTop, scrollLeft } = stage.mask!;
352
- const { style = {} } = config.data;
422
+ const { style = {} } = dragData;
353
423
 
354
424
  let top = 0;
355
425
  let left = 0;
@@ -371,16 +441,16 @@ const dropHandler = async (e: DragEvent) => {
371
441
  }
372
442
  }
373
443
 
374
- config.data.style = {
444
+ dragData.style = {
375
445
  ...style,
376
446
  position,
377
447
  top: calcValueByFontsize(doc, top / zoom.value),
378
448
  left: calcValueByFontsize(doc, left / zoom.value),
379
449
  };
380
450
 
381
- config.data.inputEvent = e;
451
+ dragData.inputEvent = e;
382
452
 
383
- editorService.add(config.data, parent, { historySource: 'component-panel' });
453
+ editorService.add(dragData, parent, { historySource: 'component-panel' });
384
454
  }
385
455
  };
386
456
  </script>
@@ -7,7 +7,7 @@ import { computed, markRaw, ref, useTemplateRef, watch } from 'vue';
7
7
  import { Bottom, Top } from '@element-plus/icons-vue';
8
8
 
9
9
  import { NodeType } from '@tmagic/core';
10
- import { isPage, isPageFragment } from '@tmagic/utils';
10
+ import { isPageOrFragment } from '@tmagic/utils';
11
11
 
12
12
  import ContentMenu from '@editor/components/ContentMenu.vue';
13
13
  import { useServices } from '@editor/hooks/use-services';
@@ -59,14 +59,14 @@ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
59
59
  direction: 'horizontal',
60
60
  display: () => {
61
61
  if (!node.value) return false;
62
- return !isPage(node.value) && !isPageFragment(node.value);
62
+ return !isPageOrFragment(node.value);
63
63
  },
64
64
  },
65
65
  {
66
66
  type: 'button',
67
67
  text: '上移一层',
68
68
  icon: markRaw(Top),
69
- display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
69
+ display: () => !isPageOrFragment(node.value) && !props.isMultiSelect,
70
70
  handler: () => {
71
71
  editorService.moveLayer(1, { historySource: 'stage-contextmenu' });
72
72
  },
@@ -75,7 +75,7 @@ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
75
75
  type: 'button',
76
76
  text: '下移一层',
77
77
  icon: markRaw(Bottom),
78
- display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
78
+ display: () => !isPageOrFragment(node.value) && !props.isMultiSelect,
79
79
  handler: () => {
80
80
  editorService.moveLayer(-1, { historySource: 'stage-contextmenu' });
81
81
  },
@@ -84,7 +84,7 @@ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
84
84
  type: 'button',
85
85
  text: '置顶',
86
86
  icon: markRaw(Top),
87
- display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
87
+ display: () => !isPageOrFragment(node.value) && !props.isMultiSelect,
88
88
  handler: () => {
89
89
  editorService.moveLayer(LayerOffset.TOP, { historySource: 'stage-contextmenu' });
90
90
  },
@@ -93,7 +93,7 @@ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
93
93
  type: 'button',
94
94
  text: '置底',
95
95
  icon: markRaw(Bottom),
96
- display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
96
+ display: () => !isPageOrFragment(node.value) && !props.isMultiSelect,
97
97
  handler: () => {
98
98
  editorService.moveLayer(LayerOffset.BOTTOM, { historySource: 'stage-contextmenu' });
99
99
  },
@@ -102,7 +102,7 @@ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
102
102
  {
103
103
  type: 'divider',
104
104
  direction: 'horizontal',
105
- display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
105
+ display: () => !isPageOrFragment(node.value) && !props.isMultiSelect,
106
106
  },
107
107
  useDeleteMenu('stage-contextmenu'),
108
108
  {