weifuwu 0.70.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.
@@ -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,10 +706,12 @@ body.wf-dragging {
641
706
  }
642
707
 
643
708
  @layer layout {
644
- /* between — 两端对齐(行内垂直居中) */
709
+ /* between — 两端对齐(行内垂直居中;L3:align/gap 默认值 :where() 零优先级) */
645
710
  .wf-between {
646
711
  display: flex;
647
712
  justify-content: space-between;
713
+ }
714
+ :where(.wf-between) {
648
715
  align-items: var(--wf-align, center);
649
716
  gap: var(--wf-gap, var(--wf-gap-md));
650
717
  }
@@ -654,57 +721,69 @@ body.wf-dragging {
654
721
  }
655
722
 
656
723
  @layer layout {
657
- /* right — 靠右对齐 */
724
+ /* right — 靠右对齐(L3:align/gap 默认值 :where() 零优先级) */
658
725
  .wf-right {
659
726
  display: flex;
660
727
  justify-content: flex-end;
728
+ }
729
+ :where(.wf-right) {
661
730
  align-items: var(--wf-align, center);
662
731
  gap: var(--wf-gap, var(--wf-gap-md));
663
732
  }
664
733
  }
665
734
 
666
735
  @layer layout {
667
- /* top — 顶部对齐 */
736
+ /* top — 顶部对齐(L3:gap 默认值 :where() 零优先级;align-items 是身份属性) */
668
737
  .wf-top {
669
738
  display: flex;
670
739
  align-items: flex-start;
740
+ }
741
+ :where(.wf-top) {
671
742
  gap: var(--wf-gap, var(--wf-gap-md));
672
743
  }
673
744
  }
674
745
 
675
746
  @layer layout {
676
- /* bottom — 底部对齐 */
747
+ /* bottom — 底部对齐(L3:gap 默认值 :where() 零优先级;align-items 是身份属性) */
677
748
  .wf-bottom {
678
749
  display: flex;
679
750
  align-items: flex-end;
751
+ }
752
+ :where(.wf-bottom) {
680
753
  gap: var(--wf-gap, var(--wf-gap-md));
681
754
  }
682
755
  }
683
756
 
684
757
  @layer layout {
685
- /* stretch — 拉伸对齐 */
758
+ /* stretch — 拉伸对齐(L3:gap 默认值 :where() 零优先级;align-items 是身份属性) */
686
759
  .wf-stretch {
687
760
  display: flex;
688
761
  align-items: stretch;
762
+ }
763
+ :where(.wf-stretch) {
689
764
  gap: var(--wf-gap, var(--wf-gap-md));
690
765
  }
691
766
  }
692
767
 
693
768
  @layer layout {
694
- /* around — 均匀环绕分布 */
769
+ /* around — 均匀环绕分布(L3:align/gap 默认值 :where() 零优先级) */
695
770
  .wf-around {
696
771
  display: flex;
697
772
  justify-content: space-around;
773
+ }
774
+ :where(.wf-around) {
698
775
  align-items: var(--wf-align, center);
699
776
  gap: var(--wf-gap, var(--wf-gap-md));
700
777
  }
701
778
  }
702
779
 
703
780
  @layer layout {
704
- /* evenly — 均匀分布 */
781
+ /* evenly — 均匀分布(L3:align/gap 默认值 :where() 零优先级) */
705
782
  .wf-evenly {
706
783
  display: flex;
707
784
  justify-content: space-evenly;
785
+ }
786
+ :where(.wf-evenly) {
708
787
  align-items: var(--wf-align, center);
709
788
  gap: var(--wf-gap, var(--wf-gap-md));
710
789
  }
@@ -720,7 +799,9 @@ body.wf-dragging {
720
799
  }
721
800
 
722
801
  @layer layout {
723
- /* fixed — 固定不伸缩 */
802
+ /* flex-none — 固定不伸缩(推荐名;wf-fixed 为兼容别名——易与 position:fixed 混淆,
803
+ position:fixed 请用 wf-pin) */
804
+ .wf-flex-none,
724
805
  .wf-fixed {
725
806
  flex: none;
726
807
  }
@@ -881,19 +962,24 @@ body.wf-dragging {
881
962
  }
882
963
 
883
964
  @layer layout {
884
- /* grid — 二维网格 */
965
+ /* grid — 二维网格(L3:gap 默认值 :where() 零优先级) */
885
966
  .wf-grid {
886
967
  display: grid;
887
968
  grid-template-columns: var(--wf-cols, repeat(auto-fill, minmax(280px, 1fr)));
969
+ }
970
+ :where(.wf-grid) {
888
971
  gap: var(--wf-gap, var(--wf-gap-lg));
889
972
  }
890
973
  }
891
974
 
892
975
  @layer layout {
893
- /* cluster — 换行簇 */
976
+ /* cluster — 换行簇(L3:justify/align/gap 默认值 :where() 零优先级——
977
+ wf-right 等分布工具叠加时靠优先级获胜) */
894
978
  .wf-cluster {
895
979
  display: flex;
896
980
  flex-wrap: wrap;
981
+ }
982
+ :where(.wf-cluster) {
897
983
  gap: var(--wf-gap, var(--wf-gap-sm));
898
984
  justify-content: var(--wf-justify, center);
899
985
  align-items: var(--wf-align, center);
@@ -901,7 +987,7 @@ body.wf-dragging {
901
987
  }
902
988
 
903
989
  @layer layout {
904
- /* scroll — 可滚动容器 */
990
+ /* scroll — 可滚动容器(全局滚动条样式见 _base.css;此类仅标记语义 + overflow) */
905
991
  .wf-scroll {
906
992
  overflow: auto;
907
993
  }
@@ -963,6 +1049,19 @@ body.wf-dragging {
963
1049
  }
964
1050
  }
965
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
+
966
1065
  @layer layout {
967
1066
  /* container — 内容宽度约束居中 */
968
1067
  /* width: 100% 必须:margin: 0 auto 在 flex 父中阻止 stretch(宽度=内容)
@@ -992,10 +1091,13 @@ body.wf-dragging {
992
1091
 
993
1092
  @layer layout {
994
1093
  /* nowrap — 不换行(只管 flex-wrap——不定义 align-items,避免与
995
- wf-stretch 等对齐工具叠加冲突:双份 CSS 下 nowrap 后置曾覆盖 stretch) */
1094
+ wf-stretch 等对齐工具叠加冲突:双份 CSS 下 nowrap 后置曾覆盖 stretch;
1095
+ L3:gap 默认值 :where() 零优先级) */
996
1096
  .wf-nowrap {
997
1097
  display: flex;
998
1098
  flex-wrap: nowrap;
1099
+ }
1100
+ :where(.wf-nowrap) {
999
1101
  gap: var(--wf-gap, var(--wf-gap-md));
1000
1102
  }
1001
1103
  }
@@ -1038,6 +1140,20 @@ body.wf-dragging {
1038
1140
  .wf-py-xl { padding-top: var(--wf-space-xl); padding-bottom: var(--wf-space-xl); }
1039
1141
  .wf-py-2xl { padding-top: var(--wf-space-2xl); padding-bottom: var(--wf-space-2xl); }
1040
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
+
1041
1157
  /* ── margin:重置 ── */
1042
1158
  .wf-m-0 { margin: 0; }
1043
1159
  .wf-p-0 { padding: 0; }
@@ -1067,6 +1183,8 @@ body.wf-dragging {
1067
1183
  /* ── margin: auto(居中) ── */
1068
1184
  .wf-mx-auto { margin-left: auto; margin-right: auto; }
1069
1185
  .wf-my-auto { margin-top: auto; margin-bottom: auto; }
1186
+ .wf-mt-auto { margin-top: auto; } /* flex 列推底(侧栏 footer——曾写不存在类静默失效) */
1187
+ .wf-mb-auto { margin-bottom: auto; }
1070
1188
 
1071
1189
  /* ── gap:直接设置 gap 属性(不设 --wf-gap 变量——变量会继承污染子孙:
1072
1190
  壳 root wf-gap-none 曾让 KPI grid 的 gap: var(--wf-gap) = 0 卡无间距) ── */
@@ -1534,6 +1652,15 @@ body.wf-dragging {
1534
1652
  background: var(--wf-color-bg-tertiary);
1535
1653
  }
1536
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
+
1537
1664
  .wf-accordion-summary:focus-visible {
1538
1665
  outline: none;
1539
1666
  box-shadow: var(--wf-focus-ring);
@@ -1565,9 +1692,9 @@ body.wf-dragging {
1565
1692
  .wf-aichat {
1566
1693
  display: flex;
1567
1694
  flex-direction: column;
1568
- gap: var(--wf-gap-sm, 8px);
1695
+ gap: var(--wf-gap-sm);
1569
1696
  font-family: var(--wf-font-sans);
1570
- font-size: var(--wf-font-size-sm, 14px);
1697
+ font-size: var(--wf-font-size-sm);
1571
1698
  line-height: var(--wf-line-height);
1572
1699
  color: var(--wf-color-text);
1573
1700
  }
@@ -1576,24 +1703,24 @@ body.wf-dragging {
1576
1703
  overflow-y: auto;
1577
1704
  display: flex;
1578
1705
  flex-direction: column;
1579
- gap: var(--wf-gap-sm, 8px);
1580
- padding: var(--wf-space-sm, 8px);
1706
+ gap: var(--wf-gap-sm);
1707
+ padding: var(--wf-space-sm);
1581
1708
  border: 1px solid var(--wf-color-border);
1582
1709
  border-radius: var(--wf-radius);
1583
1710
  background: var(--wf-color-bg);
1584
1711
  }
1585
1712
 
1586
1713
  .wf-aichat-empty {
1587
- margin: var(--wf-space-lg, 16px) 0;
1714
+ margin: var(--wf-space-lg) 0;
1588
1715
  text-align: center;
1589
1716
  color: var(--wf-color-text-secondary);
1590
- font-size: var(--wf-font-size-sm, 14px);
1717
+ font-size: var(--wf-font-size-sm);
1591
1718
  }
1592
1719
 
1593
1720
  .wf-aichat-msg {
1594
1721
  display: flex;
1595
1722
  flex-direction: column;
1596
- gap: var(--wf-gap-xs, 4px);
1723
+ gap: var(--wf-gap-xs);
1597
1724
  }
1598
1725
 
1599
1726
  .wf-aichat-tools,
@@ -1604,9 +1731,9 @@ body.wf-dragging {
1604
1731
  .wf-aichat-bubble {
1605
1732
  display: inline-block;
1606
1733
  max-width: 85%;
1607
- padding: var(--wf-space-sm, 8px) var(--wf-space-md, 12px);
1734
+ padding: var(--wf-space-sm) var(--wf-space-md);
1608
1735
  border-radius: var(--wf-radius);
1609
- font-size: var(--wf-font-size-sm, 14px);
1736
+ font-size: var(--wf-font-size-sm);
1610
1737
  white-space: pre-wrap;
1611
1738
  word-break: break-word;
1612
1739
  }
@@ -1630,38 +1757,38 @@ body.wf-dragging {
1630
1757
  }
1631
1758
 
1632
1759
  .wf-aichat-status {
1633
- font-size: var(--wf-font-size-xs, 12px);
1760
+ font-size: var(--wf-font-size-xs);
1634
1761
  color: var(--wf-color-info-text);
1635
1762
  }
1636
1763
 
1637
1764
  .wf-aichat-usage {
1638
- font-size: var(--wf-font-size-xs, 12px);
1765
+ font-size: var(--wf-font-size-xs);
1639
1766
  color: var(--wf-color-text-secondary);
1640
1767
  }
1641
1768
 
1642
1769
  .wf-aichat-error {
1643
- font-size: var(--wf-font-size-xs, 12px);
1770
+ font-size: var(--wf-font-size-xs);
1644
1771
  color: var(--wf-color-error-text);
1645
1772
  background: var(--wf-color-error-bg);
1646
1773
  border-radius: var(--wf-radius);
1647
- padding: var(--wf-space-sm, 8px);
1774
+ padding: var(--wf-space-sm);
1648
1775
  }
1649
1776
 
1650
1777
  .wf-aichat-inputbar {
1651
1778
  display: flex;
1652
- gap: var(--wf-gap-sm, 8px);
1779
+ gap: var(--wf-gap-sm);
1653
1780
  align-items: center;
1654
1781
  }
1655
1782
 
1656
1783
  .wf-aichat-input {
1657
1784
  flex: 1;
1658
1785
  min-width: 0;
1659
- height: var(--wf-control-height, 36px);
1660
- 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);
1661
1788
  border: 1px solid var(--wf-color-border);
1662
1789
  border-radius: var(--wf-radius);
1663
1790
  font-family: var(--wf-font-sans);
1664
- font-size: var(--wf-font-size-sm, 14px);
1791
+ font-size: var(--wf-font-size-sm);
1665
1792
  color: var(--wf-color-text);
1666
1793
  background: var(--wf-color-bg);
1667
1794
  }
@@ -1678,7 +1805,7 @@ body.wf-dragging {
1678
1805
  align-items: flex-start;
1679
1806
  gap: var(--wf-gap-sm);
1680
1807
  padding: var(--wf-space) var(--wf-space-md);
1681
- border-radius: var(--wf-alert-radius, var(--wf-radius));
1808
+ border-radius: var(--wf-alert-radius, var(--wf-radius));
1682
1809
  font-family: var(--wf-font-sans);
1683
1810
  font-size: var(--wf-font-size-sm);
1684
1811
  line-height: var(--wf-line-height);
@@ -1719,36 +1846,36 @@ body.wf-dragging {
1719
1846
  .wf-alertgroup {
1720
1847
  display: flex;
1721
1848
  flex-direction: column;
1722
- gap: 6px;
1849
+ gap: var(--wf-space-sm);
1723
1850
  font-family: var(--wf-font-sans);
1724
- font-size: var(--wf-font-size-sm, 13px);
1851
+ font-size: var(--wf-font-size-sm);
1725
1852
  }
1726
1853
 
1727
1854
  .wf-alertgroup-summary {
1728
1855
  display: flex;
1729
1856
  align-items: center;
1730
1857
  justify-content: center;
1731
- padding: 10px 16px;
1732
- border: var(--wf-border-width, 1px) solid var(--wf-color-border);
1733
- border-radius: var(--wf-surface-radius, 8px);
1734
- background: var(--wf-color-bg-secondary, #fff);
1735
- 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);
1736
1863
  cursor: pointer;
1737
1864
  font-family: var(--wf-font-sans);
1738
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
1865
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
1739
1866
  }
1740
1867
 
1741
1868
  .wf-alertgroup-summary:hover {
1742
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1869
+ background: var(--wf-color-bg-hover);
1743
1870
  }
1744
1871
 
1745
1872
  .wf-alertgroup-item {
1746
1873
  display: flex;
1747
1874
  align-items: center;
1748
- gap: 10px;
1749
- padding: 10px 16px;
1750
- border-radius: var(--wf-surface-radius, 8px);
1751
- 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);
1752
1879
  border-left: 3px solid var(--wf-color-info);
1753
1880
  }
1754
1881
 
@@ -1762,7 +1889,7 @@ body.wf-dragging {
1762
1889
  }
1763
1890
 
1764
1891
  .wf-alertgroup-time {
1765
- color: var(--wf-color-text-tertiary, #999);
1892
+ color: var(--wf-color-text-tertiary);
1766
1893
  font-size: 12px;
1767
1894
  }
1768
1895
 
@@ -1777,19 +1904,19 @@ body.wf-dragging {
1777
1904
  padding: 0;
1778
1905
  border: none;
1779
1906
  background: transparent;
1780
- color: var(--wf-color-text-tertiary, #999);
1907
+ color: var(--wf-color-text-tertiary);
1781
1908
  cursor: pointer;
1782
1909
  border-radius: 4px;
1783
1910
  }
1784
1911
 
1785
1912
  .wf-alertgroup-close:hover {
1786
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1913
+ background: var(--wf-color-bg-hover);
1787
1914
  color: var(--wf-color-text);
1788
1915
  }
1789
1916
 
1790
1917
  /* weifuwu/components — Anchor(锚点导航) */
1791
1918
 
1792
- .wf-anchor-nav-nav {
1919
+ .wf-anchor-nav {
1793
1920
  display: flex;
1794
1921
  flex-direction: column;
1795
1922
  gap: 2px;
@@ -1797,7 +1924,7 @@ body.wf-dragging {
1797
1924
  font-size: var(--wf-font-size-sm);
1798
1925
  }
1799
1926
 
1800
- .wf-anchor-nav-nav-link {
1927
+ .wf-anchor-link {
1801
1928
  display: block;
1802
1929
  padding: var(--wf-space-xs) var(--wf-space-sm);
1803
1930
  border-left: 2px solid transparent;
@@ -1810,19 +1937,19 @@ body.wf-dragging {
1810
1937
  border-color var(--wf-dur-fast) var(--wf-ease-out);
1811
1938
  }
1812
1939
 
1813
- .wf-anchor-nav-nav-link:hover {
1940
+ .wf-anchor-link:hover {
1814
1941
  background: var(--wf-color-bg-secondary);
1815
1942
  color: var(--wf-color-text);
1816
1943
  }
1817
1944
 
1818
- .wf-anchor-nav-nav-link--active {
1945
+ .wf-anchor-link--active {
1819
1946
  color: var(--wf-color-primary-text);
1820
1947
  border-left-color: var(--wf-color-primary);
1821
1948
  font-weight: var(--wf-font-weight-semibold);
1822
1949
  background: var(--wf-color-primary-bg);
1823
1950
  }
1824
1951
 
1825
- .wf-anchor-nav-nav-link:focus-visible {
1952
+ .wf-anchor-link:focus-visible {
1826
1953
  outline: none;
1827
1954
  box-shadow: var(--wf-focus-ring);
1828
1955
  }
@@ -1895,20 +2022,37 @@ body.wf-dragging {
1895
2022
  border: var(--wf-border-width) solid var(--wf-color-border);
1896
2023
  border-radius: var(--wf-radius);
1897
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);
1898
2038
  }
1899
2039
 
1900
2040
  .wf-approval-status {
1901
2041
  margin-top: var(--wf-gap-xs);
1902
2042
  font-size: var(--wf-font-size-xs);
2043
+ font-weight: var(--wf-font-weight-medium);
1903
2044
  color: var(--wf-color-text-secondary);
1904
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); }
1905
2049
 
1906
2050
  /* weifuwu/components — AspectRatio */
1907
2051
 
1908
2052
  .wf-aspect-ratio {
1909
2053
  position: relative;
1910
2054
  width: 100%;
1911
- aspect-ratio: var(--wf-aspect-ratio, 16 / 9);
2055
+ aspect-ratio: var(--wf-aspect-ratio, 16 / 9);
1912
2056
  overflow: hidden;
1913
2057
  }
1914
2058
 
@@ -1934,15 +2078,15 @@ body.wf-dragging {
1934
2078
 
1935
2079
  .wf-autocomplete-dropdown {
1936
2080
  position: fixed;
1937
- z-index: var(--wf-z-popover, 120);
2081
+ z-index: var(--wf-z-popover);
1938
2082
  max-height: 280px;
1939
2083
  overflow-y: auto;
1940
- border-radius: var(--wf-surface-radius, 8px);
1941
- background: var(--wf-surface-bg, #fff);
1942
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
1943
- 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);
1944
2088
  font-family: var(--wf-font-sans);
1945
- font-size: var(--wf-font-size-sm, 13px);
2089
+ font-size: var(--wf-font-size-sm);
1946
2090
  }
1947
2091
 
1948
2092
  .wf-autocomplete-option {
@@ -1952,16 +2096,16 @@ body.wf-dragging {
1952
2096
  white-space: nowrap;
1953
2097
  overflow: hidden;
1954
2098
  text-overflow: ellipsis;
1955
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
2099
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
1956
2100
  }
1957
2101
 
1958
2102
  .wf-autocomplete-option:hover,
1959
2103
  .wf-autocomplete-option--active {
1960
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
2104
+ background: var(--wf-color-bg-hover);
1961
2105
  }
1962
2106
 
1963
2107
  .wf-autocomplete-option--active {
1964
- color: var(--wf-color-primary, #1668dc);
2108
+ color: var(--wf-color-primary-text);
1965
2109
  }
1966
2110
 
1967
2111
  /* weifuwu/components — Avatar */
@@ -2030,7 +2174,7 @@ body.wf-dragging {
2030
2174
  background: var(--wf-color-bg-secondary);
2031
2175
  color: var(--wf-color-text-secondary);
2032
2176
  cursor: pointer;
2033
- box-shadow: var(--wf-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.1));
2177
+ box-shadow: var(--wf-shadow-sm);
2034
2178
  transition: opacity var(--wf-dur-base) var(--wf-ease-out),
2035
2179
  transform var(--wf-dur-base) var(--wf-ease-out),
2036
2180
  background var(--wf-dur-fast) var(--wf-ease-out);
@@ -2058,7 +2202,7 @@ body.wf-dragging {
2058
2202
  display: inline-flex;
2059
2203
  align-items: center;
2060
2204
  padding: 2px var(--wf-space-sm);
2061
- border-radius: var(--wf-badge-radius, 10px);
2205
+ border-radius: var(--wf-badge-radius, 10px);
2062
2206
  font-family: var(--wf-font-sans);
2063
2207
  font-size: var(--wf-font-size-xs);
2064
2208
  font-weight: var(--wf-font-weight-medium);
@@ -2088,6 +2232,20 @@ body.wf-dragging {
2088
2232
  .wf-badge-dot--danger { background: var(--wf-color-error); }
2089
2233
  .wf-badge-dot--info { background: var(--wf-color-info); }
2090
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
+
2091
2249
  /* weifuwu/components — Breadcrumb */
2092
2250
 
2093
2251
  .wf-breadcrumb {
@@ -2136,10 +2294,10 @@ body.wf-dragging {
2136
2294
  font-weight: var(--wf-font-weight-medium);
2137
2295
  padding: var(--wf-btn-pad-y, var(--wf-control-pad-y)) var(--wf-btn-pad-x, var(--wf-space-md));
2138
2296
  min-height: var(--wf-control-height);
2139
- border-radius: var(--wf-btn-radius, var(--wf-radius));
2297
+ border-radius: var(--wf-btn-radius, var(--wf-radius));
2140
2298
  border: var(--wf-border-width) solid transparent;
2141
2299
  cursor: pointer;
2142
- 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);
2143
2301
  line-height: 1;
2144
2302
  white-space: nowrap;
2145
2303
  user-select: none;
@@ -2199,7 +2357,7 @@ body.wf-dragging {
2199
2357
  /* flex 容器中宽度稳定:grid 1fr 列在内容驱动宽度下会被事件 nowrap 撑宽/
2200
2358
  无事件塌缩——固定 min-width 防塌缩(定制 Token,默认 280px = 7 列 × 40px) */
2201
2359
  width: 100%;
2202
- min-width: var(--wf-calendar-min-width, 280px);
2360
+ min-width: var(--wf-calendar-min-width, 280px);
2203
2361
  }
2204
2362
 
2205
2363
  .wf-calendar-header {
@@ -2227,7 +2385,7 @@ body.wf-dragging {
2227
2385
  justify-content: center;
2228
2386
  border: none;
2229
2387
  background: none;
2230
- padding: 3px var(--wf-space-sm);
2388
+ padding: var(--wf-space-xs) var(--wf-space-sm);
2231
2389
  border-radius: var(--wf-radius-sm);
2232
2390
  font-size: var(--wf-font-size-xs);
2233
2391
  color: var(--wf-color-text-secondary);
@@ -2307,7 +2465,7 @@ body.wf-dragging {
2307
2465
  margin-top: 2px;
2308
2466
  font-size: var(--wf-font-size-xs);
2309
2467
  color: var(--wf-color-text);
2310
- background: var(--wf-color-primary-bg, var(--wf-color-primary-bg));
2468
+ background: var(--wf-color-primary-bg);
2311
2469
  color: var(--wf-color-primary-text);
2312
2470
  border-radius: var(--wf-radius-sm);
2313
2471
  padding: 1px 4px;
@@ -2333,13 +2491,13 @@ body.wf-dragging {
2333
2491
  /* weifuwu/components — Card */
2334
2492
 
2335
2493
  .wf-card {
2336
- border-radius: var(--wf-card-radius, var(--wf-surface-radius));
2494
+ border-radius: var(--wf-card-radius, var(--wf-surface-radius));
2337
2495
  background: var(--wf-surface-bg);
2338
2496
  font-family: var(--wf-font-sans);
2339
2497
  }
2340
2498
 
2341
2499
  .wf-card--default {
2342
- box-shadow: var(--wf-card-shadow, var(--wf-surface-shadow));
2500
+ box-shadow: var(--wf-card-shadow, var(--wf-surface-shadow));
2343
2501
  }
2344
2502
 
2345
2503
  .wf-card--outlined {
@@ -2405,7 +2563,7 @@ body.wf-dragging {
2405
2563
  background: var(--wf-color-bg-secondary);
2406
2564
  color: var(--wf-color-text-secondary);
2407
2565
  cursor: pointer;
2408
- box-shadow: var(--wf-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.1));
2566
+ box-shadow: var(--wf-shadow-sm);
2409
2567
  transition: background var(--wf-dur-fast) var(--wf-ease-out),
2410
2568
  color var(--wf-dur-fast) var(--wf-ease-out);
2411
2569
  }
@@ -2504,7 +2662,7 @@ body.wf-dragging {
2504
2662
  border-radius: var(--wf-radius);
2505
2663
  background: var(--wf-color-bg);
2506
2664
  color: var(--wf-color-text);
2507
- padding: 6px var(--wf-space);
2665
+ padding: var(--wf-space-sm) var(--wf-space);
2508
2666
  font-size: var(--wf-font-size-base);
2509
2667
  font-family: var(--wf-font-sans);
2510
2668
  cursor: pointer;
@@ -2575,7 +2733,7 @@ body.wf-dragging {
2575
2733
  background: var(--wf-color-bg);
2576
2734
  border: var(--wf-border-width) solid var(--wf-color-border);
2577
2735
  border-radius: var(--wf-radius);
2578
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
2736
+ box-shadow: var(--wf-shadow-lg);
2579
2737
  padding: var(--wf-space-xs);
2580
2738
  }
2581
2739
 
@@ -2583,7 +2741,7 @@ body.wf-dragging {
2583
2741
  display: flex;
2584
2742
  flex-direction: column;
2585
2743
  gap: 1px;
2586
- min-width: var(--wf-cascader-col-width, 120px);
2744
+ min-width: var(--wf-cascader-col-width, 120px);
2587
2745
  max-height: 240px;
2588
2746
  overflow-y: auto;
2589
2747
  }
@@ -2601,7 +2759,7 @@ body.wf-dragging {
2601
2759
  text-align: left;
2602
2760
  border: none;
2603
2761
  background: none;
2604
- padding: 6px var(--wf-space);
2762
+ padding: var(--wf-space-sm) var(--wf-space);
2605
2763
  border-radius: var(--wf-radius-sm);
2606
2764
  font-size: var(--wf-font-size-sm);
2607
2765
  color: var(--wf-color-text);
@@ -2637,6 +2795,42 @@ body.wf-dragging {
2637
2795
  color: var(--wf-color-text-tertiary);
2638
2796
  }
2639
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
+
2640
2834
  /* weifuwu/components — Chart */
2641
2835
 
2642
2836
  .wf-chart {
@@ -2733,7 +2927,7 @@ body.wf-dragging {
2733
2927
  align-items: center;
2734
2928
  justify-content: center;
2735
2929
  flex-shrink: 0;
2736
- 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);
2737
2931
  background: var(--wf-color-bg);
2738
2932
  }
2739
2933
 
@@ -2824,7 +3018,7 @@ body.wf-dragging {
2824
3018
  .wf-codeblock-lang {
2825
3019
  display: inline-flex;
2826
3020
  align-items: center;
2827
- gap: 6px;
3021
+ gap: var(--wf-space-sm);
2828
3022
  }
2829
3023
 
2830
3024
  .wf-codeblock-dot {
@@ -2970,20 +3164,31 @@ body.wf-dragging {
2970
3164
  font-family: var(--wf-font-sans);
2971
3165
  font-size: var(--wf-font-size-sm);
2972
3166
  color: var(--wf-color-text);
2973
- padding: 4px var(--wf-space-sm);
3167
+ padding: var(--wf-space-xs) var(--wf-space-sm);
2974
3168
  transition: border-color var(--wf-dur-fast) var(--wf-ease-out),
2975
- 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);
2976
3171
  }
2977
3172
 
2978
3173
  .wf-color-picker-trigger:hover {
2979
3174
  border-color: var(--wf-color-primary);
2980
3175
  }
2981
3176
 
3177
+ .wf-color-picker-trigger:active {
3178
+ transform: scale(0.98);
3179
+ }
3180
+
2982
3181
  .wf-color-picker-trigger:focus-visible {
2983
3182
  outline: none;
2984
3183
  box-shadow: var(--wf-focus-ring);
2985
3184
  }
2986
3185
 
3186
+ .wf-color-picker-trigger--disabled {
3187
+ opacity: var(--wf-opacity-disabled);
3188
+ cursor: not-allowed;
3189
+ pointer-events: none;
3190
+ }
3191
+
2987
3192
  .wf-color-picker-swatch {
2988
3193
  display: inline-block;
2989
3194
  width: 16px;
@@ -2998,8 +3203,8 @@ body.wf-dragging {
2998
3203
  font-size: var(--wf-font-size-xs);
2999
3204
  }
3000
3205
 
3001
- .wf-color-picker-trigger--sm { padding: 2px var(--wf-space-sm); font-size: var(--wf-font-size-xs); }
3002
- .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; }
3003
3208
 
3004
3209
  /* 弹层面板 */
3005
3210
  .wf-color-picker-panel {
@@ -3014,22 +3219,43 @@ body.wf-dragging {
3014
3219
  }
3015
3220
 
3016
3221
  .wf-color-picker-grid .wf-color-picker-swatch {
3222
+ position: relative;
3017
3223
  width: 22px;
3018
3224
  height: 22px;
3225
+ min-width: 22px;
3226
+ max-width: 22px;
3227
+ min-height: 22px;
3228
+ max-height: 22px;
3019
3229
  padding: 0;
3020
3230
  border: none;
3231
+ border-radius: var(--wf-radius-sm);
3021
3232
  cursor: pointer;
3022
3233
  box-shadow: 0 0 0 1px var(--wf-color-border);
3023
- 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);
3024
3236
  }
3025
3237
 
3026
3238
  .wf-color-picker-grid .wf-color-picker-swatch:hover {
3027
3239
  transform: scale(1.15);
3028
3240
  }
3029
3241
 
3242
+ .wf-color-picker-grid .wf-color-picker-swatch:active {
3243
+ transform: scale(0.92);
3244
+ }
3245
+
3030
3246
  .wf-color-picker-grid .wf-color-picker-swatch:focus-visible {
3031
3247
  outline: none;
3032
- 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;
3033
3259
  }
3034
3260
 
3035
3261
  .wf-color-picker-grid .wf-color-picker-swatch--sel {
@@ -3042,11 +3268,13 @@ body.wf-dragging {
3042
3268
  box-sizing: border-box;
3043
3269
  border: var(--wf-border-width) solid var(--wf-color-border);
3044
3270
  border-radius: var(--wf-radius-sm);
3045
- padding: 4px var(--wf-space-sm);
3271
+ padding: var(--wf-space-xs) var(--wf-space-sm);
3046
3272
  font-family: var(--wf-font-mono);
3047
3273
  font-size: var(--wf-font-size-xs);
3048
3274
  color: var(--wf-color-text);
3049
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);
3050
3278
  }
3051
3279
 
3052
3280
  .wf-color-picker-input:focus {
@@ -3073,7 +3301,7 @@ body.wf-dragging {
3073
3301
  background: var(--wf-color-bg);
3074
3302
  border: var(--wf-border-width) solid var(--wf-color-border);
3075
3303
  border-radius: var(--wf-radius);
3076
- box-shadow: var(--wf-shadow-lg, 0 16px 48px rgba(0, 0, 0, 0.2));
3304
+ box-shadow: var(--wf-shadow-lg);
3077
3305
  overflow: hidden;
3078
3306
  font-family: var(--wf-font-sans);
3079
3307
  animation: wf-command-in var(--wf-dur-base) var(--wf-ease-out);
@@ -3147,7 +3375,7 @@ body.wf-dragging {
3147
3375
  color: var(--wf-color-text-tertiary);
3148
3376
  background: var(--wf-color-bg-tertiary);
3149
3377
  border-radius: var(--wf-radius-sm);
3150
- padding: 1px 6px;
3378
+ padding: 1px var(--wf-space-sm);
3151
3379
  font-family: var(--wf-font-sans);
3152
3380
  }
3153
3381
 
@@ -3163,11 +3391,11 @@ body.wf-dragging {
3163
3391
  .wf-context-menu {
3164
3392
  position: fixed;
3165
3393
  z-index: var(--wf-z-popover);
3166
- min-width: var(--wf-context-menu-min-width, 160px);
3394
+ min-width: var(--wf-context-menu-min-width, 160px);
3167
3395
  background: var(--wf-color-bg);
3168
3396
  border: var(--wf-border-width) solid var(--wf-color-border);
3169
3397
  border-radius: var(--wf-radius);
3170
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
3398
+ box-shadow: var(--wf-shadow-lg);
3171
3399
  padding: var(--wf-space-xs);
3172
3400
  font-family: var(--wf-font-sans);
3173
3401
  display: flex;
@@ -3183,7 +3411,7 @@ body.wf-dragging {
3183
3411
  text-align: left;
3184
3412
  border: none;
3185
3413
  background: none;
3186
- padding: 6px var(--wf-space);
3414
+ padding: var(--wf-space-sm) var(--wf-space);
3187
3415
  border-radius: var(--wf-radius-sm);
3188
3416
  font-size: var(--wf-font-size-sm);
3189
3417
  color: var(--wf-color-text);
@@ -3250,8 +3478,8 @@ body.wf-dragging {
3250
3478
  }
3251
3479
 
3252
3480
  /* variants */
3253
- .wf-copy-btn--ghost { background: none; padding: 4px var(--wf-space-sm); }
3254
- .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); }
3255
3483
  .wf-copy-btn--default {
3256
3484
  background: var(--wf-color-bg);
3257
3485
  border: var(--wf-border-width) solid var(--wf-color-border);
@@ -3259,8 +3487,8 @@ body.wf-dragging {
3259
3487
  }
3260
3488
 
3261
3489
  /* sizes */
3262
- .wf-copy-btn--sm { font-size: var(--wf-font-size-xs); padding: 2px var(--wf-space-xs); }
3263
- .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); }
3264
3492
 
3265
3493
  /* weifuwu/components — DatePicker */
3266
3494
 
@@ -3312,7 +3540,7 @@ body.wf-dragging {
3312
3540
  border-radius: var(--wf-radius-md);
3313
3541
  box-shadow: var(--wf-shadow-md);
3314
3542
  padding: var(--wf-space);
3315
- min-width: var(--wf-datepicker-width, 260px);
3543
+ min-width: var(--wf-datepicker-width, 260px);
3316
3544
  user-select: none;
3317
3545
  /* 面板族统一入场:wf-panel-in(scale+fade,Token 驱动) */
3318
3546
  animation: wf-panel-in var(--wf-dur-fast) var(--wf-ease-out);
@@ -3431,7 +3659,7 @@ body.wf-dragging {
3431
3659
  }
3432
3660
 
3433
3661
  .wf-datepicker-range-panel {
3434
- min-width: var(--wf-datepicker-time-width, 240px);
3662
+ min-width: var(--wf-datepicker-time-width, 240px);
3435
3663
  }
3436
3664
 
3437
3665
  /* ── 时间选择 ── */
@@ -3444,7 +3672,7 @@ body.wf-dragging {
3444
3672
  border-radius: var(--wf-radius-md);
3445
3673
  box-shadow: var(--wf-shadow-md);
3446
3674
  padding: var(--wf-space);
3447
- min-width: var(--wf-datepicker-range-width, 200px);
3675
+ min-width: var(--wf-datepicker-range-width, 200px);
3448
3676
  user-select: none;
3449
3677
  animation: wf-panel-in var(--wf-dur-fast) var(--wf-ease-out);
3450
3678
  transform-origin: top center;
@@ -3638,7 +3866,7 @@ body.wf-dragging {
3638
3866
  border-radius: var(--wf-radius-md);
3639
3867
  overflow: hidden;
3640
3868
  background: var(--wf-color-bg);
3641
- font-family: var(--wf-font-mono, 'SFMono-Regular', Consolas, monospace);
3869
+ font-family: var(--wf-font-mono);
3642
3870
  font-size: 13px;
3643
3871
  line-height: 1.6;
3644
3872
  min-width: 0;
@@ -3690,13 +3918,13 @@ body.wf-dragging {
3690
3918
  }
3691
3919
 
3692
3920
  .wf-diffview-row--add {
3693
- background: var(--wf-color-success-bg, rgba(0, 128, 0, 0.08));
3921
+ background: var(--wf-color-success-bg);
3694
3922
  }
3695
3923
  .wf-diffview-row--add .wf-diffview-sign {
3696
3924
  color: var(--wf-color-success-text);
3697
3925
  }
3698
3926
  .wf-diffview-row--remove {
3699
- background: var(--wf-color-error-bg, rgba(255, 0, 0, 0.06));
3927
+ background: var(--wf-color-error-bg);
3700
3928
  }
3701
3929
  .wf-diffview-row--remove .wf-diffview-sign {
3702
3930
  color: var(--wf-color-error-text);
@@ -3714,7 +3942,7 @@ body.wf-dragging {
3714
3942
  color: var(--wf-color-text-secondary);
3715
3943
  font-size: 12px;
3716
3944
  cursor: pointer;
3717
- background: var(--wf-color-bg-subtle, var(--wf-color-fill));
3945
+ background: var(--wf-color-bg-subtle);
3718
3946
  user-select: none;
3719
3947
  min-height: 28px;
3720
3948
  }
@@ -3792,6 +4020,8 @@ body.wf-dragging {
3792
4020
  position: absolute;
3793
4021
  inset: 0;
3794
4022
  background: var(--wf-overlay);
4023
+ backdrop-filter: blur(var(--wf-overlay-blur));
4024
+ -webkit-backdrop-filter: blur(var(--wf-overlay-blur));
3795
4025
  }
3796
4026
 
3797
4027
  .wf-drawer--enter .wf-drawer-overlay {
@@ -3816,11 +4046,11 @@ body.wf-dragging {
3816
4046
  position: relative;
3817
4047
  display: flex;
3818
4048
  flex-direction: column;
3819
- width: var(--wf-drawer-width, 360px);
4049
+ width: var(--wf-drawer-width, 360px);
3820
4050
  max-width: 100vw;
3821
4051
  height: 100%;
3822
4052
  background: var(--wf-color-bg);
3823
- box-shadow: var(--wf-shadow-lg, 0 4px 24px rgba(0, 0, 0, 0.12));
4053
+ box-shadow: var(--wf-shadow-lg);
3824
4054
  }
3825
4055
 
3826
4056
  .wf-drawer--enter .wf-drawer-panel {
@@ -3872,7 +4102,7 @@ body.wf-dragging {
3872
4102
  align-items: center;
3873
4103
  justify-content: space-between;
3874
4104
  padding: var(--wf-space-md);
3875
- border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border);
4105
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
3876
4106
  font-family: var(--wf-font-sans);
3877
4107
  font-size: var(--wf-font-size-lg);
3878
4108
  font-weight: var(--wf-font-weight-semibold);
@@ -3909,7 +4139,7 @@ body.wf-dragging {
3909
4139
  justify-content: flex-end;
3910
4140
  gap: var(--wf-gap-sm);
3911
4141
  padding: var(--wf-space-md);
3912
- border-top: var(--wf-border-width, 1px) solid var(--wf-color-border);
4142
+ border-top: var(--wf-border-width) solid var(--wf-color-border);
3913
4143
  }
3914
4144
 
3915
4145
  /* 移动端适配(P2):小屏抽屉全宽(底部安全区) */
@@ -3928,7 +4158,7 @@ body.wf-dragging {
3928
4158
 
3929
4159
  .wf-dropdown-menu {
3930
4160
  position: fixed;
3931
- min-width: var(--wf-dropdown-min-width, 140px);
4161
+ min-width: var(--wf-dropdown-min-width, 140px);
3932
4162
  background: var(--wf-color-bg);
3933
4163
  border: var(--wf-border-width) solid var(--wf-color-border);
3934
4164
  border-radius: var(--wf-radius);
@@ -4001,7 +4231,7 @@ body.wf-dragging {
4001
4231
  .wf-editor--disabled {
4002
4232
  opacity: var(--wf-opacity-disabled);
4003
4233
  cursor: not-allowed;
4004
- background: var(--wf-color-bg-secondary, #f9fafb);
4234
+ background: var(--wf-color-bg-secondary);
4005
4235
  }
4006
4236
 
4007
4237
  /* ── 工具栏 ────────────────────────────────────────── */
@@ -4012,7 +4242,7 @@ body.wf-dragging {
4012
4242
  gap: 2px;
4013
4243
  padding: var(--wf-space-xs) var(--wf-space-sm);
4014
4244
  border-bottom: var(--wf-border-width) solid var(--wf-color-border);
4015
- background: var(--wf-color-bg-secondary, #f9fafb);
4245
+ background: var(--wf-color-bg-secondary);
4016
4246
  flex-wrap: wrap;
4017
4247
  user-select: none;
4018
4248
  }
@@ -4025,17 +4255,17 @@ body.wf-dragging {
4025
4255
  height: 32px;
4026
4256
  padding: 0 var(--wf-space-xs);
4027
4257
  border: none;
4028
- border-radius: var(--wf-radius-sm, 4px);
4258
+ border-radius: var(--wf-radius-sm);
4029
4259
  background: transparent;
4030
4260
  color: var(--wf-color-text);
4031
4261
  font-size: var(--wf-font-size-sm);
4032
- font-weight: var(--wf-font-weight-semibold, 600);
4262
+ font-weight: var(--wf-font-weight-semibold);
4033
4263
  cursor: pointer;
4034
4264
  transition: background 0.15s;
4035
4265
  }
4036
4266
 
4037
4267
  .wf-editor-tb-btn:hover {
4038
- background: var(--wf-color-bg-tertiary, #e5e7eb);
4268
+ background: var(--wf-color-bg-tertiary);
4039
4269
  }
4040
4270
 
4041
4271
  .wf-editor-tb-btn--active {
@@ -4044,7 +4274,7 @@ body.wf-dragging {
4044
4274
  }
4045
4275
 
4046
4276
  .wf-editor-tb-btn--active:hover {
4047
- background: var(--wf-color-primary-bg, #bae6fd);
4277
+ background: var(--wf-color-primary-bg);
4048
4278
  }
4049
4279
 
4050
4280
  .wf-editor-tb-btn--link {
@@ -4084,22 +4314,22 @@ body.wf-dragging {
4084
4314
 
4085
4315
  /* 编辑区内部元素样式 */
4086
4316
  .wf-editor-content h1 {
4087
- font-size: var(--wf-font-size-2xl, 1.5rem);
4088
- font-weight: var(--wf-font-weight-bold, 700);
4317
+ font-size: var(--wf-font-size-2xl);
4318
+ font-weight: var(--wf-font-weight-bold);
4089
4319
  margin: 0.5em 0 0.25em;
4090
4320
  line-height: 1.3;
4091
4321
  }
4092
4322
 
4093
4323
  .wf-editor-content h2 {
4094
- font-size: var(--wf-font-size-xl, 1.25rem);
4095
- font-weight: var(--wf-font-weight-bold, 700);
4324
+ font-size: var(--wf-font-size-xl);
4325
+ font-weight: var(--wf-font-weight-bold);
4096
4326
  margin: 0.5em 0 0.25em;
4097
4327
  line-height: 1.3;
4098
4328
  }
4099
4329
 
4100
4330
  .wf-editor-content h3 {
4101
- font-size: var(--wf-font-size-lg, 1.125rem);
4102
- font-weight: var(--wf-font-weight-semibold, 600);
4331
+ font-size: var(--wf-font-size-lg);
4332
+ font-weight: var(--wf-font-weight-semibold);
4103
4333
  margin: 0.4em 0 0.2em;
4104
4334
  line-height: 1.3;
4105
4335
  }
@@ -4123,7 +4353,7 @@ body.wf-dragging {
4123
4353
  margin: 0.5em 0;
4124
4354
  padding: var(--wf-space-xs) var(--wf-space);
4125
4355
  border-left: 3px solid var(--wf-color-primary);
4126
- background: var(--wf-color-bg-secondary, #f9fafb);
4356
+ background: var(--wf-color-bg-secondary);
4127
4357
  color: var(--wf-color-text-secondary);
4128
4358
  font-style: italic;
4129
4359
  }
@@ -4151,11 +4381,11 @@ body.wf-dragging {
4151
4381
  padding: var(--wf-control-pad-y) var(--wf-space);
4152
4382
  border: none;
4153
4383
  outline: none;
4154
- font-family: var(--wf-font-mono, 'SF Mono', 'Fira Code', 'Consolas', monospace);
4384
+ font-family: var(--wf-font-mono);
4155
4385
  font-size: var(--wf-font-size-sm);
4156
4386
  line-height: 1.6;
4157
4387
  color: var(--wf-color-text);
4158
- background: var(--wf-color-bg-secondary, #f9fafb);
4388
+ background: var(--wf-color-bg-secondary);
4159
4389
  resize: vertical;
4160
4390
  tab-size: 2;
4161
4391
  }
@@ -4192,7 +4422,7 @@ body.wf-dragging {
4192
4422
  flex-direction: column;
4193
4423
  align-items: center;
4194
4424
  justify-content: center;
4195
- gap: 6px;
4425
+ gap: var(--wf-space-xs);
4196
4426
  padding: var(--wf-space-lg) var(--wf-space);
4197
4427
  cursor: pointer;
4198
4428
  text-align: center;
@@ -4219,7 +4449,7 @@ body.wf-dragging {
4219
4449
  .wf-editor-content img {
4220
4450
  max-width: 100%;
4221
4451
  height: auto;
4222
- border-radius: var(--wf-radius-sm, 4px);
4452
+ border-radius: var(--wf-radius-sm);
4223
4453
  margin: 0.5em 0;
4224
4454
  }
4225
4455
 
@@ -4241,7 +4471,7 @@ body.wf-dragging {
4241
4471
  }
4242
4472
 
4243
4473
  .wf-editor-table tbody tr:nth-child(even) {
4244
- background: var(--wf-color-bg-secondary, #f9fafb);
4474
+ background: var(--wf-color-bg-secondary);
4245
4475
  }
4246
4476
 
4247
4477
  /* ── 表格选择网格 ──────────────────────────────────── */
@@ -4253,7 +4483,7 @@ body.wf-dragging {
4253
4483
  border: var(--wf-border-width) solid var(--wf-color-border);
4254
4484
  border-radius: var(--wf-radius);
4255
4485
  padding: var(--wf-space-sm);
4256
- box-shadow: var(--wf-shadow-lg, 0 4px 12px rgba(0,0,0,0.12));
4486
+ box-shadow: var(--wf-shadow-lg);
4257
4487
  /* 定位在工具栏下方 */
4258
4488
  }
4259
4489
 
@@ -4280,7 +4510,7 @@ body.wf-dragging {
4280
4510
 
4281
4511
  .wf-editor-table-grid-cell:hover,
4282
4512
  .wf-editor-table-grid-cell--active {
4283
- background: var(--wf-color-primary-bg, #e0f2fe);
4513
+ background: var(--wf-color-primary-bg);
4284
4514
  border-color: var(--wf-color-primary);
4285
4515
  }
4286
4516
 
@@ -4402,7 +4632,7 @@ body.wf-dragging {
4402
4632
  border-radius: var(--wf-radius);
4403
4633
  background: var(--wf-color-bg-secondary);
4404
4634
  cursor: pointer;
4405
- 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);
4406
4636
  min-height: 120px;
4407
4637
  }
4408
4638
 
@@ -4527,7 +4757,7 @@ body.wf-dragging {
4527
4757
  border-radius: var(--wf-radius-sm);
4528
4758
  color: var(--wf-color-text-tertiary);
4529
4759
  cursor: pointer;
4530
- line-height: 0; padding: 0; flex-shrink: 0;
4760
+ padding: 0; flex-shrink: 0;
4531
4761
  }
4532
4762
 
4533
4763
  .wf-upload-item-remove:hover {
@@ -4556,7 +4786,7 @@ body.wf-dragging {
4556
4786
  display: flex;
4557
4787
  align-items: center;
4558
4788
  justify-content: center;
4559
- gap: 6px;
4789
+ gap: var(--wf-space-xs);
4560
4790
  width: 44px;
4561
4791
  height: 44px;
4562
4792
  min-width: 44px;
@@ -4565,23 +4795,23 @@ body.wf-dragging {
4565
4795
  border: none;
4566
4796
  border-radius: 50%;
4567
4797
  background: var(--wf-color-primary);
4568
- color: var(--wf-color-on-brand, #fff);
4569
- 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);
4570
4800
  cursor: pointer;
4571
- z-index: var(--wf-z-sticky, 40);
4801
+ z-index: var(--wf-z-sticky);
4572
4802
  font-family: var(--wf-font-sans);
4573
4803
  font-size: 16px;
4574
- transition: transform var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease),
4575
- 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);
4576
4806
  }
4577
4807
 
4578
4808
  .wf-float-btn:hover {
4579
4809
  transform: scale(1.05);
4580
- background: var(--wf-color-primary, #1668dc);
4810
+ background: var(--wf-color-primary);
4581
4811
  }
4582
4812
 
4583
4813
  .wf-float-btn--disabled {
4584
- background: var(--wf-color-text-disabled, #bfbfbf);
4814
+ background: var(--wf-color-text-disabled);
4585
4815
  cursor: not-allowed;
4586
4816
  opacity: 0.7;
4587
4817
  }
@@ -4597,10 +4827,10 @@ body.wf-dragging {
4597
4827
  right: -4px;
4598
4828
  min-width: 18px;
4599
4829
  height: 18px;
4600
- padding: 0 5px;
4830
+ padding: 0 var(--wf-space-xs);
4601
4831
  border-radius: 50%;
4602
4832
  background: var(--wf-color-error);
4603
- color: var(--wf-color-on-brand, #fff);
4833
+ color: var(--wf-color-on-brand);
4604
4834
  font-size: 11px;
4605
4835
  line-height: 18px;
4606
4836
  text-align: center;
@@ -4609,7 +4839,7 @@ body.wf-dragging {
4609
4839
  /* ── 组模式 ── */
4610
4840
  .wf-float-group {
4611
4841
  position: fixed;
4612
- z-index: var(--wf-z-sticky, 40);
4842
+ z-index: var(--wf-z-sticky);
4613
4843
  display: flex;
4614
4844
  flex-direction: column;
4615
4845
  align-items: center;
@@ -4624,11 +4854,11 @@ body.wf-dragging {
4624
4854
  .wf-float-group-items {
4625
4855
  display: flex;
4626
4856
  flex-direction: column;
4627
- gap: 10px;
4857
+ gap: var(--wf-space-sm);
4628
4858
  }
4629
4859
 
4630
4860
  .wf-float-group-item {
4631
- 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);
4632
4862
  }
4633
4863
 
4634
4864
  @keyframes wf-float-item-in {
@@ -4648,16 +4878,16 @@ body.wf-dragging {
4648
4878
  border: none;
4649
4879
  border-radius: 50%;
4650
4880
  background: var(--wf-color-primary);
4651
- color: var(--wf-color-on-brand, #fff);
4652
- 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);
4653
4883
  cursor: pointer;
4654
- font-size: var(--wf-font-size-xl, 20px);
4884
+ font-size: var(--wf-font-size-xl);
4655
4885
  font-family: var(--wf-font-sans);
4656
4886
  }
4657
4887
 
4658
4888
  .wf-float-group-icon {
4659
4889
  display: inline-block;
4660
- transition: transform var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
4890
+ transition: transform var(--wf-dur-md) var(--wf-ease-standard);
4661
4891
  }
4662
4892
 
4663
4893
  .wf-float-group-icon.is-open {
@@ -4667,7 +4897,7 @@ body.wf-dragging {
4667
4897
  /* 组内子项:不 fixed(由 group 容器排列) */
4668
4898
  .wf-float-btn--static {
4669
4899
  position: static;
4670
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4900
+ box-shadow: var(--wf-shadow-md);
4671
4901
  }
4672
4902
 
4673
4903
  /* weifuwu/components — Form */
@@ -4720,7 +4950,7 @@ body.wf-dragging {
4720
4950
  background: var(--wf-color-bg);
4721
4951
  border: var(--wf-border-width) solid var(--wf-color-border);
4722
4952
  border-radius: var(--wf-radius);
4723
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
4953
+ box-shadow: var(--wf-shadow-lg);
4724
4954
  padding: var(--wf-space-md);
4725
4955
  font-family: var(--wf-font-sans);
4726
4956
  font-size: var(--wf-font-size-sm);
@@ -4815,11 +5045,11 @@ body.wf-dragging {
4815
5045
  align-items: center;
4816
5046
  justify-content: center;
4817
5047
  min-height: 100px;
4818
- background: var(--wf-color-bg-secondary, #f9fafb);
4819
- border-radius: var(--wf-radius-md, 8px);
4820
- border: 1px dashed var(--wf-color-border, #e5e7eb);
4821
- color: var(--wf-color-text-tertiary, #9ca3af);
4822
- 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);
4823
5053
  }
4824
5054
 
4825
5055
  .wf-inview-placeholder::after {
@@ -4855,17 +5085,23 @@ body.wf-dragging {
4855
5085
  .wf-input {
4856
5086
  font-family: var(--wf-font-sans);
4857
5087
  font-size: var(--wf-font-size-sm);
4858
- min-height: var(--wf-field-height, var(--wf-control-height));
5088
+ min-height: var(--wf-field-height);
4859
5089
  padding: var(--wf-control-pad-y) var(--wf-space);
4860
5090
  border: var(--wf-border-width) solid var(--wf-color-border);
4861
- border-radius: var(--wf-field-radius, var(--wf-radius));
5091
+ border-radius: var(--wf-field-radius);
4862
5092
  background: var(--wf-color-bg);
4863
5093
  color: var(--wf-color-text);
4864
5094
  outline: none;
4865
- 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);
4866
5098
  width: 100%;
4867
5099
  }
4868
5100
 
5101
+ .wf-input:hover:not(:disabled) {
5102
+ border-color: var(--wf-color-border-dark);
5103
+ }
5104
+
4869
5105
  .wf-input:focus {
4870
5106
  border-color: var(--wf-color-primary);
4871
5107
  box-shadow: var(--wf-focus-ring);
@@ -4953,7 +5189,7 @@ body.wf-dragging {
4953
5189
  cursor: pointer;
4954
5190
  padding: 0;
4955
5191
  line-height: 1;
4956
- 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);
4957
5193
  }
4958
5194
 
4959
5195
  .wf-input-number-step:hover {
@@ -4999,7 +5235,7 @@ body.wf-dragging {
4999
5235
  box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
5000
5236
  }
5001
5237
 
5002
- .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); }
5003
5239
  .wf-inputnumber--disabled { opacity: 0.6; }
5004
5240
 
5005
5241
  .wf-inputnumber-input {
@@ -5030,7 +5266,7 @@ body.wf-dragging {
5030
5266
  border: none;
5031
5267
  cursor: pointer;
5032
5268
  color: var(--wf-color-text-secondary);
5033
- padding: 2px 6px;
5269
+ padding: 2px var(--wf-space-sm);
5034
5270
  min-height: 18px;
5035
5271
  }
5036
5272
  .wf-inputnumber-btn:hover { background: var(--wf-color-bg-secondary); color: var(--wf-color-text); }
@@ -5108,7 +5344,7 @@ body.wf-dragging {
5108
5344
  background: none;
5109
5345
  color: var(--wf-color-text-tertiary);
5110
5346
  cursor: pointer;
5111
- line-height: 0; padding: 0; flex-shrink: 0;
5347
+ padding: 0; flex-shrink: 0;
5112
5348
  }
5113
5349
 
5114
5350
  .wf-json-toggle:hover {
@@ -5142,7 +5378,7 @@ body.wf-dragging {
5142
5378
  background: none;
5143
5379
  color: var(--wf-color-text-tertiary);
5144
5380
  cursor: pointer;
5145
- line-height: 0; padding: 0; flex-shrink: 0;
5381
+ padding: 0; flex-shrink: 0;
5146
5382
  opacity: 0;
5147
5383
  }
5148
5384
 
@@ -5207,7 +5443,7 @@ body.wf-dragging {
5207
5443
  flex: 1 1 220px;
5208
5444
  min-width: var(--wf-kanban-col-min-width);
5209
5445
  max-width: var(--wf-kanban-col-max-width);
5210
- background: var(--wf-color-bg-subtle, var(--wf-color-fill));
5446
+ background: var(--wf-color-bg-subtle);
5211
5447
  border-radius: var(--wf-radius-md);
5212
5448
  border: 1px solid var(--wf-color-border);
5213
5449
  display: flex;
@@ -5223,7 +5459,7 @@ body.wf-dragging {
5223
5459
  display: flex;
5224
5460
  align-items: center;
5225
5461
  justify-content: space-between;
5226
- padding: 10px 12px;
5462
+ padding: var(--wf-space-sm) 12px;
5227
5463
  font-weight: 600;
5228
5464
  font-size: 13px;
5229
5465
  }
@@ -5247,7 +5483,7 @@ body.wf-dragging {
5247
5483
  background: var(--wf-color-bg);
5248
5484
  border: 1px solid var(--wf-color-border);
5249
5485
  border-radius: var(--wf-radius-sm);
5250
- padding: 10px 12px;
5486
+ padding: var(--wf-space-sm) 12px;
5251
5487
  cursor: grab;
5252
5488
  display: flex;
5253
5489
  align-items: center;
@@ -5276,9 +5512,9 @@ body.wf-dragging {
5276
5512
  .wf-kanban-tag {
5277
5513
  font-size: 11px;
5278
5514
  color: var(--wf-color-primary-text);
5279
- background: var(--wf-color-primary-bg, rgba(79, 110, 247, 0.12));
5515
+ background: var(--wf-color-primary-bg);
5280
5516
  border-radius: var(--wf-radius-xs);
5281
- padding: 1px 6px;
5517
+ padding: 1px var(--wf-space-sm);
5282
5518
  flex-shrink: 0;
5283
5519
  }
5284
5520
 
@@ -5307,7 +5543,7 @@ body.wf-dragging {
5307
5543
  display: flex;
5308
5544
  width: 100%;
5309
5545
  min-height: 100%;
5310
- background: var(--wf-color-bg, #f5f5f5);
5546
+ background: var(--wf-color-bg);
5311
5547
  color: var(--wf-color-text);
5312
5548
  font-family: var(--wf-font-sans);
5313
5549
  }
@@ -5327,13 +5563,13 @@ body.wf-dragging {
5327
5563
  flex-shrink: 0;
5328
5564
  height: 100vh;
5329
5565
  overflow: hidden;
5330
- background: var(--wf-color-bg-secondary, #fff);
5331
- border-right: var(--wf-border-width, 1px) solid var(--wf-color-border);
5332
- 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);
5333
5569
  }
5334
5570
 
5335
5571
  .wf-layout-sider--collapsed {
5336
- 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);
5337
5573
  }
5338
5574
 
5339
5575
  .wf-layout-sider-body {
@@ -5351,21 +5587,21 @@ body.wf-dragging {
5351
5587
  height: 40px;
5352
5588
  flex-shrink: 0;
5353
5589
  border: none;
5354
- 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);
5355
5591
  background: transparent;
5356
5592
  color: var(--wf-color-text-secondary);
5357
5593
  cursor: pointer;
5358
5594
  font-size: 12px;
5359
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5595
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
5360
5596
  }
5361
5597
 
5362
5598
  .wf-layout-sider-trigger:hover {
5363
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
5599
+ background: var(--wf-color-bg-hover);
5364
5600
  }
5365
5601
 
5366
5602
  .wf-layout-sider-trigger-icon {
5367
5603
  display: inline-block;
5368
- transition: transform var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5604
+ transition: transform var(--wf-dur-fast) var(--wf-ease-standard);
5369
5605
  }
5370
5606
 
5371
5607
  .wf-layout-sider-trigger-icon.is-collapsed {
@@ -5376,12 +5612,12 @@ body.wf-dragging {
5376
5612
  .wf-layout-header {
5377
5613
  display: flex;
5378
5614
  align-items: center;
5379
- gap: var(--wf-gap-md, 16px);
5380
- height: var(--wf-layout-header-height, 56px);
5381
- 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);
5382
5618
  flex-shrink: 0;
5383
- background: var(--wf-color-bg-secondary, #fff);
5384
- 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);
5385
5621
  }
5386
5622
 
5387
5623
  /* ── 主内容区 ── */
@@ -5389,18 +5625,18 @@ body.wf-dragging {
5389
5625
  flex: 1;
5390
5626
  min-height: 0;
5391
5627
  overflow: auto;
5392
- padding: var(--wf-space-md, 16px);
5628
+ padding: var(--wf-space-md);
5393
5629
  }
5394
5630
 
5395
5631
  /* ── 底部栏 ── */
5396
5632
  .wf-layout-footer {
5397
- padding: var(--wf-space-md, 16px);
5633
+ padding: var(--wf-space-md);
5398
5634
  flex-shrink: 0;
5399
5635
  text-align: center;
5400
5636
  color: var(--wf-color-text-secondary);
5401
- font-size: var(--wf-font-size-sm, 13px);
5402
- background: var(--wf-color-bg-secondary, #fff);
5403
- 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);
5404
5640
  }
5405
5641
 
5406
5642
  /* weifuwu/components — Link 文字链接 */
@@ -5411,15 +5647,15 @@ body.wf-dragging {
5411
5647
  gap: 4px;
5412
5648
  text-decoration: underline;
5413
5649
  text-underline-offset: 3px;
5414
- color: var(--wf-color-primary, #1668dc);
5650
+ color: var(--wf-color-primary-text);
5415
5651
  cursor: pointer;
5416
5652
  font-family: var(--wf-font-sans);
5417
- font-size: var(--wf-font-size-sm, 13px);
5418
- 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);
5419
5655
  }
5420
5656
 
5421
5657
  .wf-link:hover {
5422
- color: var(--wf-color-primary, #1668dc);
5658
+ color: var(--wf-color-primary-text);
5423
5659
  }
5424
5660
 
5425
5661
  .wf-link--default {
@@ -5430,14 +5666,14 @@ body.wf-dragging {
5430
5666
  }
5431
5667
 
5432
5668
  .wf-link--danger {
5433
- color: var(--wf-color-error-text, #cf1322);
5669
+ color: var(--wf-color-error-text);
5434
5670
  }
5435
5671
  .wf-link--danger:hover {
5436
- color: var(--wf-color-error-text, #a8071a);
5672
+ color: var(--wf-color-error-text);
5437
5673
  }
5438
5674
 
5439
5675
  .wf-link--muted {
5440
- color: var(--wf-color-text-tertiary, #999);
5676
+ color: var(--wf-color-text-tertiary);
5441
5677
  text-decoration: none;
5442
5678
  }
5443
5679
  .wf-link--muted:hover {
@@ -5449,7 +5685,7 @@ body.wf-dragging {
5449
5685
  }
5450
5686
 
5451
5687
  .wf-link--disabled {
5452
- color: var(--wf-color-text-disabled, #bfbfbf);
5688
+ color: var(--wf-color-text-disabled);
5453
5689
  cursor: not-allowed;
5454
5690
  text-decoration: none;
5455
5691
  pointer-events: none;
@@ -5560,7 +5796,7 @@ body.wf-dragging {
5560
5796
  border-radius: var(--wf-radius-sm);
5561
5797
  color: var(--wf-color-text-secondary);
5562
5798
  cursor: pointer;
5563
- line-height: 0; padding: 0; flex-shrink: 0;
5799
+ padding: 0; flex-shrink: 0;
5564
5800
  }
5565
5801
 
5566
5802
  .wf-log-copy:hover {
@@ -5686,6 +5922,54 @@ body.wf-dragging {
5686
5922
  margin: var(--wf-space-md) 0;
5687
5923
  }
5688
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
+
5689
5973
  /* weifuwu/components — Mentions */
5690
5974
 
5691
5975
  .wf-mentions {
@@ -5700,7 +5984,7 @@ body.wf-dragging {
5700
5984
  border-radius: var(--wf-radius);
5701
5985
  background: var(--wf-color-bg);
5702
5986
  color: var(--wf-color-text);
5703
- padding: 6px var(--wf-space);
5987
+ padding: var(--wf-space-sm) var(--wf-space);
5704
5988
  font-family: var(--wf-font-sans);
5705
5989
  font-size: var(--wf-font-size-base);
5706
5990
  line-height: 1.5;
@@ -5720,19 +6004,19 @@ body.wf-dragging {
5720
6004
  cursor: not-allowed;
5721
6005
  }
5722
6006
 
5723
- .wf-mentions-input--sm { font-size: var(--wf-font-size-sm); padding: 4px var(--wf-space-sm); }
5724
- .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); }
5725
6009
 
5726
6010
  .wf-mentions-panel {
5727
6011
  position: fixed;
5728
6012
  z-index: var(--wf-z-popover);
5729
- min-width: var(--wf-mentions-min-width, 160px);
6013
+ min-width: var(--wf-mentions-min-width, 160px);
5730
6014
  max-height: 220px;
5731
6015
  overflow-y: auto;
5732
6016
  background: var(--wf-color-bg);
5733
6017
  border: var(--wf-border-width) solid var(--wf-color-border);
5734
6018
  border-radius: var(--wf-radius);
5735
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
6019
+ box-shadow: var(--wf-shadow-lg);
5736
6020
  padding: var(--wf-space-xs);
5737
6021
  display: flex;
5738
6022
  flex-direction: column;
@@ -5745,7 +6029,7 @@ body.wf-dragging {
5745
6029
  text-align: left;
5746
6030
  border: none;
5747
6031
  background: none;
5748
- padding: 6px var(--wf-space);
6032
+ padding: var(--wf-space-sm) var(--wf-space);
5749
6033
  border-radius: var(--wf-radius-sm);
5750
6034
  font-size: var(--wf-font-size-sm);
5751
6035
  color: var(--wf-color-text);
@@ -5916,6 +6200,32 @@ body.wf-dragging {
5916
6200
  outline-offset: -2px;
5917
6201
  }
5918
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
+
5919
6229
  /* weifuwu/components — Menubar */
5920
6230
 
5921
6231
  .wf-menubar {
@@ -5960,11 +6270,11 @@ body.wf-dragging {
5960
6270
  .wf-menubar-panel {
5961
6271
  position: fixed;
5962
6272
  z-index: var(--wf-z-popover);
5963
- min-width: var(--wf-menubar-min-width, 160px);
6273
+ min-width: var(--wf-menubar-min-width, 160px);
5964
6274
  background: var(--wf-color-bg);
5965
6275
  border: var(--wf-border-width) solid var(--wf-color-border);
5966
6276
  border-radius: var(--wf-radius);
5967
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
6277
+ box-shadow: var(--wf-shadow-lg);
5968
6278
  padding: var(--wf-space-xs);
5969
6279
  display: flex;
5970
6280
  flex-direction: column;
@@ -5980,7 +6290,7 @@ body.wf-dragging {
5980
6290
  text-align: left;
5981
6291
  border: none;
5982
6292
  background: none;
5983
- padding: 6px var(--wf-space);
6293
+ padding: var(--wf-space-sm) var(--wf-space);
5984
6294
  border-radius: var(--wf-radius-sm);
5985
6295
  font-size: var(--wf-font-size-sm);
5986
6296
  color: var(--wf-color-text);
@@ -6012,7 +6322,7 @@ body.wf-dragging {
6012
6322
  color: var(--wf-color-text-tertiary);
6013
6323
  background: var(--wf-color-bg-tertiary);
6014
6324
  border-radius: var(--wf-radius-sm);
6015
- padding: 1px 6px;
6325
+ padding: 1px var(--wf-space-sm);
6016
6326
  font-family: var(--wf-font-sans);
6017
6327
  }
6018
6328
 
@@ -6027,12 +6337,13 @@ body.wf-dragging {
6027
6337
  .wf-bubble--streaming {
6028
6338
  border-right: 3px solid var(--wf-color-primary);
6029
6339
  border-right-color: var(--wf-color-primary);
6030
- 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;
6031
6342
  }
6032
6343
 
6033
6344
  @keyframes wf-bubble-blink {
6034
6345
  0%, 100% { border-right-color: var(--wf-color-primary); }
6035
- 50% { border-right-color: transparent; }
6346
+ 50% { border-right-color: var(--wf-color-primary-bg); }
6036
6347
  }
6037
6348
 
6038
6349
  .wf-bubble-body {
@@ -6058,41 +6369,63 @@ body.wf-dragging {
6058
6369
  z-index: var(--wf-z-modal);
6059
6370
  }
6060
6371
 
6061
- .wf-modal--enter {
6062
- 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);
6063
6374
  }
6064
6375
 
6065
- .wf-modal--exit {
6066
- 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;
6067
6378
  }
6068
6379
 
6069
- @keyframes wf-modal-fadein {
6380
+ @keyframes wf-modal-overlay-fadein {
6070
6381
  from { opacity: 0; }
6071
6382
  to { opacity: 1; }
6072
6383
  }
6073
6384
 
6074
- @keyframes wf-modal-fadeout {
6385
+ @keyframes wf-modal-overlay-fadeout {
6075
6386
  from { opacity: 1; }
6076
6387
  to { opacity: 0; }
6077
6388
  }
6078
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
+
6079
6409
  .wf-modal-overlay {
6080
6410
  position: fixed;
6081
6411
  inset: 0;
6082
6412
  background: var(--wf-overlay);
6413
+ backdrop-filter: blur(var(--wf-overlay-blur));
6414
+ -webkit-backdrop-filter: blur(var(--wf-overlay-blur));
6083
6415
  z-index: -1;
6084
6416
  }
6085
6417
 
6086
6418
  .wf-modal-content {
6087
6419
  background: var(--wf-color-bg);
6088
- border-radius: var(--wf-modal-radius, var(--wf-radius-md));
6089
- box-shadow: var(--wf-modal-shadow, var(--wf-shadow-lg));
6090
- 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);
6091
6423
  max-width: 90vw;
6092
6424
  max-height: 80vh;
6093
6425
  display: flex;
6094
6426
  flex-direction: column;
6095
6427
  z-index: 1;
6428
+ transform-origin: center;
6096
6429
  }
6097
6430
 
6098
6431
  .wf-modal-header {
@@ -6135,7 +6468,7 @@ body.wf-dragging {
6135
6468
  /* ── 移动端适配(P2):min-width 视口 clamp(修 375px 屏 400px 溢出)+ 小屏 bottom-sheet ── */
6136
6469
 
6137
6470
  .wf-modal-content {
6138
- min-width: min(var(--wf-modal-width, 400px), calc(100vw - 32px));
6471
+ min-width: min(var(--wf-modal-width, 400px), calc(100vw - 32px));
6139
6472
  }
6140
6473
 
6141
6474
  @media (max-width: 639px) {
@@ -6157,11 +6490,11 @@ body.wf-dragging {
6157
6490
  display: flex;
6158
6491
  align-items: center;
6159
6492
  gap: 2px;
6160
- padding: 0 var(--wf-space-md, 16px);
6161
- background: var(--wf-color-bg-secondary, #fff);
6162
- 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);
6163
6496
  font-family: var(--wf-font-sans);
6164
- font-size: var(--wf-font-size-sm, 13px);
6497
+ font-size: var(--wf-font-size-sm);
6165
6498
  min-height: 48px;
6166
6499
  }
6167
6500
 
@@ -6169,27 +6502,27 @@ body.wf-dragging {
6169
6502
  position: relative;
6170
6503
  display: inline-flex;
6171
6504
  align-items: center;
6172
- gap: 6px;
6173
- padding: 8px 14px;
6174
- 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);
6175
6508
  color: var(--wf-color-text-secondary);
6176
6509
  cursor: pointer;
6177
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease),
6178
- 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);
6179
6512
  }
6180
6513
 
6181
6514
  .wf-navmenu-item:hover {
6182
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
6515
+ background: var(--wf-color-bg-hover);
6183
6516
  color: var(--wf-color-text);
6184
6517
  }
6185
6518
 
6186
6519
  .wf-navmenu-item--active {
6187
- color: var(--wf-color-primary, #1668dc);
6520
+ color: var(--wf-color-primary-text);
6188
6521
  font-weight: 600;
6189
6522
  }
6190
6523
 
6191
6524
  .wf-navmenu-item--disabled {
6192
- color: var(--wf-color-text-disabled, #bfbfbf);
6525
+ color: var(--wf-color-text-disabled);
6193
6526
  cursor: not-allowed;
6194
6527
  }
6195
6528
 
@@ -6203,14 +6536,14 @@ body.wf-dragging {
6203
6536
  position: absolute;
6204
6537
  top: calc(100% + 6px);
6205
6538
  left: 0;
6206
- min-width: var(--wf-navmenu-min-width, 160px);
6207
- padding: 6px;
6208
- border-radius: var(--wf-surface-radius, 8px);
6209
- background: var(--wf-surface-bg, #fff);
6210
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6211
- border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6212
- z-index: var(--wf-z-dropdown, 120);
6213
- 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);
6214
6547
  }
6215
6548
 
6216
6549
  @keyframes wf-navmenu-in {
@@ -6225,36 +6558,36 @@ body.wf-dragging {
6225
6558
  justify-content: space-between;
6226
6559
  gap: 12px;
6227
6560
  padding: 8px 12px;
6228
- border-radius: var(--wf-radius, 6px);
6561
+ border-radius: var(--wf-radius);
6229
6562
  color: var(--wf-color-text);
6230
6563
  cursor: pointer;
6231
6564
  white-space: nowrap;
6232
- transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6565
+ transition: background var(--wf-dur-fast) var(--wf-ease-standard);
6233
6566
  }
6234
6567
 
6235
6568
  .wf-navmenu-sub-item:hover {
6236
- background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
6569
+ background: var(--wf-color-bg-hover);
6237
6570
  }
6238
6571
 
6239
6572
  .wf-navmenu-sub-item--disabled {
6240
- color: var(--wf-color-text-disabled, #bfbfbf);
6573
+ color: var(--wf-color-text-disabled);
6241
6574
  cursor: not-allowed;
6242
6575
  }
6243
6576
 
6244
6577
  .wf-navmenu-sub-arrow {
6245
- color: var(--wf-color-text-tertiary, #999);
6578
+ color: var(--wf-color-text-tertiary);
6246
6579
  }
6247
6580
 
6248
6581
  .wf-navmenu-sub-nested {
6249
6582
  position: absolute;
6250
6583
  top: -6px;
6251
6584
  left: calc(100% + 4px);
6252
- min-width: var(--wf-navmenu-min-width, 160px);
6253
- padding: 6px;
6254
- border-radius: var(--wf-surface-radius, 8px);
6255
- background: var(--wf-surface-bg, #fff);
6256
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6257
- 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);
6258
6591
  }
6259
6592
 
6260
6593
  /* weifuwu/components — Notification */
@@ -6281,7 +6614,7 @@ body.wf-dragging {
6281
6614
  border: var(--wf-border-width) solid var(--wf-color-border);
6282
6615
  border-left-width: 3px;
6283
6616
  border-radius: var(--wf-radius);
6284
- box-shadow: var(--wf-shadow-lg, 0 8px 24px rgba(0, 0, 0, 0.12));
6617
+ box-shadow: var(--wf-shadow-lg);
6285
6618
  padding: var(--wf-space) var(--wf-space-md);
6286
6619
  pointer-events: auto;
6287
6620
  font-family: var(--wf-font-sans);
@@ -6429,7 +6762,7 @@ body.wf-dragging {
6429
6762
  cursor: pointer;
6430
6763
  font-family: inherit;
6431
6764
  font-size: inherit;
6432
- 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);
6433
6766
  }
6434
6767
 
6435
6768
  .wf-page-btn:hover:not(:disabled):not(.wf-page-btn--active) {
@@ -6492,7 +6825,7 @@ body.wf-dragging {
6492
6825
  border: none;
6493
6826
  cursor: pointer;
6494
6827
  color: var(--wf-color-text-tertiary);
6495
- padding: 6px;
6828
+ padding: var(--wf-space-sm);
6496
6829
  border-radius: var(--wf-radius-xs);
6497
6830
  }
6498
6831
  .wf-password-eye:hover { color: var(--wf-color-text-secondary); }
@@ -6559,7 +6892,7 @@ body.wf-dragging {
6559
6892
  .wf-pipeline-node {
6560
6893
  position: absolute;
6561
6894
  transform: translate(-50%, -50%);
6562
- padding: 8px 14px;
6895
+ padding: 8px var(--wf-space-md);
6563
6896
  min-width: 72px;
6564
6897
  max-width: 120px;
6565
6898
  text-align: center;
@@ -6572,23 +6905,23 @@ body.wf-dragging {
6572
6905
  white-space: nowrap;
6573
6906
  overflow: hidden;
6574
6907
  text-overflow: ellipsis;
6575
- box-shadow: var(--wf-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.08));
6908
+ box-shadow: var(--wf-shadow-sm);
6576
6909
  }
6577
6910
 
6578
6911
  .wf-pipeline-node--success {
6579
6912
  border-color: var(--wf-color-success-text);
6580
6913
  color: var(--wf-color-success-text);
6581
- background: var(--wf-color-success-bg, rgba(20, 83, 45, 0.06));
6914
+ background: var(--wf-color-success-bg);
6582
6915
  }
6583
6916
  .wf-pipeline-node--running {
6584
6917
  border-color: var(--wf-color-primary);
6585
6918
  color: var(--wf-color-primary-text);
6586
- background: var(--wf-color-primary-bg, rgba(79, 110, 247, 0.08));
6919
+ background: var(--wf-color-primary-bg);
6587
6920
  }
6588
6921
  .wf-pipeline-node--error {
6589
6922
  border-color: var(--wf-color-error-text);
6590
6923
  color: var(--wf-color-error-text);
6591
- background: var(--wf-color-error-bg, rgba(255, 0, 0, 0.06));
6924
+ background: var(--wf-color-error-bg);
6592
6925
  }
6593
6926
  .wf-pipeline-node--pending {
6594
6927
  border-color: var(--wf-color-border);
@@ -6614,15 +6947,15 @@ body.wf-dragging {
6614
6947
 
6615
6948
  .wf-popconfirm {
6616
6949
  position: fixed;
6617
- z-index: var(--wf-z-popover, 120);
6618
- min-width: var(--wf-popconfirm-min-width, 180px);
6619
- padding: var(--wf-space-sm, 12px);
6620
- border-radius: var(--wf-surface-radius, 8px);
6621
- background: var(--wf-surface-bg, #fff);
6622
- box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6623
- 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);
6624
6957
  font-family: var(--wf-font-sans);
6625
- font-size: var(--wf-font-size-sm, 13px);
6958
+ font-size: var(--wf-font-size-sm);
6626
6959
  }
6627
6960
 
6628
6961
  .wf-popconfirm--bottom { transform: translateX(-50%); }
@@ -6631,11 +6964,11 @@ body.wf-dragging {
6631
6964
  .wf-popconfirm--right { transform: translateY(-50%); }
6632
6965
 
6633
6966
  .wf-popconfirm--enter {
6634
- 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);
6635
6968
  }
6636
6969
 
6637
6970
  .wf-popconfirm--exit {
6638
- 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;
6639
6972
  }
6640
6973
 
6641
6974
  /* 入场/退场只 fade(opacity)——transform 由定位类独占:
@@ -6654,8 +6987,8 @@ body.wf-dragging {
6654
6987
  .wf-popconfirm-title {
6655
6988
  display: flex;
6656
6989
  align-items: flex-start;
6657
- gap: var(--wf-gap-xs, 8px);
6658
- margin-bottom: var(--wf-space-xs, 8px);
6990
+ gap: var(--wf-gap-xs);
6991
+ margin-bottom: var(--wf-space-xs);
6659
6992
  color: var(--wf-color-text);
6660
6993
  line-height: 1.5;
6661
6994
  }
@@ -6664,14 +6997,14 @@ body.wf-dragging {
6664
6997
  display: inline-flex;
6665
6998
  flex-shrink: 0;
6666
6999
  margin-top: 2px;
6667
- color: var(--wf-color-warning-text, #ad6800);
7000
+ color: var(--wf-color-warning-text);
6668
7001
  }
6669
7002
 
6670
7003
  .wf-popconfirm-actions {
6671
7004
  display: flex;
6672
7005
  justify-content: flex-end;
6673
- gap: var(--wf-gap-xs, 8px);
6674
- margin-top: var(--wf-space-xs, 8px);
7006
+ gap: var(--wf-gap-xs);
7007
+ margin-top: var(--wf-space-xs);
6675
7008
  }
6676
7009
 
6677
7010
  /* weifuwu/components — Popover */
@@ -6691,10 +7024,10 @@ body.wf-dragging {
6691
7024
  z-index: var(--wf-z-popover);
6692
7025
  background: var(--wf-color-bg);
6693
7026
  border: var(--wf-border-width) solid var(--wf-color-border);
6694
- border-radius: var(--wf-popover-radius, var(--wf-radius-md));
7027
+ border-radius: var(--wf-popover-radius, var(--wf-radius-md));
6695
7028
  box-shadow: var(--wf-shadow-md);
6696
7029
  padding: var(--wf-space);
6697
- min-width: var(--wf-popover-width, 160px);
7030
+ min-width: var(--wf-popover-width, 160px);
6698
7031
  max-width: 320px;
6699
7032
  }
6700
7033
 
@@ -6785,6 +7118,26 @@ body.wf-dragging {
6785
7118
  text-align: right;
6786
7119
  }
6787
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
+
6788
7141
  /* weifuwu/components — RadioGroup */
6789
7142
 
6790
7143
  .wf-radio-group {
@@ -6824,7 +7177,7 @@ body.wf-dragging {
6824
7177
  align-items: center;
6825
7178
  justify-content: center;
6826
7179
  flex-shrink: 0;
6827
- 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);
6828
7181
  background: var(--wf-color-bg);
6829
7182
  }
6830
7183
 
@@ -6903,6 +7256,43 @@ body.wf-dragging {
6903
7256
  .wf-rate--md { font-size: var(--wf-font-size-xl); }
6904
7257
  .wf-rate--lg { font-size: var(--wf-font-size-2xl); }
6905
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
+
6906
7296
  /* weifuwu/components — Resizable */
6907
7297
 
6908
7298
  .wf-resizable {
@@ -7026,7 +7416,7 @@ body.wf-dragging {
7026
7416
  }
7027
7417
 
7028
7418
  .wf-scrollbar::-webkit-scrollbar-thumb:hover {
7029
- background: var(--wf-color-text-tertiary, #999);
7419
+ background: var(--wf-color-text-tertiary);
7030
7420
  }
7031
7421
 
7032
7422
  /* weifuwu/components — SearchInput */
@@ -7039,7 +7429,7 @@ body.wf-dragging {
7039
7429
  border: var(--wf-border-width) solid var(--wf-color-border);
7040
7430
  border-radius: var(--wf-radius);
7041
7431
  background: var(--wf-color-bg);
7042
- 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);
7043
7433
  }
7044
7434
 
7045
7435
  .wf-search:focus-within {
@@ -7174,14 +7564,14 @@ body.wf-dragging {
7174
7564
  .wf-select {
7175
7565
  font-family: var(--wf-font-sans);
7176
7566
  font-size: var(--wf-font-size-sm);
7177
- min-height: var(--wf-field-height, var(--wf-control-height));
7567
+ min-height: var(--wf-field-height);
7178
7568
  padding: var(--wf-control-pad-y) var(--wf-space);
7179
7569
  border: var(--wf-border-width) solid var(--wf-color-border);
7180
- border-radius: var(--wf-field-radius, var(--wf-radius));
7570
+ border-radius: var(--wf-field-radius);
7181
7571
  background: var(--wf-color-bg);
7182
7572
  color: var(--wf-color-text);
7183
7573
  outline: none;
7184
- 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);
7185
7575
  width: 100%;
7186
7576
  cursor: pointer;
7187
7577
  appearance: auto;
@@ -7199,6 +7589,7 @@ body.wf-dragging {
7199
7589
 
7200
7590
  .wf-select--err .wf-select {
7201
7591
  border-color: var(--wf-color-error);
7592
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
7202
7593
  }
7203
7594
 
7204
7595
  /* ── searchable select ── */
@@ -7209,10 +7600,10 @@ body.wf-dragging {
7209
7600
 
7210
7601
  .wf-select-search-trigger {
7211
7602
  border: var(--wf-border-width) solid var(--wf-color-border);
7212
- border-radius: var(--wf-field-radius, var(--wf-radius));
7603
+ border-radius: var(--wf-field-radius);
7213
7604
  background: var(--wf-color-bg);
7214
7605
  cursor: pointer;
7215
- 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);
7216
7607
  }
7217
7608
  .wf-select-search-trigger:focus-within {
7218
7609
  border-color: var(--wf-color-primary);
@@ -7230,6 +7621,7 @@ body.wf-dragging {
7230
7621
  }
7231
7622
  .wf-select--err .wf-select-search-trigger {
7232
7623
  border-color: var(--wf-color-error);
7624
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
7233
7625
  }
7234
7626
 
7235
7627
  .wf-select-search-input {
@@ -7240,7 +7632,7 @@ body.wf-dragging {
7240
7632
  font-family: var(--wf-font-sans);
7241
7633
  font-size: var(--wf-font-size-sm);
7242
7634
  color: var(--wf-color-text);
7243
- min-height: var(--wf-field-height, var(--wf-control-height));
7635
+ min-height: var(--wf-field-height);
7244
7636
  padding: var(--wf-control-pad-y) var(--wf-space);
7245
7637
  cursor: pointer;
7246
7638
  box-sizing: border-box;
@@ -7251,10 +7643,10 @@ body.wf-dragging {
7251
7643
 
7252
7644
  .wf-select-search-menu {
7253
7645
  /* portal 定位(usePopup 接管)——absolute 会被父容器 overflow 裁剪 */
7254
- min-width: var(--wf-select-menu-min-width, 200px);
7646
+ min-width: var(--wf-select-menu-min-width);
7255
7647
  background: var(--wf-color-bg);
7256
7648
  border: var(--wf-border-width) solid var(--wf-color-border);
7257
- border-radius: var(--wf-field-radius, var(--wf-radius));
7649
+ border-radius: var(--wf-field-radius);
7258
7650
  box-shadow: var(--wf-shadow-md);
7259
7651
  max-height: 240px;
7260
7652
  overflow-y: auto;
@@ -7343,12 +7735,12 @@ body.wf-dragging {
7343
7735
  .wf-skeleton {
7344
7736
  display: inline-block;
7345
7737
  height: 1em;
7346
- border-radius: var(--wf-radius-sm, 4px);
7738
+ border-radius: var(--wf-radius-sm);
7347
7739
  background: linear-gradient(
7348
7740
  90deg,
7349
- var(--wf-color-border, #e5e7eb) 25%,
7350
- var(--wf-color-bg-hover, #f3f4f6) 50%,
7351
- 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%
7352
7744
  );
7353
7745
  background-size: 200% 100%;
7354
7746
  animation: wf-skeleton-shimmer 1.5s ease-in-out infinite;
@@ -7375,13 +7767,13 @@ body.wf-dragging {
7375
7767
  }
7376
7768
 
7377
7769
  .wf-skeleton--rect {
7378
- border-radius: var(--wf-radius, 8px);
7770
+ border-radius: var(--wf-radius);
7379
7771
  width: 100%;
7380
7772
  height: 120px;
7381
7773
  }
7382
7774
 
7383
7775
  .wf-skeleton--image {
7384
- border-radius: var(--wf-radius, 8px);
7776
+ border-radius: var(--wf-radius);
7385
7777
  width: 100%;
7386
7778
  aspect-ratio: 16 / 9;
7387
7779
  height: auto;
@@ -7405,12 +7797,12 @@ body.wf-dragging {
7405
7797
  .wf-skeleton-table {
7406
7798
  display: flex;
7407
7799
  flex-direction: column;
7408
- gap: var(--wf-gap-sm, 8px);
7800
+ gap: var(--wf-gap-sm);
7409
7801
  }
7410
7802
 
7411
7803
  .wf-skeleton-row {
7412
7804
  display: flex;
7413
- gap: var(--wf-gap-md, 12px);
7805
+ gap: var(--wf-gap-md);
7414
7806
  align-items: center;
7415
7807
  }
7416
7808
 
@@ -7450,7 +7842,7 @@ body.wf-dragging {
7450
7842
  background: var(--wf-color-primary);
7451
7843
  cursor: pointer;
7452
7844
  border: 2px solid var(--wf-color-on-brand);
7453
- 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));
7454
7846
  }
7455
7847
 
7456
7848
  /* Firefox 同款 thumb(跨浏览器一致) */
@@ -7461,7 +7853,7 @@ body.wf-dragging {
7461
7853
  background: var(--wf-color-primary);
7462
7854
  cursor: pointer;
7463
7855
  border: 2px solid var(--wf-color-on-brand);
7464
- 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));
7465
7857
  }
7466
7858
 
7467
7859
  .wf-slider-input::-moz-range-track {
@@ -7495,7 +7887,7 @@ body.wf-dragging {
7495
7887
  }
7496
7888
 
7497
7889
  .wf-space-split {
7498
- color: var(--wf-color-text-tertiary, #999);
7890
+ color: var(--wf-color-text-tertiary);
7499
7891
  }
7500
7892
 
7501
7893
  .wf-sparkline {
@@ -7653,7 +8045,7 @@ body.wf-dragging {
7653
8045
  width: 36px;
7654
8046
  height: 20px;
7655
8047
  background: var(--wf-color-border-dark);
7656
- border-radius: var(--wf-switch-radius, 10px);
8048
+ border-radius: var(--wf-switch-radius, 10px);
7657
8049
  transition: background var(--wf-transition);
7658
8050
  flex-shrink: 0;
7659
8051
  }
@@ -7668,7 +8060,7 @@ body.wf-dragging {
7668
8060
  background: var(--wf-color-on-brand);
7669
8061
  border-radius: 50%;
7670
8062
  transition: transform var(--wf-transition);
7671
- 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));
7672
8064
  }
7673
8065
 
7674
8066
  .wf-switch-input:checked + .wf-switch-track {
@@ -7727,6 +8119,7 @@ body.wf-dragging {
7727
8119
  border-bottom: var(--wf-border-width) solid var(--wf-color-border);
7728
8120
  color: var(--wf-color-text);
7729
8121
  font-size: var(--wf-font-size-base);
8122
+ transition: background-color var(--wf-dur-fast) var(--wf-ease-out);
7730
8123
  }
7731
8124
 
7732
8125
  .wf-table-th--sortable {
@@ -7780,6 +8173,20 @@ body.wf-dragging {
7780
8173
  display: flex;
7781
8174
  gap: 0;
7782
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;
7783
8190
  }
7784
8191
 
7785
8192
  .wf-tab {
@@ -7793,7 +8200,7 @@ body.wf-dragging {
7793
8200
  cursor: pointer;
7794
8201
  border-bottom: 2px solid transparent;
7795
8202
  margin-bottom: -1px;
7796
- 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);
7797
8204
  white-space: nowrap;
7798
8205
  }
7799
8206
 
@@ -7803,7 +8210,6 @@ body.wf-dragging {
7803
8210
 
7804
8211
  .wf-tab--active {
7805
8212
  color: var(--wf-color-primary-text);
7806
- border-bottom-color: var(--wf-color-primary);
7807
8213
  }
7808
8214
 
7809
8215
  /* 激活指示平滑滑动(下边框) */
@@ -7831,7 +8237,7 @@ body.wf-dragging {
7831
8237
  align-items: center;
7832
8238
  gap: var(--wf-gap-xs);
7833
8239
  padding: 2px var(--wf-space-sm);
7834
- border-radius: var(--wf-tag-radius, var(--wf-radius-sm));
8240
+ border-radius: var(--wf-tag-radius, var(--wf-radius-sm));
7835
8241
  font-family: var(--wf-font-sans);
7836
8242
  font-size: var(--wf-font-size-xs);
7837
8243
  line-height: 1.5;
@@ -7886,7 +8292,7 @@ body.wf-dragging {
7886
8292
  box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
7887
8293
  }
7888
8294
 
7889
- .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); }
7890
8296
  .wf-tags--disabled { opacity: 0.6; cursor: not-allowed; }
7891
8297
 
7892
8298
  .wf-tags-tag {
@@ -7947,14 +8353,14 @@ body.wf-dragging {
7947
8353
  .wf-textarea {
7948
8354
  font-family: var(--wf-font-sans);
7949
8355
  font-size: var(--wf-font-size-sm);
7950
- min-height: var(--wf-field-height, var(--wf-control-height));
8356
+ min-height: var(--wf-field-height);
7951
8357
  padding: var(--wf-control-pad-y) var(--wf-space);
7952
8358
  border: var(--wf-border-width) solid var(--wf-color-border);
7953
- border-radius: var(--wf-field-radius, var(--wf-radius));
8359
+ border-radius: var(--wf-field-radius);
7954
8360
  background: var(--wf-color-bg);
7955
8361
  color: var(--wf-color-text);
7956
8362
  outline: none;
7957
- 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);
7958
8364
  width: 100%;
7959
8365
  resize: vertical;
7960
8366
  line-height: var(--wf-line-height);
@@ -7989,6 +8395,7 @@ body.wf-dragging {
7989
8395
 
7990
8396
  .wf-textarea--err .wf-textarea {
7991
8397
  border-color: var(--wf-color-error);
8398
+ box-shadow: 0 0 0 2px var(--wf-color-error-bg);
7992
8399
  }
7993
8400
 
7994
8401
  /* weifuwu/components — ThemeSwitch 主题切换器 */
@@ -8002,7 +8409,7 @@ body.wf-dragging {
8002
8409
  border-radius: var(--wf-radius-md);
8003
8410
  background: var(--wf-color-bg-secondary);
8004
8411
  font-family: var(--wf-font-sans);
8005
- 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));
8006
8413
  }
8007
8414
 
8008
8415
  .wf-theme-seg {
@@ -8020,7 +8427,7 @@ body.wf-dragging {
8020
8427
  cursor: pointer;
8021
8428
  white-space: nowrap;
8022
8429
  user-select: none;
8023
- 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);
8024
8431
  }
8025
8432
 
8026
8433
  .wf-theme-seg:hover {
@@ -8140,6 +8547,44 @@ body.wf-dragging {
8140
8547
  .wf-timeline-item--alt-left { align-self: flex-start; text-align: right; }
8141
8548
  .wf-timeline-item--alt-right { align-self: flex-end; margin-left: 50%; }
8142
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
+
8143
8588
  /* weifuwu/components — Toast */
8144
8589
 
8145
8590
  .wf-toast-container {
@@ -8163,11 +8608,11 @@ body.wf-dragging {
8163
8608
  align-items: center;
8164
8609
  gap: var(--wf-gap-sm);
8165
8610
  padding: var(--wf-space) var(--wf-space-md);
8166
- border-radius: var(--wf-toast-radius, var(--wf-radius));
8611
+ border-radius: var(--wf-toast-radius, var(--wf-radius));
8167
8612
  box-shadow: var(--wf-shadow-md);
8168
8613
  font-family: var(--wf-font-sans);
8169
8614
  font-size: var(--wf-font-size-sm);
8170
- min-width: var(--wf-toast-width, 260px);
8615
+ min-width: var(--wf-toast-width, 260px);
8171
8616
  max-width: 400px;
8172
8617
  cursor: pointer;
8173
8618
  pointer-events: auto;
@@ -8294,9 +8739,9 @@ body.wf-dragging {
8294
8739
  }
8295
8740
 
8296
8741
  /* 尺寸 */
8297
- .wf-toggle--sm { font-size: var(--wf-font-size-sm); padding: 2px var(--wf-space-sm); }
8298
- .wf-toggle--md { font-size: var(--wf-font-size-base); padding: 4px var(--wf-space); }
8299
- .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); }
8300
8745
 
8301
8746
  /* 组:紧邻连接,选中项圆角过渡 */
8302
8747
  .wf-toggle-group {
@@ -8394,7 +8839,7 @@ body.wf-dragging {
8394
8839
  font-family: var(--wf-font-sans);
8395
8840
  font-size: var(--wf-font-size-xs);
8396
8841
  padding: var(--wf-space-xs) var(--wf-space-sm);
8397
- border-radius: var(--wf-tooltip-radius, var(--wf-radius-sm));
8842
+ border-radius: var(--wf-tooltip-radius, var(--wf-radius-sm));
8398
8843
  box-shadow: var(--wf-shadow-md); /* 与其他弹层一致的层次阴影 */
8399
8844
  white-space: nowrap;
8400
8845
  pointer-events: none;
@@ -8492,7 +8937,7 @@ body.wf-dragging {
8492
8937
  box-shadow: 0 0 0 9999px var(--wf-overlay), 0 0 0 2px var(--wf-color-primary);
8493
8938
  z-index: 1;
8494
8939
  pointer-events: none;
8495
- 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);
8496
8941
  }
8497
8942
 
8498
8943
  .wf-tour-bubble {
@@ -8503,7 +8948,7 @@ body.wf-dragging {
8503
8948
  background: var(--wf-color-bg);
8504
8949
  border: 1px solid var(--wf-color-border);
8505
8950
  border-radius: var(--wf-radius-md);
8506
- box-shadow: var(--wf-shadow-lg, 0 12px 32px rgba(0, 0, 0, 0.12));
8951
+ box-shadow: var(--wf-shadow-lg);
8507
8952
  padding: 16px;
8508
8953
  display: flex;
8509
8954
  flex-direction: column;
@@ -8541,7 +8986,7 @@ body.wf-dragging {
8541
8986
 
8542
8987
  .wf-tour-btn {
8543
8988
  min-height: 32px;
8544
- padding: 0 14px;
8989
+ padding: 0 var(--wf-space-md);
8545
8990
  border-radius: var(--wf-radius-sm);
8546
8991
  border: 1px solid var(--wf-color-border);
8547
8992
  background: var(--wf-color-bg);
@@ -8608,7 +9053,7 @@ body.wf-dragging {
8608
9053
  text-align: left;
8609
9054
  border: none;
8610
9055
  background: none;
8611
- padding: 6px var(--wf-space);
9056
+ padding: var(--wf-space-sm) var(--wf-space);
8612
9057
  border-radius: var(--wf-radius-sm);
8613
9058
  font-size: var(--wf-font-size-sm);
8614
9059
  color: var(--wf-color-text);
@@ -8702,6 +9147,15 @@ body.wf-dragging {
8702
9147
  }
8703
9148
  }
8704
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
+
8705
9159
  /* weifuwu/components — Tree */
8706
9160
 
8707
9161
  .wf-tree {
@@ -8718,7 +9172,7 @@ body.wf-dragging {
8718
9172
  display: flex;
8719
9173
  align-items: center;
8720
9174
  gap: var(--wf-gap-xs);
8721
- padding: 3px var(--wf-space-sm);
9175
+ padding: var(--wf-space-xs) var(--wf-space-sm);
8722
9176
  border-radius: var(--wf-radius-sm);
8723
9177
  cursor: pointer;
8724
9178
  }
@@ -8848,6 +9302,20 @@ body.wf-dragging {
8848
9302
  white-space: nowrap;
8849
9303
  }
8850
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
+
8851
9319
  .wf-treeselect {
8852
9320
  position: relative;
8853
9321
  display: inline-block;
@@ -8860,7 +9328,7 @@ body.wf-dragging {
8860
9328
  align-items: center;
8861
9329
  justify-content: space-between;
8862
9330
  gap: 8px;
8863
- padding: 7px 12px;
9331
+ padding: var(--wf-space-sm) 12px;
8864
9332
  border: 1px solid var(--wf-color-border);
8865
9333
  border-radius: var(--wf-radius-sm);
8866
9334
  background: var(--wf-color-bg);
@@ -8873,7 +9341,7 @@ body.wf-dragging {
8873
9341
  }
8874
9342
  .wf-treeselect-trigger--open {
8875
9343
  border-color: var(--wf-color-primary);
8876
- 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);
8877
9345
  }
8878
9346
 
8879
9347
  .wf-treeselect-placeholder {
@@ -8907,7 +9375,7 @@ body.wf-dragging {
8907
9375
  background: var(--wf-color-bg);
8908
9376
  border: 1px solid var(--wf-color-border);
8909
9377
  border-radius: var(--wf-radius-md);
8910
- box-shadow: var(--wf-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.1));
9378
+ box-shadow: var(--wf-shadow-md);
8911
9379
  padding: 4px;
8912
9380
  max-height: var(--wf-treeselect-dropdown-max-height);
8913
9381
  overflow: auto;
@@ -9103,6 +9571,21 @@ body.wf-dragging {
9103
9571
  font-size: var(--wf-font-size-sm);
9104
9572
  }
9105
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
+
9106
9589
  /* weifuwu/components — Watermark */
9107
9590
 
9108
9591
  .wf-watermark {