@tmagic/editor 1.3.0-beta.5 → 1.3.0-beta.7

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 (40) hide show
  1. package/dist/style.css +57 -56
  2. package/dist/tmagic-editor.js +607 -428
  3. package/dist/tmagic-editor.js.map +1 -1
  4. package/dist/tmagic-editor.umd.cjs +626 -446
  5. package/dist/tmagic-editor.umd.cjs.map +1 -1
  6. package/package.json +11 -10
  7. package/src/Editor.vue +8 -0
  8. package/src/components/Tree.vue +66 -0
  9. package/src/components/TreeNode.vue +142 -0
  10. package/src/fields/KeyValue.vue +1 -0
  11. package/src/layouts/CodeEditor.vue +1 -0
  12. package/src/layouts/sidebar/Sidebar.vue +13 -0
  13. package/src/layouts/sidebar/data-source/DataSourceList.vue +4 -2
  14. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +8 -2
  15. package/src/layouts/sidebar/layer/LayerPanel.vue +40 -31
  16. package/src/layouts/sidebar/layer/use-click.ts +105 -0
  17. package/src/layouts/sidebar/layer/use-drag.ts +1 -1
  18. package/src/layouts/sidebar/layer/use-filter.ts +1 -12
  19. package/src/layouts/sidebar/layer/use-keybinding.ts +6 -2
  20. package/src/layouts/sidebar/layer/use-node-status.ts +4 -2
  21. package/src/services/dataSource.ts +2 -2
  22. package/src/theme/layer-panel.scss +2 -74
  23. package/src/theme/theme.scss +1 -0
  24. package/src/theme/tree.scss +72 -0
  25. package/src/type.ts +16 -1
  26. package/src/utils/data-source/index.ts +117 -34
  27. package/src/utils/tree.ts +15 -0
  28. package/types/{layouts/sidebar/layer/LayerNode.vue.d.ts → components/Tree.vue.d.ts} +19 -17
  29. package/types/components/TreeNode.vue.d.ts +47 -0
  30. package/types/layouts/CodeEditor.vue.d.ts +4 -1
  31. package/types/layouts/sidebar/data-source/DataSourceList.vue.d.ts +2 -6
  32. package/types/layouts/sidebar/data-source/DataSourceListPanel.vue.d.ts +7 -1
  33. package/types/layouts/sidebar/layer/LayerPanel.vue.d.ts +1 -1
  34. package/types/layouts/sidebar/layer/use-click.d.ts +106 -0
  35. package/types/layouts/sidebar/layer/use-filter.d.ts +0 -1
  36. package/types/layouts/sidebar/layer/use-keybinding.d.ts +2 -1
  37. package/types/type.d.ts +20 -1
  38. package/types/utils/data-source/index.d.ts +1 -0
  39. package/types/utils/tree.d.ts +3 -0
  40. package/src/layouts/sidebar/layer/LayerNode.vue +0 -208
@@ -7,7 +7,7 @@ import type { DataSourceSchema } from '@tmagic/schema';
7
7
  import { guid } from '@tmagic/utils';
8
8
 
9
9
  import type { DatasourceTypeOption } from '@editor/type';
10
- import { getFormConfig } from '@editor/utils/data-source';
10
+ import { getFormConfig, getFormValue } from '@editor/utils/data-source';
11
11
 
12
12
  import BaseService from './BaseService';
13
13
 
@@ -50,7 +50,7 @@ class DataSource extends BaseService {
50
50
  }
51
51
 
52
52
  public getFormValue(type = 'base') {
53
- return this.get('values')[type];
53
+ return getFormValue(type, this.get('values')[type]);
54
54
  }
55
55
 
56
56
  public setFormValue(type: string, value: Partial<DataSourceSchema>) {
@@ -1,79 +1,7 @@
1
- .magic-editor-layer-panel {
2
- $--node-height: 22px;
3
-
1
+ .m-editor-layer-panel {
4
2
  background: $--sidebar-content-background-color;
5
3
 
6
- .magic-editor-layer-tree {
4
+ .m-editor-tree {
7
5
  padding-top: 48px;
8
- background-color: $--sidebar-content-background-color;
9
- color: $--font-color;
10
- font-size: 13px;
11
-
12
- .magic-editor-layer-node {
13
- cursor: pointer;
14
- white-space: nowrap;
15
-
16
- .layer-node {
17
- display: flex;
18
- align-items: center;
19
-
20
- &:hover {
21
- background-color: $--hover-color;
22
- color: $--font-color;
23
- }
24
-
25
- &.selected {
26
- background-color: $--theme-color;
27
- color: $--hover-color;
28
- }
29
-
30
- &.drag-inner {
31
- .layer-node-content {
32
- background-color: rgba($color: $--theme-color, $alpha: 0.5);
33
- color: $--hover-color;
34
- }
35
- }
36
-
37
- &.drag-before {
38
- .layer-node-content {
39
- border-top-color: rgba($color: $--theme-color, $alpha: 0.5);
40
- }
41
- }
42
-
43
- &.drag-after {
44
- .layer-node-content {
45
- border-bottom-color: rgba($color: $--theme-color, $alpha: 0.5);
46
- }
47
- }
48
-
49
- .expand-icon {
50
- padding: 4px;
51
- box-sizing: content-box;
52
- font-size: 14px;
53
- }
54
-
55
- .layer-node-content {
56
- display: flex;
57
- flex: 1;
58
- justify-content: space-between;
59
- height: $--node-height;
60
- border-top: 2px solid transparent;
61
- border-bottom: 2px solid transparent;
62
- .layer-node-label {
63
- line-height: $--node-height;
64
- flex: 1;
65
- width: 100px;
66
- overflow: hidden;
67
- text-overflow: ellipsis;
68
- }
69
- }
70
-
71
- .layer-node-tool {
72
- margin-right: 15px;
73
- display: flex;
74
- align-items: center;
75
- }
76
- }
77
- }
78
6
  }
79
7
  }
@@ -22,3 +22,4 @@
22
22
  @import "./data-source-methods.scss";
23
23
  @import "./data-source-input.scss";
24
24
  @import "./key-value.scss";
25
+ @import "./tree.scss";
@@ -0,0 +1,72 @@
1
+ .m-editor-tree {
2
+ $--node-height: 22px;
3
+ color: $--font-color;
4
+ font-size: 13px;
5
+
6
+ .m-editor-tree-node {
7
+ cursor: pointer;
8
+ white-space: nowrap;
9
+
10
+ .tree-node {
11
+ display: flex;
12
+ align-items: center;
13
+
14
+ &:hover {
15
+ background-color: $--hover-color;
16
+ color: $--font-color;
17
+ }
18
+
19
+ &.selected {
20
+ background-color: $--theme-color;
21
+ color: $--hover-color;
22
+ }
23
+
24
+ &.drag-inner {
25
+ .tree-node-content {
26
+ background-color: rgba($color: $--theme-color, $alpha: 0.5);
27
+ color: $--hover-color;
28
+ }
29
+ }
30
+
31
+ &.drag-before {
32
+ .tree-node-content {
33
+ border-top-color: rgba($color: $--theme-color, $alpha: 0.5);
34
+ }
35
+ }
36
+
37
+ &.drag-after {
38
+ .tree-node-content {
39
+ border-bottom-color: rgba($color: $--theme-color, $alpha: 0.5);
40
+ }
41
+ }
42
+
43
+ .expand-icon {
44
+ padding: 4px;
45
+ box-sizing: content-box;
46
+ font-size: 14px;
47
+ }
48
+
49
+ .tree-node-content {
50
+ display: flex;
51
+ flex: 1;
52
+ justify-content: space-between;
53
+ height: $--node-height;
54
+ border-top: 2px solid transparent;
55
+ border-bottom: 2px solid transparent;
56
+ .tree-node-label {
57
+ line-height: $--node-height;
58
+ flex: 1;
59
+ width: 100px;
60
+ overflow: hidden;
61
+ text-overflow: ellipsis;
62
+ }
63
+ }
64
+
65
+ .tree-node-tool {
66
+ margin-right: 15px;
67
+ display: flex;
68
+ align-items: center;
69
+ }
70
+ }
71
+ }
72
+ }
package/src/type.ts CHANGED
@@ -75,19 +75,25 @@ export interface CodeBlockListSlots {
75
75
  'code-block-panel-tool'(props: { id: Id; data: CodeBlockContent }): any;
76
76
  }
77
77
 
78
+ export interface DataSourceListSlots {
79
+ 'data-source-panel-tool'(props: { data: any }): any;
80
+ }
81
+
78
82
  export interface LayerNodeSlots {
79
83
  'layer-node-content'(props: { data: MNode }): any;
80
84
  }
81
85
 
82
86
  export interface LayerPanelSlots extends LayerNodeSlots {
83
87
  'layer-panel-header'(props: {}): any;
88
+ 'layer-node-tool'(props: { data: MNode }): any;
89
+ 'layer-node-content'(props: { data: MNode }): any;
84
90
  }
85
91
 
86
92
  export interface PropsPanelSlots {
87
93
  'props-panel-header'(props: {}): any;
88
94
  }
89
95
 
90
- export type SidebarSlots = LayerPanelSlots & CodeBlockListPanelSlots & ComponentListPanelSlots;
96
+ export type SidebarSlots = LayerPanelSlots & CodeBlockListPanelSlots & ComponentListPanelSlots & DataSourceListSlots;
91
97
 
92
98
  export type BeforeAdd = (config: MNode, parent: MContainer) => Promise<MNode> | MNode;
93
99
  export type GetConfig = (config: FormConfig) => Promise<FormConfig> | FormConfig;
@@ -595,6 +601,8 @@ export interface LayerNodeStatus {
595
601
  expand: boolean;
596
602
  /** 选中 */
597
603
  selected: boolean;
604
+ /** 是否可拖拽 */
605
+ draggable: boolean;
598
606
  }
599
607
 
600
608
  /** 拖拽类型 */
@@ -607,3 +615,10 @@ export enum DragType {
607
615
 
608
616
  /** 当uiService.get('uiSelectMode')为true,点击组件(包括任何形式,组件树/画布)时触发的事件名 */
609
617
  export const UI_SELECT_MODE_EVENT_NAME = 'ui-select';
618
+
619
+ export interface TreeNodeData {
620
+ id: Id;
621
+ name?: string;
622
+ items?: TreeNodeData[];
623
+ [key: string]: any;
624
+ }
@@ -1,4 +1,4 @@
1
- import { FormConfig } from '@tmagic/form';
1
+ import { FormConfig, FormState } from '@tmagic/form';
2
2
  import { DataSchema, DataSourceSchema } from '@tmagic/schema';
3
3
 
4
4
  import BaseFormConfig from './formConfigs/base';
@@ -8,47 +8,72 @@ const fillConfig = (config: FormConfig): FormConfig => [
8
8
  ...BaseFormConfig(),
9
9
  ...config,
10
10
  {
11
- type: 'panel',
12
- title: '数据定义',
11
+ type: 'tab',
13
12
  items: [
14
13
  {
15
- name: 'fields',
16
- type: 'data-source-fields',
17
- defaultValue: () => [],
14
+ title: '数据定义',
15
+ items: [
16
+ {
17
+ name: 'fields',
18
+ type: 'data-source-fields',
19
+ defaultValue: () => [],
20
+ },
21
+ ],
18
22
  },
19
- ],
20
- },
21
- {
22
- type: 'panel',
23
- title: '方法定义',
24
- items: [
25
23
  {
26
- name: 'methods',
27
- type: 'data-source-methods',
28
- defaultValue: () => [],
24
+ title: '方法定义',
25
+ items: [
26
+ {
27
+ name: 'methods',
28
+ type: 'data-source-methods',
29
+ defaultValue: () => [],
30
+ },
31
+ ],
29
32
  },
30
- ],
31
- },
32
- {
33
- type: 'panel',
34
- title: '事件配置',
35
- display: false,
36
- items: [
37
33
  {
38
- name: 'events',
39
- src: 'datasource',
40
- type: 'event-select',
34
+ title: '事件配置',
35
+ display: false,
36
+ items: [
37
+ {
38
+ name: 'events',
39
+ src: 'datasource',
40
+ type: 'event-select',
41
+ },
42
+ ],
41
43
  },
42
- ],
43
- },
44
- {
45
- type: 'panel',
46
- title: 'mock数据',
47
- items: [
48
44
  {
49
- name: 'mocks',
50
- type: 'data-source-mocks',
51
- defaultValue: () => [],
45
+ title: 'mock数据',
46
+ items: [
47
+ {
48
+ name: 'mocks',
49
+ type: 'data-source-mocks',
50
+ defaultValue: () => [],
51
+ },
52
+ ],
53
+ },
54
+ {
55
+ title: '请求参数裁剪',
56
+ display: (formState: FormState, { model }: any) => model.type === 'http',
57
+ items: [
58
+ {
59
+ name: 'beforeRequest',
60
+ type: 'vs-code',
61
+ parse: true,
62
+ height: '600px',
63
+ },
64
+ ],
65
+ },
66
+ {
67
+ title: '响应数据裁剪',
68
+ display: (formState: FormState, { model }: any) => model.type === 'http',
69
+ items: [
70
+ {
71
+ name: 'afterResponse',
72
+ type: 'vs-code',
73
+ parse: true,
74
+ height: '600px',
75
+ },
76
+ ],
52
77
  },
53
78
  ],
54
79
  },
@@ -65,6 +90,64 @@ export const getFormConfig = (type: string, configs: Record<string, FormConfig>)
65
90
  }
66
91
  };
67
92
 
93
+ export const getFormValue = (type: string, values: Partial<DataSourceSchema>): Partial<DataSourceSchema> => {
94
+ if (type !== 'http') {
95
+ return values;
96
+ }
97
+
98
+ return {
99
+ beforeRequest: `(options, context) => {
100
+ /**
101
+ * 用户可以直接编写函数,在原始接口调用之前,会运行该函数,将这个函数的返回值作为该数据源接口的入参
102
+ *
103
+ * options: HttpOptions
104
+ *
105
+ * interface HttpOptions {
106
+ * // 请求链接
107
+ * url: string;
108
+ * // query参数
109
+ * params?: Record<string, string>;
110
+ * // body数据
111
+ * data?: Record<string, any>;
112
+ * // 请求头
113
+ * headers?: Record<string, string>;
114
+ * // 请求方法 GET/POST
115
+ * method?: Method;
116
+ * }
117
+ *
118
+ * context:上下文对象
119
+ *
120
+ * interface Content {
121
+ * app: AppCore;
122
+ * dataSource: HttpDataSource;
123
+ * }
124
+ *
125
+ * return: HttpOptions
126
+ */
127
+
128
+ // 此处的返回值会作为这个接口的入参
129
+ return options;
130
+ }`,
131
+ afterResponse: `(response, context) => {
132
+ /**
133
+ * 用户可以直接编写函数,在原始接口返回之后,会运行该函数,将这个函数的返回值作为该数据源接口的返回
134
+
135
+ * context:上下文对象
136
+ *
137
+ * interface Content {
138
+ * app: AppCore;
139
+ * dataSource: HttpDataSource;
140
+ * }
141
+ *
142
+ */
143
+
144
+ // 此处的返回值会作为这个接口的返回值
145
+ return response;
146
+ }`,
147
+ ...values,
148
+ };
149
+ };
150
+
68
151
  export const getDisplayField = (dataSources: DataSourceSchema[], key: string) => {
69
152
  const displayState: { value: string; type: 'var' | 'text' }[] = [];
70
153
 
@@ -0,0 +1,15 @@
1
+ import type { Id } from '@tmagic/schema';
2
+ import { getKeys } from '@tmagic/utils';
3
+
4
+ import type { LayerNodeStatus } from '@editor/type';
5
+
6
+ export const updateStatus = (nodeStatusMap: Map<Id, LayerNodeStatus>, id: Id, status: Partial<LayerNodeStatus>) => {
7
+ const nodeStatus = nodeStatusMap.get(id);
8
+
9
+ if (!nodeStatus) return;
10
+ getKeys(status).forEach((key) => {
11
+ if (nodeStatus[key] !== undefined && status[key] !== undefined) {
12
+ nodeStatus[key] = Boolean(status[key]);
13
+ }
14
+ });
15
+ };
@@ -1,30 +1,32 @@
1
- import type { MContainer, MNode } from '@tmagic/schema';
2
- import { LayerNodeSlots } from '../../../type';
1
+ import type { Id } from '@tmagic/schema';
2
+ import type { LayerNodeStatus, TreeNodeData } from '../type';
3
3
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
4
- data: MNode;
5
- parent?: MContainer | undefined;
4
+ data: TreeNodeData[];
5
+ nodeStatusMap: Map<Id, LayerNodeStatus>;
6
6
  indent?: number | undefined;
7
- filterText?: string | undefined;
8
- isCtrlKeyDown?: boolean | undefined;
7
+ emptyText?: string | undefined;
9
8
  }>, {
10
9
  indent: number;
11
- filterText: string;
12
- isCtrlKeyDown: boolean;
10
+ emptyText: string;
13
11
  }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
14
- data: MNode;
15
- parent?: MContainer | undefined;
12
+ data: TreeNodeData[];
13
+ nodeStatusMap: Map<Id, LayerNodeStatus>;
16
14
  indent?: number | undefined;
17
- filterText?: string | undefined;
18
- isCtrlKeyDown?: boolean | undefined;
15
+ emptyText?: string | undefined;
19
16
  }>, {
20
17
  indent: number;
21
- filterText: string;
22
- isCtrlKeyDown: boolean;
18
+ emptyText: string;
23
19
  }>>>, {
24
- filterText: string;
20
+ emptyText: string;
25
21
  indent: number;
26
- isCtrlKeyDown: boolean;
27
- }, {}>, LayerNodeSlots>;
22
+ }, {}>, {
23
+ 'tree-node-content'(props: {
24
+ data: TreeNodeData;
25
+ }): any;
26
+ 'tree-node-tool'(props: {
27
+ data: TreeNodeData;
28
+ }): any;
29
+ }>;
28
30
  export default _default;
29
31
  type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
30
32
  type __VLS_TypePropsToRuntimeProps<T> = {
@@ -0,0 +1,47 @@
1
+ import type { Id } from '@tmagic/schema';
2
+ import type { LayerNodeStatus, TreeNodeData } from '../type';
3
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
4
+ data: TreeNodeData;
5
+ nodeStatusMap: Map<Id, LayerNodeStatus>;
6
+ indent?: number | undefined;
7
+ }>, {
8
+ indent: number;
9
+ }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
10
+ data: TreeNodeData;
11
+ nodeStatusMap: Map<Id, LayerNodeStatus>;
12
+ indent?: number | undefined;
13
+ }>, {
14
+ indent: number;
15
+ }>>>, {
16
+ indent: number;
17
+ }, {}>, {
18
+ 'tree-node-tool'(props: {
19
+ data: TreeNodeData;
20
+ }): any;
21
+ 'tree-node-content'(props: {
22
+ data: TreeNodeData;
23
+ }): any;
24
+ }>;
25
+ export default _default;
26
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
27
+ type __VLS_TypePropsToRuntimeProps<T> = {
28
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
29
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
30
+ } : {
31
+ type: import('vue').PropType<T[K]>;
32
+ required: true;
33
+ };
34
+ };
35
+ type __VLS_WithDefaults<P, D> = {
36
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
37
+ default: D[K];
38
+ }> : P[K];
39
+ };
40
+ type __VLS_WithTemplateSlots<T, S> = T & {
41
+ new (): {
42
+ $slots: S;
43
+ };
44
+ };
45
+ type __VLS_Prettify<T> = {
46
+ [K in keyof T]: T[K];
47
+ } & {};
@@ -11,6 +11,7 @@ declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_T
11
11
  autoSave?: boolean | undefined;
12
12
  parse?: boolean | undefined;
13
13
  }>, {
14
+ initValues: string;
14
15
  autoSave: boolean;
15
16
  language: string;
16
17
  options: () => {
@@ -37,6 +38,7 @@ declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_T
37
38
  autoSave?: boolean | undefined;
38
39
  parse?: boolean | undefined;
39
40
  }>, {
41
+ initValues: string;
40
42
  autoSave: boolean;
41
43
  language: string;
42
44
  options: () => {
@@ -50,9 +52,10 @@ declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_T
50
52
  options: {
51
53
  [key: string]: any;
52
54
  };
55
+ parse: boolean;
56
+ initValues: any;
53
57
  language: string;
54
58
  autoSave: boolean;
55
- parse: boolean;
56
59
  }, {}>;
57
60
  export default _default;
58
61
  type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
@@ -1,11 +1,7 @@
1
+ import { type DataSourceListSlots } from '../../../type';
1
2
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {
2
3
  filter(val: string): void;
3
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, {
4
- "data-source-panel-tool"?(_: {
5
- id: any;
6
- data: any;
7
- }): any;
8
- }>;
4
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, DataSourceListSlots>;
9
5
  export default _default;
10
6
  type __VLS_WithTemplateSlots<T, S> = T & {
11
7
  new (): {
@@ -1,2 +1,8 @@
1
- declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
1
+ import type { DataSourceListSlots } from '../../../type';
2
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, DataSourceListSlots>;
2
3
  export default _default;
4
+ type __VLS_WithTemplateSlots<T, S> = T & {
5
+ new (): {
6
+ $slots: S;
7
+ };
8
+ };
@@ -1,4 +1,4 @@
1
- import type { LayerPanelSlots, MenuButton, MenuComponent } from '../../../type';
1
+ import { LayerPanelSlots, MenuButton, MenuComponent } from '../../../type';
2
2
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_TypePropsToRuntimeProps<{
3
3
  layerContentMenu: (MenuButton | MenuComponent)[];
4
4
  }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{