@pactor-app/ui 0.1.0

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.
@@ -0,0 +1,178 @@
1
+ import { DslNode, PageDsl } from '@pactor-app/core';
2
+ import { ActionRegistry } from '@pactor-app/runtime';
3
+ import * as React from 'react';
4
+ import { ReactNode } from 'react';
5
+
6
+ /**
7
+ * Overlay 打开配置(设计文档第 45 节,决策 D1)。
8
+ *
9
+ * 统一 `overlay.open`:modal / drawer 共用同一配置结构;
10
+ * `content` 为内联 DSL 子树,`page` 为动态页面引用,二者取其一。
11
+ */
12
+ interface OverlayConfig {
13
+ /** 弹层类型 */
14
+ type: 'modal' | 'drawer';
15
+ /** 标题(antd Modal title / Drawer title) */
16
+ title?: string;
17
+ /** 宽度(antd Modal width / Drawer size,v6 起 Drawer width 废弃) */
18
+ width?: number | string;
19
+ /** 内联 DSL 内容,经 @pactor-app/runtime Renderer 渲染 */
20
+ content?: DslNode;
21
+ /** 动态页面:经 OverlayHost 注入的 resolvePage(pageId) 加载渲染 */
22
+ page?: {
23
+ pageId: string;
24
+ };
25
+ /** 传入 overlay 内容作用域的 `params` 键 */
26
+ params?: Record<string, unknown>;
27
+ }
28
+ /** 堆栈条目:配置 + 生成的 id */
29
+ interface OverlayEntry extends OverlayConfig {
30
+ id: string;
31
+ }
32
+ /** 堆栈变化监听器:open / close 时以最新堆栈快照回调 */
33
+ type OverlayListener = (stack: readonly OverlayEntry[]) => void;
34
+ /**
35
+ * 取消语义 payload:UI 取消(X / 蒙层 / 取消按钮)或不携带 payload
36
+ * 的 close 以此值 resolve open 返回的 Promise。
37
+ */
38
+ declare const OVERLAY_CANCEL_PAYLOAD: {
39
+ readonly success: false;
40
+ };
41
+ /**
42
+ * OverlayManager(设计文档第 44–46 节,决策 D1):零 React 的
43
+ * Overlay 堆栈状态与 Promise 模型,可纯 Node 测试。
44
+ *
45
+ * - `open` 生成 id、入栈、通知订阅者,返回 Promise;
46
+ * `close` 时以 payload resolve(缺省 payload 为取消语义
47
+ * `{ success: false }`)
48
+ * - 嵌套即堆栈:连续 open 依次压栈,`close()` 缺省关闭栈顶
49
+ * - `parentScope` 为打开时刻父页面作用域的浅快照(只读约定),
50
+ * 供 overlay 内容以 `parent` 键访问
51
+ */
52
+ declare class OverlayManager {
53
+ private readonly pending;
54
+ private readonly listeners;
55
+ private counter;
56
+ /** 缓存的堆栈快照:变化时才更换引用,供 useSyncExternalStore 使用 */
57
+ private snapshot;
58
+ /**
59
+ * 打开 overlay:入栈、通知,返回 Promise——close 时以 payload
60
+ * resolve;取消关闭(无 payload)resolve `{ success: false }`。
61
+ * `options.parentScope` 记录打开时刻的父作用域浅快照。
62
+ */
63
+ open(config: OverlayConfig, options?: {
64
+ parentScope?: Record<string, unknown>;
65
+ }): Promise<unknown>;
66
+ /**
67
+ * 关闭 overlay 并以 payload resolve 对应的 open Promise:
68
+ * - `close(id, payload)`:关闭指定条目,原样 resolve payload
69
+ * (payload 缺省为取消语义 `{ success: false }`)
70
+ * - `close(payload)`:关闭栈顶,原样 resolve payload
71
+ * - `close()`:关闭栈顶,取消语义
72
+ * 未命中任何条目时为受控 no-op,不抛错。
73
+ */
74
+ close(idOrPayload?: string | unknown, payload?: unknown): void;
75
+ /** 当前堆栈快照(打开顺序,栈顶在末尾);引用在堆栈不变时保持稳定 */
76
+ stack(): readonly OverlayEntry[];
77
+ /** 打开时记录的父作用域浅快照(只读约定);未知 id 返回 undefined */
78
+ parentScopeOf(id: string): Record<string, unknown> | undefined;
79
+ /** 订阅堆栈变化(open / close 时通知),返回退订函数 */
80
+ subscribe(listener: OverlayListener): () => void;
81
+ /** 重建快照并通知订阅者 */
82
+ private commit;
83
+ }
84
+
85
+ /**
86
+ * modal 实例(结构化类型,仅声明本包用到的 API):
87
+ * 由 InteractionProvider(shadcn 实现为 ShadcnInteractionProvider)
88
+ * 在 mount 时注入 UiBridge。
89
+ */
90
+ interface UiModal {
91
+ confirm(config: {
92
+ title?: unknown;
93
+ content?: unknown;
94
+ onOk?: () => void;
95
+ onCancel?: () => void;
96
+ }): unknown;
97
+ }
98
+ /** message 实例(结构化类型):toast 反馈四态 */
99
+ interface UiMessage {
100
+ success(content: unknown): unknown;
101
+ error(content: unknown): unknown;
102
+ info(content: unknown): unknown;
103
+ warning(content: unknown): unknown;
104
+ }
105
+ /**
106
+ * UiBridge(决策 D3):manager 旁路的可变引用,
107
+ * InteractionProvider 在 mount 时赋值、unmount 时清空;
108
+ * `confirm` / `message` 动作经它调用 UI 层 API,未注入时返回
109
+ * 受控失败而非抛出。
110
+ */
111
+ interface UiBridge {
112
+ modal?: UiModal;
113
+ message?: UiMessage;
114
+ }
115
+ /** 创建空 UiBridge:传给 registerInteractionActions 与 InteractionProvider */
116
+ declare function createUiBridge(): UiBridge;
117
+ /**
118
+ * 注册交互动作(设计文档第 45、48 节,决策 D3):
119
+ *
120
+ * - `overlay.open`:`params.overlay`(配置字段表达式已求值,content
121
+ * DslNode 子树保留给渲染层求值)→ `manager.open`,close payload
122
+ * 作为动作 data 返回;父页面作用域浅快照记入 parentScope
123
+ * - `overlay.close`:`params.id`(缺省栈顶)+ `params.payload`
124
+ * (缺省取消语义 `{ success: false }`)→ `manager.close`
125
+ * - `confirm`:`params.title` / `params.content` → UiBridge 注入的
126
+ * modal.confirm,确认返回 data `true`,取消返回 `false`;UiBridge
127
+ * 未注入 modal 时返回 `{ ok: false }` 受控失败
128
+ * - `message`:`params.type`(success / error / info / warning,缺省
129
+ * info)+ `params.text` → UiBridge 注入的 message;未注入时受控失败
130
+ *
131
+ * 已注册的同名动作不会被覆盖(与 registerBuiltinActions 同约定)。
132
+ */
133
+ declare function registerInteractionActions(actions: ActionRegistry, manager: OverlayManager, ui: UiBridge): void;
134
+
135
+ interface InteractionProviderProps {
136
+ /** registerInteractionActions 使用的同一 UiBridge(可变引用) */
137
+ bridge: UiBridge;
138
+ children?: ReactNode;
139
+ }
140
+ /**
141
+ * ShadcnInteractionProvider:与 pactor-interaction 的 InteractionProvider
142
+ * (antd 版)契约一致——mount 时向 UiBridge 注入自绘实现:
143
+ *
144
+ * - `modal.confirm({ title, content, onOk, onCancel })`:vendored shadcn
145
+ * Dialog 渲染确认框,确定/取消回调后关闭(先关闭再回调,时序对齐 antd
146
+ * Modal.confirm);
147
+ * - `message.{success,error,info,warning}`:toast 栈(容器固定右上角,
148
+ * 自动约 3s 消失,类型色条读语义令牌)。
149
+ *
150
+ * unmount 时清空 bridge,动作退化为受控失败(与 antd 版相同)。
151
+ */
152
+ declare function ShadcnInteractionProvider({ bridge, children, }: InteractionProviderProps): React.JSX.Element;
153
+
154
+ /**
155
+ * page overlay 的页面加载函数(通常包装 @pactor-app/resource loader):
156
+ * pageId → PageDsl(可异步)。
157
+ */
158
+ type ResolvePageFn = (pageId: string) => PageDsl | Promise<PageDsl>;
159
+ interface OverlayHostProps {
160
+ manager: OverlayManager;
161
+ /** page 类型 overlay 的页面加载函数;未注入时 page overlay 渲染受控错误提示 */
162
+ resolvePage?: ResolvePageFn;
163
+ }
164
+ /**
165
+ * ShadcnOverlayHost:与 pactor-interaction 的 OverlayHost(antd 版)契约一致——
166
+ * 订阅同一 OverlayManager 堆栈逐条渲染;type 为 modal 用 vendored shadcn
167
+ * Dialog、drawer 用自绘固定右侧面板 + 遮罩(无 drawer 原语);title/width
168
+ * 原样应用;UI 取消(X / 遮罩 / Escape)触发取消语义 close(resolve
169
+ * `{ success: false }`)。
170
+ *
171
+ * 与 antd 版相同:必须位于 PageRuntime 的 React Context 之内;DSL content
172
+ * 经当前 Renderer 的 `renderChildren` 渲染,作用域注入
173
+ * `{ params: entry.params, parent: 父作用域快照 }`;page overlay 经注入的
174
+ * resolvePage 加载并创建共享宿主 registries 的子 PageRuntime。
175
+ */
176
+ declare function ShadcnOverlayHost({ manager, resolvePage }: OverlayHostProps): React.JSX.Element;
177
+
178
+ export { type InteractionProviderProps, OVERLAY_CANCEL_PAYLOAD, type OverlayConfig, type OverlayEntry, type OverlayHostProps, type OverlayListener, OverlayManager, type ResolvePageFn, ShadcnInteractionProvider, ShadcnOverlayHost, type UiBridge, type UiMessage, type UiModal, createUiBridge, registerInteractionActions };
@@ -0,0 +1,178 @@
1
+ import { DslNode, PageDsl } from '@pactor-app/core';
2
+ import { ActionRegistry } from '@pactor-app/runtime';
3
+ import * as React from 'react';
4
+ import { ReactNode } from 'react';
5
+
6
+ /**
7
+ * Overlay 打开配置(设计文档第 45 节,决策 D1)。
8
+ *
9
+ * 统一 `overlay.open`:modal / drawer 共用同一配置结构;
10
+ * `content` 为内联 DSL 子树,`page` 为动态页面引用,二者取其一。
11
+ */
12
+ interface OverlayConfig {
13
+ /** 弹层类型 */
14
+ type: 'modal' | 'drawer';
15
+ /** 标题(antd Modal title / Drawer title) */
16
+ title?: string;
17
+ /** 宽度(antd Modal width / Drawer size,v6 起 Drawer width 废弃) */
18
+ width?: number | string;
19
+ /** 内联 DSL 内容,经 @pactor-app/runtime Renderer 渲染 */
20
+ content?: DslNode;
21
+ /** 动态页面:经 OverlayHost 注入的 resolvePage(pageId) 加载渲染 */
22
+ page?: {
23
+ pageId: string;
24
+ };
25
+ /** 传入 overlay 内容作用域的 `params` 键 */
26
+ params?: Record<string, unknown>;
27
+ }
28
+ /** 堆栈条目:配置 + 生成的 id */
29
+ interface OverlayEntry extends OverlayConfig {
30
+ id: string;
31
+ }
32
+ /** 堆栈变化监听器:open / close 时以最新堆栈快照回调 */
33
+ type OverlayListener = (stack: readonly OverlayEntry[]) => void;
34
+ /**
35
+ * 取消语义 payload:UI 取消(X / 蒙层 / 取消按钮)或不携带 payload
36
+ * 的 close 以此值 resolve open 返回的 Promise。
37
+ */
38
+ declare const OVERLAY_CANCEL_PAYLOAD: {
39
+ readonly success: false;
40
+ };
41
+ /**
42
+ * OverlayManager(设计文档第 44–46 节,决策 D1):零 React 的
43
+ * Overlay 堆栈状态与 Promise 模型,可纯 Node 测试。
44
+ *
45
+ * - `open` 生成 id、入栈、通知订阅者,返回 Promise;
46
+ * `close` 时以 payload resolve(缺省 payload 为取消语义
47
+ * `{ success: false }`)
48
+ * - 嵌套即堆栈:连续 open 依次压栈,`close()` 缺省关闭栈顶
49
+ * - `parentScope` 为打开时刻父页面作用域的浅快照(只读约定),
50
+ * 供 overlay 内容以 `parent` 键访问
51
+ */
52
+ declare class OverlayManager {
53
+ private readonly pending;
54
+ private readonly listeners;
55
+ private counter;
56
+ /** 缓存的堆栈快照:变化时才更换引用,供 useSyncExternalStore 使用 */
57
+ private snapshot;
58
+ /**
59
+ * 打开 overlay:入栈、通知,返回 Promise——close 时以 payload
60
+ * resolve;取消关闭(无 payload)resolve `{ success: false }`。
61
+ * `options.parentScope` 记录打开时刻的父作用域浅快照。
62
+ */
63
+ open(config: OverlayConfig, options?: {
64
+ parentScope?: Record<string, unknown>;
65
+ }): Promise<unknown>;
66
+ /**
67
+ * 关闭 overlay 并以 payload resolve 对应的 open Promise:
68
+ * - `close(id, payload)`:关闭指定条目,原样 resolve payload
69
+ * (payload 缺省为取消语义 `{ success: false }`)
70
+ * - `close(payload)`:关闭栈顶,原样 resolve payload
71
+ * - `close()`:关闭栈顶,取消语义
72
+ * 未命中任何条目时为受控 no-op,不抛错。
73
+ */
74
+ close(idOrPayload?: string | unknown, payload?: unknown): void;
75
+ /** 当前堆栈快照(打开顺序,栈顶在末尾);引用在堆栈不变时保持稳定 */
76
+ stack(): readonly OverlayEntry[];
77
+ /** 打开时记录的父作用域浅快照(只读约定);未知 id 返回 undefined */
78
+ parentScopeOf(id: string): Record<string, unknown> | undefined;
79
+ /** 订阅堆栈变化(open / close 时通知),返回退订函数 */
80
+ subscribe(listener: OverlayListener): () => void;
81
+ /** 重建快照并通知订阅者 */
82
+ private commit;
83
+ }
84
+
85
+ /**
86
+ * modal 实例(结构化类型,仅声明本包用到的 API):
87
+ * 由 InteractionProvider(shadcn 实现为 ShadcnInteractionProvider)
88
+ * 在 mount 时注入 UiBridge。
89
+ */
90
+ interface UiModal {
91
+ confirm(config: {
92
+ title?: unknown;
93
+ content?: unknown;
94
+ onOk?: () => void;
95
+ onCancel?: () => void;
96
+ }): unknown;
97
+ }
98
+ /** message 实例(结构化类型):toast 反馈四态 */
99
+ interface UiMessage {
100
+ success(content: unknown): unknown;
101
+ error(content: unknown): unknown;
102
+ info(content: unknown): unknown;
103
+ warning(content: unknown): unknown;
104
+ }
105
+ /**
106
+ * UiBridge(决策 D3):manager 旁路的可变引用,
107
+ * InteractionProvider 在 mount 时赋值、unmount 时清空;
108
+ * `confirm` / `message` 动作经它调用 UI 层 API,未注入时返回
109
+ * 受控失败而非抛出。
110
+ */
111
+ interface UiBridge {
112
+ modal?: UiModal;
113
+ message?: UiMessage;
114
+ }
115
+ /** 创建空 UiBridge:传给 registerInteractionActions 与 InteractionProvider */
116
+ declare function createUiBridge(): UiBridge;
117
+ /**
118
+ * 注册交互动作(设计文档第 45、48 节,决策 D3):
119
+ *
120
+ * - `overlay.open`:`params.overlay`(配置字段表达式已求值,content
121
+ * DslNode 子树保留给渲染层求值)→ `manager.open`,close payload
122
+ * 作为动作 data 返回;父页面作用域浅快照记入 parentScope
123
+ * - `overlay.close`:`params.id`(缺省栈顶)+ `params.payload`
124
+ * (缺省取消语义 `{ success: false }`)→ `manager.close`
125
+ * - `confirm`:`params.title` / `params.content` → UiBridge 注入的
126
+ * modal.confirm,确认返回 data `true`,取消返回 `false`;UiBridge
127
+ * 未注入 modal 时返回 `{ ok: false }` 受控失败
128
+ * - `message`:`params.type`(success / error / info / warning,缺省
129
+ * info)+ `params.text` → UiBridge 注入的 message;未注入时受控失败
130
+ *
131
+ * 已注册的同名动作不会被覆盖(与 registerBuiltinActions 同约定)。
132
+ */
133
+ declare function registerInteractionActions(actions: ActionRegistry, manager: OverlayManager, ui: UiBridge): void;
134
+
135
+ interface InteractionProviderProps {
136
+ /** registerInteractionActions 使用的同一 UiBridge(可变引用) */
137
+ bridge: UiBridge;
138
+ children?: ReactNode;
139
+ }
140
+ /**
141
+ * ShadcnInteractionProvider:与 pactor-interaction 的 InteractionProvider
142
+ * (antd 版)契约一致——mount 时向 UiBridge 注入自绘实现:
143
+ *
144
+ * - `modal.confirm({ title, content, onOk, onCancel })`:vendored shadcn
145
+ * Dialog 渲染确认框,确定/取消回调后关闭(先关闭再回调,时序对齐 antd
146
+ * Modal.confirm);
147
+ * - `message.{success,error,info,warning}`:toast 栈(容器固定右上角,
148
+ * 自动约 3s 消失,类型色条读语义令牌)。
149
+ *
150
+ * unmount 时清空 bridge,动作退化为受控失败(与 antd 版相同)。
151
+ */
152
+ declare function ShadcnInteractionProvider({ bridge, children, }: InteractionProviderProps): React.JSX.Element;
153
+
154
+ /**
155
+ * page overlay 的页面加载函数(通常包装 @pactor-app/resource loader):
156
+ * pageId → PageDsl(可异步)。
157
+ */
158
+ type ResolvePageFn = (pageId: string) => PageDsl | Promise<PageDsl>;
159
+ interface OverlayHostProps {
160
+ manager: OverlayManager;
161
+ /** page 类型 overlay 的页面加载函数;未注入时 page overlay 渲染受控错误提示 */
162
+ resolvePage?: ResolvePageFn;
163
+ }
164
+ /**
165
+ * ShadcnOverlayHost:与 pactor-interaction 的 OverlayHost(antd 版)契约一致——
166
+ * 订阅同一 OverlayManager 堆栈逐条渲染;type 为 modal 用 vendored shadcn
167
+ * Dialog、drawer 用自绘固定右侧面板 + 遮罩(无 drawer 原语);title/width
168
+ * 原样应用;UI 取消(X / 遮罩 / Escape)触发取消语义 close(resolve
169
+ * `{ success: false }`)。
170
+ *
171
+ * 与 antd 版相同:必须位于 PageRuntime 的 React Context 之内;DSL content
172
+ * 经当前 Renderer 的 `renderChildren` 渲染,作用域注入
173
+ * `{ params: entry.params, parent: 父作用域快照 }`;page overlay 经注入的
174
+ * resolvePage 加载并创建共享宿主 registries 的子 PageRuntime。
175
+ */
176
+ declare function ShadcnOverlayHost({ manager, resolvePage }: OverlayHostProps): React.JSX.Element;
177
+
178
+ export { type InteractionProviderProps, OVERLAY_CANCEL_PAYLOAD, type OverlayConfig, type OverlayEntry, type OverlayHostProps, type OverlayListener, OverlayManager, type ResolvePageFn, ShadcnInteractionProvider, ShadcnOverlayHost, type UiBridge, type UiMessage, type UiModal, createUiBridge, registerInteractionActions };
@@ -0,0 +1,19 @@
1
+ import {
2
+ OVERLAY_CANCEL_PAYLOAD,
3
+ OverlayManager,
4
+ ShadcnInteractionProvider,
5
+ ShadcnOverlayHost,
6
+ createUiBridge,
7
+ registerInteractionActions
8
+ } from "../chunk-OH3U6PCM.js";
9
+ import "../chunk-QDTVOJ5P.js";
10
+ import "../chunk-QWZ23QLS.js";
11
+ import "../chunk-RQHJBTEU.js";
12
+ export {
13
+ OVERLAY_CANCEL_PAYLOAD,
14
+ OverlayManager,
15
+ ShadcnInteractionProvider,
16
+ ShadcnOverlayHost,
17
+ createUiBridge,
18
+ registerInteractionActions
19
+ };