@tmagic/editor 1.8.0-beta.1 → 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 (232) 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 +3 -3
  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 +1 -1
  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 +28 -6
  38. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
  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 +1 -1
  61. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +1 -1
  62. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +1 -1
  63. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +1 -1
  64. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +1 -1
  65. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +1 -1
  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 +1 -1
  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 +105 -51
  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 +10135 -5646
  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 +2 -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/components/Border.vue +15 -6
  170. package/src/fields/UISelect.vue +5 -2
  171. package/src/hooks/use-code-block-edit.ts +9 -5
  172. package/src/hooks/use-data-source-edit.ts +2 -2
  173. package/src/hooks/use-stage.ts +26 -9
  174. package/src/index.ts +8 -0
  175. package/src/initService.ts +1 -1
  176. package/src/layouts/CodeEditor.vue +17 -5
  177. package/src/layouts/Framework.vue +11 -6
  178. package/src/layouts/NavMenu.vue +12 -3
  179. package/src/layouts/history-list/Bucket.vue +91 -0
  180. package/src/layouts/history-list/BucketTab.vue +72 -0
  181. package/src/layouts/history-list/GroupRow.vue +304 -0
  182. package/src/layouts/history-list/HistoryDiffDialog.vue +273 -0
  183. package/src/layouts/history-list/HistoryListPanel.vue +367 -0
  184. package/src/layouts/history-list/InitialRow.vue +71 -0
  185. package/src/layouts/history-list/PageTab.vue +118 -0
  186. package/src/layouts/history-list/composables.ts +309 -0
  187. package/src/layouts/history-list/useHistoryList.ts +60 -0
  188. package/src/layouts/history-list/useHistoryRevert.ts +405 -0
  189. package/src/layouts/page-bar/PageBar.vue +4 -2
  190. package/src/layouts/props-panel/PropsPanel.vue +5 -1
  191. package/src/layouts/sidebar/ComponentListPanel.vue +9 -5
  192. package/src/layouts/sidebar/Sidebar.vue +8 -3
  193. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  194. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
  195. package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
  196. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +31 -2
  197. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +27 -2
  198. package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
  199. package/src/layouts/sidebar/layer/LayerMenu.vue +19 -11
  200. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  201. package/src/layouts/sidebar/layer/use-node-status.ts +9 -6
  202. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  203. package/src/layouts/workspace/viewer/ViewerMenu.vue +8 -8
  204. package/src/services/BaseService.ts +35 -86
  205. package/src/services/codeBlock.ts +361 -5
  206. package/src/services/dataSource.ts +336 -6
  207. package/src/services/dep.ts +32 -9
  208. package/src/services/editor.ts +834 -194
  209. package/src/services/history.ts +509 -49
  210. package/src/services/keybinding.ts +3 -3
  211. package/src/services/props.ts +2 -2
  212. package/src/services/ui.ts +7 -0
  213. package/src/theme/history-list-panel.scss +557 -0
  214. package/src/theme/page-bar.scss +0 -4
  215. package/src/theme/props-panel.scss +3 -3
  216. package/src/theme/style-setter/border.scss +4 -1
  217. package/src/theme/theme.scss +1 -0
  218. package/src/type.ts +594 -31
  219. package/src/utils/code-block.ts +150 -0
  220. package/src/utils/content-menu.ts +25 -13
  221. package/src/utils/data-source/index.ts +2 -0
  222. package/src/utils/dep/worker.ts +5 -3
  223. package/src/utils/editor.ts +166 -60
  224. package/src/utils/history.ts +286 -0
  225. package/src/utils/index.ts +3 -0
  226. package/src/utils/indexed-db.ts +122 -0
  227. package/src/utils/undo-redo.ts +111 -0
  228. package/types/index.d.ts +3171 -889
  229. package/dist/es/utils/compose.js +0 -44
  230. package/dist/es/utils/editor-history.js +0 -100
  231. package/src/utils/compose.ts +0 -52
  232. package/src/utils/editor-history.ts +0 -138
@@ -0,0 +1,557 @@
1
+ .m-editor-history-list-popover {
2
+ padding: 0 !important;
3
+
4
+ .m-editor-history-list {
5
+ position: relative;
6
+ padding: 4px 8px 8px;
7
+ }
8
+
9
+ // 关闭按钮悬浮在 tab 标题同一行(绝对定位,不占布局空间)。
10
+ // top 对齐容器顶部内边距,height 跟 el-tabs/t-tabs 头部默认高度一致,
11
+ // 再用 flex 居中让图标与 tab 标题视觉对齐。
12
+ .m-editor-history-list-close {
13
+ position: absolute;
14
+ top: 4px;
15
+ right: 4px;
16
+ z-index: 2;
17
+ display: flex;
18
+ align-items: center;
19
+ height: 40px;
20
+ margin: 0;
21
+ color: #909399;
22
+
23
+ &:hover {
24
+ color: #409eff;
25
+ }
26
+ }
27
+
28
+ .m-editor-history-list-tabs {
29
+ .el-tabs__header,
30
+ .t-tabs__header {
31
+ margin-bottom: 4px;
32
+ }
33
+ }
34
+
35
+ .m-editor-history-list-empty {
36
+ padding: 24px 0;
37
+ text-align: center;
38
+ color: #909399;
39
+ font-size: 12px;
40
+ }
41
+
42
+ .m-editor-history-list-ul {
43
+ margin: 0;
44
+ padding: 0;
45
+ list-style: none;
46
+ }
47
+
48
+ // 历史列表工具条:放置「清空」等列表级操作,右对齐。
49
+ .m-editor-history-list-toolbar {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: flex-end;
53
+ padding: 0 4px 4px;
54
+ }
55
+
56
+ // 「清空」按钮:红色文字按钮,强调破坏性操作(点击后会二次确认)。
57
+ .m-editor-history-list-clear {
58
+ padding: 2px 8px;
59
+ border-radius: 4px;
60
+ font-size: 12px;
61
+ color: #f56c6c;
62
+ cursor: pointer;
63
+ user-select: none;
64
+
65
+ &:hover {
66
+ background-color: rgba(245, 108, 108, 0.12);
67
+ }
68
+ }
69
+
70
+ .m-editor-history-list-item {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 6px;
74
+ padding: 6px 8px;
75
+ border-radius: 4px;
76
+ font-size: 12px;
77
+ line-height: 1.4;
78
+ color: #303133;
79
+ cursor: default;
80
+
81
+ // 合并组(卡片)自己定义了 hover/active 视觉,跳过通用单步 hover 避免色彩叠加
82
+ &:not(.m-editor-history-list-group.is-merged):hover {
83
+ background-color: rgba(0, 0, 0, 0.04);
84
+ }
85
+
86
+ &.is-undone {
87
+ color: #c0c4cc;
88
+
89
+ .m-editor-history-list-item-op {
90
+ opacity: 0.5;
91
+ }
92
+ }
93
+
94
+ // 当前所在的「单步」记录:左侧蓝条 + 浅蓝底;
95
+ // 合并组的当前态由 `.is-merged.is-current` 单独覆盖(border-left + 卡片背景),
96
+ // 故这里仅作用于「非合并组」的单步条目,避免与卡片样式互相干扰。
97
+ &.is-current:not(.m-editor-history-list-group.is-merged) {
98
+ background-color: rgba(64, 158, 255, 0.1);
99
+ box-shadow: inset 2px 0 0 #409eff;
100
+
101
+ &:hover {
102
+ background-color: rgba(64, 158, 255, 0.16);
103
+ }
104
+
105
+ .m-editor-history-list-item-desc {
106
+ font-weight: 600;
107
+ color: #409eff;
108
+ }
109
+ }
110
+ }
111
+
112
+ .m-editor-history-list-group {
113
+ flex-direction: column;
114
+ align-items: stretch;
115
+ gap: 0;
116
+
117
+ .m-editor-history-list-group-head {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 6px;
121
+ cursor: default;
122
+
123
+ &.is-clickable {
124
+ cursor: pointer;
125
+ }
126
+ }
127
+
128
+ .m-editor-history-list-group-toggle {
129
+ flex: 0 0 auto;
130
+ width: 16px;
131
+ text-align: center;
132
+ color: #909399;
133
+ font-size: 12px;
134
+ user-select: none;
135
+ transition: transform 0.15s ease;
136
+ pointer-events: none;
137
+
138
+ &.is-expanded {
139
+ transform: rotate(180deg);
140
+ }
141
+ }
142
+
143
+ // 合并组(≥2 个连续同节点的修改被聚合)需要与单步条目明显区分:
144
+ // - 左侧 3px 紫色色条暗示「这是一组」;
145
+ // - 浅紫背景 + 边框把整个组视觉化为一张「卡片」;
146
+ // - 头部加 padding,避免和单步条目混在一起难以辨认。
147
+ &.is-merged {
148
+ margin: 4px 0;
149
+ padding: 4px 8px 6px;
150
+ background-color: rgba(47, 84, 235, 0.06);
151
+ border: 1px solid rgba(47, 84, 235, 0.18);
152
+ border-left: 3px solid #2f54eb;
153
+ border-radius: 4px;
154
+
155
+ // 卡片本体已经有背景色,hover 状态以更深的同色提示交互
156
+ &:hover {
157
+ background-color: rgba(47, 84, 235, 0.1);
158
+ }
159
+
160
+ .m-editor-history-list-group-head {
161
+ font-weight: 600;
162
+ color: #1d39c4;
163
+ }
164
+
165
+ // 已撤销态:整张卡片去色
166
+ &.is-undone {
167
+ background-color: rgba(192, 196, 204, 0.08);
168
+ border-color: rgba(192, 196, 204, 0.4);
169
+ border-left-color: #c0c4cc;
170
+
171
+ .m-editor-history-list-group-head {
172
+ color: #c0c4cc;
173
+ }
174
+ }
175
+
176
+ // 当前组:卡片左条变蓝,与单步「当前」高亮一致
177
+ &.is-current {
178
+ background-color: rgba(64, 158, 255, 0.08);
179
+ border-color: rgba(64, 158, 255, 0.3);
180
+ border-left-color: #409eff;
181
+ box-shadow: none; // 覆盖 .is-current 公共的 inset 阴影
182
+
183
+ .m-editor-history-list-group-head {
184
+ color: #409eff;
185
+ }
186
+ }
187
+ }
188
+ }
189
+
190
+ .m-editor-history-list-substeps {
191
+ margin: 6px 0 0 6px;
192
+ padding: 0;
193
+ list-style: none;
194
+ border-left: 1px dashed rgba(47, 84, 235, 0.45);
195
+
196
+ li {
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 6px;
200
+ padding: 3px 8px;
201
+ font-size: 11px;
202
+ color: #606266;
203
+ cursor: default;
204
+ border-radius: 3px;
205
+
206
+ &.is-clickable {
207
+ cursor: pointer;
208
+
209
+ &:hover {
210
+ background-color: rgba(47, 84, 235, 0.1);
211
+ }
212
+ }
213
+
214
+ &.is-undone {
215
+ color: #c0c4cc;
216
+ }
217
+
218
+ &.is-current {
219
+ color: #409eff;
220
+ font-weight: 600;
221
+ background-color: rgba(64, 158, 255, 0.08);
222
+ border-radius: 3px;
223
+ }
224
+ }
225
+ }
226
+
227
+ .m-editor-history-list-item-current {
228
+ flex: 0 0 auto;
229
+ padding: 0 6px;
230
+ border-radius: 2px;
231
+ font-size: 10px;
232
+ line-height: 16px;
233
+ color: #fff;
234
+ background-color: #409eff;
235
+ font-weight: 500;
236
+ }
237
+
238
+ .m-editor-history-list-item-index {
239
+ flex: 0 0 auto;
240
+ // 固定最小宽度并右对齐:序号位数不一(#6 / #16)时右边界仍统一,
241
+ // 使紧随其后的「类型」徽标在各行间对齐成整齐的一列。
242
+ min-width: 30px;
243
+ text-align: right;
244
+ color: #909399;
245
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
246
+ font-size: 11px;
247
+ font-weight: 400; // 防止被合并组头部的粗体继承
248
+ white-space: nowrap;
249
+ }
250
+
251
+ // 合并组头部展示的是步骤区间(如 #10-#20),宽度本就不定、也无需与单步行对齐,
252
+ // 恢复自然宽度与左对齐,避免被强制成固定列后显得突兀。
253
+ .m-editor-history-list-group.is-merged
254
+ > .m-editor-history-list-group-head
255
+ > .m-editor-history-list-item-index {
256
+ min-width: 0;
257
+ text-align: left;
258
+ }
259
+
260
+ // 操作时间:弱化展示,紧贴在描述之后、各操作按钮之前。
261
+ .m-editor-history-list-item-time {
262
+ flex: 0 0 auto;
263
+ color: #a8abb2;
264
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
265
+ font-size: 11px;
266
+ font-weight: 400; // 防止被合并组头部的粗体继承
267
+ white-space: nowrap;
268
+ }
269
+
270
+ .m-editor-history-list-item-op {
271
+ flex: 0 0 auto;
272
+ padding: 0 6px;
273
+ border-radius: 2px;
274
+ font-size: 11px;
275
+ line-height: 18px;
276
+ color: #fff;
277
+ background-color: #909399;
278
+
279
+ &.op-add {
280
+ background-color: #67c23a;
281
+ }
282
+
283
+ &.op-remove {
284
+ background-color: #f56c6c;
285
+ }
286
+
287
+ &.op-update {
288
+ background-color: #e6a23c;
289
+ }
290
+
291
+ &.op-initial {
292
+ background-color: #909399;
293
+ }
294
+ }
295
+
296
+ .m-editor-history-list-initial {
297
+ cursor: default;
298
+ color: #606266;
299
+ border-top: 1px dashed #dcdfe6;
300
+ margin-top: 4px;
301
+ padding-top: 8px;
302
+
303
+ &.is-clickable {
304
+ cursor: pointer;
305
+ }
306
+
307
+ .m-editor-history-list-item-desc {
308
+ font-style: italic;
309
+ }
310
+ }
311
+
312
+ .m-editor-history-list-item-desc {
313
+ flex: 1 1 auto;
314
+ overflow: hidden;
315
+ text-overflow: ellipsis;
316
+ white-space: nowrap;
317
+ }
318
+
319
+ // 「操作途径」徽标:浅灰描边胶囊,弱化展示来源(画布 / 图层 / 配置面板…),不抢占描述焦点。
320
+ .m-editor-history-list-item-source {
321
+ flex: 0 0 auto;
322
+ padding: 0 6px;
323
+ border: 1px solid #dcdfe6;
324
+ border-radius: 8px;
325
+ font-size: 10px;
326
+ line-height: 14px;
327
+ color: #909399;
328
+ background-color: #f4f4f5;
329
+ white-space: nowrap;
330
+ font-weight: 400; // 防止被合并组头部的粗体继承
331
+ }
332
+
333
+ // 「操作人」徽标:浅蓝描边胶囊,弱化展示操作人,仅在 step.operator 有值时渲染。
334
+ .m-editor-history-list-item-operator {
335
+ flex: 0 0 auto;
336
+ padding: 0 6px;
337
+ border: 1px solid #c6e2ff;
338
+ border-radius: 8px;
339
+ font-size: 10px;
340
+ line-height: 14px;
341
+ color: #409eff;
342
+ background-color: #ecf5ff;
343
+ white-space: nowrap;
344
+ font-weight: 400; // 防止被合并组头部的粗体继承
345
+ }
346
+
347
+ // 「已保存」徽标:绿色实心胶囊,标记最近一次保存对应的历史记录(与 historyService.markSaved 对应)。
348
+ .m-editor-history-list-item-saved {
349
+ flex: 0 0 auto;
350
+ padding: 0 6px;
351
+ border-radius: 8px;
352
+ font-size: 10px;
353
+ line-height: 16px;
354
+ color: #fff;
355
+ background-color: #67c23a;
356
+ white-space: nowrap;
357
+ font-weight: 500;
358
+ letter-spacing: 0.2px;
359
+ }
360
+
361
+ // 「合并 N 步」徽标:紫色实心胶囊,与合并组卡片色系一致,醒目区分单步条目。
362
+ .m-editor-history-list-item-merge {
363
+ flex: 0 0 auto;
364
+ padding: 0 8px;
365
+ border-radius: 8px;
366
+ font-size: 10px;
367
+ line-height: 16px;
368
+ color: #fff;
369
+ background-color: #2f54eb;
370
+ font-weight: 500;
371
+ letter-spacing: 0.2px;
372
+ }
373
+
374
+ // 操作区:把「回滚 / 回到 / 查看差异」收敛为一个统一容器,默认隐藏,
375
+ // 仅在指针悬停于所在行时显示。静止状态下每行最右侧固定为「时间」,
376
+ // 各行因此能对齐成整齐的右侧列,避免按钮数量不一导致的参差错乱。
377
+ .m-editor-history-list-item-actions {
378
+ display: none;
379
+ flex: 0 0 auto;
380
+ align-items: center;
381
+ gap: 6px;
382
+ }
383
+
384
+ .m-editor-history-list-group-head:hover > .m-editor-history-list-item-actions,
385
+ .m-editor-history-list-substeps
386
+ > li:hover
387
+ > .m-editor-history-list-item-actions,
388
+ .m-editor-history-list-initial:hover > .m-editor-history-list-item-actions {
389
+ display: flex;
390
+ }
391
+
392
+ .m-editor-history-list-item-diff {
393
+ flex: 0 0 auto;
394
+ padding: 0 6px;
395
+ border-radius: 2px;
396
+ font-size: 10px;
397
+ line-height: 16px;
398
+ color: #409eff;
399
+ background-color: rgba(64, 158, 255, 0.1);
400
+ cursor: pointer;
401
+ user-select: none;
402
+
403
+ &:hover {
404
+ background-color: rgba(64, 158, 255, 0.2);
405
+ }
406
+ }
407
+
408
+ // 「回到」按钮:将历史游标移动到该 step。使用绿色色系,
409
+ // 与红色「回滚」、蓝色「查看差异」区分,也避免与紧邻的灰色「来源」徽标混淆。
410
+ .m-editor-history-list-item-goto {
411
+ flex: 0 0 auto;
412
+ padding: 0 6px;
413
+ border-radius: 2px;
414
+ font-size: 10px;
415
+ line-height: 16px;
416
+ color: #529b2e;
417
+ background-color: rgba(103, 194, 58, 0.12);
418
+ cursor: pointer;
419
+ user-select: none;
420
+
421
+ &:hover {
422
+ background-color: rgba(103, 194, 58, 0.24);
423
+ }
424
+ }
425
+
426
+ // 「回滚」按钮:类 git revert,把目标 step 反向应用一次作为新提交。
427
+ // 使用红色色调,强调其为"破坏性/可逆操作",与「查看差异」「跳转」区分开。
428
+ .m-editor-history-list-item-revert {
429
+ flex: 0 0 auto;
430
+ padding: 0 6px;
431
+ border-radius: 2px;
432
+ font-size: 10px;
433
+ line-height: 16px;
434
+ color: #f56c6c;
435
+ background-color: rgba(245, 108, 108, 0.12);
436
+ cursor: pointer;
437
+ user-select: none;
438
+
439
+ &:hover {
440
+ background-color: rgba(245, 108, 108, 0.25);
441
+ }
442
+ }
443
+
444
+ .m-editor-history-list-substep-desc {
445
+ flex: 1 1 auto;
446
+ overflow: hidden;
447
+ text-overflow: ellipsis;
448
+ white-space: nowrap;
449
+ }
450
+
451
+ .m-editor-history-list-bucket {
452
+ margin-bottom: 8px;
453
+
454
+ &:last-child {
455
+ margin-bottom: 0;
456
+ }
457
+ }
458
+
459
+ .m-editor-history-list-bucket-title {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 6px;
463
+ padding: 4px 8px;
464
+ font-size: 12px;
465
+ font-weight: 500;
466
+ color: #606266;
467
+ background-color: #f5f7fa;
468
+ border-radius: 4px;
469
+
470
+ code {
471
+ flex: 1 1 auto;
472
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
473
+ font-size: 11px;
474
+ color: #409eff;
475
+ overflow: hidden;
476
+ text-overflow: ellipsis;
477
+ white-space: nowrap;
478
+ }
479
+ }
480
+
481
+ .m-editor-history-list-bucket-count {
482
+ flex: 0 0 auto;
483
+ color: #909399;
484
+ font-weight: 400;
485
+ font-size: 11px;
486
+ }
487
+ }
488
+
489
+ .m-editor-history-diff-dialog {
490
+ .m-editor-history-diff-dialog-body {
491
+ display: flex;
492
+ flex-direction: column;
493
+ }
494
+
495
+ .m-editor-history-diff-dialog-notice {
496
+ margin-bottom: 8px;
497
+ padding: 8px 12px;
498
+ background-color: #fdf6ec;
499
+ border: 1px solid #faecd8;
500
+ border-radius: 4px;
501
+ color: #e6a23c;
502
+ font-size: 13px;
503
+ line-height: 1.5;
504
+ }
505
+
506
+ .m-editor-history-diff-dialog-header {
507
+ display: flex;
508
+ align-items: center;
509
+ justify-content: space-between;
510
+ margin-bottom: 8px;
511
+ padding: 8px 12px;
512
+ background-color: #f5f7fa;
513
+ border-radius: 4px;
514
+ gap: 12px;
515
+ }
516
+
517
+ .m-editor-history-diff-dialog-controls {
518
+ display: flex;
519
+ align-items: center;
520
+ flex: 0 0 auto;
521
+ gap: 8px;
522
+ }
523
+
524
+ .m-editor-history-diff-dialog-view,
525
+ .m-editor-history-diff-dialog-mode {
526
+ flex: 0 0 auto;
527
+ }
528
+
529
+ .m-editor-history-diff-dialog-target {
530
+ flex: 1 1 auto;
531
+ font-size: 13px;
532
+ font-weight: 500;
533
+ color: #303133;
534
+ overflow: hidden;
535
+ text-overflow: ellipsis;
536
+ white-space: nowrap;
537
+ }
538
+
539
+ .m-editor-history-diff-dialog-legend {
540
+ display: flex;
541
+ align-items: center;
542
+ gap: 6px;
543
+ margin-bottom: 12px;
544
+ padding: 0 4px;
545
+ }
546
+
547
+ .m-editor-history-diff-dialog-arrow {
548
+ color: #909399;
549
+ font-size: 12px;
550
+ }
551
+
552
+ .m-editor-history-diff-dialog-tip {
553
+ margin-left: 8px;
554
+ color: #e6a23c;
555
+ font-size: 12px;
556
+ }
557
+ }
@@ -102,10 +102,6 @@
102
102
  transition: all 0.2s ease 0s;
103
103
  padding: 5px 14px;
104
104
 
105
- .tmagic-design-button {
106
- color: $font-color;
107
- }
108
-
109
105
  &:hover {
110
106
  background-color: $hover-color;
111
107
  }
@@ -58,7 +58,7 @@
58
58
  position: absolute;
59
59
  right: 15px;
60
60
  bottom: 15px;
61
- z-index: 30;
61
+ z-index: 32;
62
62
  opacity: 0.5;
63
63
 
64
64
  &:hover {
@@ -70,7 +70,7 @@
70
70
  position: absolute;
71
71
  right: 15px;
72
72
  bottom: 60px;
73
- z-index: 30;
73
+ z-index: 31;
74
74
  opacity: 0.5;
75
75
 
76
76
  &:hover {
@@ -82,7 +82,7 @@
82
82
  position: absolute;
83
83
  left: 0;
84
84
  top: 0;
85
- z-index: 10;
85
+ z-index: 31;
86
86
  }
87
87
 
88
88
  .m-editor-resizer {
@@ -24,9 +24,12 @@
24
24
  & + .border-icon {
25
25
  margin-left: 8px;
26
26
  }
27
+ &.configured {
28
+ border-color: var(--el-color-success, var(--td-success-color, #2ba471));
29
+ }
27
30
  &.active {
28
31
  border-width: 1px;
29
- border-color: var(--el-color-primary);
32
+ border-color: var(--el-color-primary, var(--td-brand-color, #0052d9));
30
33
  }
31
34
  &.border-icon-top {
32
35
  border-top-width: 2px;
@@ -1,5 +1,6 @@
1
1
  @use "./search-input.scss";
2
2
  @use "./nav-menu.scss";
3
+ @use "./history-list-panel.scss";
3
4
  @use "./framework.scss";
4
5
  @use "./sidebar.scss";
5
6
  @use "./layer-panel.scss";