@tmagic/editor 1.8.0-beta.13 → 1.8.0-beta.15

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 (127) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +15 -3
  2. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +31 -8
  3. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +7 -2
  4. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +15 -4
  5. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +4 -1
  6. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +80 -55
  7. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -1
  8. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  9. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +10 -7
  10. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +4 -1
  11. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +4 -1
  12. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +4 -1
  13. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +4 -1
  14. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -1
  15. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  16. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +8 -2
  17. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +99 -64
  18. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +4 -1
  19. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  20. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +5 -4
  21. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +4 -1
  22. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +1 -1
  23. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
  24. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
  25. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
  26. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
  27. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
  28. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +6 -6
  29. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +5 -2
  30. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +28 -5
  31. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +31 -5
  32. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +10 -2
  33. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +10 -2
  34. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +10 -2
  35. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +10 -2
  36. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +16 -2
  37. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +18 -2
  38. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +18 -2
  39. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +36 -2
  40. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +32 -2
  41. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +7 -6
  42. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -3
  43. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +47 -25
  44. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +4 -1
  45. package/dist/es/icons/DatasourceIcon.js +17 -0
  46. package/dist/es/index.js +2 -2
  47. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -10
  48. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +13 -4
  49. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +3 -3
  50. package/dist/es/plugin.js +2 -1
  51. package/dist/es/services/editor.js +86 -24
  52. package/dist/es/services/history.js +16 -0
  53. package/dist/es/services/ui.js +5 -3
  54. package/dist/es/style.css +307 -40
  55. package/dist/es/utils/config.js +4 -1
  56. package/dist/es/utils/const.js +2 -2
  57. package/dist/es/utils/data-source/index.js +4 -2
  58. package/dist/es/utils/props.js +43 -29
  59. package/dist/es/utils/type-match-rules.js +12 -5
  60. package/dist/style.css +307 -40
  61. package/dist/themes/magic-admin.css +3004 -0
  62. package/dist/tmagic-editor.umd.cjs +1161 -476
  63. package/package.json +7 -7
  64. package/src/Editor.vue +22 -1
  65. package/src/components/ContentMenu.vue +44 -8
  66. package/src/components/FloatingBox.vue +8 -2
  67. package/src/editorProps.ts +4 -0
  68. package/src/fields/Code.vue +10 -2
  69. package/src/fields/CodeSelect.vue +54 -43
  70. package/src/fields/CodeSelectCol.vue +1 -0
  71. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  72. package/src/fields/DisplayConds.vue +4 -1
  73. package/src/fields/EventSelect.vue +56 -32
  74. package/src/fields/StyleSetter/Index.vue +1 -4
  75. package/src/fields/StyleSetter/components/Border.vue +1 -1
  76. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  77. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  78. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  79. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  80. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  81. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  82. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  83. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  84. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  85. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  86. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  87. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  88. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  89. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  90. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  91. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  92. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  93. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  94. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  95. package/src/fields/StyleSetter/pro/Background.vue +7 -2
  96. package/src/fields/StyleSetter/pro/Font.vue +3 -3
  97. package/src/fields/StyleSetter/pro/Layout.vue +98 -28
  98. package/src/icons/DatasourceIcon.vue +7 -0
  99. package/src/index.ts +3 -0
  100. package/src/layouts/Framework.vue +7 -1
  101. package/src/layouts/props-panel/PropsPanel.vue +38 -12
  102. package/src/layouts/sidebar/Sidebar.vue +3 -3
  103. package/src/plugin.ts +3 -2
  104. package/src/services/editor.ts +76 -11
  105. package/src/services/history.ts +22 -1
  106. package/src/services/ui.ts +20 -5
  107. package/src/theme/code-block.scss +37 -0
  108. package/src/theme/common/var.scss +1 -1
  109. package/src/theme/component-list-panel.scss +2 -2
  110. package/src/theme/data-source-field.scss +4 -0
  111. package/src/theme/display-conds.scss +11 -0
  112. package/src/theme/event.scss +58 -4
  113. package/src/theme/framework.scss +4 -1
  114. package/src/theme/history-list-panel.scss +9 -9
  115. package/src/theme/nav-menu.scss +5 -1
  116. package/src/theme/props-panel.scss +2 -1
  117. package/src/theme/style-setter/border.scss +14 -5
  118. package/src/theme/theme.scss +1 -0
  119. package/src/theme/themes/magic-admin/index.scss +214 -0
  120. package/src/theme/ui-select.scss +1 -1
  121. package/src/type.ts +33 -6
  122. package/src/utils/config.ts +9 -1
  123. package/src/utils/const.ts +3 -2
  124. package/src/utils/data-source/index.ts +3 -3
  125. package/src/utils/props.ts +22 -9
  126. package/src/utils/type-match-rules.ts +11 -5
  127. package/types/index.d.ts +114 -35
@@ -49,13 +49,14 @@ const state = shallowReactive<UiState>({
49
49
  width: 375,
50
50
  height: 817,
51
51
  },
52
+ // 先给 columnWidth 留占位,真正的 clamp 逻辑在 state 创建完成后
53
+ // 用 state.minLeftColumnWidth / state.minRightColumnWidth 作为下限重新赋值 —
54
+ // 这样以后从外部(比如 uiService.set('minLeftColumnWidth', ...))动态改最小宽度,
55
+ // 只改一处 state 字段即可,不用同步 MIN_* 常量。
52
56
  columnWidth: {
53
- left:
54
- storageService.getItem(LEFT_COLUMN_WIDTH_STORAGE_KEY, { protocol: Protocol.NUMBER }) || DEFAULT_LEFT_COLUMN_WIDTH,
57
+ left: 0,
55
58
  center: 0,
56
- right:
57
- storageService.getItem(RIGHT_COLUMN_WIDTH_STORAGE_KEY, { protocol: Protocol.NUMBER }) ||
58
- DEFAULT_RIGHT_COLUMN_WIDTH,
59
+ right: 0,
59
60
  },
60
61
  minLeftColumnWidth: MIN_LEFT_COLUMN_WIDTH,
61
62
  minCenterColumnWidth: MIN_CENTER_COLUMN_WIDTH,
@@ -83,6 +84,20 @@ const state = shallowReactive<UiState>({
83
84
  },
84
85
  });
85
86
 
87
+ // 左右两栏宽度延后初始化:
88
+ // - 优先取 storage 里用户上次拖到的值;storage 空时回落到 DEFAULT_*;
89
+ // - 再用 state.min*ColumnWidth 兜底,防止历史 storage 里存的是老版本或用户拖过头
90
+ // 留下的"比当前 min 还小"的数值。放到 state 之后写是因为初始化时无法在同一个
91
+ // 对象字面量里读到自己的其它字段。
92
+ state.columnWidth.left = Math.max(
93
+ storageService.getItem(LEFT_COLUMN_WIDTH_STORAGE_KEY, { protocol: Protocol.NUMBER }) || DEFAULT_LEFT_COLUMN_WIDTH,
94
+ state.minLeftColumnWidth,
95
+ );
96
+ state.columnWidth.right = Math.max(
97
+ storageService.getItem(RIGHT_COLUMN_WIDTH_STORAGE_KEY, { protocol: Protocol.NUMBER }) || DEFAULT_RIGHT_COLUMN_WIDTH,
98
+ state.minRightColumnWidth,
99
+ );
100
+
86
101
  const canUsePluginMethods = {
87
102
  async: ['zoom', 'calcZoom'] as const,
88
103
  sync: [] as const,
@@ -1,3 +1,40 @@
1
1
  .m-fields-code-select {
2
2
  width: 100%;
3
+ > .el-card.tmagic-design-card--flat {
4
+ background-color: transparent;
5
+ margin-bottom: 10px;
6
+ > .el-card__body {
7
+ padding-left: 0;
8
+ .code-select-content {
9
+ > .m-fields-group-list {
10
+ > .tmagic-design-card--flat.el-card {
11
+ padding-left: 16px;
12
+ padding-right: 16px;
13
+ margin-bottom: 10px;
14
+ border: 0 !important;
15
+ }
16
+ }
17
+ }
18
+ }
19
+ }
20
+ .el-card__body {
21
+ .tmagic-design-form-item {
22
+ margin-bottom: 18px;
23
+ }
24
+ }
25
+ .code-select-content {
26
+ > .m-fields-group-list {
27
+ > .tmagic-design-card--flat {
28
+ > .el-card__header {
29
+ padding: 16px 0;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ .create-button {
35
+ &.fullWidth {
36
+ width: 100%;
37
+ margin: 0 0 16px 0;
38
+ }
39
+ }
3
40
  }
@@ -1,4 +1,4 @@
1
- $theme-color: #2882e0;
1
+ $theme-color: var(--el-color-primary, #2882e0);
2
2
 
3
3
  $font-color: #313a40;
4
4
  $border-color: #d9dbdd;
@@ -77,9 +77,9 @@
77
77
  margin-bottom: 5px;
78
78
 
79
79
  &:hover {
80
- background: #2882e0;
80
+ background: var(--el-color-primary, #2882e0);
81
81
  color: #fff;
82
- border-color: #4e8be1;
82
+ border-color: var(--el-color-primary, #4e8be1);
83
83
  }
84
84
  }
85
85
 
@@ -5,6 +5,10 @@
5
5
  width: 100%;
6
6
  display: flex;
7
7
  align-items: center;
8
+ &.data-source-field-img-upload,
9
+ &.data-source-field-big-img-upload {
10
+ align-items: flex-start;
11
+ }
8
12
 
9
13
  .m-fields-select-action-button {
10
14
  margin-left: 5px;
@@ -0,0 +1,11 @@
1
+ .m-container-text.display-conds-title {
2
+ .tmagic-design-form-item {
3
+ .el-form-item__label {
4
+ color: #111;
5
+ font-weight: 500;
6
+ font-size: 16px;
7
+ }
8
+ line-height: 24px;
9
+ margin-bottom: 10px;
10
+ }
11
+ }
@@ -2,8 +2,29 @@
2
2
  width: 100%;
3
3
  .fullWidth {
4
4
  width: 100%;
5
+ box-sizing: border-box;
6
+ }
7
+ .event-select-container {
8
+ padding: 0 16px;
9
+ > .el-card.tmagic-design-card--flat {
10
+ > .el-card__header {
11
+ border-bottom: 1px solid #ebeef5;
12
+ }
13
+ > .el-card__body {
14
+ padding-bottom: 16px;
15
+ .m-fields-group-list-footer {
16
+ div {
17
+ justify-content: flex-start !important;
18
+ }
19
+ }
20
+ .el-card.tmagic-design-card--flat {
21
+ > .el-card__header {
22
+ padding: 16px 0;
23
+ }
24
+ }
25
+ }
26
+ }
5
27
  }
6
-
7
28
  .event-select-code {
8
29
  margin-left: 20px;
9
30
  width: auto;
@@ -36,10 +57,43 @@
36
57
  }
37
58
  }
38
59
 
39
- .el-form-item {
60
+ .event-select-container {
61
+ padding: 0 16px;
62
+ }
63
+
64
+ .event-select-header {
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: space-between;
68
+ margin-bottom: 8px;
69
+ .event-select-title {
70
+ color: #0f1113;
71
+ font-size: 16px;
72
+ font-weight: 500;
73
+ line-height: 24px;
74
+ }
75
+ }
76
+ .event-item-header {
77
+ position: relative;
78
+ width: 100%;
79
+ .event-item-title {
80
+ color: #0f1113;
81
+ font-size: 16px;
82
+ font-weight: 500;
83
+ line-height: 24px;
84
+ margin-bottom: 16px;
85
+ }
86
+ .event-item-delete-button {
87
+ position: absolute;
88
+ right: 0;
89
+ top: 0;
90
+ }
91
+
40
92
  .el-form-item {
41
- &.is-error {
42
- margin-bottom: 18px;
93
+ .el-form-item {
94
+ &.is-error {
95
+ margin-bottom: 18px;
96
+ }
43
97
  }
44
98
  }
45
99
  }
@@ -6,7 +6,10 @@
6
6
  width: 100%;
7
7
 
8
8
  &-content {
9
- height: calc(100% - #{$nav-height});
9
+ // nav-menu.scss 的 `--editor-nav-height` 联动:默认 fallback 到 SCSS
10
+ // `$nav-height`(35px),主题覆盖时两处会同时切成同一个高度,保证 nav 和
11
+ // 主内容区总高度 = 100%。
12
+ height: calc(100% - var(--editor-nav-height, #{$nav-height}));
10
13
  }
11
14
 
12
15
  &-framework-center {
@@ -21,7 +21,7 @@
21
21
  color: #909399;
22
22
 
23
23
  &:hover {
24
- color: #409eff;
24
+ color: var(--el-color-primary, #409eff);
25
25
  }
26
26
  }
27
27
 
@@ -96,7 +96,7 @@
96
96
  // 故这里仅作用于「非合并组」的单步条目,避免与卡片样式互相干扰。
97
97
  &.is-current:not(.m-editor-history-list-group.is-merged) {
98
98
  background-color: rgba(64, 158, 255, 0.1);
99
- box-shadow: inset 2px 0 0 #409eff;
99
+ box-shadow: inset 2px 0 0 var(--el-color-primary, #409eff);
100
100
 
101
101
  &:hover {
102
102
  background-color: rgba(64, 158, 255, 0.16);
@@ -104,7 +104,7 @@
104
104
 
105
105
  .m-editor-history-list-item-desc {
106
106
  font-weight: 600;
107
- color: #409eff;
107
+ color: var(--el-color-primary, #409eff);
108
108
  }
109
109
  }
110
110
  }
@@ -177,11 +177,11 @@
177
177
  &.is-current {
178
178
  background-color: rgba(64, 158, 255, 0.08);
179
179
  border-color: rgba(64, 158, 255, 0.3);
180
- border-left-color: #409eff;
180
+ border-left-color: var(--el-color-primary, #409eff);
181
181
  box-shadow: none; // 覆盖 .is-current 公共的 inset 阴影
182
182
 
183
183
  .m-editor-history-list-group-head {
184
- color: #409eff;
184
+ color: var(--el-color-primary, #409eff);
185
185
  }
186
186
  }
187
187
  }
@@ -216,7 +216,7 @@
216
216
  }
217
217
 
218
218
  &.is-current {
219
- color: #409eff;
219
+ color: var(--el-color-primary, #409eff);
220
220
  font-weight: 600;
221
221
  background-color: rgba(64, 158, 255, 0.08);
222
222
  border-radius: 3px;
@@ -231,7 +231,7 @@
231
231
  font-size: 10px;
232
232
  line-height: 16px;
233
233
  color: #fff;
234
- background-color: #409eff;
234
+ background-color: var(--el-color-primary, #409eff);
235
235
  font-weight: 500;
236
236
  }
237
237
 
@@ -395,7 +395,7 @@
395
395
  border-radius: 2px;
396
396
  font-size: 10px;
397
397
  line-height: 16px;
398
- color: #409eff;
398
+ color: var(--el-color-primary, #409eff);
399
399
  background-color: rgba(64, 158, 255, 0.1);
400
400
  cursor: pointer;
401
401
  user-select: none;
@@ -471,7 +471,7 @@
471
471
  flex: 1 1 auto;
472
472
  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
473
473
  font-size: 11px;
474
- color: #409eff;
474
+ color: var(--el-color-primary, #409eff);
475
475
  overflow: hidden;
476
476
  text-overflow: ellipsis;
477
477
  white-space: nowrap;
@@ -13,7 +13,11 @@
13
13
  font-weight: 400;
14
14
  box-sizing: border-box;
15
15
  margin: 0px;
16
- flex: 0 0 $nav-height;
16
+ // CSS 变量做主题化开关:默认没设 `--editor-nav-height` 时回落到
17
+ // SCSS 变量 `$nav-height`(common/var.scss,35px);主题(如 magic-admin)
18
+ // 只需在祖先节点声明 `--editor-nav-height: 40px` 即可运行时覆盖,避免
19
+ // 走 `@use with` 那条对加载顺序极敏感的 SCSS 模块配置路径。
20
+ flex: 0 0 var(--editor-nav-height, #{$nav-height});
17
21
  border-bottom: 1px solid #d8dee8;
18
22
 
19
23
  > div {
@@ -129,7 +129,8 @@
129
129
  > .m-container-tab {
130
130
  > .tmagic-design-tabs {
131
131
  > .el-tabs__content {
132
- padding-top: 55px;
132
+ margin-top: var(--el-tabs-header-height);
133
+ padding-top: 15px;
133
134
  }
134
135
  > .el-tabs__header.is-top {
135
136
  position: absolute;
@@ -1,5 +1,6 @@
1
1
  .border-box-container {
2
2
  display: flex;
3
+ --unuse-border-style: dashed;
3
4
  .border-icon-container {
4
5
  display: flex;
5
6
  flex-direction: column;
@@ -28,24 +29,32 @@
28
29
  border-color: var(--el-color-success, var(--td-success-color, #2ba471));
29
30
  }
30
31
  &.active {
32
+ border-color: var(--el-color-primary);
33
+ border-width: 1px;
34
+ // border-color: var(--el-color-primary, var(--td-brand-color, #0052d9));
35
+ }
36
+ &.center {
31
37
  border-width: 1px;
32
- border-color: var(--el-color-primary, var(--td-brand-color, #0052d9));
33
38
  }
34
39
  &.border-icon-top {
35
40
  border-top-width: 2px;
36
- border-style: solid dashed dashed dashed;
41
+ border-style: solid var(--unuse-border-style) var(--unuse-border-style)
42
+ var(--unuse-border-style);
37
43
  }
38
44
  &.border-icon-right {
39
45
  border-right-width: 2px;
40
- border-style: dashed solid dashed dashed;
46
+ border-style: var(--unuse-border-style) solid var(--unuse-border-style)
47
+ var(--unuse-border-style);
41
48
  }
42
49
  &.border-icon-bottom {
43
50
  border-bottom-width: 2px;
44
- border-style: dashed dashed solid dashed;
51
+ border-style: var(--unuse-border-style) var(--unuse-border-style) solid
52
+ var(--unuse-border-style);
45
53
  }
46
54
  &.border-icon-left {
47
55
  border-left-width: 2px;
48
- border-style: dashed dashed dashed solid;
56
+ border-style: var(--unuse-border-style) var(--unuse-border-style)
57
+ var(--unuse-border-style) solid;
49
58
  }
50
59
  }
51
60
  }
@@ -27,6 +27,7 @@
27
27
  @use "./page-fragment-select.scss";
28
28
  @use "./data-source-field.scss";
29
29
  @use "./data-source-field-select.scss";
30
+ @use "./display-conds.scss";
30
31
  @use "./scroll-bar.scss";
31
32
  @use "./ui-select.scss";
32
33
  @use "./layer-node-content.scss";
@@ -0,0 +1,214 @@
1
+ // magic-admin 主题:所有规则均以 `.m-editor.m-editor--magic-admin` 为前缀,
2
+ // 仅在 `<MEditor theme="magic-admin" />` 时生效,避免污染默认样式。
3
+
4
+ @use "@tmagic/design/src/theme/themes/magic-admin/index.scss" as tMagicDesign;
5
+ @use "@tmagic/table/src/theme/index.scss" as tMagicTable;
6
+ @use "@tmagic/form/src/theme/themes/magic-admin/index.scss" as tMagicForm;
7
+ @use "../../theme.scss";
8
+
9
+ .fade-enter-active,
10
+ .fade-leave-active {
11
+ transition: opacity 0.5s;
12
+ }
13
+ .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
14
+ opacity: 0;
15
+ }
16
+
17
+ // 仅作用于编辑器内部 DOM 的具体样式仍保留「双类」,避免误中 portal 上只挂 `m-theme--*`
18
+ // 的节点。
19
+ .m-editor.m-editor--magic-admin {
20
+ // 主题级 CSS 变量入口:想覆盖 nav 高度等 token 时,改这里一行即可;
21
+ // 走 CSS 级联,运行时切主题(换 `.m-editor--magic-admin` class)即可即时生效,
22
+ // 不受 SCSS `@use` 加载顺序限制。fallback 值定义在 common/var.scss,未启用主题
23
+ // 时自动回落 35px。
24
+ --editor-nav-height: 40px;
25
+
26
+ .m-editor-sidebar {
27
+ .m-editor-sidebar-header {
28
+ // padding: 8px 0;
29
+ width: 61px;
30
+ padding-top: 4px;
31
+ // sidebar 父容器是 `display: flex` (row),同级 `.m-editor-sidebar-content` 的 width
32
+ // 是 `calc(100% - 40px)`(sidebar.scss:52,40 是老 header 宽度)。当 header 改成 61px
33
+ // 后,两者之和会溢出 21px 左右,默认 `flex-shrink: 1` 会按权重压缩 header,最终渲染
34
+ // 出 56.3px 而非 61px。这里强制 `flex-shrink: 0` 让 header 守住宽度,多余的部分由
35
+ // content 侧承担(content 的 `100% - 40` 会自然让出)。
36
+ flex-shrink: 0;
37
+ border-right: 1px solid rgba(0, 84, 225, 0.1);
38
+ display: flex;
39
+ background-color: #fff;
40
+ box-sizing: border-box;
41
+ flex-direction: column;
42
+ align-items: center;
43
+ .m-editor-sidebar-header-item {
44
+ display: flex;
45
+ flex-direction: column;
46
+ align-items: center;
47
+ border-radius: 4px;
48
+ padding: 4px 2px;
49
+ width: 52px;
50
+ margin-bottom: 4px;
51
+ box-sizing: border-box;
52
+ background-color: transparent;
53
+ color: #84909d;
54
+ &:hover {
55
+ background-color: rgba(0, 0, 0, 0.05);
56
+ }
57
+ > i {
58
+ color: #84909d;
59
+ font-size: 20px;
60
+ }
61
+ &.is-active {
62
+ background-color: var(--el-button-hover-bg-color, rgb(230, 238, 253));
63
+ color: var(--el-color-primary);
64
+ &:hover {
65
+ background-color: var(
66
+ --el-button-hover-bg-color,
67
+ rgb(230, 238, 253)
68
+ );
69
+ }
70
+ > i {
71
+ color: var(--el-color-primary);
72
+ }
73
+ .magic-editor-tab-panel-title {
74
+ color: var(--el-color-primary);
75
+ }
76
+ }
77
+ .magic-editor-tab-panel-title {
78
+ font-size: 12px;
79
+ line-height: 14px;
80
+ font-weight: 400;
81
+ margin: 0 4px;
82
+ width: 52px;
83
+ text-align: center;
84
+ }
85
+ }
86
+ }
87
+ .m-editor-sidebar-content {
88
+ width: calc(100% - 61px);
89
+ }
90
+ }
91
+ .m-editor-props-panel .el-input__wrapper {
92
+ border-radius: 4px;
93
+ }
94
+
95
+ .border-box-container .border-icon-container .border-icon {
96
+ border-color: #ccc;
97
+ --unuse-border-style: solid;
98
+ &.configured {
99
+ border-color: var(--el-color-success, var(--td-success-color, #2ba471));
100
+ }
101
+
102
+ &.active {
103
+ border-color: var(--el-color-primary);
104
+ background-color: rgba(0, 84, 225, 0.1);
105
+ &.center {
106
+ border-width: 2px;
107
+ }
108
+ // 命中 `.border-icon-<side>` 时只保留该侧 2px,其余三边清零。
109
+ // 用 `@each` 循环避免四面手抄;后续要加禁用、hover 等状态也可以照搬这套结构。
110
+ @each $side in (top, right, bottom, left) {
111
+ &.border-icon-#{$side} {
112
+ border-width: 0;
113
+ border-#{$side}-width: 2px;
114
+ }
115
+ }
116
+ }
117
+
118
+ &.center {
119
+ border-width: 2px;
120
+ }
121
+ border-radius: 2px;
122
+ }
123
+
124
+ .m-container-code-select {
125
+ > .el-form-item:first-child {
126
+ > .el-form-item__label:first-child > :not(.m-form-tip) {
127
+ color: #111;
128
+ font-weight: 500;
129
+ font-size: 16px;
130
+ line-height: 24px;
131
+ }
132
+ }
133
+ }
134
+ }
135
+
136
+ .m-editor.m-theme--magic-admin {
137
+ .m-editor-props-form-panel-form {
138
+ > .m-container-tab {
139
+ > .tmagic-design-tabs {
140
+ > .el-tabs__content {
141
+ background-color: #fafafa;
142
+ border-radius: 8px;
143
+ padding-left: 16px;
144
+ padding-right: 16px;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+
151
+ .m-editor.m-theme--magic-admin {
152
+ .m-fields-style-setter {
153
+ border: 0;
154
+ .tmagic-design-collapse-item {
155
+ .el-collapse-item__wrap {
156
+ padding: 16px;
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ .m-editor.m-theme--magic-admin {
163
+ .magic-right-panel-tabs-top {
164
+ > .el-tabs {
165
+ > .el-tabs__header {
166
+ .el-tabs__nav-wrap.is-top {
167
+ .el-tabs__nav.is-top {
168
+ .el-tabs__active-bar {
169
+ display: none;
170
+ }
171
+ .el-tabs__item {
172
+ &:not(:last-child)::after {
173
+ content: "";
174
+ position: absolute;
175
+ right: 0;
176
+ top: 50%;
177
+ transform: translateY(-50%);
178
+ height: 12px;
179
+ border-right: 1px solid #e6e6e6;
180
+ }
181
+ }
182
+ }
183
+ &::after {
184
+ display: none;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ .m-editor.m-theme--magic-admin {
193
+ .m-editor-nav-menu {
194
+ .menu-right,
195
+ .menu-left {
196
+ > .menu-item {
197
+ > button {
198
+ color: #111;
199
+ }
200
+ }
201
+ }
202
+ .menu-item {
203
+ margin-right: 8px;
204
+ .el-button--small {
205
+ font-size: 14px;
206
+ }
207
+ > button {
208
+ > i {
209
+ font-size: 16px;
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
@@ -4,6 +4,6 @@
4
4
  margin-right: 3px;
5
5
  }
6
6
  span {
7
- color: #2882e0;
7
+ color: var(--el-color-primary, #2882e0);
8
8
  }
9
9
  }
package/src/type.ts CHANGED
@@ -140,6 +140,7 @@ export type BeforeAdd = (config: MNode, parent: MContainer) => Promise<MNode> |
140
140
  export type GetConfig = (config: FormConfig) => Promise<FormConfig> | FormConfig;
141
141
 
142
142
  export interface EditorInstallOptions {
143
+ flat?: boolean;
143
144
  parseDSL: <T = any>(dsl: string) => T;
144
145
  customCreateMonacoEditor: (
145
146
  monaco: typeof import('monaco-editor'),
@@ -1338,17 +1339,37 @@ export interface EditorUpdateChangeItem {
1338
1339
  page: StoreState['page'];
1339
1340
  }
1340
1341
 
1342
+ /** {@link EditorEvents.change} 各操作类型共有的历史相关字段。 */
1343
+ export interface EditorChangeEventHistoryMeta {
1344
+ /**
1345
+ * 本次变更的「历史来源」(调用 DSL 操作时传入的 {@link HistoryOpOptions.historySource},
1346
+ * 撤销 / 重做时则为被应用 step 上记录的 `source`),未携带时为 undefined。
1347
+ */
1348
+ historySource?: HistoryOpSource;
1349
+ /**
1350
+ * 本次操作是否未写入历史记录(即调用时传入的 {@link HistoryOpOptions.doNotPushHistory},缺省为 false);
1351
+ * 撤销 / 重做路径补发的事件恒为 true(撤销/重做本身不再入栈)。
1352
+ */
1353
+ doNotPushHistory?: boolean;
1354
+ }
1355
+
1341
1356
  /**
1342
1357
  * {@link EditorEvents.change} 的回调参数:以 `type` 区分操作类型,并携带对应的操作内容。
1343
1358
  * `data` 为本次变更的节点列表,每项包含 node 及其所属的 page(可能为 null);
1344
- * `move-layer` 额外带层级偏移 `offset`,`drag-to` 额外带目标位置 `targetIndex` / `targetParent`。
1359
+ * `move-layer` 额外带层级偏移 `offset`,`drag-to` 额外带目标位置 `targetIndex` / `targetParent`;
1360
+ * 历史相关字段(historySource / doNotPushHistory)见 {@link EditorChangeEventHistoryMeta}。
1345
1361
  */
1346
1362
  export type EditorChangeEvent =
1347
- | { type: 'add'; data: EditorChangeItem[] }
1348
- | { type: 'remove'; data: EditorChangeItem[] }
1349
- | { type: 'update'; data: EditorUpdateChangeItem[] }
1350
- | { type: 'move-layer'; data: EditorChangeItem[]; offset: number | LayerOffset }
1351
- | { type: 'drag-to'; data: EditorChangeItem[]; targetIndex: number; targetParent: MContainer };
1363
+ | ({ type: 'add'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
1364
+ | ({ type: 'remove'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
1365
+ | ({ type: 'update'; data: EditorUpdateChangeItem[] } & EditorChangeEventHistoryMeta)
1366
+ | ({ type: 'move-layer'; data: EditorChangeItem[]; offset: number | LayerOffset } & EditorChangeEventHistoryMeta)
1367
+ | ({
1368
+ type: 'drag-to';
1369
+ data: EditorChangeItem[];
1370
+ targetIndex: number;
1371
+ targetParent: MContainer;
1372
+ } & EditorChangeEventHistoryMeta);
1352
1373
  // #endregion EditorChangeEvent
1353
1374
 
1354
1375
  export interface HistoryEvents {
@@ -1364,6 +1385,12 @@ export interface HistoryEvents {
1364
1385
  'mark-saved': [{ kind: HistoryStepType; id?: Id }];
1365
1386
  clear: [{ id: Id; stepType: HistoryStepType }];
1366
1387
  'marker-change': [{ id: Id; marker: StepValue; stepType: HistoryStepType }];
1388
+ /**
1389
+ * 页面 / 页面片结构变更(新增 / 删除)时派发,见 {@link HistoryService.notifyPageStructureChange}。
1390
+ * 一次操作(add / remove / setRoot 整体替换)涉及多个页面时合并为**一个**事件;
1391
+ * `add` / `remove` 分别为本次新增与删除的页面列表(其一可为空数组)。
1392
+ */
1393
+ 'page-structure-change': [change: { add: (MPage | MPageFragment)[]; remove: (MPage | MPageFragment)[] }];
1367
1394
  }
1368
1395
 
1369
1396
  export const canUsePluginMethods = {
@@ -16,14 +16,22 @@
16
16
  * limitations under the License.
17
17
  */
18
18
 
19
+ import { ref } from 'vue';
20
+
19
21
  import { EditorInstallOptions } from '@editor/type';
20
22
 
21
23
  let $TMAGIC_EDITOR: EditorInstallOptions = {} as any;
22
24
 
25
+ // 用 ref 持有 flat 全局开关:const 引用本身不可变,符合 `import/no-mutable-exports`;
26
+ // 通过 `.value` 改值仍保持模块级响应式语义,与 editor/plugin.ts、design/index.ts 里
27
+ // 的同名变量写法对齐。
28
+ const isGlobalFlat = ref(false);
29
+
23
30
  const setEditorConfig = (option: EditorInstallOptions): void => {
24
31
  $TMAGIC_EDITOR = option;
32
+ isGlobalFlat.value = option.flat ?? false;
25
33
  };
26
34
 
27
35
  const getEditorConfig = <K extends keyof EditorInstallOptions>(key: K): EditorInstallOptions[K] => $TMAGIC_EDITOR[key];
28
36
 
29
- export { getEditorConfig, setEditorConfig };
37
+ export { getEditorConfig, isGlobalFlat, setEditorConfig };