weifuwu 0.64.0 → 0.65.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 +11 -3
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +4 -3
- package/dist/client/locale/en_US.d.ts +2 -0
- package/dist/client/locale/zh_CN.d.ts +2 -0
- package/dist/client/types.d.ts +159 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +3 -1
- package/dist/components/InfiniteScroll/InfiniteScroll.d.ts +3 -1
- package/dist/components/Resizable/Resizable.d.ts +3 -1
- package/dist/components/index.js +12 -13
- package/dist/index.js +59 -0
- package/docs/components-map.md +153 -0
- package/docs/components.md +346 -1
- package/docs/custom-components.md +237 -0
- package/docs/environment.md +32 -8
- package/docs/frontend.md +93 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4345,6 +4345,65 @@ function createSsrContext(serverCtx, dataStore) {
|
|
|
4345
4345
|
},
|
|
4346
4346
|
usePopupPosition: () => ({ top: 0, left: 0, refresh: () => {
|
|
4347
4347
|
} }),
|
|
4348
|
+
// 新原语族:SSR 确定性 no-op(不启动监听/会话/取数;组件挂载不崩即契约)
|
|
4349
|
+
useHoverCapable: () => false,
|
|
4350
|
+
useVisualViewport: () => ({ height: 0, offsetTop: 0, keyboardOpen: false }),
|
|
4351
|
+
useLongPress: () => ({}),
|
|
4352
|
+
useInView: () => ({ isIn: false, ready: false, observe: () => {
|
|
4353
|
+
}, refresh: () => {
|
|
4354
|
+
}, disconnect: () => {
|
|
4355
|
+
} }),
|
|
4356
|
+
useScrollPosition: () => ({ y: 0, refresh: () => {
|
|
4357
|
+
} }),
|
|
4358
|
+
useStableRef: (init) => (el) => {
|
|
4359
|
+
if (el) init?.(el);
|
|
4360
|
+
},
|
|
4361
|
+
useGlobalKey: () => () => {
|
|
4362
|
+
},
|
|
4363
|
+
useReducedMotion: () => false,
|
|
4364
|
+
useAnimationEnd: () => () => {
|
|
4365
|
+
},
|
|
4366
|
+
useTween: (target) => {
|
|
4367
|
+
const handle = { value: target, reset: (to) => {
|
|
4368
|
+
handle.value = to;
|
|
4369
|
+
} };
|
|
4370
|
+
return handle;
|
|
4371
|
+
},
|
|
4372
|
+
useDrag: () => ({ onPointerDown: () => {
|
|
4373
|
+
} }),
|
|
4374
|
+
useDragDrop: () => ({ dropProps: {} }),
|
|
4375
|
+
useControlled: (options) => ({
|
|
4376
|
+
value: options.value,
|
|
4377
|
+
setValue: (v) => {
|
|
4378
|
+
options.onChange?.(v);
|
|
4379
|
+
},
|
|
4380
|
+
controlled: options.value !== void 0
|
|
4381
|
+
}),
|
|
4382
|
+
useAsync: () => ({ data: void 0, loading: true, error: void 0, reload: () => {
|
|
4383
|
+
} }),
|
|
4384
|
+
usePopup: () => ({
|
|
4385
|
+
open: false,
|
|
4386
|
+
setOpen: () => {
|
|
4387
|
+
},
|
|
4388
|
+
wrapProps: {},
|
|
4389
|
+
portal: () => null,
|
|
4390
|
+
refresh: () => {
|
|
4391
|
+
}
|
|
4392
|
+
}),
|
|
4393
|
+
usePresence: () => ({
|
|
4394
|
+
phase: "closed",
|
|
4395
|
+
ref: () => {
|
|
4396
|
+
},
|
|
4397
|
+
sync: (open2) => open2 ? "open" : "closed"
|
|
4398
|
+
}),
|
|
4399
|
+
useDialog: () => ({
|
|
4400
|
+
phase: "closed",
|
|
4401
|
+
rootRef: () => {
|
|
4402
|
+
},
|
|
4403
|
+
panelRef: () => {
|
|
4404
|
+
},
|
|
4405
|
+
sync: (open2) => open2 ? "open" : "closed"
|
|
4406
|
+
}),
|
|
4348
4407
|
// SSR 确定性空态:会话不启动(无事件/无网络),仅保证挂载不崩
|
|
4349
4408
|
useChat: () => ({
|
|
4350
4409
|
messages: [],
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# weifuwu/components 组件速查(对应 antd / Element Plus / shadcn-ui)
|
|
2
|
+
|
|
3
|
+
> **开发者迁移速查**:从 antd / Element Plus / shadcn-ui 迁到 weifuwu,按功能找到对应组件。
|
|
4
|
+
> 左侧是 **weifuwu 组件**(已提供),右侧是对应的三库组件 + 差异备注。
|
|
5
|
+
> 真实未实现清单(仅 4 项):见文末「weifuwu 尚未实现」。
|
|
6
|
+
|
|
7
|
+
## 通用基础
|
|
8
|
+
|
|
9
|
+
| 功能 | weifuwu | antd | Element Plus | shadcn-ui | 差异说明 |
|
|
10
|
+
|------|---------|------|-------------|-----------|---------|
|
|
11
|
+
| 按钮 | `<Button variant size loading block>` | Button | Button | Button | 命名基本一致;weifuwu `variant`=primary/secondary/ghost/danger |
|
|
12
|
+
| 图标 | `<Icon name>`(自研 30+ stroke SVG) | Icon | Icon | lucide-react | weifuwu 零依赖、currentColor、1em 随字号;组件内部统一走 Icon |
|
|
13
|
+
| 文本排版 | `<Title/Text/Paragraph>` | Typography | Typography | — | 语义标签 + 语义色 `-text` 变体 + mark/code/删除线 |
|
|
14
|
+
| 分割线 | `<Divider>`(horizontal/vertical/带文字) | Divider | Divider | Separator | 等价 |
|
|
15
|
+
| 头像 | `<Avatar name src color size>` | Avatar | Avatar | Avatar | weifuwu 支持名字哈希色 + 指定色 |
|
|
16
|
+
| 头像组 | `<AvatarGroup items max size>` | Avatar.Group | 手动组合 | 手动组合 | weifuwu 独立组件,`max` 溢出显示 +N |
|
|
17
|
+
| 标签/标签组 | `<Label>`(required 星号)/ `<TagsInput>`(回车/逗号/去重) | Form.Item 标签 / Select tags | — | Label | Label 独立组件 |
|
|
18
|
+
|
|
19
|
+
## 导航
|
|
20
|
+
|
|
21
|
+
| 功能 | weifuwu | antd | Element Plus | shadcn-ui | 差异说明 |
|
|
22
|
+
|------|---------|------|-------------|-----------|---------|
|
|
23
|
+
| 菜单/侧栏 | `<Menu items group activeKey onSelect>`(方向键导航) | Menu | Menu | NavigationMenu / Sidebar | 分组 group 已支持;**子菜单/折叠未实现** |
|
|
24
|
+
| 面包屑 | `<Breadcrumb items>` | Breadcrumb | Breadcrumb | Breadcrumb | 等价 |
|
|
25
|
+
| 标签页 | `<Tabs items active onChange>`(方向键 + 移动端横向滚动) | Tabs | Tabs | Tabs | 等价 |
|
|
26
|
+
| 分页 | `<Pagination total page onChange>`(页码折叠 + 移动端 44px) | Pagination | Pagination | Pagination | 等价 |
|
|
27
|
+
| 步骤条 | `<Steps items current>` | Steps | Steps | — | 等价 |
|
|
28
|
+
| 下拉菜单 | `<Dropdown items>`(danger variant) | Dropdown | Dropdown | DropdownMenu | 等价(usePopup:外部点击/Escape 关闭) |
|
|
29
|
+
| 水平菜单栏 | `<Menubar menus>`(←→↓ 键盘 + 触屏) | Menu 水平 | Menu | Menubar | 等价 |
|
|
30
|
+
| 页面标题 | `<PageHeader title sub>` | PageHeader(v5 移除) | PageHeader | — | weifuwu 保留独立组件 |
|
|
31
|
+
| 回到顶部 | `<BackTop threshold>` | FloatButton / BackTop | Backtop | — | 滚动超阈值显示 |
|
|
32
|
+
| 固定定位 | `<Affix offsetTop>` | Affix | Affix | — | useScrollPosition 实现 |
|
|
33
|
+
| 锚点 | 未实现 | Anchor | Anchor | — | 待补 |
|
|
34
|
+
|
|
35
|
+
## 表单
|
|
36
|
+
|
|
37
|
+
| 功能 | weifuwu | antd | Element Plus | shadcn-ui | 差异说明 |
|
|
38
|
+
|------|---------|------|-------------|-----------|---------|
|
|
39
|
+
| 输入框 | `<Input label error hint variant>` | Input | Input | Input | weifuwu 自带 label/error/hint 包装(antd 需 Form.Item);`variant="borderless"` 内联编辑 |
|
|
40
|
+
| 文本域 | `<Textarea rows showCount maxLength>` | Input.TextArea | Input textarea | Textarea | weifuwu 独立组件 + 字数统计 |
|
|
41
|
+
| 选择器 | `<Select options searchable multiple>` | Select | Select | Select / Combobox | **searchable + 键盘 ↑↓ + multiple 已实现**(近 Combobox) |
|
|
42
|
+
| 复选框 | `<Checkbox checked label>` | Checkbox | Checkbox | Checkbox | 等价 |
|
|
43
|
+
| 复选组 | `<CheckboxGroup options value>` | Checkbox.Group | Checkbox 组 | — | 数组受控 + 栅格列数 |
|
|
44
|
+
| 单选 | `<RadioGroup options value>` | Radio.Group | Radio | RadioGroup | 等价 |
|
|
45
|
+
| 开关 | `<Switch checked>` | Switch | Switch | Switch | 等价 |
|
|
46
|
+
| 滑块 | `<Slider min max step>` | Slider | Slider | Slider | 等价 |
|
|
47
|
+
| 数字输入 | `<InputNumber min max step precision>`(增减按钮+clamp) | InputNumber | InputNumber | — | 等价 |
|
|
48
|
+
| 密码输入 | `<PasswordInput>`(眼睛切换) | Input.Password | Input show-password | — | weifuwu 独立组件 |
|
|
49
|
+
| 日期选择 | `<DatePicker mode="date\|datetime\|time\|range">`(四合一) | DatePicker / TimePicker / RangePicker | DatePicker / DateTimePicker / TimePicker | Calendar + DatePicker 组合 | **一个组件覆盖三库四个**;移动端 range 自动堆叠 |
|
|
50
|
+
| 评分 | `<Rate value>`(键盘方向键) | Rate | Rate | — | allowClear/readOnly |
|
|
51
|
+
| 验证码 | `<PinInput length>`(粘贴/回退/自动聚焦) | — | — | InputOTP | 等价 |
|
|
52
|
+
| 颜色选择 | `<ColorPicker value>`(预设色板 + hex) | ColorPicker | ColorPicker | — | Popover 弹层 |
|
|
53
|
+
| 标签输入 | `<TagsInput value onChange>`(回车/逗号/去重) | Select mode="tags" | 手动组合 | — | weifuwu 独立组件 |
|
|
54
|
+
| 搜索框 | `<SearchInput>` | Input.Search | Input search | — | weifuwu 独立组件 |
|
|
55
|
+
| 分段控件 | `<SegmentedControl options value>` | Segmented | — | ToggleGroup 近似 | weifuwu 独立组件 |
|
|
56
|
+
| 切换按钮 | `<Toggle>/<ToggleGroup>`(single/multiple) | — | — | ToggleGroup | shadcn 对齐 |
|
|
57
|
+
| 表单 | `<Form>` + `<Field label error>`(校验规则) | Form + Form.Item | Form + Form.Item | Form | weifuwu Field 轻量(无 Provider 样板) |
|
|
58
|
+
| 文件上传 | `<FileUpload drag multiple accept maxSize>` | Upload | Upload | — | 拖拽已支持;文件列表/预览/进度待增强 |
|
|
59
|
+
|
|
60
|
+
## 数据展示
|
|
61
|
+
|
|
62
|
+
| 功能 | weifuwu | antd | Element Plus | shadcn-ui | 差异说明 |
|
|
63
|
+
|------|---------|------|-------------|-----------|---------|
|
|
64
|
+
| 表格 | `<Table columns data sortable onSort>` | Table | Table | Table | 列排序 + **行选择/筛选/列宽已实现**;虚拟表格待补 |
|
|
65
|
+
| 卡片 | `<Card clickable hover padding>` | Card | Card | Card | clickable/hover 抬升/active 选中态 |
|
|
66
|
+
| 标签 | `<Tag variant closable>` | Tag | Tag | Badge(variant) | closable 已支持 |
|
|
67
|
+
| 徽标 | `<Badge variant dot>`(8px 状态点) | Badge | Badge | Badge | `dot` = 状态点 |
|
|
68
|
+
| 列表 | `<List items renderItem empty>` | List | 手动 v-for | — | 通用列表 |
|
|
69
|
+
| 时间线 | `<Timeline items status>` | Timeline | Timeline | — | 节点状态色 + 图标 |
|
|
70
|
+
| 描述列表 | `<Descriptions items column bordered>`(dl/dt/dd 语义) | Descriptions | Descriptions | — | 等价 |
|
|
71
|
+
| 统计卡片 | `<StatCard label value trend animate>` | Statistic | Statistic | — | 卡片形态 + 点击 + 动画 |
|
|
72
|
+
| 图片 | `<Img src fallback lazy preview>` | Image | Image | — | **preview 点击放大已实现** |
|
|
73
|
+
| 图表 | `<Chart type data>`(自研零依赖) | — | — | Chart(recharts 包装) | 自研 line/bar/pie,无运行时依赖 |
|
|
74
|
+
| 骨架屏 | `<Skeleton variant count>` | Skeleton | Skeleton | Skeleton | 等价 |
|
|
75
|
+
| 空状态 | `<EmptyState icon text hint>` | Empty | Empty | — | icon 用 emoji/Icon + 操作区 |
|
|
76
|
+
| 结果页 | `<Result status title desc extra>` | Result | Result | — | 等价(success/error/warning/info) |
|
|
77
|
+
| 搜索高亮 | `<Highlight text query>`(`<mark>` 分词) | — | — | — | weifuwu 独有(配 SearchInput/Table) |
|
|
78
|
+
| 树 | `<Tree data checkable checkedKeys>` | Tree | Tree | — | 勾选父子联动 + indeterminate |
|
|
79
|
+
| 级联 | `<Cascader options value>` | Cascader | Cascader | — | 多列面板逐级推进 |
|
|
80
|
+
| 穿梭框 | `<Transfer data targetKeys>` | Transfer | Transfer | — | 双列表 + 移动;移动端自动堆叠 |
|
|
81
|
+
| 月历 | `<Calendar month year events>` | Calendar | Calendar | — | 事件点 + 月切换 |
|
|
82
|
+
| 虚拟列表 | `<VirtualList height itemHeight>` | — | — | — | spacer + 可见窗口,200 条只渲染 ~12 |
|
|
83
|
+
|
|
84
|
+
## 反馈
|
|
85
|
+
|
|
86
|
+
| 功能 | weifuwu | antd | Element Plus | shadcn-ui | 差异说明 |
|
|
87
|
+
|------|---------|------|-------------|-----------|---------|
|
|
88
|
+
| 提示条 | `<Alert variant closable>` | Alert | Alert | Alert | 等价 |
|
|
89
|
+
| 模态框 | `<Modal open title onClose width>` | Modal | Dialog | Dialog | `open/onClose`(antd v5 同);焦点 trap + 归还;移动端 bottom-sheet |
|
|
90
|
+
| 确认框 | `<Confirm>` + `await confirm()` 命令式 | Popconfirm / Modal.confirm | Popconfirm / MessageBox | AlertDialog | 声明式 + 命令式双模式 |
|
|
91
|
+
| 抽屉 | `<Drawer position="left\|right\|top\|bottom">` | Drawer | Drawer | Sheet / Drawer | **四方向覆盖 shadcn Sheet + Drawer**;移动端全宽 |
|
|
92
|
+
| 气泡 | `<Popover position>`(视口夹紧) | Popover | Popover | Popover | 等价(usePopup:外部点击/Escape/tap 降级) |
|
|
93
|
+
| 悬浮提示 | `<Tooltip content position>`(string) | Tooltip | Tooltip | Tooltip | usePopup:桌面 hover / 触屏 tap |
|
|
94
|
+
| 悬停卡 | `<HoverCard content>`(富内容 + 延迟) | — | — | HoverCard | shadcn 对齐;触屏 tap |
|
|
95
|
+
| 右键菜单 | `<ContextMenu items>` | Dropdown context | — | ContextMenu | 桌面右键 + **触屏长按**双通道 |
|
|
96
|
+
| 消息 | `<Toast>` + `toast()` 命令式 | message | Message | Sonner | 命令式 `toast('已保存','success')` |
|
|
97
|
+
| 通知 | `<Notification>` + `notification.success()` | notification | Notification | — | 队列式通知 |
|
|
98
|
+
| 加载 | `<Loading>` | Spin | Loading | — | 等价 |
|
|
99
|
+
| 进度条 | `<ProgressBar value>` | Progress | Progress | Progress | 等价(线性) |
|
|
100
|
+
| 折叠 | `<Collapse items active>`(异步 loading + extra) | Collapse | Collapse | Collapse | 行内折叠(区别于 Accordion) |
|
|
101
|
+
| 手风琴 | `<Accordion items>` | Collapse accordion | Collapse accordion | Accordion | 单开折叠 |
|
|
102
|
+
| 复制按钮 | `<CopyButton value>`(clipboard + 降级 + 成功态) | — | — | — | Chat/CodeBlock 证据驱动 |
|
|
103
|
+
| 水印 | `<Watermark text>`(canvas 平铺 + overlay) | Watermark | — | — | 自研 |
|
|
104
|
+
| 二维码 | `<QRCode value>`(Reed-Solomon + 8 掩码) | QRCode | QRCode | — | **自研编码零依赖** |
|
|
105
|
+
| 轮播 | `<Carousel autoplay>`(箭头/圆点/循环 + 触摸) | Carousel | Carousel | — | 触摸滑动 + 触屏命中区 |
|
|
106
|
+
| 分割面板 | `<Resizable defaultSize>`(拖拽 + 键盘 + clamp) | Splitter | — | Resizable | 指针 + 方向键 |
|
|
107
|
+
| 回到顶部按钮 | `<BackTop>` | FloatButton.BackTop | Backtop | — | 滚动监听 |
|
|
108
|
+
|
|
109
|
+
## AI / 特色(三库无,weifuwu 独有)
|
|
110
|
+
|
|
111
|
+
| 组件 | 说明 |
|
|
112
|
+
|------|------|
|
|
113
|
+
| `<AiChat>` | 完整 AI 对话界面(流式 token/工具卡/审批卡/自动滚动),配 `ctx.ui.useChat()`;移动端 `raiseOnKeyboard` |
|
|
114
|
+
| `<Markdown content>` | 零依赖安全子集 parser(无 raw HTML 注入,VNode 渲染天然转义) |
|
|
115
|
+
| `<CodeBlock code lang>` | 代码块 + 语言标签 + 复制按钮 |
|
|
116
|
+
| `<MessageBubble role status>` | 聊天气泡(独立复用,AiChat 抽取) |
|
|
117
|
+
| `<ToolCallCard>` | AI 工具调用状态机(running/ok/error) |
|
|
118
|
+
| `<ApprovalCard>` | HITL 人工审批卡片(pending/approved/rejected/timeout) |
|
|
119
|
+
| `<Editor>` | 富文本编辑器(contentEditable + 工具栏/表格/图片,零依赖) |
|
|
120
|
+
| `<ThemeSwitch>` | 明暗主题切换(CSS 变量驱动,配 `data-theme`) |
|
|
121
|
+
| `<InView>` | 交叉观察(进入视口触发,可做无限滚动) |
|
|
122
|
+
| `<AspectRatio>` | 宽高比容器(内容填满) |
|
|
123
|
+
| `<CopyButton>` | 复制(clipboard + execCommand 降级 + 成功状态机) |
|
|
124
|
+
|
|
125
|
+
## 快速迁移路径(三库 → weifuwu)
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
// antd / shadcn 开发者
|
|
129
|
+
<Modal open={show} onClose={f}>…</Modal> // antd v5 同命名,直接迁移
|
|
130
|
+
<Select options={opts} value={v} onChange={f} /> // 同命名
|
|
131
|
+
<Button variant="primary">保存</Button> // antd type="primary" → variant
|
|
132
|
+
|
|
133
|
+
// Element Plus 开发者(v-model 模板语法 → value/onChange)
|
|
134
|
+
<Input :value="v" @input="f" /> // → <Input value={v} onInput={f} />
|
|
135
|
+
<ElDialog :visible="s" @close="f" /> // → <Modal open={s} onClose={f} />
|
|
136
|
+
<ElMessage>成功</ElMessage> // → toast('成功','success')
|
|
137
|
+
|
|
138
|
+
// shadcn 开发者(原子组合 → 成品)
|
|
139
|
+
<Dialog><DialogTrigger/>…</Dialog> // → <Modal open onClose> 一体组件
|
|
140
|
+
<Sheet><SheetTrigger/>…</Sheet> // → <Drawer position="bottom">
|
|
141
|
+
<Badge variant="secondary">x</Badge> // → <Tag variant="secondary">x</Tag>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## weifuwu 尚未实现(三库有)→ 待补清单
|
|
145
|
+
|
|
146
|
+
仅 4 项:
|
|
147
|
+
|
|
148
|
+
- **Anchor**(锚点导航,三库均有)
|
|
149
|
+
- **Menu 子菜单/折叠**(分组 group 已支持,子级/折叠待补)
|
|
150
|
+
- **FileUpload 增强**(拖拽已支持;文件列表/预览/进度待补)
|
|
151
|
+
- **VirtualTable**(VirtualList 已有,表格虚拟化待补)
|
|
152
|
+
|
|
153
|
+
> 难度阶梯(L1-L6)与验证的 client 能力点:见 `design/components-cdd.md`;三库 → weifuwu 覆盖矩阵:见 `design/components-migration.md`。
|
package/docs/components.md
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
92 个 HTML 原语组件。每个是 `(_init, ctx) => (props) => VNode`(两阶段组件,与前端框架同一模型),引用 `--wf-*` CSS 变量做主题。另含 `confirm()` / `toast()` 命令式中间件。
|
|
6
6
|
|
|
7
|
-
> **组件速查(weifuwu 组件 ↔ antd / Element Plus / shadcn-ui 对应 + 迁移示例)**:见 [`
|
|
7
|
+
> **组件速查(weifuwu 组件 ↔ antd / Element Plus / shadcn-ui 对应 + 迁移示例)**:见 [`docs/components-map.md`](components-map.md)——从其他组件库迁来的开发者按功能直接找对应组件。
|
|
8
|
+
> **自定义组件开发**:见 [docs/custom-components.md](custom-components.md)——usePopup/useControlled/对话框/AI 组件/类型纪律逐步指南。
|
|
8
9
|
|
|
9
10
|
```ts
|
|
10
11
|
import { Button, Input, Table, Modal, Toast } from 'weifuwu/components'
|
|
@@ -163,6 +164,350 @@ props 变化 ──────────────────────
|
|
|
163
164
|
| `局部刷新` | `ctx.ui.render()` 或 `$.x = val` |
|
|
164
165
|
| `跨组件刷新` | `ctx.ui.selfId('name')` + `render(['name'])` |
|
|
165
166
|
|
|
167
|
+
## 通用约定(所有组件一致)
|
|
168
|
+
|
|
169
|
+
### 受控模式
|
|
170
|
+
|
|
171
|
+
| 组件类型 | 受控 prop | 必须配回调 |
|
|
172
|
+
|----------|-----------|-----------|
|
|
173
|
+
| 开关/勾选(Checkbox/Switch/RadioGroup) | `checked` | `onChange` |
|
|
174
|
+
| 输入(Input/Select/DatePicker/Textarea) | `value` | `onChange` / `onInput` |
|
|
175
|
+
| 标签页/折叠(Tabs/Collapse) | `active` | `onChange` |
|
|
176
|
+
| 弹层(Modal/Drawer/Dropdown/Popover) | `open` | `onClose` / `onOpenChange` |
|
|
177
|
+
| 树/级联/穿梭(Tree/Cascader/Transfer) | `checkedKeys`/`value`/`targetKeys` | `onChange` |
|
|
178
|
+
| 月历(Calendar) | `month`/`year` | `onMonthChange` |
|
|
179
|
+
|
|
180
|
+
**规则**:传受控 props 而不传回调时,交互**静默失效**——组件 `console.warn` 明确提示(Collapse/Tree/Calendar/Cascader/Dropdown 已有防护)。非受控(不传受控 props)即可直接点击。
|
|
181
|
+
|
|
182
|
+
### size 变体
|
|
183
|
+
|
|
184
|
+
- `sm` / `md` / `lg`(Button/Avatar/Input 族)。未提供 size 的组件使用默认尺寸(CSS `--wf-control-pad-*` 驱动)。
|
|
185
|
+
- 触屏(coarse pointer)自动 44px 命中区,不受 size 影响。
|
|
186
|
+
|
|
187
|
+
### 事件命名
|
|
188
|
+
|
|
189
|
+
| 语义 | 命名 |
|
|
190
|
+
|------|------|
|
|
191
|
+
| 值变化(受控) | `onChange` |
|
|
192
|
+
| 原生输入 | `onInput` |
|
|
193
|
+
| 列表选中 | `onSelect` |
|
|
194
|
+
| 弹层开关 | `onOpenChange`(弹层)/ `onClose`(对话框) |
|
|
195
|
+
| 表格排序 | `onSort` |
|
|
196
|
+
|
|
197
|
+
### 命令式 API(无需组件)
|
|
198
|
+
|
|
199
|
+
`confirm()` / `toast()` / `notification.success()`——组件内 `ctx.confirm?.('确定?')` 直接可用(中间件注入)。
|
|
200
|
+
|
|
201
|
+
## 关键组件 Props 参考
|
|
202
|
+
> 从组件 TS 类型自动提取(`src/components/*/*.ts` 的 `interface XxxProps`)。
|
|
203
|
+
> 完整 props 以 TS 类型为准——`tsc` 编译期校验;此处为速查。受控约定:传受控 props 必须配回调(缺回调运行期 warn)。
|
|
204
|
+
|
|
205
|
+
### Button(表单/通用)
|
|
206
|
+
| Prop | 类型 | 说明 |
|
|
207
|
+
|------|------|------|
|
|
208
|
+
| `variant` | `'primary' \| 'secondary' \| 'ghost' \| 'danger'` | — |
|
|
209
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | — |
|
|
210
|
+
| `block` | `boolean` | — |
|
|
211
|
+
| `loading` | `boolean` | — |
|
|
212
|
+
| `disabled` | `boolean` | — |
|
|
213
|
+
| `type` | `'button' \| 'submit'` | — |
|
|
214
|
+
| `title` | `string` | — |
|
|
215
|
+
| `class` | `string` | 透传原生 class(覆盖默认 wf-btn 组合) |
|
|
216
|
+
| `onClick` | `(e: MouseEvent) => void` | — |
|
|
217
|
+
| `children` | `any` | — |
|
|
218
|
+
|
|
219
|
+
### Input(表单核心)
|
|
220
|
+
| Prop | 类型 | 说明 |
|
|
221
|
+
|------|------|------|
|
|
222
|
+
| `label` | `string` | — |
|
|
223
|
+
| `name` | `string` | — |
|
|
224
|
+
| `type` | `'text' \| 'email' \| 'password' \| 'number' \| 'url' \| 'date' \| 'tel' \| 'time' \| 'color'` | — |
|
|
225
|
+
| `value` | `string` | — |
|
|
226
|
+
| `placeholder` | `string` | — |
|
|
227
|
+
| `required` | `boolean` | — |
|
|
228
|
+
| `disabled` | `boolean` | — |
|
|
229
|
+
| `error` | `string` | — |
|
|
230
|
+
| `hint` | `string` | — |
|
|
231
|
+
| `variant` | `'default' \| 'borderless'` | 边框变体:borderless 用于可编辑标题/内联编辑(hover/focus 才显边框) |
|
|
232
|
+
| `onInput` | `(e: Event) => void` | — |
|
|
233
|
+
| `onChange` | `(e: Event) => void` | — |
|
|
234
|
+
| `min` | `string \| number` | 原生 input 属性透传(type=number 时 min/max/step 等) |
|
|
235
|
+
| `max` | `string \| number` | — |
|
|
236
|
+
| `step` | `string \| number` | — |
|
|
237
|
+
| `key` | `string]: any` | — |
|
|
238
|
+
|
|
239
|
+
### Textarea(表单核心)
|
|
240
|
+
| Prop | 类型 | 说明 |
|
|
241
|
+
|------|------|------|
|
|
242
|
+
| `label` | `string` | — |
|
|
243
|
+
| `value` | `string` | — |
|
|
244
|
+
| `placeholder` | `string` | — |
|
|
245
|
+
| `required` | `boolean` | — |
|
|
246
|
+
| `disabled` | `boolean` | — |
|
|
247
|
+
| `error` | `string` | — |
|
|
248
|
+
| `hint` | `string` | — |
|
|
249
|
+
| `rows` | `number` | — |
|
|
250
|
+
| `maxLength` | `number` | 最大字符数(同时限制输入) |
|
|
251
|
+
| `showCount` | `boolean` | 显示字数统计(右下角;配合受控 value 实时更新) |
|
|
252
|
+
| `onInput` | `(e: Event) => void` | — |
|
|
253
|
+
|
|
254
|
+
### Select(表单选择)
|
|
255
|
+
| Prop | 类型 | 说明 |
|
|
256
|
+
|------|------|------|
|
|
257
|
+
| `label` | `string` | — |
|
|
258
|
+
| `value` | `string \| string[]` | — |
|
|
259
|
+
| `options` | `SelectOption[]` | — |
|
|
260
|
+
| `placeholder` | `string` | — |
|
|
261
|
+
| `required` | `boolean` | — |
|
|
262
|
+
| `disabled` | `boolean` | — |
|
|
263
|
+
| `error` | `string` | — |
|
|
264
|
+
| `onChange` | `(value: string \| string[]) => void` | — |
|
|
265
|
+
| `children` | `any` | — |
|
|
266
|
+
| `searchable` | `boolean` | 启用搜索过滤 |
|
|
267
|
+
| `multiple` | `boolean` | 多选模式(searchable 下生效;value/onChange 为数组) |
|
|
268
|
+
| `onSearch` | `(keyword: string) => SelectOption[] \| Promise<SelectOption[]>` | 异步搜索回调,返回值作为新选项列表 |
|
|
269
|
+
|
|
270
|
+
### Checkbox(表单选择)
|
|
271
|
+
| Prop | 类型 | 说明 |
|
|
272
|
+
|------|------|------|
|
|
273
|
+
| `label` | `string` | — |
|
|
274
|
+
| `checked` | `boolean` | — |
|
|
275
|
+
| `disabled` | `boolean` | — |
|
|
276
|
+
| `onChange` | `(checked: boolean) => void` | — |
|
|
277
|
+
|
|
278
|
+
### Switch(表单选择)
|
|
279
|
+
| Prop | 类型 | 说明 |
|
|
280
|
+
|------|------|------|
|
|
281
|
+
| `label` | `string` | — |
|
|
282
|
+
| `checked` | `boolean` | — |
|
|
283
|
+
| `disabled` | `boolean` | — |
|
|
284
|
+
| `onChange` | `(checked: boolean) => void` | — |
|
|
285
|
+
|
|
286
|
+
### RadioGroup(表单选择)
|
|
287
|
+
| Prop | 类型 | 说明 |
|
|
288
|
+
|------|------|------|
|
|
289
|
+
| `name` | `string` | — |
|
|
290
|
+
| `value` | `string` | — |
|
|
291
|
+
| `options` | `RadioOption[]` | — |
|
|
292
|
+
| `inline` | `boolean` | — |
|
|
293
|
+
| `onChange` | `(value: string) => void` | — |
|
|
294
|
+
|
|
295
|
+
### DatePicker(表单选择)
|
|
296
|
+
| Prop | 类型 | 说明 |
|
|
297
|
+
|------|------|------|
|
|
298
|
+
| `mode` | `DatePickerMode` | — |
|
|
299
|
+
| `value` | `string` | — |
|
|
300
|
+
| `onChange` | `(value: string) => void` | — |
|
|
301
|
+
| `placeholder` | `string` | — |
|
|
302
|
+
| `disabled` | `boolean` | — |
|
|
303
|
+
|
|
304
|
+
### Form(表单增强)
|
|
305
|
+
| Prop | 类型 | 说明 |
|
|
306
|
+
|------|------|------|
|
|
307
|
+
| `onSubmit` | `(values: Record<string, any>) => void \| Promise<void>` | 提交回调,接收字段名→值的对象 |
|
|
308
|
+
| `validation` | `Record<string, ValidationRule[]>` | 验证规则:字段名 → 规则数组 |
|
|
309
|
+
| `onError` | `(errors: Record<string, string>) => void` | 验证失败时回调,接收字段名→错误消息的对象 |
|
|
310
|
+
| `children` | `any` | — |
|
|
311
|
+
|
|
312
|
+
### Field(表单增强)
|
|
313
|
+
| Prop | 类型 | 说明 |
|
|
314
|
+
|------|------|------|
|
|
315
|
+
| `label` | `string` | — |
|
|
316
|
+
| `required` | `boolean` | — |
|
|
317
|
+
| `error` | `string` | — |
|
|
318
|
+
| `hint` | `string` | — |
|
|
319
|
+
| `children` | `any` | — |
|
|
320
|
+
|
|
321
|
+
### Table(数据展示)
|
|
322
|
+
| Prop | 类型 | 说明 |
|
|
323
|
+
|------|------|------|
|
|
324
|
+
| `data` | `any[]` | — |
|
|
325
|
+
| `columns` | `TableColumn[]` | — |
|
|
326
|
+
| `onRowClick` | `(row: any, index: number) => void` | — |
|
|
327
|
+
| `sortKey` | `string` | 当前排序列的 key |
|
|
328
|
+
| `sortOrder` | `'asc' \| 'desc'` | 当前排序方向 |
|
|
329
|
+
| `onSort` | `(key: string, order: 'asc' \| 'desc') => void` | 排序变化回调 |
|
|
330
|
+
| `rowSelection` | `TableRowSelection` | 行选择(受控) |
|
|
331
|
+
| `emptyText` | `string` | 数据为空时显示的文本 |
|
|
332
|
+
| `minWidth` | `string` | 表格最小宽度(窄屏横向滚动,如 '720px') |
|
|
333
|
+
| `loading` | `boolean` | 加载中:保留表头,渲染骨架行 |
|
|
334
|
+
| `loadingRows` | `number` | 骨架行数,默认 3 |
|
|
335
|
+
|
|
336
|
+
### Modal(数据反馈)
|
|
337
|
+
| Prop | 类型 | 说明 |
|
|
338
|
+
|------|------|------|
|
|
339
|
+
| `open` | `boolean` | — |
|
|
340
|
+
| `title` | `string` | — |
|
|
341
|
+
| `onClose` | `() => void` | — |
|
|
342
|
+
| `children` | `any` | — |
|
|
343
|
+
| `footer` | `any` | — |
|
|
344
|
+
| `width` | `string` | 自定义宽度,如 '500px'、'80%',默认 400px |
|
|
345
|
+
| `closable` | `boolean` | 是否显示关闭按钮,默认 true |
|
|
346
|
+
| `maskClosable` | `boolean` | 点击遮罩是否关闭,默认 true(危险确认应设 false) |
|
|
347
|
+
|
|
348
|
+
### Drawer(数据反馈)
|
|
349
|
+
| Prop | 类型 | 说明 |
|
|
350
|
+
|------|------|------|
|
|
351
|
+
| `open` | `boolean` | — |
|
|
352
|
+
| `title` | `string` | — |
|
|
353
|
+
| `position` | `DrawerPosition` | — |
|
|
354
|
+
| `onClose` | `() => void` | — |
|
|
355
|
+
| `children` | `any` | — |
|
|
356
|
+
| `footer` | `any` | — |
|
|
357
|
+
|
|
358
|
+
### Confirm(数据反馈)
|
|
359
|
+
| Prop | 类型 | 说明 |
|
|
360
|
+
|------|------|------|
|
|
361
|
+
| `open` | `boolean` | — |
|
|
362
|
+
| `title` | `string` | — |
|
|
363
|
+
| `message` | `any` | 提示内容(文本或任意 VNode) |
|
|
364
|
+
| `confirmText` | `string` | — |
|
|
365
|
+
| `cancelText` | `string` | — |
|
|
366
|
+
| `variant` | `'primary' \| 'danger'` | — |
|
|
367
|
+
| `width` | `string` | 对话框宽度,如 '500px'、'80%',默认 Modal 的 400px |
|
|
368
|
+
| `maskClosable` | `boolean` | 遮罩点击是否取消(默认 false:危险操作防误触;显式传 true 可恢复) |
|
|
369
|
+
| `onConfirm` | `() => void` | — |
|
|
370
|
+
| `onCancel` | `() => void` | — |
|
|
371
|
+
|
|
372
|
+
### Toast(数据反馈)
|
|
373
|
+
| Prop | 类型 | 说明 |
|
|
374
|
+
|------|------|------|
|
|
375
|
+
| `toasts` | `ToastItem[]` | — |
|
|
376
|
+
| `onRemove` | `(id: string) => void` | — |
|
|
377
|
+
| `position` | `ToastPosition` | 容器位置,默认 top-right |
|
|
378
|
+
| `duration` | `number` | 全局默认自动消失时间(ms),0 = 不自动消失,默认 0 |
|
|
379
|
+
| `max` | `number` | 最大显示条数,超出时移除最早条目,默认 0 = 不限制 |
|
|
380
|
+
|
|
381
|
+
### Tooltip(数据反馈)
|
|
382
|
+
| Prop | 类型 | 说明 |
|
|
383
|
+
|------|------|------|
|
|
384
|
+
| `content` | `string` | — |
|
|
385
|
+
| `position` | `TooltipPosition` | — |
|
|
386
|
+
| `children` | `any` | — |
|
|
387
|
+
| `disabled` | `boolean` | — |
|
|
388
|
+
|
|
389
|
+
### Popover(数据反馈)
|
|
390
|
+
| Prop | 类型 | 说明 |
|
|
391
|
+
|------|------|------|
|
|
392
|
+
| `content` | `any` | — |
|
|
393
|
+
| `trigger` | `'click' \| 'hover'` | — |
|
|
394
|
+
| `position` | `PopoverPosition` | — |
|
|
395
|
+
| `open` | `boolean` | — |
|
|
396
|
+
| `onOpenChange` | `(open: boolean) => void` | — |
|
|
397
|
+
| `disabled` | `boolean` | — |
|
|
398
|
+
| `children` | `any` | — |
|
|
399
|
+
|
|
400
|
+
### Dropdown(导航组件)
|
|
401
|
+
| Prop | 类型 | 说明 |
|
|
402
|
+
|------|------|------|
|
|
403
|
+
| `trigger` | `any` | — |
|
|
404
|
+
| `items` | `DropdownItem[]` | — |
|
|
405
|
+
| `open` | `boolean` | — |
|
|
406
|
+
| `onOpenChange` | `(open: boolean) => void` | 关闭回调(面板内 Escape / 外部点击) |
|
|
407
|
+
|
|
408
|
+
### Tabs(导航组件)
|
|
409
|
+
| Prop | 类型 | 说明 |
|
|
410
|
+
|------|------|------|
|
|
411
|
+
| `items` | `TabItem[]` | — |
|
|
412
|
+
| `active` | `string` | — |
|
|
413
|
+
| `onChange` | `(key: string) => void` | — |
|
|
414
|
+
|
|
415
|
+
### Pagination(导航组件)
|
|
416
|
+
| Prop | 类型 | 说明 |
|
|
417
|
+
|------|------|------|
|
|
418
|
+
| `total` | `number` | — |
|
|
419
|
+
| `page` | `number` | — |
|
|
420
|
+
| `pageSize` | `number` | — |
|
|
421
|
+
| `onChange` | `(page: number) => void` | — |
|
|
422
|
+
|
|
423
|
+
### Tree(新增批次)
|
|
424
|
+
| Prop | 类型 | 说明 |
|
|
425
|
+
|------|------|------|
|
|
426
|
+
| `data` | `TreeNode[]` | — |
|
|
427
|
+
| `selectedKeys` | `string[]` | 受控选中 keys |
|
|
428
|
+
| `onSelect` | `(keys: string[]) => void` | — |
|
|
429
|
+
| `expandedKeys` | `string[]` | 受控展开 keys |
|
|
430
|
+
| `onExpand` | `(keys: string[]) => void` | — |
|
|
431
|
+
| `checkable` | `boolean` | 勾选模式(父子联动,antd 非 strict 语义) |
|
|
432
|
+
| `checkedKeys` | `string[]` | — |
|
|
433
|
+
| `onCheck` | `(keys: string[]) => void` | — |
|
|
434
|
+
| `className` | `string` | — |
|
|
435
|
+
|
|
436
|
+
### Cascader(新增批次)
|
|
437
|
+
| Prop | 类型 | 说明 |
|
|
438
|
+
|------|------|------|
|
|
439
|
+
| `options` | `CascaderOption[]` | — |
|
|
440
|
+
| `value` | `string[]` | 选中路径(数组,如 ['zj','hz','xh']) |
|
|
441
|
+
| `onChange` | `(value: string[]) => void` | — |
|
|
442
|
+
| `placeholder` | `string` | — |
|
|
443
|
+
| `disabled` | `boolean` | — |
|
|
444
|
+
| `error` | `string` | — |
|
|
445
|
+
| `label` | `string` | — |
|
|
446
|
+
|
|
447
|
+
### Transfer(新增批次)
|
|
448
|
+
| Prop | 类型 | 说明 |
|
|
449
|
+
|------|------|------|
|
|
450
|
+
| `data` | `TransferItem[]` | — |
|
|
451
|
+
| `targetKeys` | `string[]` | 目标侧已选 keys |
|
|
452
|
+
| `onChange` | `(targetKeys: string[]) => void` | — |
|
|
453
|
+
| `titles` | `[string, string]` | — |
|
|
454
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | — |
|
|
455
|
+
| `disabled` | `boolean` | — |
|
|
456
|
+
|
|
457
|
+
### Carousel(新增批次)
|
|
458
|
+
| Prop | 类型 | 说明 |
|
|
459
|
+
|------|------|------|
|
|
460
|
+
| `children` | `any[]` | — |
|
|
461
|
+
| `autoplay` | `boolean` | 自动播放 |
|
|
462
|
+
| `interval` | `number` | 自动播放间隔(ms),默认 3000 |
|
|
463
|
+
| `showArrows` | `boolean` | — |
|
|
464
|
+
| `showDots` | `boolean` | — |
|
|
465
|
+
| `loop` | `boolean` | 循环播放(尾 → 头),默认 true |
|
|
466
|
+
| `className` | `string` | — |
|
|
467
|
+
|
|
468
|
+
### Calendar(新增批次)
|
|
469
|
+
| Prop | 类型 | 说明 |
|
|
470
|
+
|------|------|------|
|
|
471
|
+
| `events` | `CalendarEvent[]` | — |
|
|
472
|
+
| `month` | `number` | 受控年月:month 0-11,year 四位数 |
|
|
473
|
+
| `year` | `number` | — |
|
|
474
|
+
| `onMonthChange` | `(month: number, year: number) => void` | — |
|
|
475
|
+
| `onSelectDate` | `(date: string) => void` | — |
|
|
476
|
+
| `selectedDate` | `string` | — |
|
|
477
|
+
|
|
478
|
+
### AiChat(AI 交互)
|
|
479
|
+
| Prop | 类型 | 说明 |
|
|
480
|
+
|------|------|------|
|
|
481
|
+
| `chat` | `UseChatHandle` | ctx.ui.useChat() 返回的会话 handle(同一 $,状态变化自动重渲染) |
|
|
482
|
+
| `maxHeight` | `string` | 消息列表最大高度(默认 '70vh') |
|
|
483
|
+
| `labels` | `Partial<AiChatLabels>` | 界面文案覆盖 |
|
|
484
|
+
| `renderMessage` | `(msg: UiMessage) => any` | 自定义气泡渲染逃生舱(默认纯文本) |
|
|
485
|
+
| `renderToolArgs` | `(args: Record<string, unknown>) => any` | 工具参数渲染(透传 ToolCallCard) |
|
|
486
|
+
| `raiseOnKeyboard` | `boolean` | 键盘弹起时输入区 fixed 抬升(全屏 chat 布局用;内联卡片默认 false——原生聚焦滚动已够) |
|
|
487
|
+
|
|
488
|
+
### FileUpload(表单增强)
|
|
489
|
+
| Prop | 类型 | 说明 |
|
|
490
|
+
|------|------|------|
|
|
491
|
+
| `accept` | `string` | — |
|
|
492
|
+
| `multiple` | `boolean` | — |
|
|
493
|
+
| `maxSize` | `number` | — |
|
|
494
|
+
| `disabled` | `boolean` | — |
|
|
495
|
+
| `error` | `string` | — |
|
|
496
|
+
| `hint` | `string` | — |
|
|
497
|
+
| `value` | `File[]` | — |
|
|
498
|
+
| `onChange` | `(files: File[]) => void` | — |
|
|
499
|
+
| `children` | `any` | — |
|
|
500
|
+
|
|
501
|
+
### Slider(表单选择)
|
|
502
|
+
| Prop | 类型 | 说明 |
|
|
503
|
+
|------|------|------|
|
|
504
|
+
| `label` | `string` | — |
|
|
505
|
+
| `value` | `number \| string` | — |
|
|
506
|
+
| `min` | `number` | — |
|
|
507
|
+
| `max` | `number` | — |
|
|
508
|
+
| `step` | `number` | — |
|
|
509
|
+
| `onChange` | `(value: number) => void` | — |
|
|
510
|
+
|
|
166
511
|
## 组件列表
|
|
167
512
|
|
|
168
513
|
### 表单核心
|