@tmagic/editor 1.8.0-beta.2 → 1.8.0-beta.21

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 (308) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +43 -9
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +8 -4
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +3 -2
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +22 -98
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +32 -9
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +68 -17
  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 +1 -1
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +1 -1
  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 +7 -7
  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 +58 -0
  19. package/dist/es/editorProps.js +9 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +16 -5
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +7 -7
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +81 -44
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +10 -3
  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 +13 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +11 -8
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +39 -12
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +11 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +11 -6
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +30 -14
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +11 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +5 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +38 -6
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +156 -155
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +5 -2
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +5 -2
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +8 -10
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +5 -2
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +28 -6
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
  41. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
  44. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
  46. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +7 -7
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +6 -3
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +29 -6
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +32 -6
  50. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +11 -3
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +11 -3
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +11 -3
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +11 -3
  59. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +17 -3
  60. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +19 -3
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +19 -3
  62. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +37 -3
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +33 -3
  64. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  67. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +56 -30
  68. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +7 -4
  69. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +35 -26
  70. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +76 -48
  71. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -23
  72. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +7 -4
  73. package/dist/es/fields/UISelect.js +0 -1
  74. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +5 -2
  75. package/dist/es/hooks/use-code-block-edit.js +6 -3
  76. package/dist/es/hooks/use-compare-form.js +119 -0
  77. package/dist/es/hooks/use-data-source-edit.js +5 -2
  78. package/dist/es/hooks/use-stage.js +9 -4
  79. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  80. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  81. package/dist/es/icons/DatasourceIcon.js +17 -0
  82. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  83. package/dist/es/index.js +24 -10
  84. package/dist/es/initService.js +19 -13
  85. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  86. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +24 -12
  87. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +25 -18
  88. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +4 -4
  89. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +25 -38
  91. package/dist/es/layouts/history-list/BucketTab.js +5 -0
  92. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
  93. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +177 -88
  94. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +139 -37
  95. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +164 -107
  96. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +44 -9
  97. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +49 -53
  98. package/dist/es/layouts/history-list/composables.js +138 -108
  99. package/dist/es/layouts/history-list/useHistoryList.js +56 -0
  100. package/dist/es/layouts/history-list/useHistoryRevert.js +317 -0
  101. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  102. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
  103. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  105. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -7
  107. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +33 -13
  108. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  109. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  110. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +26 -38
  111. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
  112. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  113. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  114. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  115. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +23 -6
  116. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +27 -5
  118. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  119. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  120. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  121. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  122. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
  123. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +3 -2
  124. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  125. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  126. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  128. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  129. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
  130. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  131. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +16 -16
  132. package/dist/es/plugin.js +5 -2
  133. package/dist/es/services/codeBlock.js +137 -56
  134. package/dist/es/services/dataSource.js +122 -52
  135. package/dist/es/services/dep.js +162 -41
  136. package/dist/es/services/editor.js +613 -179
  137. package/dist/es/services/events.js +2 -2
  138. package/dist/es/services/history.js +350 -386
  139. package/dist/es/services/keybinding.js +6 -6
  140. package/dist/es/services/props.js +3 -2
  141. package/dist/es/services/storage.js +2 -2
  142. package/dist/es/services/ui.js +10 -2
  143. package/dist/es/style.css +549 -113
  144. package/dist/es/utils/config.js +4 -1
  145. package/dist/es/utils/const.js +2 -2
  146. package/dist/es/utils/content-menu.js +19 -11
  147. package/dist/es/utils/data-source/index.js +34 -11
  148. package/dist/es/utils/dep/collect-worker-client.js +114 -0
  149. package/dist/es/utils/dep/idle-task.js +70 -22
  150. package/dist/es/utils/dep/worker.js +1 -1
  151. package/dist/es/utils/editor.js +103 -49
  152. package/dist/es/utils/event.js +135 -0
  153. package/dist/es/utils/history.js +220 -0
  154. package/dist/es/utils/indexed-db.js +86 -0
  155. package/dist/es/utils/monaco-editor.js +22 -6
  156. package/dist/es/utils/operator.js +2 -2
  157. package/dist/es/utils/props.js +114 -33
  158. package/dist/es/utils/type-match-rules.js +367 -0
  159. package/dist/es/utils/undo-redo.js +60 -1
  160. package/dist/style.css +549 -113
  161. package/dist/themes/magic-admin.css +3028 -0
  162. package/dist/tmagic-editor.umd.cjs +14403 -10121
  163. package/package.json +8 -8
  164. package/src/Editor.vue +43 -2
  165. package/src/components/CodeBlockEditor.vue +3 -0
  166. package/src/components/CompareForm.vue +18 -146
  167. package/src/components/ContentMenu.vue +44 -8
  168. package/src/components/FloatingBox.vue +84 -9
  169. package/src/components/ScrollBar.vue +0 -67
  170. package/src/components/ToolButton.vue +2 -2
  171. package/src/components/ViewForm.vue +55 -0
  172. package/src/editorProps.ts +30 -0
  173. package/src/fields/Code.vue +10 -2
  174. package/src/fields/CodeLink.vue +2 -5
  175. package/src/fields/CodeSelect.vue +54 -40
  176. package/src/fields/CodeSelectCol.vue +8 -1
  177. package/src/fields/CondOpSelect.vue +2 -24
  178. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +16 -2
  179. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  180. package/src/fields/DataSourceFields.vue +42 -8
  181. package/src/fields/DataSourceInput.vue +10 -28
  182. package/src/fields/DataSourceMethodSelect.vue +9 -4
  183. package/src/fields/DataSourceMethods.vue +42 -21
  184. package/src/fields/DataSourceMocks.vue +3 -0
  185. package/src/fields/DisplayConds.vue +18 -1
  186. package/src/fields/EventSelect.vue +152 -166
  187. package/src/fields/StyleSetter/Index.vue +3 -12
  188. package/src/fields/StyleSetter/components/Border.vue +15 -6
  189. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  190. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  191. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  192. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  193. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  194. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  195. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  196. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  197. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  198. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  199. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  200. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  201. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  202. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  203. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  204. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  205. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  206. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  207. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  208. package/src/fields/StyleSetter/pro/Background.vue +99 -55
  209. package/src/fields/StyleSetter/pro/Border.vue +9 -11
  210. package/src/fields/StyleSetter/pro/Font.vue +66 -64
  211. package/src/fields/StyleSetter/pro/Layout.vue +211 -139
  212. package/src/fields/StyleSetter/pro/Position.vue +69 -67
  213. package/src/fields/StyleSetter/pro/Transform.vue +23 -25
  214. package/src/fields/UISelect.vue +0 -12
  215. package/src/hooks/index.ts +1 -0
  216. package/src/hooks/use-code-block-edit.ts +4 -3
  217. package/src/hooks/use-compare-form.ts +187 -0
  218. package/src/hooks/use-data-source-edit.ts +2 -2
  219. package/src/hooks/use-stage.ts +5 -3
  220. package/src/icons/DatasourceIcon.vue +7 -0
  221. package/src/index.ts +12 -0
  222. package/src/initService.ts +26 -16
  223. package/src/layouts/CodeEditor.vue +34 -11
  224. package/src/layouts/Framework.vue +15 -8
  225. package/src/layouts/NavMenu.vue +3 -3
  226. package/src/layouts/history-list/Bucket.vue +33 -41
  227. package/src/layouts/history-list/BucketTab.vue +72 -0
  228. package/src/layouts/history-list/GroupRow.vue +190 -93
  229. package/src/layouts/history-list/HistoryDiffDialog.vue +169 -90
  230. package/src/layouts/history-list/HistoryListPanel.vue +191 -95
  231. package/src/layouts/history-list/InitialRow.vue +38 -8
  232. package/src/layouts/history-list/PageTab.vue +67 -43
  233. package/src/layouts/history-list/composables.ts +239 -125
  234. package/src/layouts/history-list/useHistoryList.ts +60 -0
  235. package/src/layouts/history-list/useHistoryRevert.ts +425 -0
  236. package/src/layouts/page-bar/PageBar.vue +4 -2
  237. package/src/layouts/props-panel/FormPanel.vue +72 -6
  238. package/src/layouts/props-panel/PropsPanel.vue +62 -18
  239. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  240. package/src/layouts/sidebar/ComponentListPanel.vue +10 -6
  241. package/src/layouts/sidebar/Sidebar.vue +13 -6
  242. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  243. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  244. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  245. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +34 -2
  246. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +29 -4
  247. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  248. package/src/layouts/sidebar/layer/LayerMenu.vue +21 -13
  249. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  250. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  251. package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
  252. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  253. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  254. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  255. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  256. package/src/layouts/workspace/viewer/ViewerMenu.vue +15 -15
  257. package/src/plugin.ts +6 -3
  258. package/src/services/codeBlock.ts +152 -47
  259. package/src/services/dataSource.ts +120 -41
  260. package/src/services/dep.ts +292 -47
  261. package/src/services/editor.ts +820 -224
  262. package/src/services/events.ts +3 -3
  263. package/src/services/history.ts +449 -412
  264. package/src/services/keybinding.ts +6 -6
  265. package/src/services/ui.ts +33 -5
  266. package/src/theme/code-block.scss +37 -0
  267. package/src/theme/common/var.scss +1 -1
  268. package/src/theme/component-list-panel.scss +2 -2
  269. package/src/theme/data-source-field.scss +4 -0
  270. package/src/theme/display-conds.scss +11 -0
  271. package/src/theme/event.scss +70 -1
  272. package/src/theme/floating-box.scss +9 -1
  273. package/src/theme/framework.scss +4 -1
  274. package/src/theme/history-list-panel.scss +157 -23
  275. package/src/theme/layer-node-content.scss +14 -0
  276. package/src/theme/nav-menu.scss +5 -1
  277. package/src/theme/page-bar.scss +0 -4
  278. package/src/theme/props-panel.scss +5 -4
  279. package/src/theme/scroll-bar.scss +64 -0
  280. package/src/theme/style-setter/border.scss +17 -5
  281. package/src/theme/theme.scss +4 -0
  282. package/src/theme/themes/magic-admin/index.scss +214 -0
  283. package/src/theme/ui-select.scss +9 -0
  284. package/src/type.ts +668 -124
  285. package/src/utils/config.ts +9 -1
  286. package/src/utils/const.ts +3 -2
  287. package/src/utils/content-menu.ts +20 -11
  288. package/src/utils/data-source/index.ts +32 -12
  289. package/src/utils/dep/collect-worker-client.ts +149 -0
  290. package/src/utils/dep/idle-task.ts +104 -35
  291. package/src/utils/dep/worker.ts +113 -9
  292. package/src/utils/editor.ts +166 -60
  293. package/src/utils/event.ts +237 -0
  294. package/src/utils/history.ts +286 -0
  295. package/src/utils/index.ts +4 -0
  296. package/src/utils/indexed-db.ts +122 -0
  297. package/src/utils/monaco-editor.ts +27 -0
  298. package/src/utils/operator.ts +2 -2
  299. package/src/utils/props.ts +114 -11
  300. package/src/utils/type-match-rules.ts +684 -0
  301. package/src/utils/undo-redo.ts +88 -0
  302. package/types/index.d.ts +1990 -517
  303. package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
  304. package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +0 -62
  305. package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
  306. package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
  307. package/src/layouts/history-list/CodeBlockTab.vue +0 -61
  308. package/src/layouts/history-list/DataSourceTab.vue +0 -61
@@ -3,28 +3,31 @@ import history_default from "./services/history.js";
3
3
  import storage_default from "./services/storage.js";
4
4
  import editor_default from "./services/editor.js";
5
5
  import ui_default from "./services/ui.js";
6
+ import codeBlock_default from "./services/codeBlock.js";
7
+ import dataSource_default from "./services/dataSource.js";
8
+ import events_default from "./services/events.js";
6
9
  import Framework_default from "./layouts/Framework.js";
7
10
  import NavMenu_default from "./layouts/NavMenu.js";
11
+ import { ENABLE_PROPS_FORM_VALIDATE, defaultEditorProps } from "./editorProps.js";
8
12
  import PropsPanel_default from "./layouts/props-panel/PropsPanel.js";
9
13
  import keybinding_config_default from "./utils/keybinding-config.js";
10
14
  import Sidebar_default from "./layouts/sidebar/Sidebar.js";
11
15
  import Workspace_default from "./layouts/workspace/Workspace.js";
12
- import codeBlock_default from "./services/codeBlock.js";
13
16
  import componentList_default from "./services/componentList.js";
14
- import dataSource_default from "./services/dataSource.js";
15
17
  import dep_default from "./services/dep.js";
16
- import events_default from "./services/events.js";
17
18
  import keybinding_default from "./services/keybinding.js";
18
19
  import stageOverlay_default from "./services/stageOverlay.js";
19
- import { defaultEditorProps } from "./editorProps.js";
20
20
  import { initServiceEvents, initServiceState } from "./initService.js";
21
- import { createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, renderSlot, unref, withCtx } from "vue";
21
+ import { M_THEME_KEY } from "@tmagic/design";
22
+ import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, ref, renderSlot, unref, withCtx } from "vue";
22
23
  import { EventEmitter } from "events";
23
24
  //#region packages/editor/src/Editor.vue?vue&type=script&setup=true&lang.ts
24
- var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
25
+ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
25
26
  name: "MEditor",
26
27
  __name: "Editor",
27
- props: /* @__PURE__ */ mergeDefaults({
28
+ props: /*@__PURE__*/ mergeDefaults({
29
+ isLargeStageContainer: { type: Boolean },
30
+ theme: {},
28
31
  modelValue: {},
29
32
  componentGroupList: {},
30
33
  datasourceList: {},
@@ -47,6 +50,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
47
50
  containerHighlightClassName: {},
48
51
  containerHighlightDuration: {},
49
52
  containerHighlightType: {},
53
+ containerHighlightAddOnly: { type: Boolean },
50
54
  stageRect: {},
51
55
  codeOptions: {},
52
56
  disabledDragStart: { type: Boolean },
@@ -54,7 +58,9 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
54
58
  disabledMultiSelect: { type: Boolean },
55
59
  alwaysMultiSelect: { type: Boolean },
56
60
  disabledPageFragment: { type: Boolean },
61
+ disabledFlashTip: { type: Boolean },
57
62
  disabledStageOverlay: { type: Boolean },
63
+ enablePropsFormValidate: { type: Boolean },
58
64
  disabledShowSrc: { type: Boolean },
59
65
  disabledDataSource: { type: Boolean },
60
66
  disabledCodeBlock: { type: Boolean },
@@ -70,6 +76,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
70
76
  beforeDblclick: { type: Function },
71
77
  beforeLayerNodeDblclick: { type: Function },
72
78
  extendFormState: { type: Function },
79
+ historyListExtraTabs: {},
73
80
  pageBarSortOptions: {},
74
81
  pageFilterFunction: { type: Function }
75
82
  }, defaultEditorProps),
@@ -114,28 +121,53 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
114
121
  containerHighlightClassName: props.containerHighlightClassName,
115
122
  containerHighlightDuration: props.containerHighlightDuration,
116
123
  containerHighlightType: props.containerHighlightType,
124
+ containerHighlightAddOnly: props.containerHighlightAddOnly,
117
125
  disabledDragStart: props.disabledDragStart,
118
126
  renderType: props.renderType,
119
127
  guidesOptions: props.guidesOptions,
120
128
  disabledMultiSelect: props.disabledMultiSelect,
121
129
  alwaysMultiSelect: props.alwaysMultiSelect,
130
+ disabledFlashTip: props.disabledFlashTip,
122
131
  beforeDblclick: props.beforeDblclick
123
132
  };
124
133
  stageOverlay_default.set("stageOptions", stageOptions);
134
+ const propsPanelRef = ref(null);
125
135
  provide("services", services);
126
136
  provide("codeOptions", props.codeOptions);
127
137
  provide("stageOptions", stageOptions);
138
+ /** 是否启用「属性配置表单校验」联动能力,供 PropsPanel / FormPanel 判断校验失败时是否仍更新节点并记录错误 */
139
+ provide(ENABLE_PROPS_FORM_VALIDATE, props.enablePropsFormValidate ?? false);
128
140
  /**
129
141
  * 把顶层 `extendFormState` 提供给非 PropsPanel 链路上的组件使用(例如历史差异对话框 HistoryDiffDialog
130
142
  * 内部的 CompareForm)。这样所有依赖业务上下文的表单 filterFunction 都能拿到一致的扩展状态,
131
143
  * 与 PropsPanel 通过 `:extend-state` 显式传入的方式保持等价。
132
144
  */
133
145
  provide("extendFormState", props.extendFormState);
146
+ provide("isLargeStageContainer", computed(() => props.isLargeStageContainer));
147
+ /**
148
+ * 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
149
+ * 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
150
+ */
151
+ provide("getPropsPanelFormState", () => propsPanelRef.value?.configForm?.formState);
152
+ /**
153
+ * 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
154
+ * 以 markRaw component 形式渲染,无法直接通过 props 透传)。业务方可借此在历史记录
155
+ * 面板内追加自定义模块的历史 tab。
156
+ */
157
+ provide("historyListExtraTabs", props.historyListExtraTabs);
134
158
  provide("eventBus", new EventEmitter());
159
+ /**
160
+ * 把当前主题以响应式 ref 形式 provide 给后代,供包含 `Teleport` 的组件
161
+ * (如 `TMagicPopover` / `FloatingBox` / `ContentMenu`)在传送目标上挂 `m-theme--<theme>`
162
+ * 类,让主题级 CSS 变量在 portal 节点上也能命中。详见 `@tmagic/design/theme.ts`。
163
+ */
164
+ provide(M_THEME_KEY, computed(() => props.theme ?? ""));
135
165
  const propsPanelMountedHandler = (e) => {
166
+ propsPanelRef.value = e;
136
167
  emit("props-panel-mounted", e);
137
168
  };
138
169
  const propsPanelUnmountedHandler = () => {
170
+ propsPanelRef.value = null;
139
171
  emit("props-panel-unmounted");
140
172
  };
141
173
  const propsPanelSubmitErrorHandler = (e) => {
@@ -153,7 +185,8 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
153
185
  "disabled-page-fragment": __props.disabledPageFragment,
154
186
  "page-bar-sort-options": __props.pageBarSortOptions,
155
187
  "page-filter-function": __props.pageFilterFunction,
156
- "hide-sidebar": __props.hideSidebar
188
+ "hide-sidebar": __props.hideSidebar,
189
+ theme: __props.theme
157
190
  }, {
158
191
  header: withCtx(() => [renderSlot(_ctx.$slots, "header")]),
159
192
  nav: withCtx(() => [renderSlot(_ctx.$slots, "nav", { editorService: unref(editor_default) }, () => [createVNode(NavMenu_default, { data: __props.menu }, null, 8, ["data"])])]),
@@ -234,7 +267,8 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
234
267
  "disabled-page-fragment",
235
268
  "page-bar-sort-options",
236
269
  "page-filter-function",
237
- "hide-sidebar"
270
+ "hide-sidebar",
271
+ "theme"
238
272
  ]);
239
273
  };
240
274
  }
@@ -1,9 +1,9 @@
1
1
  import { getEditorConfig } from "../utils/config.js";
2
+ import { getCodeBlockFormConfig } from "../utils/code-block.js";
2
3
  import { useServices } from "../hooks/use-services.js";
3
4
  import { useWindowRect } from "../hooks/use-window-rect.js";
4
5
  import { useEditorContentHeight } from "../hooks/use-editor-content-height.js";
5
6
  import { useNextFloatBoxPosition } from "../hooks/use-next-float-box-position.js";
6
- import { getCodeBlockFormConfig } from "../utils/code-block.js";
7
7
  import CodeEditor_default from "../layouts/CodeEditor.js";
8
8
  import FloatingBox_default from "./FloatingBox.js";
9
9
  import { MFormBox } from "@tmagic/form";
@@ -17,10 +17,10 @@ var _hoisted_1 = { style: {
17
17
  var _hoisted_2 = { style: { "flex": "1" } };
18
18
  var _hoisted_3 = { style: { "flex": "1" } };
19
19
  var _hoisted_4 = { class: "dialog-footer" };
20
- var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
20
+ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
21
21
  name: "MEditorCodeBlockEditor",
22
22
  __name: "CodeBlockEditor",
23
- props: /* @__PURE__ */ mergeModels({
23
+ props: /*@__PURE__*/ mergeModels({
24
24
  content: {},
25
25
  disabled: { type: Boolean },
26
26
  isDataSource: { type: Boolean },
@@ -34,7 +34,7 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
34
34
  },
35
35
  "visibleModifiers": {}
36
36
  }),
37
- emits: /* @__PURE__ */ mergeModels([
37
+ emits: /*@__PURE__*/ mergeModels([
38
38
  "submit",
39
39
  "close",
40
40
  "open"
@@ -120,6 +120,7 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
120
120
  changedValue.value = void 0;
121
121
  };
122
122
  const { boxPosition, calcBoxPosition } = useNextFloatBoxPosition(uiService, inject("parentFloating", ref(null)));
123
+ const frameworkWidth = computed(() => uiService.get("frameworkRect")?.width || 0);
123
124
  watch(boxVisible, (visible) => {
124
125
  nextTick(() => {
125
126
  if (!visible) emit("close");
@@ -145,7 +146,9 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
145
146
  "onUpdate:width": _cache[2] || (_cache[2] = ($event) => width.value = $event),
146
147
  height: unref(codeBlockEditorHeight),
147
148
  "onUpdate:height": _cache[3] || (_cache[3] = ($event) => isRef(codeBlockEditorHeight) ? codeBlockEditorHeight.value = $event : null),
149
+ "body-style": { padding: "0 16px" },
148
150
  title: __props.content.name ? `${__props.disabled ? "查看" : "编辑"}${__props.content.name}` : "新增代码",
151
+ "framework-width": frameworkWidth.value,
149
152
  position: unref(boxPosition),
150
153
  "before-close": beforeClose
151
154
  }, {
@@ -187,6 +190,7 @@ var CodeBlockEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
187
190
  "width",
188
191
  "height",
189
192
  "title",
193
+ "framework-width",
190
194
  "position"
191
195
  ]),
192
196
  (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(unref(TMagicDialog), {
@@ -2,7 +2,7 @@ import { error } from "../utils/logger.js";
2
2
  import { MForm } from "@tmagic/form";
3
3
  import { computed, createBlock, defineComponent, openBlock, unref, useTemplateRef } from "vue";
4
4
  //#region packages/editor/src/components/CodeParams.vue?vue&type=script&setup=true&lang.ts
5
- var CodeParams_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
5
+ var CodeParams_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
6
  name: "MEditorCodeParams",
7
7
  __name: "CodeParams",
8
8
  props: {
@@ -48,7 +48,8 @@ var CodeParams_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
48
48
  */
49
49
  const onParamsChangeHandler = async (v, eventData) => {
50
50
  try {
51
- emit("change", await formRef.value?.submitForm(true), eventData);
51
+ const value = await formRef.value?.submitForm(true);
52
+ emit("change", value, eventData);
52
53
  } catch (e) {
53
54
  error(e);
54
55
  }
@@ -1,67 +1,35 @@
1
- import { useServices } from "../hooks/use-services.js";
2
- import { getCodeBlockFormConfig } from "../utils/code-block.js";
1
+ import { useCompareForm } from "../hooks/use-compare-form.js";
3
2
  import { MForm } from "@tmagic/form";
4
3
  import { HookType } from "@tmagic/core";
5
- import { computed, createBlock, createCommentVNode, createElementBlock, defineComponent, inject, normalizeStyle, openBlock, ref, unref, useTemplateRef, watch, watchEffect } from "vue";
4
+ import { computed, createBlock, createCommentVNode, createElementBlock, defineComponent, normalizeStyle, openBlock, unref } from "vue";
6
5
  import { isEqual } from "lodash-es";
7
6
  //#region packages/editor/src/components/CompareForm.vue?vue&type=script&setup=true&lang.ts
8
- var CompareForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
7
+ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
8
  name: "MEditorCompareForm",
10
9
  __name: "CompareForm",
11
10
  props: {
12
11
  value: {},
13
- lastValue: {},
14
12
  type: {},
15
13
  category: { default: "node" },
16
14
  dataSourceType: {},
17
15
  labelWidth: { default: "120px" },
18
16
  height: {},
19
- extendState: {}
17
+ extendState: {},
18
+ baseFormState: {},
19
+ size: {},
20
+ loadConfig: {},
21
+ services: {},
22
+ lastValue: {},
23
+ selfDiffFieldTypes: {}
20
24
  },
21
25
  setup(__props, { expose: __expose }) {
22
- /**
23
- * 对比类型:
24
- * - node: 节点组件,按 `type` 从 propsService 获取属性表单配置
25
- * - data-source: 数据源,按 `type`(base/http/...) 从 dataSourceService 获取数据源表单配置
26
- * - code-block: 数据源代码块,使用内置的代码块表单配置
27
- */
28
26
  const props = __props;
29
- const { propsService, dataSourceService, codeBlockService, editorService } = useServices();
30
- const services = useServices();
31
- const config = ref([]);
32
- /** vs-code 编辑器的 monaco 配置项,沿用 Editor 顶层 provide('codeOptions', ...) 的注入。 */
33
- const codeOptions = inject("codeOptions", {});
34
- /** 将代码块的 content 字段统一成字符串,便于在表单/对比中展示 */
35
- const normalizeCodeBlockValue = (v) => {
36
- if (!v) return {};
37
- const next = { ...v };
38
- if (next.content && typeof next.content !== "string") try {
39
- next.content = next.content.toString();
40
- } catch {
41
- next.content = "";
42
- }
43
- return next;
44
- };
45
- const currentValues = computed(() => {
46
- if (props.category === "code-block") return normalizeCodeBlockValue(props.value);
47
- return props.value || {};
48
- });
27
+ const { config, currentValues, wrapperStyle, mergedExtendState, loadConfig, formRef, normalizeCodeBlockValue } = useCompareForm(props);
49
28
  const lastValuesProcessed = computed(() => {
50
29
  if (props.category === "code-block") return normalizeCodeBlockValue(props.lastValue);
51
30
  return props.lastValue || {};
52
31
  });
53
32
  /**
54
- * 外层包裹层的样式:当传入 `height` 时启用固定高度 + 内部滚动,
55
- * 这样滚动条会出现在 CompareForm 内部,避免父容器(如 Dialog)自身也产生滚动。
56
- */
57
- const wrapperStyle = computed(() => {
58
- if (!props.height) return void 0;
59
- return {
60
- height: props.height,
61
- overflow: "auto"
62
- };
63
- });
64
- /**
65
33
  * `code-select` 字段在历史数据中存在两种"语义为空"的形态:
66
34
  * - 字符串 `''`(旧数据 / 用户从未配置过钩子);
67
35
  * - `{ hookType: HookType.CODE, hookData: [] }`(CodeSelect.vue 在挂载时
@@ -84,54 +52,6 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
84
52
  }
85
53
  return !isEqual(curValue, lastValue);
86
54
  };
87
- const loadConfig = async () => {
88
- switch (props.category) {
89
- case "node":
90
- if (!props.type) {
91
- config.value = [];
92
- return;
93
- }
94
- config.value = await propsService.getPropsConfig(props.type);
95
- break;
96
- case "data-source":
97
- config.value = dataSourceService.getFormConfig(props.type || "base");
98
- break;
99
- case "code-block":
100
- config.value = getCodeBlockFormConfig({
101
- paramColConfig: codeBlockService.getParamsColConfig(),
102
- isDataSource: () => Boolean(props.dataSourceType),
103
- dataSourceType: () => props.dataSourceType,
104
- codeOptions,
105
- editable: false
106
- });
107
- break;
108
- default: config.value = [];
109
- }
110
- };
111
- watch([
112
- () => props.category,
113
- () => props.type,
114
- () => props.dataSourceType
115
- ], () => {
116
- loadConfig();
117
- }, { immediate: true });
118
- const formRef = useTemplateRef("form");
119
- /**
120
- * 把 services / stage 注入 MForm 的 formState,避免 propsService 注入的表单配置中
121
- * 形如 `display: ({ services }) => services.uiService.get(...)` 的 filterFunction
122
- * 在执行时拿不到 `formState.services` 而报错。
123
- *
124
- * 与 props-panel/FormPanel.vue 中的注入方式保持一致:
125
- * - services:整个 useServices() 返回的服务集合;
126
- * - stage:当前 editorService.get('stage') 的最新值。
127
- */
128
- const stage = computed(() => editorService.get("stage"));
129
- watchEffect(() => {
130
- if (formRef.value) {
131
- formRef.value.formState.stage = stage.value;
132
- formRef.value.formState.services = services;
133
- }
134
- });
135
55
  __expose({
136
56
  form: formRef,
137
57
  config,
@@ -140,25 +60,29 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
140
60
  return (_ctx, _cache) => {
141
61
  return openBlock(), createElementBlock("div", {
142
62
  class: "m-editor-compare-form-wrapper",
143
- style: normalizeStyle(wrapperStyle.value)
144
- }, [config.value.length ? (openBlock(), createBlock(unref(MForm), {
63
+ style: normalizeStyle(unref(wrapperStyle))
64
+ }, [unref(config).length ? (openBlock(), createBlock(unref(MForm), {
145
65
  key: 0,
146
66
  ref: "form",
147
67
  class: "m-editor-compare-form",
148
- config: config.value,
149
- "init-values": currentValues.value,
68
+ config: unref(config),
69
+ "init-values": unref(currentValues),
150
70
  "last-values": lastValuesProcessed.value,
151
71
  "is-compare": true,
152
72
  disabled: true,
153
73
  "label-width": __props.labelWidth,
154
- "extend-state": __props.extendState,
155
- "show-diff": showDiff
74
+ "extend-state": unref(mergedExtendState),
75
+ "show-diff": showDiff,
76
+ "self-diff-field-types": __props.selfDiffFieldTypes,
77
+ size: __props.size
156
78
  }, null, 8, [
157
79
  "config",
158
80
  "init-values",
159
81
  "last-values",
160
82
  "label-width",
161
- "extend-state"
83
+ "extend-state",
84
+ "self-diff-field-types",
85
+ "size"
162
86
  ])) : createCommentVNode("v-if", true)], 4);
163
87
  };
164
88
  }
@@ -1,8 +1,8 @@
1
1
  import ToolButton_default from "./ToolButton.js";
2
- import { useZIndex } from "@tmagic/design";
3
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveComponent, useTemplateRef, vShow, withCtx, withDirectives, withModifiers } from "vue";
2
+ import { useThemeClass, useZIndex } from "@tmagic/design";
3
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveComponent, unref, useTemplateRef, vShow, withCtx, withDirectives, withModifiers } from "vue";
4
4
  //#region packages/editor/src/components/ContentMenu.vue?vue&type=script&setup=true&lang.ts
5
- var ContentMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
5
+ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
6
  name: "MEditorContentMenu",
7
7
  __name: "ContentMenu",
8
8
  props: {
@@ -29,6 +29,13 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
29
29
  const buttonRefs = useTemplateRef("buttons");
30
30
  const subMenuRef = useTemplateRef("subMenu");
31
31
  const visible = ref(false);
32
+ /**
33
+ * 主题修饰类(来自最近的 `<MEditor>` / `<MForm>` 祖先 provide)。
34
+ * - 顶层 `ContentMenu` 渲染在编辑器子树中,加上去是冗余但无害;
35
+ * - 子菜单(递归 `<content-menu :is-sub-menu="true">` 被 `<teleport to="body">` 送到 body)
36
+ * 不在编辑器子树中,必须显式挂上主题类,主题级 CSS 变量才能命中。
37
+ */
38
+ const themeClass = useThemeClass();
32
39
  const subMenuData = ref([]);
33
40
  const zIndex = useZIndex();
34
41
  const curZIndex = ref(0);
@@ -59,15 +66,29 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
59
66
  if (contains(target)) return;
60
67
  hide();
61
68
  };
69
+ const fixPosition = () => {
70
+ const menu = menuEl.value;
71
+ if (!menu || !visible.value) return;
72
+ const menuHeight = menu.clientHeight;
73
+ const menuWidth = menu.clientWidth;
74
+ let { top, left } = menuPosition.value;
75
+ if (top + menuHeight > document.body.clientHeight) top = Math.max(0, document.body.clientHeight - menuHeight);
76
+ if (left + menuWidth > document.body.clientWidth) left = Math.max(0, document.body.clientWidth - menuWidth);
77
+ if (top !== menuPosition.value.top || left !== menuPosition.value.left) menuPosition.value = {
78
+ top,
79
+ left
80
+ };
81
+ };
62
82
  const setPosition = (e) => {
63
- const menuHeight = menuEl.value?.clientHeight || 0;
64
- let top = e.clientY;
65
- if (menuHeight + e.clientY > document.body.clientHeight) top = document.body.clientHeight - menuHeight;
66
83
  menuPosition.value = {
67
- top,
84
+ top: e.clientY,
68
85
  left: e.clientX
69
86
  };
87
+ fixPosition();
70
88
  };
89
+ const resizeObserver = new ResizeObserver(() => {
90
+ fixPosition();
91
+ });
71
92
  const show = (e) => {
72
93
  visible.value = true;
73
94
  nextTick(() => {
@@ -96,10 +117,12 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
96
117
  emit("mouseenter");
97
118
  };
98
119
  onMounted(() => {
120
+ if (menuEl.value) resizeObserver.observe(menuEl.value);
99
121
  if (props.isSubMenu) return;
100
122
  globalThis.addEventListener("mousedown", outsideClickHideHandler, true);
101
123
  });
102
124
  onBeforeUnmount(() => {
125
+ resizeObserver.disconnect();
103
126
  if (props.isSubMenu) return;
104
127
  globalThis.removeEventListener("mousedown", outsideClickHideHandler, true);
105
128
  });
@@ -118,8 +141,8 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
118
141
  persisted: ""
119
142
  }, {
120
143
  default: withCtx(() => [withDirectives(createElementVNode("div", {
121
- class: "magic-editor-content-menu",
122
144
  ref: "menu",
145
+ class: normalizeClass(["magic-editor-content-menu", unref(themeClass)]),
123
146
  style: normalizeStyle(menuStyle.value),
124
147
  onMouseenter: _cache[0] || (_cache[0] = ($event) => mouseenterHandler()),
125
148
  onContextmenu: _cache[1] || (_cache[1] = withModifiers(() => {}, ["prevent"]))
@@ -150,7 +173,7 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
150
173
  "is-sub-menu": true,
151
174
  onHide: hide
152
175
  }, null, 8, ["active", "menu-data"])) : createCommentVNode("v-if", true)]))
153
- ], 36), [[vShow, visible.value]])]),
176
+ ], 38), [[vShow, visible.value]])]),
154
177
  _: 3
155
178
  });
156
179
  };
@@ -1,7 +1,6 @@
1
- import { useServices } from "../hooks/use-services.js";
2
1
  import Icon_default from "./Icon.js";
3
- import { TMagicButton, useZIndex } from "@tmagic/design";
4
- import { Teleport, computed, createBlock, createCommentVNode, createElementVNode, createVNode, defineComponent, mergeModels, nextTick, normalizeStyle, onBeforeUnmount, openBlock, provide, ref, renderSlot, toDisplayString, unref, useModel, useTemplateRef, watch, withCtx } from "vue";
2
+ import { TMagicButton, useThemeClass, useZIndex } from "@tmagic/design";
3
+ import { Teleport, computed, createBlock, createCommentVNode, createElementVNode, createVNode, defineComponent, mergeModels, mergeProps, nextTick, normalizeStyle, onBeforeUnmount, openBlock, provide, ref, renderSlot, toDisplayString, unref, useModel, useTemplateRef, watch, withCtx } from "vue";
5
4
  import { Close } from "@element-plus/icons-vue";
6
5
  import VanillaMoveable from "moveable";
7
6
  //#region packages/editor/src/components/FloatingBox.vue?vue&type=script&setup=true&lang.ts
@@ -9,14 +8,17 @@ var _hoisted_1 = {
9
8
  ref: "title",
10
9
  class: "m-editor-float-box-title"
11
10
  };
12
- var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
11
+ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
13
12
  __name: "FloatingBox",
14
- props: /* @__PURE__ */ mergeModels({
13
+ props: /*@__PURE__*/ mergeModels({
15
14
  position: { default: () => ({
16
15
  left: 0,
17
16
  top: 0
18
17
  }) },
19
18
  title: { default: "" },
19
+ bodyStyle: {},
20
+ initialStyle: { default: () => ({}) },
21
+ frameworkWidth: { default: 0 },
20
22
  beforeClose: {}
21
23
  }, {
22
24
  "width": { default: 0 },
@@ -41,6 +43,11 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
41
43
  const props = __props;
42
44
  const targetEl = useTemplateRef("target");
43
45
  const titleEl = useTemplateRef("title");
46
+ /**
47
+ * 主题修饰类(来自最近的 `<MEditor>` / `<MForm>` 祖先 provide)。
48
+ * 挂在 `Teleport` 出去的浮动面板根节点上,让主题级 CSS 变量在 portal 节点上也能命中。
49
+ */
50
+ const themeClass = useThemeClass();
44
51
  const zIndex = useZIndex();
45
52
  const curZIndex = ref(0);
46
53
  const titleHeight = ref(0);
@@ -49,19 +56,51 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
49
56
  if (targetEl.value) return targetEl.value.clientHeight - titleHeight.value;
50
57
  return "auto";
51
58
  });
52
- const { uiService } = useServices();
53
- const frameworkWidth = computed(() => uiService.get("frameworkRect").width || 0);
54
59
  const style = computed(() => {
55
60
  let { left } = props.position;
56
- if (width.value) left = left + width.value > frameworkWidth.value ? frameworkWidth.value - width.value : left;
61
+ const frameworkWidth = props.frameworkWidth || globalThis.window?.innerWidth || 0;
62
+ if (width.value && frameworkWidth) left = left + width.value > frameworkWidth ? frameworkWidth - width.value : left;
57
63
  return {
58
64
  left: `${left}px`,
59
65
  top: `${props.position.top}px`,
60
66
  width: width.value ? `${width.value}px` : "auto",
61
- height: height.value ? `${height.value}px` : "auto"
67
+ height: height.value ? `${height.value}px` : "auto",
68
+ ...props.initialStyle
62
69
  };
63
70
  });
64
71
  let moveable = null;
72
+ let dragMask = null;
73
+ let dragMaskVisible = false;
74
+ const bindDragMaskSafety = () => {
75
+ globalThis.window?.addEventListener("pointerup", hideDragMask, true);
76
+ globalThis.window?.addEventListener("blur", hideDragMask);
77
+ globalThis.document?.addEventListener("visibilitychange", hideDragMask);
78
+ };
79
+ const unbindDragMaskSafety = () => {
80
+ globalThis.window?.removeEventListener("pointerup", hideDragMask, true);
81
+ globalThis.window?.removeEventListener("blur", hideDragMask);
82
+ globalThis.document?.removeEventListener("visibilitychange", hideDragMask);
83
+ };
84
+ const showDragMask = () => {
85
+ if (dragMaskVisible) return;
86
+ if (!dragMask) {
87
+ dragMask = globalThis.document.createElement("div");
88
+ dragMask.className = "m-editor-float-box-drag-mask";
89
+ }
90
+ globalThis.document.body.appendChild(dragMask);
91
+ dragMaskVisible = true;
92
+ bindDragMaskSafety();
93
+ const setMaskZIndex = () => {
94
+ if (dragMask) dragMask.style.zIndex = `${curZIndex.value + 1}`;
95
+ };
96
+ setMaskZIndex();
97
+ nextTick(setMaskZIndex);
98
+ };
99
+ const hideDragMask = () => {
100
+ unbindDragMaskSafety();
101
+ dragMask?.parentNode?.removeChild(dragMask);
102
+ dragMaskVisible = false;
103
+ };
65
104
  const initMoveable = () => {
66
105
  moveable = new VanillaMoveable(globalThis.document.body, {
67
106
  className: "m-editor-floating-box-moveable",
@@ -84,6 +123,10 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
84
123
  position: "css"
85
124
  }
86
125
  });
126
+ moveable.on("drag", showDragMask);
127
+ moveable.on("resize", showDragMask);
128
+ moveable.on("dragEnd", hideDragMask);
129
+ moveable.on("resizeEnd", hideDragMask);
87
130
  moveable.on("drag", (e) => {
88
131
  e.target.style.transform = e.transform;
89
132
  });
@@ -96,6 +139,7 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
96
139
  });
97
140
  };
98
141
  const destroyMoveable = () => {
142
+ hideDragMask();
99
143
  moveable?.destroy();
100
144
  moveable = null;
101
145
  };
@@ -109,7 +153,10 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
109
153
  height.value = targetRect.height;
110
154
  initMoveable();
111
155
  }
112
- if (titleEl.value) titleHeight.value = titleEl.value.getBoundingClientRect().height;
156
+ if (titleEl.value) {
157
+ const titleRect = titleEl.value.getBoundingClientRect();
158
+ titleHeight.value = titleRect.height;
159
+ }
113
160
  } else destroyMoveable();
114
161
  }, { immediate: true });
115
162
  onBeforeUnmount(() => {
@@ -135,15 +182,16 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
135
182
  return visible.value ? (openBlock(), createBlock(Teleport, {
136
183
  key: 0,
137
184
  to: "body"
138
- }, [createElementVNode("div", {
185
+ }, [createElementVNode("div", mergeProps({
139
186
  ref: "target",
140
- class: "m-editor-float-box",
141
- style: normalizeStyle({
187
+ class: ["m-editor-float-box", unref(themeClass)]
188
+ }, _ctx.$attrs, {
189
+ style: {
142
190
  ...style.value,
143
191
  zIndex: curZIndex.value
144
- }),
192
+ },
145
193
  onMousedown: nextZIndex
146
- }, [createElementVNode("div", _hoisted_1, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", null, toDisplayString(__props.title), 1)]), createElementVNode("div", null, [createVNode(unref(TMagicButton), {
194
+ }), [createElementVNode("div", _hoisted_1, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", null, toDisplayString(__props.title), 1)]), createElementVNode("div", null, [createVNode(unref(TMagicButton), {
147
195
  link: "",
148
196
  size: "small",
149
197
  onClick: closeHandler
@@ -152,8 +200,11 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
152
200
  _: 1
153
201
  })])], 512), createElementVNode("div", {
154
202
  class: "m-editor-float-box-body",
155
- style: normalizeStyle({ height: `${bodyHeight.value}px` })
156
- }, [renderSlot(_ctx.$slots, "body")], 4)], 36)])) : createCommentVNode("v-if", true);
203
+ style: normalizeStyle({
204
+ height: `${bodyHeight.value}px`,
205
+ ...__props.bodyStyle
206
+ })
207
+ }, [renderSlot(_ctx.$slots, "body")], 4)], 16)])) : createCommentVNode("v-if", true);
157
208
  };
158
209
  }
159
210
  });
@@ -3,7 +3,7 @@ import { createBlock, createElementBlock, createElementVNode, createVNode, defin
3
3
  import { Edit } from "@element-plus/icons-vue";
4
4
  //#region packages/editor/src/components/Icon.vue?vue&type=script&setup=true&lang.ts
5
5
  var _hoisted_1 = ["src"];
6
- var Icon_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
6
+ var Icon_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
7
7
  name: "MEditorIcon",
8
8
  __name: "Icon",
9
9
  props: { icon: {} },
@@ -1,7 +1,7 @@
1
1
  import { useGetSo } from "../hooks/use-getso.js";
2
2
  import { createElementBlock, defineComponent, normalizeClass, openBlock, renderSlot, unref, useTemplateRef } from "vue";
3
3
  //#region packages/editor/src/components/Resizer.vue?vue&type=script&setup=true&lang.ts
4
- var Resizer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
4
+ var Resizer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
5
5
  name: "MEditorResizer",
6
6
  __name: "Resizer",
7
7
  emits: ["change"],
@@ -1,5 +1,4 @@
1
1
  import ScrollBar_vue_vue_type_script_setup_true_lang_default from "./ScrollBar.vue_vue_type_script_setup_true_lang.js";
2
- /* empty css */
3
2
  //#region packages/editor/src/components/ScrollBar.vue
4
3
  var ScrollBar_default = ScrollBar_vue_vue_type_script_setup_true_lang_default;
5
4
  //#endregion