weifuwu 0.67.2 → 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;
@@ -537,6 +544,12 @@ code {
537
544
  scroll-behavior: auto !important;
538
545
  }
539
546
  }
547
+
548
+ /* 拖拽中禁用文本选中(useDragDrop 拖拽生命周期标记——Kanban 教训) */
549
+ body.wf-dragging {
550
+ user-select: none;
551
+ -webkit-user-select: none;
552
+ }
540
553
  }
541
554
 
542
555
  @layer layout {
@@ -1633,9 +1646,82 @@ code {
1633
1646
  opacity: 1;
1634
1647
  }
1635
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
+
1636
1722
  /* weifuwu/components — Anchor(锚点导航) */
1637
1723
 
1638
- .wf-anchor {
1724
+ .wf-anchor-nav-nav {
1639
1725
  display: flex;
1640
1726
  flex-direction: column;
1641
1727
  gap: 2px;
@@ -1643,7 +1729,7 @@ code {
1643
1729
  font-size: var(--wf-font-size-sm);
1644
1730
  }
1645
1731
 
1646
- .wf-anchor-link {
1732
+ .wf-anchor-nav-nav-link {
1647
1733
  display: block;
1648
1734
  padding: var(--wf-space-xs) var(--wf-space-sm);
1649
1735
  border-left: 2px solid transparent;
@@ -1656,19 +1742,19 @@ code {
1656
1742
  border-color var(--wf-dur-fast) var(--wf-ease-out);
1657
1743
  }
1658
1744
 
1659
- .wf-anchor-link:hover {
1745
+ .wf-anchor-nav-nav-link:hover {
1660
1746
  background: var(--wf-color-bg-secondary);
1661
1747
  color: var(--wf-color-text);
1662
1748
  }
1663
1749
 
1664
- .wf-anchor-link--active {
1750
+ .wf-anchor-nav-nav-link--active {
1665
1751
  color: var(--wf-color-primary-text);
1666
1752
  border-left-color: var(--wf-color-primary);
1667
1753
  font-weight: var(--wf-font-weight-semibold);
1668
1754
  background: var(--wf-color-primary-bg);
1669
1755
  }
1670
1756
 
1671
- .wf-anchor-link:focus-visible {
1757
+ .wf-anchor-nav-nav-link:focus-visible {
1672
1758
  outline: none;
1673
1759
  box-shadow: var(--wf-focus-ring);
1674
1760
  }
@@ -1766,6 +1852,50 @@ code {
1766
1852
  height: 100%;
1767
1853
  }
1768
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
+
1769
1899
  /* weifuwu/components — Avatar */
1770
1900
 
1771
1901
  .wf-avatar {
@@ -4324,6 +4454,126 @@ code {
4324
4454
  transition: width var(--wf-dur-fast) var(--wf-ease-out);
4325
4455
  }
4326
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
+
4327
4577
  /* weifuwu/components — Form */
4328
4578
 
4329
4579
  .wf-form {
@@ -4332,6 +4582,29 @@ code {
4332
4582
  gap: var(--wf-gap-md);
4333
4583
  }
4334
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
+
4335
4608
  /* weifuwu/components — Highlight */
4336
4609
 
4337
4610
  .wf-highlight-mark {
@@ -4951,6 +5224,162 @@ code {
4951
5224
  color: var(--wf-color-error-text);
4952
5225
  }
4953
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
+
4954
5383
  /* weifuwu/components — List */
4955
5384
 
4956
5385
  .wf-list {
@@ -5647,6 +6076,112 @@ code {
5647
6076
  }
5648
6077
  }
5649
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
+
5650
6185
  /* weifuwu/components — Notification */
5651
6186
 
5652
6187
  .wf-notification-container {
@@ -5994,6 +6529,68 @@ code {
5994
6529
  color: var(--wf-color-warning-text);
5995
6530
  }
5996
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
+
5997
6594
  /* weifuwu/components — Popover */
5998
6595
 
5999
6596
  .wf-popover-wrap {
@@ -6323,6 +6920,32 @@ code {
6323
6920
  justify-content: center;
6324
6921
  }
6325
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
+
6326
6949
  /* weifuwu/components — SearchInput */
6327
6950
 
6328
6951
  .wf-search {
@@ -6526,7 +7149,13 @@ code {
6526
7149
  }
6527
7150
  .wf-select-search-trigger:focus-within {
6528
7151
  border-color: var(--wf-color-primary);
6529
- 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);
6530
7159
  }
6531
7160
  .wf-select-search--disabled {
6532
7161
  opacity: var(--wf-opacity-disabled);
@@ -6554,11 +7183,8 @@ code {
6554
7183
  }
6555
7184
 
6556
7185
  .wf-select-search-menu {
6557
- position: absolute;
6558
- top: 100%;
6559
- left: 0;
6560
- right: 0;
6561
- margin-top: 2px;
7186
+ /* portal 定位(usePopup 接管)——absolute 会被父容器 overflow 裁剪 */
7187
+ min-width: var(--wf-select-menu-min-width, 200px);
6562
7188
  background: var(--wf-color-bg);
6563
7189
  border: var(--wf-border-width) solid var(--wf-color-border);
6564
7190
  border-radius: var(--wf-field-radius, var(--wf-radius));
@@ -6795,6 +7421,22 @@ code {
6795
7421
  text-align: center;
6796
7422
  }
6797
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
+
6798
7440
  .wf-sparkline {
6799
7441
  display: inline-block;
6800
7442
  vertical-align: middle;