weifuwu 0.69.0 → 0.71.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 (38) hide show
  1. package/README.md +8 -8
  2. package/dist/client/diff.d.ts +7 -6
  3. package/dist/client/index.js +5 -5
  4. package/dist/client/registry.d.ts +17 -2
  5. package/dist/client/render.d.ts +12 -5
  6. package/dist/client/router.d.ts +3 -2
  7. package/dist/client/types.d.ts +41 -18
  8. package/dist/client/ui.d.ts +7 -1
  9. package/dist/client/vnode.d.ts +12 -5
  10. package/dist/components/ApprovalCard/ApprovalCard.d.ts +2 -0
  11. package/dist/components/Badge/Badge.d.ts +6 -0
  12. package/dist/components/Card/Card.d.ts +2 -0
  13. package/dist/components/Cascader/Cascader.d.ts +6 -2
  14. package/dist/components/CodeBlock/CodeBlock.d.ts +2 -2
  15. package/dist/components/CodeBlock/highlight.d.ts +15 -0
  16. package/dist/components/Drawer/Drawer.d.ts +2 -0
  17. package/dist/components/EmptyState/EmptyState.d.ts +3 -2
  18. package/dist/components/Icon/Icon.d.ts +1 -1
  19. package/dist/components/InputNumber/InputNumber.d.ts +2 -2
  20. package/dist/components/Layout/Layout.d.ts +2 -0
  21. package/dist/components/Markdown/parser.d.ts +11 -5
  22. package/dist/components/Menu/Menu.d.ts +1 -1
  23. package/dist/components/ProgressBar/ProgressBar.d.ts +5 -0
  24. package/dist/components/Rate/Rate.d.ts +2 -0
  25. package/dist/components/Sparkline/Sparkline.d.ts +2 -0
  26. package/dist/components/StatCard/StatCard.d.ts +5 -3
  27. package/dist/components/Timeline/Timeline.d.ts +5 -4
  28. package/dist/components/Transfer/Transfer.d.ts +6 -2
  29. package/dist/components/Tree/Tree.d.ts +3 -1
  30. package/dist/components/VirtualTable/VirtualTable.d.ts +9 -1
  31. package/dist/components/index.d.ts +1 -1
  32. package/dist/components/index.js +14 -14
  33. package/dist/components/style.css +874 -331
  34. package/dist/index.js +8 -1
  35. package/dist/layout/weifuwu-layout.css +193 -25
  36. package/docs/components.md +2 -2
  37. package/docs/layout.md +37 -9
  38. package/package.json +1 -1
@@ -46,6 +46,7 @@
46
46
  --wf-dark-bg-hover: rgba(255, 255, 255, 0.06); /* 暗色 hover 反白 */
47
47
  --wf-dark-surface-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
48
48
  --wf-dark-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
49
+ --wf-dark-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.3);
49
50
  --wf-dark-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
50
51
  --wf-dark-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
51
52
  --wf-dark-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4);
@@ -82,6 +83,7 @@
82
83
 
83
84
  /* ── 阴影 ── */
84
85
  --wf-shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
86
+ --wf-shadow-inset: inset 0 1px 2px rgba(0,0,0,0.04); /* 内阴影:凹槽/轨道深度(Switch/ThemeSwitch) */
85
87
  --wf-shadow: 0 1px 3px rgba(0,0,0,0.08);
86
88
  --wf-shadow-md: 0 4px 12px rgba(0,0,0,0.1);
87
89
  --wf-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1);
@@ -222,6 +224,7 @@
222
224
 
223
225
  /* ── 浮层遮罩(Modal/Drawer overlay,暗色经 --wf-dark-overlay 映射) ── */
224
226
  --wf-overlay: rgba(0, 0, 0, 0.4);
227
+ --wf-overlay-blur: 4px; /* 遮罩毛玻璃(弹层现代质感,不支持 backdrop-filter 的环境自动降级为纯色) */
225
228
 
226
229
  /* ── 表单控件 ── */
227
230
  --wf-accent-color: var(--wf-color-primary);
@@ -307,6 +310,7 @@
307
310
  --wf-shadow: var(--wf-dark-shadow);
308
311
  --wf-shadow-md: var(--wf-dark-shadow-md);
309
312
  --wf-shadow-lg: var(--wf-dark-shadow-lg);
313
+ --wf-shadow-inset: var(--wf-dark-shadow-inset);
310
314
 
311
315
  --wf-color-primary-text: var(--wf-dark-brand-500);
312
316
  --wf-color-success-text: var(--wf-dark-green-500);
@@ -357,6 +361,7 @@
357
361
  --wf-shadow: var(--wf-dark-shadow);
358
362
  --wf-shadow-md: var(--wf-dark-shadow-md);
359
363
  --wf-shadow-lg: var(--wf-dark-shadow-lg);
364
+ --wf-shadow-inset: var(--wf-dark-shadow-inset);
360
365
 
361
366
  --wf-color-primary-text: var(--wf-dark-brand-500);
362
367
  --wf-color-success-text: var(--wf-dark-green-500);
@@ -377,6 +382,36 @@
377
382
  box-sizing: border-box;
378
383
  }
379
384
 
385
+ /* 选区色:primary 调(文字反白,与品牌一致) */
386
+ ::selection {
387
+ background: var(--wf-color-primary-bg);
388
+ color: var(--wf-color-primary-text);
389
+ }
390
+
391
+ /* 主题滚动条(全局——所有滚动区一致;Firefox thin + WebKit 样式) */
392
+ * {
393
+ scrollbar-width: thin;
394
+ scrollbar-color: var(--wf-color-border-dark) transparent;
395
+ }
396
+ ::-webkit-scrollbar {
397
+ width: 8px;
398
+ height: 8px;
399
+ }
400
+ ::-webkit-scrollbar-track {
401
+ background: transparent;
402
+ }
403
+ ::-webkit-scrollbar-thumb {
404
+ background: var(--wf-color-border-dark);
405
+ border-radius: var(--wf-radius-sm);
406
+ border: 2px solid transparent;
407
+ background-clip: padding-box;
408
+ }
409
+ ::-webkit-scrollbar-thumb:hover {
410
+ background: var(--wf-color-text-secondary);
411
+ background-clip: padding-box;
412
+ border: 2px solid transparent;
413
+ }
414
+
380
415
  :root {
381
416
  /* 原生控件/滚动条跟随主题;暗色激活时在 _dark.css 中切为 dark */
382
417
  color-scheme: light;
@@ -447,11 +482,20 @@ button {
447
482
  padding: var(--wf-control-pad-y) var(--wf-space-md);
448
483
  min-height: var(--wf-control-height);
449
484
  cursor: pointer;
485
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out),
486
+ color var(--wf-dur-fast) var(--wf-ease-out),
487
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out),
488
+ background-color var(--wf-dur-fast) var(--wf-ease-out),
489
+ filter var(--wf-dur-fast) var(--wf-ease-out);
450
490
  }
451
491
  button:hover {
452
492
  border-color: var(--wf-color-primary);
453
493
  color: var(--wf-color-primary-text);
454
494
  }
495
+ button:active:not(:disabled),
496
+ [role="button"]:active {
497
+ filter: brightness(0.95); /* 按压反馈:不偏移布局,适用任意宽度(block/inline) */
498
+ }
455
499
 
456
500
  /* 键盘焦点:button 与 [tabindex] 统一 focus ring(仅键盘触发,鼠标点击不闪) */
457
501
  button:focus-visible,
@@ -460,6 +504,15 @@ button:focus-visible,
460
504
  box-shadow: var(--wf-focus-ring);
461
505
  }
462
506
 
507
+ [role="button"] {
508
+ cursor: pointer;
509
+ transition: background-color var(--wf-dur-fast) var(--wf-ease-out),
510
+ border-color var(--wf-dur-fast) var(--wf-ease-out),
511
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out),
512
+ color var(--wf-dur-fast) var(--wf-ease-out),
513
+ filter var(--wf-dur-fast) var(--wf-ease-out);
514
+ }
515
+
463
516
  /* 触屏设备(coarse pointer):交互目标提升到 44px(Apple HIG / WCAG 2.5.8) */
464
517
  @media (pointer: coarse) {
465
518
  button,
@@ -571,10 +624,13 @@ body.wf-dragging {
571
624
  }
572
625
 
573
626
  @layer layout {
574
- /* stack — 纵向堆叠 */
627
+ /* stack — 纵向堆叠(L3:gap 默认值 :where() 零优先级——wf-gap-* 等覆盖工具
628
+ 靠优先级获胜,不再依赖 import 顺序) */
575
629
  .wf-stack {
576
630
  display: flex;
577
631
  flex-direction: column;
632
+ }
633
+ :where(.wf-stack) {
578
634
  gap: var(--wf-gap, var(--wf-gap-md));
579
635
  }
580
636
  @media (min-width: 640px) { .wf-stack\@sm { flex-direction: row; align-items: var(--wf-align, center); } }
@@ -585,6 +641,8 @@ body.wf-dragging {
585
641
  .wf-stack-reverse {
586
642
  display: flex;
587
643
  flex-direction: column-reverse;
644
+ }
645
+ :where(.wf-stack-reverse) {
588
646
  gap: var(--wf-gap, var(--wf-gap-md));
589
647
  }
590
648
  @media (min-width: 640px) { .wf-stack-reverse\@sm { flex-direction: row-reverse; align-items: var(--wf-align, center); } }
@@ -593,10 +651,13 @@ body.wf-dragging {
593
651
  }
594
652
 
595
653
  @layer layout {
596
- /* row — 横向排列 */
654
+ /* row — 横向排列(L3:gap/align 默认值 :where() 零优先级——wf-gap-*、wf-top 等
655
+ 覆盖工具靠优先级获胜,不再依赖 import 顺序) */
597
656
  .wf-row {
598
657
  display: flex;
599
658
  flex-wrap: wrap;
659
+ }
660
+ :where(.wf-row) {
600
661
  gap: var(--wf-gap, var(--wf-gap-md));
601
662
  align-items: var(--wf-align, center);
602
663
  }
@@ -609,6 +670,8 @@ body.wf-dragging {
609
670
  display: flex;
610
671
  flex-direction: row-reverse;
611
672
  flex-wrap: wrap;
673
+ }
674
+ :where(.wf-row-reverse) {
612
675
  gap: var(--wf-gap, var(--wf-gap-md));
613
676
  align-items: var(--wf-align, center);
614
677
  }
@@ -618,10 +681,12 @@ body.wf-dragging {
618
681
  }
619
682
 
620
683
  @layer layout {
621
- /* split — 两端展开 */
684
+ /* split — 两端展开(L3:align/gap 默认值 :where() 零优先级) */
622
685
  .wf-split {
623
686
  display: flex;
624
687
  justify-content: space-between;
688
+ }
689
+ :where(.wf-split) {
625
690
  align-items: var(--wf-align, center);
626
691
  gap: var(--wf-gap, var(--wf-gap-md));
627
692
  }
@@ -641,57 +706,84 @@ body.wf-dragging {
641
706
  }
642
707
 
643
708
  @layer layout {
644
- /* right — 靠右对齐 */
709
+ /* between — 两端对齐(行内垂直居中;L3:align/gap 默认值 :where() 零优先级) */
710
+ .wf-between {
711
+ display: flex;
712
+ justify-content: space-between;
713
+ }
714
+ :where(.wf-between) {
715
+ align-items: var(--wf-align, center);
716
+ gap: var(--wf-gap, var(--wf-gap-md));
717
+ }
718
+ @media (min-width: 640px) { .wf-between\@sm { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
719
+ @media (min-width: 768px) { .wf-between\@md { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
720
+ @media (min-width: 1024px) { .wf-between\@lg { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
721
+ }
722
+
723
+ @layer layout {
724
+ /* right — 靠右对齐(L3:align/gap 默认值 :where() 零优先级) */
645
725
  .wf-right {
646
726
  display: flex;
647
727
  justify-content: flex-end;
728
+ }
729
+ :where(.wf-right) {
648
730
  align-items: var(--wf-align, center);
649
731
  gap: var(--wf-gap, var(--wf-gap-md));
650
732
  }
651
733
  }
652
734
 
653
735
  @layer layout {
654
- /* top — 顶部对齐 */
736
+ /* top — 顶部对齐(L3:gap 默认值 :where() 零优先级;align-items 是身份属性) */
655
737
  .wf-top {
656
738
  display: flex;
657
739
  align-items: flex-start;
740
+ }
741
+ :where(.wf-top) {
658
742
  gap: var(--wf-gap, var(--wf-gap-md));
659
743
  }
660
744
  }
661
745
 
662
746
  @layer layout {
663
- /* bottom — 底部对齐 */
747
+ /* bottom — 底部对齐(L3:gap 默认值 :where() 零优先级;align-items 是身份属性) */
664
748
  .wf-bottom {
665
749
  display: flex;
666
750
  align-items: flex-end;
751
+ }
752
+ :where(.wf-bottom) {
667
753
  gap: var(--wf-gap, var(--wf-gap-md));
668
754
  }
669
755
  }
670
756
 
671
757
  @layer layout {
672
- /* stretch — 拉伸对齐 */
758
+ /* stretch — 拉伸对齐(L3:gap 默认值 :where() 零优先级;align-items 是身份属性) */
673
759
  .wf-stretch {
674
760
  display: flex;
675
761
  align-items: stretch;
762
+ }
763
+ :where(.wf-stretch) {
676
764
  gap: var(--wf-gap, var(--wf-gap-md));
677
765
  }
678
766
  }
679
767
 
680
768
  @layer layout {
681
- /* around — 均匀环绕分布 */
769
+ /* around — 均匀环绕分布(L3:align/gap 默认值 :where() 零优先级) */
682
770
  .wf-around {
683
771
  display: flex;
684
772
  justify-content: space-around;
773
+ }
774
+ :where(.wf-around) {
685
775
  align-items: var(--wf-align, center);
686
776
  gap: var(--wf-gap, var(--wf-gap-md));
687
777
  }
688
778
  }
689
779
 
690
780
  @layer layout {
691
- /* evenly — 均匀分布 */
781
+ /* evenly — 均匀分布(L3:align/gap 默认值 :where() 零优先级) */
692
782
  .wf-evenly {
693
783
  display: flex;
694
784
  justify-content: space-evenly;
785
+ }
786
+ :where(.wf-evenly) {
695
787
  align-items: var(--wf-align, center);
696
788
  gap: var(--wf-gap, var(--wf-gap-md));
697
789
  }
@@ -707,10 +799,18 @@ body.wf-dragging {
707
799
  }
708
800
 
709
801
  @layer layout {
710
- /* fixed — 固定不伸缩 */
802
+ /* flex-none — 固定不伸缩(推荐名;wf-fixed 为兼容别名——易与 position:fixed 混淆,
803
+ position:fixed 请用 wf-pin) */
804
+ .wf-flex-none,
711
805
  .wf-fixed {
712
806
  flex: none;
713
807
  }
808
+
809
+ /* pin — 固定定位(角标/浮层锚点——position: fixed,坐标由 inline 参数控制) */
810
+ .wf-pin {
811
+ position: fixed;
812
+ z-index: var(--wf-z, var(--wf-cover-z));
813
+ }
714
814
  }
715
815
 
716
816
  @layer layout {
@@ -862,19 +962,24 @@ body.wf-dragging {
862
962
  }
863
963
 
864
964
  @layer layout {
865
- /* grid — 二维网格 */
965
+ /* grid — 二维网格(L3:gap 默认值 :where() 零优先级) */
866
966
  .wf-grid {
867
967
  display: grid;
868
968
  grid-template-columns: var(--wf-cols, repeat(auto-fill, minmax(280px, 1fr)));
969
+ }
970
+ :where(.wf-grid) {
869
971
  gap: var(--wf-gap, var(--wf-gap-lg));
870
972
  }
871
973
  }
872
974
 
873
975
  @layer layout {
874
- /* cluster — 换行簇 */
976
+ /* cluster — 换行簇(L3:justify/align/gap 默认值 :where() 零优先级——
977
+ wf-right 等分布工具叠加时靠优先级获胜) */
875
978
  .wf-cluster {
876
979
  display: flex;
877
980
  flex-wrap: wrap;
981
+ }
982
+ :where(.wf-cluster) {
878
983
  gap: var(--wf-gap, var(--wf-gap-sm));
879
984
  justify-content: var(--wf-justify, center);
880
985
  align-items: var(--wf-align, center);
@@ -882,7 +987,7 @@ body.wf-dragging {
882
987
  }
883
988
 
884
989
  @layer layout {
885
- /* scroll — 可滚动容器 */
990
+ /* scroll — 可滚动容器(全局滚动条样式见 _base.css;此类仅标记语义 + overflow) */
886
991
  .wf-scroll {
887
992
  overflow: auto;
888
993
  }
@@ -920,7 +1025,7 @@ body.wf-dragging {
920
1025
  }
921
1026
  }
922
1027
 
923
- @layer layout {
1028
+ @layer utilities {
924
1029
  /* block — 块级显示 */
925
1030
  .wf-block {
926
1031
  display: block;
@@ -944,9 +1049,25 @@ body.wf-dragging {
944
1049
  }
945
1050
  }
946
1051
 
1052
+ @layer utilities {
1053
+ /* flex — 弹性盒 display 工具(补全 display 族:block/inline/inline-block/contents/hidden/flex)
1054
+ * 核心场景:响应式显隐的 flex 容器——`wf-hidden wf-flex@lg`(窄隐宽显且保持 flex 布局)。
1055
+ * 不可用 wf-block@lg 替代:block 会覆盖 wf-stack 的 display:flex,
1056
+ * 致 flex-direction/gap/mt-auto 全部静默失效(layouts-demo 侧栏 mt-auto 实测踩坑)。 */
1057
+ .wf-flex {
1058
+ display: flex;
1059
+ }
1060
+ @media (min-width: 640px) { .wf-flex\@sm { display: flex; } }
1061
+ @media (min-width: 768px) { .wf-flex\@md { display: flex; } }
1062
+ @media (min-width: 1024px) { .wf-flex\@lg { display: flex; } }
1063
+ }
1064
+
947
1065
  @layer layout {
948
1066
  /* container — 内容宽度约束居中 */
1067
+ /* width: 100% 必须:margin: 0 auto 在 flex 父中阻止 stretch(宽度=内容)
1068
+ ——landing 特性区 404px 而非撑满 1100 容器的根因 */
949
1069
  .wf-container {
1070
+ width: 100%;
950
1071
  max-width: var(--wf-max, 1200px);
951
1072
  margin: 0 auto;
952
1073
  padding: 0 var(--wf-gap, var(--wf-gap-lg));
@@ -969,12 +1090,15 @@ body.wf-dragging {
969
1090
  }
970
1091
 
971
1092
  @layer layout {
972
- /* nowrap — 不换行 */
1093
+ /* nowrap — 不换行(只管 flex-wrap——不定义 align-items,避免与
1094
+ wf-stretch 等对齐工具叠加冲突:双份 CSS 下 nowrap 后置曾覆盖 stretch;
1095
+ L3:gap 默认值 :where() 零优先级) */
973
1096
  .wf-nowrap {
974
1097
  display: flex;
975
1098
  flex-wrap: nowrap;
1099
+ }
1100
+ :where(.wf-nowrap) {
976
1101
  gap: var(--wf-gap, var(--wf-gap-md));
977
- align-items: var(--wf-align, center);
978
1102
  }
979
1103
  }
980
1104
 
@@ -1016,6 +1140,20 @@ body.wf-dragging {
1016
1140
  .wf-py-xl { padding-top: var(--wf-space-xl); padding-bottom: var(--wf-space-xl); }
1017
1141
  .wf-py-2xl { padding-top: var(--wf-space-2xl); padding-bottom: var(--wf-space-2xl); }
1018
1142
 
1143
+ /* ── padding: 单侧顶/底(幽灵类防线抓出 wf-pt-md/wf-pb-md 误用——补全家族) ── */
1144
+ .wf-pt-xs { padding-top: var(--wf-space-xs); }
1145
+ .wf-pt-sm { padding-top: var(--wf-space-sm); }
1146
+ .wf-pt-md { padding-top: var(--wf-space-md); }
1147
+ .wf-pt-lg { padding-top: var(--wf-space-lg); }
1148
+ .wf-pt-xl { padding-top: var(--wf-space-xl); }
1149
+ .wf-pt-2xl { padding-top: var(--wf-space-2xl); }
1150
+ .wf-pb-xs { padding-bottom: var(--wf-space-xs); }
1151
+ .wf-pb-sm { padding-bottom: var(--wf-space-sm); }
1152
+ .wf-pb-md { padding-bottom: var(--wf-space-md); }
1153
+ .wf-pb-lg { padding-bottom: var(--wf-space-lg); }
1154
+ .wf-pb-xl { padding-bottom: var(--wf-space-xl); }
1155
+ .wf-pb-2xl { padding-bottom: var(--wf-space-2xl); }
1156
+
1019
1157
  /* ── margin:重置 ── */
1020
1158
  .wf-m-0 { margin: 0; }
1021
1159
  .wf-p-0 { padding: 0; }
@@ -1045,20 +1183,33 @@ body.wf-dragging {
1045
1183
  /* ── margin: auto(居中) ── */
1046
1184
  .wf-mx-auto { margin-left: auto; margin-right: auto; }
1047
1185
  .wf-my-auto { margin-top: auto; margin-bottom: auto; }
1048
-
1049
- /* ── gap:为 flex/grid 原语设置间距变量 ── */
1050
- .wf-gap-none { --wf-gap: 0; }
1051
- .wf-gap-xs { --wf-gap: var(--wf-gap-xs); }
1052
- .wf-gap-sm { --wf-gap: var(--wf-gap-sm); }
1053
- .wf-gap-md { --wf-gap: var(--wf-gap-md); }
1054
- .wf-gap-lg { --wf-gap: var(--wf-gap-lg); }
1055
- .wf-gap-xl { --wf-gap: var(--wf-gap-xl); }
1056
- .wf-gap-2xl { --wf-gap: var(--wf-gap-2xl); }
1186
+ .wf-mt-auto { margin-top: auto; } /* flex 列推底(侧栏 footer——曾写不存在类静默失效) */
1187
+ .wf-mb-auto { margin-bottom: auto; }
1188
+
1189
+ /* ── gap:直接设置 gap 属性(不设 --wf-gap 变量——变量会继承污染子孙:
1190
+ 壳 root wf-gap-none 曾让 KPI grid 的 gap: var(--wf-gap) = 0 卡无间距) ── */
1191
+ .wf-gap-none { gap: 0; }
1192
+ .wf-gap-xs { gap: var(--wf-gap-xs); }
1193
+ .wf-gap-sm { gap: var(--wf-gap-sm); }
1194
+ .wf-gap-md { gap: var(--wf-gap-md); }
1195
+ .wf-gap-lg { gap: var(--wf-gap-lg); }
1196
+ .wf-gap-xl { gap: var(--wf-gap-xl); }
1197
+ .wf-gap-2xl { gap: var(--wf-gap-2xl); }
1057
1198
 
1058
1199
  /* ── 尺寸 ── */
1059
1200
  .wf-w-full { width: 100%; }
1060
1201
  .wf-h-full { height: 100%; }
1061
1202
  .wf-w-auto { width: auto; }
1203
+
1204
+ /* ── 固定宽度阶梯(对齐 token 阶梯——卡片/面板/容器宽不再内联) ── */
1205
+ .wf-w-xs { width: var(--wf-w-xs, 320px); }
1206
+ .wf-w-sm { width: var(--wf-w-sm, 480px); }
1207
+ .wf-w-md { width: var(--wf-w-md, 640px); }
1208
+ .wf-w-lg { width: var(--wf-w-lg, 768px); }
1209
+ .wf-w-xl { width: var(--wf-w-xl, 1024px); }
1210
+ .wf-w-max { max-width: 100%; }
1211
+ .wf-w-md-auto { width: 100%; }
1212
+ @media (min-width: 768px) { .wf-w-md-auto { width: var(--wf-w-md, 640px); } }
1062
1213
  }
1063
1214
 
1064
1215
  @layer layout {
@@ -1177,6 +1328,23 @@ body.wf-dragging {
1177
1328
  display: inline-flex;
1178
1329
  }
1179
1330
 
1331
+ /* ── 折叠态:图标-only 导航(配合 --wf-sidebar-width 收窄侧栏) ── */
1332
+ .wf-nav--collapsed .wf-nav-item {
1333
+ justify-content: center;
1334
+ gap: 0;
1335
+ padding: var(--wf-space-sm);
1336
+ }
1337
+ .wf-nav--collapsed .wf-nav-label {
1338
+ display: none;
1339
+ }
1340
+ .wf-nav--collapsed .wf-nav-group {
1341
+ text-align: center;
1342
+ padding-left: 0;
1343
+ padding-right: 0;
1344
+ overflow: hidden;
1345
+ white-space: nowrap;
1346
+ }
1347
+
1180
1348
  /* ── 主内容区 ── */
1181
1349
  .wf-main {
1182
1350
  padding: var(--wf-space-lg);
@@ -1484,6 +1652,15 @@ body.wf-dragging {
1484
1652
  background: var(--wf-color-bg-tertiary);
1485
1653
  }
1486
1654
 
1655
+ .wf-accordion-arrow {
1656
+ transition: transform var(--wf-dur-base) var(--wf-ease-out);
1657
+ color: var(--wf-color-text-secondary);
1658
+ flex-shrink: 0;
1659
+ }
1660
+ .wf-accordion-item--open .wf-accordion-arrow {
1661
+ transform: rotate(180deg);
1662
+ }
1663
+
1487
1664
  .wf-accordion-summary:focus-visible {
1488
1665
  outline: none;
1489
1666
  box-shadow: var(--wf-focus-ring);
@@ -1515,9 +1692,9 @@ body.wf-dragging {
1515
1692
  .wf-aichat {
1516
1693
  display: flex;
1517
1694
  flex-direction: column;
1518
- gap: var(--wf-gap-sm, 8px);
1695
+ gap: var(--wf-gap-sm);
1519
1696
  font-family: var(--wf-font-sans);
1520
- font-size: var(--wf-font-size-sm, 14px);
1697
+ font-size: var(--wf-font-size-sm);
1521
1698
  line-height: var(--wf-line-height);
1522
1699
  color: var(--wf-color-text);
1523
1700
  }
@@ -1526,24 +1703,24 @@ body.wf-dragging {
1526
1703
  overflow-y: auto;
1527
1704
  display: flex;
1528
1705
  flex-direction: column;
1529
- gap: var(--wf-gap-sm, 8px);
1530
- padding: var(--wf-space-sm, 8px);
1706
+ gap: var(--wf-gap-sm);
1707
+ padding: var(--wf-space-sm);
1531
1708
  border: 1px solid var(--wf-color-border);
1532
1709
  border-radius: var(--wf-radius);
1533
1710
  background: var(--wf-color-bg);
1534
1711
  }
1535
1712
 
1536
1713
  .wf-aichat-empty {
1537
- margin: var(--wf-space-lg, 16px) 0;
1714
+ margin: var(--wf-space-lg) 0;
1538
1715
  text-align: center;
1539
1716
  color: var(--wf-color-text-secondary);
1540
- font-size: var(--wf-font-size-sm, 14px);
1717
+ font-size: var(--wf-font-size-sm);
1541
1718
  }
1542
1719
 
1543
1720
  .wf-aichat-msg {
1544
1721
  display: flex;
1545
1722
  flex-direction: column;
1546
- gap: var(--wf-gap-xs, 4px);
1723
+ gap: var(--wf-gap-xs);
1547
1724
  }
1548
1725
 
1549
1726
  .wf-aichat-tools,
@@ -1554,9 +1731,9 @@ body.wf-dragging {
1554
1731
  .wf-aichat-bubble {
1555
1732
  display: inline-block;
1556
1733
  max-width: 85%;
1557
- padding: var(--wf-space-sm, 8px) var(--wf-space-md, 12px);
1734
+ padding: var(--wf-space-sm) var(--wf-space-md);
1558
1735
  border-radius: var(--wf-radius);
1559
- font-size: var(--wf-font-size-sm, 14px);
1736
+ font-size: var(--wf-font-size-sm);
1560
1737
  white-space: pre-wrap;
1561
1738
  word-break: break-word;
1562
1739
  }
@@ -1580,38 +1757,38 @@ body.wf-dragging {
1580
1757
  }
1581
1758
 
1582
1759
  .wf-aichat-status {
1583
- font-size: var(--wf-font-size-xs, 12px);
1760
+ font-size: var(--wf-font-size-xs);
1584
1761
  color: var(--wf-color-info-text);
1585
1762
  }
1586
1763
 
1587
1764
  .wf-aichat-usage {
1588
- font-size: var(--wf-font-size-xs, 12px);
1765
+ font-size: var(--wf-font-size-xs);
1589
1766
  color: var(--wf-color-text-secondary);
1590
1767
  }
1591
1768
 
1592
1769
  .wf-aichat-error {
1593
- font-size: var(--wf-font-size-xs, 12px);
1770
+ font-size: var(--wf-font-size-xs);
1594
1771
  color: var(--wf-color-error-text);
1595
1772
  background: var(--wf-color-error-bg);
1596
1773
  border-radius: var(--wf-radius);
1597
- padding: var(--wf-space-sm, 8px);
1774
+ padding: var(--wf-space-sm);
1598
1775
  }
1599
1776
 
1600
1777
  .wf-aichat-inputbar {
1601
1778
  display: flex;
1602
- gap: var(--wf-gap-sm, 8px);
1779
+ gap: var(--wf-gap-sm);
1603
1780
  align-items: center;
1604
1781
  }
1605
1782
 
1606
1783
  .wf-aichat-input {
1607
1784
  flex: 1;
1608
1785
  min-width: 0;
1609
- height: var(--wf-control-height, 36px);
1610
- padding: var(--wf-control-pad-y, 6px) var(--wf-space-md, 12px);
1786
+ height: var(--wf-control-height);
1787
+ padding: var(--wf-control-pad-y) var(--wf-space-md);
1611
1788
  border: 1px solid var(--wf-color-border);
1612
1789
  border-radius: var(--wf-radius);
1613
1790
  font-family: var(--wf-font-sans);
1614
- font-size: var(--wf-font-size-sm, 14px);
1791
+ font-size: var(--wf-font-size-sm);
1615
1792
  color: var(--wf-color-text);
1616
1793
  background: var(--wf-color-bg);
1617
1794
  }
@@ -1628,7 +1805,7 @@ body.wf-dragging {
1628
1805
  align-items: flex-start;
1629
1806
  gap: var(--wf-gap-sm);
1630
1807
  padding: var(--wf-space) var(--wf-space-md);
1631
- border-radius: var(--wf-alert-radius, var(--wf-radius));
1808
+ border-radius: var(--wf-alert-radius, var(--wf-radius));
1632
1809
  font-family: var(--wf-font-sans);
1633
1810
  font-size: var(--wf-font-size-sm);
1634
1811
  line-height: var(--wf-line-height);
@@ -1669,36 +1846,36 @@ body.wf-dragging {
1669
1846
  .wf-alertgroup {
1670
1847
  display: flex;
1671
1848
  flex-direction: column;
1672
- gap: 6px;
1849
+ gap: var(--wf-space-sm);
1673
1850
  font-family: var(--wf-font-sans);
1674
- font-size: var(--wf-font-size-sm, 13px);
1851
+ font-size: var(--wf-font-size-sm);
1675
1852
  }
1676
1853
 
1677
1854
  .wf-alertgroup-summary {
1678
1855
  display: flex;
1679
1856
  align-items: center;
1680
1857
  justify-content: center;
1681
- padding: 10px 16px;
1682
- border: var(--wf-border-width, 1px) solid var(--wf-color-border);
1683
- border-radius: var(--wf-surface-radius, 8px);
1684
- background: var(--wf-color-bg-secondary, #fff);
1685
- color: var(--wf-color-primary, #1668dc);
1858
+ padding: var(--wf-space-sm) 16px;
1859
+ border: var(--wf-border-width) solid var(--wf-color-border);
1860
+ border-radius: var(--wf-surface-radius);
1861
+ background: var(--wf-color-bg-secondary);
1862
+ color: var(--wf-color-primary-text);
1686
1863
  cursor: pointer;
1687
1864
  font-family: var(--wf-font-sans);
1688
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
1865
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
1689
1866
  }
1690
1867
 
1691
1868
  .wf-alertgroup-summary:hover {
1692
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1869
+ background: var(--wf-color-bg-hover);
1693
1870
  }
1694
1871
 
1695
1872
  .wf-alertgroup-item {
1696
1873
  display: flex;
1697
1874
  align-items: center;
1698
- gap: 10px;
1699
- padding: 10px 16px;
1700
- border-radius: var(--wf-surface-radius, 8px);
1701
- background: var(--wf-color-bg-secondary, #fff);
1875
+ gap: var(--wf-space-sm);
1876
+ padding: var(--wf-space-sm) 16px;
1877
+ border-radius: var(--wf-surface-radius);
1878
+ background: var(--wf-color-bg-secondary);
1702
1879
  border-left: 3px solid var(--wf-color-info);
1703
1880
  }
1704
1881
 
@@ -1712,7 +1889,7 @@ body.wf-dragging {
1712
1889
  }
1713
1890
 
1714
1891
  .wf-alertgroup-time {
1715
- color: var(--wf-color-text-tertiary, #999);
1892
+ color: var(--wf-color-text-tertiary);
1716
1893
  font-size: 12px;
1717
1894
  }
1718
1895
 
@@ -1727,19 +1904,19 @@ body.wf-dragging {
1727
1904
  padding: 0;
1728
1905
  border: none;
1729
1906
  background: transparent;
1730
- color: var(--wf-color-text-tertiary, #999);
1907
+ color: var(--wf-color-text-tertiary);
1731
1908
  cursor: pointer;
1732
1909
  border-radius: 4px;
1733
1910
  }
1734
1911
 
1735
1912
  .wf-alertgroup-close:hover {
1736
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1913
+ background: var(--wf-color-bg-hover);
1737
1914
  color: var(--wf-color-text);
1738
1915
  }
1739
1916
 
1740
1917
  /* weifuwu/components — Anchor(锚点导航) */
1741
1918
 
1742
- .wf-anchor-nav-nav {
1919
+ .wf-anchor-nav {
1743
1920
  display: flex;
1744
1921
  flex-direction: column;
1745
1922
  gap: 2px;
@@ -1747,7 +1924,7 @@ body.wf-dragging {
1747
1924
  font-size: var(--wf-font-size-sm);
1748
1925
  }
1749
1926
 
1750
- .wf-anchor-nav-nav-link {
1927
+ .wf-anchor-link {
1751
1928
  display: block;
1752
1929
  padding: var(--wf-space-xs) var(--wf-space-sm);
1753
1930
  border-left: 2px solid transparent;
@@ -1760,19 +1937,19 @@ body.wf-dragging {
1760
1937
  border-color var(--wf-dur-fast) var(--wf-ease-out);
1761
1938
  }
1762
1939
 
1763
- .wf-anchor-nav-nav-link:hover {
1940
+ .wf-anchor-link:hover {
1764
1941
  background: var(--wf-color-bg-secondary);
1765
1942
  color: var(--wf-color-text);
1766
1943
  }
1767
1944
 
1768
- .wf-anchor-nav-nav-link--active {
1945
+ .wf-anchor-link--active {
1769
1946
  color: var(--wf-color-primary-text);
1770
1947
  border-left-color: var(--wf-color-primary);
1771
1948
  font-weight: var(--wf-font-weight-semibold);
1772
1949
  background: var(--wf-color-primary-bg);
1773
1950
  }
1774
1951
 
1775
- .wf-anchor-nav-nav-link:focus-visible {
1952
+ .wf-anchor-link:focus-visible {
1776
1953
  outline: none;
1777
1954
  box-shadow: var(--wf-focus-ring);
1778
1955
  }
@@ -1845,20 +2022,37 @@ body.wf-dragging {
1845
2022
  border: var(--wf-border-width) solid var(--wf-color-border);
1846
2023
  border-radius: var(--wf-radius);
1847
2024
  color: var(--wf-color-text);
2025
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out),
2026
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out);
2027
+ }
2028
+ .wf-approval-note-input:hover {
2029
+ border-color: var(--wf-color-primary);
2030
+ }
2031
+ .wf-approval-note-input:focus {
2032
+ outline: none;
2033
+ border-color: var(--wf-color-primary);
2034
+ box-shadow: var(--wf-focus-ring);
2035
+ }
2036
+ .wf-approval-note-input::placeholder {
2037
+ color: var(--wf-color-text-tertiary);
1848
2038
  }
1849
2039
 
1850
2040
  .wf-approval-status {
1851
2041
  margin-top: var(--wf-gap-xs);
1852
2042
  font-size: var(--wf-font-size-xs);
2043
+ font-weight: var(--wf-font-weight-medium);
1853
2044
  color: var(--wf-color-text-secondary);
1854
2045
  }
2046
+ .wf-approval-status--approved { color: var(--wf-color-success-text); }
2047
+ .wf-approval-status--rejected { color: var(--wf-color-error-text); }
2048
+ .wf-approval-status--timeout { color: var(--wf-color-text-tertiary); }
1855
2049
 
1856
2050
  /* weifuwu/components — AspectRatio */
1857
2051
 
1858
2052
  .wf-aspect-ratio {
1859
2053
  position: relative;
1860
2054
  width: 100%;
1861
- aspect-ratio: var(--wf-aspect-ratio, 16 / 9);
2055
+ aspect-ratio: var(--wf-aspect-ratio, 16 / 9);
1862
2056
  overflow: hidden;
1863
2057
  }
1864
2058
 
@@ -1884,15 +2078,15 @@ body.wf-dragging {
1884
2078
 
1885
2079
  .wf-autocomplete-dropdown {
1886
2080
  position: fixed;
1887
- z-index: var(--wf-z-popover, 120);
2081
+ z-index: var(--wf-z-popover);
1888
2082
  max-height: 280px;
1889
2083
  overflow-y: auto;
1890
- border-radius: var(--wf-surface-radius, 8px);
1891
- background: var(--wf-surface-bg, #fff);
1892
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
1893
- border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
2084
+ border-radius: var(--wf-surface-radius);
2085
+ background: var(--wf-surface-bg);
2086
+ box-shadow: var(--wf-surface-shadow);
2087
+ border: var(--wf-border-width) solid var(--wf-color-border-light);
1894
2088
  font-family: var(--wf-font-sans);
1895
- font-size: var(--wf-font-size-sm, 13px);
2089
+ font-size: var(--wf-font-size-sm);
1896
2090
  }
1897
2091
 
1898
2092
  .wf-autocomplete-option {
@@ -1902,16 +2096,16 @@ body.wf-dragging {
1902
2096
  white-space: nowrap;
1903
2097
  overflow: hidden;
1904
2098
  text-overflow: ellipsis;
1905
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
2099
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
1906
2100
  }
1907
2101
 
1908
2102
  .wf-autocomplete-option:hover,
1909
2103
  .wf-autocomplete-option--active {
1910
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
2104
+ background: var(--wf-color-bg-hover);
1911
2105
  }
1912
2106
 
1913
2107
  .wf-autocomplete-option--active {
1914
- color: var(--wf-color-primary, #1668dc);
2108
+ color: var(--wf-color-primary-text);
1915
2109
  }
1916
2110
 
1917
2111
  /* weifuwu/components — Avatar */
@@ -1980,7 +2174,7 @@ body.wf-dragging {
1980
2174
  background: var(--wf-color-bg-secondary);
1981
2175
  color: var(--wf-color-text-secondary);
1982
2176
  cursor: pointer;
1983
- box-shadow: var(--wf-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.1));
2177
+ box-shadow: var(--wf-shadow-sm);
1984
2178
  transition: opacity var(--wf-dur-base) var(--wf-ease-out),
1985
2179
  transform var(--wf-dur-base) var(--wf-ease-out),
1986
2180
  background var(--wf-dur-fast) var(--wf-ease-out);
@@ -2008,7 +2202,7 @@ body.wf-dragging {
2008
2202
  display: inline-flex;
2009
2203
  align-items: center;
2010
2204
  padding: 2px var(--wf-space-sm);
2011
- border-radius: var(--wf-badge-radius, 10px);
2205
+ border-radius: var(--wf-badge-radius, 10px);
2012
2206
  font-family: var(--wf-font-sans);
2013
2207
  font-size: var(--wf-font-size-xs);
2014
2208
  font-weight: var(--wf-font-weight-medium);
@@ -2038,6 +2232,20 @@ body.wf-dragging {
2038
2232
  .wf-badge-dot--danger { background: var(--wf-color-error); }
2039
2233
  .wf-badge-dot--info { background: var(--wf-color-info); }
2040
2234
 
2235
+ /* 数值角标(count 模式):圆形,最小宽度保证 2 位数居中 */
2236
+ .wf-badge--count {
2237
+ min-width: 18px;
2238
+ height: 18px;
2239
+ padding: 0 var(--wf-space-xs);
2240
+ border-radius: var(--wf-radius-xl);
2241
+ display: inline-flex;
2242
+ align-items: center;
2243
+ justify-content: center;
2244
+ font-size: var(--wf-font-size-xs);
2245
+ font-weight: var(--wf-font-weight-semibold);
2246
+ line-height: 1;
2247
+ }
2248
+
2041
2249
  /* weifuwu/components — Breadcrumb */
2042
2250
 
2043
2251
  .wf-breadcrumb {
@@ -2086,10 +2294,10 @@ body.wf-dragging {
2086
2294
  font-weight: var(--wf-font-weight-medium);
2087
2295
  padding: var(--wf-btn-pad-y, var(--wf-control-pad-y)) var(--wf-btn-pad-x, var(--wf-space-md));
2088
2296
  min-height: var(--wf-control-height);
2089
- border-radius: var(--wf-btn-radius, var(--wf-radius));
2297
+ border-radius: var(--wf-btn-radius, var(--wf-radius));
2090
2298
  border: var(--wf-border-width) solid transparent;
2091
2299
  cursor: pointer;
2092
- transition: all var(--wf-transition);
2300
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
2093
2301
  line-height: 1;
2094
2302
  white-space: nowrap;
2095
2303
  user-select: none;
@@ -2149,7 +2357,7 @@ body.wf-dragging {
2149
2357
  /* flex 容器中宽度稳定:grid 1fr 列在内容驱动宽度下会被事件 nowrap 撑宽/
2150
2358
  无事件塌缩——固定 min-width 防塌缩(定制 Token,默认 280px = 7 列 × 40px) */
2151
2359
  width: 100%;
2152
- min-width: var(--wf-calendar-min-width, 280px);
2360
+ min-width: var(--wf-calendar-min-width, 280px);
2153
2361
  }
2154
2362
 
2155
2363
  .wf-calendar-header {
@@ -2177,7 +2385,7 @@ body.wf-dragging {
2177
2385
  justify-content: center;
2178
2386
  border: none;
2179
2387
  background: none;
2180
- padding: 3px var(--wf-space-sm);
2388
+ padding: var(--wf-space-xs) var(--wf-space-sm);
2181
2389
  border-radius: var(--wf-radius-sm);
2182
2390
  font-size: var(--wf-font-size-xs);
2183
2391
  color: var(--wf-color-text-secondary);
@@ -2257,7 +2465,7 @@ body.wf-dragging {
2257
2465
  margin-top: 2px;
2258
2466
  font-size: var(--wf-font-size-xs);
2259
2467
  color: var(--wf-color-text);
2260
- background: var(--wf-color-primary-bg, var(--wf-color-primary-bg));
2468
+ background: var(--wf-color-primary-bg);
2261
2469
  color: var(--wf-color-primary-text);
2262
2470
  border-radius: var(--wf-radius-sm);
2263
2471
  padding: 1px 4px;
@@ -2283,13 +2491,13 @@ body.wf-dragging {
2283
2491
  /* weifuwu/components — Card */
2284
2492
 
2285
2493
  .wf-card {
2286
- border-radius: var(--wf-card-radius, var(--wf-surface-radius));
2494
+ border-radius: var(--wf-card-radius, var(--wf-surface-radius));
2287
2495
  background: var(--wf-surface-bg);
2288
2496
  font-family: var(--wf-font-sans);
2289
2497
  }
2290
2498
 
2291
2499
  .wf-card--default {
2292
- box-shadow: var(--wf-card-shadow, var(--wf-surface-shadow));
2500
+ box-shadow: var(--wf-card-shadow, var(--wf-surface-shadow));
2293
2501
  }
2294
2502
 
2295
2503
  .wf-card--outlined {
@@ -2355,7 +2563,7 @@ body.wf-dragging {
2355
2563
  background: var(--wf-color-bg-secondary);
2356
2564
  color: var(--wf-color-text-secondary);
2357
2565
  cursor: pointer;
2358
- box-shadow: var(--wf-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.1));
2566
+ box-shadow: var(--wf-shadow-sm);
2359
2567
  transition: background var(--wf-dur-fast) var(--wf-ease-out),
2360
2568
  color var(--wf-dur-fast) var(--wf-ease-out);
2361
2569
  }
@@ -2454,7 +2662,7 @@ body.wf-dragging {
2454
2662
  border-radius: var(--wf-radius);
2455
2663
  background: var(--wf-color-bg);
2456
2664
  color: var(--wf-color-text);
2457
- padding: 6px var(--wf-space);
2665
+ padding: var(--wf-space-sm) var(--wf-space);
2458
2666
  font-size: var(--wf-font-size-base);
2459
2667
  font-family: var(--wf-font-sans);
2460
2668
  cursor: pointer;
@@ -2525,7 +2733,7 @@ body.wf-dragging {
2525
2733
  background: var(--wf-color-bg);
2526
2734
  border: var(--wf-border-width) solid var(--wf-color-border);
2527
2735
  border-radius: var(--wf-radius);
2528
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
2736
+ box-shadow: var(--wf-shadow-lg);
2529
2737
  padding: var(--wf-space-xs);
2530
2738
  }
2531
2739
 
@@ -2533,7 +2741,7 @@ body.wf-dragging {
2533
2741
  display: flex;
2534
2742
  flex-direction: column;
2535
2743
  gap: 1px;
2536
- min-width: var(--wf-cascader-col-width, 120px);
2744
+ min-width: var(--wf-cascader-col-width, 120px);
2537
2745
  max-height: 240px;
2538
2746
  overflow-y: auto;
2539
2747
  }
@@ -2551,7 +2759,7 @@ body.wf-dragging {
2551
2759
  text-align: left;
2552
2760
  border: none;
2553
2761
  background: none;
2554
- padding: 6px var(--wf-space);
2762
+ padding: var(--wf-space-sm) var(--wf-space);
2555
2763
  border-radius: var(--wf-radius-sm);
2556
2764
  font-size: var(--wf-font-size-sm);
2557
2765
  color: var(--wf-color-text);
@@ -2587,6 +2795,42 @@ body.wf-dragging {
2587
2795
  color: var(--wf-color-text-tertiary);
2588
2796
  }
2589
2797
 
2798
+ .wf-cascader-search {
2799
+ width: 100%;
2800
+ box-sizing: border-box;
2801
+ margin-bottom: var(--wf-gap-xs);
2802
+ min-height: var(--wf-field-height);
2803
+ padding: var(--wf-control-pad-y) var(--wf-space-sm);
2804
+ font-size: var(--wf-font-size-sm);
2805
+ }
2806
+ .wf-cascader-search-results {
2807
+ max-height: 240px;
2808
+ overflow-y: auto;
2809
+ min-width: var(--wf-cascader-search-min-width, 180px);
2810
+ }
2811
+ .wf-cascader-search-item {
2812
+ display: block;
2813
+ width: 100%;
2814
+ padding: var(--wf-control-pad-y) var(--wf-space-sm);
2815
+ border: none;
2816
+ background: none;
2817
+ font-family: inherit;
2818
+ font-size: var(--wf-font-size-sm);
2819
+ color: var(--wf-color-text);
2820
+ text-align: left;
2821
+ cursor: pointer;
2822
+ border-radius: var(--wf-radius-sm);
2823
+ }
2824
+ .wf-cascader-search-item:hover {
2825
+ background: var(--wf-color-bg-hover);
2826
+ }
2827
+ .wf-cascader-empty {
2828
+ padding: var(--wf-space-md);
2829
+ color: var(--wf-color-text-secondary);
2830
+ font-size: var(--wf-font-size-sm);
2831
+ text-align: center;
2832
+ }
2833
+
2590
2834
  /* weifuwu/components — Chart */
2591
2835
 
2592
2836
  .wf-chart {
@@ -2683,7 +2927,7 @@ body.wf-dragging {
2683
2927
  align-items: center;
2684
2928
  justify-content: center;
2685
2929
  flex-shrink: 0;
2686
- transition: all var(--wf-transition);
2930
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
2687
2931
  background: var(--wf-color-bg);
2688
2932
  }
2689
2933
 
@@ -2774,7 +3018,7 @@ body.wf-dragging {
2774
3018
  .wf-codeblock-lang {
2775
3019
  display: inline-flex;
2776
3020
  align-items: center;
2777
- gap: 6px;
3021
+ gap: var(--wf-space-sm);
2778
3022
  }
2779
3023
 
2780
3024
  .wf-codeblock-dot {
@@ -2817,6 +3061,15 @@ body.wf-dragging {
2817
3061
  white-space: pre;
2818
3062
  }
2819
3063
 
3064
+ /* ── 语法高亮(自研 tokenizer——语义色 token 亮暗双适配,P2 纪律 -text 变体) ── */
3065
+ .wf-hl-comment { color: var(--wf-color-success-text); font-style: italic; }
3066
+ .wf-hl-string { color: var(--wf-color-warning-text); }
3067
+ .wf-hl-keyword { color: var(--wf-color-primary-text); font-weight: 500; }
3068
+ .wf-hl-number { color: var(--wf-color-info-text); }
3069
+ .wf-hl-function { color: var(--wf-color-primary-text); }
3070
+ .wf-hl-jsx-tag { color: var(--wf-color-error-text); }
3071
+ .wf-hl-operator { color: var(--wf-color-text-tertiary); }
3072
+
2820
3073
  /* weifuwu/components — Collapse */
2821
3074
 
2822
3075
  .wf-collapse {
@@ -2911,20 +3164,31 @@ body.wf-dragging {
2911
3164
  font-family: var(--wf-font-sans);
2912
3165
  font-size: var(--wf-font-size-sm);
2913
3166
  color: var(--wf-color-text);
2914
- padding: 4px var(--wf-space-sm);
3167
+ padding: var(--wf-space-xs) var(--wf-space-sm);
2915
3168
  transition: border-color var(--wf-dur-fast) var(--wf-ease-out),
2916
- box-shadow var(--wf-dur-fast) var(--wf-ease-out);
3169
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out),
3170
+ transform var(--wf-dur-fast) var(--wf-ease-out);
2917
3171
  }
2918
3172
 
2919
3173
  .wf-color-picker-trigger:hover {
2920
3174
  border-color: var(--wf-color-primary);
2921
3175
  }
2922
3176
 
3177
+ .wf-color-picker-trigger:active {
3178
+ transform: scale(0.98);
3179
+ }
3180
+
2923
3181
  .wf-color-picker-trigger:focus-visible {
2924
3182
  outline: none;
2925
3183
  box-shadow: var(--wf-focus-ring);
2926
3184
  }
2927
3185
 
3186
+ .wf-color-picker-trigger--disabled {
3187
+ opacity: var(--wf-opacity-disabled);
3188
+ cursor: not-allowed;
3189
+ pointer-events: none;
3190
+ }
3191
+
2928
3192
  .wf-color-picker-swatch {
2929
3193
  display: inline-block;
2930
3194
  width: 16px;
@@ -2939,8 +3203,8 @@ body.wf-dragging {
2939
3203
  font-size: var(--wf-font-size-xs);
2940
3204
  }
2941
3205
 
2942
- .wf-color-picker-trigger--sm { padding: 2px var(--wf-space-sm); font-size: var(--wf-font-size-xs); }
2943
- .wf-color-picker-trigger--lg { padding: 6px var(--wf-space-md); font-size: var(--wf-font-size-base); }
3206
+ .wf-color-picker-trigger--sm { padding: 2px var(--wf-space-sm); font-size: var(--wf-font-size-xs); min-height: 28px; }
3207
+ .wf-color-picker-trigger--lg { padding: var(--wf-space-sm) var(--wf-space-md); font-size: var(--wf-font-size-base); min-height: 40px; }
2944
3208
 
2945
3209
  /* 弹层面板 */
2946
3210
  .wf-color-picker-panel {
@@ -2955,22 +3219,43 @@ body.wf-dragging {
2955
3219
  }
2956
3220
 
2957
3221
  .wf-color-picker-grid .wf-color-picker-swatch {
3222
+ position: relative;
2958
3223
  width: 22px;
2959
3224
  height: 22px;
3225
+ min-width: 22px;
3226
+ max-width: 22px;
3227
+ min-height: 22px;
3228
+ max-height: 22px;
2960
3229
  padding: 0;
2961
3230
  border: none;
3231
+ border-radius: var(--wf-radius-sm);
2962
3232
  cursor: pointer;
2963
3233
  box-shadow: 0 0 0 1px var(--wf-color-border);
2964
- transition: transform var(--wf-dur-fast) var(--wf-ease-out);
3234
+ transition: transform var(--wf-dur-fast) var(--wf-ease-out),
3235
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out);
2965
3236
  }
2966
3237
 
2967
3238
  .wf-color-picker-grid .wf-color-picker-swatch:hover {
2968
3239
  transform: scale(1.15);
2969
3240
  }
2970
3241
 
3242
+ .wf-color-picker-grid .wf-color-picker-swatch:active {
3243
+ transform: scale(0.92);
3244
+ }
3245
+
2971
3246
  .wf-color-picker-grid .wf-color-picker-swatch:focus-visible {
2972
3247
  outline: none;
2973
- box-shadow: var(--wf-focus-ring);
3248
+ box-shadow: 0 0 0 2px var(--wf-color-primary);
3249
+ }
3250
+
3251
+ /* 选中态:勾选图标(mix-blend 反相——任意底色恒可见,省逐色亮度计算) */
3252
+ .wf-color-picker-check {
3253
+ position: absolute;
3254
+ inset: 0;
3255
+ margin: auto;
3256
+ color: var(--wf-color-on-brand);
3257
+ mix-blend-mode: difference; /* 白对底反相 → 浅底显黑、深底显白,对比恒 ≥ 4.5 */
3258
+ pointer-events: none;
2974
3259
  }
2975
3260
 
2976
3261
  .wf-color-picker-grid .wf-color-picker-swatch--sel {
@@ -2983,11 +3268,13 @@ body.wf-dragging {
2983
3268
  box-sizing: border-box;
2984
3269
  border: var(--wf-border-width) solid var(--wf-color-border);
2985
3270
  border-radius: var(--wf-radius-sm);
2986
- padding: 4px var(--wf-space-sm);
3271
+ padding: var(--wf-space-xs) var(--wf-space-sm);
2987
3272
  font-family: var(--wf-font-mono);
2988
3273
  font-size: var(--wf-font-size-xs);
2989
3274
  color: var(--wf-color-text);
2990
3275
  background: var(--wf-color-bg);
3276
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out),
3277
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out);
2991
3278
  }
2992
3279
 
2993
3280
  .wf-color-picker-input:focus {
@@ -3014,7 +3301,7 @@ body.wf-dragging {
3014
3301
  background: var(--wf-color-bg);
3015
3302
  border: var(--wf-border-width) solid var(--wf-color-border);
3016
3303
  border-radius: var(--wf-radius);
3017
- box-shadow: var(--wf-shadow-lg, 0 16px 48px rgba(0, 0, 0, 0.2));
3304
+ box-shadow: var(--wf-shadow-lg);
3018
3305
  overflow: hidden;
3019
3306
  font-family: var(--wf-font-sans);
3020
3307
  animation: wf-command-in var(--wf-dur-base) var(--wf-ease-out);
@@ -3088,7 +3375,7 @@ body.wf-dragging {
3088
3375
  color: var(--wf-color-text-tertiary);
3089
3376
  background: var(--wf-color-bg-tertiary);
3090
3377
  border-radius: var(--wf-radius-sm);
3091
- padding: 1px 6px;
3378
+ padding: 1px var(--wf-space-sm);
3092
3379
  font-family: var(--wf-font-sans);
3093
3380
  }
3094
3381
 
@@ -3104,11 +3391,11 @@ body.wf-dragging {
3104
3391
  .wf-context-menu {
3105
3392
  position: fixed;
3106
3393
  z-index: var(--wf-z-popover);
3107
- min-width: var(--wf-context-menu-min-width, 160px);
3394
+ min-width: var(--wf-context-menu-min-width, 160px);
3108
3395
  background: var(--wf-color-bg);
3109
3396
  border: var(--wf-border-width) solid var(--wf-color-border);
3110
3397
  border-radius: var(--wf-radius);
3111
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
3398
+ box-shadow: var(--wf-shadow-lg);
3112
3399
  padding: var(--wf-space-xs);
3113
3400
  font-family: var(--wf-font-sans);
3114
3401
  display: flex;
@@ -3124,7 +3411,7 @@ body.wf-dragging {
3124
3411
  text-align: left;
3125
3412
  border: none;
3126
3413
  background: none;
3127
- padding: 6px var(--wf-space);
3414
+ padding: var(--wf-space-sm) var(--wf-space);
3128
3415
  border-radius: var(--wf-radius-sm);
3129
3416
  font-size: var(--wf-font-size-sm);
3130
3417
  color: var(--wf-color-text);
@@ -3191,8 +3478,8 @@ body.wf-dragging {
3191
3478
  }
3192
3479
 
3193
3480
  /* variants */
3194
- .wf-copy-btn--ghost { background: none; padding: 4px var(--wf-space-sm); }
3195
- .wf-copy-btn--secondary { background: var(--wf-color-bg-secondary); padding: 4px var(--wf-space-sm); }
3481
+ .wf-copy-btn--ghost { padding: 4px var(--wf-space-sm); }
3482
+ .wf-copy-btn--secondary { padding: 4px var(--wf-space-sm); }
3196
3483
  .wf-copy-btn--default {
3197
3484
  background: var(--wf-color-bg);
3198
3485
  border: var(--wf-border-width) solid var(--wf-color-border);
@@ -3200,8 +3487,8 @@ body.wf-dragging {
3200
3487
  }
3201
3488
 
3202
3489
  /* sizes */
3203
- .wf-copy-btn--sm { font-size: var(--wf-font-size-xs); padding: 2px var(--wf-space-xs); }
3204
- .wf-copy-btn--lg { font-size: var(--wf-font-size-base); padding: 6px var(--wf-space-md); }
3490
+ .wf-copy-btn--sm { padding: 2px var(--wf-space-xs); }
3491
+ .wf-copy-btn--lg { padding: var(--wf-space-sm) var(--wf-space-md); }
3205
3492
 
3206
3493
  /* weifuwu/components — DatePicker */
3207
3494
 
@@ -3253,7 +3540,7 @@ body.wf-dragging {
3253
3540
  border-radius: var(--wf-radius-md);
3254
3541
  box-shadow: var(--wf-shadow-md);
3255
3542
  padding: var(--wf-space);
3256
- min-width: var(--wf-datepicker-width, 260px);
3543
+ min-width: var(--wf-datepicker-width, 260px);
3257
3544
  user-select: none;
3258
3545
  /* 面板族统一入场:wf-panel-in(scale+fade,Token 驱动) */
3259
3546
  animation: wf-panel-in var(--wf-dur-fast) var(--wf-ease-out);
@@ -3372,7 +3659,7 @@ body.wf-dragging {
3372
3659
  }
3373
3660
 
3374
3661
  .wf-datepicker-range-panel {
3375
- min-width: var(--wf-datepicker-time-width, 240px);
3662
+ min-width: var(--wf-datepicker-time-width, 240px);
3376
3663
  }
3377
3664
 
3378
3665
  /* ── 时间选择 ── */
@@ -3385,7 +3672,7 @@ body.wf-dragging {
3385
3672
  border-radius: var(--wf-radius-md);
3386
3673
  box-shadow: var(--wf-shadow-md);
3387
3674
  padding: var(--wf-space);
3388
- min-width: var(--wf-datepicker-range-width, 200px);
3675
+ min-width: var(--wf-datepicker-range-width, 200px);
3389
3676
  user-select: none;
3390
3677
  animation: wf-panel-in var(--wf-dur-fast) var(--wf-ease-out);
3391
3678
  transform-origin: top center;
@@ -3579,7 +3866,7 @@ body.wf-dragging {
3579
3866
  border-radius: var(--wf-radius-md);
3580
3867
  overflow: hidden;
3581
3868
  background: var(--wf-color-bg);
3582
- font-family: var(--wf-font-mono, 'SFMono-Regular', Consolas, monospace);
3869
+ font-family: var(--wf-font-mono);
3583
3870
  font-size: 13px;
3584
3871
  line-height: 1.6;
3585
3872
  min-width: 0;
@@ -3631,13 +3918,13 @@ body.wf-dragging {
3631
3918
  }
3632
3919
 
3633
3920
  .wf-diffview-row--add {
3634
- background: var(--wf-color-success-bg, rgba(0, 128, 0, 0.08));
3921
+ background: var(--wf-color-success-bg);
3635
3922
  }
3636
3923
  .wf-diffview-row--add .wf-diffview-sign {
3637
3924
  color: var(--wf-color-success-text);
3638
3925
  }
3639
3926
  .wf-diffview-row--remove {
3640
- background: var(--wf-color-error-bg, rgba(255, 0, 0, 0.06));
3927
+ background: var(--wf-color-error-bg);
3641
3928
  }
3642
3929
  .wf-diffview-row--remove .wf-diffview-sign {
3643
3930
  color: var(--wf-color-error-text);
@@ -3655,7 +3942,7 @@ body.wf-dragging {
3655
3942
  color: var(--wf-color-text-secondary);
3656
3943
  font-size: 12px;
3657
3944
  cursor: pointer;
3658
- background: var(--wf-color-bg-subtle, var(--wf-color-fill));
3945
+ background: var(--wf-color-bg-subtle);
3659
3946
  user-select: none;
3660
3947
  min-height: 28px;
3661
3948
  }
@@ -3733,6 +4020,8 @@ body.wf-dragging {
3733
4020
  position: absolute;
3734
4021
  inset: 0;
3735
4022
  background: var(--wf-overlay);
4023
+ backdrop-filter: blur(var(--wf-overlay-blur));
4024
+ -webkit-backdrop-filter: blur(var(--wf-overlay-blur));
3736
4025
  }
3737
4026
 
3738
4027
  .wf-drawer--enter .wf-drawer-overlay {
@@ -3757,11 +4046,11 @@ body.wf-dragging {
3757
4046
  position: relative;
3758
4047
  display: flex;
3759
4048
  flex-direction: column;
3760
- width: var(--wf-drawer-width, 360px);
4049
+ width: var(--wf-drawer-width, 360px);
3761
4050
  max-width: 100vw;
3762
4051
  height: 100%;
3763
4052
  background: var(--wf-color-bg);
3764
- box-shadow: var(--wf-shadow-lg, 0 4px 24px rgba(0, 0, 0, 0.12));
4053
+ box-shadow: var(--wf-shadow-lg);
3765
4054
  }
3766
4055
 
3767
4056
  .wf-drawer--enter .wf-drawer-panel {
@@ -3813,7 +4102,7 @@ body.wf-dragging {
3813
4102
  align-items: center;
3814
4103
  justify-content: space-between;
3815
4104
  padding: var(--wf-space-md);
3816
- border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border);
4105
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
3817
4106
  font-family: var(--wf-font-sans);
3818
4107
  font-size: var(--wf-font-size-lg);
3819
4108
  font-weight: var(--wf-font-weight-semibold);
@@ -3850,7 +4139,7 @@ body.wf-dragging {
3850
4139
  justify-content: flex-end;
3851
4140
  gap: var(--wf-gap-sm);
3852
4141
  padding: var(--wf-space-md);
3853
- border-top: var(--wf-border-width, 1px) solid var(--wf-color-border);
4142
+ border-top: var(--wf-border-width) solid var(--wf-color-border);
3854
4143
  }
3855
4144
 
3856
4145
  /* 移动端适配(P2):小屏抽屉全宽(底部安全区) */
@@ -3869,7 +4158,7 @@ body.wf-dragging {
3869
4158
 
3870
4159
  .wf-dropdown-menu {
3871
4160
  position: fixed;
3872
- min-width: var(--wf-dropdown-min-width, 140px);
4161
+ min-width: var(--wf-dropdown-min-width, 140px);
3873
4162
  background: var(--wf-color-bg);
3874
4163
  border: var(--wf-border-width) solid var(--wf-color-border);
3875
4164
  border-radius: var(--wf-radius);
@@ -3942,7 +4231,7 @@ body.wf-dragging {
3942
4231
  .wf-editor--disabled {
3943
4232
  opacity: var(--wf-opacity-disabled);
3944
4233
  cursor: not-allowed;
3945
- background: var(--wf-color-bg-secondary, #f9fafb);
4234
+ background: var(--wf-color-bg-secondary);
3946
4235
  }
3947
4236
 
3948
4237
  /* ── 工具栏 ────────────────────────────────────────── */
@@ -3953,7 +4242,7 @@ body.wf-dragging {
3953
4242
  gap: 2px;
3954
4243
  padding: var(--wf-space-xs) var(--wf-space-sm);
3955
4244
  border-bottom: var(--wf-border-width) solid var(--wf-color-border);
3956
- background: var(--wf-color-bg-secondary, #f9fafb);
4245
+ background: var(--wf-color-bg-secondary);
3957
4246
  flex-wrap: wrap;
3958
4247
  user-select: none;
3959
4248
  }
@@ -3966,17 +4255,17 @@ body.wf-dragging {
3966
4255
  height: 32px;
3967
4256
  padding: 0 var(--wf-space-xs);
3968
4257
  border: none;
3969
- border-radius: var(--wf-radius-sm, 4px);
4258
+ border-radius: var(--wf-radius-sm);
3970
4259
  background: transparent;
3971
4260
  color: var(--wf-color-text);
3972
4261
  font-size: var(--wf-font-size-sm);
3973
- font-weight: var(--wf-font-weight-semibold, 600);
4262
+ font-weight: var(--wf-font-weight-semibold);
3974
4263
  cursor: pointer;
3975
4264
  transition: background 0.15s;
3976
4265
  }
3977
4266
 
3978
4267
  .wf-editor-tb-btn:hover {
3979
- background: var(--wf-color-bg-tertiary, #e5e7eb);
4268
+ background: var(--wf-color-bg-tertiary);
3980
4269
  }
3981
4270
 
3982
4271
  .wf-editor-tb-btn--active {
@@ -3985,7 +4274,7 @@ body.wf-dragging {
3985
4274
  }
3986
4275
 
3987
4276
  .wf-editor-tb-btn--active:hover {
3988
- background: var(--wf-color-primary-bg, #bae6fd);
4277
+ background: var(--wf-color-primary-bg);
3989
4278
  }
3990
4279
 
3991
4280
  .wf-editor-tb-btn--link {
@@ -4025,22 +4314,22 @@ body.wf-dragging {
4025
4314
 
4026
4315
  /* 编辑区内部元素样式 */
4027
4316
  .wf-editor-content h1 {
4028
- font-size: var(--wf-font-size-2xl, 1.5rem);
4029
- font-weight: var(--wf-font-weight-bold, 700);
4317
+ font-size: var(--wf-font-size-2xl);
4318
+ font-weight: var(--wf-font-weight-bold);
4030
4319
  margin: 0.5em 0 0.25em;
4031
4320
  line-height: 1.3;
4032
4321
  }
4033
4322
 
4034
4323
  .wf-editor-content h2 {
4035
- font-size: var(--wf-font-size-xl, 1.25rem);
4036
- font-weight: var(--wf-font-weight-bold, 700);
4324
+ font-size: var(--wf-font-size-xl);
4325
+ font-weight: var(--wf-font-weight-bold);
4037
4326
  margin: 0.5em 0 0.25em;
4038
4327
  line-height: 1.3;
4039
4328
  }
4040
4329
 
4041
4330
  .wf-editor-content h3 {
4042
- font-size: var(--wf-font-size-lg, 1.125rem);
4043
- font-weight: var(--wf-font-weight-semibold, 600);
4331
+ font-size: var(--wf-font-size-lg);
4332
+ font-weight: var(--wf-font-weight-semibold);
4044
4333
  margin: 0.4em 0 0.2em;
4045
4334
  line-height: 1.3;
4046
4335
  }
@@ -4064,7 +4353,7 @@ body.wf-dragging {
4064
4353
  margin: 0.5em 0;
4065
4354
  padding: var(--wf-space-xs) var(--wf-space);
4066
4355
  border-left: 3px solid var(--wf-color-primary);
4067
- background: var(--wf-color-bg-secondary, #f9fafb);
4356
+ background: var(--wf-color-bg-secondary);
4068
4357
  color: var(--wf-color-text-secondary);
4069
4358
  font-style: italic;
4070
4359
  }
@@ -4092,11 +4381,11 @@ body.wf-dragging {
4092
4381
  padding: var(--wf-control-pad-y) var(--wf-space);
4093
4382
  border: none;
4094
4383
  outline: none;
4095
- font-family: var(--wf-font-mono, 'SF Mono', 'Fira Code', 'Consolas', monospace);
4384
+ font-family: var(--wf-font-mono);
4096
4385
  font-size: var(--wf-font-size-sm);
4097
4386
  line-height: 1.6;
4098
4387
  color: var(--wf-color-text);
4099
- background: var(--wf-color-bg-secondary, #f9fafb);
4388
+ background: var(--wf-color-bg-secondary);
4100
4389
  resize: vertical;
4101
4390
  tab-size: 2;
4102
4391
  }
@@ -4133,7 +4422,7 @@ body.wf-dragging {
4133
4422
  flex-direction: column;
4134
4423
  align-items: center;
4135
4424
  justify-content: center;
4136
- gap: 6px;
4425
+ gap: var(--wf-space-xs);
4137
4426
  padding: var(--wf-space-lg) var(--wf-space);
4138
4427
  cursor: pointer;
4139
4428
  text-align: center;
@@ -4160,7 +4449,7 @@ body.wf-dragging {
4160
4449
  .wf-editor-content img {
4161
4450
  max-width: 100%;
4162
4451
  height: auto;
4163
- border-radius: var(--wf-radius-sm, 4px);
4452
+ border-radius: var(--wf-radius-sm);
4164
4453
  margin: 0.5em 0;
4165
4454
  }
4166
4455
 
@@ -4182,7 +4471,7 @@ body.wf-dragging {
4182
4471
  }
4183
4472
 
4184
4473
  .wf-editor-table tbody tr:nth-child(even) {
4185
- background: var(--wf-color-bg-secondary, #f9fafb);
4474
+ background: var(--wf-color-bg-secondary);
4186
4475
  }
4187
4476
 
4188
4477
  /* ── 表格选择网格 ──────────────────────────────────── */
@@ -4194,7 +4483,7 @@ body.wf-dragging {
4194
4483
  border: var(--wf-border-width) solid var(--wf-color-border);
4195
4484
  border-radius: var(--wf-radius);
4196
4485
  padding: var(--wf-space-sm);
4197
- box-shadow: var(--wf-shadow-lg, 0 4px 12px rgba(0,0,0,0.12));
4486
+ box-shadow: var(--wf-shadow-lg);
4198
4487
  /* 定位在工具栏下方 */
4199
4488
  }
4200
4489
 
@@ -4221,7 +4510,7 @@ body.wf-dragging {
4221
4510
 
4222
4511
  .wf-editor-table-grid-cell:hover,
4223
4512
  .wf-editor-table-grid-cell--active {
4224
- background: var(--wf-color-primary-bg, #e0f2fe);
4513
+ background: var(--wf-color-primary-bg);
4225
4514
  border-color: var(--wf-color-primary);
4226
4515
  }
4227
4516
 
@@ -4343,7 +4632,7 @@ body.wf-dragging {
4343
4632
  border-radius: var(--wf-radius);
4344
4633
  background: var(--wf-color-bg-secondary);
4345
4634
  cursor: pointer;
4346
- transition: all var(--wf-transition);
4635
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
4347
4636
  min-height: 120px;
4348
4637
  }
4349
4638
 
@@ -4468,7 +4757,7 @@ body.wf-dragging {
4468
4757
  border-radius: var(--wf-radius-sm);
4469
4758
  color: var(--wf-color-text-tertiary);
4470
4759
  cursor: pointer;
4471
- line-height: 0; padding: 0; flex-shrink: 0;
4760
+ padding: 0; flex-shrink: 0;
4472
4761
  }
4473
4762
 
4474
4763
  .wf-upload-item-remove:hover {
@@ -4497,7 +4786,7 @@ body.wf-dragging {
4497
4786
  display: flex;
4498
4787
  align-items: center;
4499
4788
  justify-content: center;
4500
- gap: 6px;
4789
+ gap: var(--wf-space-xs);
4501
4790
  width: 44px;
4502
4791
  height: 44px;
4503
4792
  min-width: 44px;
@@ -4506,23 +4795,23 @@ body.wf-dragging {
4506
4795
  border: none;
4507
4796
  border-radius: 50%;
4508
4797
  background: var(--wf-color-primary);
4509
- color: var(--wf-color-on-brand, #fff);
4510
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
4798
+ color: var(--wf-color-on-brand);
4799
+ box-shadow: var(--wf-shadow-lg);
4511
4800
  cursor: pointer;
4512
- z-index: var(--wf-z-sticky, 40);
4801
+ z-index: var(--wf-z-sticky);
4513
4802
  font-family: var(--wf-font-sans);
4514
4803
  font-size: 16px;
4515
- transition: transform var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease),
4516
- background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
4804
+ transition: transform var(--wf-dur-fast) var(--wf-ease-standard),
4805
+ background var(--wf-dur-fast) var(--wf-ease-standard);
4517
4806
  }
4518
4807
 
4519
4808
  .wf-float-btn:hover {
4520
4809
  transform: scale(1.05);
4521
- background: var(--wf-color-primary, #1668dc);
4810
+ background: var(--wf-color-primary);
4522
4811
  }
4523
4812
 
4524
4813
  .wf-float-btn--disabled {
4525
- background: var(--wf-color-text-disabled, #bfbfbf);
4814
+ background: var(--wf-color-text-disabled);
4526
4815
  cursor: not-allowed;
4527
4816
  opacity: 0.7;
4528
4817
  }
@@ -4538,10 +4827,10 @@ body.wf-dragging {
4538
4827
  right: -4px;
4539
4828
  min-width: 18px;
4540
4829
  height: 18px;
4541
- padding: 0 5px;
4830
+ padding: 0 var(--wf-space-xs);
4542
4831
  border-radius: 50%;
4543
4832
  background: var(--wf-color-error);
4544
- color: var(--wf-color-on-brand, #fff);
4833
+ color: var(--wf-color-on-brand);
4545
4834
  font-size: 11px;
4546
4835
  line-height: 18px;
4547
4836
  text-align: center;
@@ -4550,7 +4839,7 @@ body.wf-dragging {
4550
4839
  /* ── 组模式 ── */
4551
4840
  .wf-float-group {
4552
4841
  position: fixed;
4553
- z-index: var(--wf-z-sticky, 40);
4842
+ z-index: var(--wf-z-sticky);
4554
4843
  display: flex;
4555
4844
  flex-direction: column;
4556
4845
  align-items: center;
@@ -4565,11 +4854,11 @@ body.wf-dragging {
4565
4854
  .wf-float-group-items {
4566
4855
  display: flex;
4567
4856
  flex-direction: column;
4568
- gap: 10px;
4857
+ gap: var(--wf-space-sm);
4569
4858
  }
4570
4859
 
4571
4860
  .wf-float-group-item {
4572
- animation: wf-float-item-in var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
4861
+ animation: wf-float-item-in var(--wf-dur-md) var(--wf-ease-standard);
4573
4862
  }
4574
4863
 
4575
4864
  @keyframes wf-float-item-in {
@@ -4589,16 +4878,16 @@ body.wf-dragging {
4589
4878
  border: none;
4590
4879
  border-radius: 50%;
4591
4880
  background: var(--wf-color-primary);
4592
- color: var(--wf-color-on-brand, #fff);
4593
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
4881
+ color: var(--wf-color-on-brand);
4882
+ box-shadow: var(--wf-shadow-lg);
4594
4883
  cursor: pointer;
4595
- font-size: var(--wf-font-size-xl, 20px);
4884
+ font-size: var(--wf-font-size-xl);
4596
4885
  font-family: var(--wf-font-sans);
4597
4886
  }
4598
4887
 
4599
4888
  .wf-float-group-icon {
4600
4889
  display: inline-block;
4601
- transition: transform var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
4890
+ transition: transform var(--wf-dur-md) var(--wf-ease-standard);
4602
4891
  }
4603
4892
 
4604
4893
  .wf-float-group-icon.is-open {
@@ -4608,7 +4897,7 @@ body.wf-dragging {
4608
4897
  /* 组内子项:不 fixed(由 group 容器排列) */
4609
4898
  .wf-float-btn--static {
4610
4899
  position: static;
4611
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4900
+ box-shadow: var(--wf-shadow-md);
4612
4901
  }
4613
4902
 
4614
4903
  /* weifuwu/components — Form */
@@ -4661,7 +4950,7 @@ body.wf-dragging {
4661
4950
  background: var(--wf-color-bg);
4662
4951
  border: var(--wf-border-width) solid var(--wf-color-border);
4663
4952
  border-radius: var(--wf-radius);
4664
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
4953
+ box-shadow: var(--wf-shadow-lg);
4665
4954
  padding: var(--wf-space-md);
4666
4955
  font-family: var(--wf-font-sans);
4667
4956
  font-size: var(--wf-font-size-sm);
@@ -4756,11 +5045,11 @@ body.wf-dragging {
4756
5045
  align-items: center;
4757
5046
  justify-content: center;
4758
5047
  min-height: 100px;
4759
- background: var(--wf-color-bg-secondary, #f9fafb);
4760
- border-radius: var(--wf-radius-md, 8px);
4761
- border: 1px dashed var(--wf-color-border, #e5e7eb);
4762
- color: var(--wf-color-text-tertiary, #9ca3af);
4763
- font-size: var(--wf-font-size-sm, 13px);
5048
+ background: var(--wf-color-bg-secondary);
5049
+ border-radius: var(--wf-radius-md);
5050
+ border: 1px dashed var(--wf-color-border);
5051
+ color: var(--wf-color-text-tertiary);
5052
+ font-size: var(--wf-font-size-sm);
4764
5053
  }
4765
5054
 
4766
5055
  .wf-inview-placeholder::after {
@@ -4796,17 +5085,23 @@ body.wf-dragging {
4796
5085
  .wf-input {
4797
5086
  font-family: var(--wf-font-sans);
4798
5087
  font-size: var(--wf-font-size-sm);
4799
- min-height: var(--wf-field-height, var(--wf-control-height));
5088
+ min-height: var(--wf-field-height);
4800
5089
  padding: var(--wf-control-pad-y) var(--wf-space);
4801
5090
  border: var(--wf-border-width) solid var(--wf-color-border);
4802
- border-radius: var(--wf-field-radius, var(--wf-radius));
5091
+ border-radius: var(--wf-field-radius);
4803
5092
  background: var(--wf-color-bg);
4804
5093
  color: var(--wf-color-text);
4805
5094
  outline: none;
4806
- transition: all var(--wf-transition);
5095
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out),
5096
+ box-shadow var(--wf-dur-fast) var(--wf-ease-out),
5097
+ background-color var(--wf-dur-fast) var(--wf-ease-out);
4807
5098
  width: 100%;
4808
5099
  }
4809
5100
 
5101
+ .wf-input:hover:not(:disabled) {
5102
+ border-color: var(--wf-color-border-dark);
5103
+ }
5104
+
4810
5105
  .wf-input:focus {
4811
5106
  border-color: var(--wf-color-primary);
4812
5107
  box-shadow: var(--wf-focus-ring);
@@ -4894,7 +5189,7 @@ body.wf-dragging {
4894
5189
  cursor: pointer;
4895
5190
  padding: 0;
4896
5191
  line-height: 1;
4897
- transition: all var(--wf-transition);
5192
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
4898
5193
  }
4899
5194
 
4900
5195
  .wf-input-number-step:hover {
@@ -4940,7 +5235,7 @@ body.wf-dragging {
4940
5235
  box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
4941
5236
  }
4942
5237
 
4943
- .wf-inputnumber--err { border-color: var(--wf-color-error-text); }
5238
+ .wf-inputnumber--err { border-color: var(--wf-color-error); box-shadow: 0 0 0 2px var(--wf-color-error-bg); }
4944
5239
  .wf-inputnumber--disabled { opacity: 0.6; }
4945
5240
 
4946
5241
  .wf-inputnumber-input {
@@ -4971,7 +5266,7 @@ body.wf-dragging {
4971
5266
  border: none;
4972
5267
  cursor: pointer;
4973
5268
  color: var(--wf-color-text-secondary);
4974
- padding: 2px 6px;
5269
+ padding: 2px var(--wf-space-sm);
4975
5270
  min-height: 18px;
4976
5271
  }
4977
5272
  .wf-inputnumber-btn:hover { background: var(--wf-color-bg-secondary); color: var(--wf-color-text); }
@@ -5049,7 +5344,7 @@ body.wf-dragging {
5049
5344
  background: none;
5050
5345
  color: var(--wf-color-text-tertiary);
5051
5346
  cursor: pointer;
5052
- line-height: 0; padding: 0; flex-shrink: 0;
5347
+ padding: 0; flex-shrink: 0;
5053
5348
  }
5054
5349
 
5055
5350
  .wf-json-toggle:hover {
@@ -5083,7 +5378,7 @@ body.wf-dragging {
5083
5378
  background: none;
5084
5379
  color: var(--wf-color-text-tertiary);
5085
5380
  cursor: pointer;
5086
- line-height: 0; padding: 0; flex-shrink: 0;
5381
+ padding: 0; flex-shrink: 0;
5087
5382
  opacity: 0;
5088
5383
  }
5089
5384
 
@@ -5148,7 +5443,7 @@ body.wf-dragging {
5148
5443
  flex: 1 1 220px;
5149
5444
  min-width: var(--wf-kanban-col-min-width);
5150
5445
  max-width: var(--wf-kanban-col-max-width);
5151
- background: var(--wf-color-bg-subtle, var(--wf-color-fill));
5446
+ background: var(--wf-color-bg-subtle);
5152
5447
  border-radius: var(--wf-radius-md);
5153
5448
  border: 1px solid var(--wf-color-border);
5154
5449
  display: flex;
@@ -5164,7 +5459,7 @@ body.wf-dragging {
5164
5459
  display: flex;
5165
5460
  align-items: center;
5166
5461
  justify-content: space-between;
5167
- padding: 10px 12px;
5462
+ padding: var(--wf-space-sm) 12px;
5168
5463
  font-weight: 600;
5169
5464
  font-size: 13px;
5170
5465
  }
@@ -5188,7 +5483,7 @@ body.wf-dragging {
5188
5483
  background: var(--wf-color-bg);
5189
5484
  border: 1px solid var(--wf-color-border);
5190
5485
  border-radius: var(--wf-radius-sm);
5191
- padding: 10px 12px;
5486
+ padding: var(--wf-space-sm) 12px;
5192
5487
  cursor: grab;
5193
5488
  display: flex;
5194
5489
  align-items: center;
@@ -5217,9 +5512,9 @@ body.wf-dragging {
5217
5512
  .wf-kanban-tag {
5218
5513
  font-size: 11px;
5219
5514
  color: var(--wf-color-primary-text);
5220
- background: var(--wf-color-primary-bg, rgba(79, 110, 247, 0.12));
5515
+ background: var(--wf-color-primary-bg);
5221
5516
  border-radius: var(--wf-radius-xs);
5222
- padding: 1px 6px;
5517
+ padding: 1px var(--wf-space-sm);
5223
5518
  flex-shrink: 0;
5224
5519
  }
5225
5520
 
@@ -5248,7 +5543,7 @@ body.wf-dragging {
5248
5543
  display: flex;
5249
5544
  width: 100%;
5250
5545
  min-height: 100%;
5251
- background: var(--wf-color-bg, #f5f5f5);
5546
+ background: var(--wf-color-bg);
5252
5547
  color: var(--wf-color-text);
5253
5548
  font-family: var(--wf-font-sans);
5254
5549
  }
@@ -5268,13 +5563,13 @@ body.wf-dragging {
5268
5563
  flex-shrink: 0;
5269
5564
  height: 100vh;
5270
5565
  overflow: hidden;
5271
- background: var(--wf-color-bg-secondary, #fff);
5272
- border-right: var(--wf-border-width, 1px) solid var(--wf-color-border);
5273
- transition: width var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5566
+ background: var(--wf-color-bg-secondary);
5567
+ border-right: var(--wf-border-width) solid var(--wf-color-border);
5568
+ transition: width var(--wf-dur-fast) var(--wf-ease-standard);
5274
5569
  }
5275
5570
 
5276
5571
  .wf-layout-sider--collapsed {
5277
- border-right: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5572
+ border-right: var(--wf-border-width) solid var(--wf-color-border-light);
5278
5573
  }
5279
5574
 
5280
5575
  .wf-layout-sider-body {
@@ -5292,21 +5587,21 @@ body.wf-dragging {
5292
5587
  height: 40px;
5293
5588
  flex-shrink: 0;
5294
5589
  border: none;
5295
- border-top: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5590
+ border-top: var(--wf-border-width) solid var(--wf-color-border-light);
5296
5591
  background: transparent;
5297
5592
  color: var(--wf-color-text-secondary);
5298
5593
  cursor: pointer;
5299
5594
  font-size: 12px;
5300
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5595
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
5301
5596
  }
5302
5597
 
5303
5598
  .wf-layout-sider-trigger:hover {
5304
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
5599
+ background: var(--wf-color-bg-hover);
5305
5600
  }
5306
5601
 
5307
5602
  .wf-layout-sider-trigger-icon {
5308
5603
  display: inline-block;
5309
- transition: transform var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5604
+ transition: transform var(--wf-dur-fast) var(--wf-ease-standard);
5310
5605
  }
5311
5606
 
5312
5607
  .wf-layout-sider-trigger-icon.is-collapsed {
@@ -5317,12 +5612,12 @@ body.wf-dragging {
5317
5612
  .wf-layout-header {
5318
5613
  display: flex;
5319
5614
  align-items: center;
5320
- gap: var(--wf-gap-md, 16px);
5321
- height: var(--wf-layout-header-height, 56px);
5322
- padding: 0 var(--wf-space-md, 16px);
5615
+ gap: var(--wf-gap-md);
5616
+ height: var(--wf-layout-header-height);
5617
+ padding: 0 var(--wf-space-md);
5323
5618
  flex-shrink: 0;
5324
- background: var(--wf-color-bg-secondary, #fff);
5325
- border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5619
+ background: var(--wf-color-bg-secondary);
5620
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border-light);
5326
5621
  }
5327
5622
 
5328
5623
  /* ── 主内容区 ── */
@@ -5330,18 +5625,18 @@ body.wf-dragging {
5330
5625
  flex: 1;
5331
5626
  min-height: 0;
5332
5627
  overflow: auto;
5333
- padding: var(--wf-space-md, 16px);
5628
+ padding: var(--wf-space-md);
5334
5629
  }
5335
5630
 
5336
5631
  /* ── 底部栏 ── */
5337
5632
  .wf-layout-footer {
5338
- padding: var(--wf-space-md, 16px);
5633
+ padding: var(--wf-space-md);
5339
5634
  flex-shrink: 0;
5340
5635
  text-align: center;
5341
5636
  color: var(--wf-color-text-secondary);
5342
- font-size: var(--wf-font-size-sm, 13px);
5343
- background: var(--wf-color-bg-secondary, #fff);
5344
- border-top: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5637
+ font-size: var(--wf-font-size-sm);
5638
+ background: var(--wf-color-bg-secondary);
5639
+ border-top: var(--wf-border-width) solid var(--wf-color-border-light);
5345
5640
  }
5346
5641
 
5347
5642
  /* weifuwu/components — Link 文字链接 */
@@ -5352,15 +5647,15 @@ body.wf-dragging {
5352
5647
  gap: 4px;
5353
5648
  text-decoration: underline;
5354
5649
  text-underline-offset: 3px;
5355
- color: var(--wf-color-primary, #1668dc);
5650
+ color: var(--wf-color-primary-text);
5356
5651
  cursor: pointer;
5357
5652
  font-family: var(--wf-font-sans);
5358
- font-size: var(--wf-font-size-sm, 13px);
5359
- transition: color var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5653
+ font-size: var(--wf-font-size-sm);
5654
+ transition: color var(--wf-dur-fast) var(--wf-ease-standard);
5360
5655
  }
5361
5656
 
5362
5657
  .wf-link:hover {
5363
- color: var(--wf-color-primary, #1668dc);
5658
+ color: var(--wf-color-primary-text);
5364
5659
  }
5365
5660
 
5366
5661
  .wf-link--default {
@@ -5371,14 +5666,14 @@ body.wf-dragging {
5371
5666
  }
5372
5667
 
5373
5668
  .wf-link--danger {
5374
- color: var(--wf-color-error-text, #cf1322);
5669
+ color: var(--wf-color-error-text);
5375
5670
  }
5376
5671
  .wf-link--danger:hover {
5377
- color: var(--wf-color-error-text, #a8071a);
5672
+ color: var(--wf-color-error-text);
5378
5673
  }
5379
5674
 
5380
5675
  .wf-link--muted {
5381
- color: var(--wf-color-text-tertiary, #999);
5676
+ color: var(--wf-color-text-tertiary);
5382
5677
  text-decoration: none;
5383
5678
  }
5384
5679
  .wf-link--muted:hover {
@@ -5390,7 +5685,7 @@ body.wf-dragging {
5390
5685
  }
5391
5686
 
5392
5687
  .wf-link--disabled {
5393
- color: var(--wf-color-text-disabled, #bfbfbf);
5688
+ color: var(--wf-color-text-disabled);
5394
5689
  cursor: not-allowed;
5395
5690
  text-decoration: none;
5396
5691
  pointer-events: none;
@@ -5501,7 +5796,7 @@ body.wf-dragging {
5501
5796
  border-radius: var(--wf-radius-sm);
5502
5797
  color: var(--wf-color-text-secondary);
5503
5798
  cursor: pointer;
5504
- line-height: 0; padding: 0; flex-shrink: 0;
5799
+ padding: 0; flex-shrink: 0;
5505
5800
  }
5506
5801
 
5507
5802
  .wf-log-copy:hover {
@@ -5627,6 +5922,54 @@ body.wf-dragging {
5627
5922
  margin: var(--wf-space-md) 0;
5628
5923
  }
5629
5924
 
5925
+ /* GFM 删除线 */
5926
+ .wf-md-del {
5927
+ text-decoration: line-through;
5928
+ color: var(--wf-color-text-secondary);
5929
+ }
5930
+
5931
+ /* GFM 任务列表 */
5932
+ .wf-md-task-list {
5933
+ list-style: none;
5934
+ padding-left: var(--wf-space-xs);
5935
+ }
5936
+ .wf-md-task {
5937
+ display: flex;
5938
+ align-items: flex-start;
5939
+ gap: var(--wf-gap-xs);
5940
+ }
5941
+ .wf-md-task-check {
5942
+ margin-top: 4px;
5943
+ width: 16px;
5944
+ height: 16px;
5945
+ flex-shrink: 0;
5946
+ accent-color: var(--wf-color-primary);
5947
+ cursor: default;
5948
+ }
5949
+
5950
+ /* GFM 表格 */
5951
+ .wf-md-table-wrap {
5952
+ overflow-x: auto;
5953
+ margin: var(--wf-space-sm) 0;
5954
+ }
5955
+ .wf-md-table {
5956
+ border-collapse: collapse;
5957
+ width: 100%;
5958
+ font-size: var(--wf-font-size-sm);
5959
+ }
5960
+ .wf-md-th,
5961
+ .wf-md-td {
5962
+ border: var(--wf-border-width) solid var(--wf-color-border);
5963
+ padding: var(--wf-space-xs) var(--wf-space-sm);
5964
+ }
5965
+ .wf-md-th {
5966
+ background: var(--wf-color-bg-secondary);
5967
+ font-weight: var(--wf-font-weight-semibold);
5968
+ }
5969
+ .wf-md-tr:nth-child(even) .wf-md-td {
5970
+ background: var(--wf-color-bg-secondary);
5971
+ }
5972
+
5630
5973
  /* weifuwu/components — Mentions */
5631
5974
 
5632
5975
  .wf-mentions {
@@ -5641,7 +5984,7 @@ body.wf-dragging {
5641
5984
  border-radius: var(--wf-radius);
5642
5985
  background: var(--wf-color-bg);
5643
5986
  color: var(--wf-color-text);
5644
- padding: 6px var(--wf-space);
5987
+ padding: var(--wf-space-sm) var(--wf-space);
5645
5988
  font-family: var(--wf-font-sans);
5646
5989
  font-size: var(--wf-font-size-base);
5647
5990
  line-height: 1.5;
@@ -5661,19 +6004,19 @@ body.wf-dragging {
5661
6004
  cursor: not-allowed;
5662
6005
  }
5663
6006
 
5664
- .wf-mentions-input--sm { font-size: var(--wf-font-size-sm); padding: 4px var(--wf-space-sm); }
5665
- .wf-mentions-input--lg { font-size: var(--wf-font-size-lg); padding: 8px var(--wf-space-md); }
6007
+ .wf-mentions-input--sm { padding: 4px var(--wf-space-sm); }
6008
+ .wf-mentions-input--lg { padding: 8px var(--wf-space-md); }
5666
6009
 
5667
6010
  .wf-mentions-panel {
5668
6011
  position: fixed;
5669
6012
  z-index: var(--wf-z-popover);
5670
- min-width: var(--wf-mentions-min-width, 160px);
6013
+ min-width: var(--wf-mentions-min-width, 160px);
5671
6014
  max-height: 220px;
5672
6015
  overflow-y: auto;
5673
6016
  background: var(--wf-color-bg);
5674
6017
  border: var(--wf-border-width) solid var(--wf-color-border);
5675
6018
  border-radius: var(--wf-radius);
5676
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
6019
+ box-shadow: var(--wf-shadow-lg);
5677
6020
  padding: var(--wf-space-xs);
5678
6021
  display: flex;
5679
6022
  flex-direction: column;
@@ -5686,7 +6029,7 @@ body.wf-dragging {
5686
6029
  text-align: left;
5687
6030
  border: none;
5688
6031
  background: none;
5689
- padding: 6px var(--wf-space);
6032
+ padding: var(--wf-space-sm) var(--wf-space);
5690
6033
  border-radius: var(--wf-radius-sm);
5691
6034
  font-size: var(--wf-font-size-sm);
5692
6035
  color: var(--wf-color-text);
@@ -5857,6 +6200,32 @@ body.wf-dragging {
5857
6200
  outline-offset: -2px;
5858
6201
  }
5859
6202
 
6203
+ /* 折叠态子菜单浮层(roadmap DO:折叠时图标点击弹出) */
6204
+ .wf-menu-submenu--collapsed {
6205
+ position: relative;
6206
+ }
6207
+ .wf-menu-submenu-title--collapsed {
6208
+ display: flex;
6209
+ align-items: center;
6210
+ justify-content: center;
6211
+ width: 100%;
6212
+ padding: var(--wf-space) 0;
6213
+ }
6214
+ .wf-menu-popup {
6215
+ min-width: var(--wf-menu-popup-min-width, 160px);
6216
+ background: var(--wf-color-bg);
6217
+ border: var(--wf-border-width) solid var(--wf-color-border);
6218
+ border-radius: var(--wf-radius-md);
6219
+ box-shadow: var(--wf-shadow-lg);
6220
+ padding: var(--wf-space-xs);
6221
+ z-index: var(--wf-z-popover);
6222
+ animation: wf-menu-popup-in var(--wf-dur-fast) var(--wf-ease-out);
6223
+ }
6224
+ @keyframes wf-menu-popup-in {
6225
+ from { opacity: 0; transform: translateY(-4px); }
6226
+ to { opacity: 1; transform: translateY(0); }
6227
+ }
6228
+
5860
6229
  /* weifuwu/components — Menubar */
5861
6230
 
5862
6231
  .wf-menubar {
@@ -5901,11 +6270,11 @@ body.wf-dragging {
5901
6270
  .wf-menubar-panel {
5902
6271
  position: fixed;
5903
6272
  z-index: var(--wf-z-popover);
5904
- min-width: var(--wf-menubar-min-width, 160px);
6273
+ min-width: var(--wf-menubar-min-width, 160px);
5905
6274
  background: var(--wf-color-bg);
5906
6275
  border: var(--wf-border-width) solid var(--wf-color-border);
5907
6276
  border-radius: var(--wf-radius);
5908
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
6277
+ box-shadow: var(--wf-shadow-lg);
5909
6278
  padding: var(--wf-space-xs);
5910
6279
  display: flex;
5911
6280
  flex-direction: column;
@@ -5921,7 +6290,7 @@ body.wf-dragging {
5921
6290
  text-align: left;
5922
6291
  border: none;
5923
6292
  background: none;
5924
- padding: 6px var(--wf-space);
6293
+ padding: var(--wf-space-sm) var(--wf-space);
5925
6294
  border-radius: var(--wf-radius-sm);
5926
6295
  font-size: var(--wf-font-size-sm);
5927
6296
  color: var(--wf-color-text);
@@ -5953,7 +6322,7 @@ body.wf-dragging {
5953
6322
  color: var(--wf-color-text-tertiary);
5954
6323
  background: var(--wf-color-bg-tertiary);
5955
6324
  border-radius: var(--wf-radius-sm);
5956
- padding: 1px 6px;
6325
+ padding: 1px var(--wf-space-sm);
5957
6326
  font-family: var(--wf-font-sans);
5958
6327
  }
5959
6328
 
@@ -5968,12 +6337,13 @@ body.wf-dragging {
5968
6337
  .wf-bubble--streaming {
5969
6338
  border-right: 3px solid var(--wf-color-primary);
5970
6339
  border-right-color: var(--wf-color-primary);
5971
- animation: wf-bubble-blink var(--wf-dur-fast) var(--wf-ease-in-out) infinite;
6340
+ /* 1s 光标式平缓闪烁(≤1Hz,远低于 3Hz 光敏阈值);reduced-motion 下基线降为 0.01ms */
6341
+ animation: wf-bubble-blink 1.1s var(--wf-ease-in-out) infinite;
5972
6342
  }
5973
6343
 
5974
6344
  @keyframes wf-bubble-blink {
5975
6345
  0%, 100% { border-right-color: var(--wf-color-primary); }
5976
- 50% { border-right-color: transparent; }
6346
+ 50% { border-right-color: var(--wf-color-primary-bg); }
5977
6347
  }
5978
6348
 
5979
6349
  .wf-bubble-body {
@@ -5999,41 +6369,63 @@ body.wf-dragging {
5999
6369
  z-index: var(--wf-z-modal);
6000
6370
  }
6001
6371
 
6002
- .wf-modal--enter {
6003
- animation: wf-modal-fadein var(--wf-dur-base) var(--wf-ease-out);
6372
+ .wf-modal--enter .wf-modal-overlay {
6373
+ animation: wf-modal-overlay-fadein var(--wf-dur-base) var(--wf-ease-out);
6004
6374
  }
6005
6375
 
6006
- .wf-modal--exit {
6007
- animation: wf-modal-fadeout var(--wf-dur-base) var(--wf-ease-in) forwards;
6376
+ .wf-modal--exit .wf-modal-overlay {
6377
+ animation: wf-modal-overlay-fadeout var(--wf-dur-base) var(--wf-ease-in) forwards;
6008
6378
  }
6009
6379
 
6010
- @keyframes wf-modal-fadein {
6380
+ @keyframes wf-modal-overlay-fadein {
6011
6381
  from { opacity: 0; }
6012
6382
  to { opacity: 1; }
6013
6383
  }
6014
6384
 
6015
- @keyframes wf-modal-fadeout {
6385
+ @keyframes wf-modal-overlay-fadeout {
6016
6386
  from { opacity: 1; }
6017
6387
  to { opacity: 0; }
6018
6388
  }
6019
6389
 
6390
+ /* 内容独立动画(不随遮罩 opacity,避免父级 opacity 过渡延迟 backdrop-filter) */
6391
+ .wf-modal--enter .wf-modal-content {
6392
+ animation: wf-modal-pop var(--wf-dur-base) var(--wf-ease-out);
6393
+ }
6394
+
6395
+ .wf-modal--exit .wf-modal-content {
6396
+ animation: wf-modal-unpop var(--wf-dur-base) var(--wf-ease-in) forwards;
6397
+ }
6398
+
6399
+ @keyframes wf-modal-pop {
6400
+ from { opacity: 0; transform: scale(0.96); }
6401
+ to { opacity: 1; transform: scale(1); }
6402
+ }
6403
+
6404
+ @keyframes wf-modal-unpop {
6405
+ from { opacity: 1; transform: scale(1); }
6406
+ to { opacity: 0; transform: scale(0.96); }
6407
+ }
6408
+
6020
6409
  .wf-modal-overlay {
6021
6410
  position: fixed;
6022
6411
  inset: 0;
6023
6412
  background: var(--wf-overlay);
6413
+ backdrop-filter: blur(var(--wf-overlay-blur));
6414
+ -webkit-backdrop-filter: blur(var(--wf-overlay-blur));
6024
6415
  z-index: -1;
6025
6416
  }
6026
6417
 
6027
6418
  .wf-modal-content {
6028
6419
  background: var(--wf-color-bg);
6029
- border-radius: var(--wf-modal-radius, var(--wf-radius-md));
6030
- box-shadow: var(--wf-modal-shadow, var(--wf-shadow-lg));
6031
- min-width: var(--wf-modal-width, 400px);
6420
+ border-radius: var(--wf-modal-radius, var(--wf-radius-md));
6421
+ box-shadow: var(--wf-modal-shadow, var(--wf-shadow-lg));
6422
+ min-width: var(--wf-modal-width, 400px);
6032
6423
  max-width: 90vw;
6033
6424
  max-height: 80vh;
6034
6425
  display: flex;
6035
6426
  flex-direction: column;
6036
6427
  z-index: 1;
6428
+ transform-origin: center;
6037
6429
  }
6038
6430
 
6039
6431
  .wf-modal-header {
@@ -6076,7 +6468,7 @@ body.wf-dragging {
6076
6468
  /* ── 移动端适配(P2):min-width 视口 clamp(修 375px 屏 400px 溢出)+ 小屏 bottom-sheet ── */
6077
6469
 
6078
6470
  .wf-modal-content {
6079
- min-width: min(var(--wf-modal-width, 400px), calc(100vw - 32px));
6471
+ min-width: min(var(--wf-modal-width, 400px), calc(100vw - 32px));
6080
6472
  }
6081
6473
 
6082
6474
  @media (max-width: 639px) {
@@ -6098,11 +6490,11 @@ body.wf-dragging {
6098
6490
  display: flex;
6099
6491
  align-items: center;
6100
6492
  gap: 2px;
6101
- padding: 0 var(--wf-space-md, 16px);
6102
- background: var(--wf-color-bg-secondary, #fff);
6103
- border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6493
+ padding: 0 var(--wf-space-md);
6494
+ background: var(--wf-color-bg-secondary);
6495
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border-light);
6104
6496
  font-family: var(--wf-font-sans);
6105
- font-size: var(--wf-font-size-sm, 13px);
6497
+ font-size: var(--wf-font-size-sm);
6106
6498
  min-height: 48px;
6107
6499
  }
6108
6500
 
@@ -6110,27 +6502,27 @@ body.wf-dragging {
6110
6502
  position: relative;
6111
6503
  display: inline-flex;
6112
6504
  align-items: center;
6113
- gap: 6px;
6114
- padding: 8px 14px;
6115
- border-radius: var(--wf-surface-radius, 8px);
6505
+ gap: var(--wf-space-sm);
6506
+ padding: 8px var(--wf-space-md);
6507
+ border-radius: var(--wf-surface-radius);
6116
6508
  color: var(--wf-color-text-secondary);
6117
6509
  cursor: pointer;
6118
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease),
6119
- color var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6510
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard),
6511
+ color var(--wf-dur-fast) var(--wf-ease-standard);
6120
6512
  }
6121
6513
 
6122
6514
  .wf-navmenu-item:hover {
6123
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
6515
+ background: var(--wf-color-bg-hover);
6124
6516
  color: var(--wf-color-text);
6125
6517
  }
6126
6518
 
6127
6519
  .wf-navmenu-item--active {
6128
- color: var(--wf-color-primary, #1668dc);
6520
+ color: var(--wf-color-primary-text);
6129
6521
  font-weight: 600;
6130
6522
  }
6131
6523
 
6132
6524
  .wf-navmenu-item--disabled {
6133
- color: var(--wf-color-text-disabled, #bfbfbf);
6525
+ color: var(--wf-color-text-disabled);
6134
6526
  cursor: not-allowed;
6135
6527
  }
6136
6528
 
@@ -6144,14 +6536,14 @@ body.wf-dragging {
6144
6536
  position: absolute;
6145
6537
  top: calc(100% + 6px);
6146
6538
  left: 0;
6147
- min-width: var(--wf-navmenu-min-width, 160px);
6148
- padding: 6px;
6149
- border-radius: var(--wf-surface-radius, 8px);
6150
- background: var(--wf-surface-bg, #fff);
6151
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6152
- border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6153
- z-index: var(--wf-z-dropdown, 120);
6154
- animation: wf-navmenu-in var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6539
+ min-width: var(--wf-navmenu-min-width);
6540
+ padding: var(--wf-space-sm);
6541
+ border-radius: var(--wf-surface-radius);
6542
+ background: var(--wf-surface-bg);
6543
+ box-shadow: var(--wf-surface-shadow);
6544
+ border: var(--wf-border-width) solid var(--wf-color-border-light);
6545
+ z-index: var(--wf-z-dropdown);
6546
+ animation: wf-navmenu-in var(--wf-dur-fast) var(--wf-ease-standard);
6155
6547
  }
6156
6548
 
6157
6549
  @keyframes wf-navmenu-in {
@@ -6166,36 +6558,36 @@ body.wf-dragging {
6166
6558
  justify-content: space-between;
6167
6559
  gap: 12px;
6168
6560
  padding: 8px 12px;
6169
- border-radius: var(--wf-radius, 6px);
6561
+ border-radius: var(--wf-radius);
6170
6562
  color: var(--wf-color-text);
6171
6563
  cursor: pointer;
6172
6564
  white-space: nowrap;
6173
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6565
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
6174
6566
  }
6175
6567
 
6176
6568
  .wf-navmenu-sub-item:hover {
6177
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
6569
+ background: var(--wf-color-bg-hover);
6178
6570
  }
6179
6571
 
6180
6572
  .wf-navmenu-sub-item--disabled {
6181
- color: var(--wf-color-text-disabled, #bfbfbf);
6573
+ color: var(--wf-color-text-disabled);
6182
6574
  cursor: not-allowed;
6183
6575
  }
6184
6576
 
6185
6577
  .wf-navmenu-sub-arrow {
6186
- color: var(--wf-color-text-tertiary, #999);
6578
+ color: var(--wf-color-text-tertiary);
6187
6579
  }
6188
6580
 
6189
6581
  .wf-navmenu-sub-nested {
6190
6582
  position: absolute;
6191
6583
  top: -6px;
6192
6584
  left: calc(100% + 4px);
6193
- min-width: var(--wf-navmenu-min-width, 160px);
6194
- padding: 6px;
6195
- border-radius: var(--wf-surface-radius, 8px);
6196
- background: var(--wf-surface-bg, #fff);
6197
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6198
- border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6585
+ min-width: var(--wf-navmenu-min-width);
6586
+ padding: var(--wf-space-sm);
6587
+ border-radius: var(--wf-surface-radius);
6588
+ background: var(--wf-surface-bg);
6589
+ box-shadow: var(--wf-surface-shadow);
6590
+ border: var(--wf-border-width) solid var(--wf-color-border-light);
6199
6591
  }
6200
6592
 
6201
6593
  /* weifuwu/components — Notification */
@@ -6222,7 +6614,7 @@ body.wf-dragging {
6222
6614
  border: var(--wf-border-width) solid var(--wf-color-border);
6223
6615
  border-left-width: 3px;
6224
6616
  border-radius: var(--wf-radius);
6225
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
6617
+ box-shadow: var(--wf-shadow-lg);
6226
6618
  padding: var(--wf-space) var(--wf-space-md);
6227
6619
  pointer-events: auto;
6228
6620
  font-family: var(--wf-font-sans);
@@ -6370,7 +6762,7 @@ body.wf-dragging {
6370
6762
  cursor: pointer;
6371
6763
  font-family: inherit;
6372
6764
  font-size: inherit;
6373
- transition: all var(--wf-transition);
6765
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
6374
6766
  }
6375
6767
 
6376
6768
  .wf-page-btn:hover:not(:disabled):not(.wf-page-btn--active) {
@@ -6433,7 +6825,7 @@ body.wf-dragging {
6433
6825
  border: none;
6434
6826
  cursor: pointer;
6435
6827
  color: var(--wf-color-text-tertiary);
6436
- padding: 6px;
6828
+ padding: var(--wf-space-sm);
6437
6829
  border-radius: var(--wf-radius-xs);
6438
6830
  }
6439
6831
  .wf-password-eye:hover { color: var(--wf-color-text-secondary); }
@@ -6500,7 +6892,7 @@ body.wf-dragging {
6500
6892
  .wf-pipeline-node {
6501
6893
  position: absolute;
6502
6894
  transform: translate(-50%, -50%);
6503
- padding: 8px 14px;
6895
+ padding: 8px var(--wf-space-md);
6504
6896
  min-width: 72px;
6505
6897
  max-width: 120px;
6506
6898
  text-align: center;
@@ -6513,23 +6905,23 @@ body.wf-dragging {
6513
6905
  white-space: nowrap;
6514
6906
  overflow: hidden;
6515
6907
  text-overflow: ellipsis;
6516
- box-shadow: var(--wf-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.08));
6908
+ box-shadow: var(--wf-shadow-sm);
6517
6909
  }
6518
6910
 
6519
6911
  .wf-pipeline-node--success {
6520
6912
  border-color: var(--wf-color-success-text);
6521
6913
  color: var(--wf-color-success-text);
6522
- background: var(--wf-color-success-bg, rgba(20, 83, 45, 0.06));
6914
+ background: var(--wf-color-success-bg);
6523
6915
  }
6524
6916
  .wf-pipeline-node--running {
6525
6917
  border-color: var(--wf-color-primary);
6526
6918
  color: var(--wf-color-primary-text);
6527
- background: var(--wf-color-primary-bg, rgba(79, 110, 247, 0.08));
6919
+ background: var(--wf-color-primary-bg);
6528
6920
  }
6529
6921
  .wf-pipeline-node--error {
6530
6922
  border-color: var(--wf-color-error-text);
6531
6923
  color: var(--wf-color-error-text);
6532
- background: var(--wf-color-error-bg, rgba(255, 0, 0, 0.06));
6924
+ background: var(--wf-color-error-bg);
6533
6925
  }
6534
6926
  .wf-pipeline-node--pending {
6535
6927
  border-color: var(--wf-color-border);
@@ -6555,15 +6947,15 @@ body.wf-dragging {
6555
6947
 
6556
6948
  .wf-popconfirm {
6557
6949
  position: fixed;
6558
- z-index: var(--wf-z-popover, 120);
6559
- min-width: var(--wf-popconfirm-min-width, 180px);
6560
- padding: var(--wf-space-sm, 12px);
6561
- border-radius: var(--wf-surface-radius, 8px);
6562
- background: var(--wf-surface-bg, #fff);
6563
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6564
- border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6950
+ z-index: var(--wf-z-popover);
6951
+ min-width: var(--wf-popconfirm-min-width, 180px);
6952
+ padding: var(--wf-space-sm);
6953
+ border-radius: var(--wf-surface-radius);
6954
+ background: var(--wf-surface-bg);
6955
+ box-shadow: var(--wf-surface-shadow);
6956
+ border: var(--wf-border-width) solid var(--wf-color-border-light);
6565
6957
  font-family: var(--wf-font-sans);
6566
- font-size: var(--wf-font-size-sm, 13px);
6958
+ font-size: var(--wf-font-size-sm);
6567
6959
  }
6568
6960
 
6569
6961
  .wf-popconfirm--bottom { transform: translateX(-50%); }
@@ -6572,11 +6964,11 @@ body.wf-dragging {
6572
6964
  .wf-popconfirm--right { transform: translateY(-50%); }
6573
6965
 
6574
6966
  .wf-popconfirm--enter {
6575
- animation: wf-popconfirm-in var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
6967
+ animation: wf-popconfirm-in var(--wf-dur-md) var(--wf-ease-standard);
6576
6968
  }
6577
6969
 
6578
6970
  .wf-popconfirm--exit {
6579
- animation: wf-popconfirm-out var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease) forwards;
6971
+ animation: wf-popconfirm-out var(--wf-dur-md) var(--wf-ease-standard) forwards;
6580
6972
  }
6581
6973
 
6582
6974
  /* 入场/退场只 fade(opacity)——transform 由定位类独占:
@@ -6595,8 +6987,8 @@ body.wf-dragging {
6595
6987
  .wf-popconfirm-title {
6596
6988
  display: flex;
6597
6989
  align-items: flex-start;
6598
- gap: var(--wf-gap-xs, 8px);
6599
- margin-bottom: var(--wf-space-xs, 8px);
6990
+ gap: var(--wf-gap-xs);
6991
+ margin-bottom: var(--wf-space-xs);
6600
6992
  color: var(--wf-color-text);
6601
6993
  line-height: 1.5;
6602
6994
  }
@@ -6605,14 +6997,14 @@ body.wf-dragging {
6605
6997
  display: inline-flex;
6606
6998
  flex-shrink: 0;
6607
6999
  margin-top: 2px;
6608
- color: var(--wf-color-warning-text, #ad6800);
7000
+ color: var(--wf-color-warning-text);
6609
7001
  }
6610
7002
 
6611
7003
  .wf-popconfirm-actions {
6612
7004
  display: flex;
6613
7005
  justify-content: flex-end;
6614
- gap: var(--wf-gap-xs, 8px);
6615
- margin-top: var(--wf-space-xs, 8px);
7006
+ gap: var(--wf-gap-xs);
7007
+ margin-top: var(--wf-space-xs);
6616
7008
  }
6617
7009
 
6618
7010
  /* weifuwu/components — Popover */
@@ -6632,10 +7024,10 @@ body.wf-dragging {
6632
7024
  z-index: var(--wf-z-popover);
6633
7025
  background: var(--wf-color-bg);
6634
7026
  border: var(--wf-border-width) solid var(--wf-color-border);
6635
- border-radius: var(--wf-popover-radius, var(--wf-radius-md));
7027
+ border-radius: var(--wf-popover-radius, var(--wf-radius-md));
6636
7028
  box-shadow: var(--wf-shadow-md);
6637
7029
  padding: var(--wf-space);
6638
- min-width: var(--wf-popover-width, 160px);
7030
+ min-width: var(--wf-popover-width, 160px);
6639
7031
  max-width: 320px;
6640
7032
  }
6641
7033
 
@@ -6726,6 +7118,26 @@ body.wf-dragging {
6726
7118
  text-align: right;
6727
7119
  }
6728
7120
 
7121
+ /* 尺寸 */
7122
+ .wf-progress--sm { height: 4px; }
7123
+ .wf-progress--md { height: 8px; }
7124
+ .wf-progress--lg { height: 12px; }
7125
+
7126
+ /* 状态色 */
7127
+ .wf-progress-fill--success { background: var(--wf-color-success-text); }
7128
+ .wf-progress-fill--error { background: var(--wf-color-error-text); }
7129
+ .wf-progress-fill--warning { background: var(--wf-color-warning-text); }
7130
+
7131
+ /* indeterminate:不确定态(动画扫动) */
7132
+ .wf-progress--indeterminate .wf-progress-fill {
7133
+ width: 40%;
7134
+ animation: wf-progress-indeterminate 1.4s var(--wf-ease-in-out) infinite;
7135
+ }
7136
+ @keyframes wf-progress-indeterminate {
7137
+ 0% { transform: translateX(-100%); }
7138
+ 100% { transform: translateX(350%); }
7139
+ }
7140
+
6729
7141
  /* weifuwu/components — RadioGroup */
6730
7142
 
6731
7143
  .wf-radio-group {
@@ -6765,7 +7177,7 @@ body.wf-dragging {
6765
7177
  align-items: center;
6766
7178
  justify-content: center;
6767
7179
  flex-shrink: 0;
6768
- transition: all var(--wf-transition);
7180
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
6769
7181
  background: var(--wf-color-bg);
6770
7182
  }
6771
7183
 
@@ -6844,6 +7256,43 @@ body.wf-dragging {
6844
7256
  .wf-rate--md { font-size: var(--wf-font-size-xl); }
6845
7257
  .wf-rate--lg { font-size: var(--wf-font-size-2xl); }
6846
7258
 
7259
+ /* 半星:1em 容器,底层空星轮廓 + 上层满星裁剪左半(0.5em 精确) */
7260
+ .wf-rate-star-half {
7261
+ position: relative;
7262
+ display: inline-block;
7263
+ width: 1em;
7264
+ height: 1em;
7265
+ }
7266
+ .wf-rate-star-half-bg,
7267
+ .wf-rate-star-half-fg {
7268
+ position: absolute;
7269
+ top: 0;
7270
+ left: 0;
7271
+ height: 100%;
7272
+ display: inline-flex;
7273
+ align-items: center;
7274
+ }
7275
+ .wf-rate-star-half-bg {
7276
+ width: 100%;
7277
+ color: var(--wf-color-text-tertiary);
7278
+ }
7279
+ .wf-rate-star-half-fg {
7280
+ width: 50%;
7281
+ overflow: hidden;
7282
+ color: var(--wf-color-warning-text);
7283
+ }
7284
+ .wf-rate-star-half-fg .wf-rate-star-icon {
7285
+ width: 1em;
7286
+ height: 1em;
7287
+ flex-shrink: 0;
7288
+ fill: currentColor;
7289
+ }
7290
+ .wf-rate-star-half-bg .wf-rate-star-icon {
7291
+ width: 1em;
7292
+ height: 1em;
7293
+ flex-shrink: 0;
7294
+ }
7295
+
6847
7296
  /* weifuwu/components — Resizable */
6848
7297
 
6849
7298
  .wf-resizable {
@@ -6967,7 +7416,7 @@ body.wf-dragging {
6967
7416
  }
6968
7417
 
6969
7418
  .wf-scrollbar::-webkit-scrollbar-thumb:hover {
6970
- background: var(--wf-color-text-tertiary, #999);
7419
+ background: var(--wf-color-text-tertiary);
6971
7420
  }
6972
7421
 
6973
7422
  /* weifuwu/components — SearchInput */
@@ -6980,7 +7429,7 @@ body.wf-dragging {
6980
7429
  border: var(--wf-border-width) solid var(--wf-color-border);
6981
7430
  border-radius: var(--wf-radius);
6982
7431
  background: var(--wf-color-bg);
6983
- transition: all var(--wf-transition);
7432
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
6984
7433
  }
6985
7434
 
6986
7435
  .wf-search:focus-within {
@@ -7115,14 +7564,14 @@ body.wf-dragging {
7115
7564
  .wf-select {
7116
7565
  font-family: var(--wf-font-sans);
7117
7566
  font-size: var(--wf-font-size-sm);
7118
- min-height: var(--wf-field-height, var(--wf-control-height));
7567
+ min-height: var(--wf-field-height);
7119
7568
  padding: var(--wf-control-pad-y) var(--wf-space);
7120
7569
  border: var(--wf-border-width) solid var(--wf-color-border);
7121
- border-radius: var(--wf-field-radius, var(--wf-radius));
7570
+ border-radius: var(--wf-field-radius);
7122
7571
  background: var(--wf-color-bg);
7123
7572
  color: var(--wf-color-text);
7124
7573
  outline: none;
7125
- transition: all var(--wf-transition);
7574
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
7126
7575
  width: 100%;
7127
7576
  cursor: pointer;
7128
7577
  appearance: auto;
@@ -7140,6 +7589,7 @@ body.wf-dragging {
7140
7589
 
7141
7590
  .wf-select--err .wf-select {
7142
7591
  border-color: var(--wf-color-error);
7592
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
7143
7593
  }
7144
7594
 
7145
7595
  /* ── searchable select ── */
@@ -7150,10 +7600,10 @@ body.wf-dragging {
7150
7600
 
7151
7601
  .wf-select-search-trigger {
7152
7602
  border: var(--wf-border-width) solid var(--wf-color-border);
7153
- border-radius: var(--wf-field-radius, var(--wf-radius));
7603
+ border-radius: var(--wf-field-radius);
7154
7604
  background: var(--wf-color-bg);
7155
7605
  cursor: pointer;
7156
- transition: all var(--wf-transition);
7606
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
7157
7607
  }
7158
7608
  .wf-select-search-trigger:focus-within {
7159
7609
  border-color: var(--wf-color-primary);
@@ -7171,6 +7621,7 @@ body.wf-dragging {
7171
7621
  }
7172
7622
  .wf-select--err .wf-select-search-trigger {
7173
7623
  border-color: var(--wf-color-error);
7624
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
7174
7625
  }
7175
7626
 
7176
7627
  .wf-select-search-input {
@@ -7181,7 +7632,7 @@ body.wf-dragging {
7181
7632
  font-family: var(--wf-font-sans);
7182
7633
  font-size: var(--wf-font-size-sm);
7183
7634
  color: var(--wf-color-text);
7184
- min-height: var(--wf-field-height, var(--wf-control-height));
7635
+ min-height: var(--wf-field-height);
7185
7636
  padding: var(--wf-control-pad-y) var(--wf-space);
7186
7637
  cursor: pointer;
7187
7638
  box-sizing: border-box;
@@ -7192,10 +7643,10 @@ body.wf-dragging {
7192
7643
 
7193
7644
  .wf-select-search-menu {
7194
7645
  /* portal 定位(usePopup 接管)——absolute 会被父容器 overflow 裁剪 */
7195
- min-width: var(--wf-select-menu-min-width, 200px);
7646
+ min-width: var(--wf-select-menu-min-width);
7196
7647
  background: var(--wf-color-bg);
7197
7648
  border: var(--wf-border-width) solid var(--wf-color-border);
7198
- border-radius: var(--wf-field-radius, var(--wf-radius));
7649
+ border-radius: var(--wf-field-radius);
7199
7650
  box-shadow: var(--wf-shadow-md);
7200
7651
  max-height: 240px;
7201
7652
  overflow-y: auto;
@@ -7284,12 +7735,12 @@ body.wf-dragging {
7284
7735
  .wf-skeleton {
7285
7736
  display: inline-block;
7286
7737
  height: 1em;
7287
- border-radius: var(--wf-radius-sm, 4px);
7738
+ border-radius: var(--wf-radius-sm);
7288
7739
  background: linear-gradient(
7289
7740
  90deg,
7290
- var(--wf-color-border, #e5e7eb) 25%,
7291
- var(--wf-color-bg-hover, #f3f4f6) 50%,
7292
- var(--wf-color-border, #e5e7eb) 75%
7741
+ var(--wf-color-border) 25%,
7742
+ var(--wf-color-bg-hover) 50%,
7743
+ var(--wf-color-border) 75%
7293
7744
  );
7294
7745
  background-size: 200% 100%;
7295
7746
  animation: wf-skeleton-shimmer 1.5s ease-in-out infinite;
@@ -7316,13 +7767,13 @@ body.wf-dragging {
7316
7767
  }
7317
7768
 
7318
7769
  .wf-skeleton--rect {
7319
- border-radius: var(--wf-radius, 8px);
7770
+ border-radius: var(--wf-radius);
7320
7771
  width: 100%;
7321
7772
  height: 120px;
7322
7773
  }
7323
7774
 
7324
7775
  .wf-skeleton--image {
7325
- border-radius: var(--wf-radius, 8px);
7776
+ border-radius: var(--wf-radius);
7326
7777
  width: 100%;
7327
7778
  aspect-ratio: 16 / 9;
7328
7779
  height: auto;
@@ -7346,12 +7797,12 @@ body.wf-dragging {
7346
7797
  .wf-skeleton-table {
7347
7798
  display: flex;
7348
7799
  flex-direction: column;
7349
- gap: var(--wf-gap-sm, 8px);
7800
+ gap: var(--wf-gap-sm);
7350
7801
  }
7351
7802
 
7352
7803
  .wf-skeleton-row {
7353
7804
  display: flex;
7354
- gap: var(--wf-gap-md, 12px);
7805
+ gap: var(--wf-gap-md);
7355
7806
  align-items: center;
7356
7807
  }
7357
7808
 
@@ -7391,7 +7842,7 @@ body.wf-dragging {
7391
7842
  background: var(--wf-color-primary);
7392
7843
  cursor: pointer;
7393
7844
  border: 2px solid var(--wf-color-on-brand);
7394
- box-shadow: var(--wf-slider-thumb-shadow, 0 1px 3px rgba(0,0,0,0.2));
7845
+ box-shadow: var(--wf-slider-thumb-shadow, var(--wf-shadow-sm));
7395
7846
  }
7396
7847
 
7397
7848
  /* Firefox 同款 thumb(跨浏览器一致) */
@@ -7402,7 +7853,7 @@ body.wf-dragging {
7402
7853
  background: var(--wf-color-primary);
7403
7854
  cursor: pointer;
7404
7855
  border: 2px solid var(--wf-color-on-brand);
7405
- box-shadow: var(--wf-slider-thumb-shadow, 0 1px 3px rgba(0,0,0,0.2));
7856
+ box-shadow: var(--wf-slider-thumb-shadow, var(--wf-shadow-sm));
7406
7857
  }
7407
7858
 
7408
7859
  .wf-slider-input::-moz-range-track {
@@ -7436,7 +7887,7 @@ body.wf-dragging {
7436
7887
  }
7437
7888
 
7438
7889
  .wf-space-split {
7439
- color: var(--wf-color-text-tertiary, #999);
7890
+ color: var(--wf-color-text-tertiary);
7440
7891
  }
7441
7892
 
7442
7893
  .wf-sparkline {
@@ -7594,7 +8045,7 @@ body.wf-dragging {
7594
8045
  width: 36px;
7595
8046
  height: 20px;
7596
8047
  background: var(--wf-color-border-dark);
7597
- border-radius: var(--wf-switch-radius, 10px);
8048
+ border-radius: var(--wf-switch-radius, 10px);
7598
8049
  transition: background var(--wf-transition);
7599
8050
  flex-shrink: 0;
7600
8051
  }
@@ -7609,7 +8060,7 @@ body.wf-dragging {
7609
8060
  background: var(--wf-color-on-brand);
7610
8061
  border-radius: 50%;
7611
8062
  transition: transform var(--wf-transition);
7612
- box-shadow: var(--wf-switch-knob-shadow, 0 1px 2px rgba(0,0,0,0.15));
8063
+ box-shadow: var(--wf-switch-knob-shadow, var(--wf-shadow-sm));
7613
8064
  }
7614
8065
 
7615
8066
  .wf-switch-input:checked + .wf-switch-track {
@@ -7668,6 +8119,7 @@ body.wf-dragging {
7668
8119
  border-bottom: var(--wf-border-width) solid var(--wf-color-border);
7669
8120
  color: var(--wf-color-text);
7670
8121
  font-size: var(--wf-font-size-base);
8122
+ transition: background-color var(--wf-dur-fast) var(--wf-ease-out);
7671
8123
  }
7672
8124
 
7673
8125
  .wf-table-th--sortable {
@@ -7721,6 +8173,20 @@ body.wf-dragging {
7721
8173
  display: flex;
7722
8174
  gap: 0;
7723
8175
  border-bottom: var(--wf-border-width) solid var(--wf-color-border);
8176
+ position: relative;
8177
+ }
8178
+
8179
+ /* 滑动指示器(ink bar):绝对定位 + transform 过渡 */
8180
+ .wf-tab-ink {
8181
+ position: absolute;
8182
+ bottom: -1px;
8183
+ left: 0;
8184
+ height: 2px;
8185
+ background: var(--wf-color-primary);
8186
+ transition: transform var(--wf-dur-base) var(--wf-ease-out),
8187
+ width var(--wf-dur-base) var(--wf-ease-out);
8188
+ pointer-events: none;
8189
+ z-index: 1;
7724
8190
  }
7725
8191
 
7726
8192
  .wf-tab {
@@ -7734,7 +8200,7 @@ body.wf-dragging {
7734
8200
  cursor: pointer;
7735
8201
  border-bottom: 2px solid transparent;
7736
8202
  margin-bottom: -1px;
7737
- transition: all var(--wf-transition);
8203
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
7738
8204
  white-space: nowrap;
7739
8205
  }
7740
8206
 
@@ -7744,7 +8210,6 @@ body.wf-dragging {
7744
8210
 
7745
8211
  .wf-tab--active {
7746
8212
  color: var(--wf-color-primary-text);
7747
- border-bottom-color: var(--wf-color-primary);
7748
8213
  }
7749
8214
 
7750
8215
  /* 激活指示平滑滑动(下边框) */
@@ -7772,7 +8237,7 @@ body.wf-dragging {
7772
8237
  align-items: center;
7773
8238
  gap: var(--wf-gap-xs);
7774
8239
  padding: 2px var(--wf-space-sm);
7775
- border-radius: var(--wf-tag-radius, var(--wf-radius-sm));
8240
+ border-radius: var(--wf-tag-radius, var(--wf-radius-sm));
7776
8241
  font-family: var(--wf-font-sans);
7777
8242
  font-size: var(--wf-font-size-xs);
7778
8243
  line-height: 1.5;
@@ -7827,7 +8292,7 @@ body.wf-dragging {
7827
8292
  box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
7828
8293
  }
7829
8294
 
7830
- .wf-tags--err { border-color: var(--wf-color-error-text); }
8295
+ .wf-tags--err { border-color: var(--wf-color-error); box-shadow: 0 0 0 2px var(--wf-color-error-bg); }
7831
8296
  .wf-tags--disabled { opacity: 0.6; cursor: not-allowed; }
7832
8297
 
7833
8298
  .wf-tags-tag {
@@ -7888,14 +8353,14 @@ body.wf-dragging {
7888
8353
  .wf-textarea {
7889
8354
  font-family: var(--wf-font-sans);
7890
8355
  font-size: var(--wf-font-size-sm);
7891
- min-height: var(--wf-field-height, var(--wf-control-height));
8356
+ min-height: var(--wf-field-height);
7892
8357
  padding: var(--wf-control-pad-y) var(--wf-space);
7893
8358
  border: var(--wf-border-width) solid var(--wf-color-border);
7894
- border-radius: var(--wf-field-radius, var(--wf-radius));
8359
+ border-radius: var(--wf-field-radius);
7895
8360
  background: var(--wf-color-bg);
7896
8361
  color: var(--wf-color-text);
7897
8362
  outline: none;
7898
- transition: all var(--wf-transition);
8363
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
7899
8364
  width: 100%;
7900
8365
  resize: vertical;
7901
8366
  line-height: var(--wf-line-height);
@@ -7930,6 +8395,7 @@ body.wf-dragging {
7930
8395
 
7931
8396
  .wf-textarea--err .wf-textarea {
7932
8397
  border-color: var(--wf-color-error);
8398
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
7933
8399
  }
7934
8400
 
7935
8401
  /* weifuwu/components — ThemeSwitch 主题切换器 */
@@ -7943,7 +8409,7 @@ body.wf-dragging {
7943
8409
  border-radius: var(--wf-radius-md);
7944
8410
  background: var(--wf-color-bg-secondary);
7945
8411
  font-family: var(--wf-font-sans);
7946
- box-shadow: var(--wf-theme-switch-inset, inset 0 1px 2px rgba(0, 0, 0, 0.04));
8412
+ box-shadow: var(--wf-theme-switch-inset, var(--wf-shadow-inset));
7947
8413
  }
7948
8414
 
7949
8415
  .wf-theme-seg {
@@ -7961,7 +8427,7 @@ body.wf-dragging {
7961
8427
  cursor: pointer;
7962
8428
  white-space: nowrap;
7963
8429
  user-select: none;
7964
- transition: all var(--wf-transition);
8430
+ transition: border-color var(--wf-transition), box-shadow var(--wf-transition), background-color var(--wf-transition), color var(--wf-transition);
7965
8431
  }
7966
8432
 
7967
8433
  .wf-theme-seg:hover {
@@ -8081,6 +8547,44 @@ body.wf-dragging {
8081
8547
  .wf-timeline-item--alt-left { align-self: flex-start; text-align: right; }
8082
8548
  .wf-timeline-item--alt-right { align-self: flex-end; margin-left: 50%; }
8083
8549
 
8550
+ /* 横向模式(horizontal):节点水平排列,连接线水平 */
8551
+ .wf-timeline--h {
8552
+ display: flex;
8553
+ gap: 0;
8554
+ overflow-x: auto;
8555
+ }
8556
+ .wf-timeline-item--h {
8557
+ position: relative;
8558
+ display: flex;
8559
+ flex-direction: column;
8560
+ align-items: center;
8561
+ flex: 1;
8562
+ min-width: var(--wf-timeline-h-min-width, 120px);
8563
+ padding: 0 var(--wf-space-xs);
8564
+ padding-bottom: 0;
8565
+ text-align: center;
8566
+ }
8567
+ /* 水平连接线(除最后一项) */
8568
+ .wf-timeline-item--h:not(:last-child)::before {
8569
+ content: '';
8570
+ position: absolute;
8571
+ top: 10px;
8572
+ left: calc(50% + 11px);
8573
+ right: calc(-50% + 11px);
8574
+ height: 2px;
8575
+ width: auto;
8576
+ background: var(--wf-color-border);
8577
+ }
8578
+ .wf-timeline-item--h .wf-timeline-node {
8579
+ margin-top: 0;
8580
+ }
8581
+ .wf-timeline-item--h .wf-timeline-head {
8582
+ flex-direction: column;
8583
+ align-items: center;
8584
+ gap: 2px;
8585
+ margin-top: var(--wf-space-xs);
8586
+ }
8587
+
8084
8588
  /* weifuwu/components — Toast */
8085
8589
 
8086
8590
  .wf-toast-container {
@@ -8104,11 +8608,11 @@ body.wf-dragging {
8104
8608
  align-items: center;
8105
8609
  gap: var(--wf-gap-sm);
8106
8610
  padding: var(--wf-space) var(--wf-space-md);
8107
- border-radius: var(--wf-toast-radius, var(--wf-radius));
8611
+ border-radius: var(--wf-toast-radius, var(--wf-radius));
8108
8612
  box-shadow: var(--wf-shadow-md);
8109
8613
  font-family: var(--wf-font-sans);
8110
8614
  font-size: var(--wf-font-size-sm);
8111
- min-width: var(--wf-toast-width, 260px);
8615
+ min-width: var(--wf-toast-width, 260px);
8112
8616
  max-width: 400px;
8113
8617
  cursor: pointer;
8114
8618
  pointer-events: auto;
@@ -8235,9 +8739,9 @@ body.wf-dragging {
8235
8739
  }
8236
8740
 
8237
8741
  /* 尺寸 */
8238
- .wf-toggle--sm { font-size: var(--wf-font-size-sm); padding: 2px var(--wf-space-sm); }
8239
- .wf-toggle--md { font-size: var(--wf-font-size-base); padding: 4px var(--wf-space); }
8240
- .wf-toggle--lg { font-size: var(--wf-font-size-lg); padding: 6px var(--wf-space-md); }
8742
+ .wf-toggle--sm { padding: 2px var(--wf-space-sm); }
8743
+ .wf-toggle--md { padding: 4px var(--wf-space); }
8744
+ .wf-toggle--lg { padding: var(--wf-space-sm) var(--wf-space-md); }
8241
8745
 
8242
8746
  /* 组:紧邻连接,选中项圆角过渡 */
8243
8747
  .wf-toggle-group {
@@ -8335,7 +8839,7 @@ body.wf-dragging {
8335
8839
  font-family: var(--wf-font-sans);
8336
8840
  font-size: var(--wf-font-size-xs);
8337
8841
  padding: var(--wf-space-xs) var(--wf-space-sm);
8338
- border-radius: var(--wf-tooltip-radius, var(--wf-radius-sm));
8842
+ border-radius: var(--wf-tooltip-radius, var(--wf-radius-sm));
8339
8843
  box-shadow: var(--wf-shadow-md); /* 与其他弹层一致的层次阴影 */
8340
8844
  white-space: nowrap;
8341
8845
  pointer-events: none;
@@ -8433,7 +8937,7 @@ body.wf-dragging {
8433
8937
  box-shadow: 0 0 0 9999px var(--wf-overlay), 0 0 0 2px var(--wf-color-primary);
8434
8938
  z-index: 1;
8435
8939
  pointer-events: none;
8436
- transition: all var(--wf-dur-fast) var(--wf-ease-out);
8940
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out), box-shadow var(--wf-dur-fast) var(--wf-ease-out), background-color var(--wf-dur-fast) var(--wf-ease-out), color var(--wf-dur-fast) var(--wf-ease-out);
8437
8941
  }
8438
8942
 
8439
8943
  .wf-tour-bubble {
@@ -8444,7 +8948,7 @@ body.wf-dragging {
8444
8948
  background: var(--wf-color-bg);
8445
8949
  border: 1px solid var(--wf-color-border);
8446
8950
  border-radius: var(--wf-radius-md);
8447
- box-shadow: var(--wf-shadow-lg, 0 12px 32px rgba(0, 0, 0, 0.12));
8951
+ box-shadow: var(--wf-shadow-lg);
8448
8952
  padding: 16px;
8449
8953
  display: flex;
8450
8954
  flex-direction: column;
@@ -8482,7 +8986,7 @@ body.wf-dragging {
8482
8986
 
8483
8987
  .wf-tour-btn {
8484
8988
  min-height: 32px;
8485
- padding: 0 14px;
8989
+ padding: 0 var(--wf-space-md);
8486
8990
  border-radius: var(--wf-radius-sm);
8487
8991
  border: 1px solid var(--wf-color-border);
8488
8992
  background: var(--wf-color-bg);
@@ -8512,7 +9016,8 @@ body.wf-dragging {
8512
9016
  .wf-transfer {
8513
9017
  display: flex;
8514
9018
  align-items: stretch;
8515
- gap: var(--wf-gap);
9019
+ /* wf-gap-* 改直接 gap 后 --wf-gap 无继承来源——加 fallback */
9020
+ gap: var(--wf-gap, var(--wf-gap-md));
8516
9021
  font-family: var(--wf-font-sans);
8517
9022
  }
8518
9023
 
@@ -8548,7 +9053,7 @@ body.wf-dragging {
8548
9053
  text-align: left;
8549
9054
  border: none;
8550
9055
  background: none;
8551
- padding: 6px var(--wf-space);
9056
+ padding: var(--wf-space-sm) var(--wf-space);
8552
9057
  border-radius: var(--wf-radius-sm);
8553
9058
  font-size: var(--wf-font-size-sm);
8554
9059
  color: var(--wf-color-text);
@@ -8642,6 +9147,15 @@ body.wf-dragging {
8642
9147
  }
8643
9148
  }
8644
9149
 
9150
+ .wf-transfer-search {
9151
+ width: 100%;
9152
+ box-sizing: border-box;
9153
+ margin-bottom: var(--wf-gap-xs);
9154
+ min-height: var(--wf-field-height);
9155
+ padding: var(--wf-control-pad-y) var(--wf-space-sm);
9156
+ font-size: var(--wf-font-size-sm);
9157
+ }
9158
+
8645
9159
  /* weifuwu/components — Tree */
8646
9160
 
8647
9161
  .wf-tree {
@@ -8658,7 +9172,7 @@ body.wf-dragging {
8658
9172
  display: flex;
8659
9173
  align-items: center;
8660
9174
  gap: var(--wf-gap-xs);
8661
- padding: 3px var(--wf-space-sm);
9175
+ padding: var(--wf-space-xs) var(--wf-space-sm);
8662
9176
  border-radius: var(--wf-radius-sm);
8663
9177
  cursor: pointer;
8664
9178
  }
@@ -8788,6 +9302,20 @@ body.wf-dragging {
8788
9302
  white-space: nowrap;
8789
9303
  }
8790
9304
 
9305
+ /* 搜索高亮 */
9306
+ .wf-tree-match {
9307
+ background: var(--wf-color-warning-bg);
9308
+ color: var(--wf-color-warning-text);
9309
+ border-radius: var(--wf-radius-xs);
9310
+ padding: 0 1px;
9311
+ }
9312
+ .wf-tree-empty {
9313
+ padding: var(--wf-space-md);
9314
+ color: var(--wf-color-text-secondary);
9315
+ font-size: var(--wf-font-size-sm);
9316
+ text-align: center;
9317
+ }
9318
+
8791
9319
  .wf-treeselect {
8792
9320
  position: relative;
8793
9321
  display: inline-block;
@@ -8800,7 +9328,7 @@ body.wf-dragging {
8800
9328
  align-items: center;
8801
9329
  justify-content: space-between;
8802
9330
  gap: 8px;
8803
- padding: 7px 12px;
9331
+ padding: var(--wf-space-sm) 12px;
8804
9332
  border: 1px solid var(--wf-color-border);
8805
9333
  border-radius: var(--wf-radius-sm);
8806
9334
  background: var(--wf-color-bg);
@@ -8813,7 +9341,7 @@ body.wf-dragging {
8813
9341
  }
8814
9342
  .wf-treeselect-trigger--open {
8815
9343
  border-color: var(--wf-color-primary);
8816
- box-shadow: 0 0 0 2px var(--wf-color-primary-bg, rgba(79, 110, 247, 0.15));
9344
+ box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
8817
9345
  }
8818
9346
 
8819
9347
  .wf-treeselect-placeholder {
@@ -8847,7 +9375,7 @@ body.wf-dragging {
8847
9375
  background: var(--wf-color-bg);
8848
9376
  border: 1px solid var(--wf-color-border);
8849
9377
  border-radius: var(--wf-radius-md);
8850
- box-shadow: var(--wf-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.1));
9378
+ box-shadow: var(--wf-shadow-md);
8851
9379
  padding: 4px;
8852
9380
  max-height: var(--wf-treeselect-dropdown-max-height);
8853
9381
  overflow: auto;
@@ -9043,6 +9571,21 @@ body.wf-dragging {
9043
9571
  font-size: var(--wf-font-size-sm);
9044
9572
  }
9045
9573
 
9574
+ /* 行选择复选框列 */
9575
+ .wf-virtual-table-th--select,
9576
+ .wf-virtual-table-td--select {
9577
+ display: flex;
9578
+ align-items: center;
9579
+ justify-content: center;
9580
+ flex-shrink: 0;
9581
+ }
9582
+ .wf-virtual-table-check {
9583
+ width: 16px;
9584
+ height: 16px;
9585
+ cursor: pointer;
9586
+ accent-color: var(--wf-color-primary);
9587
+ }
9588
+
9046
9589
  /* weifuwu/components — Watermark */
9047
9590
 
9048
9591
  .wf-watermark {