@sepveneto/dnde 0.8.9 → 0.8.11
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/App.vue.d.ts +1 -1
- package/dist/Editor.vue.d.ts +42 -33
- package/dist/api.d.ts +22 -0
- package/dist/components/NodePlugin.vue.d.ts +41 -32
- package/dist/components/NodeWrap.vue.d.ts +7 -0
- package/dist/editor.js +61663 -61439
- package/dist/element.d.ts +27 -0
- package/dist/layout/widgetsMenu.vue.d.ts +4 -1
- package/dist/main.d.ts +3 -1
- package/dist/shadowCss.d.ts +27 -0
- package/dist/store/app.d.ts +4 -1
- package/dist/store/editor.d.ts +48 -6
- package/package.json +1 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<mpd-editor>` 自定义元素。
|
|
3
|
+
*
|
|
4
|
+
* 元素在模块加载时就注册(见 main.ts 的 `register` 与文件末尾),宿主因此可以无条件地
|
|
5
|
+
* 在模板里渲染 `<mpd-editor>`,不需要用 v-if 之类的开关去对齐渲染时机:
|
|
6
|
+
*
|
|
7
|
+
* - 组件定义是异步的(等宿主 `register()` 给出生产者地址、生产者 `setup` 加载完再挂载),
|
|
8
|
+
* 等待期间先往 shadow root 里放一个加载占位,挂载时由 Editor.vue 撤掉;
|
|
9
|
+
* - 挂载前调用的指令式 API(register / validate / getData / setData)会先排队,
|
|
10
|
+
* 挂载后补上,见 ./api.ts。
|
|
11
|
+
*/
|
|
12
|
+
import type { App, Component } from 'vue';
|
|
13
|
+
import type { EditorApi } from './api';
|
|
14
|
+
/** `<mpd-editor>` 注册的标签名 */
|
|
15
|
+
export declare const EDITOR_ELEMENT_TAG = "mpd-editor";
|
|
16
|
+
export interface EditorElementInit {
|
|
17
|
+
/** 组件定义:等待 `register()` 与生产者 setup 的异步定义(见 main.ts) */
|
|
18
|
+
definition: Component;
|
|
19
|
+
/** 每个元素实例创建应用时调用:装上编辑器自己的 pinia 与生产者声明的插件 */
|
|
20
|
+
configureApp: (app: App) => void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createEditorElement({ definition, configureApp }: EditorElementInit): CustomElementConstructor;
|
|
23
|
+
/**
|
|
24
|
+
* 编辑器挂载完成(在 Editor.vue 的 setup 里调用):撤掉加载占位,并交出指令式 API 的实现,
|
|
25
|
+
* 挂载前排队的方法调用会在这里补上。
|
|
26
|
+
*/
|
|
27
|
+
export declare function bindEditorElement(host: any, api: EditorApi): void;
|
|
@@ -5,14 +5,17 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
5
5
|
setWidgets: (data: import("@/store").LikeWidget[]) => void;
|
|
6
6
|
widgets: import("vue").ShallowRef<(Widget | WidgetGroup)[] | undefined, (Widget | WidgetGroup)[] | undefined>;
|
|
7
7
|
widgetMap: Map<string, Widget>;
|
|
8
|
+
widgetsFlat: import("vue").ComputedRef<Widget[]>;
|
|
8
9
|
}, "widgets" | "widgetMap">, Pick<{
|
|
9
10
|
setWidgets: (data: import("@/store").LikeWidget[]) => void;
|
|
10
11
|
widgets: import("vue").ShallowRef<(Widget | WidgetGroup)[] | undefined, (Widget | WidgetGroup)[] | undefined>;
|
|
11
12
|
widgetMap: Map<string, Widget>;
|
|
12
|
-
|
|
13
|
+
widgetsFlat: import("vue").ComputedRef<Widget[]>;
|
|
14
|
+
}, "widgetsFlat">, Pick<{
|
|
13
15
|
setWidgets: (data: import("@/store").LikeWidget[]) => void;
|
|
14
16
|
widgets: import("vue").ShallowRef<(Widget | WidgetGroup)[] | undefined, (Widget | WidgetGroup)[] | undefined>;
|
|
15
17
|
widgetMap: Map<string, Widget>;
|
|
18
|
+
widgetsFlat: import("vue").ComputedRef<Widget[]>;
|
|
16
19
|
}, "setWidgets">>;
|
|
17
20
|
hasGroup: (list?: (Widget | WidgetGroup)[]) => list is WidgetGroup[];
|
|
18
21
|
handleClone: (original: Widget) => Node;
|
package/dist/main.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import Main from './Editor.vue';
|
|
2
1
|
import type { AgentImporter } from './agents/loader.js';
|
|
2
|
+
import Main from './Editor.vue';
|
|
3
|
+
import { EDITOR_ELEMENT_TAG } from './element.js';
|
|
3
4
|
import { injectPopperStyles } from './utils.js';
|
|
4
5
|
export type EditorInstance = InstanceType<typeof Main>;
|
|
6
|
+
export { EDITOR_ELEMENT_TAG };
|
|
5
7
|
export { injectPopperStyles };
|
|
6
8
|
export type { AgentImporter } from './agents/loader.js';
|
|
7
9
|
export interface RegisterOptions {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生产者(rsbuild / rspack)的 CSS chunk 加载与热更新都围绕 `<link>` 展开,默认挂到
|
|
3
|
+
* `document.head`。编辑器把「加载」重定向到 shadow root:取回 CSS 文本后以 `<style>` 注入,
|
|
4
|
+
* 这样样式只作用在编辑器内部,不会污染宿主页面(见 main.ts 的处理链路)。
|
|
5
|
+
*
|
|
6
|
+
* 重定向带来两个问题,这里负责兜住:
|
|
7
|
+
*
|
|
8
|
+
* 1. 热更新时 rspack 要先在 DOM 里找到「旧的样式表」,再在它旁边插入带新内容的 `<link>`。
|
|
9
|
+
* 它默认只在 `document` 里找,而我们的样式在 shadow root 中,找不到就整段放弃 ——
|
|
10
|
+
* 表现为「改了生产者的样式,开发态下画布不更新」(看起来就像样式丢失)。
|
|
11
|
+
* 因此注入时记上 `data-href`,并把「按 href 查 shadow root 里的样式表」暴露成
|
|
12
|
+
* `__dnde_find_shadow_css__`,交给 `@sepveneto/dnd-plugins` 对运行时的补丁去调用。
|
|
13
|
+
*
|
|
14
|
+
* 2. shadow root 会随编辑器卸载/重挂而重建(宿主热更新、路由切换)。重建后模块缓存里
|
|
15
|
+
* 仍有 CSS 的加载记录,rspack 不会再次注入,新 shadow root 里就没有样式了。
|
|
16
|
+
* 这里记住已经投放过的样式地址,新的 shadow root 登记时重新投放一份。
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* 装上供生产者运行时调用的两个全局函数。由编辑器挂载时调用一次即可。
|
|
20
|
+
*/
|
|
21
|
+
export declare function installShadowCssRuntime(): void;
|
|
22
|
+
/**
|
|
23
|
+
* 登记编辑器的 shadow root。重建出来的 shadow root(宿主热更新 / 路由切换)会把之前
|
|
24
|
+
* 加载过的样式重新投放一份 —— 模块缓存不会让 rspack 再注入一次。
|
|
25
|
+
* 返回注销函数,编辑器卸载时调用。
|
|
26
|
+
*/
|
|
27
|
+
export declare function registerShadowCssRoot(shadowRoot: ShadowRoot | undefined): () => void;
|
package/dist/store/app.d.ts
CHANGED
|
@@ -14,12 +14,15 @@ export declare const useApp: import("pinia").StoreDefinition<"app", Pick<{
|
|
|
14
14
|
setWidgets: (data: LikeWidget[]) => void;
|
|
15
15
|
widgets: import("vue").ShallowRef<(Widget | WidgetGroup)[] | undefined, (Widget | WidgetGroup)[] | undefined>;
|
|
16
16
|
widgetMap: Map<string, Widget>;
|
|
17
|
+
widgetsFlat: import("vue").ComputedRef<Widget[]>;
|
|
17
18
|
}, "widgets" | "widgetMap">, Pick<{
|
|
18
19
|
setWidgets: (data: LikeWidget[]) => void;
|
|
19
20
|
widgets: import("vue").ShallowRef<(Widget | WidgetGroup)[] | undefined, (Widget | WidgetGroup)[] | undefined>;
|
|
20
21
|
widgetMap: Map<string, Widget>;
|
|
21
|
-
|
|
22
|
+
widgetsFlat: import("vue").ComputedRef<Widget[]>;
|
|
23
|
+
}, "widgetsFlat">, Pick<{
|
|
22
24
|
setWidgets: (data: LikeWidget[]) => void;
|
|
23
25
|
widgets: import("vue").ShallowRef<(Widget | WidgetGroup)[] | undefined, (Widget | WidgetGroup)[] | undefined>;
|
|
24
26
|
widgetMap: Map<string, Widget>;
|
|
27
|
+
widgetsFlat: import("vue").ComputedRef<Widget[]>;
|
|
25
28
|
}, "setWidgets">>;
|
package/dist/store/editor.d.ts
CHANGED
|
@@ -17,17 +17,53 @@ declare class WidgetPlugin {
|
|
|
17
17
|
constructor(_ctx: any);
|
|
18
18
|
addPanel(panel: PanelInfo): void;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* 组件固定显示字段的约定(业务侧自行定义开关,编辑器据此决定是否渲染预览)。
|
|
22
|
+
* 与 `Node.visible` 使用同一约定:`data.isShow` 为真值时显示,为假值时隐藏。
|
|
23
|
+
*/
|
|
24
|
+
export declare const CONFIG_PANEL_SHOW_KEY = "isShow";
|
|
25
|
+
export interface ConfigPluginContext {
|
|
26
|
+
addNode: (node: Node, pNode?: Node, manual?: boolean) => void;
|
|
27
|
+
rootNode: () => Node;
|
|
28
|
+
}
|
|
29
|
+
export interface ConfigPanelOptions {
|
|
30
|
+
/** 标签显示名(默认取组件的名字或数据键) */
|
|
31
|
+
label?: string;
|
|
32
|
+
/** 数据键:该标签的配置项绑定在 rootNode.data[name] 下 */
|
|
33
|
+
name: string;
|
|
34
|
+
/** 根节点(页面级)配置项,由业务侧定义 */
|
|
35
|
+
attributes?: SchemaItem[];
|
|
36
|
+
}
|
|
20
37
|
export interface ConfigPanel {
|
|
38
|
+
/** 稳定的标识,用于标签定位 */
|
|
39
|
+
wid: string;
|
|
21
40
|
label: string;
|
|
41
|
+
/** 数据键,配置项绑定在 rootNode.data[name] 下 */
|
|
22
42
|
name: string;
|
|
43
|
+
/** 根节点(页面级)配置项 */
|
|
23
44
|
attributes: SchemaItem[];
|
|
45
|
+
/** 该标签绑定的数据对象 */
|
|
46
|
+
data: Record<string, any>;
|
|
47
|
+
/** 可选的固定组件节点 */
|
|
48
|
+
node?: Node;
|
|
24
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* 根节点(页面级)配置的补充入口(config pane 提供的额外标签)。
|
|
52
|
+
*
|
|
53
|
+
* 每个标签绑定一个固定组件 Node,但组件数据和配置页都属于根节点:
|
|
54
|
+
* - 数据写入 `rootNode.data[type]`,通过 `getData()` 输出,不进入页面拖拽列表;
|
|
55
|
+
* - 配置项由该 Widget 的 `schema.props` 定义;
|
|
56
|
+
* - 只有 `data.isShow` 为真时才渲染固定组件预览,纯配置标签不会加载组件视图;
|
|
57
|
+
* - 点击固定组件预览时应回到根节点,并激活对应配置标签,而不是独立选中该组件。
|
|
58
|
+
*/
|
|
25
59
|
declare class ConfigPlugin {
|
|
26
|
-
|
|
27
|
-
|
|
60
|
+
ctx: ConfigPluginContext;
|
|
61
|
+
list: Node[];
|
|
62
|
+
constructor(ctx: ConfigPluginContext);
|
|
28
63
|
get defaultPane(): string;
|
|
29
|
-
|
|
30
|
-
|
|
64
|
+
/** 注册一个根节点配置标签及其固定组件视图 */
|
|
65
|
+
addPanel(options: IWidget): Node;
|
|
66
|
+
validate(): Promise<boolean>;
|
|
31
67
|
}
|
|
32
68
|
export declare const useEditor: import("pinia").StoreDefinition<"editor", Pick<{
|
|
33
69
|
rootNode: import("vue").Ref<Raw<Node>, Raw<Node>>;
|
|
@@ -35,7 +71,9 @@ export declare const useEditor: import("pinia").StoreDefinition<"editor", Pick<{
|
|
|
35
71
|
shadowRoot: import("vue").ShallowRef<ShadowRoot | undefined, ShadowRoot | undefined>;
|
|
36
72
|
elementRoot: import("vue").ShallowRef<HTMLElement | undefined, HTMLElement | undefined>;
|
|
37
73
|
selectNode: (wid?: string) => void;
|
|
74
|
+
selectConfigPane: (wid: string) => void;
|
|
38
75
|
selected: import("vue").Ref<string, string>;
|
|
76
|
+
activeConfigPane: import("vue").Ref<string, string>;
|
|
39
77
|
hovering: import("vue").Ref<string | undefined, string | undefined>;
|
|
40
78
|
selectedNode: import("vue").ComputedRef<Node>;
|
|
41
79
|
selectedNodes: import("vue").ComputedRef<Node[]>;
|
|
@@ -54,13 +92,15 @@ export declare const useEditor: import("pinia").StoreDefinition<"editor", Pick<{
|
|
|
54
92
|
getData: () => Record<string, any>;
|
|
55
93
|
setData: (data: any) => void;
|
|
56
94
|
setSchema: (schema: IWidget["schema"]) => void;
|
|
57
|
-
}, "plugins" | "hovering" | "dragging" | "rootNode" | "nodeMap" | "shadowRoot" | "elementRoot" | "selected" | "isPreview">, Pick<{
|
|
95
|
+
}, "plugins" | "hovering" | "dragging" | "rootNode" | "nodeMap" | "shadowRoot" | "elementRoot" | "selected" | "activeConfigPane" | "isPreview">, Pick<{
|
|
58
96
|
rootNode: import("vue").Ref<Raw<Node>, Raw<Node>>;
|
|
59
97
|
nodeMap: Map<string, Node>;
|
|
60
98
|
shadowRoot: import("vue").ShallowRef<ShadowRoot | undefined, ShadowRoot | undefined>;
|
|
61
99
|
elementRoot: import("vue").ShallowRef<HTMLElement | undefined, HTMLElement | undefined>;
|
|
62
100
|
selectNode: (wid?: string) => void;
|
|
101
|
+
selectConfigPane: (wid: string) => void;
|
|
63
102
|
selected: import("vue").Ref<string, string>;
|
|
103
|
+
activeConfigPane: import("vue").Ref<string, string>;
|
|
64
104
|
hovering: import("vue").Ref<string | undefined, string | undefined>;
|
|
65
105
|
selectedNode: import("vue").ComputedRef<Node>;
|
|
66
106
|
selectedNodes: import("vue").ComputedRef<Node[]>;
|
|
@@ -85,7 +125,9 @@ export declare const useEditor: import("pinia").StoreDefinition<"editor", Pick<{
|
|
|
85
125
|
shadowRoot: import("vue").ShallowRef<ShadowRoot | undefined, ShadowRoot | undefined>;
|
|
86
126
|
elementRoot: import("vue").ShallowRef<HTMLElement | undefined, HTMLElement | undefined>;
|
|
87
127
|
selectNode: (wid?: string) => void;
|
|
128
|
+
selectConfigPane: (wid: string) => void;
|
|
88
129
|
selected: import("vue").Ref<string, string>;
|
|
130
|
+
activeConfigPane: import("vue").Ref<string, string>;
|
|
89
131
|
hovering: import("vue").Ref<string | undefined, string | undefined>;
|
|
90
132
|
selectedNode: import("vue").ComputedRef<Node>;
|
|
91
133
|
selectedNodes: import("vue").ComputedRef<Node[]>;
|
|
@@ -104,5 +146,5 @@ export declare const useEditor: import("pinia").StoreDefinition<"editor", Pick<{
|
|
|
104
146
|
getData: () => Record<string, any>;
|
|
105
147
|
setData: (data: any) => void;
|
|
106
148
|
setSchema: (schema: IWidget["schema"]) => void;
|
|
107
|
-
}, "selectNode" | "addNode" | "delNode" | "setRoot" | "getData" | "setData" | "setSchema">>;
|
|
149
|
+
}, "selectNode" | "selectConfigPane" | "addNode" | "delNode" | "setRoot" | "getData" | "setData" | "setSchema">>;
|
|
108
150
|
export {};
|