@gyyxds/zy-ui 0.0.0-stage → 0.0.2

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.
Files changed (66) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/CONTRIBUTING.md +102 -0
  3. package/README.md +370 -2
  4. package/dist/zy-ui/alert/ZyAlert.vue.d.ts +26 -0
  5. package/dist/zy-ui/alert/index.d.ts +54 -0
  6. package/dist/zy-ui/badge/ZyBadge.vue.d.ts +37 -0
  7. package/dist/zy-ui/badge/index.d.ts +66 -0
  8. package/dist/zy-ui/button/ZyButton.vue.d.ts +45 -0
  9. package/dist/zy-ui/button/index.d.ts +74 -0
  10. package/dist/zy-ui/card/ZyCard.vue.d.ts +24 -0
  11. package/dist/zy-ui/card/index.d.ts +38 -0
  12. package/dist/zy-ui/checkbox/ZyCheckbox.vue.d.ts +36 -0
  13. package/dist/zy-ui/checkbox/ZyCheckboxGroup.vue.d.ts +31 -0
  14. package/dist/zy-ui/checkbox/index.d.ts +113 -0
  15. package/dist/zy-ui/code-input/ZyCodeInput.vue.d.ts +38 -0
  16. package/dist/zy-ui/code-input/index.d.ts +37 -0
  17. package/dist/zy-ui/date-picker/ZyDatePicker.vue.d.ts +3 -0
  18. package/dist/zy-ui/date-picker/index.d.ts +2 -0
  19. package/dist/zy-ui/dialog/ZyDialog.vue.d.ts +48 -0
  20. package/dist/zy-ui/dialog/index.d.ts +88 -0
  21. package/dist/zy-ui/divider/ZyDivider.vue.d.ts +20 -0
  22. package/dist/zy-ui/divider/index.d.ts +32 -0
  23. package/dist/zy-ui/icon/ZyIcon.vue.d.ts +17 -0
  24. package/dist/zy-ui/icon/index.d.ts +16 -0
  25. package/dist/zy-ui/index.d.ts +1332 -0
  26. package/dist/zy-ui/input/ZyInput.vue.d.ts +44 -0
  27. package/dist/zy-ui/input/index.d.ts +88 -0
  28. package/dist/zy-ui/loading/ZyLoading.vue.d.ts +22 -0
  29. package/dist/zy-ui/loading/index.d.ts +21 -0
  30. package/dist/zy-ui/mega-menu/ZyMegaMenu.vue.d.ts +50 -0
  31. package/dist/zy-ui/mega-menu/index.d.ts +92 -0
  32. package/dist/zy-ui/mega-menu/types.d.ts +77 -0
  33. package/dist/zy-ui/pagination/ZyPagination.vue.d.ts +3 -0
  34. package/dist/zy-ui/pagination/index.d.ts +2 -0
  35. package/dist/zy-ui/panel/ZyPanel.vue.d.ts +21 -0
  36. package/dist/zy-ui/panel/index.d.ts +32 -0
  37. package/dist/zy-ui/progress/ZyProgress.vue.d.ts +24 -0
  38. package/dist/zy-ui/progress/index.d.ts +48 -0
  39. package/dist/zy-ui/radio/ZyRadio.vue.d.ts +37 -0
  40. package/dist/zy-ui/radio/ZyRadioButton.vue.d.ts +35 -0
  41. package/dist/zy-ui/radio/ZyRadioGroup.vue.d.ts +32 -0
  42. package/dist/zy-ui/radio/index.d.ts +169 -0
  43. package/dist/zy-ui/radio/radio-context.d.ts +8 -0
  44. package/dist/zy-ui/select/ZySelect.vue.d.ts +40 -0
  45. package/dist/zy-ui/select/index.d.ts +78 -0
  46. package/dist/zy-ui/slide-verify/ZySlideVerify.vue.d.ts +46 -0
  47. package/dist/zy-ui/slide-verify/index.d.ts +50 -0
  48. package/dist/zy-ui/space/ZySpace.vue.d.ts +25 -0
  49. package/dist/zy-ui/space/index.d.ts +44 -0
  50. package/dist/zy-ui/switch/ZySwitch.vue.d.ts +25 -0
  51. package/dist/zy-ui/switch/index.d.ts +25 -0
  52. package/dist/zy-ui/table/ZyTable.vue.d.ts +21 -0
  53. package/dist/zy-ui/table/index.d.ts +32 -0
  54. package/dist/zy-ui/tag/ZyTag.vue.d.ts +28 -0
  55. package/dist/zy-ui/tag/index.d.ts +46 -0
  56. package/dist/zy-ui/themes/basic.css +832 -0
  57. package/dist/zy-ui/themes/material.css +37 -0
  58. package/dist/zy-ui/themes/solid.css +2350 -0
  59. package/dist/zy-ui/time-picker/ZyTimePicker.vue.d.ts +3 -0
  60. package/dist/zy-ui/time-picker/index.d.ts +2 -0
  61. package/dist/zy-ui/tree/ZyTree.vue.d.ts +28 -0
  62. package/dist/zy-ui/tree/index.d.ts +44 -0
  63. package/dist/zy-ui/utils/withInstall.d.ts +11 -0
  64. package/dist/zy-ui/zy-ui.css +2 -0
  65. package/dist/zy-ui/zy-ui.js +1962 -0
  66. package/package.json +81 -4
@@ -0,0 +1,2350 @@
1
+ /**
2
+ * 主题「实色键帽」(data-zy-theme="solid")—— 可落地的材质层
3
+ *
4
+ * 与默认主题「基础用法 / 图纸」(data-zy-theme="basic")相对:
5
+ * 两套主题共用同一块色板(机构蓝 + 储能绿 + slate 中性),差别全在**材质与层级**上;
6
+ * 形状与尺寸沿用现状(圆角 6 / 4,胶囊 999,圆形 50%,控件高度不动)。
7
+ *
8
+ * 本套语言的六条规则:
9
+ * 1. 凸凹二象:**能按的件 = 凸(键帽)**,面 + 深一档挤出边 + 两侧白弧 + 底部高光 + 落地影;
10
+ * **装东西的件 = 凹(槽)**,2px 内阴影 + 下沿内高光。这一条决定按钮 / 标签 / 卡片 /
11
+ * 输入框 / 下拉面板 / 进度轨道 / 表格托盘 / 滚动区的全部形态。
12
+ * 2. 厚度与尺度成正比:小件 2px、控件 4px、面板 4~6px。
13
+ * 3. 按下必然下沉:位移只有 +Y(沉进底座),松手走回弹;不用缩放冒充「按下」。
14
+ * 4. 色彩是材质的一档:中性键(白 / 浅灰)是底材,语义色只出现在「要你按」的位置。
15
+ * 5. 形状语言不动:主题只换材质,不改尺寸与圆角。
16
+ * 6. 不靠描边分层:键与槽的边界由厚度与光影给出;1px 线只留给槽里的「刻痕」。
17
+ *
18
+ * 与组件内 scoped 样式抢属性时,靠前缀 `html[data-zy-theme='solid']` 多出来的那一分
19
+ * (属性选择器 + 类型选择器)取胜;少数被组件动效底图占住的属性用 !important 并注明。
20
+ *
21
+ * 深色**只换光,不换形**:材质这一层逐条复用,夜里靠 §0.1 的一组令牌把「四级阶梯」压暗、
22
+ * 顶光收薄(95% → 16%)、落影加重。厚度 / 白弧 / 按下下沉全部保留。
23
+ */
24
+ @import './material.css';
25
+
26
+ :root[data-zy-theme='solid'],
27
+ html[data-zy-theme='solid'] {
28
+ /* ---------- 桌面(页面底):比图纸白深一档,键帽才有台面可落 ---------- */
29
+ --zy-desk: #e6ecf3;
30
+ --zy-key-face: #ffffff;
31
+ --zy-key-base: #d5dfea;
32
+ --zy-key-base-strong: #c6d2e0;
33
+ /* 键帽顶部 1px 亮边:塑料件收光的那一道 */
34
+ --zy-key-edge: rgba(255, 255, 255, 0.95);
35
+ /*
36
+ * ---------- 键帽高度:挤出底座的厚度,三档 大 / 正常 / 小 ----------
37
+ * 大 = 卡片(--zy-card-fill-lift)
38
+ * 正常 = 按钮与控件(--zy-key-lift-btn、--zy-shadow-card)
39
+ * 小 = 标签与角标(--zy-tag-fill-lift)、以及复选框 / 单选 / 分页这类小件
40
+ * 组件自己的尺寸变体在各自档位上再 ±1 档(如 large 标签 = 正常、small 标签 = 小)。
41
+ */
42
+ --zy-key-lift-lg: 6px; /* 大 · 卡片 */
43
+ --zy-key-lift: 4px; /* 正常 · 按钮 / 控件 */
44
+ --zy-key-lift-sm: 2px; /* 小 · 标签 / 角标 / 小件 */
45
+ --zy-key-soft: 0 10px 18px rgba(15, 23, 42, 0.1);
46
+ --zy-key-down: 0 2px 6px rgba(15, 23, 42, 0.14);
47
+
48
+ /*
49
+ * ---------- 键帽那对白弧的图(两份 SVG,主题级单一来源) ----------
50
+ * 注意:**派生量要在「知道高度的那个元素上」就地声明** —— `var()` 写在自定义属性里,
51
+ * 是在声明它的元素上求值的,放到根上就会把默认高度烤死。所以这里只放图与两个默认值:
52
+ * 元素侧声明 --zy-key-h(自身高度)+ 五条派生(gloss / stack / pos / size)→ 见下方按钮与分页器
53
+ */
54
+ --zy-key-h: 32px;
55
+ --zy-key-lift-now: var(--zy-key-lift);
56
+ --zy-key-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-opacity='.1' 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");
57
+ --zy-key-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-opacity='.1' 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");
58
+
59
+ /* ---------- 槽(凹):输入、轨道、托盘、滚动区 ---------- */
60
+ --zy-slot-face: #e9eef4;
61
+ --zy-slot-line: rgba(15, 23, 42, 0.07);
62
+ --zy-slot-shadow: inset 0 2px 4px rgba(15, 23, 42, 0.13), inset 0 -1px 0 rgba(255, 255, 255, 0.95);
63
+ --zy-slot-shadow-sm: inset 0 1.5px 3px rgba(15, 23, 42, 0.16), inset 0 -1px 0 rgba(255, 255, 255, 0.9);
64
+
65
+ /* ---------- 覆盖组件层令牌:只动材质与层级 ---------- */
66
+ --zy-radius: 6px;
67
+ --zy-radius-sm: 4px;
68
+ --zy-surface: var(--zy-key-face);
69
+ --zy-surface-sunken: var(--zy-slot-face);
70
+ --zy-paper: var(--zy-desk);
71
+ --zy-hairline: rgba(15, 23, 42, 0.08);
72
+ --zy-hairline-strong: rgba(15, 23, 42, 0.16);
73
+ --zy-shadow-card: 0 var(--zy-key-lift) 0 var(--zy-key-base), var(--zy-key-soft);
74
+ --zy-shadow-float: 0 var(--zy-key-lift-lg) 0 var(--zy-key-base-strong),
75
+ 0 22px 40px rgba(15, 23, 42, 0.2);
76
+ --zy-shadow-deep: rgba(15, 23, 42, 0.2);
77
+ --zy-shadow-press: 0 var(--zy-key-lift) 0 color-mix(in srgb, var(--zy-brand) 78%, #000),
78
+ var(--zy-key-soft);
79
+ --zy-focus-ring: 0 0 0 2px var(--zy-key-face),
80
+ 0 0 0 4px color-mix(in srgb, var(--zy-brand) 45%, transparent);
81
+ --zy-weight-control: 600;
82
+
83
+ /* 控件高度的本主题档:输入类与按钮、选择器同高 32(尺寸不动) */
84
+ /*
85
+ * 控件高度:**与按钮同高**(Element 基础按钮 32px)—— 输入框 / 选择器 / 时间选择器的触发框
86
+ * 全部取这一档,早先的 36(比按钮高一档)作废。大 / 小档沿用原值。
87
+ */
88
+ --zy-control-h: 32px;
89
+ --zy-control-h-lg: 44px;
90
+ --zy-control-h-sm: 30px;
91
+
92
+ /* 表格:白键面 + 槽托盘 + 更厚的行 */
93
+ --zy-table-header-bg: var(--zy-key-face);
94
+ --zy-table-header-h: 46px;
95
+ --zy-table-row-h: 52px;
96
+ --zy-table-row-stripe: #f6f9fc;
97
+ --zy-panel-body-bg: color-mix(in srgb, var(--zy-desk) 70%, transparent);
98
+
99
+ /* 实心按钮:本主题不用「上浅下深 + hover 翻转」那张渐变,改由厚度说话 */
100
+ --zy-btn-grad-primary: none;
101
+ --zy-btn-grad-primary-hover: none;
102
+ --zy-btn-grad-success: none;
103
+ --zy-btn-grad-success-hover: none;
104
+ --zy-btn-grad-warning: none;
105
+ --zy-btn-grad-warning-hover: none;
106
+ --zy-btn-grad-info: none;
107
+ --zy-btn-grad-info-hover: none;
108
+ --zy-btn-edge-primary: transparent;
109
+ --zy-btn-edge-success: transparent;
110
+ --zy-btn-edge-warning: transparent;
111
+ --zy-btn-edge-info: transparent;
112
+
113
+ /* Element 映射跟着走 */
114
+ --el-border-radius-base: var(--zy-radius);
115
+ --el-border-radius-small: var(--zy-radius-sm);
116
+ --el-box-shadow-light: var(--zy-shadow-card);
117
+ --el-box-shadow: var(--zy-shadow-float);
118
+ --el-component-size: var(--zy-control-h);
119
+ --el-component-size-large: var(--zy-control-h-lg);
120
+ --el-component-size-small: var(--zy-control-h-sm);
121
+ --el-border-color: var(--zy-hairline);
122
+ --el-border-color-light: var(--zy-hairline);
123
+ --el-border-color-lighter: var(--zy-hairline);
124
+ --el-border-color-extra-light: var(--zy-hairline);
125
+ --el-fill-color-light: var(--zy-slot-face);
126
+ --el-fill-color-lighter: var(--zy-slot-face);
127
+ --el-mask-color: rgba(15, 23, 42, 0.34);
128
+
129
+ }
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
+
221
+ html[data-zy-theme='solid'] .zy-btn.el-button {
222
+ font-weight: var(--zy-weight-control);
223
+ /*
224
+ * 高度**不动**:Element 把基础按钮高度写死 32px(`--el-button-size` 只在 large / small 上有),
225
+ * 本主题不去接管它 —— 主题改的是材质,不改尺寸。输入类那档 `--zy-control-h` 也取 32,
226
+ * 于是输入框 / 选择器 / 按钮三者同高(早先实色主题是 36,比按钮高一档,已作废)。
227
+ */
228
+ --zy-key-h-btn: var(--el-button-size, 32px);
229
+ /* 键帽几何走 material.css 的共享图层:这里只报高度与自己的挤出厚度 */
230
+ --zy-key-h: var(--zy-key-h-btn);
231
+ --zy-key-lift-now: var(--zy-key-lift-btn);
232
+ --zy-key-lift-btn: var(--zy-key-lift); /* 键帽高度「正常」档:按钮 */
233
+ --zy-key-face-btn: var(--zy-key-face);
234
+ --zy-key-ink-btn: var(--zy-ink);
235
+ /* 底座一律由面色深一档推出来 —— 与 .zy-btn.is-fill 的 --zy-btn-fill-base 同一条公式(含中性白键) */
236
+ --zy-key-base-btn: color-mix(in srgb, var(--zy-key-face-btn) 82%, #000);
237
+ /* 两侧 10% 白弧:与组件里那两颗 SVG 逐字相同,只是改由背景图层承担 */
238
+ }
239
+
240
+ /* type 决定面色与字色:彩色键白字,即「要你按的键」 */
241
+ html[data-zy-theme='solid'] .zy-btn.el-button--primary {
242
+ --zy-key-face-btn: var(--zy-brand);
243
+ --zy-key-ink-btn: #fff;
244
+ }
245
+
246
+ html[data-zy-theme='solid'] .zy-btn.el-button--success {
247
+ --zy-key-face-btn: var(--zy-green);
248
+ --zy-key-ink-btn: #fff;
249
+ }
250
+
251
+ html[data-zy-theme='solid'] .zy-btn.el-button--warning {
252
+ --zy-key-face-btn: var(--zy-warning);
253
+ --zy-key-ink-btn: #fff;
254
+ }
255
+
256
+ html[data-zy-theme='solid'] .zy-btn.el-button--danger {
257
+ /* danger 在色板里只有纯色、没有配套渐变 —— 与组件一致,这一层留空 */
258
+ --zy-key-face-btn: var(--zy-danger);
259
+ --zy-key-ink-btn: #fff;
260
+ }
261
+
262
+ html[data-zy-theme='solid'] .zy-btn.el-button--info {
263
+ --zy-key-face-btn: var(--zy-info);
264
+ --zy-key-ink-btn: #fff;
265
+ }
266
+
267
+ /*
268
+ * 无 type 的默认键 = 中性键:面白、字墨、底座取冷灰 --zy-key-base。
269
+ * 这一档就是参照物「实色·中性」那套(fill 的中性档):白色键不再由「白面混黑」得到中性灰,
270
+ * 否则同一个白键在 fill 与默认档下会差一档灰(#d5dfea vs #d2d2d2)。
271
+ */
272
+ html[data-zy-theme='solid'] .zy-btn.el-button:not(.el-button--primary):not(.el-button--success):not(.el-button--warning):not(.el-button--danger):not(.el-button--info) {
273
+ --zy-key-face-btn: var(--zy-key-face);
274
+ --zy-key-base-btn: var(--zy-key-base);
275
+ --zy-key-ink-btn: var(--zy-ink);
276
+ }
277
+
278
+ /* 小号:底座薄一档(与 fill 的三档一致) */
279
+ html[data-zy-theme='solid'] .zy-btn.el-button--small {
280
+ --zy-key-lift-btn: 3px;
281
+ }
282
+
283
+ /* plain / dashed:同族的中性键 —— 面白、底座冷灰、字取语义色
284
+ (厚度与其它键同一档:一棵键只有一个厚度,只有 small 才薄一档) */
285
+ html[data-zy-theme='solid'] .zy-btn.is-plain,
286
+ html[data-zy-theme='solid'] .zy-btn.is-dashed {
287
+ --zy-key-face-btn: var(--zy-key-face);
288
+ --zy-key-base-btn: var(--zy-key-base);
289
+ --zy-key-ink-btn: var(--el-button-text-color);
290
+ }
291
+
292
+ /* sweep:图标块改成「贴边的彩色小键」,键体本身与其它键同族 */
293
+ html[data-zy-theme='solid'] .zy-btn.is-sweep {
294
+ --zy-btn-sweep-bw: 0px;
295
+ /* 键体保持中性面:语义色留在左端那颗图标键上(底座与其它白键同档) */
296
+ --zy-key-face-btn: var(--zy-key-face);
297
+ --zy-key-base-btn: var(--zy-key-base);
298
+ --zy-key-ink-btn: var(--zy-ink);
299
+ }
300
+
301
+ html[data-zy-theme='solid'] .zy-btn.is-sweep .zy-btn-sweep-icon {
302
+ /*
303
+ * 图标块是这条键左端的一段上色键:**只用颜色分段**,不加顶亮边、也不留缝 ——
304
+ * 早先加过一条 `inset 0 1px 0 rgba(255,255,255,.35)`(想让它读成一颗独立的小键),
305
+ * 但它只覆盖图标块那一段宽度,铺满同色时就在顶上留下一道多余的实线。
306
+ */
307
+ border-radius: var(--zy-radius) 0 0 var(--zy-radius);
308
+ }
309
+
310
+ /*
311
+ * 铺色层的裁切壳:组件里它是 `inset: -bw` + `border-radius: inherit`,而 inherit 落到的是
312
+ * `.zy-btn-sweep` 那一层(没有圆角)—— 于是悬停铺满时把四个圆角顶成直角。这里按按钮自己的
313
+ * 圆角裁(半径与主题一致,round 走胶囊)。
314
+ */
315
+ html[data-zy-theme='solid'] .zy-btn.is-sweep .zy-btn-sweep-clip {
316
+ border-radius: var(--zy-radius);
317
+ }
318
+
319
+ html[data-zy-theme='solid'] .zy-btn.is-sweep.is-round .zy-btn-sweep-clip {
320
+ border-radius: var(--zy-radius-pill);
321
+ }
322
+
323
+ /* ---------- 键帽本体:实心 / 默认 / plain / dashed / sweep 共用一套 ---------- */
324
+ /* 面色 + 两颗白弧 + 底部高光 + 深一档挤出底座,逐项与 .zy-btn.is-fill 对齐 */
325
+ html[data-zy-theme='solid'] .zy-btn.is-press:not(.is-fill):not(.is-text):not(.is-link),
326
+ html[data-zy-theme='solid'] .zy-btn.is-plain,
327
+ html[data-zy-theme='solid'] .zy-btn.is-dashed,
328
+ html[data-zy-theme='solid'] .zy-btn.is-sweep {
329
+ position: relative;
330
+ border: 0;
331
+ background-color: var(--zy-key-face-btn);
332
+ /* 背景图层会自己按圆角裁切,不需要动 overflow(sweep 还要靠它放色块) */
333
+ background-image: var(--zy-key-stack) !important;
334
+ background-repeat: no-repeat;
335
+ background-position: var(--zy-key-stack-pos);
336
+ background-size: var(--zy-key-stack-size);
337
+ /*
338
+ * !important 是必须的:组件里那条 `.zy-btn.is-press…el-button--primary` 的静态投影
339
+ * (box-shadow: var(--zy-shadow-press))权重比主题层高(10 个类 vs 6),
340
+ * 不压过去的话,键帽的挤出底座根本轮不到出场。焦点环因此改走 outline(见下)。
341
+ */
342
+ box-shadow:
343
+ 0 var(--zy-key-lift-btn) 0 var(--zy-key-base-btn),
344
+ 0 6px 14px rgba(15, 23, 42, 0.25) !important;
345
+ transition:
346
+ transform 320ms var(--zy-ease-overshoot),
347
+ box-shadow 320ms var(--zy-ease-overshoot);
348
+ }
349
+
350
+ /* 字色:语义键白字、中性键墨字;outline 保持组件给的语义色字 */
351
+ html[data-zy-theme='solid'] .zy-btn.is-press:not(.is-fill):not(.is-text):not(.is-link),
352
+ html[data-zy-theme='solid'] .zy-btn.is-plain,
353
+ html[data-zy-theme='solid'] .zy-btn.is-dashed,
354
+ html[data-zy-theme='solid'] .zy-btn.is-sweep {
355
+ color: var(--zy-key-ink-btn);
356
+ }
357
+
358
+ /* dashed:虚线还在,只是它现在是键面上的一道缝合线 */
359
+ html[data-zy-theme='solid'] .zy-btn.is-dashed {
360
+ outline: 1px dashed color-mix(in srgb, var(--zy-key-ink-btn) 45%, transparent);
361
+ outline-offset: -5px;
362
+ }
363
+
364
+ /*
365
+ * 悬停:**不动**。
366
+ * 与实色按钮(effect="fill")逐项对齐 —— 那颗键悬停时唯一的动作是「深色键帽从中心铺满」,
367
+ * 底座跟着铺开色走;默认键没有这一路铺色,所以悬停就不该有别的动静。
368
+ * 早期版本在这里加了「抬起 1px」,既与 fill 不一致,还因为悬停选择器天生比按下多一个伪类
369
+ * (8 个类 vs 7 个)把按下态压住 —— 按压下沉直接失效。
370
+ */
371
+
372
+ /* 按下:整块沉进底座,落地影收成一层(每一档 effect 都要沉 —— 这是本主题的手感底线) */
373
+ html[data-zy-theme='solid'] .zy-btn.el-button.is-press:not(.is-fill):not(.is-text):not(.is-link):not(.is-disabled):active,
374
+ html[data-zy-theme='solid'] .zy-btn.el-button.is-plain:not(.is-disabled):active,
375
+ html[data-zy-theme='solid'] .zy-btn.el-button.is-dashed:not(.is-disabled):active,
376
+ html[data-zy-theme='solid'] .zy-btn.el-button.is-sweep:not(.is-disabled):active {
377
+ /* 与 fill 的按下同一组数值:位移 = 挤出厚度,底座收平,落地影压到一层 */
378
+ transform: translateY(var(--zy-key-lift-btn));
379
+ box-shadow:
380
+ 0 0 0 var(--zy-key-base-btn),
381
+ 0 2px 6px rgba(15, 23, 42, 0.2) !important;
382
+ transition:
383
+ transform 120ms var(--zy-ease-out),
384
+ box-shadow 120ms var(--zy-ease-out);
385
+ }
386
+
387
+ /* 焦点环改走 outline:box-shadow 全给了立体底座(与组件里 fill 那一档同一处理) */
388
+ html[data-zy-theme='solid'] .zy-btn:focus-visible {
389
+ box-shadow:
390
+ 0 var(--zy-key-lift-btn) 0 var(--zy-key-base-btn),
391
+ 0 6px 14px rgba(15, 23, 42, 0.25) !important;
392
+ outline: 2px solid var(--zy-key-face-btn);
393
+ outline-offset: 3px;
394
+ }
395
+
396
+
397
+ /* 禁用:键形还在,整颗压淡(与 fill 的禁用同一档) */
398
+ html[data-zy-theme='solid'] .zy-btn.is-press.is-disabled,
399
+ html[data-zy-theme='solid'] .zy-btn.is-plain.is-disabled,
400
+ html[data-zy-theme='solid'] .zy-btn.is-dashed.is-disabled,
401
+ html[data-zy-theme='solid'] .zy-btn.is-sweep.is-disabled {
402
+ opacity: 0.55;
403
+ }
404
+
405
+ /* fill:与默认键同一颗键,厚度直接取同一档令牌,保证两处永远一致 */
406
+ html[data-zy-theme='solid'] .zy-btn.is-fill {
407
+ --zy-btn-fill-lift: var(--zy-key-lift-btn);
408
+ }
409
+
410
+ /* fill 不写 type 时也走中性键:这样 effect="fill" 与默认键在任何 type 下都逐项相同
411
+ (组件原本给 fill 的兜底面色是品牌蓝,那是它自带的历史默认值) */
412
+ html[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) {
413
+ --zy-btn-fill-clr: var(--zy-key-face);
414
+ --zy-btn-fill-ink: var(--zy-ink);
415
+ --zy-btn-fill-base: var(--zy-key-base);
416
+ /* 铺色后翻成浅色字(铺开的是深色键帽) */
417
+ --zy-btn-fill-ink-on: #fff;
418
+ }
419
+
420
+ html[data-zy-theme='solid'] .zy-btn.is-fill .zy-btn-fill-label {
421
+ font-weight: var(--zy-weight-control);
422
+ }
423
+
424
+ /*
425
+ * fill 在实色主题下**不做任何改动** —— 它就是本主题的参照物:厚度、白弧、底部高光、
426
+ * 悬停铺色、按下、禁用,全部交给组件自己那套数值。主题只声明「默认档也用这套材质」。
427
+ */
428
+
429
+ /* ============================================================
430
+ * 2 · 图标 —— 无材质,只说明线宽与尺寸(见规范文档)
431
+ * ============================================================ */
432
+
433
+ /* ============================================================
434
+ * 3 · 输入框 —— 槽(凹):内阴影 + 下沿内高光
435
+ * ============================================================ */
436
+
437
+ html[data-zy-theme='solid'] .zy-input .el-input__wrapper {
438
+ border: 0;
439
+ border-radius: var(--zy-radius);
440
+ background-color: var(--zy-slot-face);
441
+ box-shadow: var(--zy-slot-shadow);
442
+ }
443
+
444
+ @media (hover: hover) and (pointer: fine) {
445
+ html[data-zy-theme='solid'] .zy-input .el-input__wrapper:hover {
446
+ box-shadow: var(--zy-slot-shadow-sm);
447
+ }
448
+ }
449
+
450
+ html[data-zy-theme='solid'] .zy-input.is-focus .el-input__wrapper.is-focus,
451
+ html[data-zy-theme='solid'] .zy-input .el-input__wrapper.is-focus {
452
+ border-color: transparent;
453
+ box-shadow:
454
+ var(--zy-slot-shadow),
455
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
456
+ }
457
+
458
+ /* 下划线 / 渐变 / 粗野三档是动效本身的形态,材质交给它们自己,不动 */
459
+
460
+ /* ============================================================
461
+ * 3·凸 · 同一只输入框的「键帽」形态(is-raised):面翻成**凸** ——
462
+ * 面 + 两侧 10% 白弧 + 底部高光 + **正常档 4px** 挤出底座 + 落地影。
463
+ * 输入框是「控件」不是「小件」:键帽高度取三档里的**正常**(与按钮同一档),
464
+ * 不跟分页键 / 标签那档 2px 走。
465
+ *
466
+ * **底座与默认按钮逐值相同**(这是「同一套」的硬标准):
467
+ * 底座色 = `--zy-key-base`(中性白键的 `--zy-key-base-btn` 就是它,逐字同值);
468
+ * 落地影 = `0 6px 14px rgba(15, 23, 42, .25)`(按钮同一档);
469
+ * 没有按钮没有的东西(比如额外的 `inset` 顶亮边),悬停也不动。
470
+ * ============================================================ */
471
+
472
+ html[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper {
473
+ --zy-key-h: 32px;
474
+ --zy-key-lift-now: var(--zy-key-lift);
475
+ border: 0;
476
+ border-radius: var(--zy-radius);
477
+ background-color: var(--zy-key-face);
478
+ background-image: var(--zy-key-stack);
479
+ background-repeat: no-repeat;
480
+ background-position: var(--zy-key-stack-pos);
481
+ background-size: var(--zy-key-stack-size);
482
+ box-shadow:
483
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
484
+ 0 6px 14px rgba(15, 23, 42, 0.25);
485
+ }
486
+
487
+ /*
488
+ * 聚焦 = **按下**:与按钮 `.is-press:active` 同一组数值 ——
489
+ * 位移 = 挤出厚度(4px)、底座收平、落地影压到一层,**不出聚焦环**。
490
+ * (视觉上就是这颗键沉进底座;失焦再弹回来。)
491
+ * 这条要压过 ZyInput 自带的 `.is-focus` 环(它带 scoped 属性,权重更高),
492
+ * 所以选择器一路写到 `.is-focus` 上,多一个类。
493
+ */
494
+ html[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper.is-focus,
495
+ html[data-zy-theme='solid'] .zy-input.is-raised .el-input__wrapper.is-focus:hover {
496
+ transform: translateY(var(--zy-key-lift));
497
+ box-shadow:
498
+ 0 0 0 var(--zy-key-base),
499
+ 0 2px 6px rgba(15, 23, 42, 0.2);
500
+ transition:
501
+ transform 120ms var(--zy-ease-out),
502
+ box-shadow 120ms var(--zy-ease-out);
503
+ }
504
+
505
+ /* ============================================================
506
+ * 验证码输入 CodeInput —— 每格一颗小键,填满 = 上色键。
507
+ * 注:这个组件已从板上撤下(04 位置换成滑块拼图验证),材质规则先留着 ——
508
+ * 库里还用到它的地方照这一套走。
509
+ * ============================================================ */
510
+
511
+ html[data-zy-theme='solid'] .zy-code {
512
+ --zy-code-line: transparent;
513
+ --zy-code-radius: var(--zy-radius);
514
+ --zy-code-slot: var(--zy-key-face);
515
+ }
516
+
517
+ html[data-zy-theme='solid'] .zy-code .zy-code__slot {
518
+ box-shadow:
519
+ inset 0 1px 0 var(--zy-key-edge),
520
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
521
+ 0 6px 12px rgba(15, 23, 42, 0.08);
522
+ }
523
+
524
+ html[data-zy-theme='solid'] .zy-code .zy-code__slot.is-filled {
525
+ background: var(--zy-brand);
526
+ color: #fff;
527
+ box-shadow:
528
+ inset 0 1px 0 rgba(255, 255, 255, 0.32),
529
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 78%, #000),
530
+ 0 6px 12px rgba(15, 23, 42, 0.12);
531
+ }
532
+
533
+ html[data-zy-theme='solid'] .zy-code .zy-code__slot.is-filled .zy-code__digit {
534
+ color: #fff;
535
+ }
536
+
537
+ /* ============================================================
538
+ * 5 · 选择器 —— 触发框同槽;下拉面板 = 抬起的板;滑行高亮 = 槽内浅键
539
+ * ============================================================ */
540
+
541
+ html[data-zy-theme='solid'] .zy-select .el-select__wrapper {
542
+ border: 0;
543
+ border-radius: var(--zy-radius);
544
+ background-color: var(--zy-slot-face);
545
+ box-shadow: var(--zy-slot-shadow);
546
+ }
547
+
548
+ @media (hover: hover) and (pointer: fine) {
549
+ html[data-zy-theme='solid'] .zy-select .el-select__wrapper:hover {
550
+ box-shadow: var(--zy-slot-shadow-sm);
551
+ }
552
+ }
553
+
554
+ html[data-zy-theme='solid'] .zy-select.is-focus .el-select__wrapper.is-focused,
555
+ html[data-zy-theme='solid'] .zy-select .el-select__wrapper.is-focused {
556
+ border-color: transparent;
557
+ box-shadow:
558
+ var(--zy-slot-shadow),
559
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
560
+ }
561
+
562
+ /* 下拉面板:整块按**小键帽**来 —— 键帽形式(面 + 顶亮边 + 挤出底座),厚度取三档里的「小」(2px) */
563
+ html[data-zy-theme='solid'] .zy-select-popper {
564
+ border: 0 !important;
565
+ border-radius: var(--zy-radius) !important;
566
+ background: var(--zy-key-face);
567
+ /* 面板是「小件」:挤出底座取小档 2px(早先是 8px → 4px,现在按三档规范归到小档),
568
+ 落地影收淡一档,板子读成「一枚小键帽轻轻抬起」而不是「悬空一块砖」。 */
569
+ box-shadow:
570
+ inset 0 1px 0 var(--zy-key-edge),
571
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
572
+ 0 16px 28px rgba(15, 23, 42, 0.16) !important;
573
+ }
574
+
575
+ /* 滑行高亮仍是「凹进去的浅键」:面板是凸的,高亮是凹的,一凸一凹才分得清层级 */
576
+ html[data-zy-theme='solid'] .zy-select-popper .zy-select-glide-pill {
577
+ border-radius: var(--zy-radius-sm);
578
+ background: var(--zy-slot-face);
579
+ box-shadow: var(--zy-slot-shadow-sm);
580
+ }
581
+
582
+ /* ============================================================
583
+ * 5·凸 · 选择器的「键帽」形态(is-raised):与 03 那颗凸起输入框**逐值相同** ——
584
+ * 面 + 两侧 10% 白弧 + 底部高光 + 正常档 4px 底座(--zy-key-base)+ 落地影 0 6px 14px / 25%。
585
+ * 悬停不动;触发(is-focused)时像按钮一样整块沉进底座,不出环。
586
+ * ============================================================ */
587
+
588
+ html[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper {
589
+ --zy-key-h: 32px;
590
+ --zy-key-lift-now: var(--zy-key-lift);
591
+ border: 0;
592
+ border-radius: var(--zy-radius);
593
+ background-color: var(--zy-key-face);
594
+ background-image: var(--zy-key-stack);
595
+ background-repeat: no-repeat;
596
+ background-position: var(--zy-key-stack-pos);
597
+ background-size: var(--zy-key-stack-size);
598
+ box-shadow:
599
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
600
+ 0 6px 14px rgba(15, 23, 42, 0.25);
601
+ }
602
+
603
+ /* 悬停不动(这套语言里悬停唯一的动作是铺色,中性键没有那一路) */
604
+ @media (hover: hover) and (pointer: fine) {
605
+ html[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper:hover {
606
+ box-shadow:
607
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
608
+ 0 6px 14px rgba(15, 23, 42, 0.25);
609
+ }
610
+ }
611
+
612
+ /* 触发 = 按下:与 03 那颗凸起输入框同一组数值 */
613
+ html[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper.is-focused,
614
+ html[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper.is-focus,
615
+ html[data-zy-theme='solid'] .zy-select.is-raised .el-select__wrapper:focus-visible {
616
+ transform: translateY(var(--zy-key-lift));
617
+ box-shadow:
618
+ 0 0 0 var(--zy-key-base),
619
+ 0 2px 6px rgba(15, 23, 42, 0.2);
620
+ transition:
621
+ transform 120ms var(--zy-ease-out),
622
+ box-shadow 120ms var(--zy-ease-out);
623
+ }
624
+
625
+ /*
626
+ * 禁用态:**槽形不塌**(厚度是三档里的规范,不因为禁用就抹掉),整块压淡到 55% ——
627
+ * 与分页器上一页 / 按钮的禁用同一档;字退到 placeholder 档,指针 not-allowed(Element 自带)。
628
+ */
629
+ html[data-zy-theme='solid'] .zy-select .el-select__wrapper.is-disabled {
630
+ color: var(--zy-placeholder);
631
+ opacity: 0.55;
632
+ }
633
+
634
+ html[data-zy-theme='solid'] .zy-select .el-select__wrapper.is-disabled .el-select__selected-item,
635
+ html[data-zy-theme='solid'] .zy-select .el-select__wrapper.is-disabled .el-select__placeholder {
636
+ color: var(--zy-placeholder);
637
+ }
638
+
639
+ /* ============================================================
640
+ * 6 · 复选框 —— 键帽加大一档,厚度跟着加
641
+ * ============================================================ */
642
+
643
+ html[data-zy-theme='solid'] .zy-check,
644
+ html[data-zy-theme='solid'] .zy-tree {
645
+ --zy-check-size: 18px;
646
+ /* 键帽高度「小」档:复选框底座的厚度与主题三档一致 */
647
+ --zy-check-lift: var(--zy-key-lift-sm);
648
+ }
649
+
650
+ html[data-zy-theme='solid'] .zy-check .el-checkbox__inner,
651
+ html[data-zy-theme='solid'] .zy-tree .el-checkbox__inner {
652
+ border-radius: var(--zy-radius-sm);
653
+ }
654
+
655
+ /*
656
+ * 未选 = **空槽**,与单选框、输入框同一个坑:槽底 + 内阴影压出凹陷。
657
+ *
658
+ * 上一版只把描边设成透明、再补一道白色顶光 —— 白色键面落在白卡片上,
659
+ * 整颗方框就消失了(单选框能扛住是因为圆形本身还有暗角,方框不行)。
660
+ * 现在面色取槽底,边界由内阴影给出,白卡片上也读得出「这里可以打勾」。
661
+ */
662
+ html[data-zy-theme='solid'] .zy-check .el-checkbox__input:not(.is-checked):not(.is-indeterminate) .el-checkbox__inner,
663
+ html[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-checked):not(.is-indeterminate) .el-checkbox__inner {
664
+ border-color: var(--zy-key-base);
665
+ background-color: var(--zy-slot-face);
666
+ box-shadow: var(--zy-slot-shadow-sm);
667
+ }
668
+
669
+ /*
670
+ * 勾选 / 半选 = **分页器选中键那档蓝**:面色直接取分页选中键实际呈现的颜色
671
+ * (品牌蓝 + 两侧 10% 白弧合成的那一档,实测 rgb(26,117,177)),所以这里不再叠白弧 ——
672
+ * 叠了会在小方框上再一次被抬浅、还会带出两道弧的拼接线。底部渐层高光照留。
673
+ * 顶亮边与底座沿用分页选中键那一套(inset 0.3 白 / 面色深一档),勾与半选横杠白字。
674
+ * 另外去掉 Element 勾选态自带的 1px 品牌蓝描边。
675
+ */
676
+ html[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input:not(.is-disabled).is-checked .el-checkbox__inner,
677
+ html[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input:not(.is-disabled).is-indeterminate .el-checkbox__inner,
678
+ html[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-disabled).is-checked .el-checkbox__inner,
679
+ html[data-zy-theme='solid'] .zy-tree .el-checkbox__input:not(.is-disabled).is-indeterminate .el-checkbox__inner {
680
+ --zy-key-h: var(--zy-check-size);
681
+ --zy-key-lift-now: var(--zy-check-lift);
682
+ --zy-key-gloss: linear-gradient(
683
+ to bottom,
684
+ rgba(255, 255, 255, 0) calc((var(--zy-key-h) - var(--zy-key-lift-now)) / 2),
685
+ rgba(255, 255, 255, 0.3) 100%
686
+ );
687
+ border-color: transparent;
688
+ /* 分页器选中键实际呈现的那档蓝(品牌蓝 + 10% 白弧)—— 与白弧同源,改主色时一起走 */
689
+ background-color: color-mix(in srgb, var(--zy-brand) 90%, #fff);
690
+ background-image: var(--zy-key-gloss);
691
+ background-repeat: no-repeat;
692
+ background-position: left top;
693
+ background-size: 100% 100%;
694
+ box-shadow:
695
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
696
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 82%, #000);
697
+ }
698
+
699
+ /*
700
+ * 半选那条横杠:颜色与粗细都跟勾对齐。
701
+ * Element 默认给它 `transform: scale(.5)`,连高度一起压成 1px,白线看上去就发灰;
702
+ * 这里只压宽度(scaleX),高度给足 2px(与勾的笔画同宽),颜色直接取勾用的那个变量。
703
+ */
704
+ html[data-zy-theme='solid'] .zy-check:not(.is-checkmark):not(.is-tick) .el-checkbox__input.is-indeterminate:not(.is-disabled) .el-checkbox__inner::before,
705
+ html[data-zy-theme='solid'] .zy-tree .el-checkbox__input.is-indeterminate:not(.is-disabled) .el-checkbox__inner::before {
706
+ height: 2px;
707
+ border-radius: 1px;
708
+ top: calc((var(--zy-check-size) - 2px) / 2);
709
+ transform: scaleX(0.5);
710
+ background-color: var(--el-checkbox-checked-icon-color);
711
+ }
712
+
713
+ /* ============================================================
714
+ * 7 · 开关 —— 全息形态是动效语言(保留),本主题只把它按到桌面上
715
+ * ============================================================ */
716
+
717
+ html[data-zy-theme='solid'] .zy-switch-track {
718
+ border-radius: var(--zy-radius-pill);
719
+ box-shadow:
720
+ 0 var(--zy-key-lift-sm) 0 #0c1622,
721
+ 0 10px 18px rgba(15, 23, 42, 0.22);
722
+ }
723
+
724
+ /* ============================================================
725
+ * 8 · 单选框 —— 未选是槽里的小坑,选中是上色键
726
+ * ============================================================ */
727
+
728
+ html[data-zy-theme='solid'] .zy-radio .el-radio__inner {
729
+ width: 18px;
730
+ height: 18px;
731
+ border: 0;
732
+ background: var(--zy-slot-face);
733
+ box-shadow: var(--zy-slot-shadow-sm);
734
+ }
735
+
736
+ /*
737
+ * 选中 = 全息开关里那颗圆球,**配色逐字照搬** ZySwitch 的三层:
738
+ * 球壳 .zy-switch-thumb —— radial-gradient(圆, rgba(10,40,90,.9), rgba(0,20,50,.8))
739
+ * + 外环 1px rgba(0,170,255,.6)
740
+ * + 外投影 0 2px 15px rgba(0,0,0,.5) / 内发光 inset 0 0 15px rgba(0,150,255,.5)
741
+ * 中层 .zy-switch-core —— radial-gradient(圆, rgba(0,180,255,.6), rgba(0,50,120,.2))
742
+ * + 辉光 0 0 20px rgba(0,150,255,.5),opacity .9
743
+ * 亮芯 .zy-switch-inner —— radial-gradient(圆, rgba(255,255,255,.8), rgba(100,200,255,.5))
744
+ * + 辉光 0 0 10px rgba(100,200,255,.7),opacity .7
745
+ * 颜色值一字不改;尺寸与辉光半径按 18 ÷ 54 = 1/3 等比缩(开关那颗球是 54px),
746
+ * 所以三层落成:球壳 18px、中层 13.3px(.el-radio__inner::before)、亮芯 8.3px(::after)。
747
+ * 开关原稿给亮芯配了 2s 的心跳动画,这里不搬 —— 单选框是静态标记,不带循环动效。
748
+ */
749
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked .el-radio__inner {
750
+ width: 18px;
751
+ height: 18px;
752
+ overflow: hidden; /* 与开关那颗球一致:内层的辉光被球壳裁住,不外溢 */
753
+ border: 1px solid rgba(0, 170, 255, 0.6);
754
+ background: radial-gradient(circle, rgba(10, 40, 90, 0.9) 0%, rgba(0, 20, 50, 0.8) 100%);
755
+ box-shadow:
756
+ 0 2px 5px rgba(0, 0, 0, 0.5),
757
+ inset 0 0 5px rgba(0, 150, 255, 0.5);
758
+ }
759
+
760
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked .el-radio__inner::before {
761
+ content: '';
762
+ position: absolute;
763
+ top: 50%;
764
+ left: 50%;
765
+ width: 13.3px;
766
+ height: 13.3px;
767
+ border-radius: 50%;
768
+ transform: translate(-50%, -50%);
769
+ background: radial-gradient(circle, rgba(0, 180, 255, 0.6) 0%, rgba(0, 50, 120, 0.2) 100%);
770
+ box-shadow: 0 0 6.7px rgba(0, 150, 255, 0.5);
771
+ opacity: 0.9;
772
+ }
773
+
774
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked .el-radio__inner::after {
775
+ width: 8.3px;
776
+ height: 8.3px;
777
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.8) 0%, rgba(100, 200, 255, 0.5) 100%);
778
+ box-shadow: 0 0 3.3px rgba(100, 200, 255, 0.7);
779
+ opacity: 0.7;
780
+ /* 中心白点的微动效:向外扩散再收回(与开关那颗亮芯同一路数:2s、alternate、scale ±10% 出头) */
781
+ animation: zy-radio-core-pulse 2s ease-in-out infinite alternate;
782
+ }
783
+
784
+ @keyframes zy-radio-core-pulse {
785
+ 0% {
786
+ opacity: 0.6;
787
+ transform: translate(-50%, -50%) scale(0.88);
788
+ box-shadow: 0 0 3px rgba(100, 200, 255, 0.55);
789
+ }
790
+
791
+ 100% {
792
+ opacity: 1;
793
+ transform: translate(-50%, -50%) scale(1.12);
794
+ box-shadow: 0 0 7px rgba(100, 200, 255, 0.85);
795
+ }
796
+ }
797
+
798
+ /* 与 motion.css 同一约定:减弱动效时这颗白点回到静止 */
799
+ @media (prefers-reduced-motion: reduce) {
800
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked .el-radio__inner::after {
801
+ animation: none;
802
+ }
803
+ }
804
+
805
+ /*
806
+ * 选中后的外圈涟漪,参考那份 glitch-radio 的 pulse-wave:scale 1 → 2.5、1.2s、
807
+ * cubic-bezier(0, 0, .2, 1)、两圈错峰 0.3s。
808
+ * 涟漪画在**球的外层**(.el-radio__input,与球同位同尺寸、overflow 可见)——
809
+ * 既不会被球壳的 overflow: hidden 裁掉,也不碰球自身的 transform,
810
+ * 所以组件那一下点按的回弹(.zy-radio 的 zy-radio-pop,作用在球上)照旧生效。
811
+ */
812
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked::before,
813
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked::after {
814
+ content: '';
815
+ position: absolute;
816
+ inset: 0;
817
+ border: 1px solid rgba(0, 170, 255, 0.6);
818
+ border-radius: 50%;
819
+ opacity: 0;
820
+ pointer-events: none;
821
+ animation: zy-radio-pulse-wave 1.2s cubic-bezier(0, 0, 0.2, 1) infinite;
822
+ }
823
+
824
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked::after {
825
+ animation-delay: 0.3s;
826
+ }
827
+
828
+ @keyframes zy-radio-pulse-wave {
829
+ from {
830
+ transform: scale(1);
831
+ opacity: 0.7;
832
+ }
833
+
834
+ to {
835
+ transform: scale(2.5);
836
+ opacity: 0;
837
+ }
838
+ }
839
+
840
+ /* 与 motion.css 同一约定:减弱动效时两圈涟漪也停住 */
841
+ @media (prefers-reduced-motion: reduce) {
842
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked::before,
843
+ html[data-zy-theme='solid'] .zy-radio .el-radio__input.is-checked::after {
844
+ animation: none;
845
+ }
846
+ }
847
+
848
+ /* 分段按钮组:轨道是槽,选中块是一颗滑行的键 */
849
+ html[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) {
850
+ /* 轨道与滑行块在基础主题里是胶囊,这里保持同样的形状语言 */
851
+ border-radius: var(--zy-radius-pill);
852
+ background: var(--zy-slot-face);
853
+ box-shadow: var(--zy-slot-shadow);
854
+ }
855
+
856
+ html[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio-button-slider {
857
+ border-radius: var(--zy-radius-pill);
858
+ background: var(--zy-key-face);
859
+ box-shadow:
860
+ inset 0 1px 0 var(--zy-key-edge),
861
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
862
+ 0 6px 12px rgba(15, 23, 42, 0.1);
863
+ }
864
+
865
+ html[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio-button.is-active .el-radio-button__inner {
866
+ color: var(--zy-brand-deep);
867
+ }
868
+
869
+ html.dark[data-zy-theme='solid'] .zy-radio-group:has(.el-radio-button) .zy-radio-button.is-active .el-radio-button__inner {
870
+ color: var(--zy-brand);
871
+ }
872
+
873
+ /* ============================================================
874
+ * 9 · 卡片 —— 大键帽:白面 + 挤出边 + 两侧白弧(弧块由组件自带)
875
+ * ============================================================ */
876
+
877
+ html[data-zy-theme='solid'] .zy-card {
878
+ /* 只换「用哪张面」:中性白键帽 + 墨色字;厚度 / 白弧尺寸 / 内部留白 / 投影全部走组件原本那套 */
879
+ --zy-card-fill-clr: var(--zy-key-face);
880
+ --zy-card-fill-ink: var(--zy-ink);
881
+ --zy-card-fill-line: rgba(15, 23, 42, 0.1);
882
+ /* 键帽高度「大」档:卡片底座 6px,取自主题令牌,不在组件里另写一份数值 */
883
+ --zy-card-fill-lift: var(--zy-key-lift-lg);
884
+ }
885
+
886
+ /* ============================================================
887
+ * 10 · 标签 —— 默认 = 小键帽(语义浅面 + 深一档底座);light = 槽标签
888
+ * ============================================================ */
889
+
890
+ html[data-zy-theme='solid'] .zy-tag {
891
+ border-color: transparent !important;
892
+ /* 标签是「小件」:圆角按规范取 4(控件才是 6);胶囊另算 */
893
+ border-radius: var(--zy-radius-sm);
894
+ padding-inline: 10px;
895
+ box-shadow:
896
+ inset 0 1px 0 rgba(255, 255, 255, 0.85),
897
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--el-tag-text-color) 26%, #c8d2de),
898
+ 0 4px 8px rgba(15, 23, 42, 0.08);
899
+ }
900
+
901
+ html[data-zy-theme='solid'] .zy-tag.is-round {
902
+ border-radius: var(--zy-radius-pill);
903
+ }
904
+
905
+ /* fill 已是键帽材质:厚度对齐主题 */
906
+ html[data-zy-theme='solid'] .zy-tag.is-fill:not(.is-round) {
907
+ /* 数值全部交回组件:实色标签是「实色按钮」同一套材质,不该各写一份 */
908
+ border-radius: var(--zy-radius-sm);
909
+ /* 键帽高度「小」档:标签底座 2px(组件原本默认 3px);large 档回到「正常」4px */
910
+ --zy-tag-fill-lift: var(--zy-key-lift-sm);
911
+ }
912
+
913
+ html[data-zy-theme='solid'] .zy-tag.is-fill.el-tag--large {
914
+ --zy-tag-fill-lift: var(--zy-key-lift);
915
+ }
916
+
917
+ /* ============================================================
918
+ * 11 · 徽标 —— 角标 = 小键(面 + 一圈暗底 + 落地影)
919
+ * ============================================================ */
920
+
921
+ html[data-zy-theme='solid'] .zy-badge .el-badge__content {
922
+ border: 0;
923
+ /* 半径交回 Element(--el-badge-radius: 10px,小圆角胶囊;圆点是 50%)—— 形状不变,只换材质 */
924
+ box-shadow:
925
+ inset 0 1px 0 rgba(255, 255, 255, 0.4),
926
+ 0 2px 0 rgba(15, 23, 42, 0.26),
927
+ 0 5px 10px rgba(15, 23, 42, 0.18);
928
+ }
929
+
930
+ /* ============================================================
931
+ * 12 · 进度条 —— 轨道是槽,填充是带厚度的键条
932
+ * ============================================================ */
933
+
934
+ html[data-zy-theme='solid'] .zy-progress .el-progress-bar__outer {
935
+ border-radius: var(--zy-radius-pill);
936
+ background-color: var(--zy-slot-face);
937
+ box-shadow: var(--zy-slot-shadow);
938
+ }
939
+
940
+ html[data-zy-theme='solid'] .zy-progress .el-progress-bar__inner {
941
+ border-radius: var(--zy-radius-pill);
942
+ /*
943
+ * 面色取实心按钮**弧线中间那档主色**的纵向渐变色值(逐字取 `--zy-btn-grad-primary` 的两个停点:
944
+ * #00b5ed / #0066a9),**转成横向**铺到进度条上 —— 左端亮、右端深,随填充长度一起走。
945
+ * 现状那条「品牌蓝 → 储能绿」的横向渐变不再沿用(一条键条只用一个色相,两个语义色混在一条上
946
+ * 会和键帽语言打架)。按钮本身不动,这里只改进度条的填充色。
947
+ */
948
+ background: linear-gradient(90deg, #00b5ed 0%, #0066a9 100%);
949
+ box-shadow:
950
+ inset 0 1px 0 rgba(255, 255, 255, 0.4),
951
+ inset 0 -1px 0 rgba(0, 0, 0, 0.16),
952
+ 0 2px 0 rgba(15, 23, 42, 0.12);
953
+ }
954
+
955
+ html[data-zy-theme='solid'] .zy-progress .el-progress__text {
956
+ font-weight: var(--zy-weight-control);
957
+ }
958
+
959
+ /* ============================================================
960
+ * 13 · 日期选择器(Element Plus 二次封装;单日 + 日期范围)
961
+ * 触发框同槽;弹层是一块抬起的板(4px 底座 + 落地影 + 内沿亮边);
962
+ * 选中的日子是一枚上色小键(品牌面 + 小档 2px 底座 + 白字),今天只描一圈品牌环。
963
+ * 时间选择器有自己的 `.zy-time-picker` 规则,这里只认 --date / --daterange。
964
+ * ============================================================ */
965
+
966
+ /* 单日是「输入框套输入框」,日期范围把 wrapper 直接穿在身上 —— 两条都按槽处理 */
967
+ html[data-zy-theme='solid'] .el-date-editor--date .el-input__wrapper,
968
+ html[data-zy-theme='solid'] .el-date-editor--daterange {
969
+ border: 0;
970
+ border-radius: var(--zy-radius);
971
+ background-color: var(--zy-slot-face);
972
+ box-shadow: var(--zy-slot-shadow);
973
+ }
974
+
975
+ @media (hover: hover) and (pointer: fine) {
976
+ html[data-zy-theme='solid'] .el-date-editor--date .el-input__wrapper:hover,
977
+ html[data-zy-theme='solid'] .el-date-editor--daterange:hover {
978
+ box-shadow: var(--zy-slot-shadow-sm);
979
+ }
980
+ }
981
+
982
+ html[data-zy-theme='solid'] .el-date-editor--date .el-input__wrapper.is-focus,
983
+ html[data-zy-theme='solid'] .el-date-editor--daterange.is-active,
984
+ html[data-zy-theme='solid'] .el-date-editor--daterange.is-focus {
985
+ border-color: transparent;
986
+ box-shadow:
987
+ var(--zy-slot-shadow),
988
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
989
+ }
990
+
991
+ /* 弹层:一块抬起的板(与时间面板 / 对话框同一档) */
992
+ html[data-zy-theme='solid'] .el-picker-panel {
993
+ border: 0;
994
+ border-radius: var(--zy-radius);
995
+ background: var(--zy-key-face);
996
+ box-shadow:
997
+ inset 0 1px 0 var(--zy-key-edge),
998
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
999
+ 0 16px 28px rgba(15, 23, 42, 0.16);
1000
+ }
1001
+
1002
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-picker__header-label {
1003
+ color: var(--zy-ink);
1004
+ font-weight: 600;
1005
+ }
1006
+
1007
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-table th {
1008
+ color: var(--zy-muted);
1009
+ font-weight: 500;
1010
+ }
1011
+
1012
+ /*
1013
+ * 悬停:一枚白键轻轻浮起(小档 2px),与表格 / 树的悬停同一读法。
1014
+ * 已选中的日子(当前 / 范围两端)**不参与** —— 否则白面会盖掉那颗上色键,
1015
+ * 白字落在白底上就成了「一个没有字的白色小方块」(范围选择器里最容易撞到)。
1016
+ */
1017
+ @media (hover: hover) and (pointer: fine) {
1018
+ html[data-zy-theme='solid']
1019
+ .el-picker-panel
1020
+ .el-date-table
1021
+ td.available:not(.current):not(.start-date):not(.end-date):hover
1022
+ .el-date-table-cell__text {
1023
+ border-radius: var(--zy-radius-sm);
1024
+ background-color: var(--zy-key-face);
1025
+ box-shadow:
1026
+ inset 0 1px 0 var(--zy-key-edge),
1027
+ 0 2px 0 var(--zy-key-base);
1028
+ }
1029
+ }
1030
+
1031
+ /* 今天:只描一圈品牌环 */
1032
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-table td.today .el-date-table-cell__text {
1033
+ border-radius: var(--zy-radius-sm);
1034
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--zy-brand) 45%, transparent);
1035
+ color: var(--zy-brand);
1036
+ font-weight: 600;
1037
+ }
1038
+
1039
+ /* 范围中段:只铺一层淡品牌底(不给厚度,免得一路长出一排键) */
1040
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-table td.in-range .el-date-table-cell__text {
1041
+ background-color: var(--zy-brand-soft);
1042
+ color: var(--zy-brand);
1043
+ }
1044
+
1045
+ /*
1046
+ * 选中 / 范围两端:与分页器选中键**同一颗小键帽** ——
1047
+ * 同一张面(品牌色)、同一对 10% 白弧、同一条底部高光、同一个底座公式(面色深一档 · 82%)、
1048
+ * 同一层落地影;尺寸跟着日期格收到 24px(分页键是 28px,材质逐项相同、只差尺寸)。
1049
+ */
1050
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-table td.current:not(.disabled) .el-date-table-cell__text,
1051
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-table td.start-date .el-date-table-cell__text,
1052
+ html[data-zy-theme='solid'] .el-picker-panel .el-date-table td.end-date .el-date-table-cell__text {
1053
+ --zy-key-h: 24px;
1054
+ --zy-key-lift-now: var(--zy-key-lift-sm);
1055
+ border-radius: var(--zy-radius-sm);
1056
+ background-color: var(--zy-brand);
1057
+ background-image: var(--zy-key-stack);
1058
+ background-repeat: no-repeat;
1059
+ background-position: var(--zy-key-stack-pos);
1060
+ background-size: var(--zy-key-stack-size);
1061
+ color: #fff;
1062
+ box-shadow:
1063
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
1064
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 82%, #000),
1065
+ 0 4px 8px rgba(15, 23, 42, 0.1);
1066
+ }
1067
+
1068
+ /* ============================================================
1069
+ * 14 · 表格 —— 整表是一只托盘(槽),表头是抬起的键条,行是托盘里的格子
1070
+ * ============================================================ */
1071
+
1072
+ /*
1073
+ * 托盘(槽)包在表格外层 —— 由 ZyTable 自己渲染 .zy-table-tray。
1074
+ * 之前 padding 直接加在 Element 的表格根上:Element 按**边框盒**宽度算列宽,
1075
+ * 内容区却少了这 16px,于是表头比 body 宽 16px,底下就多出一条横向滚动条。
1076
+ */
1077
+ html[data-zy-theme='solid'] .zy-table-tray {
1078
+ --el-table-border-color: transparent;
1079
+ padding: 8px;
1080
+ border-radius: var(--zy-radius);
1081
+ background-color: color-mix(in srgb, var(--zy-slot-face) 86%, #b7c5d6);
1082
+ box-shadow: var(--zy-slot-shadow);
1083
+ }
1084
+
1085
+ /* 单元格不再画 1px 网格,改用槽内的刻痕(极淡的内阴影线) */
1086
+ html[data-zy-theme='solid'] .zy-table .el-table__cell {
1087
+ border-right: 0;
1088
+ border-left: 0;
1089
+ box-shadow: inset 0 -1px 0 var(--zy-slot-line);
1090
+ }
1091
+
1092
+ html[data-zy-theme='solid'] .zy-table th.el-table__cell {
1093
+ border-top: 0;
1094
+ background-color: var(--zy-key-face);
1095
+ box-shadow:
1096
+ inset 0 1px 0 var(--zy-key-edge),
1097
+ inset 0 -1px 0 rgba(15, 23, 42, 0.06),
1098
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
1099
+ }
1100
+
1101
+ /* 表头两端收圆,读成一整条键 */
1102
+ html[data-zy-theme='solid'] .zy-table th.el-table__cell:first-child {
1103
+ border-radius: var(--zy-radius) 0 0 0;
1104
+ }
1105
+
1106
+ html[data-zy-theme='solid'] .zy-table th.el-table__cell:last-child {
1107
+ border-radius: 0 var(--zy-radius) 0 0;
1108
+ }
1109
+
1110
+ html[data-zy-theme='solid'] .zy-table td.el-table__cell {
1111
+ background-color: transparent;
1112
+ }
1113
+
1114
+ html[data-zy-theme='solid'] .zy-table .el-table__body tr.el-table__row--striped > td.el-table__cell {
1115
+ background-color: color-mix(in srgb, var(--zy-key-face) 55%, var(--zy-slot-face));
1116
+ }
1117
+
1118
+ /*
1119
+ * 悬停:**不做任何变化** —— 行不变白键、不露底座、不铺底色,与静止态一模一样。
1120
+ * 表格是「装东西的托盘」,指针扫过只是经过,不是按下去;要按的那一行由它自己那些按钮 / 链接给反馈。
1121
+ * Element 那条默认悬停底色靠 `--el-table-row-hover-bg-color` 关掉;斑马行的条纹照旧
1122
+ * (条纹那条规则比 Element 的悬停规则重,悬停时读到的还是条纹)。
1123
+ */
1124
+ html[data-zy-theme='solid'] .zy-table {
1125
+ --el-table-row-hover-bg-color: transparent;
1126
+ }
1127
+
1128
+ /* ============================================================
1129
+ * 15 · 树形控件 —— 行是槽里的格,选中是上色键
1130
+ * ============================================================ */
1131
+
1132
+ /*
1133
+ * 整棵树是一只**托盘**(与表格同一套槽):树是承载件,按本主题「凸凹二象」应该是凹的。
1134
+ * 之前只给行加了个圆角、没给容器,行是浮在页面上的,跟表格那套读法对不上。
1135
+ */
1136
+ html[data-zy-theme='solid'] .zy-tree {
1137
+ padding: 8px;
1138
+ position: relative; /* 滑行高亮那枚小键就挂在树上 */
1139
+ --zy-tree-row: 32px; /* 行高抬到 32px(组件默认 28),与控件的「正常」档对齐 */
1140
+ border-radius: var(--zy-radius);
1141
+ background-color: color-mix(in srgb, var(--zy-slot-face) 86%, #b7c5d6);
1142
+ box-shadow: var(--zy-slot-shadow);
1143
+ }
1144
+
1145
+ html[data-zy-theme='solid'] .zy-tree .el-tree-node__content {
1146
+ border-radius: var(--zy-radius);
1147
+ /*
1148
+ * 行的左右留白比组件默认宽一档、行间留 3px 缝 —— 高亮时图标才不会贴着键边。
1149
+ * 左侧要 !important:Element 与组件把缩进写成行内 `padding-left: 0`(层级缩进改由引导线承担),
1150
+ * 行内声明只输给 important,普通选择器压不住它。
1151
+ */
1152
+ padding-inline: 12px !important;
1153
+ margin-block: 3px;
1154
+ }
1155
+
1156
+ /*
1157
+ * 悬停高亮交给「滑行的那枚小键」(下面 .zy-tree-glide):行自己不铺底色,
1158
+ * 免得两层高亮叠在一起。与小键同款的底色 / 顶亮边 / 小档挤出底座都写在 glide 上。
1159
+ */
1160
+ html[data-zy-theme='solid'] .zy-tree .el-tree-node__content:hover {
1161
+ background-color: transparent;
1162
+ box-shadow: none;
1163
+ }
1164
+
1165
+ /*
1166
+ * 滑行高亮:做法照选择器下拉面板那枚 glide pill —— 一枚小键跟着鼠标在行之间滑过去
1167
+ * (元素由 ZyTree 自己持有并定位,圆角 / 底色 / 厚度在这里定义,与行的内缩、行距自动对齐)。
1168
+ */
1169
+ html[data-zy-theme='solid'] .zy-tree-shell .zy-tree-glide {
1170
+ position: absolute;
1171
+ left: 0;
1172
+ top: 0;
1173
+ border-radius: var(--zy-radius);
1174
+ background: var(--zy-key-face);
1175
+ box-shadow:
1176
+ inset 0 1px 0 var(--zy-key-edge),
1177
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
1178
+ opacity: 0;
1179
+ pointer-events: none;
1180
+ transition:
1181
+ transform 220ms var(--zy-ease-out),
1182
+ width 220ms var(--zy-ease-out),
1183
+ height 220ms var(--zy-ease-out),
1184
+ opacity 150ms var(--zy-ease-out);
1185
+ }
1186
+
1187
+ /*
1188
+ * 当前节点 = **与 primary 一致的那颗键**:同一档品牌面色 + 两侧 10% 白弧 + 底部渐层高光
1189
+ * (与大键同一套图层,尺寸按这一行自己的高度算,所以行高改成 32 后弧也跟着走)。
1190
+ */
1191
+ html[data-zy-theme='solid'] .zy-tree .el-tree-node.is-current > .el-tree-node__content {
1192
+ --zy-key-h: var(--zy-tree-row);
1193
+ --zy-key-lift-now: var(--zy-key-lift-sm);
1194
+ background-color: var(--zy-brand);
1195
+ background-image: var(--zy-key-stack);
1196
+ background-repeat: no-repeat;
1197
+ background-position: var(--zy-key-stack-pos);
1198
+ background-size: var(--zy-key-stack-size);
1199
+ color: #fff;
1200
+ box-shadow:
1201
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
1202
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 78%, #000);
1203
+ }
1204
+
1205
+ /* ============================================================
1206
+ * 16 · 提示 —— 键帽条:白面 + 左侧 6px 语义键 + 厚度
1207
+ * ============================================================ */
1208
+
1209
+ html[data-zy-theme='solid'] .zy-alert {
1210
+ position: relative;
1211
+ overflow: hidden;
1212
+ padding-left: 20px;
1213
+ border: 0;
1214
+ border-radius: var(--zy-radius);
1215
+ background: var(--zy-key-face);
1216
+ /*
1217
+ * 底座与落地影都照**默认键**那一套:4px 挤出底座(冷灰)+ 同一条落地影
1218
+ * (原来那条 0 12px 22px .1 只有键的 .25 / 卡片的 .24 的一半,整条提示是飘着的)。
1219
+ */
1220
+ box-shadow:
1221
+ inset 0 1px 0 var(--zy-key-edge),
1222
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
1223
+ 0 6px 14px rgba(15, 23, 42, 0.25);
1224
+ }
1225
+
1226
+ html[data-zy-theme='solid'] .zy-alert::before {
1227
+ content: '';
1228
+ position: absolute;
1229
+ left: 0;
1230
+ top: 0;
1231
+ bottom: 0;
1232
+ width: 6px;
1233
+ background: var(--zy-info);
1234
+ /* 6px 语义键块:外沿跟着卡片圆角,上下各收一道亮/暗边,让它读成一块有厚度的塑料 */
1235
+ border-radius: var(--zy-radius) 0 0 var(--zy-radius);
1236
+ box-shadow:
1237
+ inset 0 1px 0 rgba(255, 255, 255, 0.45),
1238
+ inset 0 -1px 0 rgba(0, 0, 0, 0.18);
1239
+ }
1240
+
1241
+ /*
1242
+ * 描述文字回墨色:Element 的 is-light 把描述也染成语义色(标题、图标、左侧键块已经够了),
1243
+ * 本主题的规矩是「语义色只出现在要你按的地方」—— 一整条都彩字会把提示读得很吵。
1244
+ */
1245
+ html[data-zy-theme='solid'] .zy-alert .el-alert__description {
1246
+ color: var(--zy-muted);
1247
+ }
1248
+
1249
+ html[data-zy-theme='solid'] .zy-alert.el-alert--success::before {
1250
+ background: var(--zy-green);
1251
+ }
1252
+
1253
+ html[data-zy-theme='solid'] .zy-alert.el-alert--warning::before {
1254
+ background: var(--zy-warning);
1255
+ }
1256
+
1257
+ html[data-zy-theme='solid'] .zy-alert.el-alert--error::before {
1258
+ background: var(--zy-danger);
1259
+ }
1260
+
1261
+ /* ============================================================
1262
+ * 17 · 对话框 —— 抬起的大键帽面板;标题栏是面板上的一条槽
1263
+ * ============================================================ */
1264
+
1265
+ html[data-zy-theme='solid'] .zy-dialog {
1266
+ --el-dialog-border-radius: var(--zy-radius);
1267
+ border-radius: var(--zy-radius);
1268
+ background: var(--zy-key-face);
1269
+ /* 挤出底座取**默认档**(4px):面板是整块抬起的件,厚度跟"正常"档走 */
1270
+ box-shadow:
1271
+ inset 0 1px 0 var(--zy-key-edge),
1272
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
1273
+ 0 28px 48px rgba(15, 23, 42, 0.26);
1274
+ }
1275
+
1276
+ html[data-zy-theme='solid'] .zy-dialog .el-dialog__header {
1277
+ background: var(--zy-slot-face);
1278
+ border-bottom: 0;
1279
+ box-shadow:
1280
+ inset 0 1px 0 rgba(255, 255, 255, 0.7),
1281
+ inset 0 -1px 0 var(--zy-slot-line);
1282
+ }
1283
+
1284
+ html[data-zy-theme='solid'] .zy-dialog .zy-dialog-mark {
1285
+ border: 0;
1286
+ border-radius: var(--zy-radius);
1287
+ background: var(--zy-brand);
1288
+ color: #fff;
1289
+ box-shadow:
1290
+ inset 0 1px 0 rgba(255, 255, 255, 0.35),
1291
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 78%, #000);
1292
+ }
1293
+
1294
+ /* 关闭按钮的圆角保持基础主题那一档(组件已给 --zy-radius),这里不再单独写 */
1295
+
1296
+ html[data-zy-theme='solid'] .zy-dialog .el-dialog__footer {
1297
+ border-top: 0;
1298
+ background: var(--zy-slot-face);
1299
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
1300
+ }
1301
+
1302
+ /* ============================================================
1303
+ * 18 · 分割线 —— 从发丝线变成一道刻痕(上暗下亮)
1304
+ * ============================================================ */
1305
+
1306
+ html[data-zy-theme='solid'] .zy-divider.el-divider--horizontal {
1307
+ height: 2px;
1308
+ border-top: 0;
1309
+ border-radius: 2px;
1310
+ background: linear-gradient(180deg, rgba(15, 23, 42, 0.22), rgba(255, 255, 255, 1));
1311
+ }
1312
+
1313
+ html[data-zy-theme='solid'] .zy-divider .el-divider__text {
1314
+ background: transparent;
1315
+ padding: 0 12px;
1316
+ font-weight: 600;
1317
+ letter-spacing: 0.02em;
1318
+ }
1319
+
1320
+ /* ============================================================
1321
+ * 19 · 间距 —— 无材质,见规范文档
1322
+ * ============================================================ */
1323
+
1324
+ /* ============================================================
1325
+ * 20 · 加载 —— 点 / 柱 / 球都补一层「落在桌面上」的底影
1326
+ * ============================================================ */
1327
+
1328
+ /*
1329
+ * 底影要加在那 6px 的圆点上(`.zy-loading-dot::before`),**不能**加在 `.zy-loading-dot` 上 ——
1330
+ * 后者是每个点的 64×64 旋转包裹盒:盒子透明、各自带不同旋转角,加在它上面会投出一片方形阴影,
1331
+ * 在浅底上读出来就是几根错位的线(实测就是这个形状)。柱形那颗球是真元素,照旧给它。
1332
+ */
1333
+ html[data-zy-theme='solid'] .zy-loading-dot::before,
1334
+ html[data-zy-theme='solid'] .zy-loading-ball {
1335
+ box-shadow: 0 1px 0 rgba(15, 23, 42, 0.28);
1336
+ }
1337
+
1338
+ html[data-zy-theme='solid'] .zy-loading-bar {
1339
+ /* 柱形加载条在基础主题里是方头(组件没给圆角),这里同样不加 */
1340
+ box-shadow:
1341
+ inset 0 1px 0 rgba(255, 255, 255, 0.35),
1342
+ inset 0 -1px 0 rgba(0, 0, 0, 0.18);
1343
+ }
1344
+
1345
+ /* ============================================================
1346
+ * 21 · 时间选择器 —— 触发框同槽,弹层是抬起的板(4px),三列滚动区是槽,选中项是一枚上色小键
1347
+ * (主题层按将来 ZyTimePicker 的根类名 `.zy-time-picker` 写,封装前后的规则不用改)
1348
+ * ============================================================ */
1349
+
1350
+ /*
1351
+ * 触发框:单日是一层 `el-input__wrapper`;时间范围把 wrapper 直接穿在自己身上
1352
+ * (`.zy-time-picker.el-input__wrapper.el-range-editor`),所以两条都要写。
1353
+ */
1354
+ html[data-zy-theme='solid'] .zy-time-picker .el-input__wrapper,
1355
+ html[data-zy-theme='solid'] .zy-time-picker.el-input__wrapper {
1356
+ border: 0;
1357
+ border-radius: var(--zy-radius);
1358
+ background-color: var(--zy-slot-face);
1359
+ box-shadow: var(--zy-slot-shadow);
1360
+ }
1361
+
1362
+ html[data-zy-theme='solid'] .zy-time-picker .el-input__wrapper.is-focus,
1363
+ html[data-zy-theme='solid'] .zy-time-picker.el-input__wrapper.is-active,
1364
+ html[data-zy-theme='solid'] .zy-time-picker.el-input__wrapper.is-focus {
1365
+ border-color: transparent;
1366
+ box-shadow:
1367
+ var(--zy-slot-shadow),
1368
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
1369
+ }
1370
+
1371
+ /* 弹层:与下拉面板同一档(抬起 4px)。单日走 `.el-time-panel`,范围走 `.el-time-range-picker` */
1372
+ html[data-zy-theme='solid'] .el-time-panel,
1373
+ html[data-zy-theme='solid'] .el-time-range-picker {
1374
+ border: 0;
1375
+ border-radius: var(--zy-radius);
1376
+ background: var(--zy-key-face);
1377
+ box-shadow:
1378
+ inset 0 1px 0 var(--zy-key-edge),
1379
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
1380
+ 0 16px 28px rgba(15, 23, 42, 0.16);
1381
+ }
1382
+
1383
+ /*
1384
+ * 三列滚动区:**不加凹槽**,直接铺在板面上 —— 与 13 日期选择器的日格一致:
1385
+ * 平坦的内容直接落在白色板上,只有「选中的那一格」才是凸起的小键。
1386
+ * (早先这里给每列套了槽面 + 内阴影,三列连起来像一块嵌进去的深色块,和日期面板不是一套读法。)
1387
+ */
1388
+
1389
+ /*
1390
+ * 滚动区离板边留 6px:白色板面要像日期 / 下拉面板那样在内容**四周露出来**一圈,
1391
+ * 不然三列槽会顶到板的圆角上,读起来就不是「一块抬起的板里装着三个槽」。
1392
+ * 页脚不吃这条 —— 它要通铺到板底,那才是这块板的底座边。
1393
+ */
1394
+ html[data-zy-theme='solid'] .el-time-panel .el-time-panel__content,
1395
+ html[data-zy-theme='solid'] .el-time-range-picker .el-time-range-picker__body {
1396
+ margin: 6px;
1397
+ }
1398
+
1399
+ /* 选中项:一枚上色小键;悬停项只提亮一档 */
1400
+ html[data-zy-theme='solid'] .el-time-panel .el-time-spinner__item.is-active,
1401
+ html[data-zy-theme='solid'] .el-time-range-picker .el-time-spinner__item.is-active {
1402
+ border-radius: var(--zy-radius-sm);
1403
+ background: var(--zy-brand);
1404
+ color: #fff;
1405
+ box-shadow:
1406
+ inset 0 1px 0 rgba(255, 255, 255, 0.35),
1407
+ 0 2px 0 color-mix(in srgb, var(--zy-brand) 78%, #000);
1408
+ }
1409
+
1410
+ @media (hover: hover) and (pointer: fine) {
1411
+ html[data-zy-theme='solid'] .el-time-panel .el-time-spinner__item:hover:not(.is-disabled):not(.is-active),
1412
+ html[data-zy-theme='solid'] .el-time-range-picker .el-time-spinner__item:hover:not(.is-disabled):not(.is-active) {
1413
+ background: var(--zy-key-face);
1414
+ border-radius: var(--zy-radius-sm);
1415
+ box-shadow:
1416
+ inset 0 1px 0 var(--zy-key-edge),
1417
+ 0 2px 0 var(--zy-key-base);
1418
+ }
1419
+ }
1420
+
1421
+ /* 范围弹层的两栏表头(Start / End)与中间那道分隔线 */
1422
+ html[data-zy-theme='solid'] .el-time-range-picker__header {
1423
+ color: var(--zy-muted);
1424
+ font-weight: 600;
1425
+ letter-spacing: 0.02em;
1426
+ }
1427
+
1428
+ html[data-zy-theme='solid'] .el-time-range-picker__cell + .el-time-range-picker__cell {
1429
+ border-left: 1px solid var(--zy-slot-line);
1430
+ }
1431
+
1432
+ /* 页脚:与对话框页脚同一处理(槽面 + 顶刻痕)—— 单日 / 范围共用同一个类名 */
1433
+ html[data-zy-theme='solid'] .el-time-panel__footer {
1434
+ border-top: 0;
1435
+ background: var(--zy-slot-face);
1436
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
1437
+ }
1438
+
1439
+ /* ============================================================
1440
+ * 22 · 分页器 —— 一排**小正方形键**,键间留缝:
1441
+ * 未选 = 默认键(中性键帽:白面 + 底下一层挤出边),选中 = 主色键(品牌面 + 深一档底座)。
1442
+ * 与按钮同一套材质语言,只是尺寸收到 28px;跳页输入框是槽。
1443
+ * ============================================================ */
1444
+
1445
+ html[data-zy-theme='solid'] .zy-pagination {
1446
+ /* EP 自己的底色/圆角都让开,改由下面这颗键统一给 */
1447
+ --el-pagination-button-bg-color: transparent;
1448
+ --el-pagination-bg-color: transparent;
1449
+ --el-pagination-button-disabled-bg-color: var(--zy-key-face);
1450
+ --el-pagination-hover-color: var(--zy-brand);
1451
+ --el-pagination-button-width: 28px;
1452
+ --el-pagination-button-height: 28px;
1453
+ --el-pagination-button-width-small: 24px;
1454
+ --el-pagination-button-height-small: 24px;
1455
+ --el-pagination-item-gap: 12px;
1456
+ font-family: var(--zy-font-sans);
1457
+ color: var(--zy-ink);
1458
+ }
1459
+
1460
+ html[data-zy-theme='solid'] .zy-pagination .el-pager li,
1461
+ html[data-zy-theme='solid'] .zy-pagination button.btn-prev,
1462
+ html[data-zy-theme='solid'] .zy-pagination button.btn-next {
1463
+ /*
1464
+ * 与按钮同一套键帽图层:两侧 10% 白弧(左下 / 右上)+ 底部渐层高光 ——
1465
+ * 尺寸按这一格自己的高度算,所以选中那格换底色时,四个角该亮的还是亮的。
1466
+ */
1467
+ --zy-key-h: var(--el-pagination-button-width);
1468
+ /* 键帽高度取三档里的「小」(2px):分页键是 28px 的小方键,与标签 / 复选框同一档 */
1469
+ --zy-key-lift-now: var(--zy-key-lift-sm);
1470
+ /* 正方形,一格一颗;`margin` 就是键与键之间的缝 */
1471
+ width: var(--el-pagination-button-width);
1472
+ min-width: var(--el-pagination-button-width);
1473
+ height: var(--el-pagination-button-height);
1474
+ margin: 0 5px;
1475
+ padding: 0;
1476
+ border-radius: var(--zy-radius-sm);
1477
+ background-color: var(--zy-key-face);
1478
+ background-image: var(--zy-key-stack);
1479
+ background-repeat: no-repeat;
1480
+ background-position: var(--zy-key-stack-pos);
1481
+ background-size: var(--zy-key-stack-size);
1482
+ color: var(--zy-ink);
1483
+ font-weight: var(--zy-weight-control);
1484
+ box-shadow:
1485
+ inset 0 1px 0 var(--zy-key-edge),
1486
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base),
1487
+ 0 4px 8px rgba(15, 23, 42, 0.1);
1488
+ transition:
1489
+ background-color var(--zy-duration-press) var(--zy-ease-soft),
1490
+ transform 120ms var(--zy-ease-out),
1491
+ box-shadow 120ms var(--zy-ease-out);
1492
+ }
1493
+
1494
+ html[data-zy-theme='solid'] .zy-pagination .el-pager li.is-active {
1495
+ background-color: var(--zy-brand);
1496
+ color: #fff;
1497
+ box-shadow:
1498
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
1499
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 82%, #000);
1500
+ }
1501
+
1502
+ /* 省略号(…)不按键做:只是两个可点的文字,别在整排里多出两块塑料 */
1503
+ html[data-zy-theme='solid'] .zy-pagination .el-pager li.more {
1504
+ background-color: transparent;
1505
+ background-image: none;
1506
+ color: var(--zy-muted);
1507
+ box-shadow: none;
1508
+ transform: none;
1509
+ }
1510
+
1511
+ /* 悬停:与默认键同一约定 —— 材质不动,只把字色提到品牌色(EP 自带那一条) */
1512
+
1513
+ /*
1514
+ * 按下:与其它键同一手感(沉进底座、影收平)。
1515
+ * 翻页按钮要排掉禁用态 —— 实测 Chrome 里**禁用的 <button> 依然匹配 :active**,
1516
+ * 不排掉的话,停在第一页 / 最后一页时那颗灰键一按还会沉下去。
1517
+ */
1518
+ html[data-zy-theme='solid'] .zy-pagination .el-pager li:active,
1519
+ html[data-zy-theme='solid'] .zy-pagination button.btn-prev:not(:disabled):active,
1520
+ html[data-zy-theme='solid'] .zy-pagination button.btn-next:not(:disabled):active {
1521
+ transform: translateY(var(--zy-key-lift-sm));
1522
+ box-shadow: 0 0 0 var(--zy-key-base);
1523
+ }
1524
+
1525
+ /* 禁用:键形还在、整颗压淡(与按钮的禁用同一档) */
1526
+ html[data-zy-theme='solid'] .zy-pagination .btn-prev:disabled,
1527
+ html[data-zy-theme='solid'] .zy-pagination .btn-next:disabled {
1528
+ color: var(--zy-placeholder);
1529
+ opacity: 0.55;
1530
+ box-shadow:
1531
+ inset 0 1px 0 var(--zy-key-edge),
1532
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base);
1533
+ }
1534
+
1535
+ /* 上下页里的箭头放大一档,跟方键的视觉重量对齐 */
1536
+ html[data-zy-theme='solid'] .zy-pagination .btn-prev .el-icon,
1537
+ html[data-zy-theme='solid'] .zy-pagination .btn-next .el-icon {
1538
+ font-size: 13px;
1539
+ }
1540
+
1541
+ /* 跳页输入框:与输入框同槽 */
1542
+ html[data-zy-theme='solid'] .zy-pagination .el-input__wrapper {
1543
+ border: 0;
1544
+ border-radius: var(--zy-radius-sm);
1545
+ background-color: var(--zy-slot-face);
1546
+ box-shadow: var(--zy-slot-shadow-sm);
1547
+ }
1548
+
1549
+ html[data-zy-theme='solid'] .zy-pagination .el-input__wrapper.is-focus {
1550
+ box-shadow:
1551
+ var(--zy-slot-shadow-sm),
1552
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
1553
+ }
1554
+
1555
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__total,
1556
+ html[data-zy-theme='solid'] .zy-pagination .el-pagination__jump {
1557
+ color: var(--zy-muted);
1558
+ }
1559
+
1560
+ /* ============================================================
1561
+ * 04 · 滑块拼图验证(实色键帽,方案稿):一块槽 + 两枚键
1562
+ * 验证区是槽(凹),缺口是槽里挖出来的暗腔;拼图块是主色键、手柄是中性白键,
1563
+ * 都按三档里的「小」取 2px 挤出底座;下面的轨道也是槽,走过的部分是上色的浅键。
1564
+ * ============================================================ */
1565
+
1566
+ /* 图片区:一块槽 */
1567
+ html[data-zy-theme='solid'] .zy-verify__scene {
1568
+ border-radius: var(--zy-radius);
1569
+ background-color: var(--zy-slot-face);
1570
+ box-shadow: var(--zy-slot-shadow);
1571
+ }
1572
+
1573
+ /*
1574
+ * 缺口 = 图片上挖出来的一块:半透明墨色剪影 + 槽口那道内阴影(图换了它也一直对)。
1575
+ * 顶上那半圆只给同样的色,别加内阴影 —— 挖出来的腔在圆头那一小块上没有上沿。
1576
+ */
1577
+ html[data-zy-theme='solid'] .zy-verify__gap {
1578
+ border-radius: var(--zy-radius-sm);
1579
+ background: color-mix(in srgb, var(--zy-ink) 60%, transparent);
1580
+ box-shadow:
1581
+ inset 0 2px 4px rgba(15, 23, 42, 0.34),
1582
+ inset 0 -1px 0 rgba(255, 255, 255, 0.22);
1583
+ }
1584
+
1585
+ html[data-zy-theme='solid'] .zy-verify__gap::after {
1586
+ background: color-mix(in srgb, var(--zy-ink) 60%, transparent);
1587
+ }
1588
+
1589
+ /* 拼图块:主色键帽(面 + 顶亮边 + 小档 2px 底座 + 两侧 10% 白弧 + 底部渐层高光) */
1590
+ html[data-zy-theme='solid'] .zy-verify__piece {
1591
+ --zy-key-h: 42px;
1592
+ --zy-key-lift-now: var(--zy-key-lift-sm);
1593
+ border-radius: var(--zy-radius-sm);
1594
+ background-color: var(--zy-brand);
1595
+ background-image: var(--zy-key-stack);
1596
+ background-repeat: no-repeat;
1597
+ background-position: var(--zy-key-stack-pos);
1598
+ background-size: var(--zy-key-stack-size);
1599
+ color: #fff;
1600
+ box-shadow:
1601
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
1602
+ 0 var(--zy-key-lift-sm) 0 color-mix(in srgb, var(--zy-brand) 82%, #000),
1603
+ 0 4px 8px rgba(15, 23, 42, 0.16);
1604
+ transition:
1605
+ box-shadow 160ms var(--zy-ease-out),
1606
+ background-color 160ms var(--zy-ease-out);
1607
+ }
1608
+
1609
+ /* 顶上那颗圆头同面同亮边,和方块连成一块拼图 */
1610
+ html[data-zy-theme='solid'] .zy-verify__piece::after {
1611
+ background-color: var(--zy-brand);
1612
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3);
1613
+ }
1614
+
1615
+ /* 底部轨道:也是槽;走过的部分是上色的浅键(不给厚度,读成「进度铺过去」) */
1616
+ html[data-zy-theme='solid'] .zy-verify__track {
1617
+ border-radius: var(--zy-radius);
1618
+ background-color: var(--zy-slot-face);
1619
+ box-shadow: var(--zy-slot-shadow-sm);
1620
+ color: var(--zy-muted);
1621
+ }
1622
+
1623
+ html[data-zy-theme='solid'] .zy-verify__fill {
1624
+ background: color-mix(in srgb, var(--zy-brand) 22%, var(--zy-slot-face));
1625
+ }
1626
+
1627
+ /* 手柄:中性白键(与默认按钮、分页键同一套材质,尺寸收到 40×36) */
1628
+ html[data-zy-theme='solid'] .zy-verify__handle {
1629
+ /* 键帽几何跟着手柄的高度走:38 + 底座 2 = 40,正好贴满轨道上下(见 board.css 里那段说明) */
1630
+ --zy-key-h: 38px;
1631
+ --zy-key-lift-now: var(--zy-key-lift-sm);
1632
+ border-radius: var(--zy-radius-sm);
1633
+ background-color: var(--zy-key-face);
1634
+ background-image: var(--zy-key-stack);
1635
+ background-repeat: no-repeat;
1636
+ background-position: var(--zy-key-stack-pos);
1637
+ background-size: var(--zy-key-stack-size);
1638
+ color: var(--zy-brand);
1639
+ box-shadow:
1640
+ inset 0 1px 0 var(--zy-key-edge),
1641
+ /* 底座取深一档:手柄是**贴在槽里**的一颗键,底下的那 2px 得读得出来 ——
1642
+ 用常规 `--zy-key-base` 会和槽面糊成一片,看着像上下留了缝 */
1643
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base-strong),
1644
+ 0 2px 4px rgba(15, 23, 42, 0.1);
1645
+ transition:
1646
+ box-shadow 140ms var(--zy-ease-out),
1647
+ background-color 140ms var(--zy-ease-out);
1648
+ }
1649
+
1650
+ html[data-zy-theme='solid'] .zy-verify__refresh {
1651
+ color: var(--zy-muted);
1652
+ }
1653
+
1654
+ @media (hover: hover) and (pointer: fine) {
1655
+ html[data-zy-theme='solid'] .zy-verify__refresh:hover {
1656
+ color: var(--zy-brand);
1657
+ }
1658
+ }
1659
+
1660
+ /* 拖动中:整块抬起来一点(落地影拉开),松手落回 */
1661
+ html[data-zy-theme='solid'] .zy-verify.is-dragging .zy-verify__piece,
1662
+ html[data-zy-theme='solid'] .zy-verify.is-dragging .zy-verify__handle {
1663
+ box-shadow:
1664
+ inset 0 1px 0 var(--zy-key-edge),
1665
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base-strong),
1666
+ 0 6px 12px rgba(15, 23, 42, 0.18);
1667
+ }
1668
+
1669
+ /* 通过:缺口合上(描边转主色)、拼图块沉进槽里(底座收平)、提示转主色 */
1670
+ html[data-zy-theme='solid'] .zy-verify.is-pass .zy-verify__gap {
1671
+ box-shadow:
1672
+ inset 0 2px 4px rgba(15, 23, 42, 0.34),
1673
+ 0 0 0 2px color-mix(in srgb, var(--zy-brand) 45%, transparent);
1674
+ }
1675
+
1676
+ html[data-zy-theme='solid'] .zy-verify.is-pass .zy-verify__piece {
1677
+ box-shadow:
1678
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
1679
+ 0 0 0 color-mix(in srgb, var(--zy-brand) 82%, #000),
1680
+ 0 2px 6px rgba(15, 23, 42, 0.16);
1681
+ }
1682
+
1683
+ html[data-zy-theme='solid'] .zy-verify.is-pass .zy-verify__track {
1684
+ color: var(--zy-brand);
1685
+ }
1686
+
1687
+ /* 没对准:轨道与提示转珊瑚红(danger),手柄也转红 */
1688
+ html[data-zy-theme='solid'] .zy-verify.is-fail .zy-verify__track {
1689
+ color: var(--zy-danger);
1690
+ }
1691
+
1692
+ html[data-zy-theme='solid'] .zy-verify.is-fail .zy-verify__handle {
1693
+ color: var(--zy-danger);
1694
+ box-shadow:
1695
+ /*
1696
+ * 红圈取 **inset**:① 写在最前面,不会被手柄那 2px 实心底座盖住 —— 早先写成外圈又排在
1697
+ * 底座后面,表现就是「左 / 上 / 右 都有红边,唯独底部没有」;② 外圈在 0% / 100% 两端会探出
1698
+ * 轨道外面,inset 永远在键自己身上,四边齐、也不越界。
1699
+ */
1700
+ inset 0 0 0 2px color-mix(in srgb, var(--zy-danger) 55%, transparent),
1701
+ inset 0 1px 0 var(--zy-key-edge),
1702
+ 0 var(--zy-key-lift-sm) 0 var(--zy-key-base-strong);
1703
+ }
1704
+
1705
+ /* ============================================================
1706
+ * 23 · 通用容器 —— 一块**抬起的板**:白面 + 顶亮边 + 默认档 4px 挤出底座 + 落地影;
1707
+ * 有标题时标题栏白、正文那档浅灰;**无标题时通体白面**。
1708
+ * 与对话框 / 下拉面板同一套材质,只是厚度按「容器」这一档。
1709
+ * (结构与版面在 board.css)
1710
+ * ============================================================ */
1711
+
1712
+ html[data-zy-theme='solid'] .zy-panel {
1713
+ /*
1714
+ * 1px **透明**边(不是描边):和规格卡同一条做法 —— 卡片也是靠这 1px 透明边
1715
+ * 让底下的白面透出来,正文那层灰因此自带一圈 1px 白边。这里照抄,边界读法才一致。
1716
+ * (盒子是 border-box,外面尺寸不变)
1717
+ */
1718
+ border: 1px solid transparent;
1719
+ border-radius: var(--zy-radius);
1720
+ background: var(--zy-key-face);
1721
+ box-shadow:
1722
+ inset 0 1px 0 var(--zy-key-edge),
1723
+ 0 var(--zy-key-lift) 0 var(--zy-key-base),
1724
+ 0 12px 26px rgba(15, 23, 42, 0.12);
1725
+ }
1726
+
1727
+ html[data-zy-theme='solid'] .zy-panel__head {
1728
+ /*
1729
+ * 标题栏与容器**同面**(白),分隔那条带子**照规格卡抄**:
1730
+ * 卡片是 [2px 槽线] + [1px 透明边 → 白面透出来] 之后才接正文,这里逐字节相同。
1731
+ * (早先只画了 1px 槽线,所以两处的过渡带对不上)
1732
+ */
1733
+ background: var(--zy-key-face);
1734
+ border-bottom: 1px solid transparent;
1735
+ box-shadow: inset 0 -2px 0 var(--zy-slot-line);
1736
+ }
1737
+
1738
+ /*
1739
+ * 正文区取的是**卡片内容区那档浅灰**(与展示板的 .spec-stage 同一个配方):
1740
+ * 标题栏白、内容区浅灰 —— 容器和卡片是同一套读法。
1741
+ * 只对有标题的容器生效:`:has(.zy-panel__head)` 就是「有标题」那个条件,
1742
+ * 无标题的容器没有这一段,通体白面。
1743
+ */
1744
+ html[data-zy-theme='solid'] .zy-panel:has(.zy-panel__head) > .zy-panel__body {
1745
+ background: var(--zy-panel-body-bg);
1746
+ }
1747
+
1748
+ /* ============================================================
1749
+ * 无障碍:实色主题的按压、回弹、滑行和辉光都必须尊重 reduced-motion。
1750
+ * 组件自身的 reduced-motion 规则保留;这里兜住主题层新增的过渡与动画。
1751
+ * ============================================================ */
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
+
2143
+ @media (prefers-reduced-motion: reduce) {
2144
+ html[data-zy-theme='solid']
2145
+ :is(
2146
+ .zy-btn,
2147
+ .zy-btn-fill-clr,
2148
+ .zy-card,
2149
+ .zy-card-fill-clr,
2150
+ .zy-check .el-checkbox__inner,
2151
+ .zy-radio .el-radio__inner,
2152
+ .zy-radio .el-radio__input.is-checked::before,
2153
+ .zy-radio .el-radio__input.is-checked::after,
2154
+ .zy-pagination .el-pager li,
2155
+ .zy-pagination button.btn-prev,
2156
+ .zy-pagination button.btn-next,
2157
+ .zy-select .el-select__wrapper,
2158
+ .zy-input .el-input__wrapper,
2159
+ .zy-tree .el-tree-node__content,
2160
+ .zy-mega-menu__trigger,
2161
+ .zy-mega-menu__panel,
2162
+ .zy-mega-menu__glide,
2163
+ .zy-verify__piece,
2164
+ .zy-verify__handle
2165
+ ) {
2166
+ animation: none !important;
2167
+ transition: none !important;
2168
+ }
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
+ }