@gyyxds/zy-ui 0.0.2 → 0.0.4

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.
@@ -18,7 +18,7 @@
18
18
  * 与组件内 scoped 样式抢属性时,靠前缀 `html[data-zy-theme='solid']` 多出来的那一分
19
19
  * (属性选择器 + 类型选择器)取胜;少数被组件动效底图占住的属性用 !important 并注明。
20
20
  *
21
- * 深色**只换光,不换形**:材质这一层逐条复用,夜里靠 §0.1 的一组令牌把「四级阶梯」压暗、
21
+ * 深色**只换光,不换形**:材质这一层逐条复用,夜里靠 §0.1 的一组令牌把「四级阶梯」压暗、
22
22
  * 顶光收薄(95% → 16%)、落影加重。厚度 / 白弧 / 按下下沉全部保留。
23
23
  */
24
24
  @import './material.css';
@@ -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);
@@ -128,96 +128,96 @@ html[data-zy-theme='solid'] {
128
128
 
129
129
  }
130
130
 
131
- /*
132
- * =====================================================================
133
- * 0.1 · 夜色令牌(键帽 · 夜)
134
- * ---------------------------------------------------------------------
135
- * 同一张桌,关了顶灯:槽最暗、桌面次之、键面亮起、浮板最亮。
136
- * 这一节只改**值**,不改任何结构与材质规则 —— 上面那层(凸 / 凹 / 白弧 / 厚度)
137
- * 一条都不用重写,深色档自动成立。
138
- * =====================================================================
139
- */
140
- html.dark[data-zy-theme='solid'] {
141
- /* ---------- 四级阶梯 ---------- */
142
- --zy-slot-face: #070b12; /* ① 槽:输入 / 托盘 / 轨道 */
143
- --zy-desk: #080d14; /* ② 桌面:页面底 */
144
- --zy-key-face: #2a3444; /* ③ 键面:按钮 / 卡片 / 标签 */
145
- --zy-key-face-float: #303c4c; /* ④ 浮板:对话框 / 弹层 / 面板 */
146
-
147
- --zy-key-base: #1e2734; /* 键面深一档 = 挤出底座 */
148
- --zy-key-base-strong: #131a24; /* 浮板 / 深槽里的底座 */
149
- /* 顶光:浅色档是 95% 白,夜里只剩一道薄光 */
150
- --zy-key-edge: rgba(255, 255, 255, 0.16);
151
- --zy-key-soft: 0 10px 18px rgba(0, 0, 0, 0.55);
152
- --zy-key-down: 0 2px 6px rgba(0, 0, 0, 0.6);
153
-
154
- /* 语义键面(--zy-*-key)与警示墨字在共用深色板 tokens/dark.css,这里不再重复 */
155
-
156
- /* ---------- 槽:内阴影加深、下沿高光收薄(95% → 6%) ---------- */
157
- --zy-slot-line: rgba(255, 255, 255, 0.06);
158
- --zy-slot-shadow:
159
- inset 0 2px 5px rgba(0, 0, 0, 0.62),
160
- inset 0 -1px 0 rgba(255, 255, 255, 0.07);
161
- --zy-slot-shadow-sm:
162
- inset 0 1.5px 4px rgba(0, 0, 0, 0.66),
163
- inset 0 -1px 0 rgba(255, 255, 255, 0.06);
164
-
165
- /* ---------- 覆盖组件层令牌 ---------- */
166
- --zy-surface: var(--zy-key-face);
167
- --zy-surface-sunken: var(--zy-slot-face);
168
- --zy-paper: var(--zy-desk);
169
- --zy-hairline: rgba(255, 255, 255, 0.1);
170
- --zy-hairline-strong: rgba(255, 255, 255, 0.18);
171
- --zy-shadow-card: 0 var(--zy-key-lift) 0 var(--zy-key-base), var(--zy-key-soft);
172
- --zy-shadow-float:
173
- 0 var(--zy-key-lift-lg) 0 var(--zy-key-base-strong),
174
- 0 28px 48px rgba(0, 0, 0, 0.6);
175
- --zy-shadow-deep: rgba(0, 0, 0, 0.55);
176
- --zy-shadow-press:
177
- 0 var(--zy-key-lift) 0 color-mix(in srgb, var(--zy-brand) 74%, #000),
178
- var(--zy-key-soft);
179
- --zy-focus-ring:
180
- 0 0 0 2px var(--zy-key-face),
181
- 0 0 0 4px color-mix(in srgb, var(--zy-brand) 45%, transparent);
182
- --zy-panel-body-bg: #1d2632;
183
-
184
- /* 表格:托盘更暗、表头是抬起的键条、斑马行在槽里分层 */
185
- --zy-table-header-bg: var(--zy-key-face);
186
- --zy-table-header-fg: #cfe1f2;
187
- --zy-table-row-stripe: color-mix(in srgb, var(--zy-key-face) 48%, var(--zy-slot-face));
188
- --zy-table-row-hover: transparent;
189
-
190
- /* 实心按钮:本主题不用渐变,这里只是把渐变令牌清空 */
191
- --zy-btn-grad-primary: none;
192
- --zy-btn-grad-primary-hover: none;
193
- --zy-btn-grad-success: none;
194
- --zy-btn-grad-success-hover: none;
195
- --zy-btn-grad-warning: none;
196
- --zy-btn-grad-warning-hover: none;
197
- --zy-btn-grad-info: none;
198
- --zy-btn-grad-info-hover: none;
199
-
200
- /*
201
- * 彩色键的 1px 顶亮边:浅色档是纯白(透明),夜里收薄到 34%,
202
- * 否则一颗深蓝键上会顶着一条纯白发丝 —— 那是全场最亮的一条线。
203
- */
204
- --zy-btn-edge-primary: rgba(255, 255, 255, 0.34);
205
- --zy-btn-edge-success: rgba(255, 255, 255, 0.34);
206
- --zy-btn-edge-warning: rgba(255, 255, 255, 0.34);
207
- --zy-btn-edge-info: rgba(255, 255, 255, 0.34);
208
- --zy-btn-fill-shade: rgba(255, 255, 255, 0.22);
209
-
210
- /* Element 映射 */
211
- --el-fill-color-light: var(--zy-slot-face);
212
- --el-fill-color-lighter: var(--zy-slot-face);
213
- --el-bg-color-overlay: var(--zy-key-face-float);
214
- --el-mask-color: rgba(0, 0, 0, 0.66);
215
- --el-border-color: var(--zy-hairline);
216
- --el-border-color-light: var(--zy-hairline);
217
- --el-border-color-lighter: var(--zy-hairline);
218
- --el-border-color-extra-light: var(--zy-hairline);
219
- }
220
-
131
+ /*
132
+ * =====================================================================
133
+ * 0.1 · 夜色令牌(键帽 · 夜)
134
+ * ---------------------------------------------------------------------
135
+ * 同一张桌,关了顶灯:槽最暗、桌面次之、键面亮起、浮板最亮。
136
+ * 这一节只改**值**,不改任何结构与材质规则 —— 上面那层(凸 / 凹 / 白弧 / 厚度)
137
+ * 一条都不用重写,深色档自动成立。
138
+ * =====================================================================
139
+ */
140
+ html.dark[data-zy-theme='solid'] {
141
+ /* ---------- 四级阶梯 ---------- */
142
+ --zy-slot-face: #070b12; /* ① 槽:输入 / 托盘 / 轨道 */
143
+ --zy-desk: #080d14; /* ② 桌面:页面底 */
144
+ --zy-key-face: #2a3444; /* ③ 键面:按钮 / 卡片 / 标签 */
145
+ --zy-key-face-float: #303c4c; /* ④ 浮板:对话框 / 弹层 / 面板 */
146
+
147
+ --zy-key-base: #1e2734; /* 键面深一档 = 挤出底座 */
148
+ --zy-key-base-strong: #131a24; /* 浮板 / 深槽里的底座 */
149
+ /* 顶光:浅色档是 95% 白,夜里只剩一道薄光 */
150
+ --zy-key-edge: rgba(255, 255, 255, 0.16);
151
+ --zy-key-soft: 0 10px 18px rgba(0, 0, 0, 0.55);
152
+ --zy-key-down: 0 2px 6px rgba(0, 0, 0, 0.6);
153
+
154
+ /* 语义键面(--zy-*-key)与警示墨字在共用深色板 tokens/dark.css,这里不再重复 */
155
+
156
+ /* ---------- 槽:内阴影加深、下沿高光收薄(95% → 6%) ---------- */
157
+ --zy-slot-line: rgba(255, 255, 255, 0.06);
158
+ --zy-slot-shadow:
159
+ inset 0 2px 5px rgba(0, 0, 0, 0.62),
160
+ inset 0 -1px 0 rgba(255, 255, 255, 0.07);
161
+ --zy-slot-shadow-sm:
162
+ inset 0 1.5px 4px rgba(0, 0, 0, 0.66),
163
+ inset 0 -1px 0 rgba(255, 255, 255, 0.06);
164
+
165
+ /* ---------- 覆盖组件层令牌 ---------- */
166
+ --zy-surface: var(--zy-key-face);
167
+ --zy-surface-sunken: var(--zy-slot-face);
168
+ --zy-paper: var(--zy-desk);
169
+ --zy-hairline: rgba(255, 255, 255, 0.1);
170
+ --zy-hairline-strong: rgba(255, 255, 255, 0.18);
171
+ --zy-shadow-card: 0 var(--zy-key-lift) 0 var(--zy-key-base), var(--zy-key-soft);
172
+ --zy-shadow-float:
173
+ 0 var(--zy-key-lift-lg) 0 var(--zy-key-base-strong),
174
+ 0 28px 48px rgba(0, 0, 0, 0.6);
175
+ --zy-shadow-deep: rgba(0, 0, 0, 0.55);
176
+ --zy-shadow-press:
177
+ 0 var(--zy-key-lift) 0 color-mix(in srgb, var(--zy-brand) 74%, #000),
178
+ var(--zy-key-soft);
179
+ --zy-focus-ring:
180
+ 0 0 0 2px var(--zy-key-face),
181
+ 0 0 0 4px color-mix(in srgb, var(--zy-brand) 45%, transparent);
182
+ --zy-panel-body-bg: #1d2632;
183
+
184
+ /* 表格:托盘更暗、表头是抬起的键条、斑马行在槽里分层 */
185
+ --zy-table-header-bg: var(--zy-key-face);
186
+ --zy-table-header-fg: #cfe1f2;
187
+ --zy-table-row-stripe: color-mix(in srgb, var(--zy-key-face) 48%, var(--zy-slot-face));
188
+ --zy-table-row-hover: transparent;
189
+
190
+ /* 实心按钮:本主题不用渐变,这里只是把渐变令牌清空 */
191
+ --zy-btn-grad-primary: none;
192
+ --zy-btn-grad-primary-hover: none;
193
+ --zy-btn-grad-success: none;
194
+ --zy-btn-grad-success-hover: none;
195
+ --zy-btn-grad-warning: none;
196
+ --zy-btn-grad-warning-hover: none;
197
+ --zy-btn-grad-info: none;
198
+ --zy-btn-grad-info-hover: none;
199
+
200
+ /*
201
+ * 彩色键的 1px 顶亮边:浅色档是纯白(透明),夜里收薄到 34%,
202
+ * 否则一颗深蓝键上会顶着一条纯白发丝 —— 那是全场最亮的一条线。
203
+ */
204
+ --zy-btn-edge-primary: rgba(255, 255, 255, 0.34);
205
+ --zy-btn-edge-success: rgba(255, 255, 255, 0.34);
206
+ --zy-btn-edge-warning: rgba(255, 255, 255, 0.34);
207
+ --zy-btn-edge-info: rgba(255, 255, 255, 0.34);
208
+ --zy-btn-fill-shade: rgba(255, 255, 255, 0.22);
209
+
210
+ /* Element 映射 */
211
+ --el-fill-color-light: var(--zy-slot-face);
212
+ --el-fill-color-lighter: var(--zy-slot-face);
213
+ --el-bg-color-overlay: var(--zy-key-face-float);
214
+ --el-mask-color: rgba(0, 0, 0, 0.66);
215
+ --el-border-color: var(--zy-hairline);
216
+ --el-border-color-light: var(--zy-hairline);
217
+ --el-border-color-lighter: var(--zy-hairline);
218
+ --el-border-color-extra-light: var(--zy-hairline);
219
+ }
220
+
221
221
  html[data-zy-theme='solid'] .zy-btn.el-button {
222
222
  font-weight: var(--zy-weight-control);
223
223
  /*
@@ -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
  * ============================================================ */
@@ -871,7 +999,7 @@ html.dark[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio
871
999
  }
872
1000
 
873
1001
  /* ============================================================
874
- * 9 · 卡片 —— 大键帽:白面 + 挤出边 + 两侧白弧(弧块由组件自带)
1002
+ * 9 · 卡片 —— 正常键帽:白面 + 挤出边 + 两侧白弧(弧块由组件自带)
875
1003
  * ============================================================ */
876
1004
 
877
1005
  html[data-zy-theme='solid'] .zy-card {
@@ -879,8 +1007,8 @@ html[data-zy-theme='solid'] .zy-card {
879
1007
  --zy-card-fill-clr: var(--zy-key-face);
880
1008
  --zy-card-fill-ink: var(--zy-ink);
881
1009
  --zy-card-fill-line: rgba(15, 23, 42, 0.1);
882
- /* 键帽高度「大」档:卡片底座 6px,取自主题令牌,不在组件里另写一份数值 */
883
- --zy-card-fill-lift: var(--zy-key-lift-lg);
1010
+ /* 正常档:卡片底座 4px,与按钮 / 控件同一档 */
1011
+ --zy-card-fill-lift: var(--zy-key-lift);
884
1012
  }
885
1013
 
886
1014
  /* ============================================================
@@ -1749,397 +1877,397 @@ html[data-zy-theme='solid'] .zy-panel:has(.zy-panel__head) > .zy-panel__body {
1749
1877
  * 无障碍:实色主题的按压、回弹、滑行和辉光都必须尊重 reduced-motion。
1750
1878
  * 组件自身的 reduced-motion 规则保留;这里兜住主题层新增的过渡与动画。
1751
1879
  * ============================================================ */
1752
- /*
1753
- * =====================================================================
1754
- * 0.2 · 逐组件的「光」
1755
- * ---------------------------------------------------------------------
1756
- * 前面那些写死的浅色(rgba(15,23,42) 的落影、纯白的顶边、白面键)在夜里等于没有,
1757
- * 这一节按**同一组数值**把它们换成夜色:厚度、位移、圆角一个都不改,只换光。
1758
- * 写法与提案稿逐条对齐;配色仍从 §0.1 的令牌里取。
1759
- * =====================================================================
1760
- */
1761
-
1762
- /* 2.1 键帽几何:solid.css 里那些写死的浅色落影(rgba(15,23,42))在深色下等于没有,
1763
- * 这里按同一组数值把「影」换成黑,厚度与位移一个都不改。 */
1764
- html.dark[data-zy-theme='solid'] .zy-btn.is-press:not(.is-fill):not(.is-text):not(.is-link),
1765
- html.dark[data-zy-theme='solid'] .zy-btn.is-plain,
1766
- html.dark[data-zy-theme='solid'] .zy-btn.is-dashed,
1767
- html.dark[data-zy-theme='solid'] .zy-btn.is-sweep {
1768
- box-shadow:
1769
- 0 var(--zy-key-lift-btn) 0 var(--zy-key-base-btn),
1770
- 0 6px 14px rgba(0, 0, 0, 0.55) !important;
1771
- }
1772
-
1773
- html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-press:not(.is-fill):not(.is-text):not(.is-link):not(.is-disabled):active,
1774
- html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-plain:not(.is-disabled):active,
1775
- html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-dashed:not(.is-disabled):active,
1776
- html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-sweep:not(.is-disabled):active {
1777
- box-shadow:
1778
- 0 0 0 var(--zy-key-base-btn),
1779
- 0 2px 6px rgba(0, 0, 0, 0.6) !important;
1780
- }
1781
-
1782
- html.dark[data-zy-theme='solid'] .zy-btn:focus-visible {
1783
- box-shadow:
1784
- 0 var(--zy-key-lift-btn) 0 var(--zy-key-base-btn),
1785
- 0 6px 14px rgba(0, 0, 0, 0.55) !important;
1786
- }
1787
-
1788
- /* 2.2 彩色键面:键面用深档,字仍用白(这一条是「字色跟面走」的正面用法) */
1789
- html.dark[data-zy-theme='solid'] .zy-btn.el-button--primary {
1790
- --zy-key-face-btn: var(--zy-brand-key);
1791
- --zy-key-ink-btn: #fff;
1792
- }
1793
-
1794
- html.dark[data-zy-theme='solid'] .zy-btn.el-button--success {
1795
- --zy-key-face-btn: var(--zy-green-key);
1796
- --zy-key-ink-btn: #fff;
1797
- }
1798
-
1799
- html.dark[data-zy-theme='solid'] .zy-btn.el-button--warning {
1800
- --zy-key-face-btn: var(--zy-warning-key);
1801
- --zy-key-ink-btn: var(--zy-warning-ink);
1802
- }
1803
-
1804
- html.dark[data-zy-theme='solid'] .zy-btn.el-button--danger {
1805
- --zy-key-face-btn: var(--zy-danger-key);
1806
- --zy-key-ink-btn: #fff;
1807
- }
1808
-
1809
- html.dark[data-zy-theme='solid'] .zy-btn.el-button--info {
1810
- --zy-key-face-btn: var(--zy-info-key);
1811
- --zy-key-ink-btn: #fff;
1812
- }
1813
-
1814
- /* fill(键帽本体)用的是组件自己的 --zy-btn-fill-* 一组:
1815
- * 面色跟着深档、底座跟着面色深一档、影换成黑 —— 数值还是组件那几条公式,只换输入。 */
1816
- html.dark[data-zy-theme='solid'] .zy-btn.is-fill {
1817
- --zy-btn-fill-clr: var(--zy-brand-key);
1818
- --zy-btn-fill-hover-clr: #121a24;
1819
- --zy-btn-fill-shadow:
1820
- 0 var(--zy-btn-fill-lift) 0 var(--zy-btn-fill-base),
1821
- 0 6px 14px rgba(0, 0, 0, 0.55);
1822
- --zy-btn-fill-shadow-on:
1823
- 0 var(--zy-btn-fill-lift) 0 var(--zy-btn-fill-base-on),
1824
- 0 6px 14px rgba(0, 0, 0, 0.55);
1825
- --zy-btn-fill-shadow-down:
1826
- 0 0 0 var(--zy-btn-fill-base),
1827
- 0 2px 6px rgba(0, 0, 0, 0.6);
1828
- }
1829
-
1830
- html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--success {
1831
- --zy-btn-fill-clr: var(--zy-green-key);
1832
- }
1833
-
1834
- html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--warning {
1835
- --zy-btn-fill-clr: var(--zy-warning-key);
1836
- --zy-btn-fill-ink: var(--zy-warning-ink);
1837
- /* 悬停铺开的是深色键帽,铺开之后字必须回到白 —— 不能让墨字落在深色上 */
1838
- --zy-btn-fill-ink-on: #fff;
1839
- }
1840
-
1841
- html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--danger {
1842
- --zy-btn-fill-clr: var(--zy-danger-key);
1843
- }
1844
-
1845
- html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--info {
1846
- --zy-btn-fill-clr: var(--zy-info-key);
1847
- }
1848
-
1849
- /* 中性键(无 type):面用键面档,底座仍是「面色深一档」那条公式 */
1850
- html.dark[data-zy-theme='solid'] .zy-btn.is-fill:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info) {
1851
- --zy-btn-fill-clr: var(--zy-key-face);
1852
- --zy-btn-fill-base: var(--zy-key-base);
1853
- --zy-btn-fill-ink: var(--zy-ink);
1854
- --zy-btn-fill-ink-on: #fff;
1855
- }
1856
-
1857
- /* 2.3 控件:槽不变形,只把「凹」加深;聚焦仍是槽外 2px 品牌环 */
1858
- html.dark[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper,
1859
- html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper {
1860
- box-shadow:
1861
- 0 var(--zy-key-lift) 0 var(--zy-key-base),
1862
- 0 6px 14px rgba(0, 0, 0, 0.55);
1863
- }
1864
-
1865
- @media (hover: hover) and (pointer: fine) {
1866
- html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper:hover {
1867
- box-shadow:
1868
- 0 var(--zy-key-lift) 0 var(--zy-key-base),
1869
- 0 6px 14px rgba(0, 0, 0, 0.55);
1870
- }
1871
- }
1872
-
1873
- html.dark[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper.is-focus,
1874
- html.dark[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper.is-focus:hover,
1875
- html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper.is-focused,
1876
- html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper.is-focus,
1877
- html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper:focus-visible {
1878
- box-shadow:
1879
- 0 0 0 var(--zy-key-base),
1880
- 0 2px 6px rgba(0, 0, 0, 0.6);
1881
- }
1882
-
1883
- /* 2.4 浮板:对话框 / 下拉 / 日期 / 时间 / 面板都抬到第四级,底座取更深的 --zy-key-base-strong */
1884
- html.dark[data-zy-theme='solid'] .zy-select-popper,
1885
- html.dark[data-zy-theme='solid'] .el-picker-panel,
1886
- html.dark[data-zy-theme='solid'] .el-time-panel,
1887
- html.dark[data-zy-theme='solid'] .el-time-range-picker {
1888
- background: var(--zy-key-face-float);
1889
- box-shadow:
1890
- inset 0 1px 0 var(--zy-key-edge),
1891
- 0 var(--zy-key-lift-sm) 0 var(--zy-key-base-strong),
1892
- 0 20px 36px rgba(0, 0, 0, 0.62) !important;
1893
- }
1894
-
1895
- html.dark[data-zy-theme='solid'] .zy-select-popper .zy-select-glide-pill {
1896
- background: var(--zy-slot-face);
1897
- box-shadow: var(--zy-slot-shadow-sm);
1898
- }
1899
-
1900
- html.dark[data-zy-theme='solid'] .zy-dialog {
1901
- background: var(--zy-key-face-float);
1902
- box-shadow:
1903
- inset 0 1px 0 var(--zy-key-edge),
1904
- 0 var(--zy-key-lift) 0 var(--zy-key-base-strong),
1905
- 0 32px 56px rgba(0, 0, 0, 0.7);
1906
- }
1907
-
1908
- html.dark[data-zy-theme='solid'] .zy-dialog .el-dialog__header,
1909
- html.dark[data-zy-theme='solid'] .zy-dialog .el-dialog__footer,
1910
- html.dark[data-zy-theme='solid'] .el-time-panel__footer {
1911
- background: var(--zy-slot-face);
1912
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
1913
- }
1914
-
1915
- html.dark[data-zy-theme='solid'] .zy-dialog .zy-dialog-mark {
1916
- background: var(--zy-brand-key);
1917
- box-shadow:
1918
- inset 0 1px 0 rgba(255, 255, 255, 0.24),
1919
- 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
1920
- }
1921
-
1922
- html.dark[data-zy-theme='solid'] .zy-panel {
1923
- background: var(--zy-key-face);
1924
- box-shadow:
1925
- inset 0 1px 0 var(--zy-key-edge),
1926
- 0 var(--zy-key-lift) 0 var(--zy-key-base),
1927
- 0 16px 30px rgba(0, 0, 0, 0.5);
1928
- }
1929
-
1930
- html.dark[data-zy-theme='solid'] .zy-panel__head {
1931
- background: var(--zy-key-face);
1932
- box-shadow: inset 0 -2px 0 var(--zy-slot-line);
1933
- }
1934
-
1935
- /* 2.5 选中的那几处:solid.css 里它们都直接铺 `--zy-brand`(亮档),
1936
- * 深色下必须换成键面档,否则白字落在亮蓝上只有 2.4:1。 */
1937
- html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li.is-active,
1938
- html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.current:not(.disabled) .el-date-table-cell__text,
1939
- html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.start-date .el-date-table-cell__text,
1940
- html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.end-date .el-date-table-cell__text,
1941
- html.dark[data-zy-theme='solid'] .el-time-panel .el-time-spinner__item.is-active,
1942
- html.dark[data-zy-theme='solid'] .el-time-range-picker .el-time-spinner__item.is-active,
1943
- html.dark[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content,
1944
- html.dark[data-zy-theme='solid'] .zy-verify__piece {
1945
- background-color: var(--zy-brand-key);
1946
- }
1947
-
1948
- html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li.is-active,
1949
- html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.current:not(.disabled) .el-date-table-cell__text,
1950
- html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.start-date .el-date-table-cell__text,
1951
- html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.end-date .el-date-table-cell__text,
1952
- html.dark[data-zy-theme='solid'] .el-time-panel .el-time-spinner__item.is-active,
1953
- html.dark[data-zy-theme='solid'] .el-time-range-picker .el-time-spinner__item.is-active,
1954
- html.dark[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content,
1955
- html.dark[data-zy-theme='solid'] .zy-verify__piece {
1956
- box-shadow:
1957
- inset 0 1px 0 rgba(255, 255, 255, 0.22),
1958
- 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
1959
- }
1960
-
1961
- html.dark[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content {
1962
- box-shadow:
1963
- inset 0 1px 0 rgba(255, 255, 255, 0.22),
1964
- 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
1965
- }
1966
-
1967
- html.dark[data-zy-theme='solid'] .zy-verify__piece::after {
1968
- background-color: var(--zy-brand-key);
1969
- }
1970
-
1971
- /* 2.6 其余小件:把浅色档写死的落影 / 高光换成深色下的对应物 */
1972
- html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li,
1973
- html.dark[data-zy-theme='solid'] .zy-pagination button.btn-prev,
1974
- html.dark[data-zy-theme='solid'] .zy-pagination button.btn-next {
1975
- box-shadow:
1976
- inset 0 1px 0 var(--zy-key-edge),
1977
- 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
1978
- 0 4px 8px rgba(0, 0, 0, 0.45);
1979
- }
1980
-
1981
- html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li:active,
1982
- html.dark[data-zy-theme='solid'] .zy-pagination button.btn-prev:not(:disabled):active,
1983
- html.dark[data-zy-theme='solid'] .zy-pagination button.btn-next:not(:disabled):active {
1984
- box-shadow: 0 0 0 var(--zy-key-base);
1985
- }
1986
-
1987
- html.dark[data-zy-theme='solid'] .zy-pagination .btn-prev:disabled,
1988
- html.dark[data-zy-theme='solid'] .zy-pagination .btn-next:disabled {
1989
- box-shadow:
1990
- inset 0 1px 0 var(--zy-key-edge),
1991
- 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
1992
- }
1993
-
1994
- /* 复选框:面色取键面档(白勾 4.88:1),底座仍按「面色深一档」 */
1995
- html.dark[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input:not(.is-disabled).is-checked .el-checkbox__inner,
1996
- html.dark[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input:not(.is-disabled).is-indeterminate .el-checkbox__inner,
1997
- html.dark[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-disabled).is-checked .el-checkbox__inner,
1998
- html.dark[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-disabled).is-indeterminate .el-checkbox__inner {
1999
- background-color: var(--zy-brand-key);
2000
- box-shadow:
2001
- inset 0 1px 0 rgba(255, 255, 255, 0.22),
2002
- 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
2003
- }
2004
-
2005
- /* 分段组滑行块 / 树里的滑行键:面与底座走键面档 */
2006
- html.dark[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio-button-slider {
2007
- box-shadow:
2008
- inset 0 1px 0 var(--zy-key-edge),
2009
- 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
2010
- 0 6px 12px rgba(0, 0, 0, 0.5);
2011
- }
2012
-
2013
- html.dark[data-zy-theme='solid'] .zy-radio .el-radio__inner {
2014
- background: var(--zy-slot-face);
2015
- }
2016
-
2017
- /* 开关:全息轨道保留,只把「按在桌上」的那 2px 底座换成更深的档 */
2018
- html.dark[data-zy-theme='solid'] .zy-switch-track {
2019
- box-shadow:
2020
- 0 var(--zy-key-lift-sm) 0 #04070b,
2021
- 0 10px 18px rgba(0, 0, 0, 0.55);
2022
- }
2023
-
2024
- /* 标签:浅色档的底座是「面色 26% 混 #c8d2de」(浅灰),深色下混到键面上;顶亮边从 85% 收薄 */
2025
- html.dark[data-zy-theme='solid'] .zy-tag {
2026
- box-shadow:
2027
- inset 0 1px 0 rgba(255, 255, 255, 0.14),
2028
- 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--el-tag-text-color) 24%, var(--zy-key-base)),
2029
- 0 4px 8px rgba(0, 0, 0, 0.35);
2030
- }
2031
-
2032
- html.dark[data-zy-theme='solid'] .zy-tag.is-fill {
2033
- --zy-tag-fill-clr: var(--zy-brand-key);
2034
- }
2035
-
2036
- html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--success {
2037
- --zy-tag-fill-clr: var(--zy-green-key);
2038
- }
2039
-
2040
- html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--warning {
2041
- --zy-tag-fill-clr: var(--zy-warning-key);
2042
- /* 琥珀面上白字只有 2.19:1;同 «实心按钮» 的做法,字换深墨(9.19:1) */
2043
- color: var(--zy-warning-ink);
2044
- --el-tag-text-color: var(--zy-warning-ink);
2045
- --el-tag-hover-color: var(--zy-warning-ink);
2046
- }
2047
-
2048
- html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--danger {
2049
- --zy-tag-fill-clr: var(--zy-danger-key);
2050
- }
2051
-
2052
- html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--info {
2053
- --zy-tag-fill-clr: var(--zy-info-key);
2054
- }
2055
-
2056
- /* 2.7 卡片:ZyCard 自己会把「面色 82% + 黑」推成底座、再配一层写死的浅色落影
2057
- * (rgba(15,23,42,.24))—— 深色下这层影等于没有,而且推出来的底座比 --zy-key-base 更亮一档。
2058
- * 卡片与按钮必须共用同一个底座,否则同一张桌上会出现两种厚度的键。 */
2059
- html.dark[data-zy-theme='solid'] .zy-card {
2060
- --zy-card-fill-base: var(--zy-key-base);
2061
- --zy-card-fill-base-on: #0f151d;
2062
- --zy-card-fill-hover-clr: #121a24;
2063
- /* 页眉分割线在键面上是一道「刻痕」,不是一道亮线 */
2064
- --zy-card-fill-line: rgba(0, 0, 0, 0.45);
2065
- --zy-card-fill-shadow:
2066
- 0 var(--zy-card-fill-lift) 0 var(--zy-key-base),
2067
- 0 14px 26px rgba(0, 0, 0, 0.5);
2068
- --zy-card-fill-shadow-press: 0 0 0 var(--zy-key-base);
2069
- }
2070
-
2071
- /* 2.8 舞台:同 A 的 1.9 —— 半透明叠色在深色下会把「台面」压到比桌面更暗,层级就反了 */
2072
-
2073
- /* 角标:一圈暗底 + 落地影,深色下影要更实 */
2074
- html.dark[data-zy-theme='solid'] .zy-badge .el-badge__content {
2075
- box-shadow:
2076
- inset 0 1px 0 rgba(255, 255, 255, 0.22),
2077
- 0 2px 0 rgba(0, 0, 0, 0.5),
2078
- 0 5px 10px rgba(0, 0, 0, 0.45);
2079
- }
2080
-
2081
- /* 进度条:轨道是槽;填充是一条键条,亮端提亮、暗端落深 */
2082
- html.dark[data-zy-theme='solid'] .zy-progress .el-progress-bar__inner {
2083
- background: linear-gradient(90deg, #5aa6e4 0%, #2876af 100%);
2084
- box-shadow:
2085
- inset 0 1px 0 rgba(255, 255, 255, 0.28),
2086
- inset 0 -1px 0 rgba(0, 0, 0, 0.3),
2087
- 0 2px 0 rgba(0, 0, 0, 0.45);
2088
- }
2089
-
2090
- /* 表格:托盘(槽)比桌面再暗一档;表头的下沿刻痕改成暗线;斑马行的条纹从键面混出来 */
2091
- html.dark[data-zy-theme='solid'] .zy-table-tray {
2092
- background-color: #0e1622;
2093
- box-shadow: var(--zy-slot-shadow);
2094
- }
2095
-
2096
- html.dark[data-zy-theme='solid'] .zy-table th.el-table__cell {
2097
- background-color: var(--zy-key-face);
2098
- box-shadow:
2099
- inset 0 1px 0 var(--zy-key-edge),
2100
- inset 0 -1px 0 rgba(0, 0, 0, 0.4),
2101
- 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
2102
- }
2103
-
2104
- html.dark[data-zy-theme='solid'] .zy-table .el-table__body tr.el-table__row--striped > td.el-table__cell {
2105
- background-color: color-mix(in srgb, var(--zy-key-face) 42%, var(--zy-slot-face));
2106
- }
2107
-
2108
- /* 树:整棵是托盘;悬停滑行的是一枚小键(面 + 顶光 + 小档底座) */
2109
- html.dark[data-zy-theme='solid'] .zy-tree {
2110
- background-color: #0e1622;
2111
- box-shadow: var(--zy-slot-shadow);
2112
- }
2113
-
2114
- html.dark[data-zy-theme='solid'] .zy-tree-shell .zy-tree-glide {
2115
- background: var(--zy-key-face);
2116
- box-shadow:
2117
- inset 0 1px 0 var(--zy-key-edge),
2118
- 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
2119
- }
2120
-
2121
- /* 提示:键帽条 + 左侧 6px 语义键块;底座 / 落影 / 亮边都换成深色档 */
2122
- html.dark[data-zy-theme='solid'] .zy-alert {
2123
- background: var(--zy-key-face);
2124
- box-shadow:
2125
- inset 0 1px 0 var(--zy-key-edge),
2126
- 0 var(--zy-key-lift) 0 var(--zy-key-base),
2127
- 0 6px 14px rgba(0, 0, 0, 0.55);
2128
- }
2129
-
2130
- /* 分割线:仍是一道刻痕(上暗下亮),深色下「暗」是纯黑、「亮」是 10% 白 —— 不能再用纯白 */
2131
- html.dark[data-zy-theme='solid'] .zy-divider.el-divider--horizontal {
2132
- background: linear-gradient(180deg, #000 0%, rgba(255, 255, 255, 0.1) 100%);
2133
- }
2134
-
2135
- /* 加载:落在桌面上的底影换成黑 */
2136
- html.dark[data-zy-theme='solid'] .zy-loading-dot::before,
2137
- html.dark[data-zy-theme='solid'] .zy-loading-ball {
2138
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.55);
2139
- }
2140
-
2141
- /* 滑块拼图验证:槽里的缺口要更暗(浅色档是墨色 60%,深色下直接用黑) */
2142
-
1880
+ /*
1881
+ * =====================================================================
1882
+ * 0.2 · 逐组件的「光」
1883
+ * ---------------------------------------------------------------------
1884
+ * 前面那些写死的浅色(rgba(15,23,42) 的落影、纯白的顶边、白面键)在夜里等于没有,
1885
+ * 这一节按**同一组数值**把它们换成夜色:厚度、位移、圆角一个都不改,只换光。
1886
+ * 写法与提案稿逐条对齐;配色仍从 §0.1 的令牌里取。
1887
+ * =====================================================================
1888
+ */
1889
+
1890
+ /* 2.1 键帽几何:solid.css 里那些写死的浅色落影(rgba(15,23,42))在深色下等于没有,
1891
+ * 这里按同一组数值把「影」换成黑,厚度与位移一个都不改。 */
1892
+ html.dark[data-zy-theme='solid'] .zy-btn.is-press:not(.is-fill):not(.is-text):not(.is-link),
1893
+ html.dark[data-zy-theme='solid'] .zy-btn.is-plain,
1894
+ html.dark[data-zy-theme='solid'] .zy-btn.is-dashed,
1895
+ html.dark[data-zy-theme='solid'] .zy-btn.is-sweep {
1896
+ box-shadow:
1897
+ 0 var(--zy-key-lift-btn) 0 var(--zy-key-base-btn),
1898
+ 0 6px 14px rgba(0, 0, 0, 0.55) !important;
1899
+ }
1900
+
1901
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-press:not(.is-fill):not(.is-text):not(.is-link):not(.is-disabled):active,
1902
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-plain:not(.is-disabled):active,
1903
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-dashed:not(.is-disabled):active,
1904
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button.is-sweep:not(.is-disabled):active {
1905
+ box-shadow:
1906
+ 0 0 0 var(--zy-key-base-btn),
1907
+ 0 2px 6px rgba(0, 0, 0, 0.6) !important;
1908
+ }
1909
+
1910
+ html.dark[data-zy-theme='solid'] .zy-btn:focus-visible {
1911
+ box-shadow:
1912
+ 0 var(--zy-key-lift-btn) 0 var(--zy-key-base-btn),
1913
+ 0 6px 14px rgba(0, 0, 0, 0.55) !important;
1914
+ }
1915
+
1916
+ /* 2.2 彩色键面:键面用深档,字仍用白(这一条是「字色跟面走」的正面用法) */
1917
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button--primary {
1918
+ --zy-key-face-btn: var(--zy-brand-key);
1919
+ --zy-key-ink-btn: #fff;
1920
+ }
1921
+
1922
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button--success {
1923
+ --zy-key-face-btn: var(--zy-green-key);
1924
+ --zy-key-ink-btn: #fff;
1925
+ }
1926
+
1927
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button--warning {
1928
+ --zy-key-face-btn: var(--zy-warning-key);
1929
+ --zy-key-ink-btn: var(--zy-warning-ink);
1930
+ }
1931
+
1932
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button--danger {
1933
+ --zy-key-face-btn: var(--zy-danger-key);
1934
+ --zy-key-ink-btn: #fff;
1935
+ }
1936
+
1937
+ html.dark[data-zy-theme='solid'] .zy-btn.el-button--info {
1938
+ --zy-key-face-btn: var(--zy-info-key);
1939
+ --zy-key-ink-btn: #fff;
1940
+ }
1941
+
1942
+ /* fill(键帽本体)用的是组件自己的 --zy-btn-fill-* 一组:
1943
+ * 面色跟着深档、底座跟着面色深一档、影换成黑 —— 数值还是组件那几条公式,只换输入。 */
1944
+ html.dark[data-zy-theme='solid'] .zy-btn.is-fill {
1945
+ --zy-btn-fill-clr: var(--zy-brand-key);
1946
+ --zy-btn-fill-hover-clr: #121a24;
1947
+ --zy-btn-fill-shadow:
1948
+ 0 var(--zy-btn-fill-lift) 0 var(--zy-btn-fill-base),
1949
+ 0 6px 14px rgba(0, 0, 0, 0.55);
1950
+ --zy-btn-fill-shadow-on:
1951
+ 0 var(--zy-btn-fill-lift) 0 var(--zy-btn-fill-base-on),
1952
+ 0 6px 14px rgba(0, 0, 0, 0.55);
1953
+ --zy-btn-fill-shadow-down:
1954
+ 0 0 0 var(--zy-btn-fill-base),
1955
+ 0 2px 6px rgba(0, 0, 0, 0.6);
1956
+ }
1957
+
1958
+ html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--success {
1959
+ --zy-btn-fill-clr: var(--zy-green-key);
1960
+ }
1961
+
1962
+ html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--warning {
1963
+ --zy-btn-fill-clr: var(--zy-warning-key);
1964
+ --zy-btn-fill-ink: var(--zy-warning-ink);
1965
+ /* 悬停铺开的是深色键帽,铺开之后字必须回到白 —— 不能让墨字落在深色上 */
1966
+ --zy-btn-fill-ink-on: #fff;
1967
+ }
1968
+
1969
+ html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--danger {
1970
+ --zy-btn-fill-clr: var(--zy-danger-key);
1971
+ }
1972
+
1973
+ html.dark[data-zy-theme='solid'] .zy-btn.is-fill.el-button--info {
1974
+ --zy-btn-fill-clr: var(--zy-info-key);
1975
+ }
1976
+
1977
+ /* 中性键(无 type):面用键面档,底座仍是「面色深一档」那条公式 */
1978
+ html.dark[data-zy-theme='solid'] .zy-btn.is-fill:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info) {
1979
+ --zy-btn-fill-clr: var(--zy-key-face);
1980
+ --zy-btn-fill-base: var(--zy-key-base);
1981
+ --zy-btn-fill-ink: var(--zy-ink);
1982
+ --zy-btn-fill-ink-on: #fff;
1983
+ }
1984
+
1985
+ /* 2.3 控件:槽不变形,只把「凹」加深;聚焦仍是槽外 2px 品牌环 */
1986
+ html.dark[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper,
1987
+ html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper {
1988
+ box-shadow:
1989
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
1990
+ 0 6px 14px rgba(0, 0, 0, 0.55);
1991
+ }
1992
+
1993
+ @media (hover: hover) and (pointer: fine) {
1994
+ html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper:hover {
1995
+ box-shadow:
1996
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
1997
+ 0 6px 14px rgba(0, 0, 0, 0.55);
1998
+ }
1999
+ }
2000
+
2001
+ html.dark[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper.is-focus,
2002
+ html.dark[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper.is-focus:hover,
2003
+ html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper.is-focused,
2004
+ html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper.is-focus,
2005
+ html.dark[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper:focus-visible {
2006
+ box-shadow:
2007
+ 0 0 0 var(--zy-key-base),
2008
+ 0 2px 6px rgba(0, 0, 0, 0.6);
2009
+ }
2010
+
2011
+ /* 2.4 浮板:对话框 / 下拉 / 日期 / 时间 / 面板都抬到第四级,底座取更深的 --zy-key-base-strong */
2012
+ html.dark[data-zy-theme='solid'] .zy-select-popper,
2013
+ html.dark[data-zy-theme='solid'] .el-picker-panel,
2014
+ html.dark[data-zy-theme='solid'] .el-time-panel,
2015
+ html.dark[data-zy-theme='solid'] .el-time-range-picker {
2016
+ background: var(--zy-key-face-float);
2017
+ box-shadow:
2018
+ inset 0 1px 0 var(--zy-key-edge),
2019
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base-strong),
2020
+ 0 20px 36px rgba(0, 0, 0, 0.62) !important;
2021
+ }
2022
+
2023
+ html.dark[data-zy-theme='solid'] .zy-select-popper .zy-select-glide-pill {
2024
+ background: var(--zy-slot-face);
2025
+ box-shadow: var(--zy-slot-shadow-sm);
2026
+ }
2027
+
2028
+ html.dark[data-zy-theme='solid'] .zy-dialog {
2029
+ background: var(--zy-key-face-float);
2030
+ box-shadow:
2031
+ inset 0 1px 0 var(--zy-key-edge),
2032
+ 0 var(--zy-key-lift) 0 var(--zy-key-base-strong),
2033
+ 0 32px 56px rgba(0, 0, 0, 0.7);
2034
+ }
2035
+
2036
+ html.dark[data-zy-theme='solid'] .zy-dialog .el-dialog__header,
2037
+ html.dark[data-zy-theme='solid'] .zy-dialog .el-dialog__footer,
2038
+ html.dark[data-zy-theme='solid'] .el-time-panel__footer {
2039
+ background: var(--zy-slot-face);
2040
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
2041
+ }
2042
+
2043
+ html.dark[data-zy-theme='solid'] .zy-dialog .zy-dialog-mark {
2044
+ background: var(--zy-brand-key);
2045
+ box-shadow:
2046
+ inset 0 1px 0 rgba(255, 255, 255, 0.24),
2047
+ 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
2048
+ }
2049
+
2050
+ html.dark[data-zy-theme='solid'] .zy-panel {
2051
+ background: var(--zy-key-face);
2052
+ box-shadow:
2053
+ inset 0 1px 0 var(--zy-key-edge),
2054
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
2055
+ 0 16px 30px rgba(0, 0, 0, 0.5);
2056
+ }
2057
+
2058
+ html.dark[data-zy-theme='solid'] .zy-panel__head {
2059
+ background: var(--zy-key-face);
2060
+ box-shadow: inset 0 -2px 0 var(--zy-slot-line);
2061
+ }
2062
+
2063
+ /* 2.5 选中的那几处:solid.css 里它们都直接铺 `--zy-brand`(亮档),
2064
+ * 深色下必须换成键面档,否则白字落在亮蓝上只有 2.4:1。 */
2065
+ html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li.is-active,
2066
+ html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.current:not(.disabled) .el-date-table-cell__text,
2067
+ html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.start-date .el-date-table-cell__text,
2068
+ html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.end-date .el-date-table-cell__text,
2069
+ html.dark[data-zy-theme='solid'] .el-time-panel .el-time-spinner__item.is-active,
2070
+ html.dark[data-zy-theme='solid'] .el-time-range-picker .el-time-spinner__item.is-active,
2071
+ html.dark[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content,
2072
+ html.dark[data-zy-theme='solid'] .zy-verify__piece {
2073
+ background-color: var(--zy-brand-key);
2074
+ }
2075
+
2076
+ html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li.is-active,
2077
+ html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.current:not(.disabled) .el-date-table-cell__text,
2078
+ html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.start-date .el-date-table-cell__text,
2079
+ html.dark[data-zy-theme='solid'] .el-picker-panel .el-date-table td.end-date .el-date-table-cell__text,
2080
+ html.dark[data-zy-theme='solid'] .el-time-panel .el-time-spinner__item.is-active,
2081
+ html.dark[data-zy-theme='solid'] .el-time-range-picker .el-time-spinner__item.is-active,
2082
+ html.dark[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content,
2083
+ html.dark[data-zy-theme='solid'] .zy-verify__piece {
2084
+ box-shadow:
2085
+ inset 0 1px 0 rgba(255, 255, 255, 0.22),
2086
+ 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
2087
+ }
2088
+
2089
+ html.dark[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content {
2090
+ box-shadow:
2091
+ inset 0 1px 0 rgba(255, 255, 255, 0.22),
2092
+ 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
2093
+ }
2094
+
2095
+ html.dark[data-zy-theme='solid'] .zy-verify__piece::after {
2096
+ background-color: var(--zy-brand-key);
2097
+ }
2098
+
2099
+ /* 2.6 其余小件:把浅色档写死的落影 / 高光换成深色下的对应物 */
2100
+ html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li,
2101
+ html.dark[data-zy-theme='solid'] .zy-pagination button.btn-prev,
2102
+ html.dark[data-zy-theme='solid'] .zy-pagination button.btn-next {
2103
+ box-shadow:
2104
+ inset 0 1px 0 var(--zy-key-edge),
2105
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
2106
+ 0 4px 8px rgba(0, 0, 0, 0.45);
2107
+ }
2108
+
2109
+ html.dark[data-zy-theme='solid'] .zy-pagination .el-pager li:active,
2110
+ html.dark[data-zy-theme='solid'] .zy-pagination button.btn-prev:not(:disabled):active,
2111
+ html.dark[data-zy-theme='solid'] .zy-pagination button.btn-next:not(:disabled):active {
2112
+ box-shadow: 0 0 0 var(--zy-key-base);
2113
+ }
2114
+
2115
+ html.dark[data-zy-theme='solid'] .zy-pagination .btn-prev:disabled,
2116
+ html.dark[data-zy-theme='solid'] .zy-pagination .btn-next:disabled {
2117
+ box-shadow:
2118
+ inset 0 1px 0 var(--zy-key-edge),
2119
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
2120
+ }
2121
+
2122
+ /* 复选框:面色取键面档(白勾 4.88:1),底座仍按「面色深一档」 */
2123
+ html.dark[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input:not(.is-disabled).is-checked .el-checkbox__inner,
2124
+ html.dark[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input:not(.is-disabled).is-indeterminate .el-checkbox__inner,
2125
+ html.dark[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-disabled).is-checked .el-checkbox__inner,
2126
+ html.dark[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-disabled).is-indeterminate .el-checkbox__inner {
2127
+ background-color: var(--zy-brand-key);
2128
+ box-shadow:
2129
+ inset 0 1px 0 rgba(255, 255, 255, 0.22),
2130
+ 0 var(--zy-key-lift-sm) 0 var(--zy-brand-key-hover);
2131
+ }
2132
+
2133
+ /* 分段组滑行块 / 树里的滑行键:面与底座走键面档 */
2134
+ html.dark[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio-button-slider {
2135
+ box-shadow:
2136
+ inset 0 1px 0 var(--zy-key-edge),
2137
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
2138
+ 0 6px 12px rgba(0, 0, 0, 0.5);
2139
+ }
2140
+
2141
+ html.dark[data-zy-theme='solid'] .zy-radio .el-radio__inner {
2142
+ background: var(--zy-slot-face);
2143
+ }
2144
+
2145
+ /* 开关:全息轨道保留,只把「按在桌上」的那 2px 底座换成更深的档 */
2146
+ html.dark[data-zy-theme='solid'] .zy-switch-track {
2147
+ box-shadow:
2148
+ 0 var(--zy-key-lift-sm) 0 #04070b,
2149
+ 0 10px 18px rgba(0, 0, 0, 0.55);
2150
+ }
2151
+
2152
+ /* 标签:浅色档的底座是「面色 26% 混 #c8d2de」(浅灰),深色下混到键面上;顶亮边从 85% 收薄 */
2153
+ html.dark[data-zy-theme='solid'] .zy-tag {
2154
+ box-shadow:
2155
+ inset 0 1px 0 rgba(255, 255, 255, 0.14),
2156
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--el-tag-text-color) 24%, var(--zy-key-base)),
2157
+ 0 4px 8px rgba(0, 0, 0, 0.35);
2158
+ }
2159
+
2160
+ html.dark[data-zy-theme='solid'] .zy-tag.is-fill {
2161
+ --zy-tag-fill-clr: var(--zy-brand-key);
2162
+ }
2163
+
2164
+ html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--success {
2165
+ --zy-tag-fill-clr: var(--zy-green-key);
2166
+ }
2167
+
2168
+ html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--warning {
2169
+ --zy-tag-fill-clr: var(--zy-warning-key);
2170
+ /* 琥珀面上白字只有 2.19:1;同 «实心按钮» 的做法,字换深墨(9.19:1) */
2171
+ color: var(--zy-warning-ink);
2172
+ --el-tag-text-color: var(--zy-warning-ink);
2173
+ --el-tag-hover-color: var(--zy-warning-ink);
2174
+ }
2175
+
2176
+ html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--danger {
2177
+ --zy-tag-fill-clr: var(--zy-danger-key);
2178
+ }
2179
+
2180
+ html.dark[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--info {
2181
+ --zy-tag-fill-clr: var(--zy-info-key);
2182
+ }
2183
+
2184
+ /* 2.7 卡片:ZyCard 自己会把「面色 82% + 黑」推成底座、再配一层写死的浅色落影
2185
+ * (rgba(15,23,42,.24))—— 深色下这层影等于没有,而且推出来的底座比 --zy-key-base 更亮一档。
2186
+ * 卡片与按钮必须共用同一个底座,否则同一张桌上会出现两种厚度的键。 */
2187
+ html.dark[data-zy-theme='solid'] .zy-card {
2188
+ --zy-card-fill-base: var(--zy-key-base);
2189
+ --zy-card-fill-base-on: #0f151d;
2190
+ --zy-card-fill-hover-clr: #121a24;
2191
+ /* 页眉分割线在键面上是一道「刻痕」,不是一道亮线 */
2192
+ --zy-card-fill-line: rgba(0, 0, 0, 0.45);
2193
+ --zy-card-fill-shadow:
2194
+ 0 var(--zy-card-fill-lift) 0 var(--zy-key-base),
2195
+ 0 14px 26px rgba(0, 0, 0, 0.5);
2196
+ --zy-card-fill-shadow-press: 0 0 0 var(--zy-key-base);
2197
+ }
2198
+
2199
+ /* 2.8 舞台:同 A 的 1.9 —— 半透明叠色在深色下会把「台面」压到比桌面更暗,层级就反了 */
2200
+
2201
+ /* 角标:一圈暗底 + 落地影,深色下影要更实 */
2202
+ html.dark[data-zy-theme='solid'] .zy-badge .el-badge__content {
2203
+ box-shadow:
2204
+ inset 0 1px 0 rgba(255, 255, 255, 0.22),
2205
+ 0 2px 0 rgba(0, 0, 0, 0.5),
2206
+ 0 5px 10px rgba(0, 0, 0, 0.45);
2207
+ }
2208
+
2209
+ /* 进度条:轨道是槽;填充是一条键条,亮端提亮、暗端落深 */
2210
+ html.dark[data-zy-theme='solid'] .zy-progress .el-progress-bar__inner {
2211
+ background: linear-gradient(90deg, #5aa6e4 0%, #2876af 100%);
2212
+ box-shadow:
2213
+ inset 0 1px 0 rgba(255, 255, 255, 0.28),
2214
+ inset 0 -1px 0 rgba(0, 0, 0, 0.3),
2215
+ 0 2px 0 rgba(0, 0, 0, 0.45);
2216
+ }
2217
+
2218
+ /* 表格:托盘(槽)比桌面再暗一档;表头的下沿刻痕改成暗线;斑马行的条纹从键面混出来 */
2219
+ html.dark[data-zy-theme='solid'] .zy-table-tray {
2220
+ background-color: #0e1622;
2221
+ box-shadow: var(--zy-slot-shadow);
2222
+ }
2223
+
2224
+ html.dark[data-zy-theme='solid'] .zy-table th.el-table__cell {
2225
+ background-color: var(--zy-key-face);
2226
+ box-shadow:
2227
+ inset 0 1px 0 var(--zy-key-edge),
2228
+ inset 0 -1px 0 rgba(0, 0, 0, 0.4),
2229
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
2230
+ }
2231
+
2232
+ html.dark[data-zy-theme='solid'] .zy-table .el-table__body tr.el-table__row--striped > td.el-table__cell {
2233
+ background-color: color-mix(in srgb, var(--zy-key-face) 42%, var(--zy-slot-face));
2234
+ }
2235
+
2236
+ /* 树:整棵是托盘;悬停滑行的是一枚小键(面 + 顶光 + 小档底座) */
2237
+ html.dark[data-zy-theme='solid'] .zy-tree {
2238
+ background-color: #0e1622;
2239
+ box-shadow: var(--zy-slot-shadow);
2240
+ }
2241
+
2242
+ html.dark[data-zy-theme='solid'] .zy-tree-shell .zy-tree-glide {
2243
+ background: var(--zy-key-face);
2244
+ box-shadow:
2245
+ inset 0 1px 0 var(--zy-key-edge),
2246
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
2247
+ }
2248
+
2249
+ /* 提示:键帽条 + 左侧 6px 语义键块;底座 / 落影 / 亮边都换成深色档 */
2250
+ html.dark[data-zy-theme='solid'] .zy-alert {
2251
+ background: var(--zy-key-face);
2252
+ box-shadow:
2253
+ inset 0 1px 0 var(--zy-key-edge),
2254
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
2255
+ 0 6px 14px rgba(0, 0, 0, 0.55);
2256
+ }
2257
+
2258
+ /* 分割线:仍是一道刻痕(上暗下亮),深色下「暗」是纯黑、「亮」是 10% 白 —— 不能再用纯白 */
2259
+ html.dark[data-zy-theme='solid'] .zy-divider.el-divider--horizontal {
2260
+ background: linear-gradient(180deg, #000 0%, rgba(255, 255, 255, 0.1) 100%);
2261
+ }
2262
+
2263
+ /* 加载:落在桌面上的底影换成黑 */
2264
+ html.dark[data-zy-theme='solid'] .zy-loading-dot::before,
2265
+ html.dark[data-zy-theme='solid'] .zy-loading-ball {
2266
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.55);
2267
+ }
2268
+
2269
+ /* 滑块拼图验证:槽里的缺口要更暗(浅色档是墨色 60%,深色下直接用黑) */
2270
+
2143
2271
  @media (prefers-reduced-motion: reduce) {
2144
2272
  html[data-zy-theme='solid']
2145
2273
  :is(
@@ -2166,185 +2294,185 @@ html.dark[data-zy-theme='solid'] .zy-loading-ball {
2166
2294
  animation: none !important;
2167
2295
  transition: none !important;
2168
2296
  }
2169
- }
2170
-
2171
- /* ============================================================
2172
- * 24 · 菜单导航(Mega Menu)—— 实色键帽
2173
- *
2174
- * 条 = **无标题容器那张面**(白面 + 1px 顶光 + 4px 底座 + 落影),
2175
- * 入口是面上的字(悬停按出一个小坑),展开那颗**点亮并按下**(品牌面 + 两侧白弧 + 底部高光),
2176
- * 面板 = 第四级浮板,面板里的悬停反过来凹下去(槽)—— 一凸一凹才分得清层级。
2177
- *
2178
- * 深色:夜色令牌在 §0.1(键面 / 浮板 / 槽 / 语义键面),菜单只在自己的根上把它们
2179
- * 映成一组 --zy-mm-* —— 条、面板、槽、点亮键各自取对应那一级,不再写死数值。
2180
- * ============================================================ */
2181
-
2182
- html[data-zy-theme='solid'] .zy-mega-menu {
2183
- --zy-mm-bar: var(--zy-key-face);
2184
- --zy-mm-bar-base: var(--zy-key-base);
2185
- --zy-mm-bar-edge: var(--zy-key-edge);
2186
- --zy-mm-bar-shadow: 0 12px 26px rgba(15, 23, 42, 0.12);
2187
- --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);
2191
- --zy-mm-slot: var(--zy-slot-face);
2192
- --zy-mm-slot-line: var(--zy-slot-line);
2193
- --zy-mm-slot-shadow: var(--zy-slot-shadow-sm);
2194
- --zy-mm-key: var(--zy-brand);
2195
- --zy-mm-key-base: color-mix(in srgb, var(--zy-brand) 78%, #000);
2196
- --zy-mm-brand: var(--zy-brand);
2197
- --zy-mm-key-edge: rgba(255, 255, 255, 0.3);
2198
- --zy-mm-more: var(--zy-brand);
2199
- --zy-mm-ink: var(--zy-ink);
2200
- --zy-mm-muted: var(--zy-muted);
2201
- }
2202
-
2203
- html.dark[data-zy-theme='solid'] .zy-mega-menu {
2204
- /* 夜里的四级阶梯全部取 §0.1 的令牌:条回到键面、面板上浮一档、面板里的悬停沉进槽 */
2205
- --zy-mm-bar: var(--zy-key-face);
2206
- --zy-mm-bar-base: var(--zy-key-base);
2207
- --zy-mm-bar-edge: var(--zy-key-edge);
2208
- --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);
2211
- --zy-mm-slot: var(--zy-slot-face);
2212
- --zy-mm-slot-line: var(--zy-slot-line);
2213
- --zy-mm-slot-shadow: var(--zy-slot-shadow-sm);
2214
- --zy-mm-key: var(--zy-brand-key);
2215
- --zy-mm-key-base: var(--zy-brand-key-hover);
2216
- /* 文字品牌取共用板的 --zy-brand(#5aa6e4,与方案稿同值) */
2217
- --zy-mm-brand: var(--zy-brand);
2218
- --zy-mm-key-edge: rgba(255, 255, 255, 0.22);
2219
- --zy-mm-more: color-mix(in srgb, var(--zy-brand) 74%, #fff);
2220
- --zy-mm-ink: var(--zy-ink);
2221
- --zy-mm-muted: var(--zy-muted);
2222
- }
2223
-
2224
- html[data-zy-theme='solid'] .zy-mega-menu__bar {
2225
- padding: 0 10px;
2226
- border-radius: var(--zy-radius);
2227
- background: var(--zy-mm-bar);
2228
- box-shadow:
2229
- inset 0 1px 0 var(--zy-mm-bar-edge),
2230
- 0 var(--zy-key-lift) 0 var(--zy-mm-bar-base),
2231
- var(--zy-mm-bar-shadow);
2232
- }
2233
-
2234
- html[data-zy-theme='solid'] .zy-mega-menu__mark {
2235
- border-radius: var(--zy-radius-sm);
2236
- background: var(--zy-mm-slot);
2237
- color: var(--zy-mm-brand);
2238
- box-shadow: var(--zy-mm-slot-shadow);
2239
- }
2240
-
2241
- html[data-zy-theme='solid'] .zy-mega-menu__sub {
2242
- color: var(--zy-mm-muted);
2243
- }
2244
-
2245
- /* 条已经是一张「面」,入口就不再是浮在槽上的键,而是面上的字:
2246
- * 悬停把它按出一个小坑(槽);展开那颗才升级成「点亮并按下」的品牌键。 */
2247
- html[data-zy-theme='solid'] .zy-mega-menu__trigger,
2248
- html[data-zy-theme='solid'] .zy-mega-menu__plain {
2249
- color: var(--zy-mm-ink);
2250
- border-radius: var(--zy-radius-sm);
2251
- background: transparent;
2252
- box-shadow: none;
2253
- transition:
2254
- background-color 120ms var(--zy-ease-soft),
2255
- box-shadow 120ms var(--zy-ease-soft),
2256
- color 120ms var(--zy-ease-soft);
2257
- }
2258
-
2259
- html[data-zy-theme='solid'] .zy-mega-menu__trigger:hover,
2260
- html[data-zy-theme='solid'] .zy-mega-menu__plain:hover {
2261
- background: var(--zy-mm-slot);
2262
- box-shadow: var(--zy-mm-slot-shadow);
2263
- }
2264
-
2265
- /* 展开 = 点亮并按下:与 primary / 树当前行同一套键帽图层(白弧与高光由 material.css 给),底座收平 */
2266
- html[data-zy-theme='solid'] .zy-mega-menu__trigger.is-open {
2267
- --zy-key-h: 32px;
2268
- --zy-key-lift-now: var(--zy-key-lift-sm);
2269
- color: #fff;
2270
- background-color: var(--zy-mm-key);
2271
- background-image: var(--zy-key-stack);
2272
- background-repeat: no-repeat;
2273
- background-position: var(--zy-key-stack-pos);
2274
- background-size: var(--zy-key-stack-size);
2275
- box-shadow:
2276
- inset 0 1px 0 var(--zy-mm-key-edge),
2277
- 0 0 0 var(--zy-mm-key-base);
2278
- transform: translateY(2px);
2279
- }
2280
-
2281
- html[data-zy-theme='solid'] .zy-mega-menu__panel {
2282
- top: calc(100% + 12px);
2283
- background: var(--zy-mm-panel);
2284
- border-radius: 8px;
2285
- box-shadow:
2286
- inset 0 1px 0 var(--zy-mm-bar-edge),
2287
- var(--zy-mm-panel-shadow);
2288
- }
2289
-
2290
- html[data-zy-theme='solid'] .zy-mega-menu__glide {
2291
- border-radius: var(--zy-radius-sm);
2292
- background: var(--zy-mm-slot);
2293
- box-shadow: var(--zy-mm-slot-shadow);
2294
- }
2295
-
2296
- /* 浮板上的图标:刻一个小坑 —— 白面浮板上,白面键自己是看不见的 */
2297
- html[data-zy-theme='solid'] .zy-mega-menu__ico {
2298
- border-radius: var(--zy-radius-sm);
2299
- background: var(--zy-mm-slot);
2300
- color: var(--zy-mm-ink);
2301
- box-shadow: var(--zy-mm-slot-shadow);
2302
- }
2303
-
2304
- html[data-zy-theme='solid'] .zy-mega-menu__title,
2305
- html[data-zy-theme='solid'] .zy-mega-menu__group-link {
2306
- color: var(--zy-mm-ink);
2307
- }
2308
-
2309
- html[data-zy-theme='solid'] .zy-mega-menu__desc,
2310
- html[data-zy-theme='solid'] .zy-mega-menu__note {
2311
- color: var(--zy-mm-muted);
2312
- }
2313
-
2314
- html[data-zy-theme='solid'] .zy-mega-menu__badge {
2315
- color: var(--zy-mm-brand);
2316
- background: var(--zy-brand-soft);
2317
- }
2318
-
2319
- html[data-zy-theme='solid'] .zy-mega-menu__foot {
2320
- box-shadow: inset 0 1px 0 var(--zy-mm-slot-line);
2321
- }
2322
-
2323
- html[data-zy-theme='solid'] .zy-mega-menu__more {
2324
- color: var(--zy-mm-more);
2325
- }
2326
-
2327
- html[data-zy-theme='solid'] .zy-mega-menu__card {
2328
- border-radius: var(--zy-radius);
2329
- background: var(--zy-mm-slot);
2330
- box-shadow: var(--zy-mm-slot-shadow);
2331
- }
2332
-
2333
- html[data-zy-theme='solid'] .zy-mega-menu__group-title {
2334
- color: var(--zy-mm-muted);
2335
- box-shadow: inset 0 -1px 0 var(--zy-mm-slot-line);
2336
- }
2337
-
2338
- /* 浅底槽里的说明字:muted 在 #e9eef4 上只有 3.9:1,换成 78% 的墨(≈8.4:1) */
2339
- html[data-zy-theme='solid'] .zy-mega-menu__kicker,
2340
- html[data-zy-theme='solid'] .zy-mega-menu__card-desc {
2341
- color: color-mix(in srgb, var(--zy-mm-ink) 78%, transparent);
2342
- }
2343
-
2344
- html[data-zy-theme='solid'] .zy-mega-menu__card-title {
2345
- color: var(--zy-mm-ink);
2346
- }
2347
-
2348
- html[data-zy-theme='solid'] .zy-mega-menu__group-ico {
2349
- color: var(--zy-mm-muted);
2350
- }
2297
+ }
2298
+
2299
+ /* ============================================================
2300
+ * 24 · 菜单导航(Mega Menu)—— 实色键帽
2301
+ *
2302
+ * 条 = **无标题容器那张面**(白面 + 1px 顶光 + 4px 底座 + 落影),
2303
+ * 入口是面上的字(悬停按出一个小坑),展开那颗**点亮并按下**(品牌面 + 两侧白弧 + 底部高光),
2304
+ * 面板 = 正常键帽(键面 + 4px 底座 + 落影,厚一档就是大键帽);面板里的悬停反过来凹下去(槽)——
2305
+ * 一凸一凹才分得清层级。
2306
+ *
2307
+ * 深色:夜色令牌在 §0.1(键面 / 浮板 / 槽 / 语义键面),菜单只在自己的根上把它们
2308
+ * 映成一组 --zy-mm-* —— 条、面板、槽、点亮键各自取对应那一级,不再写死数值。
2309
+ * ============================================================ */
2310
+
2311
+ html[data-zy-theme='solid'] .zy-mega-menu {
2312
+ --zy-mm-bar: var(--zy-key-face);
2313
+ --zy-mm-bar-base: var(--zy-key-base);
2314
+ --zy-mm-bar-edge: var(--zy-key-edge);
2315
+ --zy-mm-bar-shadow: 0 12px 26px rgba(15, 23, 42, 0.12);
2316
+ --zy-mm-panel: var(--zy-key-face);
2317
+ --zy-mm-panel-shadow: var(--zy-shadow-card);
2318
+ --zy-mm-slot: var(--zy-slot-face);
2319
+ --zy-mm-slot-line: var(--zy-slot-line);
2320
+ --zy-mm-slot-shadow: var(--zy-slot-shadow-sm);
2321
+ --zy-mm-key: var(--zy-brand);
2322
+ --zy-mm-key-base: color-mix(in srgb, var(--zy-brand) 78%, #000);
2323
+ --zy-mm-brand: var(--zy-brand);
2324
+ --zy-mm-key-edge: rgba(255, 255, 255, 0.3);
2325
+ --zy-mm-more: var(--zy-brand);
2326
+ --zy-mm-ink: var(--zy-ink);
2327
+ --zy-mm-muted: var(--zy-muted);
2328
+ }
2329
+
2330
+ html.dark[data-zy-theme='solid'] .zy-mega-menu {
2331
+ /* 夜里的阶梯全部取 §0.1 的令牌:条和面板都回到键面、面板里的悬停沉进槽 */
2332
+ --zy-mm-bar: var(--zy-key-face);
2333
+ --zy-mm-bar-base: var(--zy-key-base);
2334
+ --zy-mm-bar-edge: var(--zy-key-edge);
2335
+ --zy-mm-bar-shadow: 0 16px 30px rgba(0, 0, 0, 0.5);
2336
+ --zy-mm-panel: var(--zy-key-face);
2337
+ --zy-mm-panel-shadow: var(--zy-shadow-card);
2338
+ --zy-mm-slot: var(--zy-slot-face);
2339
+ --zy-mm-slot-line: var(--zy-slot-line);
2340
+ --zy-mm-slot-shadow: var(--zy-slot-shadow-sm);
2341
+ --zy-mm-key: var(--zy-brand-key);
2342
+ --zy-mm-key-base: var(--zy-brand-key-hover);
2343
+ /* 文字品牌取共用板的 --zy-brand(#5aa6e4,与方案稿同值) */
2344
+ --zy-mm-brand: var(--zy-brand);
2345
+ --zy-mm-key-edge: rgba(255, 255, 255, 0.22);
2346
+ --zy-mm-more: color-mix(in srgb, var(--zy-brand) 74%, #fff);
2347
+ --zy-mm-ink: var(--zy-ink);
2348
+ --zy-mm-muted: var(--zy-muted);
2349
+ }
2350
+
2351
+ html[data-zy-theme='solid'] .zy-mega-menu__bar {
2352
+ padding: 0 10px;
2353
+ border-radius: var(--zy-radius);
2354
+ background: var(--zy-mm-bar);
2355
+ box-shadow:
2356
+ inset 0 1px 0 var(--zy-mm-bar-edge),
2357
+ 0 var(--zy-key-lift) 0 var(--zy-mm-bar-base),
2358
+ var(--zy-mm-bar-shadow);
2359
+ }
2360
+
2361
+ html[data-zy-theme='solid'] .zy-mega-menu__mark {
2362
+ border-radius: var(--zy-radius-sm);
2363
+ background: var(--zy-mm-slot);
2364
+ color: var(--zy-mm-brand);
2365
+ box-shadow: var(--zy-mm-slot-shadow);
2366
+ }
2367
+
2368
+ html[data-zy-theme='solid'] .zy-mega-menu__sub {
2369
+ color: var(--zy-mm-muted);
2370
+ }
2371
+
2372
+ /* 条已经是一张「面」,入口就是面上的字;悬停 / 选中 / 展开共用同一枚品牌键,
2373
+ * 只用箭头方向区分面板开合,不再另做一层按压或内凹。 */
2374
+ html[data-zy-theme='solid'] .zy-mega-menu__trigger,
2375
+ html[data-zy-theme='solid'] .zy-mega-menu__plain {
2376
+ color: var(--zy-mm-ink);
2377
+ border-radius: var(--zy-radius-sm);
2378
+ background: transparent;
2379
+ box-shadow: none;
2380
+ transition:
2381
+ background-color 120ms var(--zy-ease-soft),
2382
+ box-shadow 120ms var(--zy-ease-soft),
2383
+ color 120ms var(--zy-ease-soft);
2384
+ }
2385
+
2386
+ /* 悬停、一级选中、展开项:同一枚凸起的品牌键(不是内凹槽),
2387
+ * 选中态常亮,展开时也保持同一面,不再下沉。 */
2388
+ html[data-zy-theme='solid'] .zy-mega-menu__trigger:hover,
2389
+ html[data-zy-theme='solid'] .zy-mega-menu__plain:hover,
2390
+ html[data-zy-theme='solid'] .zy-mega-menu__trigger.is-current,
2391
+ html[data-zy-theme='solid'] .zy-mega-menu__plain.is-current,
2392
+ html[data-zy-theme='solid'] .zy-mega-menu__trigger.is-open {
2393
+ --zy-key-h: 32px;
2394
+ --zy-key-lift-now: var(--zy-key-lift-sm);
2395
+ color: #fff;
2396
+ background-color: var(--zy-mm-key);
2397
+ background-image: var(--zy-key-stack);
2398
+ background-repeat: no-repeat;
2399
+ background-position: var(--zy-key-stack-pos);
2400
+ background-size: var(--zy-key-stack-size);
2401
+ box-shadow:
2402
+ inset 0 1px 0 var(--zy-mm-key-edge),
2403
+ 0 var(--zy-key-lift-sm) 0 var(--zy-mm-key-base);
2404
+ }
2405
+
2406
+ html[data-zy-theme='solid'] .zy-mega-menu__panel {
2407
+ top: calc(100% + 12px);
2408
+ background: var(--zy-mm-panel);
2409
+ border-radius: var(--zy-radius);
2410
+ box-shadow:
2411
+ inset 0 1px 0 var(--zy-mm-bar-edge),
2412
+ var(--zy-mm-panel-shadow);
2413
+ }
2414
+
2415
+ /* 滑行高亮与二级选中态共用一层皮:选中的那条一直亮着 */
2416
+ html[data-zy-theme='solid'] .zy-mega-menu__glide,
2417
+ html[data-zy-theme='solid'] .zy-mega-menu__link.is-current,
2418
+ html[data-zy-theme='solid'] .zy-mega-menu__group-link.is-current {
2419
+ border-radius: var(--zy-radius-sm);
2420
+ background: var(--zy-mm-slot);
2421
+ box-shadow: var(--zy-mm-slot-shadow);
2422
+ }
2423
+
2424
+ /* 浮板上的图标:刻一个小坑 —— 白面浮板上,白面键自己是看不见的 */
2425
+ html[data-zy-theme='solid'] .zy-mega-menu__ico {
2426
+ border-radius: var(--zy-radius-sm);
2427
+ background: var(--zy-mm-slot);
2428
+ color: var(--zy-mm-ink);
2429
+ box-shadow: var(--zy-mm-slot-shadow);
2430
+ }
2431
+
2432
+ html[data-zy-theme='solid'] .zy-mega-menu__title,
2433
+ html[data-zy-theme='solid'] .zy-mega-menu__group-link {
2434
+ color: var(--zy-mm-ink);
2435
+ }
2436
+
2437
+ html[data-zy-theme='solid'] .zy-mega-menu__desc,
2438
+ html[data-zy-theme='solid'] .zy-mega-menu__note {
2439
+ color: var(--zy-mm-muted);
2440
+ }
2441
+
2442
+ html[data-zy-theme='solid'] .zy-mega-menu__badge {
2443
+ color: var(--zy-mm-brand);
2444
+ background: var(--zy-brand-soft);
2445
+ }
2446
+
2447
+ html[data-zy-theme='solid'] .zy-mega-menu__foot {
2448
+ box-shadow: inset 0 1px 0 var(--zy-mm-slot-line);
2449
+ }
2450
+
2451
+ html[data-zy-theme='solid'] .zy-mega-menu__more {
2452
+ color: var(--zy-mm-more);
2453
+ }
2454
+
2455
+ html[data-zy-theme='solid'] .zy-mega-menu__card {
2456
+ border-radius: var(--zy-radius);
2457
+ background: var(--zy-mm-slot);
2458
+ box-shadow: var(--zy-mm-slot-shadow);
2459
+ }
2460
+
2461
+ html[data-zy-theme='solid'] .zy-mega-menu__group-title {
2462
+ color: var(--zy-mm-muted);
2463
+ box-shadow: inset 0 -1px 0 var(--zy-mm-slot-line);
2464
+ }
2465
+
2466
+ /* 浅底槽里的说明字:muted 在 #e9eef4 上只有 3.9:1,换成 78% 的墨(≈8.4:1) */
2467
+ html[data-zy-theme='solid'] .zy-mega-menu__kicker,
2468
+ html[data-zy-theme='solid'] .zy-mega-menu__card-desc {
2469
+ color: color-mix(in srgb, var(--zy-mm-ink) 78%, transparent);
2470
+ }
2471
+
2472
+ html[data-zy-theme='solid'] .zy-mega-menu__card-title {
2473
+ color: var(--zy-mm-ink);
2474
+ }
2475
+
2476
+ html[data-zy-theme='solid'] .zy-mega-menu__group-ico {
2477
+ color: var(--zy-mm-muted);
2478
+ }