weifuwu 0.75.0 → 0.77.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 (75) hide show
  1. package/README.md +48 -53
  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/DatePicker/DatePicker.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/Tour/Tour.d.ts +1 -1
  13. package/dist/components/TreeSelect/TreeSelect.d.ts +3 -2
  14. package/dist/components/index.d.ts +10 -2
  15. package/dist/components/index.js +14 -14
  16. package/dist/components/style.css +625 -20
  17. package/dist/index.js +1349 -1529
  18. package/dist/layout/weifuwu-layout.css +9 -0
  19. package/dist/scheduler/index.d.ts +7 -2
  20. package/dist/test/client/setup.d.ts +12 -0
  21. package/dist/ui/index.d.ts +2 -2
  22. package/dist/ui-dom/Confirm.d.ts +5 -41
  23. package/dist/ui-dom/Notification.d.ts +8 -70
  24. package/dist/ui-dom/Toast.d.ts +8 -43
  25. package/dist/ui-dom/hooks/chat.d.ts +11 -0
  26. package/dist/ui-dom/hooks/events.d.ts +30 -0
  27. package/dist/ui-dom/hooks/external.d.ts +20 -0
  28. package/dist/ui-dom/hooks/index.d.ts +30 -0
  29. package/dist/ui-dom/hooks/input.d.ts +33 -0
  30. package/dist/ui-dom/hooks/media.d.ts +17 -0
  31. package/dist/ui-dom/hooks/popup.d.ts +28 -0
  32. package/dist/ui-dom/hooks/stable.d.ts +39 -0
  33. package/dist/ui-dom/hooks/test/hooks.test.d.ts +1 -0
  34. package/dist/ui-dom/hooks/types.d.ts +77 -0
  35. package/dist/ui-dom/index.d.ts +19 -17
  36. package/dist/ui-dom/index.js +11 -11
  37. package/dist/ui-dom/jsx-runtime.js +1 -1
  38. package/dist/ui-dom/store.d.ts +24 -0
  39. package/dist/ui-dom/testing.d.ts +74 -0
  40. package/dist/ui-dom/testing.js +1 -0
  41. package/dist/ui-dom/testing.test.d.ts +1 -0
  42. package/dist/ui-dom/types.d.ts +55 -50
  43. package/dist/ui-dom/use-chat.d.ts +19 -14
  44. package/dist/ui-dom/vdom/build.d.ts +41 -0
  45. package/dist/ui-dom/vdom/diff.d.ts +33 -0
  46. package/dist/ui-dom/vdom/hydration.d.ts +17 -0
  47. package/dist/ui-dom/vdom/index.d.ts +23 -0
  48. package/dist/ui-dom/vdom/mount.d.ts +58 -0
  49. package/dist/ui-dom/vdom/registry.d.ts +27 -0
  50. package/dist/ui-dom/vdom/render.d.ts +15 -0
  51. package/dist/ui-dom/vdom/serve.d.ts +30 -0
  52. package/dist/ui-dom/vdom/ssr.d.ts +44 -0
  53. package/dist/ui-dom/vnode.d.ts +19 -31
  54. package/docs/components-map.md +18 -1
  55. package/docs/components.md +12 -7
  56. package/docs/custom-components.md +90 -60
  57. package/docs/examples.md +35 -41
  58. package/docs/frontend-middleware.md +3 -4
  59. package/docs/frontend-ui-dom.md +21 -18
  60. package/docs/frontend.md +243 -168
  61. package/docs/layout.md +2 -2
  62. package/docs/mobile.md +2 -2
  63. package/docs/realtime.md +8 -3
  64. package/package.json +5 -1
  65. package/dist/ui/ssr.d.ts +0 -35
  66. package/dist/ui-dom/diff.d.ts +0 -28
  67. package/dist/ui-dom/focus-trap.d.ts +0 -4
  68. package/dist/ui-dom/hydration.d.ts +0 -13
  69. package/dist/ui-dom/reactive.d.ts +0 -6
  70. package/dist/ui-dom/registry.d.ts +0 -27
  71. package/dist/ui-dom/render.d.ts +0 -46
  72. package/dist/ui-dom/scroll-lock.d.ts +0 -5
  73. package/dist/ui-dom/serve.d.ts +0 -28
  74. package/dist/ui-dom/ssr.d.ts +0 -57
  75. 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 {
@@ -3388,6 +3546,12 @@ body.wf-dragging {
3388
3546
 
3389
3547
  /* weifuwu/components — ContextMenu */
3390
3548
 
3549
+ .wf-context-menu-trigger {
3550
+ /* 锚定容器收缩(flex 父容器 blockify 兜底——同 Dropdown) */
3551
+ display: inline-block;
3552
+ width: fit-content;
3553
+ }
3554
+
3391
3555
  .wf-context-menu {
3392
3556
  position: fixed;
3393
3557
  z-index: var(--wf-z-popover);
@@ -3656,10 +3820,15 @@ body.wf-dragging {
3656
3820
  user-select: none;
3657
3821
  animation: wf-panel-in var(--wf-dur-fast) var(--wf-ease-out);
3658
3822
  transform-origin: top center;
3823
+ /* 宽度自适应内容(双面板 2×240 + gap)——不被容器/trigger 压缩 */
3824
+ width: max-content;
3825
+ max-width: calc(100vw - 32px);
3659
3826
  }
3660
3827
 
3661
3828
  .wf-datepicker-range-panel {
3662
- min-width: var(--wf-datepicker-time-width, 240px);
3829
+ min-width: var(--wf-datepicker-time-width, 240px);
3830
+ /* flex 子项不压缩——面板保持自身宽度(内联 width 残留时防溢出) */
3831
+ flex-shrink: 0;
3663
3832
  }
3664
3833
 
3665
3834
  /* ── 时间选择 ── */
@@ -3787,10 +3956,6 @@ body.wf-dragging {
3787
3956
  max-width: calc(100vw - 32px);
3788
3957
  }
3789
3958
 
3790
- .wf-datepicker-range-wrap {
3791
- max-width: calc(100vw - 32px);
3792
- }
3793
-
3794
3959
  /* range 双面板(240px×2 ≈ 500px)在 375px 屏溢出 → 窄屏纵向堆叠 */
3795
3960
  @media (max-width: 639px) {
3796
3961
  .wf-datepicker-range-wrap {
@@ -4153,7 +4318,10 @@ body.wf-dragging {
4153
4318
  /* weifuwu/components — Dropdown */
4154
4319
 
4155
4320
  .wf-dropdown {
4321
+ /* inline-block 在 flex 父容器(flex item blockify)下失效——fit-content 兜底收缩
4322
+ (真实事故:AdminLayout .wf-stack 里 wrap 全宽 1120 → 弹层居中于容器而非按钮) */
4156
4323
  display: inline-block;
4324
+ width: fit-content;
4157
4325
  }
4158
4326
 
4159
4327
  .wf-dropdown-menu {
@@ -4943,6 +5111,12 @@ body.wf-dragging {
4943
5111
 
4944
5112
  /* weifuwu/components — HoverCard */
4945
5113
 
5114
+ .wf-hover-card-wrap {
5115
+ /* 锚定容器收缩(flex 父容器 blockify 兜底——同 Dropdown) */
5116
+ display: inline-block;
5117
+ width: fit-content;
5118
+ }
5119
+
4946
5120
  .wf-hover-card {
4947
5121
  position: fixed;
4948
5122
  z-index: var(--wf-z-tooltip);
@@ -5431,6 +5605,95 @@ body.wf-dragging {
5431
5605
  }
5432
5606
  }
5433
5607
 
5608
+ /* weifuwu/components — JsonSchemaForm */
5609
+
5610
+ .wf-jsf {
5611
+ display: flex;
5612
+ flex-direction: column;
5613
+ gap: var(--wf-gap-md);
5614
+ font-family: var(--wf-font-sans);
5615
+ font-size: var(--wf-font-size-sm);
5616
+ line-height: var(--wf-line-height);
5617
+ }
5618
+
5619
+ .wf-jsf-title {
5620
+ font-weight: var(--wf-font-weight-semibold);
5621
+ color: var(--wf-color-text);
5622
+ }
5623
+
5624
+ /* 嵌套对象:左边线缩进(层级可读) */
5625
+ .wf-jsf-obj {
5626
+ display: flex;
5627
+ flex-direction: column;
5628
+ gap: var(--wf-gap-md);
5629
+ padding-left: var(--wf-gap-md);
5630
+ border-left: 1px solid var(--wf-color-border);
5631
+ }
5632
+
5633
+ .wf-jsf-obj-title {
5634
+ display: flex;
5635
+ align-items: center;
5636
+ justify-content: space-between;
5637
+ gap: var(--wf-gap-xs);
5638
+ font-weight: var(--wf-font-weight-medium);
5639
+ color: var(--wf-color-text);
5640
+ }
5641
+
5642
+ /* 数组:项 + 删除按钮横排 */
5643
+ .wf-jsf-arr {
5644
+ display: flex;
5645
+ flex-direction: column;
5646
+ gap: var(--wf-gap-sm);
5647
+ }
5648
+
5649
+ .wf-jsf-arr-item {
5650
+ display: flex;
5651
+ align-items: center;
5652
+ gap: var(--wf-gap-sm);
5653
+ }
5654
+
5655
+ .wf-jsf-arr-item > :first-child { flex: 1; }
5656
+
5657
+ /* 添加/删除按钮:小尺寸固定宽高(§5.6 小按钮纪律) */
5658
+ .wf-jsf-arr-add,
5659
+ .wf-jsf-arr-del {
5660
+ display: inline-flex;
5661
+ align-items: center;
5662
+ justify-content: center;
5663
+ width: 28px;
5664
+ height: 28px;
5665
+ min-width: 28px;
5666
+ max-width: 28px;
5667
+ min-height: 28px;
5668
+ max-height: 28px;
5669
+ padding: 0;
5670
+ line-height: 0;
5671
+ flex-shrink: 0;
5672
+ border: 1px solid var(--wf-color-border);
5673
+ border-radius: var(--wf-radius);
5674
+ background: var(--wf-color-bg-tertiary);
5675
+ color: var(--wf-color-text-secondary);
5676
+ cursor: pointer;
5677
+ transition: var(--wf-transition);
5678
+ }
5679
+
5680
+ .wf-jsf-arr-add:hover,
5681
+ .wf-jsf-arr-del:hover {
5682
+ border-color: var(--wf-color-primary);
5683
+ color: var(--wf-color-primary-text);
5684
+ }
5685
+
5686
+ .wf-jsf-arr-add:focus-visible,
5687
+ .wf-jsf-arr-del:focus-visible {
5688
+ outline: 2px solid var(--wf-color-primary);
5689
+ outline-offset: 1px;
5690
+ }
5691
+
5692
+ .wf-jsf-submit {
5693
+ align-self: flex-start;
5694
+ margin-top: var(--wf-gap-xs);
5695
+ }
5696
+
5434
5697
  .wf-kanban {
5435
5698
  display: flex;
5436
5699
  gap: 12px;
@@ -5940,11 +6203,14 @@ body.wf-dragging {
5940
6203
  }
5941
6204
  .wf-md-task-check {
5942
6205
  margin-top: 4px;
5943
- width: 16px;
5944
- height: 16px;
6206
+ width: 14px;
6207
+ height: 14px;
5945
6208
  flex-shrink: 0;
5946
6209
  accent-color: var(--wf-color-primary);
5947
6210
  cursor: default;
6211
+ /* 覆盖 _base.css input 全局 padding(12px 横向撑大 checkbox) */
6212
+ padding: 0;
6213
+ box-sizing: border-box;
5948
6214
  }
5949
6215
 
5950
6216
  /* GFM 表格 */
@@ -7293,6 +7559,72 @@ body.wf-dragging {
7293
7559
  flex-shrink: 0;
7294
7560
  }
7295
7561
 
7562
+ /* weifuwu/components — ReasoningBlock(CoT 推理折叠展示) */
7563
+
7564
+ .wf-reasoning {
7565
+ border: 1px solid var(--wf-color-border);
7566
+ border-radius: var(--wf-radius);
7567
+ background: var(--wf-color-bg-tertiary);
7568
+ font-family: var(--wf-font-sans);
7569
+ font-size: var(--wf-font-size-sm);
7570
+ line-height: var(--wf-line-height);
7571
+ }
7572
+
7573
+ .wf-reasoning-toggle {
7574
+ display: flex;
7575
+ align-items: center;
7576
+ gap: var(--wf-gap-xs);
7577
+ width: 100%;
7578
+ padding: var(--wf-gap-xs) var(--wf-gap-sm);
7579
+ background: none;
7580
+ border: none;
7581
+ cursor: pointer;
7582
+ color: var(--wf-color-text-secondary);
7583
+ font: inherit;
7584
+ text-align: left;
7585
+ }
7586
+
7587
+ .wf-reasoning-toggle:hover { color: var(--wf-color-text); }
7588
+
7589
+ .wf-reasoning-toggle:focus-visible {
7590
+ outline: 2px solid var(--wf-color-primary);
7591
+ outline-offset: -1px;
7592
+ border-radius: var(--wf-radius);
7593
+ }
7594
+
7595
+ .wf-reasoning-chevron {
7596
+ display: inline-flex;
7597
+ color: var(--wf-color-text-secondary);
7598
+ transition: transform var(--wf-dur-fast) var(--wf-ease-out);
7599
+ }
7600
+
7601
+ .wf-reasoning-chevron--open { transform: rotate(180deg); }
7602
+
7603
+ .wf-reasoning-label { font-weight: var(--wf-font-weight-medium); }
7604
+
7605
+ /* 流式指示点:脉冲动画 */
7606
+ .wf-reasoning-dot {
7607
+ width: 6px;
7608
+ height: 6px;
7609
+ min-width: 6px;
7610
+ min-height: 6px;
7611
+ border-radius: 50%;
7612
+ background: var(--wf-color-info-text);
7613
+ animation: wf-reasoning-pulse var(--wf-dur-slow) ease-in-out infinite;
7614
+ }
7615
+
7616
+ @keyframes wf-reasoning-pulse {
7617
+ 0%, 100% { opacity: 0.35; }
7618
+ 50% { opacity: 1; }
7619
+ }
7620
+
7621
+ .wf-reasoning-body {
7622
+ padding: var(--wf-gap-xs) var(--wf-gap-sm) var(--wf-gap-sm);
7623
+ color: var(--wf-color-text-secondary);
7624
+ white-space: pre-wrap;
7625
+ word-break: break-word;
7626
+ }
7627
+
7296
7628
  /* weifuwu/components — Resizable */
7297
7629
 
7298
7630
  .wf-resizable {
@@ -7663,6 +7995,16 @@ body.wf-dragging {
7663
7995
  cursor: pointer;
7664
7996
  transition: background 0.1s;
7665
7997
  }
7998
+
7999
+ /* 分组标题(optgroup):次级色小字,不可选 */
8000
+ .wf-select-search-group {
8001
+ padding: var(--wf-gap-xs) var(--wf-space) 2px;
8002
+ font-size: var(--wf-font-size-xs);
8003
+ color: var(--wf-color-text-secondary);
8004
+ font-weight: var(--wf-font-weight-medium);
8005
+ text-transform: var(--wf-heading-case); /* CJK 感知:中文 no-op */
8006
+ user-select: none;
8007
+ }
7666
8008
  .wf-select-search-opt:hover {
7667
8009
  background: var(--wf-color-bg-tertiary);
7668
8010
  }
@@ -7730,6 +8072,162 @@ body.wf-dragging {
7730
8072
  }
7731
8073
  }
7732
8074
 
8075
+ /* weifuwu/components — SessionList(会话管理列表) */
8076
+
8077
+ .wf-session {
8078
+ font-family: var(--wf-font-sans);
8079
+ font-size: var(--wf-font-size-sm);
8080
+ line-height: var(--wf-line-height);
8081
+ display: flex;
8082
+ flex-direction: column;
8083
+ gap: var(--wf-gap-sm);
8084
+ }
8085
+
8086
+ .wf-session-head {
8087
+ display: flex;
8088
+ align-items: center;
8089
+ gap: var(--wf-gap-xs);
8090
+ }
8091
+
8092
+ .wf-session-search {
8093
+ flex: 1;
8094
+ min-width: 0;
8095
+ padding: var(--wf-control-pad-y) var(--wf-gap-sm);
8096
+ border: var(--wf-border-width) solid var(--wf-color-border);
8097
+ border-radius: var(--wf-field-radius);
8098
+ background: var(--wf-color-bg);
8099
+ color: var(--wf-color-text);
8100
+ font: inherit;
8101
+ font-size: var(--wf-font-size-sm);
8102
+ }
8103
+
8104
+ .wf-session-search:focus-visible {
8105
+ outline: none;
8106
+ box-shadow: var(--wf-focus-ring);
8107
+ }
8108
+
8109
+ .wf-session-new { flex-shrink: 0; }
8110
+
8111
+ .wf-session-list {
8112
+ display: flex;
8113
+ flex-direction: column;
8114
+ outline: none;
8115
+ }
8116
+
8117
+ .wf-session-group-title {
8118
+ padding: var(--wf-gap-xs) var(--wf-gap-xs) 2px;
8119
+ font-size: var(--wf-font-size-xs);
8120
+ color: var(--wf-color-text-tertiary);
8121
+ font-weight: var(--wf-font-weight-medium);
8122
+ text-transform: var(--wf-heading-case); /* CJK 感知:中文 no-op */
8123
+ user-select: none;
8124
+ }
8125
+
8126
+ .wf-session-item {
8127
+ display: flex;
8128
+ align-items: center;
8129
+ gap: var(--wf-gap-xs);
8130
+ padding: var(--wf-gap-xs) var(--wf-gap-sm);
8131
+ border-radius: var(--wf-radius-sm);
8132
+ cursor: pointer;
8133
+ color: var(--wf-color-text);
8134
+ min-height: 32px;
8135
+ }
8136
+
8137
+ .wf-session-item:hover { background: var(--wf-color-bg-tertiary); }
8138
+
8139
+ .wf-session-item--focus { background: var(--wf-color-bg-tertiary); }
8140
+
8141
+ .wf-session-item--active {
8142
+ background: var(--wf-color-primary-bg);
8143
+ color: var(--wf-color-primary-text);
8144
+ font-weight: var(--wf-font-weight-medium);
8145
+ }
8146
+
8147
+ .wf-session-item--active:hover { background: var(--wf-color-primary-bg); }
8148
+
8149
+ .wf-session-title {
8150
+ flex: 1;
8151
+ min-width: 0;
8152
+ overflow: hidden;
8153
+ text-overflow: ellipsis;
8154
+ white-space: nowrap;
8155
+ }
8156
+
8157
+ /* 行内操作按钮:悬停才显示(默认透明) */
8158
+ .wf-session-rename,
8159
+ .wf-session-del {
8160
+ display: inline-flex;
8161
+ align-items: center;
8162
+ justify-content: center;
8163
+ width: 22px;
8164
+ height: 22px;
8165
+ min-width: 22px;
8166
+ min-height: 22px;
8167
+ padding: 0;
8168
+ line-height: 0;
8169
+ border: none;
8170
+ border-radius: var(--wf-radius-sm);
8171
+ background: none;
8172
+ color: var(--wf-color-text-tertiary);
8173
+ cursor: pointer;
8174
+ opacity: 0;
8175
+ flex-shrink: 0;
8176
+ transition: opacity var(--wf-dur-fast) var(--wf-ease-out);
8177
+ }
8178
+
8179
+ .wf-session-item:hover .wf-session-rename,
8180
+ .wf-session-item:hover .wf-session-del,
8181
+ .wf-session-rename:focus-visible,
8182
+ .wf-session-del:focus-visible {
8183
+ opacity: 1;
8184
+ }
8185
+
8186
+ .wf-session-rename:hover { color: var(--wf-color-info-text); }
8187
+ .wf-session-del:hover { color: var(--wf-color-error-text); }
8188
+
8189
+ .wf-session-rename:focus-visible,
8190
+ .wf-session-del:focus-visible {
8191
+ outline: 2px solid var(--wf-color-primary);
8192
+ outline-offset: 1px;
8193
+ }
8194
+
8195
+ /* 重命名输入行 */
8196
+ .wf-session-item--rename {
8197
+ cursor: default;
8198
+ }
8199
+
8200
+ .wf-session-rename-input {
8201
+ flex: 1;
8202
+ min-width: 0;
8203
+ padding: 2px var(--wf-gap-xs);
8204
+ border: var(--wf-border-width) solid var(--wf-color-primary);
8205
+ border-radius: var(--wf-radius-sm);
8206
+ background: var(--wf-color-bg);
8207
+ color: var(--wf-color-text);
8208
+ font: inherit;
8209
+ font-size: var(--wf-font-size-sm);
8210
+ }
8211
+
8212
+ .wf-session-rename-input:focus-visible {
8213
+ outline: none;
8214
+ box-shadow: var(--wf-focus-ring);
8215
+ }
8216
+
8217
+ .wf-session-empty {
8218
+ padding: var(--wf-gap-md) var(--wf-gap-sm);
8219
+ text-align: center;
8220
+ color: var(--wf-color-text-tertiary);
8221
+ font-size: var(--wf-font-size-xs);
8222
+ }
8223
+
8224
+ /* 触屏(coarse):44px 命中区 */
8225
+ @media (pointer: coarse) {
8226
+ .wf-session-item { min-height: 44px; }
8227
+ .wf-session-rename,
8228
+ .wf-session-del { opacity: 1; width: 28px; height: 28px; }
8229
+ }
8230
+
7733
8231
  /* weifuwu/components — Skeleton */
7734
8232
 
7735
8233
  .wf-skeleton {
@@ -8163,6 +8661,61 @@ body.wf-dragging {
8163
8661
  color: var(--wf-color-text-tertiary);
8164
8662
  }
8165
8663
 
8664
+ /* ── 行选择 checkbox(对齐 VirtualTable/Tree 三态视觉——原生 input 需覆盖
8665
+ _base.css 全局 input padding,否则 12px 横向 padding 撑大 checkbox) ── */
8666
+ .wf-table-checkbox {
8667
+ width: 14px;
8668
+ height: 14px;
8669
+ cursor: pointer;
8670
+ accent-color: var(--wf-color-primary);
8671
+ appearance: none;
8672
+ -webkit-appearance: none;
8673
+ margin: 0;
8674
+ padding: 0;
8675
+ border: var(--wf-border-width) solid var(--wf-color-border);
8676
+ border-radius: var(--wf-radius-sm);
8677
+ background: var(--wf-color-bg);
8678
+ position: relative;
8679
+ box-sizing: border-box;
8680
+ flex-shrink: 0;
8681
+ }
8682
+
8683
+ .wf-table-checkbox:checked {
8684
+ background: var(--wf-color-primary);
8685
+ border-color: var(--wf-color-primary);
8686
+ }
8687
+ .wf-table-checkbox:checked::after {
8688
+ content: '';
8689
+ position: absolute;
8690
+ top: 50%;
8691
+ left: 50%;
8692
+ width: 8px;
8693
+ height: 4px;
8694
+ border-left: 2px solid var(--wf-color-on-brand);
8695
+ border-bottom: 2px solid var(--wf-color-on-brand);
8696
+ transform: translate(-50%, -60%) rotate(-45deg);
8697
+ }
8698
+
8699
+ .wf-table-checkbox:indeterminate {
8700
+ background: var(--wf-color-primary);
8701
+ border-color: var(--wf-color-primary);
8702
+ }
8703
+ .wf-table-checkbox:indeterminate::after {
8704
+ content: '';
8705
+ position: absolute;
8706
+ top: 50%;
8707
+ left: 50%;
8708
+ width: 6px;
8709
+ height: 2px;
8710
+ background: var(--wf-color-on-brand);
8711
+ transform: translate(-50%, -50%);
8712
+ }
8713
+
8714
+ .wf-table-checkbox:focus-visible {
8715
+ outline: none;
8716
+ box-shadow: var(--wf-focus-ring);
8717
+ }
8718
+
8166
8719
  /* weifuwu/components — Tabs */
8167
8720
 
8168
8721
  .wf-tabs {
@@ -8828,7 +9381,9 @@ body.wf-dragging {
8828
9381
  /* weifuwu/components — Tooltip */
8829
9382
 
8830
9383
  .wf-tooltip-wrap {
9384
+ /* flex 父容器 blockify 兜底(同 Dropdown) */
8831
9385
  display: inline-flex;
9386
+ width: fit-content;
8832
9387
  }
8833
9388
 
8834
9389
  .wf-tooltip {
@@ -9580,10 +10135,60 @@ body.wf-dragging {
9580
10135
  flex-shrink: 0;
9581
10136
  }
9582
10137
  .wf-virtual-table-check {
9583
- width: 16px;
9584
- height: 16px;
10138
+ width: 14px;
10139
+ height: 14px;
9585
10140
  cursor: pointer;
9586
10141
  accent-color: var(--wf-color-primary);
10142
+ /* 对齐 Tree 三态视觉(原生 indeterminate 横线浅灰不明显):
10143
+ 半选态 = primary 背景 + on-brand 横线 */
10144
+ appearance: none;
10145
+ -webkit-appearance: none;
10146
+ margin: 0;
10147
+ padding: 0; /* 覆盖 _base.css input 全局 padding(12px 横向撑大 checkbox) */
10148
+ border: var(--wf-border-width) solid var(--wf-color-border);
10149
+ border-radius: var(--wf-radius-sm);
10150
+ background: var(--wf-color-bg);
10151
+ position: relative;
10152
+ box-sizing: border-box;
10153
+ flex-shrink: 0;
10154
+ }
10155
+
10156
+ /* 选中(全选/行勾选):primary 背景 + 白勾 */
10157
+ .wf-virtual-table-check:checked {
10158
+ background: var(--wf-color-primary);
10159
+ border-color: var(--wf-color-primary);
10160
+ }
10161
+ .wf-virtual-table-check:checked::after {
10162
+ content: '';
10163
+ position: absolute;
10164
+ top: 50%;
10165
+ left: 50%;
10166
+ width: 8px;
10167
+ height: 4px;
10168
+ border-left: 2px solid var(--wf-color-on-brand);
10169
+ border-bottom: 2px solid var(--wf-color-on-brand);
10170
+ transform: translate(-50%, -60%) rotate(-45deg);
10171
+ }
10172
+
10173
+ /* 半选(部分行选中):primary 背景 + on-brand 横线 */
10174
+ .wf-virtual-table-check:indeterminate {
10175
+ background: var(--wf-color-primary);
10176
+ border-color: var(--wf-color-primary);
10177
+ }
10178
+ .wf-virtual-table-check:indeterminate::after {
10179
+ content: '';
10180
+ position: absolute;
10181
+ top: 50%;
10182
+ left: 50%;
10183
+ width: 6px;
10184
+ height: 2px;
10185
+ background: var(--wf-color-on-brand);
10186
+ transform: translate(-50%, -50%);
10187
+ }
10188
+
10189
+ .wf-virtual-table-check:focus-visible {
10190
+ outline: none;
10191
+ box-shadow: var(--wf-focus-ring);
9587
10192
  }
9588
10193
 
9589
10194
  /* weifuwu/components — Watermark */