@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.
- package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +15 -3
- package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +31 -8
- package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +7 -2
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +15 -4
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +80 -55
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -1
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +10 -7
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +4 -1
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +99 -64
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
- package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +6 -6
- package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +5 -2
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +28 -5
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +31 -5
- package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +10 -2
- package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +10 -2
- package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +10 -2
- package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +10 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +16 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +18 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +18 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +36 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +32 -2
- package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +7 -6
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +47 -25
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/icons/DatasourceIcon.js +17 -0
- package/dist/es/index.js +2 -2
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -10
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +13 -4
- package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/plugin.js +2 -1
- package/dist/es/services/editor.js +86 -24
- package/dist/es/services/history.js +16 -0
- package/dist/es/services/ui.js +5 -3
- package/dist/es/style.css +307 -40
- package/dist/es/utils/config.js +4 -1
- package/dist/es/utils/const.js +2 -2
- package/dist/es/utils/data-source/index.js +4 -2
- package/dist/es/utils/props.js +43 -29
- package/dist/es/utils/type-match-rules.js +12 -5
- package/dist/style.css +307 -40
- package/dist/themes/magic-admin.css +3004 -0
- package/dist/tmagic-editor.umd.cjs +1161 -476
- package/package.json +7 -7
- package/src/Editor.vue +22 -1
- package/src/components/ContentMenu.vue +44 -8
- package/src/components/FloatingBox.vue +8 -2
- package/src/editorProps.ts +4 -0
- package/src/fields/Code.vue +10 -2
- package/src/fields/CodeSelect.vue +54 -43
- package/src/fields/CodeSelectCol.vue +1 -0
- package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
- package/src/fields/DisplayConds.vue +4 -1
- package/src/fields/EventSelect.vue +56 -32
- package/src/fields/StyleSetter/Index.vue +1 -4
- package/src/fields/StyleSetter/components/Border.vue +1 -1
- package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
- package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
- package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
- package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
- package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
- package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
- package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
- package/src/fields/StyleSetter/pro/Background.vue +7 -2
- package/src/fields/StyleSetter/pro/Font.vue +3 -3
- package/src/fields/StyleSetter/pro/Layout.vue +98 -28
- package/src/icons/DatasourceIcon.vue +7 -0
- package/src/index.ts +3 -0
- package/src/layouts/Framework.vue +7 -1
- package/src/layouts/props-panel/PropsPanel.vue +38 -12
- package/src/layouts/sidebar/Sidebar.vue +3 -3
- package/src/plugin.ts +3 -2
- package/src/services/editor.ts +76 -11
- package/src/services/history.ts +22 -1
- package/src/services/ui.ts +20 -5
- package/src/theme/code-block.scss +37 -0
- package/src/theme/common/var.scss +1 -1
- package/src/theme/component-list-panel.scss +2 -2
- package/src/theme/data-source-field.scss +4 -0
- package/src/theme/display-conds.scss +11 -0
- package/src/theme/event.scss +58 -4
- package/src/theme/framework.scss +4 -1
- package/src/theme/history-list-panel.scss +9 -9
- package/src/theme/nav-menu.scss +5 -1
- package/src/theme/props-panel.scss +2 -1
- package/src/theme/style-setter/border.scss +14 -5
- package/src/theme/theme.scss +1 -0
- package/src/theme/themes/magic-admin/index.scss +214 -0
- package/src/theme/ui-select.scss +1 -1
- package/src/type.ts +33 -6
- package/src/utils/config.ts +9 -1
- package/src/utils/const.ts +3 -2
- package/src/utils/data-source/index.ts +3 -3
- package/src/utils/props.ts +22 -9
- package/src/utils/type-match-rules.ts +11 -5
- package/types/index.d.ts +114 -35
package/src/services/ui.ts
CHANGED
|
@@ -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
|
}
|
package/src/theme/event.scss
CHANGED
|
@@ -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
|
-
.
|
|
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
|
-
|
|
42
|
-
|
|
93
|
+
.el-form-item {
|
|
94
|
+
&.is-error {
|
|
95
|
+
margin-bottom: 18px;
|
|
96
|
+
}
|
|
43
97
|
}
|
|
44
98
|
}
|
|
45
99
|
}
|
package/src/theme/framework.scss
CHANGED
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
width: 100%;
|
|
7
7
|
|
|
8
8
|
&-content {
|
|
9
|
-
|
|
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;
|
package/src/theme/nav-menu.scss
CHANGED
|
@@ -13,7 +13,11 @@
|
|
|
13
13
|
font-weight: 400;
|
|
14
14
|
box-sizing: border-box;
|
|
15
15
|
margin: 0px;
|
|
16
|
-
|
|
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 {
|
|
@@ -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
|
|
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:
|
|
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:
|
|
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:
|
|
56
|
+
border-style: var(--unuse-border-style) var(--unuse-border-style)
|
|
57
|
+
var(--unuse-border-style) solid;
|
|
49
58
|
}
|
|
50
59
|
}
|
|
51
60
|
}
|
package/src/theme/theme.scss
CHANGED
|
@@ -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
|
+
}
|
package/src/theme/ui-select.scss
CHANGED
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
|
-
| {
|
|
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 = {
|
package/src/utils/config.ts
CHANGED
|
@@ -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 };
|