weifuwu 0.67.2 → 0.68.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/dist/index.js CHANGED
@@ -4250,6 +4250,34 @@ function createReactiveState(dirty) {
4250
4250
  const watchers = /* @__PURE__ */ new Set();
4251
4251
  const reactive = (target) => {
4252
4252
  if (target === null || typeof target !== "object") return target;
4253
+ if (target instanceof Set || target instanceof Map) {
4254
+ if (proxyCache.has(target)) return proxyCache.get(target);
4255
+ const MUTATING = target instanceof Set ? /* @__PURE__ */ new Set(["add", "delete", "clear"]) : /* @__PURE__ */ new Set(["set", "delete", "clear"]);
4256
+ const proxy2 = new Proxy(target, {
4257
+ get(t, prop) {
4258
+ const v = Reflect.get(t, prop);
4259
+ if (typeof v === "function") {
4260
+ if (!MUTATING.has(String(prop))) return v.bind(t);
4261
+ return (...args) => {
4262
+ const result = v.apply(t, args);
4263
+ dirty();
4264
+ for (const w of watchers) w();
4265
+ return result;
4266
+ };
4267
+ }
4268
+ return v;
4269
+ },
4270
+ set(t, key, value) {
4271
+ Reflect.set(t, key, value);
4272
+ dirty();
4273
+ for (const w of watchers) w();
4274
+ return true;
4275
+ }
4276
+ });
4277
+ proxyCache.set(target, proxy2);
4278
+ return proxy2;
4279
+ }
4280
+ if (target instanceof Date || target instanceof RegExp) return target;
4253
4281
  if (proxyCache.has(target)) return proxyCache.get(target);
4254
4282
  const proxy = new Proxy(target, {
4255
4283
  set(target2, key, value) {
@@ -4379,6 +4407,28 @@ function createSsrContext(serverCtx, dataStore) {
4379
4407
  },
4380
4408
  controlled: options.value !== void 0
4381
4409
  }),
4410
+ useControlledInput: (options) => ({
4411
+ value: options.value,
4412
+ setValue: (v) => {
4413
+ options.onChange?.(v);
4414
+ },
4415
+ controlled: options.value !== void 0,
4416
+ keyword: "",
4417
+ setKeyword: () => {
4418
+ },
4419
+ selectedLabel: "",
4420
+ setSelectedLabel: () => {
4421
+ }
4422
+ }),
4423
+ useOpen: (options) => ({
4424
+ get open() {
4425
+ return !!options.open;
4426
+ },
4427
+ setOpen: (v) => {
4428
+ options.onOpenChange?.(v);
4429
+ },
4430
+ triggerProps: {}
4431
+ }),
4382
4432
  useAsync: () => ({ data: void 0, loading: true, error: void 0, reload: () => {
4383
4433
  } }),
4384
4434
  usePopup: () => ({
@@ -4631,7 +4681,7 @@ function ui() {
4631
4681
  console.log(`[ui:js-cache] \u8BF7\u6C42: ${absPath.split("/").pop()} (cached=${!!cached})`);
4632
4682
  if (cached && await jsCacheFresh(cached.inputs)) {
4633
4683
  return new Response(cached.code, {
4634
- headers: { "Content-Type": "application/javascript", "Cache-Control": "no-cache" }
4684
+ headers: { "Content-Type": "application/javascript", "Cache-Control": "no-store" }
4635
4685
  });
4636
4686
  }
4637
4687
  const result = await build({
@@ -4660,7 +4710,7 @@ function ui() {
4660
4710
  console.log(`[ui:js-cache] \u7F16\u8BD1: ${absPath.split("/").pop()} (${Object.keys(inputs).length} inputs, ${(code.length / 1024).toFixed(0)}KB)`);
4661
4711
  jsCache.set(absPath, { code, inputs });
4662
4712
  return new Response(code, {
4663
- headers: { "Content-Type": "application/javascript", "Cache-Control": "no-cache" }
4713
+ headers: { "Content-Type": "application/javascript", "Cache-Control": "no-store" }
4664
4714
  });
4665
4715
  },
4666
4716
  async css(entryPath) {
@@ -4669,7 +4719,7 @@ function ui() {
4669
4719
  const cached = cssCache.get(absPath);
4670
4720
  if (cached && cached.mtime === st.mtimeMs) {
4671
4721
  return new Response(cached.code, {
4672
- headers: { "Content-Type": "text/css; charset=utf-8", "Cache-Control": "no-cache" }
4722
+ headers: { "Content-Type": "text/css; charset=utf-8", "Cache-Control": "no-store" }
4673
4723
  });
4674
4724
  }
4675
4725
  let code = await readFile(absPath, "utf-8");
@@ -4687,7 +4737,7 @@ function ui() {
4687
4737
  }
4688
4738
  cssCache.set(absPath, { code, mtime: st.mtimeMs });
4689
4739
  return new Response(code, {
4690
- headers: { "Content-Type": "text/css; charset=utf-8", "Cache-Control": "no-cache" }
4740
+ headers: { "Content-Type": "text/css; charset=utf-8", "Cache-Control": "no-store" }
4691
4741
  });
4692
4742
  }
4693
4743
  };
@@ -94,8 +94,14 @@
94
94
  --wf-z-tour: 2000;
95
95
  --wf-tour-min-width: 240px;
96
96
  --wf-kanban-col-min-width: 200px;
97
+ /* Layout 布局外壳(batch-8) */
98
+ --wf-layout-sider-width: 240px;
99
+ --wf-layout-sider-collapsed-width: 64px;
100
+ --wf-layout-header-height: 56px;
97
101
  --wf-kanban-col-max-width: 300px;
98
102
  --wf-treeselect-min-width: 200px;
103
+ --wf-navmenu-min-width: 160px;
104
+ --wf-select-menu-min-width: 200px;
99
105
  --wf-treeselect-max-width: 320px;
100
106
  --wf-treeselect-dropdown-max-height: 260px;
101
107
  --wf-z-popover: 120; /* dropdown/select/datepicker 面板与 popover 同层 */
@@ -168,8 +174,9 @@
168
174
  /* ── 边框宽度 ── */
169
175
  --wf-border-width: 1px;
170
176
 
171
- /* ── 聚焦环(引用 primary-bg,暗色自动跟随) ── */
172
- --wf-focus-ring: 0 0 0 2px var(--wf-color-primary-bg);
177
+ /* ── 聚焦环(双层:淡环 bg + 1px primary 线——C5:系统暗色偏好下 primary-bg
178
+ 变暗不可见,primary 是亮蓝——明暗主题聚焦均可见) ── */
179
+ --wf-focus-ring: 0 0 0 2px var(--wf-color-primary-bg), 0 0 0 1px var(--wf-color-primary);
173
180
 
174
181
  /* ── 动效 ── */
175
182
  --wf-transition-duration: 150ms;
@@ -537,6 +544,12 @@ code {
537
544
  scroll-behavior: auto !important;
538
545
  }
539
546
  }
547
+
548
+ /* 拖拽中禁用文本选中(useDragDrop 拖拽生命周期标记——Kanban 教训) */
549
+ body.wf-dragging {
550
+ user-select: none;
551
+ -webkit-user-select: none;
552
+ }
540
553
  }
541
554
 
542
555
  @layer layout {
@@ -0,0 +1,290 @@
1
+ # 三库 → weifuwu 完整映射表(antd / Element Plus / shadcn-ui)
2
+
3
+ > **逆向迁移速查**:从三库任意组件出发,找到 weifuwu 中的对应能力。
4
+ > 状态:✅ 已有 · 🆕 batch-8(v0.68.0) · 🔧 框架内置(client/layout)
5
+ > 与 `components-map.md`(weifuwu → 三库)互为逆向。
6
+
7
+ ---
8
+
9
+ ## antd(84 项)
10
+
11
+ ### 通用基础
12
+ | antd | weifuwu | 状态 | 备注 |
13
+ |------|---------|:----:|------|
14
+ | Button | `<Button>` | ✅ | variant/size/loading/block |
15
+ | Icon | `<Icon name>` | ✅ | 自研 30+ stroke SVG |
16
+ | Typography.Title/Text/Paragraph | `<Title>/<Text>/<Paragraph>` | ✅ | — |
17
+ | Typography.Link | `<Link>`(batch-8) | 🆕 | — |
18
+ | Divider | `<Divider>` | ✅ | 含带文字 |
19
+ | Space | `<Space>` | 🆕 | — |
20
+ | Flex | `<Grid flex>` | 🆕 | flex 容器模式 |
21
+ | Grid(Row/Col) | `<Grid>` | 🆕 | 24 栅格 + gutter |
22
+ | Splitter | `<Resizable>` | ✅ | — |
23
+ | Avatar / Avatar.Group | `<Avatar>/<AvatarGroup>` | ✅ | — |
24
+ | Badge | `<Badge>` | ✅ | 含 dot 状态点 |
25
+ | Calendar | `<Calendar>` | ✅ | — |
26
+
27
+ ### 导航
28
+ | antd | weifuwu | 状态 | 备注 |
29
+ |------|---------|:----:|------|
30
+ | Menu | `<Menu>` | ✅ | 含分组/方向键 |
31
+ | Breadcrumb | `<Breadcrumb>` | ✅ | — |
32
+ | Dropdown | `<Dropdown>` | ✅ | — |
33
+ | Pagination | `<Pagination>` | ✅ | — |
34
+ | Steps | `<Steps>` | ✅ | — |
35
+ | Tabs | `<Tabs>` | ✅ | — |
36
+ | Anchor | `<Anchor>` | ✅ | — |
37
+ | Affix | `<Affix>` | ✅ | — |
38
+ | BackTop | `<BackTop>` | ✅ | — |
39
+ | Layout / Layout.Header / Layout.Sider / Layout.Content / Layout.Footer | `<Layout>` + LayoutHeader/LayoutSider/LayoutContent/LayoutFooter | 🆕 | — |
40
+ | PageHeader | `<PageHeader>` | ✅ | antd v5 已移除,weifuwu 保留 |
41
+ | FloatButton | `<FloatButton>` | 🆕 | — |
42
+ | AutoComplete | `<AutoComplete>` | 🆕 | — |
43
+
44
+ ### 表单
45
+ | antd | weifuwu | 状态 | 备注 |
46
+ |------|---------|:----:|------|
47
+ | Input | `<Input>` | ✅ | 含 label/error/hint |
48
+ | Input.TextArea | `<Textarea>` | ✅ | — |
49
+ | Input.Search | `<SearchInput>` | ✅ | — |
50
+ | Input.Password | `<PasswordInput>` | ✅ | — |
51
+ | InputNumber | `<InputNumber>` | ✅ | — |
52
+ | Select | `<Select searchable multiple>` | ✅ | — |
53
+ | Checkbox / Checkbox.Group | `<Checkbox>/<CheckboxGroup>` | ✅ | — |
54
+ | Radio / Radio.Group | `<RadioGroup>` | ✅ | — |
55
+ | Switch | `<Switch>` | ✅ | — |
56
+ | Slider | `<Slider>` | ✅ | — |
57
+ | DatePicker / TimePicker / RangePicker | `<DatePicker mode="date\|time\|datetime\|range">` | ✅ | 一组件覆盖四 |
58
+ | Rate | `<Rate>` | ✅ | — |
59
+ | Cascader | `<Cascader>` | ✅ | — |
60
+ | Transfer | `<Transfer>` | ✅ | — |
61
+ | TreeSelect | `<TreeSelect>` | ✅ | — |
62
+ | Mentions | `<Mentions>` | ✅ | — |
63
+ | Upload | `<FileUpload>` | ✅ | — |
64
+ | ColorPicker | `<ColorPicker>` | ✅ | — |
65
+ | Form / Form.Item | `<Form>` + `<Field>` | ✅ | — |
66
+
67
+ ### 数据展示
68
+ | antd | weifuwu | 状态 | 备注 |
69
+ |------|---------|:----:|------|
70
+ | Table | `<Table>` | ✅ | 排序/行选择/筛选/列宽 |
71
+ | List | `<List>` | ✅ | — |
72
+ | Card | `<Card>` | ✅ | — |
73
+ | Descriptions | `<Descriptions>` | ✅ | — |
74
+ | Tabs | `<Tabs>` | ✅ | — |
75
+ | Tag | `<Tag>` | ✅ | — |
76
+ | Timeline | `<Timeline>` | ✅ | — |
77
+ | Tree | `<Tree>` | ✅ | 勾选父子联动 |
78
+ | Tooltip | `<Tooltip>` | ✅ | — |
79
+ | Popover | `<Popover>` | ✅ | — |
80
+ | Tour | `<Tour>` | ✅ | — |
81
+ | Empty | `<EmptyState>` | ✅ | — |
82
+ | Skeleton | `<Skeleton>` | ✅ | — |
83
+ | Statistic / Statistic.Countdown | `<StatCard countdown>` | 🆕 | countdown 增强 |
84
+ | Segmented | `<SegmentedControl>` | ✅ | — |
85
+ | Image / Image.PreviewGroup | `<Img preview>` | ✅ | — |
86
+ | QRCode | `<QRCode>` | ✅ | — |
87
+ | Spin | `<Loading>` | ✅ | — |
88
+ | Carousel | `<Carousel>` | ✅ | — |
89
+ | Watermark | `<Watermark>` | ✅ | — |
90
+
91
+ ### 反馈
92
+ | antd | weifuwu | 状态 | 备注 |
93
+ |------|---------|:----:|------|
94
+ | Alert | `<Alert>` | ✅ | — |
95
+ | Modal | `<Modal>` | ✅ | — |
96
+ | Popconfirm | `<Popconfirm>` | 🆕 | — |
97
+ | message | `<Toast>` + `toast()` | ✅ | — |
98
+ | notification | `<Notification>` | ✅ | — |
99
+ | Drawer | `<Drawer position>` | ✅ | 四向 |
100
+ | Progress | `<ProgressBar>` | ✅ | — |
101
+ | Result | `<Result>` | ✅ | — |
102
+ | Skeleton | `<Skeleton>` | ✅ | — |
103
+ | Spin | `<Loading>` | ✅ | — |
104
+
105
+ ### 框架级
106
+ | antd | weifuwu | 状态 | 备注 |
107
+ |------|---------|:----:|------|
108
+ | App | `createApp` | 🔧 | client 框架内置 |
109
+ | ConfigProvider | `--wf-*` token + ctx 注入 | 🔧 | client 框架内置 |
110
+
111
+ ---
112
+
113
+ ## Element Plus(74 项)
114
+
115
+ ### 基础
116
+ | EP | weifuwu | 状态 | 备注 |
117
+ |----|---------|:----:|------|
118
+ | Button | `<Button>` | ✅ | — |
119
+ | Icon | `<Icon>` | ✅ | — |
120
+ | Link | `<Link>` | 🆕 | — |
121
+ | Divider | `<Divider>` | ✅ | — |
122
+ | Space | `<Space>` | 🆕 | — |
123
+ | Color | `--wf-*` token | 🔧 | layout token |
124
+ | Border | `--wf-border-*` token | 🔧 | layout token |
125
+ | Text | `<Text>`(Typography) | ✅ | — |
126
+ | Scrollbar | `<Scrollbar>` | 🆕 | — |
127
+
128
+ ### 布局
129
+ | EP | weifuwu | 状态 | 备注 |
130
+ |----|---------|:----:|------|
131
+ | Container / Header / Aside / Main / Footer | `<Layout>` + LayoutHeader/LayoutSider/LayoutContent/LayoutFooter | 🆕 | — |
132
+ | Row / Col | `<Grid>` | 🆕 | 24 栅格 |
133
+
134
+ ### 表单
135
+ | EP | weifuwu | 状态 | 备注 |
136
+ |----|---------|:----:|------|
137
+ | Input | `<Input>` | ✅ | — |
138
+ | InputNumber | `<InputNumber>` | ✅ | — |
139
+ | Autocomplete | `<AutoComplete>` | 🆕 | — |
140
+ | Select | `<Select searchable>` | ✅ | — |
141
+ | Cascader | `<Cascader>` | ✅ | — |
142
+ | Switch | `<Switch>` | ✅ | — |
143
+ | Slider | `<Slider>` | ✅ | — |
144
+ | TimePicker / TimeSelect | `<DatePicker mode="time">` | ✅ | — |
145
+ | DatePicker / DateTimePicker | `<DatePicker mode="date\|datetime">` | ✅ | — |
146
+ | Upload | `<FileUpload>` | ✅ | — |
147
+ | Rate | `<Rate>` | ✅ | — |
148
+ | ColorPicker | `<ColorPicker>` | ✅ | — |
149
+ | Transfer | `<Transfer>` | ✅ | — |
150
+ | Form / FormItem | `<Form>` + `<Field>` | ✅ | — |
151
+ | Checkbox / CheckboxGroup / CheckboxButton | `<Checkbox>/<CheckboxGroup>` | ✅ | — |
152
+ | Radio / RadioGroup / RadioButton | `<RadioGroup>` | ✅ | — |
153
+ | InputNumber | `<InputNumber>` | ✅ | — |
154
+ | InputTag | `<TagsInput>` | ✅ | — |
155
+ | TreeSelect | `<TreeSelect>` | ✅ | — |
156
+ | SelectV2 / CascaderPanel / TreeV2 | `<Select>/<Cascader>/<Tree>` | ✅ | 虚拟化同族 |
157
+
158
+ ### 数据
159
+ | EP | weifuwu | 状态 | 备注 |
160
+ |----|---------|:----:|------|
161
+ | Avatar / AvatarGroup | `<Avatar>/<AvatarGroup>` | ✅ | — |
162
+ | Badge | `<Badge>` | ✅ | — |
163
+ | Calendar | `<Calendar>` | ✅ | — |
164
+ | Card | `<Card>` | ✅ | — |
165
+ | Carousel | `<Carousel>` | ✅ | — |
166
+ | Collapse / CollapseItem | `<Collapse>` | ✅ | — |
167
+ | Descriptions / DescriptionsItem | `<Descriptions>` | ✅ | — |
168
+ | Empty | `<EmptyState>` | ✅ | — |
169
+ | Image / ImageViewer | `<Img preview>` | ✅ | — |
170
+ | InfiniteScroll | `<InfiniteScroll>` + `<InView>` | ✅ | — |
171
+ | List | `<List>` | ✅ | — |
172
+ | Loading | `<Loading>` | ✅ | — |
173
+ | Result | `<Result>` | ✅ | — |
174
+ | Skeleton / SkeletonItem | `<Skeleton>` | ✅ | — |
175
+ | Table / TableColumn | `<Table>` | ✅ | — |
176
+ | Tabs / TabPane | `<Tabs>` | ✅ | — |
177
+ | Tag | `<Tag>` | ✅ | — |
178
+ | Timeline / TimelineItem | `<Timeline>` | ✅ | — |
179
+ | Tree | `<Tree>` | ✅ | — |
180
+ | Tooltip / TooltipV2 | `<Tooltip>` | ✅ | — |
181
+ | VirtualizedTable | `<VirtualTable>` | ✅ | — |
182
+
183
+ ### 导航
184
+ | EP | weifuwu | 状态 | 备注 |
185
+ |----|---------|:----:|------|
186
+ | Affix | `<Affix>` | ✅ | — |
187
+ | Backtop | `<BackTop>` | ✅ | — |
188
+ | Breadcrumb | `<Breadcrumb>` | ✅ | — |
189
+ | Dropdown / DropdownItem / DropdownMenu | `<Dropdown>` | ✅ | — |
190
+ | Menu / MenuItem / MenuItemGroup | `<Menu>` | ✅ | — |
191
+ | PageHeader | `<PageHeader>` | ✅ | — |
192
+ | Pagination | `<Pagination>` | ✅ | — |
193
+ | Steps / Step | `<Steps>` | ✅ | — |
194
+
195
+ ### 反馈
196
+ | EP | weifuwu | 状态 | 备注 |
197
+ |----|---------|:----:|------|
198
+ | Alert | `<Alert>` | ✅ | — |
199
+ | AlertGroup | `<AlertGroup>` | 🆕 | EP 2.8 新增 |
200
+ | Dialog | `<Modal>` | ✅ | — |
201
+ | Drawer | `<Drawer>` | ✅ | — |
202
+ | Message | `<Toast>` + `toast()` | ✅ | — |
203
+ | MessageBox | `<Confirm>` + `confirm()` | ✅ | — |
204
+ | Notification | `<Notification>` | ✅ | — |
205
+ | Popconfirm | `<Popconfirm>` | 🆕 | — |
206
+ | Popover | `<Popover>` | ✅ | — |
207
+ | Progress | `<ProgressBar>` | ✅ | — |
208
+ | Rate | `<Rate>` | ✅ | — |
209
+ | Slider | `<Slider>` | ✅ | — |
210
+ | Switch | `<Switch>` | ✅ | — |
211
+ | Tooltip | `<Tooltip>` | ✅ | — |
212
+
213
+ ### 框架级
214
+ | EP | weifuwu | 状态 | 备注 |
215
+ |----|---------|:----:|------|
216
+ | ConfigProvider | `--wf-*` token + ctx | 🔧 | client 内置 |
217
+ | Teleport | `createPortal` | 🔧 | client 内置 |
218
+ | Overlay | 渲染器内置遮罩 | 🔧 | client 内置 |
219
+ | AlertGroup | `<AlertGroup>` | 🆕 | — |
220
+
221
+ ---
222
+
223
+ ## shadcn-ui(50 项)
224
+
225
+ | shadcn | weifuwu | 状态 | 备注 |
226
+ |--------|---------|:----:|------|
227
+ | Accordion | `<Accordion>` | ✅ | — |
228
+ | Alert | `<Alert>` | ✅ | — |
229
+ | AlertDialog | `<Confirm>` | ✅ | — |
230
+ | AspectRatio | `<AspectRatio>` | ✅ | — |
231
+ | Avatar | `<Avatar>` | ✅ | — |
232
+ | Badge | `<Badge>` | ✅ | — |
233
+ | Breadcrumb | `<Breadcrumb>` | ✅ | — |
234
+ | Button | `<Button>` | ✅ | — |
235
+ | Calendar | `<Calendar>` | ✅ | — |
236
+ | Card | `<Card>` | ✅ | — |
237
+ | Carousel | `<Carousel>` | ✅ | — |
238
+ | Chart | `<Chart>` | ✅ | 自研零依赖 |
239
+ | Checkbox | `<Checkbox>` | ✅ | — |
240
+ | Collapsible | `<Collapse>` | ✅ | — |
241
+ | Combobox | `<Select searchable>` + `<AutoComplete>` | ✅/🆕 | 可搜索选择 + 输入联想 |
242
+ | Command | `<Command>` | ✅ | Cmd+K 面板 |
243
+ | ContextMenu | `<ContextMenu>` | ✅ | — |
244
+ | DataTable | `<Table>` + `<VirtualTable>` | ✅ | — |
245
+ | DatePicker | `<DatePicker>` | ✅ | — |
246
+ | Dialog | `<Modal>` | ✅ | — |
247
+ | Drawer | `<Drawer>` | ✅ | — |
248
+ | DropdownMenu | `<Dropdown>` | ✅ | — |
249
+ | Form | `<Form>` + `<Field>` | ✅ | — |
250
+ | HoverCard | `<HoverCard>` | ✅ | — |
251
+ | Input | `<Input>` | ✅ | — |
252
+ | InputOTP | `<PinInput>` | ✅ | — |
253
+ | Label | `<Label>` | ✅ | — |
254
+ | Menubar | `<Menubar>` | ✅ | — |
255
+ | NavigationMenu | `<NavMenu>` | 🆕 | — |
256
+ | Pagination | `<Pagination>` | ✅ | — |
257
+ | Popover | `<Popover>` | ✅ | — |
258
+ | Progress | `<ProgressBar>` | ✅ | — |
259
+ | RadioGroup | `<RadioGroup>` | ✅ | — |
260
+ | Resizable | `<Resizable>` | ✅ | — |
261
+ | ScrollArea | `<Scrollbar>` | 🆕 | 容器滚动 |
262
+ | Select | `<Select>` | ✅ | — |
263
+ | Separator | `<Divider>` | ✅ | — |
264
+ | Sheet | `<Drawer position="bottom">` | ✅ | — |
265
+ | Sidebar | `<Layout>` + LayoutSider | 🆕 | — |
266
+ | Skeleton | `<Skeleton>` | ✅ | — |
267
+ | Slider | `<Slider>` | ✅ | — |
268
+ | Sonner | `<Toast>` + `toast()` | ✅ | — |
269
+ | Switch | `<Switch>` | ✅ | — |
270
+ | Table | `<Table>` | ✅ | — |
271
+ | Tabs | `<Tabs>` | ✅ | — |
272
+ | Textarea | `<Textarea>` | ✅ | — |
273
+ | Toast | `<Toast>` | ✅ | — |
274
+ | Toggle / ToggleGroup | `<ToggleGroup>` | ✅ | — |
275
+ | Tooltip | `<Tooltip>` | ✅ | — |
276
+ | —(无独立项) | — | — | — |
277
+
278
+ ---
279
+
280
+ ## 汇总
281
+
282
+ | 库 | 总数 | ✅ 已有 | 🆕 batch-8 | 🔧 框架内置 |
283
+ |----|:----:|:------:|:---------:|:---------:|
284
+ | antd | 84 | 75 | 7(Layout/Link/Space/Grid/Flex/Empty 修正/AutoComplete/Popconfirm/FloatButton/StatCard) | 2 |
285
+ | EP | 74 | 65 | 7(Link/Space/Scrollbar/Layout/Grid/AutoComplete/Popconfirm/AlertGroup) | 3 |
286
+ | shadcn | 50 | 45 | 3(NavMenu/Scrollbar/Layout) | 0 |
287
+ | **合计** | **208** | **185** | **17**(去重后 11 组件 + 5 增强) | **5** |
288
+
289
+ > batch-8 新增组件:`Layout`(含子组件)、`AutoComplete`、`Popconfirm`、`FloatButton`、
290
+ > `NavMenu`、`Link`、`Space`、`Grid`、`Scrollbar`、`AlertGroup`、`StatCard`(countdown 增强)
@@ -172,3 +172,25 @@
172
172
  > AI 开发者工具链成型:AiChat / Command / JSONViewer / LogViewer / DiffView /
173
173
  > Pipeline——三库差异化最深的完整工具线。
174
174
  > 裁剪声明见 `design/components-roadmap.md` 第七批。
175
+
176
+ ## 第八批:三库并集缺口清零(102 → 113,2026-08)
177
+
178
+ > 三库评估:antd 88% / EP 89% / shadcn 92%——本批补齐全部真实缺口,三库 208 项 100% 有对应。
179
+ > 完整逆向映射表见 `docs/compat-three-library.md`。
180
+
181
+ | 组件 | 类型 | 三库等价 | 要点 |
182
+ |------|------|---------|------|
183
+ | **Layout**(+LayoutHeader/Sider/Content/Footer) | 新增 | antd Layout / EP Container / shadcn Sidebar | 复合子组件双模式;含 Sider → row 布局;Sider 折叠受控/非受控 + trigger |
184
+ | **Popconfirm** | 新增 | antd / EP Popconfirm | 复用 usePopup 基座(弹层组合性);danger 危险色;确认后自动关闭 |
185
+ | **AutoComplete** | 新增 | antd+EP Autocomplete / shadcn Combobox | 自由输入联想;包含过滤(纯函数);键盘 ↓↑/Enter/Escape;选中回填 |
186
+ | **Link** | 新增 | EP Link / antd Typography.Link | 语义色/下划线/disabled/new window/icon |
187
+ | **FloatButton** | 新增 | antd FloatButton(特有) | fixed 定位 + badge + 组展开状态机 |
188
+ | **NavMenu** | 新增 | shadcn NavigationMenu(特有) | 顶部多级 hover 弹出 + 键盘 →/Escape |
189
+ | **Space** | 新增 | antd / EP Space | flex gap 布局 + split 分隔符 |
190
+ | **Grid**(+Col) | 新增 | antd Row/Col/Flex / EP Row/Col | 24 栅格 + gutter + flex 容器模式 |
191
+ | **Scrollbar** | 新增 | EP Scrollbar / shadcn ScrollArea | webkit 滚动条样式容器 |
192
+ | **AlertGroup** | 新增 | EP AlertGroup(2.8) | ≥3 条合并折叠 +N,点击展开 |
193
+ | **StatCard ⬆️** | 增强 | antd Statistic.Countdown | countdown 模式:剩余 HH:MM:SS + 结束回调(1s tick + 清理纪律) |
194
+
195
+ > 三库 208 项(antd 84 / EP 74 / shadcn 50)→ 100% 覆盖(业务组件全对应;
196
+ > 框架级 App/ConfigProvider/Teleport/Overlay 由 createApp/createPortal/--wf-* token 内置)。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "weifuwu",
3
3
  "type": "module",
4
- "version": "0.67.2",
4
+ "version": "0.68.0",
5
5
  "description": "AI SaaS framework — (req, ctx) => Response",
6
6
  "exports": {
7
7
  ".": {