@tmagic/editor 1.8.0-beta.0 → 1.8.0-beta.10

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 (240) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +31 -5
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +21 -113
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -1
  4. package/dist/es/components/CompareForm.js +5 -0
  5. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +196 -0
  6. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  7. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +2 -2
  8. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  9. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +1 -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/editorProps.js +2 -0
  18. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +20 -4
  19. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +3 -6
  20. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +19 -3
  21. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +42 -8
  22. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  23. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +14 -6
  24. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +13 -4
  25. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +41 -16
  26. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +2 -2
  27. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +9 -5
  28. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +40 -19
  29. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +17 -9
  30. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -2
  31. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +1 -1
  32. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +59 -12
  33. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +12 -7
  34. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  35. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +9 -3
  36. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +38 -8
  38. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +4 -2
  39. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +1 -1
  40. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
  41. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
  42. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
  43. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  44. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  45. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  46. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  47. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  48. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +1 -1
  49. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
  50. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
  56. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
  57. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  58. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  59. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  60. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +11 -3
  61. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +17 -4
  62. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +11 -3
  63. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +15 -3
  64. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +11 -3
  65. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +11 -3
  66. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +9 -6
  67. package/dist/es/hooks/use-code-block-edit.js +7 -4
  68. package/dist/es/hooks/use-data-source-edit.js +5 -2
  69. package/dist/es/hooks/use-stage.js +22 -10
  70. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  71. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  72. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  73. package/dist/es/index.js +14 -3
  74. package/dist/es/initService.js +7 -7
  75. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  76. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +7 -6
  77. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -9
  78. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +12 -4
  79. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  80. package/dist/es/layouts/history-list/Bucket.js +5 -0
  81. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +71 -0
  82. package/dist/es/layouts/history-list/BucketTab.js +5 -0
  83. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
  84. package/dist/es/layouts/history-list/GroupRow.js +5 -0
  85. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +269 -0
  86. package/dist/es/layouts/history-list/HistoryDiffDialog.js +5 -0
  87. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +287 -0
  88. package/dist/es/layouts/history-list/HistoryListPanel.js +5 -0
  89. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +327 -0
  90. package/dist/es/layouts/history-list/InitialRow.js +5 -0
  91. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +83 -0
  92. package/dist/es/layouts/history-list/PageTab.js +5 -0
  93. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +95 -0
  94. package/dist/es/layouts/history-list/composables.js +184 -0
  95. package/dist/es/layouts/history-list/useHistoryList.js +56 -0
  96. package/dist/es/layouts/history-list/useHistoryRevert.js +306 -0
  97. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
  99. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  101. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  102. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  103. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +6 -2
  104. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
  105. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +8 -4
  106. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
  107. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
  108. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +1 -1
  109. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +19 -6
  111. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  112. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +25 -3
  113. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +1 -1
  114. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +6 -6
  115. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
  116. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/layer/use-node-status.js +38 -4
  118. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  121. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
  122. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  123. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +9 -9
  124. package/dist/es/services/BaseService.js +31 -68
  125. package/dist/es/services/codeBlock.js +286 -8
  126. package/dist/es/services/componentList.js +2 -2
  127. package/dist/es/services/dataSource.js +287 -8
  128. package/dist/es/services/dep.js +21 -9
  129. package/dist/es/services/editor.js +655 -194
  130. package/dist/es/services/events.js +2 -2
  131. package/dist/es/services/history.js +390 -47
  132. package/dist/es/services/keybinding.js +5 -5
  133. package/dist/es/services/props.js +8 -8
  134. package/dist/es/services/stageOverlay.js +2 -2
  135. package/dist/es/services/storage.js +2 -2
  136. package/dist/es/services/ui.js +5 -2
  137. package/dist/es/style.css +456 -8
  138. package/dist/es/utils/code-block.js +122 -0
  139. package/dist/es/utils/content-menu.js +19 -12
  140. package/dist/es/utils/data-source/index.js +2 -0
  141. package/dist/es/utils/dep/worker.js +1 -1
  142. package/dist/es/utils/editor.js +106 -52
  143. package/dist/es/utils/history.js +220 -0
  144. package/dist/es/utils/indexed-db.js +86 -0
  145. package/dist/es/utils/undo-redo.js +80 -1
  146. package/dist/style.css +456 -8
  147. package/dist/tmagic-editor.umd.cjs +9085 -4480
  148. package/package.json +8 -8
  149. package/src/Editor.vue +25 -1
  150. package/src/components/CodeBlockEditor.vue +20 -109
  151. package/src/components/CodeParams.vue +6 -0
  152. package/src/components/CompareForm.vue +277 -0
  153. package/src/components/ToolButton.vue +2 -2
  154. package/src/editorProps.ts +9 -0
  155. package/src/fields/Code.vue +19 -3
  156. package/src/fields/CodeLink.vue +2 -5
  157. package/src/fields/CodeSelect.vue +17 -1
  158. package/src/fields/CodeSelectCol.vue +37 -3
  159. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +23 -3
  160. package/src/fields/DataSourceFieldSelect/Index.vue +9 -2
  161. package/src/fields/DataSourceFields.vue +48 -10
  162. package/src/fields/DataSourceInput.vue +3 -3
  163. package/src/fields/DataSourceMethodSelect.vue +12 -4
  164. package/src/fields/DataSourceMethods.vue +55 -24
  165. package/src/fields/DataSourceMocks.vue +13 -3
  166. package/src/fields/DataSourceSelect.vue +4 -1
  167. package/src/fields/EventSelect.vue +57 -8
  168. package/src/fields/KeyValue.vue +17 -4
  169. package/src/fields/StyleSetter/Index.vue +6 -0
  170. package/src/fields/StyleSetter/components/Border.vue +30 -7
  171. package/src/fields/StyleSetter/components/Box.vue +2 -0
  172. package/src/fields/StyleSetter/pro/Background.vue +15 -1
  173. package/src/fields/StyleSetter/pro/Border.vue +24 -2
  174. package/src/fields/StyleSetter/pro/Font.vue +15 -1
  175. package/src/fields/StyleSetter/pro/Layout.vue +17 -1
  176. package/src/fields/StyleSetter/pro/Position.vue +15 -1
  177. package/src/fields/StyleSetter/pro/Transform.vue +15 -1
  178. package/src/fields/UISelect.vue +5 -2
  179. package/src/hooks/use-code-block-edit.ts +9 -5
  180. package/src/hooks/use-data-source-edit.ts +2 -2
  181. package/src/hooks/use-stage.ts +26 -9
  182. package/src/index.ts +8 -0
  183. package/src/initService.ts +1 -1
  184. package/src/layouts/CodeEditor.vue +17 -5
  185. package/src/layouts/Framework.vue +11 -6
  186. package/src/layouts/NavMenu.vue +12 -3
  187. package/src/layouts/history-list/Bucket.vue +91 -0
  188. package/src/layouts/history-list/BucketTab.vue +72 -0
  189. package/src/layouts/history-list/GroupRow.vue +304 -0
  190. package/src/layouts/history-list/HistoryDiffDialog.vue +273 -0
  191. package/src/layouts/history-list/HistoryListPanel.vue +367 -0
  192. package/src/layouts/history-list/InitialRow.vue +71 -0
  193. package/src/layouts/history-list/PageTab.vue +118 -0
  194. package/src/layouts/history-list/composables.ts +309 -0
  195. package/src/layouts/history-list/useHistoryList.ts +60 -0
  196. package/src/layouts/history-list/useHistoryRevert.ts +405 -0
  197. package/src/layouts/page-bar/PageBar.vue +4 -2
  198. package/src/layouts/props-panel/PropsPanel.vue +5 -1
  199. package/src/layouts/sidebar/ComponentListPanel.vue +9 -5
  200. package/src/layouts/sidebar/Sidebar.vue +8 -3
  201. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  202. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
  203. package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
  204. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +31 -2
  205. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +27 -2
  206. package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
  207. package/src/layouts/sidebar/layer/LayerMenu.vue +19 -11
  208. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  209. package/src/layouts/sidebar/layer/use-node-status.ts +64 -12
  210. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  211. package/src/layouts/workspace/viewer/ViewerMenu.vue +8 -8
  212. package/src/services/BaseService.ts +35 -86
  213. package/src/services/codeBlock.ts +361 -5
  214. package/src/services/dataSource.ts +336 -6
  215. package/src/services/dep.ts +32 -9
  216. package/src/services/editor.ts +834 -194
  217. package/src/services/history.ts +509 -49
  218. package/src/services/keybinding.ts +3 -3
  219. package/src/services/props.ts +2 -2
  220. package/src/services/ui.ts +7 -0
  221. package/src/theme/history-list-panel.scss +557 -0
  222. package/src/theme/page-bar.scss +0 -4
  223. package/src/theme/props-panel.scss +3 -3
  224. package/src/theme/style-setter/border.scss +4 -1
  225. package/src/theme/theme.scss +1 -0
  226. package/src/type.ts +594 -31
  227. package/src/utils/code-block.ts +150 -0
  228. package/src/utils/content-menu.ts +25 -13
  229. package/src/utils/data-source/index.ts +2 -0
  230. package/src/utils/dep/worker.ts +5 -3
  231. package/src/utils/editor.ts +170 -61
  232. package/src/utils/history.ts +286 -0
  233. package/src/utils/index.ts +3 -0
  234. package/src/utils/indexed-db.ts +122 -0
  235. package/src/utils/undo-redo.ts +111 -0
  236. package/types/index.d.ts +3173 -889
  237. package/dist/es/utils/compose.js +0 -44
  238. package/dist/es/utils/editor-history.js +0 -100
  239. package/src/utils/compose.ts +0 -52
  240. package/src/utils/editor-history.ts +0 -138
@@ -0,0 +1,327 @@
1
+ import { useServices } from "../../hooks/use-services.js";
2
+ import Icon_default from "../../components/Icon.js";
3
+ import { confirmHistoryAction, describeStep, isSingleDiffStepRevertable } from "./composables.js";
4
+ import BucketTab_default from "./BucketTab.js";
5
+ import PageTab_default from "./PageTab.js";
6
+ import { useHistoryList } from "./useHistoryList.js";
7
+ import { useHistoryRevert } from "./useHistoryRevert.js";
8
+ import { TMagicButton, TMagicPopover, TMagicTabs, TMagicTooltip, getDesignConfig, tMagicMessage } from "@tmagic/design";
9
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, inject, markRaw, mergeProps, normalizeProps, openBlock, ref, renderList, resolveDynamicComponent, toHandlers, unref, watch, withCtx } from "vue";
10
+ import { Clock, Close } from "@element-plus/icons-vue";
11
+ //#region packages/editor/src/layouts/history-list/HistoryListPanel.vue?vue&type=script&setup=true&lang.ts
12
+ var _hoisted_1 = { class: "m-editor-history-list" };
13
+ var HistoryListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
14
+ name: "MEditorHistoryListPanel",
15
+ __name: "HistoryListPanel",
16
+ setup(__props) {
17
+ /**
18
+ * 历史记录面板:在顶部 NavMenu 上点击图标打开 popover,分三个 tab:
19
+ * - 页面:当前活动页面的历史栈,连续修改同一节点的多步会被合并成一组
20
+ * - 数据源:以 dataSource.id 分桶,每条操作记录独立展示
21
+ * - 代码块:同上,按 codeBlock.id 分桶,每条操作记录独立展示
22
+ *
23
+ * 数据通过 historyService 暴露的聚合 API 读取,UI 仅用于只读展示,
24
+ * 同时支持点击任意一条记录跳转至该状态:
25
+ * - 页面 tab:调用 editorService.gotoPageStep(targetCursor)
26
+ * - 数据源 tab:调用 dataSourceService.goto(id, targetCursor)
27
+ * - 代码块 tab:调用 codeBlockService.goto(id, targetCursor)
28
+ *
29
+ * 这里的 targetCursor = 用户点击的 step.index + 1,即"应用至此步完成的状态"。
30
+ *
31
+ * 此外每条 step 上提供"查看差异"入口(仅在前后值都存在的 update 步骤显示),
32
+ * 点击后弹出 HistoryDiffDialog,使用 CompareForm 组件以表单形式展示新旧值差异。
33
+ *
34
+ * 各 tab 的内容拆分为独立的 SFC:页面用 PageTab,数据源 / 代码块复用通用的 BucketTab
35
+ * (通过 title / prefix / describe* / isStepDiffable 注入差异)。
36
+ * 共享的描述生成与折叠状态在 composables.ts 中维护。
37
+ */
38
+ const ClockIcon = markRaw(Clock);
39
+ const CloseIcon = markRaw(Close);
40
+ const activeTab = ref("page");
41
+ /**
42
+ * 面板显隐受控:reference 图标点击切换,右上角关闭按钮置为 false。
43
+ * 点击面板以外区域的自动收起由 TMagicPopover 通过 v-model:visible 回写完成。
44
+ */
45
+ const visible = ref(false);
46
+ const tabPaneComponent = getDesignConfig("components")?.tabPane;
47
+ /**
48
+ * 业务方自定义的扩展 tab,由 Editor 顶层通过 `historyListExtraTabs` 注入。
49
+ * 追加在内置「页面 / 数据源 / 代码块」三个 tab 之后,未提供时为空数组。
50
+ */
51
+ const extraTabs = inject("historyListExtraTabs", []);
52
+ /** label 支持字符串或函数,函数形式便于展示动态数量等内容。 */
53
+ const resolveTabLabel = (tab) => typeof tab.label === "function" ? tab.label() : tab.label;
54
+ const services = useServices();
55
+ const { editorService, dataSourceService, codeBlockService, historyService, propsService, stageOverlayService } = services;
56
+ /**
57
+ * 数据源 / 代码块功能可被业务方通过 `disabledDataSource` / `disabledCodeBlock` 禁用,
58
+ * 禁用后对应的历史记录 tab 不再展示。若当前激活的 tab 恰好被禁用,则回退到「页面」tab。
59
+ */
60
+ const disabledDataSource = computed(() => propsService.getDisabledDataSource());
61
+ const disabledCodeBlock = computed(() => propsService.getDisabledCodeBlock());
62
+ watch([disabledDataSource, disabledCodeBlock], ([dsDisabled, cbDisabled]) => {
63
+ if (activeTab.value === "data-source" && dsDisabled || activeTab.value === "code-block" && cbDisabled) activeTab.value = "page";
64
+ });
65
+ /**
66
+ * 通过 inject 拿到 Editor 顶层注入的 `extendFormState`,转交给 HistoryDiffDialog
67
+ * 内部的 CompareForm,使差异对比表单的 filterFunction 能拿到完整的业务上下文。
68
+ * 未提供时为 undefined,CompareForm/MForm 会跳过 extendState 处理。
69
+ */
70
+ const extendFormState = inject("extendFormState", void 0);
71
+ const getPropsPanelFormState = inject("getPropsPanelFormState", void 0);
72
+ const { expanded, toggleGroup, pageGroups, dataSourceGroups, codeBlockGroups, pageGroupsDisplay, dataSourceGroupsByTarget, codeBlockGroupsByTarget } = useHistoryList();
73
+ /**
74
+ * 当前活动页的「加载/初始」标记记录(设置 root 时生成),透传给 PageTab 的底部初始行展示。
75
+ * 基于 historyService 的 reactive state 派生,活动页切换或标记写入后自动刷新。
76
+ */
77
+ const pageMarker = computed(() => historyService.getMarker("page", editorService.get("page")?.id));
78
+ /**
79
+ * 各历史类型的展示名称(页面 / 数据源 / 代码块),由 historyService.state.stepNames 配置,
80
+ * 业务方可通过 historyService.setStepName / registerStepType 覆盖。基于 reactive state 派生,配置变更后自动刷新。
81
+ */
82
+ const pageName = computed(() => historyService.getStepName("page"));
83
+ const dataSourceName = computed(() => historyService.getStepName("dataSource"));
84
+ const codeBlockName = computed(() => historyService.getStepName("codeBlock"));
85
+ /** 代码块 step 仅 update(前后 content 都存在)时可查看差异。 */
86
+ const isStepDiffable = (step) => Boolean(step.diff?.[0]?.oldSchema && step.diff?.[0]?.newSchema);
87
+ /**
88
+ * 数据源 / 代码块两类 bucket 历史的整体渲染配置:把 title / prefix 与各自的描述、
89
+ * 可差异、可回滚判定收敛为单一对象整体注入 BucketTab,组件内部按需读取。
90
+ * title / 描述回退名取自可配置的展示名称,故用 computed 使其随 stepNames 变更刷新。
91
+ */
92
+ const dataSourceConfig = computed(() => ({
93
+ title: dataSourceName.value,
94
+ prefix: "ds",
95
+ describeStep: (step) => describeStep(step, (schema) => schema?.title, dataSourceName.value),
96
+ isStepDiffable,
97
+ isStepRevertable: isSingleDiffStepRevertable
98
+ }));
99
+ const codeBlockConfig = computed(() => ({
100
+ title: codeBlockName.value,
101
+ prefix: "cb",
102
+ describeStep: (step) => describeStep(step, (content) => content?.name, codeBlockName.value),
103
+ isStepDiffable,
104
+ isStepRevertable: isSingleDiffStepRevertable
105
+ }));
106
+ /** 把"目标 step 索引"翻译成"目标 cursor"(已应用步骤数量)。 */
107
+ const indexToCursor = (index) => index + 1;
108
+ const onPageGoto = (index) => {
109
+ editorService.gotoPageStep(indexToCursor(index));
110
+ };
111
+ /**
112
+ * 点击页面历史记录行:选中该记录对应的画布节点。
113
+ * - 从目标 step 的 diff 中取节点 id(优先 newSchema,回退 oldSchema),按出现顺序找到第一个当前仍存在的节点;
114
+ * - 与图层树点击选中一致:editorService.select + 画布 / overlay 画布 select 三者联动;
115
+ * - 该 step 涉及的节点都已不存在(如删除记录、被撤销的新增)时给出提示,不做选中。
116
+ */
117
+ const onPageSelect = async (index) => {
118
+ const step = historyService.getStepList("page", editorService.get("page")?.id)[index]?.step;
119
+ if (!step) return;
120
+ const targetId = (step.diff ?? []).map((item) => item.newSchema?.id ?? item.oldSchema?.id).find((id) => id !== void 0 && id !== null && editorService.getNodeById(id, false));
121
+ if (targetId === void 0 || targetId === null) {
122
+ tMagicMessage.warning("该记录对应的节点已不存在,无法选中");
123
+ return;
124
+ }
125
+ const node = editorService.getNodeById(targetId, false);
126
+ if (!node) return;
127
+ await editorService.select(node);
128
+ editorService.get("stage")?.select(targetId);
129
+ stageOverlayService.get("stage")?.select(targetId);
130
+ };
131
+ const onDataSourceGoto = (id, index) => {
132
+ dataSourceService.goto(id, indexToCursor(index));
133
+ };
134
+ const onCodeBlockGoto = (id, index) => {
135
+ codeBlockService.goto(id, indexToCursor(index));
136
+ };
137
+ /**
138
+ * "回到初始状态" = 把对应栈 cursor 移到 0(全部已撤销)。
139
+ * 复用 service.goto*(0) 即可,所有真实 step 的反向应用由 service 层的 undo 链路完成。
140
+ */
141
+ const onPageGotoInitial = () => {
142
+ editorService.gotoPageStep(0);
143
+ };
144
+ const onDataSourceGotoInitial = (id) => {
145
+ dataSourceService.goto(id, 0);
146
+ };
147
+ const onCodeBlockGotoInitial = (id) => {
148
+ codeBlockService.goto(id, 0);
149
+ };
150
+ /**
151
+ * 「单步回滚」与「查看差异」的完整逻辑收敛到 useHistoryRevert,面板与业务方共用:
152
+ * 二者均由 useHistoryRevert 内部按需动态挂载 HistoryDiffDialog,
153
+ * 业务方亦可直接 import useHistoryRevert(options, services) 调用,无需自行挂载任何弹窗。
154
+ */
155
+ const { onPageRevert, onDataSourceRevert, onCodeBlockRevert, onPageDiff, onDataSourceDiff, onCodeBlockDiff } = useHistoryRevert({
156
+ extendState: extendFormState,
157
+ getPropsPanelFormState
158
+ }, services);
159
+ /**
160
+ * 把内存中(已清空对应类别后的)历史状态重新写回 IndexedDB,
161
+ * 使本地持久化的那份与内存保持一致——即「连同本地保存的一并删除」。
162
+ * 不支持 IndexedDB 或写入失败时静默忽略(内存清空已生效)。
163
+ */
164
+ const syncIndexedDB = async () => {
165
+ try {
166
+ await historyService.saveToIndexedDB();
167
+ } catch (e) {}
168
+ };
169
+ const onPageClear = async () => {
170
+ if (await confirmHistoryAction("确定清空当前页面的历史记录吗?清空后将无法撤销/重做之前的操作,本地保存的记录也会一并删除。")) {
171
+ historyService.clear("page", editorService.get("page")?.id);
172
+ await syncIndexedDB();
173
+ }
174
+ };
175
+ const onDataSourceClear = async () => {
176
+ if (await confirmHistoryAction("确定清空数据源的历史记录吗?清空后将无法撤销/重做之前的操作,本地保存的记录也会一并删除。")) {
177
+ historyService.clear("dataSource");
178
+ await syncIndexedDB();
179
+ }
180
+ };
181
+ const onCodeBlockClear = async () => {
182
+ if (await confirmHistoryAction("确定清空代码块的历史记录吗?清空后将无法撤销/重做之前的操作,本地保存的记录也会一并删除。")) {
183
+ historyService.clear("codeBlock");
184
+ await syncIndexedDB();
185
+ }
186
+ };
187
+ return (_ctx, _cache) => {
188
+ return openBlock(), createBlock(unref(TMagicPopover), {
189
+ "popper-class": "m-editor-history-list-popover",
190
+ placement: "bottom",
191
+ trigger: "click",
192
+ visible: visible.value,
193
+ "onUpdate:visible": _cache[3] || (_cache[3] = ($event) => visible.value = $event),
194
+ width: 660
195
+ }, {
196
+ reference: withCtx(() => [createVNode(unref(TMagicTooltip), {
197
+ effect: "dark",
198
+ placement: "bottom",
199
+ content: "历史记录"
200
+ }, {
201
+ default: withCtx(() => [createVNode(unref(TMagicButton), {
202
+ size: "small",
203
+ link: "",
204
+ onClick: _cache[2] || (_cache[2] = ($event) => visible.value = !visible.value)
205
+ }, {
206
+ icon: withCtx(() => [createVNode(Icon_default, { icon: unref(ClockIcon) }, null, 8, ["icon"])]),
207
+ _: 1
208
+ })]),
209
+ _: 1
210
+ })]),
211
+ default: withCtx(() => [createElementVNode("div", _hoisted_1, [createVNode(unref(TMagicTooltip), {
212
+ effect: "dark",
213
+ placement: "top",
214
+ content: "关闭"
215
+ }, {
216
+ default: withCtx(() => [createVNode(unref(TMagicButton), {
217
+ class: "m-editor-history-list-close",
218
+ size: "small",
219
+ link: "",
220
+ onClick: _cache[0] || (_cache[0] = ($event) => visible.value = false)
221
+ }, {
222
+ icon: withCtx(() => [createVNode(Icon_default, { icon: unref(CloseIcon) }, null, 8, ["icon"])]),
223
+ _: 1
224
+ })]),
225
+ _: 1
226
+ }), createVNode(unref(TMagicTabs), {
227
+ modelValue: activeTab.value,
228
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => activeTab.value = $event),
229
+ class: "m-editor-history-list-tabs"
230
+ }, {
231
+ default: withCtx(() => [
232
+ (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(guardReactiveProps(unref(tabPaneComponent)?.props({
233
+ name: "page",
234
+ label: `${pageName.value} (${unref(pageGroups).length})`,
235
+ lazy: true
236
+ }) || {})), {
237
+ default: withCtx(() => [createVNode(PageTab_default, {
238
+ list: unref(pageGroupsDisplay),
239
+ expanded: unref(expanded),
240
+ marker: pageMarker.value,
241
+ onToggle: unref(toggleGroup),
242
+ onGoto: onPageGoto,
243
+ onGotoInitial: onPageGotoInitial,
244
+ onDiffStep: unref(onPageDiff),
245
+ onRevertStep: unref(onPageRevert),
246
+ onSelect: onPageSelect,
247
+ onClear: onPageClear
248
+ }, null, 8, [
249
+ "list",
250
+ "expanded",
251
+ "marker",
252
+ "onToggle",
253
+ "onDiffStep",
254
+ "onRevertStep"
255
+ ])]),
256
+ _: 1
257
+ }, 16)),
258
+ !disabledDataSource.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 0 }, unref(tabPaneComponent)?.props({
259
+ name: "data-source",
260
+ label: `${dataSourceName.value} (${unref(dataSourceGroups).length})`,
261
+ lazy: true
262
+ }) || {})), {
263
+ default: withCtx(() => [createVNode(BucketTab_default, {
264
+ config: dataSourceConfig.value,
265
+ buckets: unref(dataSourceGroupsByTarget),
266
+ expanded: unref(expanded),
267
+ onToggle: unref(toggleGroup),
268
+ onGoto: onDataSourceGoto,
269
+ onGotoInitial: onDataSourceGotoInitial,
270
+ onDiffStep: unref(onDataSourceDiff),
271
+ onRevertStep: unref(onDataSourceRevert),
272
+ onClear: onDataSourceClear
273
+ }, null, 8, [
274
+ "config",
275
+ "buckets",
276
+ "expanded",
277
+ "onToggle",
278
+ "onDiffStep",
279
+ "onRevertStep"
280
+ ])]),
281
+ _: 1
282
+ }, 16)) : createCommentVNode("v-if", true),
283
+ !disabledCodeBlock.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), normalizeProps(mergeProps({ key: 1 }, unref(tabPaneComponent)?.props({
284
+ name: "code-block",
285
+ label: `${codeBlockName.value} (${unref(codeBlockGroups).length})`,
286
+ lazy: true
287
+ }) || {})), {
288
+ default: withCtx(() => [createVNode(BucketTab_default, {
289
+ config: codeBlockConfig.value,
290
+ buckets: unref(codeBlockGroupsByTarget),
291
+ expanded: unref(expanded),
292
+ onToggle: unref(toggleGroup),
293
+ onGoto: onCodeBlockGoto,
294
+ onGotoInitial: onCodeBlockGotoInitial,
295
+ onDiffStep: unref(onCodeBlockDiff),
296
+ onRevertStep: unref(onCodeBlockRevert),
297
+ onClear: onCodeBlockClear
298
+ }, null, 8, [
299
+ "config",
300
+ "buckets",
301
+ "expanded",
302
+ "onToggle",
303
+ "onDiffStep",
304
+ "onRevertStep"
305
+ ])]),
306
+ _: 1
307
+ }, 16)) : createCommentVNode("v-if", true),
308
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(extraTabs), (tab) => {
309
+ return openBlock(), createBlock(resolveDynamicComponent(unref(tabPaneComponent)?.component || "el-tab-pane"), mergeProps({ key: tab.name }, { ref_for: true }, unref(tabPaneComponent)?.props({
310
+ name: tab.name,
311
+ label: resolveTabLabel(tab),
312
+ lazy: true
313
+ }) || {}), {
314
+ default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(tab.component), mergeProps({ ref_for: true }, tab.props || {}, toHandlers(tab.listeners || {})), null, 16))]),
315
+ _: 2
316
+ }, 1040);
317
+ }), 128))
318
+ ]),
319
+ _: 1
320
+ }, 8, ["modelValue"])])]),
321
+ _: 1
322
+ }, 8, ["visible"]);
323
+ };
324
+ }
325
+ });
326
+ //#endregion
327
+ export { HistoryListPanel_vue_vue_type_script_setup_true_lang_default as default };
@@ -0,0 +1,5 @@
1
+ import InitialRow_vue_vue_type_script_setup_true_lang_default from "./InitialRow.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/editor/src/layouts/history-list/InitialRow.vue
3
+ var InitialRow_default = InitialRow_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { InitialRow_default as default };
@@ -0,0 +1,83 @@
1
+ import { formatHistoryFullTime, formatHistoryTime } from "./composables.js";
2
+ import { computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, toDisplayString, withModifiers } from "vue";
3
+ //#region packages/editor/src/layouts/history-list/InitialRow.vue?vue&type=script&setup=true&lang.ts
4
+ var _hoisted_1 = ["title"];
5
+ var _hoisted_2 = { class: "m-editor-history-list-item-desc" };
6
+ var _hoisted_3 = {
7
+ key: 0,
8
+ class: "m-editor-history-list-item-saved",
9
+ title: "该记录为最近一次保存的状态"
10
+ };
11
+ var _hoisted_4 = {
12
+ key: 1,
13
+ class: "m-editor-history-list-item-actions"
14
+ };
15
+ var _hoisted_5 = ["title"];
16
+ var InitialRow_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
17
+ name: "MEditorHistoryListInitialRow",
18
+ __name: "InitialRow",
19
+ props: {
20
+ isCurrent: { type: Boolean },
21
+ gotoEnabled: {
22
+ type: Boolean,
23
+ default: true
24
+ },
25
+ marker: { default: void 0 }
26
+ },
27
+ emits: ["goto-initial"],
28
+ setup(__props, { emit: __emit }) {
29
+ /**
30
+ * 「初始状态」记录行:渲染于历史列表底部,作为整个栈的"零点"。
31
+ * - 点击该行会把对应栈撤销到 cursor === 0(即没有任何已应用步骤),等同于回到所有修改之前。
32
+ * - 当对应栈本身已处于 cursor === 0 时(isCurrent=true),用户已在初始状态,点击不再触发动作。
33
+ * - 当上层传入 `marker`(设置 root 时为该页生成的「未修改的初始状态」标记)时,
34
+ * 用标记的文案与时间渲染本行;标记不进入撤销/重做栈,仅作为该页基线展示。
35
+ *
36
+ * 该行不是真实 step,仅作为 UI 入口;上层负责把"点击"翻译为 `service.goto*(0)`。
37
+ */
38
+ const props = __props;
39
+ const desc = computed(() => props.marker?.historyDescription || "未修改的初始状态");
40
+ /** 基线(初始状态)是否为最近一次保存点:仅页面栈的 `initial` 基线 step 会被 markSaved 标记。 */
41
+ const saved = computed(() => Boolean(props.marker?.saved));
42
+ const time = computed(() => formatHistoryTime(props.marker?.timestamp));
43
+ const timeTitle = computed(() => formatHistoryFullTime(props.marker?.timestamp));
44
+ const rowTitle = computed(() => {
45
+ const base = props.marker?.historyDescription || "未修改的初始状态";
46
+ return props.isCurrent ? `当前已回到${base}` : `点击回到${base}`;
47
+ });
48
+ const emit = __emit;
49
+ const onClick = () => {
50
+ if (props.isCurrent) return;
51
+ emit("goto-initial");
52
+ };
53
+ return (_ctx, _cache) => {
54
+ return openBlock(), createElementBlock("li", {
55
+ class: normalizeClass(["m-editor-history-list-item m-editor-history-list-initial", {
56
+ "is-current": __props.isCurrent,
57
+ "is-clickable": !__props.isCurrent
58
+ }]),
59
+ title: rowTitle.value
60
+ }, [
61
+ _cache[0] || (_cache[0] = createElementVNode("span", {
62
+ class: "m-editor-history-list-item-index",
63
+ title: "历史步骤编号 #0(未修改的初始状态)"
64
+ }, "#0", -1)),
65
+ _cache[1] || (_cache[1] = createElementVNode("span", { class: "m-editor-history-list-item-op op-initial" }, "初始", -1)),
66
+ createElementVNode("span", _hoisted_2, toDisplayString(desc.value), 1),
67
+ saved.value ? (openBlock(), createElementBlock("span", _hoisted_3, "已保存")) : createCommentVNode("v-if", true),
68
+ __props.gotoEnabled && !__props.isCurrent ? (openBlock(), createElementBlock("span", _hoisted_4, [createElementVNode("span", {
69
+ class: "m-editor-history-list-item-goto",
70
+ title: "回到该记录",
71
+ onClick: withModifiers(onClick, ["stop"])
72
+ }, "回到")])) : createCommentVNode("v-if", true),
73
+ time.value ? (openBlock(), createElementBlock("span", {
74
+ key: 2,
75
+ class: "m-editor-history-list-item-time",
76
+ title: timeTitle.value
77
+ }, toDisplayString(time.value), 9, _hoisted_5)) : createCommentVNode("v-if", true)
78
+ ], 10, _hoisted_1);
79
+ };
80
+ }
81
+ });
82
+ //#endregion
83
+ export { InitialRow_vue_vue_type_script_setup_true_lang_default as default };
@@ -0,0 +1,5 @@
1
+ import PageTab_vue_vue_type_script_setup_true_lang_default from "./PageTab.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/editor/src/layouts/history-list/PageTab.vue
3
+ var PageTab_default = PageTab_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { PageTab_default as default };
@@ -0,0 +1,95 @@
1
+ import { describePageGroup, describePageStep, isHistoryGroupExpanded, isPageStepRevertable, toRowGroup } from "./composables.js";
2
+ import GroupRow_default from "./GroupRow.js";
3
+ import InitialRow_default from "./InitialRow.js";
4
+ import { TMagicScrollbar } from "@tmagic/design";
5
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
6
+ //#region packages/editor/src/layouts/history-list/PageTab.vue?vue&type=script&setup=true&lang.ts
7
+ var _hoisted_1 = {
8
+ key: 0,
9
+ class: "m-editor-history-list-empty"
10
+ };
11
+ var _hoisted_2 = {
12
+ key: 0,
13
+ class: "m-editor-history-list-toolbar"
14
+ };
15
+ var _hoisted_3 = { class: "m-editor-history-list-ul" };
16
+ var PageTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
17
+ name: "MEditorHistoryListPageTab",
18
+ __name: "PageTab",
19
+ props: {
20
+ list: {},
21
+ expanded: {},
22
+ marker: {}
23
+ },
24
+ emits: [
25
+ "toggle",
26
+ "goto",
27
+ "goto-initial",
28
+ "diff-step",
29
+ "revert-step",
30
+ "select",
31
+ "clear"
32
+ ],
33
+ setup(__props) {
34
+ const props = __props;
35
+ /**
36
+ * 当前 step 是否可查看差异:
37
+ * - 仅 update 操作;
38
+ * - 单节点更新(diff.length === 1),且 oldSchema / newSchema 都存在。
39
+ * 多节点更新难以选定单一对比目标,统一不展示差异入口。
40
+ */
41
+ const isPageStepDiffable = (step) => {
42
+ if (step.opType !== "update") return false;
43
+ const items = step.diff ?? [];
44
+ if (items.length !== 1) return false;
45
+ return Boolean(items[0]?.oldSchema && items[0]?.newSchema);
46
+ };
47
+ /** 页面历史的描述 / 可操作性判定集合,注入给统一的 `toRowGroup`。 */
48
+ const descriptor = {
49
+ describeGroup: describePageGroup,
50
+ describeStep: describePageStep,
51
+ isStepDiffable: isPageStepDiffable,
52
+ isStepRevertable: isPageStepRevertable
53
+ };
54
+ const rowKey = (group) => `pg-${group.steps[0]?.index}`;
55
+ const toRow = (group) => toRowGroup(group, rowKey(group), descriptor);
56
+ /**
57
+ * 是否处于"初始状态"——即对应页面历史栈 cursor===0:
58
+ * 当 list 中所有 group 的 applied 都为 false 时即为该状态(空列表 `every` 返回 true,
59
+ * 即仅有 marker、无任何操作记录时也视为处于初始状态)。
60
+ */
61
+ const isInitial = computed(() => props.list.every((g) => !g.applied));
62
+ return (_ctx, _cache) => {
63
+ return !__props.list.length && !__props.marker ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [__props.list.length ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("span", {
64
+ class: "m-editor-history-list-clear",
65
+ title: "清空当前页面的历史记录",
66
+ onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("clear"))
67
+ }, "清空")])) : createCommentVNode("v-if", true), createVNode(unref(TMagicScrollbar), { "max-height": "360px" }, {
68
+ default: withCtx(() => [createElementVNode("ul", _hoisted_3, [
69
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.list, (group) => {
70
+ return openBlock(), createBlock(GroupRow_default, {
71
+ key: rowKey(group),
72
+ group: toRow(group),
73
+ expanded: unref(isHistoryGroupExpanded)(__props.expanded, rowKey(group)),
74
+ "select-enabled": true,
75
+ onToggle: _cache[1] || (_cache[1] = (key) => _ctx.$emit("toggle", key)),
76
+ onGoto: _cache[2] || (_cache[2] = (index) => _ctx.$emit("goto", index)),
77
+ onDiffStep: _cache[3] || (_cache[3] = (index) => _ctx.$emit("diff-step", index)),
78
+ onRevertStep: _cache[4] || (_cache[4] = (index) => _ctx.$emit("revert-step", index)),
79
+ onSelect: _cache[5] || (_cache[5] = (index) => _ctx.$emit("select", index))
80
+ }, null, 8, ["group", "expanded"]);
81
+ }), 128)),
82
+ createCommentVNode("\n 初始状态项:永远位于列表底部(页面 tab 倒序展示,最底部=最早),\n 作为\"未修改\"零点。当所有 group 都未 applied 时它即为当前位置。\n 设置 root 时生成的「未修改的初始状态」标记(marker)会作为该行的文案与时间来源。\n "),
83
+ createVNode(InitialRow_default, {
84
+ "is-current": isInitial.value,
85
+ marker: __props.marker,
86
+ onGotoInitial: _cache[6] || (_cache[6] = ($event) => _ctx.$emit("goto-initial"))
87
+ }, null, 8, ["is-current", "marker"])
88
+ ])]),
89
+ _: 1
90
+ })], 64));
91
+ };
92
+ }
93
+ });
94
+ //#endregion
95
+ export { PageTab_vue_vue_type_script_setup_true_lang_default as default };