antd-overlay 0.2.0 → 0.4.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.
- package/README.md +134 -9
- package/dist/index.cjs +269 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +163 -4
- package/dist/index.d.ts +163 -4
- package/dist/index.js +258 -4
- package/dist/index.js.map +1 -1
- package/docs/ai/api-manifest.json +217 -3
- package/docs/ai/constraints.md +33 -1
- package/docs/ai/contracts.json +40 -2
- package/docs/ai/quick-reference.md +75 -1
- package/package.json +3 -2
package/docs/ai/contracts.json
CHANGED
|
@@ -6,12 +6,14 @@
|
|
|
6
6
|
"imperative-open-close-overlay",
|
|
7
7
|
"update-overlay-props-via-controller",
|
|
8
8
|
"global-overlay-hosting-via-provider",
|
|
9
|
-
"async-custom-ok-auto-close-on-resolve"
|
|
9
|
+
"async-custom-ok-auto-close-on-resolve",
|
|
10
|
+
"imperative-tour-open-close",
|
|
11
|
+
"imperative-await-overlay-result-via-promise"
|
|
10
12
|
],
|
|
11
13
|
"constraints": [
|
|
12
14
|
{
|
|
13
15
|
"code": "PROVIDER_REQUIRED",
|
|
14
|
-
"rule": "useGlobalModal/useGlobalDrawer/useGlobalOverlay 必须在 AntdOverlayProvider 作用域内调用"
|
|
16
|
+
"rule": "useGlobalModal/useGlobalDrawer/useGlobalTour/useGlobalOverlay 必须在 AntdOverlayProvider 作用域内调用"
|
|
15
17
|
},
|
|
16
18
|
{
|
|
17
19
|
"code": "OVERLAY_COMPONENT_CONTRACT",
|
|
@@ -20,6 +22,14 @@
|
|
|
20
22
|
{
|
|
21
23
|
"code": "UPDATE_SHALLOW_MERGE",
|
|
22
24
|
"rule": "controller.update 使用浅合并,不进行深层对象合并"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"code": "PROMISE_RESOLVES_WITH_INPUT",
|
|
28
|
+
"rule": "usePromise* 系列:外层 Promise 解析为 customOk 的入参(value),不是 customOk 的返回值"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"code": "TOUR_NO_PROMISE_API",
|
|
32
|
+
"rule": "Tour 仅提供 useTour/useGlobalTour/generateUseTourHook,不提供 usePromiseTour"
|
|
23
33
|
}
|
|
24
34
|
],
|
|
25
35
|
"errorSemantics": [
|
|
@@ -40,6 +50,18 @@
|
|
|
40
50
|
"type": "behavior",
|
|
41
51
|
"trigger": "调用 controller.update",
|
|
42
52
|
"result": "defaultProps < prevProps < nextProps(浅合并)"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"code": "PROMISE_RESOLVED_ON_CLOSE",
|
|
56
|
+
"type": "behavior",
|
|
57
|
+
"trigger": "通过 customClose / 蒙层 / antd 取消按钮 / 组件卸载 关闭 usePromise* 系列覆盖层",
|
|
58
|
+
"result": "外层 Promise 以 undefined resolve(不 reject)"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"code": "PROMISE_PREEMPTED_BY_REOPEN",
|
|
62
|
+
"type": "behavior",
|
|
63
|
+
"trigger": "在前一个 Promise 未结算时再次调用同一 hook 实例的 openPromise",
|
|
64
|
+
"result": "前一个 Promise 立即以 undefined resolve,新 Promise 接管"
|
|
43
65
|
}
|
|
44
66
|
],
|
|
45
67
|
"recommendedTemplates": {
|
|
@@ -53,6 +75,22 @@
|
|
|
53
75
|
},
|
|
54
76
|
"controllerUpdate": {
|
|
55
77
|
"snippet": "const controller = openModal(init); controller.update(next); controller.close();"
|
|
78
|
+
},
|
|
79
|
+
"promiseModal": {
|
|
80
|
+
"providerRequired": false,
|
|
81
|
+
"snippet": "const [openPromise, holder] = usePromiseModal(Component); const v = await openPromise({ ...props }); if (v === undefined) return; /* 用户取消 */"
|
|
82
|
+
},
|
|
83
|
+
"promiseDrawer": {
|
|
84
|
+
"providerRequired": false,
|
|
85
|
+
"snippet": "const [openPromise, holder] = usePromiseDrawer(Component); const v = await openPromise({ ...props }); if (v === undefined) return; /* 用户取消 */"
|
|
86
|
+
},
|
|
87
|
+
"localTour": {
|
|
88
|
+
"providerRequired": false,
|
|
89
|
+
"snippet": "const [openTour, holder] = useTour(Component); openTour({ steps });"
|
|
90
|
+
},
|
|
91
|
+
"globalTour": {
|
|
92
|
+
"providerRequired": true,
|
|
93
|
+
"snippet": "const openTour = useGlobalTour(Component); openTour({ steps });"
|
|
56
94
|
}
|
|
57
95
|
},
|
|
58
96
|
"docs": {
|
|
@@ -69,6 +69,80 @@ controller.close();
|
|
|
69
69
|
|
|
70
70
|
## 5) 最小规则清单
|
|
71
71
|
|
|
72
|
-
- 使用 `useGlobalModal/useGlobalDrawer/useGlobalOverlay` 时,必须存在 `AntdOverlayProvider`
|
|
72
|
+
- 使用 `useGlobalModal/useGlobalDrawer/useGlobalTour/useGlobalOverlay` 时,必须存在 `AntdOverlayProvider`
|
|
73
73
|
- 自定义组件需要消费 `open` 与 `customClose`
|
|
74
74
|
- 覆盖层确认动作优先通过 `customOk` 触发,避免自行关闭与业务状态不同步
|
|
75
|
+
|
|
76
|
+
## 6) Tour 模式(不含 Promise)
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import { Tour } from 'antd';
|
|
80
|
+
import { useTour, CustomTourProps } from 'antd-overlay';
|
|
81
|
+
|
|
82
|
+
const GuideTour: React.FC<CustomTourProps> = ({ customClose, customOk, ...props }) => {
|
|
83
|
+
void customClose;
|
|
84
|
+
void customOk;
|
|
85
|
+
return <Tour {...props} />;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
function Page() {
|
|
89
|
+
const targetRef = React.useRef<HTMLButtonElement>(null);
|
|
90
|
+
const [openTour, holder] = useTour(GuideTour);
|
|
91
|
+
|
|
92
|
+
return (
|
|
93
|
+
<>
|
|
94
|
+
<button
|
|
95
|
+
ref={targetRef}
|
|
96
|
+
onClick={() =>
|
|
97
|
+
openTour({
|
|
98
|
+
steps: [{ title: 'Guide', description: 'Step content', target: () => targetRef.current }],
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
>
|
|
102
|
+
open
|
|
103
|
+
</button>
|
|
104
|
+
{holder}
|
|
105
|
+
</>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Tour 没有关闭动画完成回调,`useTour/useGlobalTour` 默认关闭即卸载。不要生成 `usePromiseTour`;当前公共 API 不提供 Promise Tour。
|
|
111
|
+
|
|
112
|
+
## 7) Promise 模式(await customOk 入参)
|
|
113
|
+
|
|
114
|
+
适用场景:业务方希望在调用处直接 `await` 拿到用户的确认结果。
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import { usePromiseModal, CustomModalProps } from 'antd-overlay';
|
|
118
|
+
import { Modal } from 'antd';
|
|
119
|
+
|
|
120
|
+
interface ConfirmModalProps extends CustomModalProps<{ value: string }> {
|
|
121
|
+
initialValue?: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const ConfirmModal: React.FC<ConfirmModalProps> = ({ open, customClose, customOk, initialValue }) => (
|
|
125
|
+
<Modal open={open} onCancel={customClose} onOk={() => customOk?.({ value: initialValue ?? '' })}>
|
|
126
|
+
confirm
|
|
127
|
+
</Modal>
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
function Page() {
|
|
131
|
+
const [openConfirm, holder] = usePromiseModal(ConfirmModal);
|
|
132
|
+
|
|
133
|
+
const handle = async () => {
|
|
134
|
+
const result = await openConfirm({ initialValue: 'hello' });
|
|
135
|
+
if (result === undefined) return; // 用户取消 / 关闭
|
|
136
|
+
console.log(result.value); // customOk 入参
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
return <>{holder}<button onClick={handle}>open</button></>;
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
行为契约(同样适用于 `usePromiseDrawer` / `usePromiseOverlay` 与对应的 `useGlobalPromise*` / `generateUsePromise*Hook`):
|
|
144
|
+
|
|
145
|
+
- `customOk(value)` 同步成功 → Promise resolve **value(入参)**;异步 resolve 同理
|
|
146
|
+
- 任意非 OK 关闭路径(`customClose` / 蒙层 / 取消按钮 / 组件卸载 / 同实例再次 open 抢占)→ Promise resolve `undefined`
|
|
147
|
+
- `customOk` 抛错或 Promise reject → Promise 以同一错误 reject,覆盖层保持打开
|
|
148
|
+
- Promise 仅结算一次(幂等);解析时机为决策时刻,不等待关闭动画
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "antd-overlay",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Ant Design Modal/Drawer 命令式调用方案",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Ant Design Modal/Drawer/Tour 命令式调用方案",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"antd",
|
|
26
26
|
"modal",
|
|
27
27
|
"drawer",
|
|
28
|
+
"tour",
|
|
28
29
|
"overlay",
|
|
29
30
|
"react",
|
|
30
31
|
"hooks",
|