weifuwu 0.75.0 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +13 -13
  2. package/dist/ai/types.d.ts +2 -0
  3. package/dist/components/AiChat/AiChat.d.ts +5 -1
  4. package/dist/components/ApprovalCard/ApprovalCard.d.ts +5 -2
  5. package/dist/components/CitationCard/CitationCard.d.ts +38 -0
  6. package/dist/components/Command/Command.d.ts +1 -1
  7. package/dist/components/JsonSchemaForm/JsonSchemaForm.d.ts +48 -0
  8. package/dist/components/ReasoningBlock/ReasoningBlock.d.ts +25 -0
  9. package/dist/components/Select/Select.d.ts +11 -1
  10. package/dist/components/SessionList/SessionList.d.ts +42 -0
  11. package/dist/components/TreeSelect/TreeSelect.d.ts +3 -2
  12. package/dist/components/index.d.ts +10 -2
  13. package/dist/components/index.js +14 -14
  14. package/dist/components/style.css +608 -20
  15. package/dist/index.js +140 -311
  16. package/dist/layout/weifuwu-layout.css +9 -0
  17. package/dist/test/client/setup.d.ts +12 -0
  18. package/dist/ui/index.d.ts +2 -2
  19. package/dist/ui-dom/Confirm.d.ts +5 -41
  20. package/dist/ui-dom/Notification.d.ts +8 -70
  21. package/dist/ui-dom/Toast.d.ts +8 -43
  22. package/dist/ui-dom/hooks/chat.d.ts +11 -0
  23. package/dist/ui-dom/hooks/events.d.ts +30 -0
  24. package/dist/ui-dom/hooks/external.d.ts +20 -0
  25. package/dist/ui-dom/hooks/index.d.ts +31 -0
  26. package/dist/ui-dom/hooks/input.d.ts +33 -0
  27. package/dist/ui-dom/hooks/media.d.ts +17 -0
  28. package/dist/ui-dom/hooks/popup.d.ts +37 -0
  29. package/dist/ui-dom/hooks/stable.d.ts +39 -0
  30. package/dist/ui-dom/hooks/test/hooks.test.d.ts +1 -0
  31. package/dist/ui-dom/hooks/types.d.ts +78 -0
  32. package/dist/ui-dom/index.d.ts +19 -17
  33. package/dist/ui-dom/index.js +11 -11
  34. package/dist/ui-dom/jsx-runtime.js +1 -1
  35. package/dist/ui-dom/store.d.ts +24 -0
  36. package/dist/ui-dom/testing.d.ts +74 -0
  37. package/dist/ui-dom/testing.js +1 -0
  38. package/dist/ui-dom/testing.test.d.ts +1 -0
  39. package/dist/ui-dom/types.d.ts +28 -11
  40. package/dist/ui-dom/use-chat.d.ts +19 -14
  41. package/dist/ui-dom/vdom/build.d.ts +34 -0
  42. package/dist/ui-dom/vdom/diff.d.ts +34 -0
  43. package/dist/ui-dom/vdom/hydration.d.ts +17 -0
  44. package/dist/ui-dom/vdom/index.d.ts +23 -0
  45. package/dist/ui-dom/vdom/mount.d.ts +49 -0
  46. package/dist/ui-dom/vdom/registry.d.ts +27 -0
  47. package/dist/ui-dom/vdom/render.d.ts +13 -0
  48. package/dist/ui-dom/vdom/scheduler.d.ts +13 -0
  49. package/dist/ui-dom/vdom/serve.d.ts +30 -0
  50. package/dist/ui-dom/vdom/ssr.d.ts +44 -0
  51. package/dist/ui-dom/vnode.d.ts +9 -26
  52. package/docs/components-map.md +18 -1
  53. package/docs/components.md +9 -4
  54. package/docs/custom-components.md +14 -8
  55. package/docs/frontend.md +2 -2
  56. package/docs/layout.md +2 -2
  57. package/package.json +5 -1
  58. package/dist/ui/ssr.d.ts +0 -35
  59. package/dist/ui-dom/diff.d.ts +0 -28
  60. package/dist/ui-dom/hydration.d.ts +0 -13
  61. package/dist/ui-dom/reactive.d.ts +0 -6
  62. package/dist/ui-dom/registry.d.ts +0 -27
  63. package/dist/ui-dom/render.d.ts +0 -46
  64. package/dist/ui-dom/serve.d.ts +0 -28
  65. package/dist/ui-dom/ssr.d.ts +0 -57
  66. package/dist/ui-dom/ui.d.ts +0 -78
@@ -852,6 +852,15 @@ body.wf-dragging {
852
852
  max-width: min(var(--wf-popup-max, 480px), calc(100vw - 32px));
853
853
  box-sizing: border-box;
854
854
  }
855
+
856
+ /* usePopup mask 模式遮罩:全屏 fixed,z-index 低于面板(overlay=80 < popover=120),
857
+ * 模态语义阻断页面交互;点击遮罩关闭(maskClosable 门控在组件层) */
858
+ .wf-popup-mask {
859
+ position: fixed;
860
+ inset: 0;
861
+ z-index: var(--wf-z-overlay);
862
+ background: var(--wf-overlay);
863
+ }
855
864
  }
856
865
 
857
866
  @layer layout {
@@ -2047,6 +2056,19 @@ body.wf-dragging {
2047
2056
  .wf-approval-status--rejected { color: var(--wf-color-error-text); }
2048
2057
  .wf-approval-status--timeout { color: var(--wf-color-text-tertiary); }
2049
2058
 
2059
+ /* 修改参数面板(B9-5:JsonSchemaForm 复用——审批 modified 决策取参来源) */
2060
+ .wf-approval-modify {
2061
+ margin-top: var(--wf-gap-md);
2062
+ padding: var(--wf-gap-md);
2063
+ border: 1px solid var(--wf-color-border);
2064
+ border-radius: var(--wf-radius);
2065
+ background: var(--wf-color-bg-tertiary);
2066
+ display: flex;
2067
+ flex-direction: column;
2068
+ gap: var(--wf-gap-sm);
2069
+ align-items: flex-start;
2070
+ }
2071
+
2050
2072
  /* weifuwu/components — AspectRatio */
2051
2073
 
2052
2074
  .wf-aspect-ratio {
@@ -2986,6 +3008,151 @@ body.wf-dragging {
2986
3008
  .wf-checkbox-group--md { font-size: var(--wf-font-size-base); }
2987
3009
  .wf-checkbox-group--lg { font-size: var(--wf-font-size-lg); }
2988
3010
 
3011
+ /* weifuwu/components — CitationCard(RAG 引用展示) */
3012
+
3013
+ .wf-citation {
3014
+ font-family: var(--wf-font-sans);
3015
+ font-size: var(--wf-font-size-sm);
3016
+ line-height: var(--wf-line-height);
3017
+ border: 1px solid var(--wf-color-border);
3018
+ border-radius: var(--wf-radius);
3019
+ background: var(--wf-color-bg-tertiary);
3020
+ }
3021
+
3022
+ .wf-citation-toggle {
3023
+ display: flex;
3024
+ align-items: center;
3025
+ gap: var(--wf-gap-xs);
3026
+ width: 100%;
3027
+ padding: var(--wf-gap-xs) var(--wf-gap-sm);
3028
+ background: none;
3029
+ border: none;
3030
+ cursor: pointer;
3031
+ color: var(--wf-color-text-secondary);
3032
+ font: inherit;
3033
+ text-align: left;
3034
+ }
3035
+
3036
+ .wf-citation-toggle:hover { color: var(--wf-color-text); }
3037
+
3038
+ .wf-citation-toggle:focus-visible {
3039
+ outline: 2px solid var(--wf-color-primary);
3040
+ outline-offset: -1px;
3041
+ border-radius: var(--wf-radius);
3042
+ }
3043
+
3044
+ .wf-citation-chevron {
3045
+ display: inline-flex;
3046
+ color: var(--wf-color-text-secondary);
3047
+ transition: transform var(--wf-dur-fast) var(--wf-ease-out);
3048
+ }
3049
+
3050
+ .wf-citation-chevron--open { transform: rotate(180deg); }
3051
+
3052
+ .wf-citation-count { font-weight: var(--wf-font-weight-medium); }
3053
+
3054
+ .wf-citation-body {
3055
+ display: flex;
3056
+ flex-direction: column;
3057
+ padding: 0 var(--wf-gap-sm) var(--wf-gap-sm);
3058
+ gap: var(--wf-gap-xs);
3059
+ }
3060
+
3061
+ .wf-citation-item {
3062
+ display: flex;
3063
+ align-items: flex-start;
3064
+ gap: var(--wf-gap-sm);
3065
+ padding: var(--wf-gap-xs);
3066
+ border: 1px solid var(--wf-color-border);
3067
+ border-radius: var(--wf-radius-sm);
3068
+ background: var(--wf-color-bg);
3069
+ }
3070
+
3071
+ .wf-citation-idx {
3072
+ flex-shrink: 0;
3073
+ display: inline-flex;
3074
+ align-items: center;
3075
+ justify-content: center;
3076
+ width: 20px;
3077
+ height: 20px;
3078
+ min-width: 20px;
3079
+ min-height: 20px;
3080
+ font-size: var(--wf-font-size-xs);
3081
+ font-weight: var(--wf-font-weight-semibold);
3082
+ color: var(--wf-color-primary-text);
3083
+ background: var(--wf-color-primary-bg);
3084
+ border-radius: var(--wf-radius-sm);
3085
+ }
3086
+
3087
+ .wf-citation-content { flex: 1; min-width: 0; }
3088
+
3089
+ .wf-citation-title {
3090
+ display: flex;
3091
+ align-items: baseline;
3092
+ gap: var(--wf-gap-xs);
3093
+ font-weight: var(--wf-font-weight-medium);
3094
+ color: var(--wf-color-text);
3095
+ word-break: break-word;
3096
+ }
3097
+
3098
+ .wf-citation-source {
3099
+ font-size: var(--wf-font-size-xs);
3100
+ font-weight: var(--wf-font-weight-normal);
3101
+ color: var(--wf-color-text-tertiary);
3102
+ overflow: hidden;
3103
+ text-overflow: ellipsis;
3104
+ white-space: nowrap;
3105
+ }
3106
+
3107
+ .wf-citation-snippet {
3108
+ margin-top: 2px;
3109
+ font-size: var(--wf-font-size-xs);
3110
+ color: var(--wf-color-text-secondary);
3111
+ display: -webkit-box;
3112
+ -webkit-line-clamp: 2;
3113
+ -webkit-box-orient: vertical;
3114
+ overflow: hidden;
3115
+ }
3116
+
3117
+ .wf-citation-link {
3118
+ flex-shrink: 0;
3119
+ display: inline-flex;
3120
+ align-items: center;
3121
+ justify-content: center;
3122
+ width: 24px;
3123
+ height: 24px;
3124
+ min-width: 24px;
3125
+ min-height: 24px;
3126
+ color: var(--wf-color-text-tertiary);
3127
+ cursor: pointer;
3128
+ text-decoration: none;
3129
+ border-radius: var(--wf-radius-sm);
3130
+ }
3131
+
3132
+ .wf-citation-link:hover { color: var(--wf-color-primary-text); }
3133
+
3134
+ .wf-citation-link:focus-visible {
3135
+ outline: 2px solid var(--wf-color-primary);
3136
+ outline-offset: 1px;
3137
+ }
3138
+
3139
+ /* 溢出汇总条目(+N 更多) */
3140
+ .wf-citation-more {
3141
+ justify-content: center;
3142
+ cursor: pointer;
3143
+ color: var(--wf-color-primary-text);
3144
+ font-weight: var(--wf-font-weight-medium);
3145
+ border-style: dashed;
3146
+ }
3147
+
3148
+ .wf-citation-more:hover { background: var(--wf-color-primary-bg); }
3149
+
3150
+ /* 触屏(coarse):条目 44px 命中区 */
3151
+ @media (pointer: coarse) {
3152
+ .wf-citation-item { min-height: 44px; align-items: center; }
3153
+ .wf-citation-toggle { min-height: 44px; }
3154
+ }
3155
+
2989
3156
  /* weifuwu/components — CodeBlock */
2990
3157
 
2991
3158
  .wf-codeblock {
@@ -3285,17 +3452,6 @@ body.wf-dragging {
3285
3452
 
3286
3453
  /* weifuwu/components — Command */
3287
3454
 
3288
- .wf-command-overlay {
3289
- position: fixed;
3290
- inset: 0;
3291
- z-index: var(--wf-z-modal);
3292
- background: var(--wf-overlay);
3293
- display: flex;
3294
- align-items: flex-start;
3295
- justify-content: center;
3296
- padding-top: 12vh;
3297
- }
3298
-
3299
3455
  .wf-command-panel {
3300
3456
  width: min(520px, 90vw);
3301
3457
  background: var(--wf-color-bg);
@@ -3305,6 +3461,8 @@ body.wf-dragging {
3305
3461
  overflow: hidden;
3306
3462
  font-family: var(--wf-font-sans);
3307
3463
  animation: wf-command-in var(--wf-dur-base) var(--wf-ease-out);
3464
+ /* usePopup maskCentered 全屏居中(.wf-cover flex 居中)——命令面板惯例偏上 12vh */
3465
+ margin-top: -12vh;
3308
3466
  }
3309
3467
 
3310
3468
  @keyframes wf-command-in {
@@ -3656,10 +3814,15 @@ body.wf-dragging {
3656
3814
  user-select: none;
3657
3815
  animation: wf-panel-in var(--wf-dur-fast) var(--wf-ease-out);
3658
3816
  transform-origin: top center;
3817
+ /* 宽度自适应内容(双面板 2×240 + gap)——不被容器/trigger 压缩 */
3818
+ width: max-content;
3819
+ max-width: calc(100vw - 32px);
3659
3820
  }
3660
3821
 
3661
3822
  .wf-datepicker-range-panel {
3662
- min-width: var(--wf-datepicker-time-width, 240px);
3823
+ min-width: var(--wf-datepicker-time-width, 240px);
3824
+ /* flex 子项不压缩——面板保持自身宽度(内联 width 残留时防溢出) */
3825
+ flex-shrink: 0;
3663
3826
  }
3664
3827
 
3665
3828
  /* ── 时间选择 ── */
@@ -3787,10 +3950,6 @@ body.wf-dragging {
3787
3950
  max-width: calc(100vw - 32px);
3788
3951
  }
3789
3952
 
3790
- .wf-datepicker-range-wrap {
3791
- max-width: calc(100vw - 32px);
3792
- }
3793
-
3794
3953
  /* range 双面板(240px×2 ≈ 500px)在 375px 屏溢出 → 窄屏纵向堆叠 */
3795
3954
  @media (max-width: 639px) {
3796
3955
  .wf-datepicker-range-wrap {
@@ -5431,6 +5590,95 @@ body.wf-dragging {
5431
5590
  }
5432
5591
  }
5433
5592
 
5593
+ /* weifuwu/components — JsonSchemaForm */
5594
+
5595
+ .wf-jsf {
5596
+ display: flex;
5597
+ flex-direction: column;
5598
+ gap: var(--wf-gap-md);
5599
+ font-family: var(--wf-font-sans);
5600
+ font-size: var(--wf-font-size-sm);
5601
+ line-height: var(--wf-line-height);
5602
+ }
5603
+
5604
+ .wf-jsf-title {
5605
+ font-weight: var(--wf-font-weight-semibold);
5606
+ color: var(--wf-color-text);
5607
+ }
5608
+
5609
+ /* 嵌套对象:左边线缩进(层级可读) */
5610
+ .wf-jsf-obj {
5611
+ display: flex;
5612
+ flex-direction: column;
5613
+ gap: var(--wf-gap-md);
5614
+ padding-left: var(--wf-gap-md);
5615
+ border-left: 1px solid var(--wf-color-border);
5616
+ }
5617
+
5618
+ .wf-jsf-obj-title {
5619
+ display: flex;
5620
+ align-items: center;
5621
+ justify-content: space-between;
5622
+ gap: var(--wf-gap-xs);
5623
+ font-weight: var(--wf-font-weight-medium);
5624
+ color: var(--wf-color-text);
5625
+ }
5626
+
5627
+ /* 数组:项 + 删除按钮横排 */
5628
+ .wf-jsf-arr {
5629
+ display: flex;
5630
+ flex-direction: column;
5631
+ gap: var(--wf-gap-sm);
5632
+ }
5633
+
5634
+ .wf-jsf-arr-item {
5635
+ display: flex;
5636
+ align-items: center;
5637
+ gap: var(--wf-gap-sm);
5638
+ }
5639
+
5640
+ .wf-jsf-arr-item > :first-child { flex: 1; }
5641
+
5642
+ /* 添加/删除按钮:小尺寸固定宽高(§5.6 小按钮纪律) */
5643
+ .wf-jsf-arr-add,
5644
+ .wf-jsf-arr-del {
5645
+ display: inline-flex;
5646
+ align-items: center;
5647
+ justify-content: center;
5648
+ width: 28px;
5649
+ height: 28px;
5650
+ min-width: 28px;
5651
+ max-width: 28px;
5652
+ min-height: 28px;
5653
+ max-height: 28px;
5654
+ padding: 0;
5655
+ line-height: 0;
5656
+ flex-shrink: 0;
5657
+ border: 1px solid var(--wf-color-border);
5658
+ border-radius: var(--wf-radius);
5659
+ background: var(--wf-color-bg-tertiary);
5660
+ color: var(--wf-color-text-secondary);
5661
+ cursor: pointer;
5662
+ transition: var(--wf-transition);
5663
+ }
5664
+
5665
+ .wf-jsf-arr-add:hover,
5666
+ .wf-jsf-arr-del:hover {
5667
+ border-color: var(--wf-color-primary);
5668
+ color: var(--wf-color-primary-text);
5669
+ }
5670
+
5671
+ .wf-jsf-arr-add:focus-visible,
5672
+ .wf-jsf-arr-del:focus-visible {
5673
+ outline: 2px solid var(--wf-color-primary);
5674
+ outline-offset: 1px;
5675
+ }
5676
+
5677
+ .wf-jsf-submit {
5678
+ align-self: flex-start;
5679
+ margin-top: var(--wf-gap-xs);
5680
+ }
5681
+
5434
5682
  .wf-kanban {
5435
5683
  display: flex;
5436
5684
  gap: 12px;
@@ -5940,11 +6188,14 @@ body.wf-dragging {
5940
6188
  }
5941
6189
  .wf-md-task-check {
5942
6190
  margin-top: 4px;
5943
- width: 16px;
5944
- height: 16px;
6191
+ width: 14px;
6192
+ height: 14px;
5945
6193
  flex-shrink: 0;
5946
6194
  accent-color: var(--wf-color-primary);
5947
6195
  cursor: default;
6196
+ /* 覆盖 _base.css input 全局 padding(12px 横向撑大 checkbox) */
6197
+ padding: 0;
6198
+ box-sizing: border-box;
5948
6199
  }
5949
6200
 
5950
6201
  /* GFM 表格 */
@@ -7293,6 +7544,72 @@ body.wf-dragging {
7293
7544
  flex-shrink: 0;
7294
7545
  }
7295
7546
 
7547
+ /* weifuwu/components — ReasoningBlock(CoT 推理折叠展示) */
7548
+
7549
+ .wf-reasoning {
7550
+ border: 1px solid var(--wf-color-border);
7551
+ border-radius: var(--wf-radius);
7552
+ background: var(--wf-color-bg-tertiary);
7553
+ font-family: var(--wf-font-sans);
7554
+ font-size: var(--wf-font-size-sm);
7555
+ line-height: var(--wf-line-height);
7556
+ }
7557
+
7558
+ .wf-reasoning-toggle {
7559
+ display: flex;
7560
+ align-items: center;
7561
+ gap: var(--wf-gap-xs);
7562
+ width: 100%;
7563
+ padding: var(--wf-gap-xs) var(--wf-gap-sm);
7564
+ background: none;
7565
+ border: none;
7566
+ cursor: pointer;
7567
+ color: var(--wf-color-text-secondary);
7568
+ font: inherit;
7569
+ text-align: left;
7570
+ }
7571
+
7572
+ .wf-reasoning-toggle:hover { color: var(--wf-color-text); }
7573
+
7574
+ .wf-reasoning-toggle:focus-visible {
7575
+ outline: 2px solid var(--wf-color-primary);
7576
+ outline-offset: -1px;
7577
+ border-radius: var(--wf-radius);
7578
+ }
7579
+
7580
+ .wf-reasoning-chevron {
7581
+ display: inline-flex;
7582
+ color: var(--wf-color-text-secondary);
7583
+ transition: transform var(--wf-dur-fast) var(--wf-ease-out);
7584
+ }
7585
+
7586
+ .wf-reasoning-chevron--open { transform: rotate(180deg); }
7587
+
7588
+ .wf-reasoning-label { font-weight: var(--wf-font-weight-medium); }
7589
+
7590
+ /* 流式指示点:脉冲动画 */
7591
+ .wf-reasoning-dot {
7592
+ width: 6px;
7593
+ height: 6px;
7594
+ min-width: 6px;
7595
+ min-height: 6px;
7596
+ border-radius: 50%;
7597
+ background: var(--wf-color-info-text);
7598
+ animation: wf-reasoning-pulse var(--wf-dur-slow) ease-in-out infinite;
7599
+ }
7600
+
7601
+ @keyframes wf-reasoning-pulse {
7602
+ 0%, 100% { opacity: 0.35; }
7603
+ 50% { opacity: 1; }
7604
+ }
7605
+
7606
+ .wf-reasoning-body {
7607
+ padding: var(--wf-gap-xs) var(--wf-gap-sm) var(--wf-gap-sm);
7608
+ color: var(--wf-color-text-secondary);
7609
+ white-space: pre-wrap;
7610
+ word-break: break-word;
7611
+ }
7612
+
7296
7613
  /* weifuwu/components — Resizable */
7297
7614
 
7298
7615
  .wf-resizable {
@@ -7663,6 +7980,16 @@ body.wf-dragging {
7663
7980
  cursor: pointer;
7664
7981
  transition: background 0.1s;
7665
7982
  }
7983
+
7984
+ /* 分组标题(optgroup):次级色小字,不可选 */
7985
+ .wf-select-search-group {
7986
+ padding: var(--wf-gap-xs) var(--wf-space) 2px;
7987
+ font-size: var(--wf-font-size-xs);
7988
+ color: var(--wf-color-text-secondary);
7989
+ font-weight: var(--wf-font-weight-medium);
7990
+ text-transform: var(--wf-heading-case); /* CJK 感知:中文 no-op */
7991
+ user-select: none;
7992
+ }
7666
7993
  .wf-select-search-opt:hover {
7667
7994
  background: var(--wf-color-bg-tertiary);
7668
7995
  }
@@ -7730,6 +8057,162 @@ body.wf-dragging {
7730
8057
  }
7731
8058
  }
7732
8059
 
8060
+ /* weifuwu/components — SessionList(会话管理列表) */
8061
+
8062
+ .wf-session {
8063
+ font-family: var(--wf-font-sans);
8064
+ font-size: var(--wf-font-size-sm);
8065
+ line-height: var(--wf-line-height);
8066
+ display: flex;
8067
+ flex-direction: column;
8068
+ gap: var(--wf-gap-sm);
8069
+ }
8070
+
8071
+ .wf-session-head {
8072
+ display: flex;
8073
+ align-items: center;
8074
+ gap: var(--wf-gap-xs);
8075
+ }
8076
+
8077
+ .wf-session-search {
8078
+ flex: 1;
8079
+ min-width: 0;
8080
+ padding: var(--wf-control-pad-y) var(--wf-gap-sm);
8081
+ border: var(--wf-border-width) solid var(--wf-color-border);
8082
+ border-radius: var(--wf-field-radius);
8083
+ background: var(--wf-color-bg);
8084
+ color: var(--wf-color-text);
8085
+ font: inherit;
8086
+ font-size: var(--wf-font-size-sm);
8087
+ }
8088
+
8089
+ .wf-session-search:focus-visible {
8090
+ outline: none;
8091
+ box-shadow: var(--wf-focus-ring);
8092
+ }
8093
+
8094
+ .wf-session-new { flex-shrink: 0; }
8095
+
8096
+ .wf-session-list {
8097
+ display: flex;
8098
+ flex-direction: column;
8099
+ outline: none;
8100
+ }
8101
+
8102
+ .wf-session-group-title {
8103
+ padding: var(--wf-gap-xs) var(--wf-gap-xs) 2px;
8104
+ font-size: var(--wf-font-size-xs);
8105
+ color: var(--wf-color-text-tertiary);
8106
+ font-weight: var(--wf-font-weight-medium);
8107
+ text-transform: var(--wf-heading-case); /* CJK 感知:中文 no-op */
8108
+ user-select: none;
8109
+ }
8110
+
8111
+ .wf-session-item {
8112
+ display: flex;
8113
+ align-items: center;
8114
+ gap: var(--wf-gap-xs);
8115
+ padding: var(--wf-gap-xs) var(--wf-gap-sm);
8116
+ border-radius: var(--wf-radius-sm);
8117
+ cursor: pointer;
8118
+ color: var(--wf-color-text);
8119
+ min-height: 32px;
8120
+ }
8121
+
8122
+ .wf-session-item:hover { background: var(--wf-color-bg-tertiary); }
8123
+
8124
+ .wf-session-item--focus { background: var(--wf-color-bg-tertiary); }
8125
+
8126
+ .wf-session-item--active {
8127
+ background: var(--wf-color-primary-bg);
8128
+ color: var(--wf-color-primary-text);
8129
+ font-weight: var(--wf-font-weight-medium);
8130
+ }
8131
+
8132
+ .wf-session-item--active:hover { background: var(--wf-color-primary-bg); }
8133
+
8134
+ .wf-session-title {
8135
+ flex: 1;
8136
+ min-width: 0;
8137
+ overflow: hidden;
8138
+ text-overflow: ellipsis;
8139
+ white-space: nowrap;
8140
+ }
8141
+
8142
+ /* 行内操作按钮:悬停才显示(默认透明) */
8143
+ .wf-session-rename,
8144
+ .wf-session-del {
8145
+ display: inline-flex;
8146
+ align-items: center;
8147
+ justify-content: center;
8148
+ width: 22px;
8149
+ height: 22px;
8150
+ min-width: 22px;
8151
+ min-height: 22px;
8152
+ padding: 0;
8153
+ line-height: 0;
8154
+ border: none;
8155
+ border-radius: var(--wf-radius-sm);
8156
+ background: none;
8157
+ color: var(--wf-color-text-tertiary);
8158
+ cursor: pointer;
8159
+ opacity: 0;
8160
+ flex-shrink: 0;
8161
+ transition: opacity var(--wf-dur-fast) var(--wf-ease-out);
8162
+ }
8163
+
8164
+ .wf-session-item:hover .wf-session-rename,
8165
+ .wf-session-item:hover .wf-session-del,
8166
+ .wf-session-rename:focus-visible,
8167
+ .wf-session-del:focus-visible {
8168
+ opacity: 1;
8169
+ }
8170
+
8171
+ .wf-session-rename:hover { color: var(--wf-color-info-text); }
8172
+ .wf-session-del:hover { color: var(--wf-color-error-text); }
8173
+
8174
+ .wf-session-rename:focus-visible,
8175
+ .wf-session-del:focus-visible {
8176
+ outline: 2px solid var(--wf-color-primary);
8177
+ outline-offset: 1px;
8178
+ }
8179
+
8180
+ /* 重命名输入行 */
8181
+ .wf-session-item--rename {
8182
+ cursor: default;
8183
+ }
8184
+
8185
+ .wf-session-rename-input {
8186
+ flex: 1;
8187
+ min-width: 0;
8188
+ padding: 2px var(--wf-gap-xs);
8189
+ border: var(--wf-border-width) solid var(--wf-color-primary);
8190
+ border-radius: var(--wf-radius-sm);
8191
+ background: var(--wf-color-bg);
8192
+ color: var(--wf-color-text);
8193
+ font: inherit;
8194
+ font-size: var(--wf-font-size-sm);
8195
+ }
8196
+
8197
+ .wf-session-rename-input:focus-visible {
8198
+ outline: none;
8199
+ box-shadow: var(--wf-focus-ring);
8200
+ }
8201
+
8202
+ .wf-session-empty {
8203
+ padding: var(--wf-gap-md) var(--wf-gap-sm);
8204
+ text-align: center;
8205
+ color: var(--wf-color-text-tertiary);
8206
+ font-size: var(--wf-font-size-xs);
8207
+ }
8208
+
8209
+ /* 触屏(coarse):44px 命中区 */
8210
+ @media (pointer: coarse) {
8211
+ .wf-session-item { min-height: 44px; }
8212
+ .wf-session-rename,
8213
+ .wf-session-del { opacity: 1; width: 28px; height: 28px; }
8214
+ }
8215
+
7733
8216
  /* weifuwu/components — Skeleton */
7734
8217
 
7735
8218
  .wf-skeleton {
@@ -8163,6 +8646,61 @@ body.wf-dragging {
8163
8646
  color: var(--wf-color-text-tertiary);
8164
8647
  }
8165
8648
 
8649
+ /* ── 行选择 checkbox(对齐 VirtualTable/Tree 三态视觉——原生 input 需覆盖
8650
+ _base.css 全局 input padding,否则 12px 横向 padding 撑大 checkbox) ── */
8651
+ .wf-table-checkbox {
8652
+ width: 14px;
8653
+ height: 14px;
8654
+ cursor: pointer;
8655
+ accent-color: var(--wf-color-primary);
8656
+ appearance: none;
8657
+ -webkit-appearance: none;
8658
+ margin: 0;
8659
+ padding: 0;
8660
+ border: var(--wf-border-width) solid var(--wf-color-border);
8661
+ border-radius: var(--wf-radius-sm);
8662
+ background: var(--wf-color-bg);
8663
+ position: relative;
8664
+ box-sizing: border-box;
8665
+ flex-shrink: 0;
8666
+ }
8667
+
8668
+ .wf-table-checkbox:checked {
8669
+ background: var(--wf-color-primary);
8670
+ border-color: var(--wf-color-primary);
8671
+ }
8672
+ .wf-table-checkbox:checked::after {
8673
+ content: '';
8674
+ position: absolute;
8675
+ top: 50%;
8676
+ left: 50%;
8677
+ width: 8px;
8678
+ height: 4px;
8679
+ border-left: 2px solid var(--wf-color-on-brand);
8680
+ border-bottom: 2px solid var(--wf-color-on-brand);
8681
+ transform: translate(-50%, -60%) rotate(-45deg);
8682
+ }
8683
+
8684
+ .wf-table-checkbox:indeterminate {
8685
+ background: var(--wf-color-primary);
8686
+ border-color: var(--wf-color-primary);
8687
+ }
8688
+ .wf-table-checkbox:indeterminate::after {
8689
+ content: '';
8690
+ position: absolute;
8691
+ top: 50%;
8692
+ left: 50%;
8693
+ width: 6px;
8694
+ height: 2px;
8695
+ background: var(--wf-color-on-brand);
8696
+ transform: translate(-50%, -50%);
8697
+ }
8698
+
8699
+ .wf-table-checkbox:focus-visible {
8700
+ outline: none;
8701
+ box-shadow: var(--wf-focus-ring);
8702
+ }
8703
+
8166
8704
  /* weifuwu/components — Tabs */
8167
8705
 
8168
8706
  .wf-tabs {
@@ -9580,10 +10118,60 @@ body.wf-dragging {
9580
10118
  flex-shrink: 0;
9581
10119
  }
9582
10120
  .wf-virtual-table-check {
9583
- width: 16px;
9584
- height: 16px;
10121
+ width: 14px;
10122
+ height: 14px;
9585
10123
  cursor: pointer;
9586
10124
  accent-color: var(--wf-color-primary);
10125
+ /* 对齐 Tree 三态视觉(原生 indeterminate 横线浅灰不明显):
10126
+ 半选态 = primary 背景 + on-brand 横线 */
10127
+ appearance: none;
10128
+ -webkit-appearance: none;
10129
+ margin: 0;
10130
+ padding: 0; /* 覆盖 _base.css input 全局 padding(12px 横向撑大 checkbox) */
10131
+ border: var(--wf-border-width) solid var(--wf-color-border);
10132
+ border-radius: var(--wf-radius-sm);
10133
+ background: var(--wf-color-bg);
10134
+ position: relative;
10135
+ box-sizing: border-box;
10136
+ flex-shrink: 0;
10137
+ }
10138
+
10139
+ /* 选中(全选/行勾选):primary 背景 + 白勾 */
10140
+ .wf-virtual-table-check:checked {
10141
+ background: var(--wf-color-primary);
10142
+ border-color: var(--wf-color-primary);
10143
+ }
10144
+ .wf-virtual-table-check:checked::after {
10145
+ content: '';
10146
+ position: absolute;
10147
+ top: 50%;
10148
+ left: 50%;
10149
+ width: 8px;
10150
+ height: 4px;
10151
+ border-left: 2px solid var(--wf-color-on-brand);
10152
+ border-bottom: 2px solid var(--wf-color-on-brand);
10153
+ transform: translate(-50%, -60%) rotate(-45deg);
10154
+ }
10155
+
10156
+ /* 半选(部分行选中):primary 背景 + on-brand 横线 */
10157
+ .wf-virtual-table-check:indeterminate {
10158
+ background: var(--wf-color-primary);
10159
+ border-color: var(--wf-color-primary);
10160
+ }
10161
+ .wf-virtual-table-check:indeterminate::after {
10162
+ content: '';
10163
+ position: absolute;
10164
+ top: 50%;
10165
+ left: 50%;
10166
+ width: 6px;
10167
+ height: 2px;
10168
+ background: var(--wf-color-on-brand);
10169
+ transform: translate(-50%, -50%);
10170
+ }
10171
+
10172
+ .wf-virtual-table-check:focus-visible {
10173
+ outline: none;
10174
+ box-shadow: var(--wf-focus-ring);
9587
10175
  }
9588
10176
 
9589
10177
  /* weifuwu/components — Watermark */