weifuwu 0.74.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 (86) hide show
  1. package/README.md +20 -20
  2. package/dist/ai/types.d.ts +3 -1
  3. package/dist/components/AiChat/AiChat.d.ts +5 -1
  4. package/dist/components/ApprovalCard/ApprovalCard.d.ts +5 -2
  5. package/dist/components/Button/Button.d.ts +2 -0
  6. package/dist/components/CitationCard/CitationCard.d.ts +38 -0
  7. package/dist/components/Command/Command.d.ts +1 -1
  8. package/dist/components/JsonSchemaForm/JsonSchemaForm.d.ts +48 -0
  9. package/dist/components/ReasoningBlock/ReasoningBlock.d.ts +25 -0
  10. package/dist/components/Select/Select.d.ts +11 -1
  11. package/dist/components/SessionList/SessionList.d.ts +42 -0
  12. package/dist/components/TreeSelect/TreeSelect.d.ts +3 -2
  13. package/dist/components/index.d.ts +10 -2
  14. package/dist/components/index.js +14 -14
  15. package/dist/components/style.css +608 -20
  16. package/dist/index.d.ts +0 -2
  17. package/dist/index.js +141 -433
  18. package/dist/layout/weifuwu-layout.css +9 -0
  19. package/dist/test/client/setup.d.ts +12 -0
  20. package/dist/ui/index.d.ts +3 -3
  21. package/dist/ui-dom/Confirm.d.ts +5 -41
  22. package/dist/ui-dom/Notification.d.ts +8 -70
  23. package/dist/ui-dom/Toast.d.ts +8 -43
  24. package/dist/ui-dom/ai.d.ts +1 -1
  25. package/dist/ui-dom/browser.d.ts +1 -1
  26. package/dist/ui-dom/focus-trap.d.ts +1 -1
  27. package/dist/ui-dom/hooks/chat.d.ts +11 -0
  28. package/dist/ui-dom/hooks/events.d.ts +30 -0
  29. package/dist/ui-dom/hooks/external.d.ts +20 -0
  30. package/dist/ui-dom/hooks/index.d.ts +31 -0
  31. package/dist/ui-dom/hooks/input.d.ts +33 -0
  32. package/dist/ui-dom/hooks/media.d.ts +17 -0
  33. package/dist/ui-dom/hooks/popup.d.ts +37 -0
  34. package/dist/ui-dom/hooks/stable.d.ts +39 -0
  35. package/dist/ui-dom/hooks/test/hooks.test.d.ts +1 -0
  36. package/dist/ui-dom/hooks/types.d.ts +78 -0
  37. package/dist/ui-dom/index.d.ts +19 -17
  38. package/dist/ui-dom/index.js +12 -10
  39. package/dist/ui-dom/jsx-runtime.js +1 -1
  40. package/dist/ui-dom/middleware/api.d.ts +3 -3
  41. package/dist/ui-dom/middleware/auth.d.ts +1 -1
  42. package/dist/ui-dom/motion.d.ts +1 -1
  43. package/dist/ui-dom/popup.d.ts +1 -1
  44. package/dist/ui-dom/scroll-lock.d.ts +1 -1
  45. package/dist/ui-dom/store.d.ts +24 -0
  46. package/dist/ui-dom/testing.d.ts +74 -0
  47. package/dist/ui-dom/testing.js +1 -0
  48. package/dist/ui-dom/testing.test.d.ts +1 -0
  49. package/dist/ui-dom/types.d.ts +34 -17
  50. package/dist/ui-dom/use-chat.d.ts +19 -14
  51. package/dist/ui-dom/vdom/build.d.ts +34 -0
  52. package/dist/ui-dom/vdom/diff.d.ts +34 -0
  53. package/dist/ui-dom/vdom/hydration.d.ts +17 -0
  54. package/dist/ui-dom/vdom/index.d.ts +23 -0
  55. package/dist/ui-dom/vdom/mount.d.ts +49 -0
  56. package/dist/ui-dom/vdom/registry.d.ts +27 -0
  57. package/dist/ui-dom/vdom/render.d.ts +13 -0
  58. package/dist/ui-dom/vdom/scheduler.d.ts +13 -0
  59. package/dist/ui-dom/vdom/serve.d.ts +30 -0
  60. package/dist/ui-dom/vdom/ssr.d.ts +44 -0
  61. package/dist/ui-dom/vnode.d.ts +11 -44
  62. package/dist/user/token.d.ts +1 -1
  63. package/docs/compat-three-library.md +1 -1
  64. package/docs/components-map.md +19 -2
  65. package/docs/components.md +9 -4
  66. package/docs/custom-components.md +19 -14
  67. package/docs/data.md +16 -33
  68. package/docs/environment.md +1 -1
  69. package/docs/frontend-middleware.md +65 -79
  70. package/docs/frontend-ui-dom.md +4 -2
  71. package/docs/frontend.md +35 -38
  72. package/docs/layout.md +2 -2
  73. package/docs/realtime.md +23 -28
  74. package/docs/saas.md +8 -6
  75. package/package.json +5 -1
  76. package/dist/ui/ssr-page.d.ts +0 -41
  77. package/dist/ui/ssr.d.ts +0 -35
  78. package/dist/ui-dom/diff.d.ts +0 -28
  79. package/dist/ui-dom/hydration.d.ts +0 -13
  80. package/dist/ui-dom/reactive.d.ts +0 -6
  81. package/dist/ui-dom/registry.d.ts +0 -39
  82. package/dist/ui-dom/render.d.ts +0 -46
  83. package/dist/ui-dom/route-match.d.ts +0 -22
  84. package/dist/ui-dom/serve.d.ts +0 -28
  85. package/dist/ui-dom/ssr.d.ts +0 -56
  86. 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 */