@tmagic/editor 1.0.0-beta.1 → 1.0.0-beta.4
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/style.css +7 -7
- package/dist/tmagic-editor.es.js +403 -167
- package/dist/tmagic-editor.es.js.map +1 -1
- package/dist/tmagic-editor.umd.js +424 -169
- package/dist/tmagic-editor.umd.js.map +1 -1
- package/dist/types/src/Editor.vue.d.ts +5 -5
- package/dist/types/src/components/ScrollViewer.vue.d.ts +23 -0
- package/dist/types/src/layouts/CodeEditor.vue.d.ts +5 -4
- package/dist/types/src/layouts/workspace/Stage.vue.d.ts +76 -37
- package/dist/types/src/layouts/workspace/Workspace.vue.d.ts +1 -5
- package/dist/types/src/services/ui.d.ts +10 -3
- package/dist/types/src/type.d.ts +15 -6
- package/dist/types/src/utils/scroll-viewer.d.ts +35 -0
- package/package.json +12 -10
- package/src/Editor.vue +5 -5
- package/src/components/ScrollViewer.vue +65 -0
- package/src/layouts/CodeEditor.vue +35 -59
- package/src/layouts/workspace/Stage.vue +62 -50
- package/src/layouts/workspace/Workspace.vue +2 -21
- package/src/services/editor.ts +3 -2
- package/src/services/ui.ts +36 -2
- package/src/theme/stage.scss +7 -7
- package/src/type.ts +17 -6
- package/src/utils/scroll-viewer.ts +213 -0
|
@@ -3,7 +3,7 @@ import type { FormConfig } from '@tmagic/form';
|
|
|
3
3
|
import type { MApp, MNode } from '@tmagic/schema';
|
|
4
4
|
import type StageCore from '@tmagic/stage';
|
|
5
5
|
import type { MoveableOptions } from '@tmagic/stage';
|
|
6
|
-
import type { ComponentGroup, MenuBarData, Services, SideBarData } from './type';
|
|
6
|
+
import type { ComponentGroup, MenuBarData, Services, SideBarData, StageRect } from './type';
|
|
7
7
|
declare const _default: DefineComponent<{
|
|
8
8
|
/** 页面初始值 */
|
|
9
9
|
modelValue: {
|
|
@@ -60,8 +60,8 @@ declare const _default: DefineComponent<{
|
|
|
60
60
|
canSelect: {
|
|
61
61
|
type: PropType<(el: HTMLElement) => boolean | Promise<boolean>>;
|
|
62
62
|
};
|
|
63
|
-
|
|
64
|
-
type: PropType<
|
|
63
|
+
stageRect: {
|
|
64
|
+
type: PropType<StageRect>;
|
|
65
65
|
};
|
|
66
66
|
}, Services, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("props-panel-mounted" | "update:modelValue")[], "props-panel-mounted" | "update:modelValue", VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<{
|
|
67
67
|
/** 页面初始值 */
|
|
@@ -119,8 +119,8 @@ declare const _default: DefineComponent<{
|
|
|
119
119
|
canSelect: {
|
|
120
120
|
type: PropType<(el: HTMLElement) => boolean | Promise<boolean>>;
|
|
121
121
|
};
|
|
122
|
-
|
|
123
|
-
type: PropType<
|
|
122
|
+
stageRect: {
|
|
123
|
+
type: PropType<StageRect>;
|
|
124
124
|
};
|
|
125
125
|
}>> & {
|
|
126
126
|
"onProps-panel-mounted"?: ((...args: any[]) => any) | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DefineComponent, Ref, ComputedRef, ComponentOptionsMixin, VNodeProps, AllowedComponentProps, ComponentCustomProps, ExtractPropTypes } from 'vue';
|
|
2
|
+
declare const _default: DefineComponent<{
|
|
3
|
+
width: NumberConstructor;
|
|
4
|
+
height: NumberConstructor;
|
|
5
|
+
zoom: {
|
|
6
|
+
type: NumberConstructor;
|
|
7
|
+
default: number;
|
|
8
|
+
};
|
|
9
|
+
}, {
|
|
10
|
+
container: Ref<HTMLDivElement | undefined>;
|
|
11
|
+
el: Ref<HTMLDivElement | undefined>;
|
|
12
|
+
style: ComputedRef<string>;
|
|
13
|
+
}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, Record<string, any>, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<{
|
|
14
|
+
width: NumberConstructor;
|
|
15
|
+
height: NumberConstructor;
|
|
16
|
+
zoom: {
|
|
17
|
+
type: NumberConstructor;
|
|
18
|
+
default: number;
|
|
19
|
+
};
|
|
20
|
+
}>>, {
|
|
21
|
+
zoom: number;
|
|
22
|
+
}>;
|
|
23
|
+
export default _default;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DefineComponent, Ref, ComponentOptionsMixin, VNodeProps, AllowedComponentProps, ComponentCustomProps, ExtractPropTypes } from 'vue';
|
|
2
|
+
import * as monaco from 'monaco-editor';
|
|
2
3
|
declare const _default: DefineComponent<{
|
|
3
4
|
initValues: {
|
|
4
5
|
type: (StringConstructor | ObjectConstructor)[];
|
|
@@ -18,10 +19,10 @@ declare const _default: DefineComponent<{
|
|
|
18
19
|
values: Ref<string>;
|
|
19
20
|
loading: Ref<boolean>;
|
|
20
21
|
codeEditor: Ref<HTMLDivElement | undefined>;
|
|
21
|
-
getEditor():
|
|
22
|
-
setEditorValue: (v: any, m: any) =>
|
|
22
|
+
getEditor(): monaco.editor.IStandaloneCodeEditor | monaco.editor.IStandaloneDiffEditor | null;
|
|
23
|
+
setEditorValue: (v: string | any, m: string | any) => void | undefined;
|
|
23
24
|
focus(): void;
|
|
24
|
-
}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("
|
|
25
|
+
}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("initd" | "save")[], "save" | "initd", VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<{
|
|
25
26
|
initValues: {
|
|
26
27
|
type: (StringConstructor | ObjectConstructor)[];
|
|
27
28
|
};
|
|
@@ -37,7 +38,7 @@ declare const _default: DefineComponent<{
|
|
|
37
38
|
default: () => string;
|
|
38
39
|
};
|
|
39
40
|
}>> & {
|
|
40
|
-
|
|
41
|
+
onInitd?: ((...args: any[]) => any) | undefined;
|
|
41
42
|
onSave?: ((...args: any[]) => any) | undefined;
|
|
42
43
|
}, {
|
|
43
44
|
type: string;
|
|
@@ -1,27 +1,12 @@
|
|
|
1
|
-
import type { DefineComponent, Ref, ComponentInternalInstance, ExtractPropTypes, VNodeProps, AllowedComponentProps, ComponentCustomProps, Slot, ComponentPublicInstance, ComponentOptionsBase, ComputedRef, ComponentOptionsMixin, EmitsOptions, DebuggerEvent,
|
|
2
|
-
import type { MApp, MNode, MPage } from '@tmagic/schema';
|
|
1
|
+
import type { DefineComponent, Ref, ComponentInternalInstance, ExtractPropTypes, VNodeProps, AllowedComponentProps, ComponentCustomProps, Slot, ComponentPublicInstance, ComponentOptionsBase, ComputedRef, ComponentOptionsMixin, EmitsOptions, DebuggerEvent, WatchOptions, WatchStopHandle, ShallowUnwrapRef, ComponentCustomProperties, nextTick, PropType } from 'vue';
|
|
3
2
|
import type { MoveableOptions } from '@tmagic/stage';
|
|
4
3
|
import StageCore from '@tmagic/stage';
|
|
4
|
+
import type { StageRect } from '../../type';
|
|
5
5
|
declare const _default: DefineComponent<{
|
|
6
6
|
render: {
|
|
7
7
|
type: PropType<() => HTMLDivElement>;
|
|
8
8
|
};
|
|
9
9
|
runtimeUrl: StringConstructor;
|
|
10
|
-
root: {
|
|
11
|
-
type: PropType<MApp>;
|
|
12
|
-
};
|
|
13
|
-
page: {
|
|
14
|
-
type: PropType<MPage>;
|
|
15
|
-
};
|
|
16
|
-
node: {
|
|
17
|
-
type: PropType<MNode>;
|
|
18
|
-
};
|
|
19
|
-
uiSelectMode: {
|
|
20
|
-
type: BooleanConstructor;
|
|
21
|
-
};
|
|
22
|
-
zoom: {
|
|
23
|
-
type: NumberConstructor;
|
|
24
|
-
};
|
|
25
10
|
canSelect: {
|
|
26
11
|
type: PropType<(el: HTMLElement) => boolean | Promise<boolean>>;
|
|
27
12
|
default: (el: HTMLElement) => boolean;
|
|
@@ -33,7 +18,6 @@ declare const _default: DefineComponent<{
|
|
|
33
18
|
};
|
|
34
19
|
};
|
|
35
20
|
}, {
|
|
36
|
-
stageContainer: Ref<HTMLDivElement | undefined>;
|
|
37
21
|
menu: Ref<({
|
|
38
22
|
$: ComponentInternalInstance;
|
|
39
23
|
$data: {};
|
|
@@ -108,29 +92,85 @@ declare const _default: DefineComponent<{
|
|
|
108
92
|
top: string;
|
|
109
93
|
}>;
|
|
110
94
|
contextmenuHandler(e: MouseEvent): void;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
95
|
+
stageWrap: Ref<({
|
|
96
|
+
$: ComponentInternalInstance;
|
|
97
|
+
$data: {};
|
|
98
|
+
$props: Partial<{
|
|
99
|
+
zoom: number;
|
|
100
|
+
}> & Omit<Readonly<ExtractPropTypes<{
|
|
101
|
+
width: NumberConstructor;
|
|
102
|
+
height: NumberConstructor;
|
|
103
|
+
zoom: {
|
|
104
|
+
type: NumberConstructor;
|
|
105
|
+
default: number;
|
|
106
|
+
};
|
|
107
|
+
}>> & VNodeProps & AllowedComponentProps & ComponentCustomProps, "zoom">;
|
|
108
|
+
$attrs: {
|
|
109
|
+
[x: string]: unknown;
|
|
110
|
+
};
|
|
111
|
+
$refs: {
|
|
112
|
+
[x: string]: unknown;
|
|
113
|
+
};
|
|
114
|
+
$slots: Readonly<{
|
|
115
|
+
[name: string]: Slot | undefined;
|
|
116
|
+
}>;
|
|
117
|
+
$root: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}>> | null;
|
|
118
|
+
$parent: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}>> | null;
|
|
119
|
+
$emit: (event: string, ...args: any[]) => void;
|
|
120
|
+
$el: any;
|
|
121
|
+
$options: ComponentOptionsBase<Readonly<ExtractPropTypes<{
|
|
122
|
+
width: NumberConstructor;
|
|
123
|
+
height: NumberConstructor;
|
|
124
|
+
zoom: {
|
|
125
|
+
type: NumberConstructor;
|
|
126
|
+
default: number;
|
|
127
|
+
};
|
|
128
|
+
}>>, {
|
|
129
|
+
container: Ref<HTMLDivElement | undefined>;
|
|
130
|
+
el: Ref<HTMLDivElement | undefined>;
|
|
131
|
+
style: ComputedRef<string>;
|
|
132
|
+
}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, Record<string, any>, string, {
|
|
133
|
+
zoom: number;
|
|
134
|
+
}> & {
|
|
135
|
+
beforeCreate?: ((() => void) | (() => void)[]) | undefined;
|
|
136
|
+
created?: ((() => void) | (() => void)[]) | undefined;
|
|
137
|
+
beforeMount?: ((() => void) | (() => void)[]) | undefined;
|
|
138
|
+
mounted?: ((() => void) | (() => void)[]) | undefined;
|
|
139
|
+
beforeUpdate?: ((() => void) | (() => void)[]) | undefined;
|
|
140
|
+
updated?: ((() => void) | (() => void)[]) | undefined;
|
|
141
|
+
activated?: ((() => void) | (() => void)[]) | undefined;
|
|
142
|
+
deactivated?: ((() => void) | (() => void)[]) | undefined;
|
|
143
|
+
beforeDestroy?: ((() => void) | (() => void)[]) | undefined;
|
|
144
|
+
beforeUnmount?: ((() => void) | (() => void)[]) | undefined;
|
|
145
|
+
destroyed?: ((() => void) | (() => void)[]) | undefined;
|
|
146
|
+
unmounted?: ((() => void) | (() => void)[]) | undefined;
|
|
147
|
+
renderTracked?: (((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[]) | undefined;
|
|
148
|
+
renderTriggered?: (((e: DebuggerEvent) => void) | ((e: DebuggerEvent) => void)[]) | undefined;
|
|
149
|
+
errorCaptured?: (((err: unknown, instance: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}>> | null, info: string) => boolean | void) | ((err: unknown, instance: ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}>> | null, info: string) => boolean | void)[]) | undefined;
|
|
150
|
+
};
|
|
151
|
+
$forceUpdate: () => void;
|
|
152
|
+
$nextTick: typeof nextTick;
|
|
153
|
+
$watch(source: string | Function, cb: Function, options?: WatchOptions<boolean> | undefined): WatchStopHandle;
|
|
154
|
+
} & Readonly<ExtractPropTypes<{
|
|
155
|
+
width: NumberConstructor;
|
|
156
|
+
height: NumberConstructor;
|
|
157
|
+
zoom: {
|
|
158
|
+
type: NumberConstructor;
|
|
159
|
+
default: number;
|
|
160
|
+
};
|
|
161
|
+
}>> & ShallowUnwrapRef<{
|
|
162
|
+
container: Ref<HTMLDivElement | undefined>;
|
|
163
|
+
el: Ref<HTMLDivElement | undefined>;
|
|
164
|
+
style: ComputedRef<string>;
|
|
165
|
+
}> & {} & {} & ComponentCustomProperties) | undefined>;
|
|
166
|
+
stageContainer: Ref<HTMLDivElement | undefined>;
|
|
167
|
+
stageRect: ComputedRef<StageRect | undefined>;
|
|
168
|
+
zoom: ComputedRef<number | undefined>;
|
|
114
169
|
}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("select" | "update" | "sort")[], "sort" | "select" | "update", VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<{
|
|
115
170
|
render: {
|
|
116
171
|
type: PropType<() => HTMLDivElement>;
|
|
117
172
|
};
|
|
118
173
|
runtimeUrl: StringConstructor;
|
|
119
|
-
root: {
|
|
120
|
-
type: PropType<MApp>;
|
|
121
|
-
};
|
|
122
|
-
page: {
|
|
123
|
-
type: PropType<MPage>;
|
|
124
|
-
};
|
|
125
|
-
node: {
|
|
126
|
-
type: PropType<MNode>;
|
|
127
|
-
};
|
|
128
|
-
uiSelectMode: {
|
|
129
|
-
type: BooleanConstructor;
|
|
130
|
-
};
|
|
131
|
-
zoom: {
|
|
132
|
-
type: NumberConstructor;
|
|
133
|
-
};
|
|
134
174
|
canSelect: {
|
|
135
175
|
type: PropType<(el: HTMLElement) => boolean | Promise<boolean>>;
|
|
136
176
|
default: (el: HTMLElement) => boolean;
|
|
@@ -146,7 +186,6 @@ declare const _default: DefineComponent<{
|
|
|
146
186
|
onUpdate?: ((...args: any[]) => any) | undefined;
|
|
147
187
|
onSort?: ((...args: any[]) => any) | undefined;
|
|
148
188
|
}, {
|
|
149
|
-
uiSelectMode: boolean;
|
|
150
189
|
canSelect: (el: HTMLElement) => boolean | Promise<boolean>;
|
|
151
190
|
moveableOptions: MoveableOptions | ((core?: StageCore | undefined) => MoveableOptions);
|
|
152
191
|
}>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DefineComponent, ComputedRef, ComponentOptionsMixin, VNodeProps, AllowedComponentProps, ComponentCustomProps, ExtractPropTypes, PropType } from 'vue';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MComponent, MContainer, MPage } from '@tmagic/schema';
|
|
3
3
|
import type { MoveableOptions, SortEventData } from '@tmagic/stage';
|
|
4
4
|
import StageCore from '@tmagic/stage';
|
|
5
5
|
declare const _default: DefineComponent<{
|
|
@@ -14,11 +14,7 @@ declare const _default: DefineComponent<{
|
|
|
14
14
|
type: PropType<(el: HTMLElement) => boolean | Promise<boolean>>;
|
|
15
15
|
};
|
|
16
16
|
}, {
|
|
17
|
-
uiSelectMode: ComputedRef<boolean | undefined>;
|
|
18
|
-
root: ComputedRef<MApp | undefined>;
|
|
19
17
|
page: ComputedRef<MPage | undefined>;
|
|
20
|
-
zoom: ComputedRef<number | undefined>;
|
|
21
|
-
node: ComputedRef<MNode | undefined>;
|
|
22
18
|
selectHandler(el: HTMLElement): void;
|
|
23
19
|
updateNodeHandler(node: MComponent | MContainer | MPage): void;
|
|
24
20
|
sortNodeHandler(ev: SortEventData): void;
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { UiState } from '../type';
|
|
1
|
+
import type { UiState } from '../type';
|
|
2
2
|
import BaseService from './BaseService';
|
|
3
3
|
declare const state: {
|
|
4
4
|
uiSelectMode: boolean;
|
|
5
5
|
showSrc: boolean;
|
|
6
6
|
zoom: number;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
stageContainerRect: {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
};
|
|
11
|
+
stageRect: {
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
9
14
|
};
|
|
10
15
|
columnWidth: {
|
|
11
16
|
left: number;
|
|
@@ -20,6 +25,8 @@ declare class Ui extends BaseService {
|
|
|
20
25
|
set<T = any>(name: keyof UiState, value: T): void;
|
|
21
26
|
get<T>(name: keyof typeof state): T;
|
|
22
27
|
private setColumnWidth;
|
|
28
|
+
private setStageRect;
|
|
29
|
+
private calcZoom;
|
|
23
30
|
}
|
|
24
31
|
export declare type UiService = Ui;
|
|
25
32
|
declare const _default: Ui;
|
package/dist/types/src/type.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Component } from 'vue';
|
|
2
|
-
import { FormConfig } from '@tmagic/form';
|
|
3
|
-
import { Id, MApp, MContainer, MNode, MPage } from '@tmagic/schema';
|
|
4
|
-
import StageCore from '@tmagic/stage';
|
|
1
|
+
import type { Component } from 'vue';
|
|
2
|
+
import type { FormConfig } from '@tmagic/form';
|
|
3
|
+
import type { Id, MApp, MContainer, MNode, MPage } from '@tmagic/schema';
|
|
4
|
+
import type StageCore from '@tmagic/stage';
|
|
5
5
|
import type { ComponentListService } from './services/componentList';
|
|
6
6
|
import type { EditorService } from './services/editor';
|
|
7
7
|
import type { EventsService } from './services/events';
|
|
@@ -46,6 +46,10 @@ export interface GetColumnWidth {
|
|
|
46
46
|
center: number;
|
|
47
47
|
right: number;
|
|
48
48
|
}
|
|
49
|
+
export interface StageRect {
|
|
50
|
+
width: number;
|
|
51
|
+
height: number;
|
|
52
|
+
}
|
|
49
53
|
export interface UiState {
|
|
50
54
|
/** 当前点击画布是否触发选中,true: 不触发,false: 触发,默认为false */
|
|
51
55
|
uiSelectMode: boolean;
|
|
@@ -53,8 +57,10 @@ export interface UiState {
|
|
|
53
57
|
showSrc: boolean;
|
|
54
58
|
/** 画布显示放大倍数,默认为 1 */
|
|
55
59
|
zoom: number;
|
|
56
|
-
/**
|
|
57
|
-
|
|
60
|
+
/** 画布容器的宽高 */
|
|
61
|
+
stageContainerRect: StageRect;
|
|
62
|
+
/** 画布顶层div的宽高,可用于改变画布的大小 */
|
|
63
|
+
stageRect: StageRect;
|
|
58
64
|
/** 编辑器列布局每一列的宽度,分为左中右三列 */
|
|
59
65
|
columnWidth: GetColumnWidth;
|
|
60
66
|
/** 是否显示画布参考线,true: 显示,false: 不显示,默认为true */
|
|
@@ -181,3 +187,6 @@ export declare enum Layout {
|
|
|
181
187
|
RELATIVE = "relative",
|
|
182
188
|
ABSOLUTE = "absolute"
|
|
183
189
|
}
|
|
190
|
+
export declare enum Keys {
|
|
191
|
+
ESCAPE = "Space"
|
|
192
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
interface ScrollViewerOptions {
|
|
2
|
+
container: HTMLDivElement;
|
|
3
|
+
target: HTMLDivElement;
|
|
4
|
+
zoom: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class ScrollViewer {
|
|
7
|
+
private enter;
|
|
8
|
+
private targetEnter;
|
|
9
|
+
private keydown;
|
|
10
|
+
private container;
|
|
11
|
+
private target;
|
|
12
|
+
private zoom;
|
|
13
|
+
private scrollLeft;
|
|
14
|
+
private scrollTop;
|
|
15
|
+
private x;
|
|
16
|
+
private y;
|
|
17
|
+
private resizeObserver;
|
|
18
|
+
constructor(options: ScrollViewerOptions);
|
|
19
|
+
destroy(): void;
|
|
20
|
+
setZoom(zoom: number): void;
|
|
21
|
+
private scroll;
|
|
22
|
+
private removeHandler;
|
|
23
|
+
private wheelHandler;
|
|
24
|
+
private mouseEnterHandler;
|
|
25
|
+
private mouseLeaveHandler;
|
|
26
|
+
private targetMouseEnterHandler;
|
|
27
|
+
private targetMouseLeaveHandler;
|
|
28
|
+
private mousedownHandler;
|
|
29
|
+
private mouseupHandler;
|
|
30
|
+
private mousemoveHandler;
|
|
31
|
+
private keydownHandler;
|
|
32
|
+
private keyupHandler;
|
|
33
|
+
private setScrollOffset;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.0-beta.
|
|
2
|
+
"version": "1.0.0-beta.4",
|
|
3
3
|
"name": "@tmagic/editor",
|
|
4
|
-
"
|
|
5
|
-
"
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"main": "dist/tmagic-editor.umd.js",
|
|
6
|
+
"module": "dist/tmagic-editor.es.js",
|
|
6
7
|
"style": "dist/style.css",
|
|
7
8
|
"types": "dist/types/src/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
|
-
"import": "./dist/
|
|
11
|
-
"require": "./dist/
|
|
11
|
+
"import": "./dist/tmagic-editor.es.js",
|
|
12
|
+
"require": "./dist/tmagic-editor.umd.js"
|
|
12
13
|
},
|
|
13
14
|
"./dist/style.css": {
|
|
14
15
|
"import": "./dist/style.css",
|
|
@@ -27,15 +28,16 @@
|
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
30
|
"@element-plus/icons": "0.0.11",
|
|
30
|
-
"@tmagic/core": "^1.0.0-beta.
|
|
31
|
-
"@tmagic/form": "^1.0.0-beta.
|
|
32
|
-
"@tmagic/schema": "^1.0.0-beta.
|
|
33
|
-
"@tmagic/stage": "^1.0.0-beta.
|
|
34
|
-
"@tmagic/utils": "^1.0.0-beta.
|
|
31
|
+
"@tmagic/core": "^1.0.0-beta.4",
|
|
32
|
+
"@tmagic/form": "^1.0.0-beta.4",
|
|
33
|
+
"@tmagic/schema": "^1.0.0-beta.4",
|
|
34
|
+
"@tmagic/stage": "^1.0.0-beta.4",
|
|
35
|
+
"@tmagic/utils": "^1.0.0-beta.4",
|
|
35
36
|
"color": "^3.1.3",
|
|
36
37
|
"element-plus": "^2.0.2",
|
|
37
38
|
"events": "^3.3.0",
|
|
38
39
|
"lodash-es": "^4.17.21",
|
|
40
|
+
"monaco-editor": "^0.32.1",
|
|
39
41
|
"serialize-javascript": "^6.0.0",
|
|
40
42
|
"vue": "^3.2.0"
|
|
41
43
|
},
|
package/src/Editor.vue
CHANGED
|
@@ -55,7 +55,7 @@ import eventsService from '@editor/services/events';
|
|
|
55
55
|
import historyService from '@editor/services/history';
|
|
56
56
|
import propsService from '@editor/services/props';
|
|
57
57
|
import uiService from '@editor/services/ui';
|
|
58
|
-
import type { ComponentGroup, MenuBarData, Services, SideBarData } from '@editor/type';
|
|
58
|
+
import type { ComponentGroup, MenuBarData, Services, SideBarData, StageRect } from '@editor/type';
|
|
59
59
|
|
|
60
60
|
export default defineComponent({
|
|
61
61
|
name: 'm-editor',
|
|
@@ -133,8 +133,8 @@ export default defineComponent({
|
|
|
133
133
|
type: Function as PropType<(el: HTMLElement) => boolean | Promise<boolean>>,
|
|
134
134
|
},
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
type: [String, Object] as PropType<
|
|
136
|
+
stageRect: {
|
|
137
|
+
type: [String, Object] as PropType<StageRect>,
|
|
138
138
|
},
|
|
139
139
|
},
|
|
140
140
|
|
|
@@ -208,8 +208,8 @@ export default defineComponent({
|
|
|
208
208
|
);
|
|
209
209
|
|
|
210
210
|
watch(
|
|
211
|
-
() => props.
|
|
212
|
-
(
|
|
211
|
+
() => props.stageRect,
|
|
212
|
+
(stageRect) => stageRect && uiService.set('stageRect', stageRect),
|
|
213
213
|
{
|
|
214
214
|
immediate: true,
|
|
215
215
|
},
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="m-editor-scroll-viewer-container" ref="container">
|
|
3
|
+
<div ref="el" :style="style">
|
|
4
|
+
<slot></slot>
|
|
5
|
+
</div>
|
|
6
|
+
</div>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
import { computed, defineComponent, onMounted, onUnmounted, ref, watch } from 'vue';
|
|
11
|
+
|
|
12
|
+
import { ScrollViewer } from '@editor/utils/scroll-viewer';
|
|
13
|
+
|
|
14
|
+
export default defineComponent({
|
|
15
|
+
name: 'm-editor-scroll-viewer',
|
|
16
|
+
|
|
17
|
+
props: {
|
|
18
|
+
width: Number,
|
|
19
|
+
height: Number,
|
|
20
|
+
zoom: {
|
|
21
|
+
type: Number,
|
|
22
|
+
default: 1,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
setup(props) {
|
|
27
|
+
const container = ref<HTMLDivElement>();
|
|
28
|
+
const el = ref<HTMLDivElement>();
|
|
29
|
+
let scrollViewer: ScrollViewer;
|
|
30
|
+
|
|
31
|
+
onMounted(() => {
|
|
32
|
+
if (!container.value || !el.value) return;
|
|
33
|
+
scrollViewer = new ScrollViewer({
|
|
34
|
+
container: container.value,
|
|
35
|
+
target: el.value,
|
|
36
|
+
zoom: props.zoom,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
onUnmounted(() => {
|
|
41
|
+
scrollViewer.destroy();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
watch(
|
|
45
|
+
() => props.zoom,
|
|
46
|
+
() => {
|
|
47
|
+
scrollViewer.setZoom(props.zoom);
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
container,
|
|
53
|
+
el,
|
|
54
|
+
|
|
55
|
+
style: computed(
|
|
56
|
+
() => `
|
|
57
|
+
width: ${props.width}px;
|
|
58
|
+
height: ${props.height}px;
|
|
59
|
+
position: absolute;
|
|
60
|
+
`,
|
|
61
|
+
),
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
@@ -4,28 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
6
|
import { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue';
|
|
7
|
+
import * as monaco from 'monaco-editor';
|
|
7
8
|
import serialize from 'serialize-javascript';
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const initEditor = () => {
|
|
12
|
-
if ((globalThis as any).monaco) {
|
|
13
|
-
Promise.resolve((globalThis as any).monaco);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return asyncLoadJs(`https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.26.1/min/vs/loader.min.js`).then(() => {
|
|
17
|
-
(globalThis as any).require.config({
|
|
18
|
-
paths: { vs: `https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.26.1/min/vs` },
|
|
19
|
-
});
|
|
20
|
-
return new Promise((resolve) => {
|
|
21
|
-
(globalThis as any).require(['vs/editor/editor.main'], () => {
|
|
22
|
-
resolve((globalThis as any).monaco);
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const toString = (v: any, language: string): string => {
|
|
10
|
+
const toString = (v: string | any, language: string): string => {
|
|
29
11
|
let value = '';
|
|
30
12
|
if (typeof v !== 'string') {
|
|
31
13
|
value = serialize(v, {
|
|
@@ -64,60 +46,63 @@ export default defineComponent({
|
|
|
64
46
|
},
|
|
65
47
|
},
|
|
66
48
|
|
|
67
|
-
emits: ['
|
|
49
|
+
emits: ['initd', 'save'],
|
|
68
50
|
|
|
69
51
|
setup(props, { emit }) {
|
|
70
|
-
let vsEditor:
|
|
52
|
+
let vsEditor: monaco.editor.IStandaloneCodeEditor | null = null;
|
|
53
|
+
let vsDiffEditor: monaco.editor.IStandaloneDiffEditor | null = null;
|
|
71
54
|
const values = ref('');
|
|
72
55
|
const loading = ref(false);
|
|
73
56
|
const codeEditor = ref<HTMLDivElement>();
|
|
74
57
|
|
|
75
|
-
const setEditorValue = (v: any, m: any) => {
|
|
58
|
+
const setEditorValue = (v: string | any, m: string | any) => {
|
|
76
59
|
values.value = toString(v, props.language);
|
|
77
60
|
|
|
78
61
|
if (props.type === 'diff') {
|
|
79
|
-
const originalModel =
|
|
80
|
-
const modifiedModel =
|
|
81
|
-
toString(m, props.language),
|
|
82
|
-
'text/javascript',
|
|
83
|
-
);
|
|
62
|
+
const originalModel = monaco.editor.createModel(values.value, 'text/javascript');
|
|
63
|
+
const modifiedModel = monaco.editor.createModel(toString(m, props.language), 'text/javascript');
|
|
84
64
|
|
|
85
|
-
return
|
|
65
|
+
return vsDiffEditor?.setModel({
|
|
86
66
|
original: originalModel,
|
|
87
67
|
modified: modifiedModel,
|
|
88
68
|
});
|
|
89
69
|
}
|
|
90
70
|
|
|
91
|
-
return vsEditor
|
|
71
|
+
return vsEditor?.setValue(values.value);
|
|
92
72
|
};
|
|
93
73
|
|
|
94
74
|
const resizeHandler = () => {
|
|
95
75
|
vsEditor?.layout();
|
|
76
|
+
vsDiffEditor?.layout();
|
|
96
77
|
};
|
|
97
78
|
|
|
98
|
-
const getEditorValue = () =>
|
|
79
|
+
const getEditorValue = () =>
|
|
80
|
+
props.type === 'diff' ? vsDiffEditor?.getModifiedEditor().getValue() : vsEditor?.getValue();
|
|
99
81
|
|
|
100
82
|
const init = async () => {
|
|
101
83
|
if (!codeEditor.value) return;
|
|
102
84
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
85
|
+
const options = {
|
|
86
|
+
value: values.value,
|
|
87
|
+
language: props.language,
|
|
88
|
+
tabSize: 2,
|
|
89
|
+
theme: 'vs-dark',
|
|
90
|
+
fontFamily: 'dm, Menlo, Monaco, "Courier New", monospace',
|
|
91
|
+
fontSize: 15,
|
|
92
|
+
formatOnPaste: true,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (props.type === 'diff') {
|
|
96
|
+
vsDiffEditor = monaco.editor.createDiffEditor(codeEditor.value, options);
|
|
97
|
+
} else {
|
|
98
|
+
vsEditor = monaco.editor.create(codeEditor.value, options);
|
|
99
|
+
}
|
|
115
100
|
|
|
116
101
|
setEditorValue(props.initValues, props.modifiedValues);
|
|
117
102
|
|
|
118
103
|
loading.value = false;
|
|
119
104
|
|
|
120
|
-
emit('
|
|
105
|
+
emit('initd', vsEditor);
|
|
121
106
|
|
|
122
107
|
codeEditor.value.addEventListener('keydown', (e) => {
|
|
123
108
|
if (e.keyCode === 83 && (navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey)) {
|
|
@@ -127,7 +112,7 @@ export default defineComponent({
|
|
|
127
112
|
});
|
|
128
113
|
|
|
129
114
|
if (props.type !== 'diff') {
|
|
130
|
-
vsEditor
|
|
115
|
+
vsEditor?.onDidBlurEditorWidget(() => {
|
|
131
116
|
emit('save', getEditorValue());
|
|
132
117
|
});
|
|
133
118
|
}
|
|
@@ -138,7 +123,7 @@ export default defineComponent({
|
|
|
138
123
|
watch(
|
|
139
124
|
() => props.initValues,
|
|
140
125
|
(v, preV) => {
|
|
141
|
-
if (
|
|
126
|
+
if (v !== preV) {
|
|
142
127
|
setEditorValue(props.initValues, props.modifiedValues);
|
|
143
128
|
}
|
|
144
129
|
},
|
|
@@ -151,17 +136,7 @@ export default defineComponent({
|
|
|
151
136
|
onMounted(async () => {
|
|
152
137
|
loading.value = true;
|
|
153
138
|
|
|
154
|
-
|
|
155
|
-
if (!(globalThis as any).monaco) {
|
|
156
|
-
const interval = setInterval(() => {
|
|
157
|
-
if ((globalThis as any).monaco) {
|
|
158
|
-
clearInterval(interval);
|
|
159
|
-
init();
|
|
160
|
-
}
|
|
161
|
-
}, 300);
|
|
162
|
-
} else {
|
|
163
|
-
init();
|
|
164
|
-
}
|
|
139
|
+
init();
|
|
165
140
|
});
|
|
166
141
|
|
|
167
142
|
onUnmounted(() => {
|
|
@@ -174,13 +149,14 @@ export default defineComponent({
|
|
|
174
149
|
codeEditor,
|
|
175
150
|
|
|
176
151
|
getEditor() {
|
|
177
|
-
return vsEditor;
|
|
152
|
+
return vsEditor || vsDiffEditor;
|
|
178
153
|
},
|
|
179
154
|
|
|
180
155
|
setEditorValue,
|
|
181
156
|
|
|
182
157
|
focus() {
|
|
183
|
-
vsEditor
|
|
158
|
+
vsEditor?.focus();
|
|
159
|
+
vsDiffEditor?.focus();
|
|
184
160
|
},
|
|
185
161
|
};
|
|
186
162
|
},
|