@gyyxds/zy-ui 0.0.3 → 0.1.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.
@@ -34,13 +34,13 @@ html[data-zy-theme='solid'] {
34
34
  --zy-key-edge: rgba(255, 255, 255, 0.95);
35
35
  /*
36
36
  * ---------- 键帽高度:挤出底座的厚度,三档 大 / 正常 / 小 ----------
37
- * 大 = 卡片(--zy-card-fill-lift)
38
- * 正常 = 按钮与控件(--zy-key-lift-btn、--zy-shadow-card)
37
+ * 大 = 浮板 / 对话框(--zy-key-lift-lg、--zy-shadow-float)
38
+ * 正常 = 按钮 / 控件 / 卡片(--zy-key-lift-btn、--zy-card-fill-lift、--zy-shadow-card)
39
39
  * 小 = 标签与角标(--zy-tag-fill-lift)、以及复选框 / 单选 / 分页这类小件
40
40
  * 组件自己的尺寸变体在各自档位上再 ±1 档(如 large 标签 = 正常、small 标签 = 小)。
41
41
  */
42
- --zy-key-lift-lg: 6px; /* 大 · 卡片 */
43
- --zy-key-lift: 4px; /* 正常 · 按钮 / 控件 */
42
+ --zy-key-lift-lg: 6px; /* 大 · 浮板 / 对话框 */
43
+ --zy-key-lift: 4px; /* 正常 · 按钮 / 控件 / 卡片 */
44
44
  --zy-key-lift-sm: 2px; /* 小 · 标签 / 角标 / 小件 */
45
45
  --zy-key-soft: 0 10px 18px rgba(15, 23, 42, 0.1);
46
46
  --zy-key-down: 0 2px 6px rgba(15, 23, 42, 0.14);
@@ -426,6 +426,134 @@ html[data-zy-theme='solid'] .zy-btn.is-fill .zy-btn-fill-label {
426
426
  * 悬停铺色、按下、禁用,全部交给组件自己那套数值。主题只声明「默认档也用这套材质」。
427
427
  */
428
428
 
429
+ /* ============================================================
430
+ * 1·凸 · 默认键(type 为空)的液态玻璃面 —— 仅 B 浅色
431
+ * ------------------------------------------------------------
432
+ * 默认键没有语义色。这里把它做成一块**实色玻璃**:四边由面本身收,
433
+ * 不靠描边 / 内影,轮廓与 Primary 一样锐利;表面是平的,按压只下沉、不鼓。
434
+ *
435
+ * 面 #cfe0f0(原半透明面在 B 桌面上的合成色)
436
+ * 雾 ::before,竖向白,横向 mask 收进中间;向下收透
437
+ * 大弧 ::after,主题两条弧的路径,填白色渐变,收进边内 1px
438
+ * 底光 主题 --zy-key-gloss
439
+ * 底座 面色合成色 × 82% + 黑(与 Primary 同一条公式)
440
+ * 按下 贴平:底座收平,不保留落地影
441
+ *
442
+ * 暗色档、plain / dashed / sweep / fill 仍走原主题,不在此规则内。
443
+ * ::before 在 is-loading 下让给 Element 的 loading 遮罩;雾 / 弧 / 文字
444
+ * 都排除 loading,避免盖住遮罩。
445
+ * ============================================================ */
446
+ html[data-zy-theme='solid']:not(.dark)
447
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info):not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link) {
448
+ /* 实色玻璃面:四边由实色面收,和 Primary 的面边一样硬 */
449
+ --zy-key-glass-face: #cfe0f0;
450
+ /* 底座:面色合成色 × 82% + 黑,与 Primary 同一条公式 */
451
+ --zy-key-glass-base: color-mix(in srgb, #c6d8ea 82%, #000);
452
+ /* 乳白雾:中间一团,上下收干净;横向 24%–76% 收进中间 */
453
+ --zy-key-glass-fog: linear-gradient(
454
+ 180deg,
455
+ rgba(255, 255, 255, 0) 0%,
456
+ rgba(255, 255, 255, 0.88) 26%,
457
+ rgba(255, 255, 255, 0.82) 60%,
458
+ rgba(255, 255, 255, 0) 100%
459
+ );
460
+ --zy-key-glass-fog-mask: linear-gradient(
461
+ 90deg,
462
+ rgba(0, 0, 0, 0) 0%,
463
+ #000 24%,
464
+ #000 76%,
465
+ rgba(0, 0, 0, 0) 100%
466
+ );
467
+ /* 两块大弧形白高光:与主题同路径,填充改成白色渐变 */
468
+ --zy-key-glass-arc: linear-gradient(
469
+ 180deg,
470
+ rgba(255, 255, 255, 0.52) 0%,
471
+ rgba(255, 255, 255, 0.34) 45%,
472
+ rgba(255, 255, 255, 0.22) 100%
473
+ );
474
+ --zy-key-glass-arc-l: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 487 487'%3E%3Cpath fill='%23FFF' fill-rule='nonzero' d='M0 .3c67 2.1 134.1 4.3 186.3 37 52.2 32.7 89.6 95.8 112.8 150.6 23.2 54.8 32.3 101.4 61.2 149.9 28.9 48.4 77.7 98.8 126.4 149.2H0V.3z'/%3E%3C/svg%3E");
475
+ --zy-key-glass-arc-r: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 487 487'%3E%3Cpath fill='%23FFF' fill-rule='nonzero' d='M487 486.7c-66.1-3.6-132.3-7.3-186.3-37s-95.9-85.3-126.2-137.2c-30.4-51.8-49.3-99.9-76.5-151.4C70.9 109.6 35.6 54.8.3 0H487v486.7z'/%3E%3C/svg%3E");
476
+
477
+ position: relative;
478
+ /* ::before 的负层级落在「按钮背景之上、文字之下」 */
479
+ isolation: isolate;
480
+ background-color: var(--zy-key-glass-face) !important;
481
+ /* 底部高光仍用主题那张图;面是实色,四边不靠底色透出来 */
482
+ background-image: var(--zy-key-gloss) !important;
483
+ background-repeat: no-repeat !important;
484
+ background-position: left top !important;
485
+ background-size: 100% 100% !important;
486
+ box-shadow:
487
+ 0 var(--zy-key-lift-btn) 0 var(--zy-key-glass-base),
488
+ 0 6px 14px rgba(15, 23, 42, 0.25) !important;
489
+ }
490
+
491
+ /* 乳白雾:单独一层,横向被 mask 收进中间;loading 下让给 Element 的遮罩 */
492
+ html[data-zy-theme='solid']:not(.dark)
493
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info):not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link):not(.is-loading)::before {
494
+ content: '';
495
+ position: absolute;
496
+ inset: 0;
497
+ z-index: -1;
498
+ border-radius: inherit;
499
+ background: var(--zy-key-glass-fog);
500
+ -webkit-mask-image: var(--zy-key-glass-fog-mask);
501
+ mask-image: var(--zy-key-glass-fog-mask);
502
+ pointer-events: none;
503
+ }
504
+
505
+ /* 两块大弧形白高光:收进边内 1px,最外圈留给实色面,四边才锐利 */
506
+ html[data-zy-theme='solid']:not(.dark)
507
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info):not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link):not(.is-loading)::after {
508
+ content: '';
509
+ position: absolute;
510
+ inset: 1px;
511
+ z-index: 1;
512
+ border-radius: inherit;
513
+ background: var(--zy-key-glass-arc);
514
+ -webkit-mask-image: var(--zy-key-glass-arc-l), var(--zy-key-glass-arc-r);
515
+ mask-image: var(--zy-key-glass-arc-l), var(--zy-key-glass-arc-r);
516
+ -webkit-mask-repeat: no-repeat;
517
+ mask-repeat: no-repeat;
518
+ -webkit-mask-position:
519
+ left calc(var(--zy-key-h) * -0.18) bottom 0,
520
+ right calc(var(--zy-key-h) * -0.27) top 0;
521
+ mask-position:
522
+ left calc(var(--zy-key-h) * -0.18) bottom 0,
523
+ right calc(var(--zy-key-h) * -0.27) top 0;
524
+ -webkit-mask-size:
525
+ var(--zy-key-h) 100%,
526
+ calc(var(--zy-key-h) * 1.1) 100%;
527
+ mask-size:
528
+ var(--zy-key-h) 100%,
529
+ calc(var(--zy-key-h) * 1.1) 100%;
530
+ pointer-events: none;
531
+ }
532
+
533
+ /* 文字 / 图标压在弧之上;loading 下交回 Element 的遮罩层级 */
534
+ html[data-zy-theme='solid']:not(.dark)
535
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info):not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link):not(.is-loading)
536
+ .zy-btn-text,
537
+ html[data-zy-theme='solid']:not(.dark)
538
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info):not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link):not(.is-loading)
539
+ > .el-icon {
540
+ position: relative;
541
+ z-index: 2;
542
+ }
543
+
544
+ /* 按下:贴平桌面 —— 底座收平,落地影去掉;位移 / 时长仍走主题 active 规则 */
545
+ html[data-zy-theme='solid']:not(.dark)
546
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info).is-press:not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link):not(.is-disabled):active {
547
+ box-shadow: 0 0 0 var(--zy-key-glass-base) !important;
548
+ }
549
+
550
+ /* 焦点环:玻璃面不能用主题的白环,改用品色 */
551
+ html[data-zy-theme='solid']:not(.dark)
552
+ .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info):not(.is-plain):not(.is-dashed):not(.is-sweep):not(.is-fill):not(.is-text):not(.is-link):focus-visible {
553
+ outline: 2px solid color-mix(in srgb, var(--zy-brand) 55%, transparent);
554
+ outline-offset: 3px;
555
+ }
556
+
429
557
  /* ============================================================
430
558
  * 2 · 图标 —— 无材质,只说明线宽与尺寸(见规范文档)
431
559
  * ============================================================ */
@@ -721,6 +849,34 @@ html[data-zy-theme='solid'] .zy-switch-track {
721
849
  0 10px 18px rgba(15, 23, 42, 0.22);
722
850
  }
723
851
 
852
+ /*
853
+ * 基础款选中轨道 = primary 键面:面色与键帽图层都和按钮共用同一套令牌。
854
+ * 原稿只有一块平色;这里只补 primary 的两侧 10% 白弧 + 底部渐层,几何与动效不动。
855
+ */
856
+ html[data-zy-theme='solid'] .zy-switch--default .zy-switch-default-track {
857
+ --zy-key-h: calc(50px * var(--zy-switch-scale));
858
+ --zy-key-lift-now: 0px;
859
+ }
860
+
861
+ html[data-zy-theme='solid']
862
+ .zy-switch--default
863
+ .zy-switch-input:checked
864
+ + .zy-switch-default-track {
865
+ background-color: var(--zy-brand);
866
+ background-image: var(--zy-key-stack);
867
+ background-repeat: no-repeat;
868
+ background-position: var(--zy-key-stack-pos);
869
+ background-size: var(--zy-key-stack-size);
870
+ }
871
+
872
+ /* 深色档的 primary 键面走品牌深档,开关跟着换 */
873
+ html.dark[data-zy-theme='solid']
874
+ .zy-switch--default
875
+ .zy-switch-input:checked
876
+ + .zy-switch-default-track {
877
+ background-color: var(--zy-brand-key);
878
+ }
879
+
724
880
  /* ============================================================
725
881
  * 8 · 单选框 —— 未选是槽里的小坑,选中是上色键
726
882
  * ============================================================ */
@@ -871,7 +1027,7 @@ html.dark[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio
871
1027
  }
872
1028
 
873
1029
  /* ============================================================
874
- * 9 · 卡片 —— 大键帽:白面 + 挤出边 + 两侧白弧(弧块由组件自带)
1030
+ * 9 · 卡片 —— 正常键帽:白面 + 挤出边 + 两侧白弧(弧块由组件自带)
875
1031
  * ============================================================ */
876
1032
 
877
1033
  html[data-zy-theme='solid'] .zy-card {
@@ -879,8 +1035,8 @@ html[data-zy-theme='solid'] .zy-card {
879
1035
  --zy-card-fill-clr: var(--zy-key-face);
880
1036
  --zy-card-fill-ink: var(--zy-ink);
881
1037
  --zy-card-fill-line: rgba(15, 23, 42, 0.1);
882
- /* 键帽高度「大」档:卡片底座 6px,取自主题令牌,不在组件里另写一份数值 */
883
- --zy-card-fill-lift: var(--zy-key-lift-lg);
1038
+ /* 正常档:卡片底座 4px,与按钮 / 控件同一档 */
1039
+ --zy-card-fill-lift: var(--zy-key-lift);
884
1040
  }
885
1041
 
886
1042
  /* ============================================================
@@ -1557,6 +1713,71 @@ html[data-zy-theme='solid'] .zy-pagination .el-pagination__jump {
1557
1713
  color: var(--zy-muted);
1558
1714
  }
1559
1715
 
1716
+ /* 每页条数:与选择器同一条槽形控件 */
1717
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__wrapper {
1718
+ min-height: 28px;
1719
+ height: 28px;
1720
+ padding: 0 8px;
1721
+ border: 0;
1722
+ border-radius: var(--zy-radius-sm);
1723
+ background-color: var(--zy-slot-face);
1724
+ box-shadow: var(--zy-slot-shadow-sm);
1725
+ font-family: var(--zy-font-sans);
1726
+ transition:
1727
+ box-shadow var(--zy-duration-press) var(--zy-ease-soft),
1728
+ background-color var(--zy-duration-press) var(--zy-ease-soft);
1729
+ }
1730
+
1731
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__wrapper:hover {
1732
+ box-shadow: var(--zy-slot-shadow-sm);
1733
+ }
1734
+
1735
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__wrapper.is-focused,
1736
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__wrapper:focus-within {
1737
+ box-shadow:
1738
+ var(--zy-slot-shadow-sm),
1739
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
1740
+ }
1741
+
1742
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__selected-item,
1743
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__placeholder {
1744
+ color: var(--zy-ink);
1745
+ font-size: 12px;
1746
+ }
1747
+
1748
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__sizes .el-select__caret {
1749
+ color: var(--zy-muted);
1750
+ }
1751
+
1752
+ html[data-zy-theme='solid'] .zy-pagination-popper {
1753
+ border: 0 !important;
1754
+ border-radius: var(--zy-radius) !important;
1755
+ background: var(--zy-key-face);
1756
+ box-shadow:
1757
+ inset 0 1px 0 var(--zy-key-edge),
1758
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
1759
+ var(--zy-key-soft) !important;
1760
+ }
1761
+
1762
+ html[data-zy-theme='solid'] .zy-pagination-popper .el-select-dropdown__item {
1763
+ min-height: 28px;
1764
+ height: 28px;
1765
+ line-height: 28px;
1766
+ border-radius: var(--zy-radius-sm);
1767
+ color: var(--zy-ink);
1768
+ font-family: var(--zy-font-sans);
1769
+ font-size: 12px;
1770
+ }
1771
+
1772
+ html[data-zy-theme='solid'] .zy-pagination-popper .el-select-dropdown__item.is-hovering {
1773
+ background: var(--zy-slot-face);
1774
+ }
1775
+
1776
+ html[data-zy-theme='solid'] .zy-pagination-popper .el-select-dropdown__item.is-selected {
1777
+ color: var(--zy-brand);
1778
+ font-weight: 600;
1779
+ }
1780
+
1560
1781
  /* ============================================================
1561
1782
  * 04 · 滑块拼图验证(实色键帽,方案稿):一块槽 + 两枚键
1562
1783
  * 验证区是槽(凹),缺口是槽里挖出来的暗腔;拼图块是主色键、手柄是中性白键,
@@ -2173,7 +2394,8 @@ html.dark[data-zy-theme='solid'] .zy-loading-ball {
2173
2394
  *
2174
2395
  * 条 = **无标题容器那张面**(白面 + 1px 顶光 + 4px 底座 + 落影),
2175
2396
  * 入口是面上的字(悬停按出一个小坑),展开那颗**点亮并按下**(品牌面 + 两侧白弧 + 底部高光),
2176
- * 面板 = 第四级浮板,面板里的悬停反过来凹下去(槽)—— 一凸一凹才分得清层级。
2397
+ * 面板 = 正常键帽(键面 + 4px 底座 + 落影,厚一档就是大键帽);面板里的悬停反过来凹下去(槽)——
2398
+ * 一凸一凹才分得清层级。
2177
2399
  *
2178
2400
  * 深色:夜色令牌在 §0.1(键面 / 浮板 / 槽 / 语义键面),菜单只在自己的根上把它们
2179
2401
  * 映成一组 --zy-mm-* —— 条、面板、槽、点亮键各自取对应那一级,不再写死数值。
@@ -2185,9 +2407,7 @@ html[data-zy-theme='solid'] .zy-mega-menu {
2185
2407
  --zy-mm-bar-edge: var(--zy-key-edge);
2186
2408
  --zy-mm-bar-shadow: 0 12px 26px rgba(15, 23, 42, 0.12);
2187
2409
  --zy-mm-panel: var(--zy-key-face);
2188
- --zy-mm-panel-shadow:
2189
- 0 var(--zy-key-lift-lg) 0 var(--zy-key-base-strong),
2190
- 0 22px 40px rgba(15, 23, 42, 0.2);
2410
+ --zy-mm-panel-shadow: var(--zy-shadow-card);
2191
2411
  --zy-mm-slot: var(--zy-slot-face);
2192
2412
  --zy-mm-slot-line: var(--zy-slot-line);
2193
2413
  --zy-mm-slot-shadow: var(--zy-slot-shadow-sm);
@@ -2201,13 +2421,13 @@ html[data-zy-theme='solid'] .zy-mega-menu {
2201
2421
  }
2202
2422
 
2203
2423
  html.dark[data-zy-theme='solid'] .zy-mega-menu {
2204
- /* 夜里的四级阶梯全部取 §0.1 的令牌:条回到键面、面板上浮一档、面板里的悬停沉进槽 */
2424
+ /* 夜里的阶梯全部取 §0.1 的令牌:条和面板都回到键面、面板里的悬停沉进槽 */
2205
2425
  --zy-mm-bar: var(--zy-key-face);
2206
2426
  --zy-mm-bar-base: var(--zy-key-base);
2207
2427
  --zy-mm-bar-edge: var(--zy-key-edge);
2208
2428
  --zy-mm-bar-shadow: 0 16px 30px rgba(0, 0, 0, 0.5);
2209
- --zy-mm-panel: var(--zy-key-face-float);
2210
- --zy-mm-panel-shadow: var(--zy-shadow-float);
2429
+ --zy-mm-panel: var(--zy-key-face);
2430
+ --zy-mm-panel-shadow: var(--zy-shadow-card);
2211
2431
  --zy-mm-slot: var(--zy-slot-face);
2212
2432
  --zy-mm-slot-line: var(--zy-slot-line);
2213
2433
  --zy-mm-slot-shadow: var(--zy-slot-shadow-sm);
@@ -2279,7 +2499,7 @@ html[data-zy-theme='solid'] .zy-mega-menu__trigger.is-open {
2279
2499
  html[data-zy-theme='solid'] .zy-mega-menu__panel {
2280
2500
  top: calc(100% + 12px);
2281
2501
  background: var(--zy-mm-panel);
2282
- border-radius: 8px;
2502
+ border-radius: var(--zy-radius);
2283
2503
  box-shadow:
2284
2504
  inset 0 1px 0 var(--zy-mm-bar-edge),
2285
2505
  var(--zy-mm-panel-shadow);
@@ -2349,3 +2569,268 @@ html[data-zy-theme='solid'] .zy-mega-menu__card-title {
2349
2569
  html[data-zy-theme='solid'] .zy-mega-menu__group-ico {
2350
2570
  color: var(--zy-mm-muted);
2351
2571
  }
2572
+
2573
+ /* ---------- 侧边菜单:primary 渐变面板 + 平铺选中 ---------- */
2574
+ html[data-zy-theme='solid'] .zy-side-menu {
2575
+ --zy-side-menu-bg: var(--zy-brand);
2576
+ --zy-side-menu-bg-image: linear-gradient(
2577
+ 180deg,
2578
+ color-mix(in srgb, var(--zy-brand) 84%, var(--zy-color-white)) 0%,
2579
+ var(--zy-brand) 46%,
2580
+ color-mix(in srgb, var(--zy-brand) 84%, #000) 100%
2581
+ );
2582
+ --zy-side-menu-fg: var(--zy-color-white);
2583
+ --zy-side-menu-sub-fg: var(--zy-color-white);
2584
+ --zy-side-menu-muted: var(--zy-color-white);
2585
+ --zy-side-menu-brand: var(--zy-color-white);
2586
+ --zy-side-menu-active-bg: rgba(255, 255, 255, 0.16);
2587
+ --zy-side-menu-active-ink: var(--zy-color-white);
2588
+
2589
+ border: 0;
2590
+ border-radius: var(--zy-radius);
2591
+ box-shadow:
2592
+ inset 0 1px 0 rgba(255, 255, 255, 0.24),
2593
+ 0 10px 24px rgba(15, 23, 42, 0.22);
2594
+ }
2595
+
2596
+ html.dark[data-zy-theme='solid'] .zy-side-menu {
2597
+ --zy-side-menu-bg: var(--zy-brand-key);
2598
+ --zy-side-menu-bg-image: linear-gradient(
2599
+ 180deg,
2600
+ var(--zy-brand-key) 0%,
2601
+ var(--zy-brand-key) 52%,
2602
+ color-mix(in srgb, var(--zy-brand-key) 82%, #000) 100%
2603
+ );
2604
+ }
2605
+
2606
+ /* 白色背景变体:容器回到纸面 / 键面 */
2607
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] {
2608
+ --zy-side-menu-bg: var(--zy-key-face);
2609
+ --zy-side-menu-bg-image: none;
2610
+ --zy-side-menu-fg: var(--zy-ink);
2611
+ --zy-side-menu-sub-fg: var(--zy-muted);
2612
+ --zy-side-menu-muted: var(--zy-muted);
2613
+ --zy-side-menu-brand: var(--zy-brand);
2614
+ --zy-side-menu-active-bg: var(--zy-brand-soft);
2615
+ --zy-side-menu-active-ink: var(--zy-brand);
2616
+
2617
+ border: 1px solid var(--zy-hairline);
2618
+ box-shadow: var(--zy-shadow-card);
2619
+ }
2620
+
2621
+ html.dark[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] {
2622
+ border-color: var(--zy-hairline);
2623
+ }
2624
+
2625
+ /* 滑行高亮:品牌蓝面板用一层白雾,白色面板回到浅槽 */
2626
+ html[data-zy-theme='solid'] .zy-side-menu__glide {
2627
+ background: rgba(255, 255, 255, 0.1);
2628
+ box-shadow: none;
2629
+ }
2630
+
2631
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__glide {
2632
+ background: var(--zy-slot-face);
2633
+ box-shadow: none;
2634
+ }
2635
+
2636
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__brand {
2637
+ border-bottom-color: var(--zy-hairline);
2638
+ }
2639
+
2640
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__link:not(.is-active):hover,
2641
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__sublink:not(.is-active):hover {
2642
+ background: transparent;
2643
+ color: var(--zy-side-menu-fg);
2644
+ }
2645
+
2646
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__link.is-parent-active {
2647
+ background: var(--zy-slot-face);
2648
+ color: var(--zy-side-menu-active-ink);
2649
+ }
2650
+
2651
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__link.is-active {
2652
+ border-left-color: transparent;
2653
+ background: var(--zy-side-menu-active-bg);
2654
+ color: var(--zy-side-menu-active-ink);
2655
+ box-shadow: none;
2656
+ }
2657
+
2658
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__sublink.is-active {
2659
+ color: var(--zy-side-menu-active-ink);
2660
+ background: var(--zy-side-menu-active-bg);
2661
+ box-shadow: none;
2662
+ }
2663
+
2664
+ html[data-zy-theme='solid']
2665
+ .zy-side-menu[data-surface='plain']
2666
+ .zy-side-menu__sublink.is-active
2667
+ .zy-side-menu__dot {
2668
+ background: var(--zy-side-menu-active-ink);
2669
+ opacity: 1;
2670
+ }
2671
+
2672
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__sublink {
2673
+ color: var(--zy-side-menu-sub-fg);
2674
+ }
2675
+
2676
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__badge {
2677
+ background: var(--zy-slot-face);
2678
+ color: var(--zy-muted);
2679
+ }
2680
+
2681
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__sublist::before {
2682
+ background: var(--zy-hairline);
2683
+ }
2684
+
2685
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__footer {
2686
+ border-top-color: var(--zy-hairline);
2687
+ }
2688
+
2689
+ html[data-zy-theme='solid'] .zy-side-menu[data-surface='plain'] .zy-side-menu__link:focus-visible,
2690
+ html[data-zy-theme='solid']
2691
+ .zy-side-menu[data-surface='plain']
2692
+ .zy-side-menu__sublink:focus-visible {
2693
+ outline-color: var(--zy-brand);
2694
+ }
2695
+
2696
+ html[data-zy-theme='solid'] .zy-side-menu__brand {
2697
+ border-bottom-color: rgba(255, 255, 255, 0.22);
2698
+ }
2699
+
2700
+ html[data-zy-theme='solid'] .zy-side-menu__link:hover,
2701
+ html[data-zy-theme='solid'] .zy-side-menu__sublink:hover {
2702
+ background: transparent;
2703
+ color: var(--zy-side-menu-fg);
2704
+ }
2705
+
2706
+ html[data-zy-theme='solid'] .zy-side-menu__link.is-parent-active {
2707
+ background: color-mix(in srgb, var(--zy-side-menu-active-bg) 70%, transparent);
2708
+ color: var(--zy-side-menu-active-ink);
2709
+ }
2710
+
2711
+ /* 选中 = 与二级同一层平铺底,不再使用键帽 */
2712
+ html[data-zy-theme='solid'] .zy-side-menu__link.is-active,
2713
+ html[data-zy-theme='solid'] .zy-side-menu__sublink.is-active {
2714
+ border-left-color: transparent;
2715
+ background: var(--zy-side-menu-active-bg);
2716
+ color: var(--zy-side-menu-active-ink);
2717
+ box-shadow: none;
2718
+ }
2719
+
2720
+ html[data-zy-theme='solid'] .zy-side-menu__link.is-active .zy-side-menu__ico {
2721
+ color: var(--zy-side-menu-active-ink);
2722
+ }
2723
+
2724
+ html[data-zy-theme='solid'] .zy-side-menu__link.is-active .zy-side-menu__badge {
2725
+ background: color-mix(in srgb, var(--zy-side-menu-active-ink) 18%, transparent);
2726
+ color: var(--zy-side-menu-active-ink);
2727
+ }
2728
+
2729
+ html[data-zy-theme='solid'] .zy-side-menu__sublink.is-active .zy-side-menu__dot {
2730
+ background: var(--zy-side-menu-active-ink);
2731
+ opacity: 1;
2732
+ }
2733
+
2734
+ html[data-zy-theme='solid'] .zy-side-menu__badge {
2735
+ background: rgba(0, 0, 0, 0.16);
2736
+ color: var(--zy-color-white);
2737
+ }
2738
+
2739
+ html[data-zy-theme='solid'] .zy-side-menu__sublist::before {
2740
+ background: rgba(255, 255, 255, 0.24);
2741
+ }
2742
+
2743
+ html[data-zy-theme='solid'] .zy-side-menu__footer {
2744
+ border-top-color: rgba(255, 255, 255, 0.22);
2745
+ }
2746
+
2747
+ html[data-zy-theme='solid'] .zy-side-menu__link:focus-visible,
2748
+ html[data-zy-theme='solid'] .zy-side-menu__sublink:focus-visible {
2749
+ outline-color: var(--zy-color-white);
2750
+ }
2751
+
2752
+ html[data-zy-theme='solid'] .zy-side-menu__link.is-active:focus-visible,
2753
+ html[data-zy-theme='solid'] .zy-side-menu__sublink.is-active:focus-visible {
2754
+ outline-color: var(--zy-side-menu-active-ink);
2755
+ }
2756
+
2757
+ /* ---------- 级联选择器:el-cascader 的主题化类 .zy-cascader / .zy-cascader-popper ---------- */
2758
+ html[data-zy-theme='solid'] .zy-cascader .el-input__wrapper {
2759
+ border: 0;
2760
+ border-radius: var(--zy-radius);
2761
+ background-color: var(--zy-slot-face);
2762
+ box-shadow: var(--zy-slot-shadow);
2763
+ transition:
2764
+ box-shadow var(--zy-duration-fast) var(--zy-ease-soft),
2765
+ background-color var(--zy-duration-press) var(--zy-ease-soft);
2766
+ }
2767
+
2768
+ @media (hover: hover) and (pointer: fine) {
2769
+ html[data-zy-theme='solid'] .zy-cascader .el-input__wrapper:hover {
2770
+ box-shadow: var(--zy-slot-shadow-sm);
2771
+ }
2772
+ }
2773
+
2774
+ html[data-zy-theme='solid'] .zy-cascader .el-input__wrapper.is-focus {
2775
+ box-shadow:
2776
+ var(--zy-slot-shadow),
2777
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
2778
+ }
2779
+
2780
+ html[data-zy-theme='solid'] .zy-cascader .el-input__inner {
2781
+ color: var(--zy-ink);
2782
+ font-family: var(--zy-font-sans);
2783
+ }
2784
+
2785
+ html[data-zy-theme='solid'] .zy-cascader-popper {
2786
+ border: 0;
2787
+ border-radius: var(--zy-radius);
2788
+ background: var(--zy-key-face);
2789
+ box-shadow:
2790
+ inset 0 1px 0 var(--zy-key-edge),
2791
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
2792
+ var(--zy-key-soft);
2793
+ }
2794
+
2795
+ html[data-zy-theme='solid'] .zy-cascader-popper .el-cascader-menu {
2796
+ border-right-color: var(--zy-hairline);
2797
+ }
2798
+
2799
+ html[data-zy-theme='solid'] .zy-cascader-popper .el-cascader-node {
2800
+ color: var(--zy-ink);
2801
+ }
2802
+
2803
+ html[data-zy-theme='solid'] .zy-cascader-popper .el-cascader-node.in-active-path,
2804
+ html[data-zy-theme='solid'] .zy-cascader-popper .el-cascader-node.is-active {
2805
+ background: var(--zy-slot-face);
2806
+ color: var(--zy-brand);
2807
+ font-weight: 600;
2808
+ }
2809
+
2810
+ html[data-zy-theme='solid'] .zy-cascader-popper .el-cascader-node.is-disabled {
2811
+ opacity: 0.45;
2812
+ }
2813
+
2814
+ html[data-zy-theme='solid'] .zy-cascader-popper .el-cascader-node__prefix {
2815
+ color: var(--zy-muted);
2816
+ }
2817
+
2818
+ /* ---------- 异形标签页:选中片是切角的品牌键帽 ---------- */
2819
+ html[data-zy-theme='solid'] .zy-tabs {
2820
+ --zy-tabs-carrier-bg: var(--zy-brand-key, var(--zy-brand));
2821
+ --zy-tabs-carrier-image: none;
2822
+ --zy-tabs-carrier-shadow:
2823
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
2824
+ 0 6px 14px rgba(15, 23, 42, 0.18);
2825
+ --zy-tabs-carrier-seam: color-mix(in srgb, var(--zy-color-white) 38%, transparent);
2826
+ --zy-tabs-active-ink: var(--zy-color-white);
2827
+ --zy-tabs-active-index: color-mix(in srgb, var(--zy-color-white) 78%, transparent);
2828
+ --zy-tabs-cut: 16px;
2829
+ --zy-tabs-cut-sm: 10px;
2830
+ --zy-tabs-base-gap: 4px;
2831
+ }
2832
+
2833
+ html[data-zy-theme='solid'] .zy-tabs__tab[aria-selected='true'] {
2834
+ --zy-tabs-badge-bg: color-mix(in srgb, var(--zy-color-white) 20%, transparent);
2835
+ --zy-tabs-badge-ink: var(--zy-color-white);
2836
+ }