weifuwu 0.65.0 → 0.66.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.
@@ -68,6 +68,7 @@
68
68
  --wf-space-2xl: 40px;
69
69
 
70
70
  /* ── 圆角 ── */
71
+ --wf-radius-xs: 2px; /* 内联代码/小元素圆角 */
71
72
  --wf-radius-sm: 4px;
72
73
  --wf-radius: 6px;
73
74
  --wf-radius-md: 8px;
@@ -175,6 +176,7 @@
175
176
 
176
177
  --wf-ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* 入场:快出缓停 */
177
178
  --wf-ease-in: cubic-bezier(0.4, 0, 1, 1); /* 退场:渐入加速 */
179
+ --wf-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); /* 往返/闪烁动画 */
178
180
  --wf-ease-snap: cubic-bezier(0.34, 1.56, 0.64, 1); /* 选中/弹跳 */
179
181
 
180
182
  --wf-motion-sm: 4px;
@@ -1624,6 +1626,46 @@ code {
1624
1626
  opacity: 1;
1625
1627
  }
1626
1628
 
1629
+ /* weifuwu/components — Anchor(锚点导航) */
1630
+
1631
+ .wf-anchor {
1632
+ display: flex;
1633
+ flex-direction: column;
1634
+ gap: 2px;
1635
+ font-family: var(--wf-font-sans);
1636
+ font-size: var(--wf-font-size-sm);
1637
+ }
1638
+
1639
+ .wf-anchor-link {
1640
+ display: block;
1641
+ padding: var(--wf-space-xs) var(--wf-space-sm);
1642
+ border-left: 2px solid transparent;
1643
+ border-radius: 0 var(--wf-radius-sm) var(--wf-radius-sm) 0;
1644
+ color: var(--wf-color-text-secondary);
1645
+ text-decoration: none;
1646
+ cursor: pointer;
1647
+ transition: color var(--wf-dur-fast) var(--wf-ease-out),
1648
+ background var(--wf-dur-fast) var(--wf-ease-out),
1649
+ border-color var(--wf-dur-fast) var(--wf-ease-out);
1650
+ }
1651
+
1652
+ .wf-anchor-link:hover {
1653
+ background: var(--wf-color-bg-secondary);
1654
+ color: var(--wf-color-text);
1655
+ }
1656
+
1657
+ .wf-anchor-link--active {
1658
+ color: var(--wf-color-primary-text);
1659
+ border-left-color: var(--wf-color-primary);
1660
+ font-weight: var(--wf-font-weight-semibold);
1661
+ background: var(--wf-color-primary-bg);
1662
+ }
1663
+
1664
+ .wf-anchor-link:focus-visible {
1665
+ outline: none;
1666
+ box-shadow: var(--wf-focus-ring);
1667
+ }
1668
+
1627
1669
  /* weifuwu/components — ApprovalCard */
1628
1670
 
1629
1671
  .wf-approval {
@@ -1850,7 +1892,7 @@ code {
1850
1892
  font-family: var(--wf-font-sans);
1851
1893
  font-size: var(--wf-font-size-sm);
1852
1894
  color: var(--wf-color-text-secondary);
1853
- line-height: var(--wf-line-height-normal);
1895
+ line-height: var(--wf-line-height);
1854
1896
  }
1855
1897
 
1856
1898
  .wf-breadcrumb-link {
@@ -1949,6 +1991,10 @@ code {
1949
1991
  border: var(--wf-border-width) solid var(--wf-color-border);
1950
1992
  border-radius: var(--wf-radius);
1951
1993
  overflow: hidden;
1994
+ /* flex 容器中宽度稳定:grid 1fr 列在内容驱动宽度下会被事件 nowrap 撑宽/
1995
+ 无事件塌缩——固定 min-width 防塌缩(定制 Token,默认 280px = 7 列 × 40px) */
1996
+ width: 100%;
1997
+ min-width: var(--wf-calendar-min-width, 280px);
1952
1998
  }
1953
1999
 
1954
2000
  .wf-calendar-header {
@@ -4110,27 +4156,67 @@ code {
4110
4156
  flex-shrink: 0;
4111
4157
  }
4112
4158
 
4159
+ .wf-upload-err {
4160
+ font-family: var(--wf-font-sans);
4161
+ font-size: var(--wf-font-size-xs);
4162
+ color: var(--wf-color-error-text);
4163
+ }
4164
+
4165
+ /* ── 第六批增强:缩略图 / 进度条 ────────────────────────── */
4166
+
4167
+ .wf-upload-item {
4168
+ display: flex;
4169
+ align-items: center;
4170
+ gap: var(--wf-gap-sm);
4171
+ padding: var(--wf-space-sm);
4172
+ border-radius: var(--wf-radius-sm);
4173
+ background: var(--wf-color-bg-secondary);
4174
+ }
4175
+
4176
+ .wf-upload-thumb {
4177
+ width: 36px;
4178
+ height: 36px;
4179
+ object-fit: cover;
4180
+ border-radius: var(--wf-radius-sm);
4181
+ border: var(--wf-border-width) solid var(--wf-color-border);
4182
+ flex-shrink: 0;
4183
+ background: var(--wf-color-bg);
4184
+ }
4185
+
4113
4186
  .wf-upload-item-remove {
4187
+ margin-left: auto;
4188
+ width: 24px; height: 24px;
4189
+ min-width: 24px; max-width: 24px;
4190
+ min-height: 24px; max-height: 24px;
4191
+ display: inline-flex;
4192
+ align-items: center;
4193
+ justify-content: center;
4114
4194
  border: none;
4115
- background: transparent;
4195
+ background: none;
4196
+ border-radius: var(--wf-radius-sm);
4116
4197
  color: var(--wf-color-text-tertiary);
4117
4198
  cursor: pointer;
4118
- padding: 2px 4px;
4119
- font-size: 12px;
4120
- line-height: 1;
4121
- border-radius: var(--wf-radius-sm);
4122
- flex-shrink: 0;
4199
+ line-height: 0; padding: 0; flex-shrink: 0;
4123
4200
  }
4124
4201
 
4125
4202
  .wf-upload-item-remove:hover {
4126
- color: var(--wf-color-error-text);
4127
4203
  background: var(--wf-color-error-bg);
4204
+ color: var(--wf-color-error-text);
4128
4205
  }
4129
4206
 
4130
- .wf-upload-err {
4131
- font-family: var(--wf-font-sans);
4132
- font-size: var(--wf-font-size-xs);
4133
- color: var(--wf-color-error-text);
4207
+ .wf-upload-progress {
4208
+ height: 4px;
4209
+ border-radius: 2px;
4210
+ background: var(--wf-color-bg-tertiary);
4211
+ overflow: hidden;
4212
+ margin-top: var(--wf-space-sm);
4213
+ }
4214
+
4215
+ .wf-upload-progress-fill {
4216
+ height: 100%;
4217
+ background: var(--wf-color-primary);
4218
+ border-radius: 2px;
4219
+ transition: width var(--wf-dur-fast) var(--wf-ease-out);
4134
4220
  }
4135
4221
 
4136
4222
  /* weifuwu/components — Form */
@@ -4510,6 +4596,152 @@ code {
4510
4596
  .wf-inputnumber-err { font-size: var(--wf-font-size-xs); color: var(--wf-color-error-text); }
4511
4597
  .wf-inputnumber-hint { font-size: var(--wf-font-size-xs); color: var(--wf-color-text-tertiary); }
4512
4598
 
4599
+ /* weifuwu/components — JSONViewer(结构化 JSON 浏览) */
4600
+
4601
+ .wf-json-viewer {
4602
+ font-family: var(--wf-font-mono);
4603
+ font-size: var(--wf-font-size-xs);
4604
+ color: var(--wf-color-text);
4605
+ background: var(--wf-color-bg-secondary);
4606
+ border-radius: var(--wf-radius-sm);
4607
+ padding: var(--wf-space-sm);
4608
+ overflow-x: auto;
4609
+ line-height: 1.6;
4610
+ }
4611
+
4612
+ /* 对象/数组节点不额外缩进——同层键(标量/对象/数组)对齐;
4613
+ 子层缩进由 .wf-json-children 容器承担(padding + border-left) */
4614
+ .wf-json-node {
4615
+ padding-left: 0;
4616
+ }
4617
+
4618
+ .wf-json-row {
4619
+ display: flex;
4620
+ align-items: center;
4621
+ gap: var(--wf-gap-xs);
4622
+ white-space: nowrap;
4623
+ border-radius: var(--wf-radius-sm);
4624
+ }
4625
+
4626
+ .wf-json-row:hover {
4627
+ background: var(--wf-color-bg-tertiary);
4628
+ }
4629
+
4630
+ .wf-json-children {
4631
+ padding-left: var(--wf-space-sm);
4632
+ border-left: 1px solid var(--wf-color-border);
4633
+ margin-left: var(--wf-space-xs);
4634
+ }
4635
+
4636
+ .wf-json-key {
4637
+ color: var(--wf-color-text-secondary);
4638
+ }
4639
+
4640
+ /* 标量行 toggle 占位(与对象/数组行 chevron 同宽 16px)——同层 key 文本对齐 */
4641
+ .wf-json-toggle-placeholder {
4642
+ width: 16px;
4643
+ flex-shrink: 0;
4644
+ display: inline-flex;
4645
+ }
4646
+
4647
+ .wf-json-toggle {
4648
+ width: 16px; height: 16px;
4649
+ min-width: 16px; max-width: 16px;
4650
+ min-height: 16px; max-height: 16px;
4651
+ display: inline-flex;
4652
+ align-items: center;
4653
+ justify-content: center;
4654
+ border: none;
4655
+ background: none;
4656
+ color: var(--wf-color-text-tertiary);
4657
+ cursor: pointer;
4658
+ line-height: 0; padding: 0; flex-shrink: 0;
4659
+ }
4660
+
4661
+ .wf-json-toggle:hover {
4662
+ color: var(--wf-color-text);
4663
+ }
4664
+
4665
+ .wf-json-toggle:focus-visible {
4666
+ outline: none;
4667
+ box-shadow: var(--wf-focus-ring);
4668
+ }
4669
+
4670
+ .wf-json-summary,
4671
+ .wf-json-node-summary {
4672
+ color: var(--wf-color-text-tertiary);
4673
+ }
4674
+
4675
+ .wf-json-more {
4676
+ padding-left: var(--wf-space-lg);
4677
+ color: var(--wf-color-warning-text);
4678
+ font-size: var(--wf-font-size-xs);
4679
+ }
4680
+
4681
+ .wf-json-copy {
4682
+ width: 16px; height: 16px;
4683
+ min-width: 16px; max-width: 16px;
4684
+ min-height: 16px; max-height: 16px;
4685
+ display: inline-flex;
4686
+ align-items: center;
4687
+ justify-content: center;
4688
+ border: none;
4689
+ background: none;
4690
+ color: var(--wf-color-text-tertiary);
4691
+ cursor: pointer;
4692
+ line-height: 0; padding: 0; flex-shrink: 0;
4693
+ opacity: 0;
4694
+ }
4695
+
4696
+ .wf-json-row:hover .wf-json-copy {
4697
+ opacity: 1;
4698
+ }
4699
+
4700
+ .wf-json-copy:hover {
4701
+ color: var(--wf-color-primary-text);
4702
+ }
4703
+
4704
+ .wf-json-copy:focus-visible {
4705
+ outline: none;
4706
+ box-shadow: var(--wf-focus-ring);
4707
+ opacity: 1;
4708
+ }
4709
+
4710
+ /* ── 类型色(语义 Token) ── */
4711
+ .wf-json-string { color: var(--wf-color-success-text); }
4712
+ .wf-json-number { color: var(--wf-color-primary-text); }
4713
+ .wf-json-boolean { color: var(--wf-color-warning-text); }
4714
+ .wf-json-null { color: var(--wf-color-text-tertiary); font-style: italic; }
4715
+
4716
+ /* ── 整行折叠交互(大命中区)+ 触屏适配 ── */
4717
+
4718
+ .wf-json-collapse,
4719
+ .wf-json-row--header {
4720
+ cursor: pointer;
4721
+ }
4722
+
4723
+ .wf-json-collapse:hover,
4724
+ .wf-json-row--header:hover {
4725
+ background: var(--wf-color-bg-tertiary);
4726
+ }
4727
+
4728
+ .wf-json-collapse:focus-visible,
4729
+ .wf-json-row--header:focus-visible {
4730
+ outline: none;
4731
+ box-shadow: var(--wf-focus-ring);
4732
+ }
4733
+
4734
+ /* 触屏(coarse):toggle/复制按钮 44px 命中区(padding 扩展) */
4735
+ @media (pointer: coarse) {
4736
+ .wf-json-toggle,
4737
+ .wf-json-copy {
4738
+ width: 24px; height: 24px;
4739
+ min-width: 24px; max-width: 24px;
4740
+ min-height: 24px; max-height: 24px;
4741
+ padding: 4px;
4742
+ }
4743
+ }
4744
+
4513
4745
  /* weifuwu/components — Label(与 Input/Field 的 label 样式同源) */
4514
4746
 
4515
4747
  .wf-label {
@@ -4603,6 +4835,106 @@ code {
4603
4835
  font-size: var(--wf-font-size-sm);
4604
4836
  }
4605
4837
 
4838
+ /* weifuwu/components — LogViewer(日志流:ANSI 着色 + 虚拟滚动) */
4839
+
4840
+ .wf-log-viewer {
4841
+ font-family: var(--wf-font-mono);
4842
+ font-size: var(--wf-font-size-xs);
4843
+ color: var(--wf-color-text);
4844
+ position: relative;
4845
+ border: var(--wf-border-width) solid var(--wf-color-border);
4846
+ border-radius: var(--wf-radius);
4847
+ background: var(--wf-color-bg-secondary);
4848
+ overflow: hidden;
4849
+ }
4850
+
4851
+ .wf-log-copy {
4852
+ position: absolute;
4853
+ top: var(--wf-space-sm);
4854
+ right: var(--wf-space-sm);
4855
+ z-index: 1;
4856
+ width: 24px; height: 24px;
4857
+ min-width: 24px; max-width: 24px;
4858
+ min-height: 24px; max-height: 24px;
4859
+ display: inline-flex;
4860
+ align-items: center;
4861
+ justify-content: center;
4862
+ border: none;
4863
+ background: var(--wf-color-bg-tertiary);
4864
+ border-radius: var(--wf-radius-sm);
4865
+ color: var(--wf-color-text-secondary);
4866
+ cursor: pointer;
4867
+ line-height: 0; padding: 0; flex-shrink: 0;
4868
+ }
4869
+
4870
+ .wf-log-copy:hover {
4871
+ background: var(--wf-color-bg);
4872
+ color: var(--wf-color-text);
4873
+ }
4874
+
4875
+ .wf-log-body {
4876
+ position: relative;
4877
+ overflow-y: auto;
4878
+ }
4879
+
4880
+ .wf-log-spacer {
4881
+ pointer-events: none;
4882
+ }
4883
+
4884
+ .wf-log-row {
4885
+ display: flex;
4886
+ align-items: center;
4887
+ box-sizing: border-box;
4888
+ padding-right: var(--wf-space-md);
4889
+ white-space: pre;
4890
+ }
4891
+
4892
+ .wf-log-row:hover {
4893
+ background: var(--wf-color-bg-tertiary);
4894
+ }
4895
+
4896
+ .wf-log-line-no {
4897
+ display: inline-flex;
4898
+ align-items: center;
4899
+ justify-content: flex-end;
4900
+ min-width: 48px;
4901
+ padding: 0 var(--wf-space-sm);
4902
+ margin-right: var(--wf-space-sm);
4903
+ color: var(--wf-color-text-tertiary);
4904
+ user-select: none;
4905
+ flex-shrink: 0;
4906
+ }
4907
+
4908
+ .wf-log-line-content {
4909
+ overflow: hidden;
4910
+ }
4911
+
4912
+ /* ── ANSI 前景色(16 色映射到语义 Token) ── */
4913
+ .wf-log-ansi--bold { font-weight: var(--wf-font-weight-bold); }
4914
+ .wf-log-ansi--30 { color: var(--wf-color-text-secondary); }
4915
+ .wf-log-ansi--31 { color: var(--wf-color-error-text); }
4916
+ .wf-log-ansi--32 { color: var(--wf-color-success-text); }
4917
+ .wf-log-ansi--33 { color: var(--wf-color-warning-text); }
4918
+ .wf-log-ansi--34 { color: var(--wf-color-primary-text); }
4919
+ .wf-log-ansi--35 { color: var(--wf-color-primary-text); }
4920
+ .wf-log-ansi--36 { color: var(--wf-color-info-text); }
4921
+ .wf-log-ansi--37 { color: var(--wf-color-text); }
4922
+
4923
+ /* ── ANSI 背景色(8 色 → 50 级语义底) ── */
4924
+ .wf-log-ansi--bg41 { background: var(--wf-color-error-bg); }
4925
+ .wf-log-ansi--bg42 { background: var(--wf-color-success-bg); }
4926
+ .wf-log-ansi--bg43 { background: var(--wf-color-warning-bg); }
4927
+ .wf-log-ansi--bg44 { background: var(--wf-color-primary-bg); }
4928
+ .wf-log-ansi--bg47 { background: var(--wf-color-bg-tertiary); }
4929
+
4930
+ .wf-log-empty {
4931
+ display: flex;
4932
+ align-items: center;
4933
+ justify-content: center;
4934
+ padding: var(--wf-space-lg);
4935
+ color: var(--wf-color-text-tertiary);
4936
+ }
4937
+
4606
4938
  /* weifuwu/components — Markdown 排版 */
4607
4939
 
4608
4940
  .wf-md {
@@ -4792,6 +5124,102 @@ code {
4792
5124
  flex-shrink: 0;
4793
5125
  }
4794
5126
 
5127
+ /* ── 子菜单(第六批) ────────────────────────────── */
5128
+
5129
+ .wf-menu-submenu {
5130
+ display: flex;
5131
+ flex-direction: column;
5132
+ gap: 2px;
5133
+ }
5134
+
5135
+ .wf-menu-submenu-title {
5136
+ display: flex;
5137
+ align-items: center;
5138
+ gap: var(--wf-gap-sm);
5139
+ padding: var(--wf-space-sm) var(--wf-space-md);
5140
+ border-radius: var(--wf-radius-sm);
5141
+ font-size: var(--wf-font-size-sm);
5142
+ color: var(--wf-color-text-secondary);
5143
+ cursor: pointer;
5144
+ user-select: none;
5145
+ transition: background var(--wf-dur-fast) var(--wf-ease-out), color var(--wf-dur-fast) var(--wf-ease-out);
5146
+ }
5147
+
5148
+ .wf-menu-submenu-title:hover {
5149
+ background: var(--wf-color-bg-secondary);
5150
+ color: var(--wf-color-text);
5151
+ }
5152
+
5153
+ .wf-menu-submenu-title:focus-visible {
5154
+ outline: 2px solid var(--wf-color-primary);
5155
+ outline-offset: -2px;
5156
+ }
5157
+
5158
+ .wf-menu-arrow {
5159
+ margin-left: auto;
5160
+ display: inline-flex;
5161
+ color: var(--wf-color-text-tertiary);
5162
+ transition: transform var(--wf-dur-fast) var(--wf-ease-out);
5163
+ }
5164
+
5165
+ .wf-menu-submenu--open .wf-menu-arrow {
5166
+ transform: rotate(90deg);
5167
+ }
5168
+
5169
+ .wf-menu-submenu-content {
5170
+ display: none;
5171
+ flex-direction: column;
5172
+ gap: 2px;
5173
+ }
5174
+
5175
+ .wf-menu-submenu--open .wf-menu-submenu-content {
5176
+ display: flex;
5177
+ }
5178
+
5179
+ .wf-menu-item--child {
5180
+ padding-left: var(--wf-space-xl);
5181
+ font-size: var(--wf-font-size-sm);
5182
+ }
5183
+
5184
+ /* ── 折叠(第六批) ────────────────────────────── */
5185
+
5186
+ .wf-menu--collapsed {
5187
+ width: 56px;
5188
+ }
5189
+
5190
+ .wf-menu--collapsed .wf-menu-group {
5191
+ display: none;
5192
+ }
5193
+
5194
+ .wf-menu--collapsed .wf-menu-item,
5195
+ .wf-menu--collapsed .wf-menu-submenu-title {
5196
+ justify-content: center;
5197
+ padding: var(--wf-space-sm);
5198
+ gap: 0;
5199
+ }
5200
+
5201
+ .wf-menu-collapse-btn {
5202
+ display: flex;
5203
+ align-items: center;
5204
+ justify-content: center;
5205
+ margin-top: auto;
5206
+ padding: var(--wf-space-sm);
5207
+ border-radius: var(--wf-radius-sm);
5208
+ color: var(--wf-color-text-tertiary);
5209
+ cursor: pointer;
5210
+ min-height: 36px;
5211
+ }
5212
+
5213
+ .wf-menu-collapse-btn:hover {
5214
+ background: var(--wf-color-bg-secondary);
5215
+ color: var(--wf-color-text);
5216
+ }
5217
+
5218
+ .wf-menu-collapse-btn:focus-visible {
5219
+ outline: 2px solid var(--wf-color-primary);
5220
+ outline-offset: -2px;
5221
+ }
5222
+
4795
5223
  /* weifuwu/components — Menubar */
4796
5224
 
4797
5225
  .wf-menubar {
@@ -6071,8 +6499,8 @@ code {
6071
6499
  border-radius: 50%;
6072
6500
  background: var(--wf-color-primary);
6073
6501
  cursor: pointer;
6074
- border: 2px solid #fff;
6075
- box-shadow: 0 1px 3px rgba(0,0,0,0.2);
6502
+ border: 2px solid var(--wf-color-on-brand);
6503
+ box-shadow: var(--wf-slider-thumb-shadow, 0 1px 3px rgba(0,0,0,0.2));
6076
6504
  }
6077
6505
 
6078
6506
  /* Firefox 同款 thumb(跨浏览器一致) */
@@ -6082,8 +6510,8 @@ code {
6082
6510
  border-radius: 50%;
6083
6511
  background: var(--wf-color-primary);
6084
6512
  cursor: pointer;
6085
- border: 2px solid #fff;
6086
- box-shadow: 0 1px 3px rgba(0,0,0,0.2);
6513
+ border: 2px solid var(--wf-color-on-brand);
6514
+ box-shadow: var(--wf-slider-thumb-shadow, 0 1px 3px rgba(0,0,0,0.2));
6087
6515
  }
6088
6516
 
6089
6517
  .wf-slider-input::-moz-range-track {
@@ -6265,10 +6693,10 @@ code {
6265
6693
  left: 2px;
6266
6694
  width: 16px;
6267
6695
  height: 16px;
6268
- background: #fff;
6696
+ background: var(--wf-color-on-brand);
6269
6697
  border-radius: 50%;
6270
6698
  transition: transform var(--wf-transition);
6271
- box-shadow: 0 1px 2px rgba(0,0,0,0.15);
6699
+ box-shadow: var(--wf-switch-knob-shadow, 0 1px 2px rgba(0,0,0,0.15));
6272
6700
  }
6273
6701
 
6274
6702
  .wf-switch-input:checked + .wf-switch-track {
@@ -6623,7 +7051,7 @@ code {
6623
7051
  border-radius: var(--wf-radius-md);
6624
7052
  background: var(--wf-color-bg-secondary);
6625
7053
  font-family: var(--wf-font-sans);
6626
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04);
7054
+ box-shadow: var(--wf-theme-switch-inset, inset 0 1px 2px rgba(0, 0, 0, 0.04));
6627
7055
  }
6628
7056
 
6629
7057
  .wf-theme-seg {
@@ -7467,6 +7895,104 @@ code {
7467
7895
  box-sizing: border-box;
7468
7896
  }
7469
7897
 
7898
+ /* weifuwu/components — VirtualTable(固定表头 + 虚拟滚动表体) */
7899
+
7900
+ .wf-virtual-table {
7901
+ font-family: var(--wf-font-sans);
7902
+ font-size: var(--wf-font-size-sm);
7903
+ color: var(--wf-color-text);
7904
+ border: var(--wf-border-width) solid var(--wf-color-border);
7905
+ border-radius: var(--wf-radius);
7906
+ overflow: hidden;
7907
+ }
7908
+
7909
+ .wf-virtual-table-thead {
7910
+ display: flex;
7911
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
7912
+ background: var(--wf-color-bg-secondary);
7913
+ }
7914
+
7915
+ .wf-virtual-table-th {
7916
+ display: flex;
7917
+ align-items: center;
7918
+ gap: var(--wf-gap-xs);
7919
+ padding: var(--wf-space-sm) var(--wf-space-md);
7920
+ font-size: var(--wf-font-size-xs);
7921
+ font-weight: var(--wf-font-weight-semibold);
7922
+ color: var(--wf-color-text-secondary);
7923
+ flex-shrink: 0;
7924
+ box-sizing: border-box;
7925
+ }
7926
+
7927
+ .wf-virtual-table-th--sortable {
7928
+ cursor: pointer;
7929
+ user-select: none;
7930
+ }
7931
+
7932
+ .wf-virtual-table-th--sortable:hover {
7933
+ color: var(--wf-color-text);
7934
+ }
7935
+
7936
+ .wf-virtual-table-th--sortable:focus-visible {
7937
+ outline: none;
7938
+ box-shadow: var(--wf-focus-ring);
7939
+ }
7940
+
7941
+ .wf-virtual-table-th--sorted {
7942
+ color: var(--wf-color-primary-text);
7943
+ }
7944
+
7945
+ .wf-virtual-table-sort-icon {
7946
+ display: inline-flex;
7947
+ color: var(--wf-color-text-tertiary);
7948
+ }
7949
+
7950
+ .wf-virtual-table-sort-icon--active {
7951
+ color: var(--wf-color-primary-text);
7952
+ }
7953
+
7954
+ .wf-virtual-table-body {
7955
+ position: relative;
7956
+ overflow-y: auto;
7957
+ }
7958
+
7959
+ .wf-virtual-table-spacer {
7960
+ pointer-events: none;
7961
+ }
7962
+
7963
+ .wf-virtual-table-row {
7964
+ display: flex;
7965
+ align-items: center;
7966
+ box-sizing: border-box;
7967
+ border-bottom: var(--wf-border-width) solid var(--wf-color-border);
7968
+ cursor: default;
7969
+ }
7970
+
7971
+ .wf-virtual-table-row:hover {
7972
+ background: var(--wf-color-bg-tertiary);
7973
+ }
7974
+
7975
+ .wf-virtual-table-td {
7976
+ display: flex;
7977
+ align-items: center;
7978
+ padding: 0 var(--wf-space-md);
7979
+ flex-shrink: 0;
7980
+ box-sizing: border-box;
7981
+ overflow: hidden;
7982
+ white-space: nowrap;
7983
+ text-overflow: ellipsis;
7984
+ color: var(--wf-color-text);
7985
+ }
7986
+
7987
+ .wf-virtual-table-empty {
7988
+ display: flex;
7989
+ align-items: center;
7990
+ justify-content: center;
7991
+ padding: var(--wf-space-lg);
7992
+ color: var(--wf-color-text-tertiary);
7993
+ font-size: var(--wf-font-size-sm);
7994
+ }
7995
+
7470
7996
  /* weifuwu/components — Watermark */
7471
7997
 
7472
7998
  .wf-watermark {
package/dist/index.js CHANGED
@@ -4426,8 +4426,33 @@ function createSsrContext(serverCtx, dataStore) {
4426
4426
  }
4427
4427
  })
4428
4428
  };
4429
+ const browser = {
4430
+ activeElement: () => null,
4431
+ byId: () => null,
4432
+ query: () => null,
4433
+ createElement: () => null,
4434
+ bodyAppend: () => {
4435
+ },
4436
+ bodyRemove: () => {
4437
+ },
4438
+ copyText: async () => false,
4439
+ execCommand: () => false,
4440
+ selectionText: () => null,
4441
+ getSelection: () => null,
4442
+ viewportHeight: () => 0,
4443
+ scrollTop: () => 0,
4444
+ hash: () => "",
4445
+ setHash: () => {
4446
+ },
4447
+ timeout: () => 0,
4448
+ rootElement: () => null,
4449
+ storageGet: () => null,
4450
+ storageSet: () => {
4451
+ }
4452
+ };
4429
4453
  const ctx = Object.create(serverCtx ?? {});
4430
4454
  ctx.ui = ui2;
4455
+ ctx.browser = browser;
4431
4456
  ctx.data = {
4432
4457
  async get(key, fetcher) {
4433
4458
  if (dataStore.has(key)) return dataStore.get(key);
@@ -68,6 +68,7 @@
68
68
  --wf-space-2xl: 40px;
69
69
 
70
70
  /* ── 圆角 ── */
71
+ --wf-radius-xs: 2px; /* 内联代码/小元素圆角 */
71
72
  --wf-radius-sm: 4px;
72
73
  --wf-radius: 6px;
73
74
  --wf-radius-md: 8px;
@@ -175,6 +176,7 @@
175
176
 
176
177
  --wf-ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* 入场:快出缓停 */
177
178
  --wf-ease-in: cubic-bezier(0.4, 0, 1, 1); /* 退场:渐入加速 */
179
+ --wf-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); /* 往返/闪烁动画 */
178
180
  --wf-ease-snap: cubic-bezier(0.34, 1.56, 0.64, 1); /* 选中/弹跳 */
179
181
 
180
182
  --wf-motion-sm: 4px;