weifuwu 0.33.8 → 0.33.9
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 +390 -460
- package/dist/client/components/Chat.d.ts +7 -5
- package/dist/client/components/Link.d.ts +27 -0
- package/dist/client/components/LoginForm.d.ts +6 -4
- package/dist/client/components/Transition.d.ts +42 -0
- package/dist/client/index.d.ts +288 -8
- package/dist/client/index.js +667 -141
- package/dist/client/jsx-runtime.d.ts +53 -3
- package/dist/client/jsx-runtime.js +667 -141
- package/dist/client/lib/css.d.ts +33 -0
- package/dist/client/lib/dev.d.ts +28 -0
- package/dist/client/lib/form.d.ts +2 -0
- package/dist/client/lib/model.d.ts +36 -0
- package/dist/client/lib/resource.d.ts +56 -0
- package/dist/client/router.d.ts +10 -0
- package/dist/client/signal.d.ts +82 -0
- package/dist/client/types.d.ts +27 -0
- package/package.json +3 -2
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
* Chat — 消息聊天组件
|
|
3
3
|
*
|
|
4
4
|
* 与 weifuwu 后端 messager + agent 模块对接。
|
|
5
|
+
* 使用纯 JSX 编写,展示 weifuwu/client 组件最佳实践。
|
|
5
6
|
*
|
|
6
|
-
* ```
|
|
7
|
+
* ```tsx
|
|
7
8
|
* import { Chat } from 'weifuwu/client'
|
|
8
9
|
*
|
|
9
10
|
* function ChatPage(_, ctx) {
|
|
10
|
-
* return Chat
|
|
11
|
+
* return <Chat conversationId="123" />
|
|
11
12
|
* }
|
|
12
13
|
* ```
|
|
13
14
|
*/
|
|
14
|
-
import type {
|
|
15
|
-
export declare
|
|
15
|
+
import type { Component } from '../jsx-runtime.ts';
|
|
16
|
+
export declare const Chat: Component<{
|
|
16
17
|
conversationId: string;
|
|
17
|
-
}
|
|
18
|
+
}>;
|
|
19
|
+
export default Chat;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link — 客户端路由导航组件
|
|
3
|
+
*
|
|
4
|
+
* 替代原生 <a> 标签,拦截默认导航行为走 SPA 路由。
|
|
5
|
+
* 支持右键「在新标签页打开」、中键、键盘导航。
|
|
6
|
+
*
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { Link } from 'weifuwu/client'
|
|
9
|
+
*
|
|
10
|
+
* function Nav() {
|
|
11
|
+
* return (
|
|
12
|
+
* <nav>
|
|
13
|
+
* <Link to="/">首页</Link>
|
|
14
|
+
* <Link to="/about">关于</Link>
|
|
15
|
+
* <Link to="/user/wefu">用户</Link>
|
|
16
|
+
* </nav>
|
|
17
|
+
* )
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import type { Component } from '../jsx-runtime.ts';
|
|
22
|
+
export declare const Link: Component<{
|
|
23
|
+
to: string;
|
|
24
|
+
class?: string;
|
|
25
|
+
children?: Node | string | (Node | string)[];
|
|
26
|
+
}>;
|
|
27
|
+
export default Link;
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LoginForm — 登录/注册组件
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 使用纯 JSX 编写,展示 weifuwu/client 组件最佳实践。
|
|
5
|
+
*
|
|
6
|
+
* ```tsx
|
|
5
7
|
* import { LoginForm } from 'weifuwu/client'
|
|
6
8
|
*
|
|
7
9
|
* function LoginPage(_, ctx) {
|
|
8
10
|
* if (ctx.isAuthenticated) return ctx.app.navigate('/')
|
|
9
|
-
* return LoginForm
|
|
11
|
+
* return <LoginForm />
|
|
10
12
|
* }
|
|
11
13
|
* ```
|
|
12
14
|
*/
|
|
13
|
-
import type {
|
|
14
|
-
export declare
|
|
15
|
+
import type { Component } from '../jsx-runtime.ts';
|
|
16
|
+
export declare const LoginForm: Component<{}>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transition — 动画过渡组件
|
|
3
|
+
*
|
|
4
|
+
* 为元素的进入/离开添加 CSS 过渡动画。
|
|
5
|
+
* 配合 CSS 类名使用:{name}-enter / {name}-enter-active / {name}-leave / {name}-leave-active
|
|
6
|
+
*
|
|
7
|
+
* ```css
|
|
8
|
+
* .fade-enter { opacity: 0; }
|
|
9
|
+
* .fade-enter-active { opacity: 1; transition: opacity 0.3s; }
|
|
10
|
+
* .fade-leave { opacity: 1; }
|
|
11
|
+
* .fade-leave-active { opacity: 0; transition: opacity 0.2s; }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { Transition, signal } from 'weifuwu/client'
|
|
16
|
+
*
|
|
17
|
+
* function Modal({ show, children }) {
|
|
18
|
+
* return (
|
|
19
|
+
* <Transition show={show} name="fade">
|
|
20
|
+
* <div class="modal">{children}</div>
|
|
21
|
+
* </Transition>
|
|
22
|
+
* )
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import type { Signal } from '../signal.ts';
|
|
27
|
+
export interface TransitionProps {
|
|
28
|
+
show: boolean | Signal<boolean>;
|
|
29
|
+
/** CSS class 前缀,默认 "wefu-t" */
|
|
30
|
+
name?: string;
|
|
31
|
+
/** 动画超时回退(毫秒),默认 300 */
|
|
32
|
+
duration?: number;
|
|
33
|
+
children: Node | (() => Node);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Transition — 带动画的进入/离开组件。
|
|
37
|
+
*
|
|
38
|
+
* 使用 CSS transition/animation 控制元素出现和消失。
|
|
39
|
+
* 通过 `name` 属性指定 CSS class 前缀。
|
|
40
|
+
*/
|
|
41
|
+
export declare function Transition({ show, name, duration, children }: TransitionProps): Node;
|
|
42
|
+
export default Transition;
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* weifuwu/client — 响应式前端框架,TSX + Signal
|
|
3
3
|
*
|
|
4
|
+
* 零虚拟 DOM,零外部依赖。组件模型:(props, ctx) => Node。
|
|
5
|
+
*
|
|
4
6
|
* ```tsx
|
|
5
|
-
* import { signal,
|
|
7
|
+
* import { signal, createApp, api, auth, ws, router, RouteView, Show, For } from 'weifuwu/client'
|
|
6
8
|
* import type { WfuiContext } from 'weifuwu/client'
|
|
7
9
|
*
|
|
8
10
|
* const app = createApp()
|
|
@@ -12,18 +14,296 @@
|
|
|
12
14
|
* app.use(router({ routes }))
|
|
13
15
|
* app.mount('#root', AppShell)
|
|
14
16
|
* ```
|
|
17
|
+
*
|
|
18
|
+
* ## 核心概念
|
|
19
|
+
*
|
|
20
|
+
* | 导出 | 类型 | 用途 |
|
|
21
|
+
* |------|------|------|
|
|
22
|
+
* | `signal()` | function | 响应式数据容器 |
|
|
23
|
+
* | `computed()` | function | 衍生信号 |
|
|
24
|
+
* | `effect()` | function | 自动追踪依赖的副作用 |
|
|
25
|
+
* | `batch()` | function | 批量更新(合并多次写入为一次通知)|
|
|
26
|
+
* | `untrack()` | function | 不追踪依赖地读取信号 |
|
|
27
|
+
* | `onMount()` | function | 组件挂载回调 |
|
|
28
|
+
* | `onCleanup()` | function | 组件卸载回调 |
|
|
29
|
+
* | `createApp()` | function | 应用实例(中间件链 + 挂载) |
|
|
30
|
+
* | `createResource()` | function | 异步数据资源(loading/error/data)|
|
|
31
|
+
* | `createStyles()` | function | 组件级作用域 CSS |
|
|
32
|
+
* | `createContext()` | function | 类型安全上下文 |
|
|
33
|
+
* | `enableDevtools()` | function | 开发警告 + 浏览器检查器 |
|
|
34
|
+
*/
|
|
35
|
+
/** 创建响应式数据容器。变化时自动通知依赖方。 */
|
|
36
|
+
export { signal } from './signal.ts';
|
|
37
|
+
/** 基于其他 signal 的衍生值,自动缓存。 */
|
|
38
|
+
export { computed } from './signal.ts';
|
|
39
|
+
/** 自动追踪 signal 依赖,变化时重跑回调。返回 dispose 函数。 */
|
|
40
|
+
export { effect } from './signal.ts';
|
|
41
|
+
/** 检查一个值是否为 Signal 实例。 */
|
|
42
|
+
export { isSignal } from './signal.ts';
|
|
43
|
+
/**
|
|
44
|
+
* 批量更新 — 将多个信号写入合并为一次通知。
|
|
45
|
+
*
|
|
46
|
+
* ```ts
|
|
47
|
+
* batch(() => {
|
|
48
|
+
* a.value = 1
|
|
49
|
+
* b.value = 2
|
|
50
|
+
* })
|
|
51
|
+
* // 只触发一次 effect,而非两次
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export { batch } from './signal.ts';
|
|
55
|
+
/**
|
|
56
|
+
* 不追踪依赖地读取信号值。在 effect 中使用时,读取的信号变化不会触发重跑。
|
|
57
|
+
*
|
|
58
|
+
* ```ts
|
|
59
|
+
* effect(() => {
|
|
60
|
+
* console.log(count.value) // 追踪
|
|
61
|
+
* console.log(untrack(() => theme.value)) // 不追踪
|
|
62
|
+
* })
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export { untrack } from './signal.ts';
|
|
66
|
+
/**
|
|
67
|
+
* 响应式数组 — 提供便捷的可变数组方法。
|
|
68
|
+
*
|
|
69
|
+
* ```ts
|
|
70
|
+
* const items = reactiveArray([1, 2, 3])
|
|
71
|
+
* items.push(4)
|
|
72
|
+
* items.remove(0)
|
|
73
|
+
* items.clear()
|
|
74
|
+
* ```
|
|
15
75
|
*/
|
|
16
|
-
export {
|
|
76
|
+
export { reactiveArray } from './signal.ts';
|
|
77
|
+
/** ReactiveArray 类型 */
|
|
78
|
+
export type { ReactiveArray } from './signal.ts';
|
|
79
|
+
/** Signal 类型。 */
|
|
17
80
|
export type { Signal } from './signal.ts';
|
|
18
|
-
|
|
81
|
+
/** JSX 工厂函数 — 由 esbuild / tsc 自动调用。 */
|
|
82
|
+
export { jsx, jsxs, jsxDEV } from './jsx-runtime.ts';
|
|
83
|
+
/** 不产生包装元素的片段组件。 */
|
|
84
|
+
export { Fragment } from './jsx-runtime.ts';
|
|
85
|
+
/**
|
|
86
|
+
* 条件渲染 — when 为 Signal 时响应式切换。
|
|
87
|
+
*
|
|
88
|
+
* ```tsx
|
|
89
|
+
* <Show when={isLoggedIn} fallback={<LoginPage />}>
|
|
90
|
+
* <Dashboard />
|
|
91
|
+
* </Show>
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export { Show } from './jsx-runtime.ts';
|
|
95
|
+
/**
|
|
96
|
+
* 列表渲染 — each 为 Signal 时响应式更新。支持 keyBy 属性复用 DOM 节点。
|
|
97
|
+
*
|
|
98
|
+
* ```tsx
|
|
99
|
+
* <For each={items} keyBy="id">
|
|
100
|
+
* {(item) => <div>{item.name}</div>}
|
|
101
|
+
* </For>
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export { For } from './jsx-runtime.ts';
|
|
105
|
+
/** 直接挂载 DOM(低层 API,一般用 createApp().mount())。 */
|
|
106
|
+
export { domMount } from './jsx-runtime.ts';
|
|
107
|
+
/**
|
|
108
|
+
* 包装第三方库为组件 — 自动管理挂载/卸载生命周期。
|
|
109
|
+
*
|
|
110
|
+
* ```tsx
|
|
111
|
+
* const PieChart = wrap('div', (el, props, ctx) => {
|
|
112
|
+
* const chart = echarts.init(el)
|
|
113
|
+
* return () => chart.dispose()
|
|
114
|
+
* })
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export { wrap } from './jsx-runtime.ts';
|
|
118
|
+
/**
|
|
119
|
+
* Portal — 将节点渲染到目标 DOM 位置(Modal、Dropdown、Tooltip)。
|
|
120
|
+
*
|
|
121
|
+
* ```tsx
|
|
122
|
+
* <Show when={showModal}>
|
|
123
|
+
* {createPortal(<div class="fixed inset-0 ...">...</div>, document.body)}
|
|
124
|
+
* </Show>
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export { createPortal } from './jsx-runtime.ts';
|
|
128
|
+
/**
|
|
129
|
+
* ErrorBoundary — 捕获子组件渲染时的异常。children 必须是 thunk。
|
|
130
|
+
*
|
|
131
|
+
* ```tsx
|
|
132
|
+
* <ErrorBoundary fallback={(e) => <p>出错: {e.message}</p>}>
|
|
133
|
+
* {() => <Dashboard />}
|
|
134
|
+
* </ErrorBoundary>
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
export { ErrorBoundary } from './jsx-runtime.ts';
|
|
138
|
+
/**
|
|
139
|
+
* onMount — 组件根元素挂载到 DOM 后执行的回调。
|
|
140
|
+
* 返回函数在组件卸载时自动清理。
|
|
141
|
+
*
|
|
142
|
+
* ```tsx
|
|
143
|
+
* function Chart() {
|
|
144
|
+
* onMount(() => {
|
|
145
|
+
* const chart = echarts.init(el)
|
|
146
|
+
* return () => chart.dispose()
|
|
147
|
+
* })
|
|
148
|
+
* return <div ref={el => chartEl = el} />
|
|
149
|
+
* }
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
export { onMount } from './jsx-runtime.ts';
|
|
153
|
+
/**
|
|
154
|
+
* onCleanup — 组件卸载时执行的回调(清理定时器、订阅等)。
|
|
155
|
+
*
|
|
156
|
+
* ```tsx
|
|
157
|
+
* function Timer() {
|
|
158
|
+
* const id = setInterval(tick, 1000)
|
|
159
|
+
* onCleanup(() => clearInterval(id))
|
|
160
|
+
* return <div>...</div>
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export { onCleanup } from './jsx-runtime.ts';
|
|
165
|
+
/** 组件类型签名:(props, ctx) => Node */
|
|
19
166
|
export type { Component } from './jsx-runtime.ts';
|
|
20
|
-
|
|
167
|
+
/** 应用上下文 — 组件通过第二个参数 ctx 访问。 */
|
|
168
|
+
export type { WfuiContext } from './types.ts';
|
|
169
|
+
/** 中间件签名:(ctx) => ctx */
|
|
170
|
+
export type { AppMiddleware } from './types.ts';
|
|
171
|
+
/** 路由定义:path / component / auth / title / loader */
|
|
172
|
+
export type { RouteDef } from './types.ts';
|
|
173
|
+
/**
|
|
174
|
+
* 类型安全的上下文工厂 — 相比 ctx.provide('key', value) 的字符串 key 方式,
|
|
175
|
+
* createContext 返回类型化的 provide/inject,拼写错误编译时即被捕获。
|
|
176
|
+
*
|
|
177
|
+
* ```tsx
|
|
178
|
+
* const ThemeCtx = createContext<string>('theme')
|
|
179
|
+
* ThemeCtx.provide(ctx, 'dark')
|
|
180
|
+
* const theme = ThemeCtx.inject(ctx) // string | null
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
export { createContext } from './types.ts';
|
|
184
|
+
/**
|
|
185
|
+
* 创建 weifuwu/client 应用实例。
|
|
186
|
+
*
|
|
187
|
+
* ```tsx
|
|
188
|
+
* const app = createApp()
|
|
189
|
+
* app.use(api())
|
|
190
|
+
* app.use(auth())
|
|
191
|
+
* app.use(router({ routes }))
|
|
192
|
+
* await app.mount('#root', AppShell)
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
21
195
|
export { createApp } from './app.ts';
|
|
22
|
-
|
|
23
|
-
|
|
196
|
+
/**
|
|
197
|
+
* 路由中间件 — 注入 ctx.route / ctx.app.navigate。
|
|
198
|
+
* 支持 hash / history 模式,loader 数据预取,auth 守卫。
|
|
199
|
+
*/
|
|
200
|
+
export { router } from './router.ts';
|
|
201
|
+
/**
|
|
202
|
+
* RouteView 组件 — 渲染当前路由匹配的组件。
|
|
203
|
+
* 用 `<RouteView />` 放在布局中作为路由出口。
|
|
204
|
+
*/
|
|
205
|
+
export { RouteView } from './router.ts';
|
|
206
|
+
/** HTTP 客户端中间件 — 注入 ctx.api(get / post / put / patch / delete)。 */
|
|
207
|
+
export { api } from './middleware/api.ts';
|
|
208
|
+
/** ApiClient 类 — 独立于 ctx 的 HTTP 客户端。 */
|
|
209
|
+
export { ApiClient } from './middleware/api.ts';
|
|
210
|
+
/** ApiError — API 请求失败时抛出的错误,包含 status 字段。 */
|
|
211
|
+
export { ApiError } from './middleware/api.ts';
|
|
212
|
+
/**
|
|
213
|
+
* 身份认证中间件 — 注入 ctx.user / ctx.login / ctx.logout / ctx.register。
|
|
214
|
+
* 自动管理 localStorage 持久化和 token 验证。
|
|
215
|
+
*/
|
|
24
216
|
export { auth } from './middleware/auth.ts';
|
|
217
|
+
/** 用户记录类型 */
|
|
25
218
|
export type { UserRecord } from './middleware/auth.ts';
|
|
219
|
+
/**
|
|
220
|
+
* WebSocket 中间件 — 注入 ctx.ws(send / onMessage / join / leave)。
|
|
221
|
+
* 自动重连,支持房间。
|
|
222
|
+
*/
|
|
26
223
|
export { ws } from './middleware/ws.ts';
|
|
224
|
+
/**
|
|
225
|
+
* 表单状态管理 — 绑定字段信号、验证、提交。
|
|
226
|
+
*
|
|
227
|
+
* ```tsx
|
|
228
|
+
* const form = useForm({
|
|
229
|
+
* initial: { email: '', password: '' },
|
|
230
|
+
* validate: { email: (v) => !v.includes('@') && '邮箱格式错误' },
|
|
231
|
+
* })
|
|
232
|
+
* <input {...form.field('email')} placeholder="邮箱" />
|
|
233
|
+
* <button onClick={() => form.submit(data => ctx.login(data))}>登录</button>
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
27
236
|
export { useForm } from './lib/form.ts';
|
|
28
|
-
|
|
29
|
-
|
|
237
|
+
/**
|
|
238
|
+
* 异步数据资源管理 — 自动管理 loading / error / data 三态。
|
|
239
|
+
*
|
|
240
|
+
* ```tsx
|
|
241
|
+
* const [data, { loading, error }] = createResource(() => ctx.api.get('/api/posts'))
|
|
242
|
+
* <Show when={loading}><Skeleton /></Show>
|
|
243
|
+
* <For each={data}>{(post) => ...}</For>
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
export { createResource } from './lib/resource.ts';
|
|
247
|
+
export type { ResourceOptions } from './lib/resource.ts';
|
|
248
|
+
/**
|
|
249
|
+
* 表单双向绑定 — 一行代码绑定 signal 到 input。
|
|
250
|
+
*
|
|
251
|
+
* ```tsx
|
|
252
|
+
* const name = signal('')
|
|
253
|
+
* <input {...useModel(name)} placeholder="姓名" />
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
export { useModel } from './lib/model.ts';
|
|
257
|
+
/**
|
|
258
|
+
* 组件级作用域 CSS — 从 CSS-in-JS 对象生成唯一类名,样式自动注入 <head>。
|
|
259
|
+
*
|
|
260
|
+
* ```tsx
|
|
261
|
+
* const s = createStyles({
|
|
262
|
+
* card: 'background: white; border-radius: 8px;',
|
|
263
|
+
* title: 'font-size: 18px; color: #333;',
|
|
264
|
+
* })
|
|
265
|
+
* // <div class={s.card}><h2 class={s.title}>...</h2></div>
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
export { createStyles } from './lib/css.ts';
|
|
269
|
+
/**
|
|
270
|
+
* 启用开发者工具 — 开发警告 + 浏览器控制台 signal 检查器。
|
|
271
|
+
*
|
|
272
|
+
* ```ts
|
|
273
|
+
* import { enableDevtools } from 'weifuwu/client'
|
|
274
|
+
* if (import.meta.env.DEV) { enableDevtools() }
|
|
275
|
+
*
|
|
276
|
+
* // 在浏览器控制台: __wefu__.inspect()
|
|
277
|
+
* ```
|
|
278
|
+
*/
|
|
279
|
+
export { enableDevtools } from './lib/dev.ts';
|
|
280
|
+
/** 登录/注册表单组件。自动切换登录/注册模式。 */
|
|
281
|
+
export { LoginForm } from './components/LoginForm.tsx';
|
|
282
|
+
/** 实时消息聊天组件。对接后端 messager + agent 模块。 */
|
|
283
|
+
export { Chat } from './components/Chat.tsx';
|
|
284
|
+
/**
|
|
285
|
+
* 客户端路由导航 Link 组件。
|
|
286
|
+
* 替代原生 <a>,拦截点击走 SPA 路由,支持右键新标签页。
|
|
287
|
+
*
|
|
288
|
+
* ```tsx
|
|
289
|
+
* <Link to="/about">关于</Link>
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
export { Link } from './components/Link.tsx';
|
|
293
|
+
/**
|
|
294
|
+
* Transition — 动画过渡组件。
|
|
295
|
+
*
|
|
296
|
+
* ```css
|
|
297
|
+
* .fade-enter { opacity: 0; }
|
|
298
|
+
* .fade-enter-active { opacity: 1; transition: opacity 0.3s; }
|
|
299
|
+
* .fade-leave { opacity: 1; }
|
|
300
|
+
* .fade-leave-active { opacity: 0; transition: opacity 0.2s; }
|
|
301
|
+
* ```
|
|
302
|
+
*
|
|
303
|
+
* ```tsx
|
|
304
|
+
* <Transition show={isOpen} name="fade">
|
|
305
|
+
* <Modal />
|
|
306
|
+
* </Transition>
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
export { Transition } from './components/Transition.tsx';
|