weifuwu 0.89.1 → 0.90.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.
Files changed (83) hide show
  1. package/README.md +99 -461
  2. package/dist/client/components/AlertGroup/AlertGroup.d.ts +1 -1
  3. package/dist/client/components/Anchor/Anchor.d.ts +1 -1
  4. package/dist/client/components/AutoComplete/AutoComplete.d.ts +1 -1
  5. package/dist/client/components/AvatarGroup/AvatarGroup.d.ts +1 -1
  6. package/dist/client/components/BackTop/BackTop.d.ts +12 -5
  7. package/dist/client/components/Button/Button.d.ts +2 -0
  8. package/dist/client/components/Calendar/Calendar.d.ts +1 -1
  9. package/dist/client/components/Carousel/Carousel.d.ts +1 -1
  10. package/dist/client/components/Cascader/Cascader.d.ts +1 -1
  11. package/dist/client/components/CodeEditor/CodeEditor.d.ts +1 -1
  12. package/dist/client/components/ColorPicker/ColorPicker.d.ts +1 -1
  13. package/dist/client/components/DropZone/DropZone.d.ts +27 -0
  14. package/dist/client/components/Editor/Editor.d.ts +1 -1
  15. package/dist/client/components/Editor/edit-events.d.ts +1 -1
  16. package/dist/client/components/Editor/model/types.d.ts +1 -1
  17. package/dist/client/components/Editor/tools/table.d.ts +1 -1
  18. package/dist/client/components/Editor/tools/types.d.ts +1 -1
  19. package/dist/client/components/FilePreview/FilePreview.d.ts +1 -1
  20. package/dist/client/components/FloatButton/FloatButton.d.ts +1 -1
  21. package/dist/client/components/Grid/Grid.d.ts +1 -1
  22. package/dist/client/components/Img/Img.d.ts +7 -0
  23. package/dist/client/components/InputNumber/InputNumber.d.ts +1 -1
  24. package/dist/client/components/JSONViewer/JSONViewer.d.ts +1 -1
  25. package/dist/client/components/Link/Link.d.ts +1 -1
  26. package/dist/client/components/LogViewer/LogViewer.d.ts +1 -1
  27. package/dist/client/components/Markdown/parser.d.ts +1 -1
  28. package/dist/client/components/Math/Math.d.ts +1 -1
  29. package/dist/client/components/Mentions/Mentions.d.ts +1 -1
  30. package/dist/client/components/Menu/Menu.d.ts +1 -1
  31. package/dist/client/components/Menubar/Menubar.d.ts +1 -1
  32. package/dist/client/components/MessageBubble/MessageBubble.d.ts +1 -1
  33. package/dist/client/components/NavBar/NavBar.d.ts +32 -0
  34. package/dist/client/components/NavMenu/NavMenu.d.ts +1 -1
  35. package/dist/client/components/OfficeEditor/ai/ai-bridge.d.ts +1 -1
  36. package/dist/client/components/OfficeEditor/model/types.d.ts +1 -1
  37. package/dist/client/components/Popconfirm/Popconfirm.d.ts +1 -1
  38. package/dist/client/components/Result/Result.d.ts +1 -1
  39. package/dist/client/components/Scrollbar/Scrollbar.d.ts +1 -1
  40. package/dist/client/components/SheetGrid/SheetGrid.d.ts +1 -1
  41. package/dist/client/components/SlideCanvas/SlideCanvas.d.ts +1 -1
  42. package/dist/client/components/TagsInput/TagsInput.d.ts +1 -1
  43. package/dist/client/components/Timeline/Timeline.d.ts +1 -1
  44. package/dist/client/components/Transfer/Transfer.d.ts +1 -1
  45. package/dist/client/components/VirtualList/VirtualList.d.ts +1 -1
  46. package/dist/client/components/VirtualTable/VirtualTable.d.ts +1 -1
  47. package/dist/client/components/Watermark/Watermark.d.ts +1 -1
  48. package/dist/client/components/index.d.ts +4 -0
  49. package/dist/client/components/index.js +39 -39
  50. package/dist/client/components/style.css +238 -18
  51. package/dist/client/layout/weifuwu-layout.css +35 -16
  52. package/dist/client/office/docx.d.ts +1 -1
  53. package/dist/client/office/xlsx.d.ts +1 -1
  54. package/dist/client/vdom/core/async-guard.d.ts +1 -1
  55. package/dist/client/vdom/core/patch/state-machine.d.ts +1 -1
  56. package/dist/client/vdom/core/router.d.ts +1 -1
  57. package/dist/client/vdom/core/ssr/html.d.ts +1 -1
  58. package/dist/client/vdom/core/v2/cycle.d.ts +4 -2
  59. package/dist/client/vdom/core/v2/diff.d.ts +9 -0
  60. package/dist/client/vdom/core/v2/integrate.d.ts +1 -1
  61. package/dist/client/vdom/core/v2/schedule.d.ts +1 -1
  62. package/dist/client/vdom/core/vnode.d.ts +1 -1
  63. package/dist/client/vdom/hooks/drag-media.d.ts +4 -1
  64. package/dist/client/vdom/hooks/popup-manager.d.ts +1 -1
  65. package/dist/client/vdom/hooks/stable.d.ts +1 -1
  66. package/dist/client/vdom/index.js +3 -3
  67. package/dist/client/vdom/testing.js +2 -2
  68. package/dist/server/ai/client.d.ts +1 -1
  69. package/dist/server/ai/sse.d.ts +1 -1
  70. package/dist/server/ai/types.d.ts +2 -2
  71. package/dist/server/db/contracts.d.ts +5 -0
  72. package/dist/server/db/postgres/connection.d.ts +6 -0
  73. package/dist/server/index.js +32 -2
  74. package/dist/server/postgres/types.d.ts +3 -0
  75. package/docs/client.md +170 -0
  76. package/docs/server.md +112 -0
  77. package/package.json +1 -3
  78. package/docs/ai-contract.md +0 -418
  79. package/docs/compat-three-library.md +0 -290
  80. package/docs/components-map.md +0 -227
  81. package/docs/environment.md +0 -50
  82. package/docs/examples.md +0 -121
  83. package/docs/style-guide.md +0 -248
@@ -848,6 +848,15 @@ body.wf-dragging {
848
848
  align-items: var(--wf-align, center);
849
849
  gap: var(--wf-gap, var(--wf-gap-md));
850
850
  }
851
+
852
+ .wf-justify-center {
853
+ display: flex;
854
+ justify-content: center;
855
+ }
856
+ :where(.wf-justify-center) {
857
+ align-items: var(--wf-align, center);
858
+ gap: var(--wf-gap, var(--wf-gap-md));
859
+ }
851
860
  }
852
861
 
853
862
  @layer layout {
@@ -1350,6 +1359,7 @@ body.wf-dragging {
1350
1359
  .wf-padding-xl { padding: var(--wf-space-xl); }
1351
1360
 
1352
1361
  /* ── padding: 轴 ── */
1362
+ .wf-padding-x-xs { padding-left: var(--wf-space-xs); padding-right: var(--wf-space-xs); }
1353
1363
  .wf-padding-x-sm { padding-left: var(--wf-space-sm); padding-right: var(--wf-space-sm); }
1354
1364
  .wf-padding-x-md { padding-left: var(--wf-space-md); padding-right: var(--wf-space-md); }
1355
1365
 
@@ -1384,6 +1394,9 @@ body.wf-dragging {
1384
1394
  .wf-margin-left-sm { margin-left: var(--wf-space-sm); }
1385
1395
  .wf-margin-x-auto { margin-left: auto; margin-right: auto; }
1386
1396
 
1397
+ /* ── margin: y 轴 ── */
1398
+ .wf-margin-y-xs { margin-top: var(--wf-space-xs); margin-bottom: var(--wf-space-xs); }
1399
+
1387
1400
  /* ── gap:直接设置 gap 属性(不设 --wf-gap 变量——变量会继承污染子孙:
1388
1401
  壳 root wf-gap-none 曾让 KPI grid 的 gap: var(--wf-gap) = 0 卡无间距) ── */
1389
1402
  .wf-gap-none { gap: 0; }
@@ -1399,22 +1412,6 @@ body.wf-dragging {
1399
1412
  .wf-height-full { height: 100%; }
1400
1413
  }
1401
1414
 
1402
- @layer utilities {
1403
- /* hidden — 隐藏元素(响应式显隐唯一模式:`wf-hidden wf-flex@lg` 窄隐宽显) */
1404
- .wf-hidden {
1405
- display: none;
1406
- }
1407
- @media (min-width: 1024px) { .wf-hidden\@lg { display: none; } }
1408
-
1409
- /* dim — 视觉淡化(运行中/历史态/次要操作) */
1410
- .wf-dim {
1411
- opacity: 0.7;
1412
- }
1413
-
1414
- /* cursor — 交互指针(裸值词) */
1415
- .wf-pointer { cursor: pointer; }
1416
- }
1417
-
1418
1415
  @layer utilities {
1419
1416
  /* block — 块级显示 */
1420
1417
  .wf-block {
@@ -1435,6 +1432,28 @@ body.wf-dragging {
1435
1432
  @media (min-width: 1024px) { .wf-flex\@lg { display: flex; } }
1436
1433
  }
1437
1434
 
1435
+ @layer utilities {
1436
+ /* hidden — 隐藏元素。两种响应式组合:
1437
+ * `wf-hidden wf-flex@lg`(窄隐宽显——基础类无 !important,被 media 内 wf-flex@lg 覆盖)
1438
+ * `wf-flex wf-hidden@lg`(宽隐窄显——media 变体 !important,胜组件自身 display)
1439
+ * !important 原因(CHAT-UX 波次 2 L4):@layer 顺序下 utilities 永远输给 components
1440
+ * (@layer tokens,base,layout,utilities,components 顶层声明定死)——.wf-btn 的
1441
+ * display:inline-flex 无条件压过 hidden 变体——面板按钮桌面隐藏失效实证;
1442
+ * 源顺序洗牌无法修复(层叠顺序优先于源顺序)——!important 是唯一出路 */
1443
+ .wf-hidden {
1444
+ display: none;
1445
+ }
1446
+ @media (min-width: 1024px) { .wf-hidden\@lg { display: none !important; } }
1447
+
1448
+ /* dim — 视觉淡化(运行中/历史态/次要操作) */
1449
+ .wf-dim {
1450
+ opacity: 0.7;
1451
+ }
1452
+
1453
+ /* cursor — 交互指针(裸值词) */
1454
+ .wf-pointer { cursor: pointer; }
1455
+ }
1456
+
1438
1457
  @layer layout {
1439
1458
  /* popup — 浮层基类(usePopup.portal 自动附加;Modal/Drawer 等手动浮层可选用)
1440
1459
  *
@@ -1673,6 +1692,8 @@ body.wf-dragging {
1673
1692
  .wf-actionsheet-icon {
1674
1693
  color: inherit;
1675
1694
  }
1695
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
1696
+ :where(.wf-actionsheet-item-label) {}
1676
1697
 
1677
1698
  /* weifuwu/components — Affix */
1678
1699
 
@@ -1687,6 +1708,9 @@ body.wf-dragging {
1687
1708
  .wf-affix-content {
1688
1709
  transition: none;
1689
1710
  }
1711
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
1712
+ :where(.wf-affix-content--fixed) {}
1713
+ :where(.wf-affix-sentinel--active) {}
1690
1714
 
1691
1715
  /* weifuwu/components — AiChat(标准 AI 对话界面) */
1692
1716
 
@@ -1774,7 +1798,8 @@ body.wf-dragging {
1774
1798
  border-radius: var(--wf-radius);
1775
1799
  padding: var(--wf-space-sm);
1776
1800
  }
1777
-
1801
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
1802
+ :where(.wf-aichat-inputbar--raised) {}
1778
1803
 
1779
1804
  /* weifuwu/components — Alert */
1780
1805
 
@@ -1891,6 +1916,9 @@ body.wf-dragging {
1891
1916
  background: var(--wf-color-bg-hover);
1892
1917
  color: var(--wf-color-text);
1893
1918
  }
1919
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
1920
+ :where(.wf-alertgroup-list) {}
1921
+ :where(.wf-alertgroup-list--open) {}
1894
1922
 
1895
1923
  /* weifuwu/components — Anchor(锚点导航) */
1896
1924
 
@@ -2118,6 +2146,12 @@ body.wf-dragging {
2118
2146
  gap: var(--wf-gap-sm);
2119
2147
  align-items: flex-start;
2120
2148
  }
2149
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
2150
+ :where(.wf-approval-icon) {}
2151
+ :where(.wf-approval-modify-btn) {}
2152
+ :where(.wf-approval-modify-cancel) {}
2153
+ :where(.wf-approval-note) {}
2154
+ :where(.wf-approval-title) {}
2121
2155
 
2122
2156
  /* weifuwu/components — AspectRatio */
2123
2157
 
@@ -2264,7 +2298,8 @@ body.wf-dragging {
2264
2298
  box-shadow: var(--wf-shadow-sm);
2265
2299
  transition: opacity var(--wf-dur-base) var(--wf-ease-out),
2266
2300
  transform var(--wf-dur-base) var(--wf-ease-out),
2267
- background var(--wf-dur-fast) var(--wf-ease-out);
2301
+ background var(--wf-dur-fast) var(--wf-ease-out),
2302
+ visibility var(--wf-dur-base) var(--wf-ease-out);
2268
2303
  }
2269
2304
 
2270
2305
  .wf-backtop:hover {
@@ -2279,10 +2314,18 @@ body.wf-dragging {
2279
2314
 
2280
2315
  .wf-backtop--hidden {
2281
2316
  opacity: 0;
2317
+ /* visibility:不可见按钮不得可 Tab 聚焦(a11y——浮钮语义:隐藏即不可达;
2318
+ 加入 transition 使收起时 opacity 先动画完再隐藏——展开立即可见) */
2319
+ visibility: hidden;
2282
2320
  pointer-events: none;
2283
2321
  transform: translateY(8px);
2284
2322
  }
2285
2323
 
2324
+ /* 容器内浮钮(direction=bottom 聊天流——absolute 相对滚动容器——定位偏移同 fixed) */
2325
+ .wf-backtop--inline {
2326
+ position: absolute;
2327
+ }
2328
+
2286
2329
  /* weifuwu/components — Badge */
2287
2330
 
2288
2331
  .wf-badge {
@@ -2581,6 +2624,8 @@ body.wf-dragging {
2581
2624
  min-width: 44px;
2582
2625
  }
2583
2626
  }
2627
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
2628
+ :where(.wf-calendar-grid) {}
2584
2629
 
2585
2630
  /* weifuwu/components — Card */
2586
2631
 
@@ -2620,6 +2665,8 @@ body.wf-dragging {
2620
2665
  border: var(--wf-border-width) solid var(--wf-color-primary);
2621
2666
  background: var(--wf-color-primary-bg);
2622
2667
  }
2668
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
2669
+ :where(.wf-card--hover) {}
2623
2670
 
2624
2671
  /* weifuwu/components — Carousel */
2625
2672
 
@@ -2940,6 +2987,8 @@ body.wf-dragging {
2940
2987
  background: var(--wf-color-primary-bg);
2941
2988
  color: var(--wf-color-primary-text);
2942
2989
  }
2990
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
2991
+ :where(.wf-cascader) {}
2943
2992
 
2944
2993
  /* weifuwu/components — Chart */
2945
2994
 
@@ -3020,6 +3069,11 @@ body.wf-dragging {
3020
3069
  .wf-chart-tooltip-value {
3021
3070
  opacity: 0.8;
3022
3071
  }
3072
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
3073
+ :where(.wf-chart-label) {}
3074
+ :where(.wf-chart-legend-label) {}
3075
+ :where(.wf-chart-svg) {}
3076
+ :where(.wf-chart-value) {}
3023
3077
 
3024
3078
  /* weifuwu/components — ChatInput(独立聊天输入条——从 AiChat 输入条抽取) */
3025
3079
 
@@ -3291,6 +3345,8 @@ body.wf-dragging {
3291
3345
  .wf-citation-item { min-height: 44px; align-items: center; }
3292
3346
  .wf-citation-toggle { min-height: 44px; }
3293
3347
  }
3348
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
3349
+ :where(.wf-citation-body--open) {}
3294
3350
 
3295
3351
  /* weifuwu/components — CodeBlock */
3296
3352
 
@@ -3468,6 +3524,8 @@ body.wf-dragging {
3468
3524
  from { transform: rotate(0deg); }
3469
3525
  to { transform: rotate(360deg); }
3470
3526
  }
3527
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
3528
+ :where(.wf-collapse-item--open) {}
3471
3529
 
3472
3530
  /* weifuwu/components — ColorPicker */
3473
3531
 
@@ -3809,6 +3867,8 @@ body.wf-dragging {
3809
3867
  /* sizes */
3810
3868
  .wf-copy-btn--sm { padding: 2px var(--wf-space-xs); }
3811
3869
  .wf-copy-btn--lg { padding: var(--wf-space-sm) var(--wf-space-md); }
3870
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
3871
+ :where(.wf-copy-btn-text) {}
3812
3872
 
3813
3873
  /* weifuwu/components — DatePicker */
3814
3874
 
@@ -4129,6 +4189,8 @@ body.wf-dragging {
4129
4189
  /* error(F2 状态矩阵) */
4130
4190
  .wf-datepicker-input--err { border-color: var(--wf-color-error); }
4131
4191
  .wf-datepicker-input--err:focus { box-shadow: 0 0 0 2px var(--wf-color-error-bg), 0 0 0 1px var(--wf-color-error); }
4192
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
4193
+ :where(.wf-datepicker-footer-btn) {}
4132
4194
 
4133
4195
  /* weifuwu/components — Descriptions */
4134
4196
 
@@ -4281,6 +4343,8 @@ body.wf-dragging {
4281
4343
  font-size: var(--wf-font-size-xs); /* 12px 同值 token 化——compact 预设可缩放 */
4282
4344
  text-align: center;
4283
4345
  }
4346
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
4347
+ :where(.wf-diffview-title) {}
4284
4348
 
4285
4349
  /* weifuwu/components — Divider */
4286
4350
 
@@ -4475,6 +4539,16 @@ body.wf-dragging {
4475
4539
  }
4476
4540
  }
4477
4541
 
4542
+ /* weifuwu/components — DropZone 全区域拖放区(高亮面经组件内 el.style——零 CSS 态) */
4543
+
4544
+ /* 拖入中为容器默认外观(高亮由组件直接 el.style——不依赖 class 态) */
4545
+
4546
+ .wf-drop-zone--disabled {
4547
+ cursor: not-allowed;
4548
+ }
4549
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
4550
+ :where(.wf-drop-zone) {}
4551
+
4478
4552
  /* weifuwu/components — Dropdown */
4479
4553
 
4480
4554
  .wf-dropdown {
@@ -5281,6 +5355,8 @@ body.wf-dragging {
5281
5355
  .wf-filepreview-name:hover {
5282
5356
  color: var(--wf-color-text-secondary);
5283
5357
  }
5358
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
5359
+ :where(.wf-filepreview-text) {}
5284
5360
 
5285
5361
  /* weifuwu/components — FileTree(文件树浏览器:面包屑 + 列表/编辑态)
5286
5362
  * 语义 token 化(design/style-professional-plan.md M1——旧 token 体系迁移):
@@ -5604,6 +5680,15 @@ body.wf-dragging {
5604
5680
  border-radius: var(--wf-radius-xs);
5605
5681
  transition: width var(--wf-dur-fast) var(--wf-ease-out);
5606
5682
  }
5683
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
5684
+ :where(.wf-upload-input) {}
5685
+
5686
+ /* 拖入悬停高亮(2027-xx——--drag 类无规则真漏:拖拽态无视觉反馈——补 hover 同强度高亮) */
5687
+ .wf-upload-zone--drag {
5688
+ border-color: var(--wf-color-primary);
5689
+ background: var(--wf-color-bg);
5690
+ box-shadow: var(--wf-focus-ring);
5691
+ }
5607
5692
 
5608
5693
  /* weifuwu/components — FloatButton 悬浮操作按钮 */
5609
5694
 
@@ -5724,6 +5809,8 @@ body.wf-dragging {
5724
5809
  position: static;
5725
5810
  box-shadow: var(--wf-shadow-md);
5726
5811
  }
5812
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
5813
+ :where(.wf-float-group--open) {}
5727
5814
 
5728
5815
  /* weifuwu/components — Form */
5729
5816
 
@@ -5863,6 +5950,19 @@ body.wf-dragging {
5863
5950
  transition: transform var(--wf-dur-base) var(--wf-ease-out);
5864
5951
  }
5865
5952
 
5953
+ /* 加载占位块(2026-09——placeholder:未就绪/失败——与 img 同尺寸——布局恒定) */
5954
+ .wf-image-placeholder {
5955
+ display: flex;
5956
+ align-items: center;
5957
+ justify-content: center;
5958
+ background: var(--wf-color-bg-tertiary);
5959
+ color: var(--wf-color-text-tertiary);
5960
+ font-size: var(--wf-font-size-xs);
5961
+ border-radius: var(--wf-radius-md);
5962
+ }
5963
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
5964
+ :where(.wf-image-placeholder-text) {}
5965
+
5866
5966
  /* weifuwu/components — InView */
5867
5967
 
5868
5968
  .wf-inview {
@@ -5888,6 +5988,9 @@ body.wf-dragging {
5888
5988
  .wf-inview-placeholder::after {
5889
5989
  content: '滚动到此处加载内容';
5890
5990
  }
5991
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
5992
+ :where(.wf-inview--pending) {}
5993
+ :where(.wf-inview-pending) {}
5891
5994
 
5892
5995
  /* weifuwu/components — InfiniteScroll */
5893
5996
 
@@ -6263,6 +6366,8 @@ body.wf-dragging {
6263
6366
  padding: 4px;
6264
6367
  }
6265
6368
  }
6369
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
6370
+ :where(.wf-json-value) {}
6266
6371
 
6267
6372
  /* weifuwu/components — JsonSchemaForm */
6268
6373
 
@@ -6439,6 +6544,8 @@ body.wf-dragging {
6439
6544
  padding: 1px var(--wf-space-sm);
6440
6545
  flex-shrink: 0;
6441
6546
  }
6547
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
6548
+ :where(.wf-kanban-col-title) {}
6442
6549
 
6443
6550
  /* weifuwu/components — Label(与 Input/Field 的 label 样式同源) */
6444
6551
 
@@ -6901,6 +7008,8 @@ body.wf-dragging {
6901
7008
  .wf-md-editor-textarea {
6902
7009
  width: 100%;
6903
7010
  }
7011
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
7012
+ :where(.wf-md-editor-preview) {}
6904
7013
 
6905
7014
  .wf-math-frac {
6906
7015
  display: inline-flex;
@@ -6914,6 +7023,12 @@ body.wf-dragging {
6914
7023
  .wf-math-sqrt-radical { margin-right: 1px; }
6915
7024
  .wf-math-sup { font-size: 0.75em; vertical-align: super; }
6916
7025
  .wf-math-sub { font-size: 0.75em; vertical-align: sub; }
7026
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
7027
+ :where(.wf-math-sqrt) {}
7028
+ :where(.wf-math-sqrt-body) {}
7029
+ :where(.wf-math-sum) {}
7030
+ :where(.wf-math-sum-symbol) {}
7031
+ :where(.wf-math-token) {}
6917
7032
 
6918
7033
  /* weifuwu/components — Mentions */
6919
7034
 
@@ -7174,6 +7289,9 @@ body.wf-dragging {
7174
7289
  from { opacity: 0; transform: translateY(calc(var(--wf-motion-sm) * -1)); }
7175
7290
  to { opacity: 1; transform: translateY(0); }
7176
7291
  }
7292
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
7293
+ :where(.wf-menu-label) {}
7294
+ :where(.wf-menu-submenu-title--active) {}
7177
7295
 
7178
7296
  /* weifuwu/components — Menubar */
7179
7297
 
@@ -7311,6 +7429,8 @@ body.wf-dragging {
7311
7429
  gap: var(--wf-gap-xs);
7312
7430
  align-items: center;
7313
7431
  }
7432
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
7433
+ :where(.wf-bubble-text) {}
7314
7434
 
7315
7435
  /* weifuwu/components — Modal */
7316
7436
 
@@ -7438,6 +7558,50 @@ body.wf-dragging {
7438
7558
  }
7439
7559
  }
7440
7560
 
7561
+ /* weifuwu/components — NavBar 移动端顶栏(antd-mobile NavBar 对位) */
7562
+
7563
+ .wf-nav-bar {
7564
+ display: flex;
7565
+ align-items: center;
7566
+ gap: var(--wf-gap-xs);
7567
+ min-height: 48px;
7568
+ padding: 4px var(--wf-space-sm);
7569
+ background: var(--wf-color-bg-secondary);
7570
+ border-bottom: 1px solid var(--wf-color-border);
7571
+ }
7572
+
7573
+ /* sticky 常驻:滚动不丢导航入口(ap-topbar 实证)+ 刘海屏避让 */
7574
+ .wf-nav-bar--fixed {
7575
+ position: sticky;
7576
+ top: 0;
7577
+ z-index: var(--wf-z-sticky);
7578
+ padding-top: calc(4px + env(safe-area-inset-top, 0px));
7579
+ }
7580
+
7581
+ .wf-nav-bar-side {
7582
+ display: flex;
7583
+ align-items: center;
7584
+ gap: var(--wf-gap-xs);
7585
+ min-width: 0;
7586
+ flex-shrink: 0;
7587
+ white-space: nowrap;
7588
+ }
7589
+
7590
+ .wf-nav-bar-title {
7591
+ flex: 1;
7592
+ min-width: 0;
7593
+ text-align: center;
7594
+ font-size: var(--wf-font-size-base);
7595
+ font-weight: var(--wf-font-weight-semibold);
7596
+ white-space: nowrap;
7597
+ overflow: hidden;
7598
+ text-overflow: ellipsis;
7599
+ }
7600
+
7601
+ .wf-nav-bar-title--left {
7602
+ text-align: left;
7603
+ }
7604
+
7441
7605
  /* weifuwu/components — NavMenu 顶部导航(shadcn NavigationMenu 对齐) */
7442
7606
 
7443
7607
  .wf-navmenu {
@@ -7551,6 +7715,13 @@ body.wf-dragging {
7551
7715
  box-shadow: var(--wf-surface-shadow);
7552
7716
  border: var(--wf-border-width) solid var(--wf-color-border-light);
7553
7717
  }
7718
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
7719
+ :where(.wf-navmenu-label) {}
7720
+ :where(.wf-navmenu-nested) {}
7721
+ :where(.wf-navmenu-sub--nested) {}
7722
+ :where(.wf-navmenu-sub--open) {}
7723
+ :where(.wf-navmenu-sub-item--open) {}
7724
+ :where(.wf-navmenu-sub-label) {}
7554
7725
 
7555
7726
  /* weifuwu/components — Notification */
7556
7727
 
@@ -7652,6 +7823,8 @@ body.wf-dragging {
7652
7823
  box-shadow: var(--wf-focus-ring);
7653
7824
  border-radius: var(--wf-radius-sm);
7654
7825
  }
7826
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
7827
+ :where(.wf-notification-host) {}
7655
7828
 
7656
7829
  /* weifuwu/components — PageHeader */
7657
7830
 
@@ -7977,6 +8150,10 @@ body.wf-dragging {
7977
8150
  gap: var(--wf-gap-xs);
7978
8151
  margin-top: var(--wf-space-xs);
7979
8152
  }
8153
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
8154
+ :where(.wf-popconfirm-cancel) {}
8155
+ :where(.wf-popconfirm-ok) {}
8156
+ :where(.wf-popconfirm-title-text) {}
7980
8157
 
7981
8158
  /* weifuwu/components — Popover */
7982
8159
 
@@ -8048,6 +8225,9 @@ body.wf-dragging {
8048
8225
  from { opacity: 0; }
8049
8226
  to { opacity: 1; }
8050
8227
  }
8228
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
8229
+ :where(.wf-popover--enter) {}
8230
+ :where(.wf-popover-wrap--open) {}
8051
8231
 
8052
8232
  /* weifuwu/components — ProgressBar */
8053
8233
 
@@ -8205,6 +8385,11 @@ body.wf-dragging {
8205
8385
  word-break: break-word;
8206
8386
  }
8207
8387
 
8388
+ /* weifuwu/components — QRCode */
8389
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
8390
+ :where(.wf-qr) {}
8391
+ :where(.wf-qr-bg) {}
8392
+
8208
8393
  /* weifuwu/components — RadioGroup */
8209
8394
 
8210
8395
  .wf-radio-group {
@@ -8363,6 +8548,8 @@ body.wf-dragging {
8363
8548
  height: 1em;
8364
8549
  flex-shrink: 0;
8365
8550
  }
8551
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
8552
+ :where(.wf-rate-star--half) {}
8366
8553
 
8367
8554
  /* weifuwu/components — ReasoningBlock(CoT 推理折叠展示) */
8368
8555
 
@@ -8429,6 +8616,9 @@ body.wf-dragging {
8429
8616
  white-space: pre-wrap;
8430
8617
  word-break: break-word;
8431
8618
  }
8619
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
8620
+ :where(.wf-reasoning--streaming) {}
8621
+ :where(.wf-reasoning-body--open) {}
8432
8622
 
8433
8623
  /* weifuwu/components — RelationGraph(关系图谱:SVG 画布 + 图例)
8434
8624
  * 语义 token 化(M1——旧 token 体系迁移:--wf-border/--wf-text* → --wf-color-*)。
@@ -8623,6 +8813,8 @@ body.wf-dragging {
8623
8813
  .wf-scrollbar::-webkit-scrollbar-thumb:hover {
8624
8814
  background: var(--wf-color-text-tertiary);
8625
8815
  }
8816
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
8817
+ :where(.wf-scrollbar--always) {}
8626
8818
 
8627
8819
  /* weifuwu/components — SearchInput */
8628
8820
 
@@ -8974,6 +9166,8 @@ body.wf-dragging {
8974
9166
  align-items: center;
8975
9167
  }
8976
9168
  }
9169
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
9170
+ :where(.wf-select-menu) {}
8977
9171
 
8978
9172
  /* weifuwu/components — SessionList(会话管理列表) */
8979
9173
 
@@ -9790,6 +9984,9 @@ body.wf-dragging {
9790
9984
  border-radius: var(--wf-radius-xs);
9791
9985
  pointer-events: none;
9792
9986
  }
9987
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
9988
+ :where(.wf-slider-input--hi) {}
9989
+ :where(.wf-slider-input--lo) {}
9793
9990
 
9794
9991
  .wf-sortable {
9795
9992
  list-style: none;
@@ -9901,6 +10098,8 @@ body.wf-dragging {
9901
10098
  outline: none;
9902
10099
  box-shadow: var(--wf-shadow-md), var(--wf-focus-ring);
9903
10100
  }
10101
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
10102
+ :where(.wf-stat-trend-label) {}
9904
10103
 
9905
10104
  /* weifuwu/components — Steps */
9906
10105
 
@@ -10137,6 +10336,9 @@ body.wf-dragging {
10137
10336
  line-height: 1.2;
10138
10337
  white-space: nowrap;
10139
10338
  }
10339
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
10340
+ :where(.wf-tab-bar-icon) {}
10341
+ :where(.wf-tab-bar-item--disabled) {}
10140
10342
 
10141
10343
  /* weifuwu/components — Table */
10142
10344
 
@@ -10271,6 +10473,14 @@ body.wf-dragging {
10271
10473
  outline: none;
10272
10474
  box-shadow: var(--wf-focus-ring);
10273
10475
  }
10476
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
10477
+ :where(.wf-input--table-edit) {}
10478
+ :where(.wf-table-tbody) {}
10479
+ :where(.wf-table-td--editable) {}
10480
+ :where(.wf-table-td--editing) {}
10481
+ :where(.wf-table-td--selection) {}
10482
+ :where(.wf-table-th--selection) {}
10483
+ :where(.wf-table-tr--loading) {}
10274
10484
 
10275
10485
  /* weifuwu/components — Tabs */
10276
10486
 
@@ -10509,6 +10719,8 @@ body.wf-dragging {
10509
10719
  padding: 4px 0;
10510
10720
  }
10511
10721
  .wf-tags-input::placeholder { color: var(--wf-color-text-tertiary); }
10722
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
10723
+ :where(.wf-tags-text) {}
10512
10724
 
10513
10725
  /* weifuwu/components — Textarea */
10514
10726
 
@@ -11011,6 +11223,8 @@ body.wf-dragging {
11011
11223
  font-size: var(--wf-font-size-xs);
11012
11224
  margin-top: var(--wf-gap-xs);
11013
11225
  }
11226
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
11227
+ :where(.wf-toolcall-body) {}
11014
11228
 
11015
11229
  /* weifuwu/components — Tooltip */
11016
11230
 
@@ -11217,6 +11431,8 @@ body.wf-dragging {
11217
11431
  .wf-tour-btn:hover {
11218
11432
  filter: brightness(0.95);
11219
11433
  }
11434
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
11435
+ :where(.wf-tour-layer) {}
11220
11436
 
11221
11437
  /* weifuwu/components — Transfer */
11222
11438
 
@@ -11527,6 +11743,8 @@ body.wf-dragging {
11527
11743
  font-size: var(--wf-font-size-sm);
11528
11744
  text-align: center;
11529
11745
  }
11746
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
11747
+ :where(.wf-tree-children) {}
11530
11748
 
11531
11749
  .wf-treeselect {
11532
11750
  position: relative;
@@ -11863,6 +12081,8 @@ body.wf-dragging {
11863
12081
  outline: none;
11864
12082
  box-shadow: var(--wf-focus-ring);
11865
12083
  }
12084
+ /* ── 语义标记类(DOM 钩子——无样式:测试定位/用户扩展——:where 零优先级显式声明) ── */
12085
+ :where(.wf-virtual-table-th-label) {}
11866
12086
 
11867
12087
  /* weifuwu/components — Watermark */
11868
12088
 
@@ -848,6 +848,15 @@ body.wf-dragging {
848
848
  align-items: var(--wf-align, center);
849
849
  gap: var(--wf-gap, var(--wf-gap-md));
850
850
  }
851
+
852
+ .wf-justify-center {
853
+ display: flex;
854
+ justify-content: center;
855
+ }
856
+ :where(.wf-justify-center) {
857
+ align-items: var(--wf-align, center);
858
+ gap: var(--wf-gap, var(--wf-gap-md));
859
+ }
851
860
  }
852
861
 
853
862
  @layer layout {
@@ -1350,6 +1359,7 @@ body.wf-dragging {
1350
1359
  .wf-padding-xl { padding: var(--wf-space-xl); }
1351
1360
 
1352
1361
  /* ── padding: 轴 ── */
1362
+ .wf-padding-x-xs { padding-left: var(--wf-space-xs); padding-right: var(--wf-space-xs); }
1353
1363
  .wf-padding-x-sm { padding-left: var(--wf-space-sm); padding-right: var(--wf-space-sm); }
1354
1364
  .wf-padding-x-md { padding-left: var(--wf-space-md); padding-right: var(--wf-space-md); }
1355
1365
 
@@ -1384,6 +1394,9 @@ body.wf-dragging {
1384
1394
  .wf-margin-left-sm { margin-left: var(--wf-space-sm); }
1385
1395
  .wf-margin-x-auto { margin-left: auto; margin-right: auto; }
1386
1396
 
1397
+ /* ── margin: y 轴 ── */
1398
+ .wf-margin-y-xs { margin-top: var(--wf-space-xs); margin-bottom: var(--wf-space-xs); }
1399
+
1387
1400
  /* ── gap:直接设置 gap 属性(不设 --wf-gap 变量——变量会继承污染子孙:
1388
1401
  壳 root wf-gap-none 曾让 KPI grid 的 gap: var(--wf-gap) = 0 卡无间距) ── */
1389
1402
  .wf-gap-none { gap: 0; }
@@ -1399,22 +1412,6 @@ body.wf-dragging {
1399
1412
  .wf-height-full { height: 100%; }
1400
1413
  }
1401
1414
 
1402
- @layer utilities {
1403
- /* hidden — 隐藏元素(响应式显隐唯一模式:`wf-hidden wf-flex@lg` 窄隐宽显) */
1404
- .wf-hidden {
1405
- display: none;
1406
- }
1407
- @media (min-width: 1024px) { .wf-hidden\@lg { display: none; } }
1408
-
1409
- /* dim — 视觉淡化(运行中/历史态/次要操作) */
1410
- .wf-dim {
1411
- opacity: 0.7;
1412
- }
1413
-
1414
- /* cursor — 交互指针(裸值词) */
1415
- .wf-pointer { cursor: pointer; }
1416
- }
1417
-
1418
1415
  @layer utilities {
1419
1416
  /* block — 块级显示 */
1420
1417
  .wf-block {
@@ -1435,6 +1432,28 @@ body.wf-dragging {
1435
1432
  @media (min-width: 1024px) { .wf-flex\@lg { display: flex; } }
1436
1433
  }
1437
1434
 
1435
+ @layer utilities {
1436
+ /* hidden — 隐藏元素。两种响应式组合:
1437
+ * `wf-hidden wf-flex@lg`(窄隐宽显——基础类无 !important,被 media 内 wf-flex@lg 覆盖)
1438
+ * `wf-flex wf-hidden@lg`(宽隐窄显——media 变体 !important,胜组件自身 display)
1439
+ * !important 原因(CHAT-UX 波次 2 L4):@layer 顺序下 utilities 永远输给 components
1440
+ * (@layer tokens,base,layout,utilities,components 顶层声明定死)——.wf-btn 的
1441
+ * display:inline-flex 无条件压过 hidden 变体——面板按钮桌面隐藏失效实证;
1442
+ * 源顺序洗牌无法修复(层叠顺序优先于源顺序)——!important 是唯一出路 */
1443
+ .wf-hidden {
1444
+ display: none;
1445
+ }
1446
+ @media (min-width: 1024px) { .wf-hidden\@lg { display: none !important; } }
1447
+
1448
+ /* dim — 视觉淡化(运行中/历史态/次要操作) */
1449
+ .wf-dim {
1450
+ opacity: 0.7;
1451
+ }
1452
+
1453
+ /* cursor — 交互指针(裸值词) */
1454
+ .wf-pointer { cursor: pointer; }
1455
+ }
1456
+
1438
1457
  @layer layout {
1439
1458
  /* popup — 浮层基类(usePopup.portal 自动附加;Modal/Drawer 等手动浮层可选用)
1440
1459
  *
@@ -2,7 +2,7 @@
2
2
  * weifuwu/office/docx — docx ↔ ODES DocState 双向转换(前端/服务端通用——零依赖)
3
3
  *
4
4
  * 参考算法:office2json(unzip → XML 树 → 路径提取 w:body → w:p → w:r → w:t),
5
- * 增强提取到 ODES IR(design/office-events-plan.md):
5
+ * 增强提取到 ODES IR():
6
6
  * - 段落属性:pStyle → h1/h2/h3、jc → 对齐(裁剪:样式名映射子集)
7
7
  * - 内联格式:rPr b/i/u → marks(区间)
8
8
  * - 表格:w:tbl → Editor 表格 embed 快照(HTML 复用现有模型)