weifuwu 0.67.3 → 0.68.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.
@@ -94,8 +94,14 @@
94
94
  --wf-z-tour: 2000;
95
95
  --wf-tour-min-width: 240px;
96
96
  --wf-kanban-col-min-width: 200px;
97
+ /* Layout 布局外壳(batch-8) */
98
+ --wf-layout-sider-width: 240px;
99
+ --wf-layout-sider-collapsed-width: 64px;
100
+ --wf-layout-header-height: 56px;
97
101
  --wf-kanban-col-max-width: 300px;
98
102
  --wf-treeselect-min-width: 200px;
103
+ --wf-navmenu-min-width: 160px;
104
+ --wf-select-menu-min-width: 200px;
99
105
  --wf-treeselect-max-width: 320px;
100
106
  --wf-treeselect-dropdown-max-height: 260px;
101
107
  --wf-z-popover: 120; /* dropdown/select/datepicker 面板与 popover 同层 */
@@ -168,8 +174,9 @@
168
174
  /* ── 边框宽度 ── */
169
175
  --wf-border-width: 1px;
170
176
 
171
- /* ── 聚焦环(引用 primary-bg,暗色自动跟随) ── */
172
- --wf-focus-ring: 0 0 0 2px var(--wf-color-primary-bg);
177
+ /* ── 聚焦环(双层:淡环 bg + 1px primary 线——C5:系统暗色偏好下 primary-bg
178
+ 变暗不可见,primary 是亮蓝——明暗主题聚焦均可见) ── */
179
+ --wf-focus-ring: 0 0 0 2px var(--wf-color-primary-bg), 0 0 0 1px var(--wf-color-primary);
173
180
 
174
181
  /* ── 动效 ── */
175
182
  --wf-transition-duration: 150ms;
@@ -1639,9 +1646,82 @@ body.wf-dragging {
1639
1646
  opacity: 1;
1640
1647
  }
1641
1648
 
1649
+ /* weifuwu/components — AlertGroup 通知合并组 */
1650
+
1651
+ .wf-alertgroup {
1652
+ display: flex;
1653
+ flex-direction: column;
1654
+ gap: 6px;
1655
+ font-family: var(--wf-font-sans);
1656
+ font-size: var(--wf-font-size-sm, 13px);
1657
+ }
1658
+
1659
+ .wf-alertgroup-summary {
1660
+ display: flex;
1661
+ align-items: center;
1662
+ justify-content: center;
1663
+ padding: 10px 16px;
1664
+ border: var(--wf-border-width, 1px) solid var(--wf-color-border);
1665
+ border-radius: var(--wf-surface-radius, 8px);
1666
+ background: var(--wf-color-bg-secondary, #fff);
1667
+ color: var(--wf-color-primary-600, #1668dc);
1668
+ cursor: pointer;
1669
+ font-family: var(--wf-font-sans);
1670
+ transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
1671
+ }
1672
+
1673
+ .wf-alertgroup-summary:hover {
1674
+ background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1675
+ }
1676
+
1677
+ .wf-alertgroup-item {
1678
+ display: flex;
1679
+ align-items: center;
1680
+ gap: 10px;
1681
+ padding: 10px 16px;
1682
+ border-radius: var(--wf-surface-radius, 8px);
1683
+ background: var(--wf-color-bg-secondary, #fff);
1684
+ border-left: 3px solid var(--wf-color-info);
1685
+ }
1686
+
1687
+ .wf-alertgroup-item--success { border-left-color: var(--wf-color-success); }
1688
+ .wf-alertgroup-item--warning { border-left-color: var(--wf-color-warning); }
1689
+ .wf-alertgroup-item--error { border-left-color: var(--wf-color-danger); }
1690
+
1691
+ .wf-alertgroup-message {
1692
+ flex: 1;
1693
+ color: var(--wf-color-text-primary);
1694
+ }
1695
+
1696
+ .wf-alertgroup-time {
1697
+ color: var(--wf-color-text-muted, #999);
1698
+ font-size: 12px;
1699
+ }
1700
+
1701
+ .wf-alertgroup-close {
1702
+ display: flex;
1703
+ align-items: center;
1704
+ justify-content: center;
1705
+ width: 24px;
1706
+ height: 24px;
1707
+ min-width: 24px;
1708
+ min-height: 24px;
1709
+ padding: 0;
1710
+ border: none;
1711
+ background: transparent;
1712
+ color: var(--wf-color-text-muted, #999);
1713
+ cursor: pointer;
1714
+ border-radius: 4px;
1715
+ }
1716
+
1717
+ .wf-alertgroup-close:hover {
1718
+ background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1719
+ color: var(--wf-color-text-primary);
1720
+ }
1721
+
1642
1722
  /* weifuwu/components — Anchor(锚点导航) */
1643
1723
 
1644
- .wf-anchor {
1724
+ .wf-anchor-nav-nav {
1645
1725
  display: flex;
1646
1726
  flex-direction: column;
1647
1727
  gap: 2px;
@@ -1649,7 +1729,7 @@ body.wf-dragging {
1649
1729
  font-size: var(--wf-font-size-sm);
1650
1730
  }
1651
1731
 
1652
- .wf-anchor-link {
1732
+ .wf-anchor-nav-nav-link {
1653
1733
  display: block;
1654
1734
  padding: var(--wf-space-xs) var(--wf-space-sm);
1655
1735
  border-left: 2px solid transparent;
@@ -1662,19 +1742,19 @@ body.wf-dragging {
1662
1742
  border-color var(--wf-dur-fast) var(--wf-ease-out);
1663
1743
  }
1664
1744
 
1665
- .wf-anchor-link:hover {
1745
+ .wf-anchor-nav-nav-link:hover {
1666
1746
  background: var(--wf-color-bg-secondary);
1667
1747
  color: var(--wf-color-text);
1668
1748
  }
1669
1749
 
1670
- .wf-anchor-link--active {
1750
+ .wf-anchor-nav-nav-link--active {
1671
1751
  color: var(--wf-color-primary-text);
1672
1752
  border-left-color: var(--wf-color-primary);
1673
1753
  font-weight: var(--wf-font-weight-semibold);
1674
1754
  background: var(--wf-color-primary-bg);
1675
1755
  }
1676
1756
 
1677
- .wf-anchor-link:focus-visible {
1757
+ .wf-anchor-nav-nav-link:focus-visible {
1678
1758
  outline: none;
1679
1759
  box-shadow: var(--wf-focus-ring);
1680
1760
  }
@@ -1772,6 +1852,50 @@ body.wf-dragging {
1772
1852
  height: 100%;
1773
1853
  }
1774
1854
 
1855
+ /* weifuwu/components — AutoComplete 输入联想 */
1856
+
1857
+ .wf-autocomplete-wrap {
1858
+ position: relative;
1859
+ display: inline-block;
1860
+ width: 100%;
1861
+ }
1862
+
1863
+ .wf-autocomplete-input {
1864
+ width: 100%;
1865
+ }
1866
+
1867
+ .wf-autocomplete-dropdown {
1868
+ position: fixed;
1869
+ z-index: var(--wf-z-popover, 120);
1870
+ max-height: 280px;
1871
+ overflow-y: auto;
1872
+ border-radius: var(--wf-surface-radius, 8px);
1873
+ background: var(--wf-surface-bg, #fff);
1874
+ box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
1875
+ border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
1876
+ font-family: var(--wf-font-sans);
1877
+ font-size: var(--wf-font-size-sm, 13px);
1878
+ }
1879
+
1880
+ .wf-autocomplete-option {
1881
+ padding: 8px 12px;
1882
+ cursor: pointer;
1883
+ color: var(--wf-color-text-primary);
1884
+ white-space: nowrap;
1885
+ overflow: hidden;
1886
+ text-overflow: ellipsis;
1887
+ transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
1888
+ }
1889
+
1890
+ .wf-autocomplete-option:hover,
1891
+ .wf-autocomplete-option--active {
1892
+ background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
1893
+ }
1894
+
1895
+ .wf-autocomplete-option--active {
1896
+ color: var(--wf-color-primary-600, #1668dc);
1897
+ }
1898
+
1775
1899
  /* weifuwu/components — Avatar */
1776
1900
 
1777
1901
  .wf-avatar {
@@ -4330,6 +4454,126 @@ body.wf-dragging {
4330
4454
  transition: width var(--wf-dur-fast) var(--wf-ease-out);
4331
4455
  }
4332
4456
 
4457
+ /* weifuwu/components — FloatButton 悬浮操作按钮 */
4458
+
4459
+ .wf-float-btn {
4460
+ display: flex;
4461
+ align-items: center;
4462
+ justify-content: center;
4463
+ gap: 6px;
4464
+ width: 44px;
4465
+ height: 44px;
4466
+ min-width: 44px;
4467
+ min-height: 44px;
4468
+ padding: 0;
4469
+ border: none;
4470
+ border-radius: 50%;
4471
+ background: var(--wf-color-primary);
4472
+ color: var(--wf-color-on-brand, #fff);
4473
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
4474
+ cursor: pointer;
4475
+ z-index: var(--wf-z-sticky, 40);
4476
+ font-family: var(--wf-font-sans);
4477
+ font-size: 16px;
4478
+ transition: transform var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease),
4479
+ background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
4480
+ }
4481
+
4482
+ .wf-float-btn:hover {
4483
+ transform: scale(1.05);
4484
+ background: var(--wf-color-primary-600, #1668dc);
4485
+ }
4486
+
4487
+ .wf-float-btn--disabled {
4488
+ background: var(--wf-color-text-disabled, #bfbfbf);
4489
+ cursor: not-allowed;
4490
+ opacity: 0.7;
4491
+ }
4492
+
4493
+ .wf-float-btn--top-left { top: 24px; left: 24px; }
4494
+ .wf-float-btn--top-right { top: 24px; right: 24px; }
4495
+ .wf-float-btn--bottom-left { bottom: 24px; left: 24px; }
4496
+ .wf-float-btn--bottom-right { bottom: 24px; right: 24px; }
4497
+
4498
+ .wf-float-btn-badge {
4499
+ position: absolute;
4500
+ top: -4px;
4501
+ right: -4px;
4502
+ min-width: 18px;
4503
+ height: 18px;
4504
+ padding: 0 5px;
4505
+ border-radius: 50%;
4506
+ background: var(--wf-color-danger);
4507
+ color: var(--wf-color-on-brand, #fff);
4508
+ font-size: 11px;
4509
+ line-height: 18px;
4510
+ text-align: center;
4511
+ }
4512
+
4513
+ /* ── 组模式 ── */
4514
+ .wf-float-group {
4515
+ position: fixed;
4516
+ z-index: var(--wf-z-sticky, 40);
4517
+ display: flex;
4518
+ flex-direction: column;
4519
+ align-items: center;
4520
+ gap: 12px;
4521
+ }
4522
+
4523
+ .wf-float-group--bottom-right { bottom: 24px; right: 24px; }
4524
+ .wf-float-group--bottom-left { bottom: 24px; left: 24px; }
4525
+ .wf-float-group--top-right { top: 24px; right: 24px; }
4526
+ .wf-float-group--top-left { top: 24px; left: 24px; }
4527
+
4528
+ .wf-float-group-items {
4529
+ display: flex;
4530
+ flex-direction: column;
4531
+ gap: 10px;
4532
+ }
4533
+
4534
+ .wf-float-group-item {
4535
+ animation: wf-float-item-in var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
4536
+ }
4537
+
4538
+ @keyframes wf-float-item-in {
4539
+ from { opacity: 0; transform: translateY(8px); }
4540
+ to { opacity: 1; transform: translateY(0); }
4541
+ }
4542
+
4543
+ .wf-float-group-main {
4544
+ display: flex;
4545
+ align-items: center;
4546
+ justify-content: center;
4547
+ width: 44px;
4548
+ height: 44px;
4549
+ min-width: 44px;
4550
+ min-height: 44px;
4551
+ padding: 0;
4552
+ border: none;
4553
+ border-radius: 50%;
4554
+ background: var(--wf-color-primary);
4555
+ color: var(--wf-color-on-brand, #fff);
4556
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
4557
+ cursor: pointer;
4558
+ font-size: var(--wf-font-size-xl, 20px);
4559
+ font-family: var(--wf-font-sans);
4560
+ }
4561
+
4562
+ .wf-float-group-icon {
4563
+ display: inline-block;
4564
+ transition: transform var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
4565
+ }
4566
+
4567
+ .wf-float-group-icon.is-open {
4568
+ transform: rotate(45deg);
4569
+ }
4570
+
4571
+ /* 组内子项:不 fixed(由 group 容器排列) */
4572
+ .wf-float-btn--static {
4573
+ position: static;
4574
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4575
+ }
4576
+
4333
4577
  /* weifuwu/components — Form */
4334
4578
 
4335
4579
  .wf-form {
@@ -4338,6 +4582,29 @@ body.wf-dragging {
4338
4582
  gap: var(--wf-gap-md);
4339
4583
  }
4340
4584
 
4585
+ /* weifuwu/components — Grid 栅格 + Flex 容器 */
4586
+
4587
+ .wf-grid-comp {
4588
+ display: flex;
4589
+ flex-wrap: wrap;
4590
+ width: 100%;
4591
+ box-sizing: border-box;
4592
+ }
4593
+
4594
+ .wf-grid-comp--column {
4595
+ flex-direction: column;
4596
+ }
4597
+
4598
+ .wf-grid-comp--flex {
4599
+ display: flex;
4600
+ flex-wrap: wrap;
4601
+ }
4602
+
4603
+ .wf-col {
4604
+ box-sizing: border-box;
4605
+ min-width: 0;
4606
+ }
4607
+
4341
4608
  /* weifuwu/components — Highlight */
4342
4609
 
4343
4610
  .wf-highlight-mark {
@@ -4957,6 +5224,162 @@ body.wf-dragging {
4957
5224
  color: var(--wf-color-error-text);
4958
5225
  }
4959
5226
 
5227
+ /* weifuwu/components — Layout 布局外壳
5228
+ * 三库等价:antd Layout / EP Container / shadcn Sidebar
5229
+ */
5230
+
5231
+ .wf-layout {
5232
+ display: flex;
5233
+ width: 100%;
5234
+ min-height: 100%;
5235
+ background: var(--wf-color-bg-base, #f5f5f5);
5236
+ color: var(--wf-color-text-primary);
5237
+ font-family: var(--wf-font-sans);
5238
+ }
5239
+
5240
+ .wf-layout--column {
5241
+ flex-direction: column;
5242
+ }
5243
+
5244
+ .wf-layout--row {
5245
+ flex-direction: row;
5246
+ }
5247
+
5248
+ /* ── 侧边栏 ── */
5249
+ .wf-layout-sider {
5250
+ display: flex;
5251
+ flex-direction: column;
5252
+ flex-shrink: 0;
5253
+ height: 100vh;
5254
+ overflow: hidden;
5255
+ background: var(--wf-color-bg-secondary, #fff);
5256
+ border-right: var(--wf-border-width, 1px) solid var(--wf-color-border);
5257
+ transition: width var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5258
+ }
5259
+
5260
+ .wf-layout-sider--collapsed {
5261
+ border-right: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5262
+ }
5263
+
5264
+ .wf-layout-sider-body {
5265
+ flex: 1;
5266
+ overflow-y: auto;
5267
+ min-height: 0;
5268
+ }
5269
+
5270
+ /* 折叠触发器(底部) */
5271
+ .wf-layout-sider-trigger {
5272
+ display: flex;
5273
+ align-items: center;
5274
+ justify-content: center;
5275
+ width: 100%;
5276
+ height: 40px;
5277
+ flex-shrink: 0;
5278
+ border: none;
5279
+ border-top: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5280
+ background: transparent;
5281
+ color: var(--wf-color-text-secondary);
5282
+ cursor: pointer;
5283
+ font-size: 12px;
5284
+ transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5285
+ }
5286
+
5287
+ .wf-layout-sider-trigger:hover {
5288
+ background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
5289
+ }
5290
+
5291
+ .wf-layout-sider-trigger-icon {
5292
+ display: inline-block;
5293
+ transition: transform var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5294
+ }
5295
+
5296
+ .wf-layout-sider-trigger-icon.is-collapsed {
5297
+ transform: rotate(180deg);
5298
+ }
5299
+
5300
+ /* ── 顶部栏 ── */
5301
+ .wf-layout-header {
5302
+ display: flex;
5303
+ align-items: center;
5304
+ gap: var(--wf-gap-md, 16px);
5305
+ height: var(--wf-layout-header-height, 56px);
5306
+ padding: 0 var(--wf-space-md, 16px);
5307
+ flex-shrink: 0;
5308
+ background: var(--wf-color-bg-secondary, #fff);
5309
+ border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5310
+ }
5311
+
5312
+ /* ── 主内容区 ── */
5313
+ .wf-layout-content {
5314
+ flex: 1;
5315
+ min-height: 0;
5316
+ overflow: auto;
5317
+ padding: var(--wf-space-md, 16px);
5318
+ }
5319
+
5320
+ /* ── 底部栏 ── */
5321
+ .wf-layout-footer {
5322
+ padding: var(--wf-space-md, 16px);
5323
+ flex-shrink: 0;
5324
+ text-align: center;
5325
+ color: var(--wf-color-text-secondary);
5326
+ font-size: var(--wf-font-size-sm, 13px);
5327
+ background: var(--wf-color-bg-secondary, #fff);
5328
+ border-top: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
5329
+ }
5330
+
5331
+ /* weifuwu/components — Link 文字链接 */
5332
+
5333
+ .wf-link {
5334
+ display: inline-flex;
5335
+ align-items: center;
5336
+ gap: 4px;
5337
+ text-decoration: underline;
5338
+ text-underline-offset: 3px;
5339
+ color: var(--wf-color-primary-600, #1668dc);
5340
+ cursor: pointer;
5341
+ font-family: var(--wf-font-sans);
5342
+ font-size: var(--wf-font-size-sm, 13px);
5343
+ transition: color var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
5344
+ }
5345
+
5346
+ .wf-link:hover {
5347
+ color: var(--wf-color-primary-600, #1668dc);
5348
+ }
5349
+
5350
+ .wf-link--default {
5351
+ color: var(--wf-color-text-secondary);
5352
+ }
5353
+ .wf-link--default:hover {
5354
+ color: var(--wf-color-text-primary);
5355
+ }
5356
+
5357
+ .wf-link--danger {
5358
+ color: var(--wf-color-danger-text, #cf1322);
5359
+ }
5360
+ .wf-link--danger:hover {
5361
+ color: var(--wf-color-danger-600, #a8071a);
5362
+ }
5363
+
5364
+ .wf-link--muted {
5365
+ color: var(--wf-color-text-muted, #999);
5366
+ text-decoration: none;
5367
+ }
5368
+ .wf-link--muted:hover {
5369
+ color: var(--wf-color-text-secondary);
5370
+ }
5371
+
5372
+ .wf-link--no-underline {
5373
+ text-decoration: none;
5374
+ }
5375
+
5376
+ .wf-link--disabled {
5377
+ color: var(--wf-color-text-disabled, #bfbfbf);
5378
+ cursor: not-allowed;
5379
+ text-decoration: none;
5380
+ pointer-events: none;
5381
+ }
5382
+
4960
5383
  /* weifuwu/components — List */
4961
5384
 
4962
5385
  .wf-list {
@@ -5653,6 +6076,112 @@ body.wf-dragging {
5653
6076
  }
5654
6077
  }
5655
6078
 
6079
+ /* weifuwu/components — NavMenu 顶部导航(shadcn NavigationMenu 对齐) */
6080
+
6081
+ .wf-navmenu {
6082
+ display: flex;
6083
+ align-items: center;
6084
+ gap: 2px;
6085
+ padding: 0 var(--wf-space-md, 16px);
6086
+ background: var(--wf-color-bg-secondary, #fff);
6087
+ border-bottom: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6088
+ font-family: var(--wf-font-sans);
6089
+ font-size: var(--wf-font-size-sm, 13px);
6090
+ min-height: 48px;
6091
+ }
6092
+
6093
+ .wf-navmenu-item {
6094
+ position: relative;
6095
+ display: inline-flex;
6096
+ align-items: center;
6097
+ gap: 6px;
6098
+ padding: 8px 14px;
6099
+ border-radius: var(--wf-surface-radius, 8px);
6100
+ color: var(--wf-color-text-secondary);
6101
+ cursor: pointer;
6102
+ transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease),
6103
+ color var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6104
+ }
6105
+
6106
+ .wf-navmenu-item:hover {
6107
+ background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
6108
+ color: var(--wf-color-text-primary);
6109
+ }
6110
+
6111
+ .wf-navmenu-item--active {
6112
+ color: var(--wf-color-primary-600, #1668dc);
6113
+ font-weight: 600;
6114
+ }
6115
+
6116
+ .wf-navmenu-item--disabled {
6117
+ color: var(--wf-color-text-disabled, #bfbfbf);
6118
+ cursor: not-allowed;
6119
+ }
6120
+
6121
+ .wf-navmenu-arrow {
6122
+ font-size: 10px;
6123
+ opacity: 0.6;
6124
+ }
6125
+
6126
+ /* ── 子菜单弹出 ── */
6127
+ .wf-navmenu-sub {
6128
+ position: absolute;
6129
+ top: calc(100% + 6px);
6130
+ left: 0;
6131
+ min-width: var(--wf-navmenu-min-width, 160px);
6132
+ padding: 6px;
6133
+ border-radius: var(--wf-surface-radius, 8px);
6134
+ background: var(--wf-surface-bg, #fff);
6135
+ box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6136
+ border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6137
+ z-index: var(--wf-z-dropdown, 120);
6138
+ animation: wf-navmenu-in var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6139
+ }
6140
+
6141
+ @keyframes wf-navmenu-in {
6142
+ from { opacity: 0; transform: translateY(-4px); }
6143
+ to { opacity: 1; transform: translateY(0); }
6144
+ }
6145
+
6146
+ .wf-navmenu-sub-item {
6147
+ position: relative;
6148
+ display: flex;
6149
+ align-items: center;
6150
+ justify-content: space-between;
6151
+ gap: 12px;
6152
+ padding: 8px 12px;
6153
+ border-radius: var(--wf-radius, 6px);
6154
+ color: var(--wf-color-text-primary);
6155
+ cursor: pointer;
6156
+ white-space: nowrap;
6157
+ transition: background var(--wf-dur-fast, 0.15s) var(--wf-ease-standard, ease);
6158
+ }
6159
+
6160
+ .wf-navmenu-sub-item:hover {
6161
+ background: var(--wf-color-bg-hover, rgba(0, 0, 0, 0.04));
6162
+ }
6163
+
6164
+ .wf-navmenu-sub-item--disabled {
6165
+ color: var(--wf-color-text-disabled, #bfbfbf);
6166
+ cursor: not-allowed;
6167
+ }
6168
+
6169
+ .wf-navmenu-sub-arrow {
6170
+ color: var(--wf-color-text-muted, #999);
6171
+ }
6172
+
6173
+ .wf-navmenu-sub-nested {
6174
+ position: absolute;
6175
+ top: -6px;
6176
+ left: calc(100% + 4px);
6177
+ min-width: var(--wf-navmenu-min-width, 160px);
6178
+ padding: 6px;
6179
+ border-radius: var(--wf-surface-radius, 8px);
6180
+ background: var(--wf-surface-bg, #fff);
6181
+ box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6182
+ border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6183
+ }
6184
+
5656
6185
  /* weifuwu/components — Notification */
5657
6186
 
5658
6187
  .wf-notification-container {
@@ -6000,6 +6529,68 @@ body.wf-dragging {
6000
6529
  color: var(--wf-color-warning-text);
6001
6530
  }
6002
6531
 
6532
+ /* weifuwu/components — Popconfirm 气泡确认
6533
+ * 复用 usePopup 基座:定位/portal/Escape 继承 Popover 同款
6534
+ */
6535
+
6536
+ .wf-popconfirm-wrap {
6537
+ display: inline-block;
6538
+ }
6539
+
6540
+ .wf-popconfirm {
6541
+ position: fixed;
6542
+ z-index: var(--wf-z-popover, 120);
6543
+ min-width: var(--wf-popconfirm-min-width, 180px);
6544
+ padding: var(--wf-space-sm, 12px);
6545
+ border-radius: var(--wf-surface-radius, 8px);
6546
+ background: var(--wf-surface-bg, #fff);
6547
+ box-shadow: var(--wf-surface-shadow, 0 4px 16px rgba(0, 0, 0, 0.12));
6548
+ border: var(--wf-border-width, 1px) solid var(--wf-color-border-light);
6549
+ font-family: var(--wf-font-sans);
6550
+ font-size: var(--wf-font-size-sm, 13px);
6551
+ }
6552
+
6553
+ .wf-popconfirm--enter {
6554
+ animation: wf-popconfirm-in var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease);
6555
+ }
6556
+
6557
+ .wf-popconfirm--exit {
6558
+ animation: wf-popconfirm-out var(--wf-dur-md, 0.2s) var(--wf-ease-standard, ease) forwards;
6559
+ }
6560
+
6561
+ @keyframes wf-popconfirm-in {
6562
+ from { opacity: 0; transform: translateY(-4px) scale(0.98); }
6563
+ to { opacity: 1; transform: translateY(0) scale(1); }
6564
+ }
6565
+
6566
+ @keyframes wf-popconfirm-out {
6567
+ from { opacity: 1; }
6568
+ to { opacity: 0; transform: scale(0.98); }
6569
+ }
6570
+
6571
+ .wf-popconfirm-title {
6572
+ display: flex;
6573
+ align-items: flex-start;
6574
+ gap: var(--wf-gap-xs, 8px);
6575
+ margin-bottom: var(--wf-space-xs, 8px);
6576
+ color: var(--wf-color-text-primary);
6577
+ line-height: 1.5;
6578
+ }
6579
+
6580
+ .wf-popconfirm-icon {
6581
+ display: inline-flex;
6582
+ flex-shrink: 0;
6583
+ margin-top: 2px;
6584
+ color: var(--wf-color-warning-text, #ad6800);
6585
+ }
6586
+
6587
+ .wf-popconfirm-actions {
6588
+ display: flex;
6589
+ justify-content: flex-end;
6590
+ gap: var(--wf-gap-xs, 8px);
6591
+ margin-top: var(--wf-space-xs, 8px);
6592
+ }
6593
+
6003
6594
  /* weifuwu/components — Popover */
6004
6595
 
6005
6596
  .wf-popover-wrap {
@@ -6329,6 +6920,32 @@ body.wf-dragging {
6329
6920
  justify-content: center;
6330
6921
  }
6331
6922
 
6923
+ /* weifuwu/components — Scrollbar 自定义滚动容器 */
6924
+
6925
+ .wf-scrollbar {
6926
+ overflow: auto;
6927
+ scrollbar-width: thin;
6928
+ scrollbar-color: var(--wf-color-border) transparent;
6929
+ }
6930
+
6931
+ .wf-scrollbar::-webkit-scrollbar {
6932
+ width: 8px;
6933
+ height: 8px;
6934
+ }
6935
+
6936
+ .wf-scrollbar::-webkit-scrollbar-track {
6937
+ background: transparent;
6938
+ }
6939
+
6940
+ .wf-scrollbar::-webkit-scrollbar-thumb {
6941
+ background: var(--wf-color-border);
6942
+ border-radius: 4px;
6943
+ }
6944
+
6945
+ .wf-scrollbar::-webkit-scrollbar-thumb:hover {
6946
+ background: var(--wf-color-text-muted, #999);
6947
+ }
6948
+
6332
6949
  /* weifuwu/components — SearchInput */
6333
6950
 
6334
6951
  .wf-search {
@@ -6532,7 +7149,13 @@ body.wf-dragging {
6532
7149
  }
6533
7150
  .wf-select-search-trigger:focus-within {
6534
7151
  border-color: var(--wf-color-primary);
6535
- box-shadow: var(--wf-focus-ring);
7152
+ }
7153
+
7154
+ .wf-select-search-input:focus {
7155
+ /* 蓝框在 input 自身(不依赖 trigger box-shadow——trigger 底边蓝框会被
7156
+ menu 面板紧贴遮挡,用户反馈'被挡住了')。明暗主题均可见(不用
7157
+ focus-ring:系统暗色偏好下 primary-bg 变暗不可见)。 */
7158
+ box-shadow: 0 0 0 1px var(--wf-color-primary);
6536
7159
  }
6537
7160
  .wf-select-search--disabled {
6538
7161
  opacity: var(--wf-opacity-disabled);
@@ -6560,11 +7183,8 @@ body.wf-dragging {
6560
7183
  }
6561
7184
 
6562
7185
  .wf-select-search-menu {
6563
- position: absolute;
6564
- top: 100%;
6565
- left: 0;
6566
- right: 0;
6567
- margin-top: 2px;
7186
+ /* portal 定位(usePopup 接管)——absolute 会被父容器 overflow 裁剪 */
7187
+ min-width: var(--wf-select-menu-min-width, 200px);
6568
7188
  background: var(--wf-color-bg);
6569
7189
  border: var(--wf-border-width) solid var(--wf-color-border);
6570
7190
  border-radius: var(--wf-field-radius, var(--wf-radius));
@@ -6801,6 +7421,22 @@ body.wf-dragging {
6801
7421
  text-align: center;
6802
7422
  }
6803
7423
 
7424
+ /* weifuwu/components — Space 间距容器 */
7425
+
7426
+ .wf-space {
7427
+ display: flex;
7428
+ align-items: center;
7429
+ }
7430
+
7431
+ .wf-space--vertical {
7432
+ flex-direction: column;
7433
+ align-items: stretch;
7434
+ }
7435
+
7436
+ .wf-space-split {
7437
+ color: var(--wf-color-text-muted, #999);
7438
+ }
7439
+
6804
7440
  .wf-sparkline {
6805
7441
  display: inline-block;
6806
7442
  vertical-align: middle;