lumiglass 0.0.0-stage → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2228 @@
1
+ /* ============================================================
2
+ Lumi Glass · Core v1.2
3
+ ------------------------------------------------------------
4
+ 纯 CSS,无依赖。通用层:Token、玻璃基类、按钮、表单、
5
+ 控件、反馈。手机端 / 网页端专属组件分别在
6
+ glass-mobile.css 与 glass-web.css 中。
7
+
8
+ 目录
9
+ 01 Token 与主题
10
+ 02 Reset 与排版
11
+ 03 玻璃基类(regular / thin / clear)
12
+ 04 按钮
13
+ 05 表单输入
14
+ 06 控件
15
+ 07 反馈
16
+ 08 无障碍、降级与打印
17
+ ============================================================ */
18
+
19
+ /* ============================================================
20
+ 01 Token 与主题
21
+ ---- 改主题只改这一段;其余文件不出现硬编码主色 ----
22
+ ============================================================ */
23
+ :root {
24
+ --lg-rainbow-track: linear-gradient(90deg, #3a7cf6, #4cd964, #ffd60a, #ff9f0a, #ff375f, #bf5af2);
25
+ --lg-rainbow-fill: var(--lg-rainbow-track);
26
+ color-scheme: light;
27
+
28
+ /* 文本 */
29
+ --lg-ink: #1d1d1f;
30
+ --lg-ink-2: #6e6e73;
31
+ --lg-ink-3: #a1a1a6;
32
+ --lg-line: #e8e8ed;
33
+ --lg-page: #ffffff;
34
+
35
+ /* 品牌 / 语义色(HIG 系统色) */
36
+ --lg-blue: #0a84ff;
37
+ --lg-blue-deep: #0060df;
38
+ --lg-green: #34c759;
39
+ --lg-red: #ff3b30;
40
+ --lg-orange: #ff9f0a;
41
+ --lg-purple: #bf5af2;
42
+ --lg-yellow: #ffd60a;
43
+
44
+ /* 玻璃材质(blur 越低折射越明显;四档数值对齐行业基准) */
45
+ --lg-blur: 16px;
46
+ --lg-sat: 180%;
47
+ --lg-wash: rgba(255, 255, 255, .42); /* regular 身体:42% 白 */
48
+ --lg-rim-hi: rgba(255, 255, 255, .80); /* 边框光带:对角亮角 */
49
+ --lg-rim-lo: rgba(255, 255, 255, .18); /* 边框光带:中段暗边 */
50
+ --lg-highlight: rgba(255, 255, 255, .60); /* 顶缘高光线 */
51
+ --lg-drop: rgba(15, 23, 42, .14); /* 外投影 */
52
+ --lg-fill-1: rgba(255, 255, 255, .46); /* 兼容旧 Token */
53
+ --lg-fill-2: rgba(255, 255, 255, .14);
54
+ --lg-stroke: rgba(255, 255, 255, .72);
55
+ --lg-sheen: rgba(255, 255, 255, 1);
56
+ --lg-inner-shade: rgba(22, 28, 45, .30);
57
+
58
+ /* 圆角阶梯 */
59
+ --lg-radius-lg: 28px;
60
+ --lg-radius: 24px;
61
+ --lg-radius-md: 18px;
62
+ --lg-radius-sm: 14px;
63
+ --lg-radius-xs: 10px;
64
+
65
+ /* 阴影 */
66
+ --lg-shadow: 0 1px 2px rgba(0, 0, 0, .05), 0 16px 34px -16px var(--lg-inner-shade);
67
+ --lg-shadow-lift: 0 1px 2px rgba(0, 0, 0, .06), 0 26px 52px -22px var(--lg-inner-shade);
68
+
69
+ /* 动效 */
70
+ --lg-ease-spring: cubic-bezier(.34, 1.7, .64, 1);
71
+ --lg-ease-out: cubic-bezier(.22, .61, .36, 1);
72
+ --lg-dur: .35s;
73
+
74
+ /* 命中区:手机 44,桌面 32 */
75
+ --lg-hit: 44px;
76
+
77
+ /* 层级 */
78
+ --lg-z-sticky: 100;
79
+ --lg-z-toast: 300;
80
+ --lg-z-dialog: 400;
81
+ }
82
+
83
+ /* 暗色:只覆盖 Token,玻璃规则自动跟随 */
84
+ [data-theme="dark"] {
85
+ color-scheme: dark;
86
+ --lg-ink: #f5f5f7;
87
+ --lg-ink-2: #a1a1a6;
88
+ --lg-ink-3: #6e6e73;
89
+ --lg-line: rgba(255, 255, 255, .12);
90
+ --lg-page: #0b0d12;
91
+
92
+ --lg-wash: rgba(255, 255, 255, .07); /* 暗色 regular:7% 白薄身体(石墨只给 tinted/overlay) */
93
+ --lg-rim-hi: rgba(255, 255, 255, .34);
94
+ --lg-rim-lo: rgba(255, 255, 255, .06);
95
+ --lg-highlight: rgba(255, 255, 255, .16);
96
+ --lg-drop: rgba(0, 0, 0, .45);
97
+ --lg-fill-1: rgba(255, 255, 255, .09);
98
+ --lg-fill-2: rgba(255, 255, 255, .02);
99
+ --lg-stroke: rgba(255, 255, 255, .15);
100
+ --lg-sheen: rgba(255, 255, 255, .52);
101
+ --lg-inner-shade: rgba(0, 0, 0, .72);
102
+ }
103
+
104
+ /* 跟随系统(页面未显式指定 data-theme 时生效) */
105
+ @media (prefers-color-scheme: dark) {
106
+ :root:not([data-theme="light"]) {
107
+ color-scheme: dark;
108
+ --lg-ink: #f5f5f7;
109
+ --lg-ink-2: #a1a1a6;
110
+ --lg-ink-3: #6e6e73;
111
+ --lg-line: rgba(255, 255, 255, .12);
112
+ --lg-page: #0b0d12;
113
+ --lg-wash: rgba(255, 255, 255, .07);
114
+ --lg-rim-hi: rgba(255, 255, 255, .34);
115
+ --lg-rim-lo: rgba(255, 255, 255, .06);
116
+ --lg-highlight: rgba(255, 255, 255, .16);
117
+ --lg-drop: rgba(0, 0, 0, .45);
118
+ --lg-fill-1: rgba(255, 255, 255, .11);
119
+ --lg-fill-2: rgba(255, 255, 255, .03);
120
+ --lg-stroke: rgba(255, 255, 255, .15);
121
+ --lg-sheen: rgba(255, 255, 255, .52);
122
+ --lg-inner-shade: rgba(0, 0, 0, .72);
123
+ }
124
+ }
125
+
126
+ /* ============================================================
127
+ 02 Reset 与排版
128
+ ============================================================ */
129
+ *,
130
+ *::before,
131
+ *::after { margin: 0; padding: 0; box-sizing: border-box; }
132
+
133
+ html { -webkit-text-size-adjust: 100%; }
134
+
135
+ body {
136
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text",
137
+ "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif;
138
+ font-size: 15px;
139
+ line-height: 1.5;
140
+ color: var(--lg-ink);
141
+ background: var(--lg-page);
142
+ -webkit-font-smoothing: antialiased;
143
+ -moz-osx-font-smoothing: grayscale;
144
+ }
145
+
146
+ /* 壁纸层是 z-index:-1 的 body 子元素。只要 body 有不透明背景,它就会被
147
+ 整块盖住 —— 之前所有页面的壁纸其实从没显示过,用户看到的是一块死的纯色,
148
+ 玻璃压上去什么都折射不出来。canvas 一旦挂上就让 body 让位,底色交给 html。 */
149
+ html:has(body > .glass-wallpaper) { background: var(--lg-page); }
150
+ body:has(> .glass-wallpaper) { background: transparent !important; }
151
+
152
+ /* ---------- 动态壁纸 canvas(body[data-wallpaper] 时由 glass.js 挂载)----------
153
+ 全屏固定,z 压在页面内容之下;半分辨率渲染,样式拉伸铺满。
154
+ 页面要启用:1) 引 glass.js 2) <body data-wallpaper="lumi">
155
+ 预设:lumi / sonoma / tahoe / graphite,切换用
156
+ LiquidGlass.setWallpaper('aurora') 这类名字。 */
157
+ .glass-wallpaper {
158
+ position: fixed;
159
+ inset: 0;
160
+ z-index: -1;
161
+ width: 100vw;
162
+ height: 100vh;
163
+ pointer-events: none;
164
+ }
165
+
166
+ h1, h2, h3, h4 { font-weight: 750; letter-spacing: -.02em; line-height: 1.15; }
167
+ h1 { font-size: 40px; letter-spacing: -.04em; }
168
+ h2 { font-size: 27px; letter-spacing: -.025em; }
169
+ h3 { font-size: 20px; }
170
+ h4 { font-size: 16px; }
171
+ p { line-height: 1.6; }
172
+ a { color: var(--lg-blue); text-underline-offset: 2px; }
173
+ code, kbd, samp, pre {
174
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
175
+ font-size: .92em;
176
+ }
177
+ img, svg { display: block; max-width: 100%; }
178
+ button, input, select, textarea { font: inherit; color: inherit; }
179
+ ::selection { background: rgba(10, 132, 255, .22); }
180
+
181
+ /* 小工具类:布局用,不参与组件样式 */
182
+ .lg-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
183
+ .lg-col { display: flex; flex-direction: column; gap: 12px; }
184
+ .lg-grow { flex: 1; min-width: 0; }
185
+ .lg-muted { color: var(--lg-ink-2); }
186
+ .lg-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
187
+ .lg-sr-only {
188
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
189
+ overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
190
+ }
191
+
192
+ /* ============================================================
193
+ 03 玻璃基类
194
+ ------------------------------------------------------------
195
+ 三层配方:
196
+ ① backdrop-filter 磨砂 + 提饱和
197
+ ② (可选)SVG 位移滤镜做边缘折射,需 glass.js 注入 #lg-lens
198
+ ③ 描边 + inset 镜面高光 + 外投影 = 厚度与悬浮感
199
+ ============================================================ */
200
+ .glass {
201
+ position: relative;
202
+ isolation: auto;
203
+ border: 1px solid transparent;
204
+ /* 双层背景:填充层裁进内容盒,边框层是一圈「角亮中暗」的对角光带——光从左上穿入、右下穿出 */
205
+ background:
206
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
207
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
208
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
209
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
210
+ box-shadow:
211
+ inset 0 1px 0 var(--lg-highlight),
212
+ 0 1px 2px var(--lg-drop),
213
+ 0 12px 32px -14px var(--lg-drop);
214
+ transition:
215
+ transform var(--lg-dur) var(--lg-ease-spring),
216
+ box-shadow var(--lg-dur) var(--lg-ease-out);
217
+ }
218
+
219
+ /* JS 按压弹簧接管期间:关掉 CSS 的 :active 缩放,避免两套缩放相乘 */
220
+ .lg-springing {
221
+ transform: none !important;
222
+ transition: none !important;
223
+ }
224
+ html.lg-on .slider .thumb.lg-springing,
225
+ html.lg-on .lg-slider .thumb.lg-springing {
226
+ transform: translateY(-50%) !important;
227
+ transition: left .08s linear !important;
228
+ }
229
+
230
+ /* 透镜层:glass.js 把玻璃背后的壁纸抓一份、只留最外一圈、施加位移滤镜后
231
+ 贴回盒内。注意 —— 不能用 `backdrop-filter: url()`(Chromium / Safari 会
232
+ 整条丢弃),所以折射靠这一层「边缘」+ 真实 backdrop-filter 的「中心」拼。
233
+ 默认关闭(body[data-lens="on"] 才启用)。 */
234
+ .lg-lens,
235
+ .glass > .lg-lens { /* 压过 .glass > * 的 relative / z-index:1 */
236
+ position: absolute;
237
+ inset: 0;
238
+ z-index: -1; /* 压在内容之下、盒子背景之上 */
239
+ display: block;
240
+ border-radius: inherit;
241
+ overflow: hidden;
242
+ pointer-events: none;
243
+ }
244
+ /* 与玻璃同样的白洗,但只盖外圈(和 canvas 掏空的渐变坡一致),
245
+ 中心依旧只有盒子自己那一层 wash —— 不然整块玻璃会白上加白 */
246
+ .lg-lens::after {
247
+ content: "";
248
+ position: absolute;
249
+ inset: 0;
250
+ border-radius: inherit;
251
+ --b: 26px;
252
+ background: var(--lg-wash);
253
+ -webkit-mask-image:
254
+ linear-gradient(to right, #000 0, transparent var(--b), transparent calc(100% - var(--b)), #000 100%),
255
+ linear-gradient(to bottom, #000 0, transparent var(--b), transparent calc(100% - var(--b)), #000 100%);
256
+ -webkit-mask-composite: source-in;
257
+ mask-image:
258
+ linear-gradient(to right, #000 0, transparent var(--b), transparent calc(100% - var(--b)), #000 100%),
259
+ linear-gradient(to bottom, #000 0, transparent var(--b), transparent calc(100% - var(--b)), #000 100%);
260
+ mask-composite: intersect;
261
+ pointer-events: none;
262
+ }
263
+ /* 边缘比中心「实」——镜片聚焦感就来自这里;位移图把背景向内压缩 */
264
+ .lg-lens-c {
265
+ display: block;
266
+ filter: blur(var(--lg-lens-blur, 7px)) saturate(var(--lg-sat)) url(#lg-lens);
267
+ will-change: filter;
268
+ }
269
+ @media (prefers-reduced-transparency: reduce) {
270
+ .lg-lens { display: none; }
271
+ }
272
+
273
+ /* thin:贴在内容卡上的轻量玻璃,遮挡更少 */
274
+ .glass.thin {
275
+ --lg-blur: 10px;
276
+ --lg-wash: rgba(255, 255, 255, .16);
277
+ --lg-highlight: rgba(255, 255, 255, .50);
278
+ box-shadow:
279
+ inset 0 1px 0 var(--lg-highlight),
280
+ 0 1px 2px var(--lg-drop);
281
+ }
282
+ [data-theme="dark"] .glass.thin {
283
+ --lg-wash: rgba(255, 255, 255, .05);
284
+ }
285
+
286
+ /* clear:照片 / 视频之上的透镜材质——身体 10% 白、blur 2px,
287
+ 折射全靠透镜滤镜(glass.js)与低模糊,加任何厚填充都会糊死折射 */
288
+ .glass.clear {
289
+ --lg-blur: 2px;
290
+ --lg-sat: 150%;
291
+ --lg-wash: rgba(255, 255, 255, .10);
292
+ }
293
+ [data-theme="dark"] .glass.clear {
294
+ --lg-wash: rgba(255, 255, 255, .04);
295
+ }
296
+
297
+ /* tinted:品牌色染色玻璃——55% 主色染进 30% 白身体,白字可读 */
298
+ .glass.tinted {
299
+ --lg-blur: 12px;
300
+ --lg-wash: rgba(10, 132, 255, .62); /* 不支持 color-mix 的回退 */
301
+ --lg-wash: color-mix(in oklab, var(--lg-blue) 55%, rgba(255, 255, 255, .30));
302
+ color: #fff;
303
+ }
304
+ [data-theme="dark"] .glass.tinted {
305
+ --lg-wash: color-mix(in oklab, var(--lg-blue) 55%, rgba(30, 32, 40, .55));
306
+ }
307
+
308
+ /* overlay:弹层专用——最厚身体 + 最深模糊,保证复杂内容可读 */
309
+ .glass.overlay {
310
+ --lg-blur: 24px;
311
+ --lg-wash: rgba(255, 255, 255, .72);
312
+ }
313
+ [data-theme="dark"] .glass.overlay {
314
+ --lg-wash: rgba(28, 30, 38, .74);
315
+ }
316
+
317
+ /* 悬停光效:只提亮边框光带——光贴在边框上,不进盒内(对齐参考站) */
318
+ .glass::after {
319
+ content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;
320
+ padding: 1.2px;
321
+ background: linear-gradient(135deg,
322
+ rgba(255, 255, 255, 1), rgba(255, 255, 255, .18) 38%, rgba(88, 100, 120, .32) 62%, rgba(255, 255, 255, .9)) border-box;
323
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
324
+ -webkit-mask-composite: xor;
325
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
326
+ mask-composite: exclude;
327
+ opacity: 0;
328
+ transition: opacity .35s ease-out;
329
+ }
330
+ .glass:hover::after { opacity: 1; }
331
+
332
+ /* 给玻璃内部内容建立层级,避免被 ::after 盖住 */
333
+ .glass > *:not(.lg-lens) { position: relative; z-index: 1; }
334
+
335
+ /* 玻璃作为按钮时的按下反馈:与 .btn 同一套果冻签名 */
336
+ .glass.pressable {
337
+ cursor: pointer;
338
+ transition: transform .45s var(--lg-ease-spring), background .2s;
339
+ }
340
+ .glass.pressable:active { transform: scale(1.04, .96); }
341
+
342
+ /* ============================================================
343
+ 04 按钮
344
+ ------------------------------------------------------------
345
+ .btn 默认玻璃按钮(regular)
346
+ .btn.primary 主操作:品牌色玻璃
347
+ .btn.tinted 次级主操作:薄染品牌色
348
+ .btn.danger 破坏性操作
349
+ .btn.ghost 极轻,放在玻璃面板内部时使用
350
+ .btn.sm / .btn.icon
351
+ .btn.loading 加载中(文案隐藏,旋转描边替换)
352
+ ============================================================ */
353
+ .btn {
354
+ position: relative;
355
+ display: inline-flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ gap: 8px;
359
+ height: 46px;
360
+ padding: 0 24px;
361
+ border-radius: 999px;
362
+ border: 1px solid transparent; /* 光带画在边框层,见下 */
363
+ font-size: 15px;
364
+ font-weight: 600;
365
+ line-height: 1;
366
+ color: var(--lg-ink);
367
+ white-space: nowrap;
368
+ cursor: pointer;
369
+ /* 与 .glass 同一套双层背景:填充裁进内容盒,边框是角亮中暗光带 */
370
+ background:
371
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
372
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
373
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
374
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
375
+ box-shadow:
376
+ inset 0 1px 0 var(--lg-highlight),
377
+ 0 1px 2px var(--lg-drop),
378
+ 0 8px 18px -8px var(--lg-inner-shade);
379
+ transition:
380
+ transform .45s var(--lg-ease-spring),
381
+ box-shadow .25s var(--lg-ease-out),
382
+ filter .25s;
383
+ -webkit-tap-highlight-color: transparent;
384
+ }
385
+ /* 对齐参考站:hover 静止,只有按压有戏份(.lg-control 同款) */
386
+ .btn:active { transform: scale(1.04, .96); filter: brightness(.97); }
387
+ .btn:disabled,
388
+ .btn[aria-disabled="true"] {
389
+ opacity: .45;
390
+ cursor: not-allowed;
391
+ transform: none;
392
+ filter: none;
393
+ }
394
+
395
+ .btn.sm { height: 36px; padding: 0 16px; font-size: 13.5px; border-radius: 999px; }
396
+ .btn.icon { width: 46px; padding: 0; font-size: 18px; }
397
+ .btn.icon.sm { width: 36px; font-size: 14px; }
398
+
399
+ .btn.primary {
400
+ color: #fff;
401
+ background:
402
+ linear-gradient(135deg, rgba(10, 132, 255, .92), rgba(0, 102, 220, .78)) padding-box,
403
+ linear-gradient(135deg, rgba(255, 255, 255, .78), rgba(255, 255, 255, .18) 35%, rgba(255, 255, 255, .18) 65%, rgba(255, 255, 255, .78)) border-box;
404
+ box-shadow:
405
+ inset 0 1px .5px rgba(255, 255, 255, .55),
406
+ 0 1px 2px rgba(0, 40, 120, .20),
407
+ 0 10px 22px -8px rgba(10, 110, 230, .70);
408
+ }
409
+ .btn.tinted {
410
+ color: var(--lg-blue-deep);
411
+ background:
412
+ linear-gradient(color-mix(in oklab, var(--lg-blue) 22%, rgba(255, 255, 255, .52)), color-mix(in oklab, var(--lg-blue) 14%, rgba(255, 255, 255, .42))) padding-box,
413
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
414
+ }
415
+ .btn.danger {
416
+ color: #fff;
417
+ background:
418
+ linear-gradient(135deg, rgba(255, 59, 48, .94), rgba(215, 40, 32, .80)) padding-box,
419
+ linear-gradient(135deg, rgba(255, 255, 255, .75), rgba(255, 255, 255, .18) 35%, rgba(255, 255, 255, .18) 65%, rgba(255, 255, 255, .75)) border-box;
420
+ box-shadow:
421
+ inset 0 1px .5px rgba(255, 255, 255, .5),
422
+ 0 10px 22px -8px rgba(220, 40, 30, .65);
423
+ }
424
+ .btn.ghost {
425
+ background:
426
+ linear-gradient(rgba(255, 255, 255, .24), rgba(255, 255, 255, .24)) padding-box,
427
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
428
+ box-shadow:
429
+ inset 0 1px 0 var(--lg-highlight),
430
+ 0 1px 2px var(--lg-drop);
431
+ }
432
+
433
+ [data-theme="dark"] .btn { box-shadow:
434
+ inset 0 1px 0 var(--lg-highlight),
435
+ 0 1px 2px var(--lg-drop),
436
+ 0 10px 22px -10px rgba(0, 0, 0, .8);
437
+ }
438
+ [data-theme="dark"] .btn.ghost {
439
+ background:
440
+ linear-gradient(rgba(255, 255, 255, .05), rgba(255, 255, 255, .05)) padding-box,
441
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
442
+ }
443
+ [data-theme="dark"] .btn.tinted {
444
+ color: #7ab8ff;
445
+ background:
446
+ linear-gradient(color-mix(in oklab, var(--lg-blue) 26%, rgba(255, 255, 255, .07)), color-mix(in oklab, var(--lg-blue) 16%, rgba(255, 255, 255, .04))) padding-box,
447
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
448
+ }
449
+
450
+ @keyframes lg-spin { to { transform: rotate(360deg); } }
451
+
452
+ .btn.loading { color: transparent !important; pointer-events: none; }
453
+ .btn.loading::before {
454
+ content: "";
455
+ position: absolute;
456
+ width: 16px;
457
+ height: 16px;
458
+ border-radius: 50%;
459
+ border: 2px solid rgba(255, 255, 255, .45);
460
+ border-top-color: #fff;
461
+ animation: lg-spin .75s linear infinite;
462
+ }
463
+ .btn.loading.light::before {
464
+ border-color: rgba(60, 60, 67, .22);
465
+ border-top-color: var(--lg-ink);
466
+ }
467
+
468
+ /* 分裂按钮:主操作 + 次级菜单合成一颗玻璃 */
469
+ .splitbtn {
470
+ display: inline-flex;
471
+ align-items: stretch;
472
+ border-radius: 999px;
473
+ overflow: hidden;
474
+ border: 1px solid transparent;
475
+ background:
476
+ linear-gradient(135deg, rgba(10, 132, 255, .88), rgba(0, 102, 220, .68)) padding-box,
477
+ linear-gradient(135deg, rgba(255, 255, 255, .78), rgba(255, 255, 255, .18) 35%, rgba(255, 255, 255, .18) 65%, rgba(255, 255, 255, .78)) border-box;
478
+ box-shadow:
479
+ inset 0 1.5px .5px -.5px rgba(255, 255, 255, .8),
480
+ 0 10px 22px -10px rgba(10, 110, 230, .7);
481
+ }
482
+ .splitbtn button {
483
+ height: 46px;
484
+ padding: 0 19px;
485
+ border: none;
486
+ background: transparent;
487
+ color: #fff;
488
+ font-size: 15px;
489
+ font-weight: 600;
490
+ cursor: pointer;
491
+ transition: background .2s;
492
+ }
493
+ .splitbtn button:hover { background: rgba(255, 255, 255, .16); }
494
+ .splitbtn .div { width: 1px; background: rgba(255, 255, 255, .34); }
495
+ .splitbtn .more { padding: 0 14px; font-size: 12px; }
496
+ .splitbtn.sm { border-radius: 999px; }
497
+ .splitbtn.sm button { height: 36px; padding: 0 14px; font-size: 13.5px; }
498
+ /* splitbtn 是 overflow:hidden 的复合体,光带由外框承担 */
499
+
500
+ /* 悬浮操作按钮 */
501
+ .fab {
502
+ width: 58px;
503
+ height: 58px;
504
+ display: grid;
505
+ place-items: center;
506
+ border-radius: 50%;
507
+ border: 1px solid transparent;
508
+ font-size: 26px;
509
+ font-weight: 300;
510
+ color: var(--lg-ink);
511
+ cursor: pointer;
512
+ background:
513
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
514
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
515
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
516
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
517
+ box-shadow:
518
+ inset 0 1px 0 var(--lg-highlight),
519
+ 0 1px 2px var(--lg-drop),
520
+ 0 16px 30px -12px var(--lg-inner-shade);
521
+ transition: transform .45s var(--lg-ease-spring);
522
+ }
523
+ .fab:hover { transform: scale(1.06); }
524
+ .fab:active { transform: scale(1.04, .96); }
525
+
526
+ /* ============================================================
527
+ 05 表单输入
528
+ ------------------------------------------------------------
529
+ 规则:外壳是玻璃,真正的 input 完全透明,只留文字与光标。
530
+ ============================================================ */
531
+ .field {
532
+ width: min(420px, 100%);
533
+ height: 48px;
534
+ padding: 0 16px;
535
+ border-radius: var(--lg-radius-sm);
536
+ border: 1px solid transparent;
537
+ outline: none;
538
+ font-size: 15px;
539
+ color: var(--lg-ink);
540
+ background:
541
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
542
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
543
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
544
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
545
+ box-shadow:
546
+ inset 0 1px 0 var(--lg-highlight),
547
+ 0 1px 2px var(--lg-drop);
548
+ transition: box-shadow .3s, border-color .3s, transform .3s var(--lg-ease-spring);
549
+ }
550
+ .field::placeholder { color: var(--lg-ink-3); }
551
+ /* 对齐参考站:聚焦整体微放大 + 3px 柔和聚焦环 */
552
+ .field:focus {
553
+ transform: scale(1.02);
554
+ border-color: var(--lg-blue);
555
+ box-shadow:
556
+ inset 0 1px 0 var(--lg-highlight),
557
+ 0 0 0 3px rgba(10, 132, 255, .3);
558
+ }
559
+ .field:disabled { opacity: .5; cursor: not-allowed; }
560
+ .field.ok { border-color: rgba(52, 199, 89, .85); box-shadow: 0 0 0 4px rgba(52, 199, 89, .18); }
561
+ .field.err { border-color: rgba(255, 59, 48, .8); box-shadow: 0 0 0 4px rgba(255, 59, 48, .16); }
562
+
563
+ .searchbar {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 10px;
567
+ width: min(420px, 100%);
568
+ height: 48px;
569
+ padding: 0 18px;
570
+ border-radius: 24px;
571
+ }
572
+ .searchbar .s-ico { flex: none; opacity: .45; }
573
+ .searchbar input {
574
+ flex: 1;
575
+ min-width: 0;
576
+ border: none;
577
+ outline: none;
578
+ background: transparent;
579
+ font-size: 15px;
580
+ color: var(--lg-ink);
581
+ }
582
+ .searchbar input::placeholder { color: var(--lg-ink-3); }
583
+ .searchbar .s-clear {
584
+ width: 22px;
585
+ height: 22px;
586
+ display: grid;
587
+ place-items: center;
588
+ border: none;
589
+ border-radius: 50%;
590
+ background: rgba(120, 120, 128, .22);
591
+ color: var(--lg-ink-2);
592
+ font-size: 11px;
593
+ cursor: pointer;
594
+ }
595
+
596
+ .selectbox { position: relative; width: min(340px, 100%); }
597
+ .selectbox select {
598
+ -webkit-appearance: none;
599
+ appearance: none;
600
+ width: 100%;
601
+ height: 48px;
602
+ padding: 0 40px 0 16px;
603
+ border-radius: var(--lg-radius-sm);
604
+ border: 1px solid transparent;
605
+ outline: none;
606
+ cursor: pointer;
607
+ font-size: 15px;
608
+ font-weight: 500;
609
+ color: var(--lg-ink);
610
+ background:
611
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
612
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
613
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
614
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
615
+ box-shadow:
616
+ inset 0 1px 0 var(--lg-highlight),
617
+ 0 1px 2px var(--lg-drop);
618
+ }
619
+ .selectbox select:focus { border-color: var(--lg-blue); box-shadow: 0 0 0 3px rgba(10, 132, 255, .3); }
620
+ .selectbox .caret {
621
+ position: absolute;
622
+ right: 15px;
623
+ top: 50%;
624
+ transform: translateY(-50%);
625
+ pointer-events: none;
626
+ font-size: 10px;
627
+ color: var(--lg-ink-2);
628
+ }
629
+ .ta {
630
+ width: 100%;
631
+ min-height: 88px;
632
+ padding: 13px 15px;
633
+ border-radius: var(--lg-radius-sm);
634
+ border: 1px solid transparent;
635
+ outline: none;
636
+ resize: vertical;
637
+ font-size: 15px;
638
+ line-height: 1.55;
639
+ color: var(--lg-ink);
640
+ background:
641
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
642
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
643
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
644
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
645
+ box-shadow:
646
+ inset 0 1px 0 var(--lg-highlight),
647
+ 0 1px 2px var(--lg-drop);
648
+ transition: box-shadow .3s, border-color .3s, transform .3s var(--lg-ease-spring);
649
+ }
650
+ .ta::placeholder { color: var(--lg-ink-3); }
651
+ .ta:focus {
652
+ transform: scale(1.01);
653
+ border-color: var(--lg-blue);
654
+ box-shadow: 0 0 0 3px rgba(10, 132, 255, .3);
655
+ }
656
+
657
+ /* 组合输入:前缀 + 输入 + 内嵌按钮,同处一颗玻璃 */
658
+ .combo {
659
+ display: flex;
660
+ align-items: center;
661
+ gap: 9px;
662
+ width: min(420px, 100%);
663
+ height: 50px;
664
+ padding: 0 6px 0 15px;
665
+ border-radius: var(--lg-radius-sm);
666
+ }
667
+ .combo .pre { flex: none; font-size: 13.5px; font-weight: 600; color: var(--lg-ink-2); }
668
+ .combo input {
669
+ flex: 1;
670
+ min-width: 0;
671
+ border: none;
672
+ outline: none;
673
+ background: transparent;
674
+ font-size: 15px;
675
+ color: var(--lg-ink);
676
+ }
677
+ .combo input::placeholder { color: var(--lg-ink-3); }
678
+
679
+ /* 标签输入 */
680
+ .chips { display: flex; flex-wrap: wrap; gap: 8px; }
681
+ .chip {
682
+ display: inline-flex;
683
+ align-items: center;
684
+ gap: 6px;
685
+ height: 32px;
686
+ padding: 0 13px;
687
+ border-radius: 999px;
688
+ border: 1px solid transparent;
689
+ font-size: 13px;
690
+ font-weight: 600;
691
+ color: var(--lg-ink);
692
+ cursor: pointer;
693
+ background:
694
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
695
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
696
+ box-shadow:
697
+ inset 0 1px 0 var(--lg-highlight),
698
+ 0 1px 2px var(--lg-drop);
699
+ transition: transform .45s var(--lg-ease-spring), background .2s;
700
+ }
701
+ .chip:hover { filter: brightness(1.03); }
702
+ .chip:active { transform: scale(1.04, .96); }
703
+ .chip.on {
704
+ color: #fff;
705
+ background:
706
+ linear-gradient(135deg, rgba(10, 132, 255, .92), rgba(0, 100, 220, .76)) padding-box,
707
+ linear-gradient(135deg, rgba(255, 255, 255, .78), rgba(255, 255, 255, .18) 35%, rgba(255, 255, 255, .18) 65%, rgba(255, 255, 255, .78)) border-box;
708
+ box-shadow:
709
+ inset 0 1px .5px rgba(255, 255, 255, .5),
710
+ 0 6px 14px -6px rgba(10, 120, 240, .7);
711
+ }
712
+ .chip .x { opacity: .55; font-weight: 800; }
713
+
714
+ /* 密码强度 */
715
+ .strength { display: flex; gap: 4px; width: 100%; }
716
+ .strength i {
717
+ flex: 1;
718
+ height: 4px;
719
+ border-radius: 2px;
720
+ background: rgba(120, 120, 128, .22);
721
+ }
722
+ .strength i.a1 { background: linear-gradient(90deg, var(--lg-orange), #ff6b00); }
723
+ .strength i.a2 { background: linear-gradient(90deg, var(--lg-yellow), var(--lg-orange)); }
724
+ .strength i.a3 { background: linear-gradient(90deg, var(--lg-green), #28a745); }
725
+
726
+ /* 字段组:标签 + 控件 + 提示,两端通用 */
727
+ .fieldgroup { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
728
+ .fieldgroup > label,
729
+ .fieldgroup .fl { font-size: 12px; font-weight: 600; color: var(--lg-ink-2); }
730
+ .fieldgroup .hint { font-size: 11.5px; color: var(--lg-ink-2); }
731
+ .fieldgroup .msg { font-size: 11.5px; font-weight: 600; color: #c1271f; }
732
+ .fieldgroup .msg.ok { color: #1d8b3c; }
733
+
734
+ /* ============================================================
735
+ 06 控件
736
+ ============================================================ */
737
+ /* 开关:默认 62×36,.sm 52×30,.mini 44×26 */
738
+ .sw {
739
+ position: relative;
740
+ display: inline-block;
741
+ flex: none;
742
+ width: 60px;
743
+ height: 32px;
744
+ cursor: pointer;
745
+ -webkit-tap-highlight-color: transparent;
746
+ }
747
+ .sw input { position: absolute; inset: 0; z-index: 2; margin: 0; opacity: 0; cursor: pointer; }
748
+ .sw .track {
749
+ position: absolute;
750
+ inset: 0;
751
+ border-radius: 999px;
752
+ border: none;
753
+ background: rgba(0, 0, 0, .15);
754
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .04);
755
+ transition: background .2s, box-shadow .2s;
756
+ }
757
+ .sw .knob {
758
+ position: absolute;
759
+ top: 50%;
760
+ left: 4px;
761
+ z-index: 1;
762
+ width: 36px;
763
+ height: 28px;
764
+ transform: translateY(-50%);
765
+ border-radius: 999px; /* 横向胶囊旋钮 */
766
+ border: 1px solid transparent;
767
+ background-color: #fff;
768
+ background-image:
769
+ linear-gradient(rgba(255, 255, 255, .07), rgba(255, 255, 255, .07)),
770
+ linear-gradient(135deg, rgba(255, 255, 255, .34), rgba(255, 255, 255, .06) 35%, rgba(255, 255, 255, .06) 65%, rgba(255, 255, 255, .34));
771
+ background-clip: padding-box, border-box;
772
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, .10), 0 2px 4px -2px rgba(0, 0, 0, .10);
773
+ transition: transform .45s var(--lg-ease-spring); /* 对齐参考站 lg-knob:450ms 弹簧 */
774
+ }
775
+ .sw input:checked ~ .track {
776
+ background: #22c55e;
777
+ box-shadow: none;
778
+ }
779
+ .sw.blue input:checked ~ .track {
780
+ background: #0a84ff;
781
+ box-shadow: none;
782
+ }
783
+ .sw input:checked ~ .knob { transform: translateY(-50%) translateX(20px); }
784
+ .sw input:focus-visible ~ .track { outline: 3px solid rgba(10, 132, 255, .5); outline-offset: 2px; }
785
+
786
+ .sw.sm { width: 52px; height: 30px; }
787
+ .sw.sm .track { border-radius: 999px; }
788
+ .sw.sm .knob { width: 24px; height: 24px; }
789
+ .sw.sm input:checked ~ .knob { transform: translateY(-50%) translateX(22px); }
790
+
791
+ .sw.mini { width: 44px; height: 26px; }
792
+ .sw.mini .track { border-radius: 999px; }
793
+ .sw.mini .knob { width: 20px; height: 20px; }
794
+ .sw.mini input:checked ~ .knob { transform: translateY(-50%) translateX(18px); }
795
+
796
+ [data-theme="dark"] .sw .track {
797
+ border-color: rgba(255, 255, 255, .14);
798
+ background: rgba(255, 255, 255, .08);
799
+ }
800
+ [data-theme="dark"] .sw .knob { background: linear-gradient(180deg, #f7f7fa, #d8d8de); }
801
+
802
+ /* 分段控制:选中段是浮在轨道上的透明玻璃胶囊(液态 thumb 语言) */
803
+ .seg {
804
+ display: inline-flex;
805
+ gap: 2px;
806
+ padding: 3px;
807
+ border-radius: 999px;
808
+ border: 1px solid rgba(255, 255, 255, .55);
809
+ background: rgba(120, 120, 128, .12);
810
+ -webkit-backdrop-filter: blur(8px) saturate(150%);
811
+ backdrop-filter: blur(8px) saturate(150%);
812
+ box-shadow: inset 0 1px 3px rgba(22, 28, 45, .10);
813
+ }
814
+ .seg input { position: absolute; opacity: 0; pointer-events: none; }
815
+ .seg label {
816
+ padding: 7px 18px;
817
+ border-radius: 999px;
818
+ font-size: 14px;
819
+ font-weight: 600;
820
+ color: var(--lg-ink-2);
821
+ cursor: pointer;
822
+ user-select: none;
823
+ transition: all .3s var(--lg-ease-spring);
824
+ }
825
+ .seg label:active { transform: scale(1.04, .96); }
826
+ .seg input:checked + label {
827
+ position: relative;
828
+ z-index: 2;
829
+ color: var(--lg-ink);
830
+ border: 1px solid rgba(255, 255, 255, .78);
831
+ background: linear-gradient(180deg, rgba(255, 255, 255, .97) 0%, rgba(255, 255, 255, .58) 52%, rgba(255, 255, 255, .42) 100%);
832
+ -webkit-backdrop-filter: blur(12px) saturate(180%);
833
+ backdrop-filter: blur(12px) saturate(180%);
834
+ box-shadow:
835
+ inset 0 2.5px 1px rgba(255, 255, 255, .98),
836
+ inset 0 -1px 0 rgba(255, 255, 255, .38),
837
+ 0 1px 0 rgba(255, 255, 255, .55),
838
+ 0 6px 16px -5px rgba(22, 28, 45, .32),
839
+ 0 3px 8px -2px rgba(22, 28, 45, .14);
840
+ transform: scale(1.055) translateY(-1px);
841
+ }
842
+ .seg.lg label { padding: 9px 20px; font-size: 15px; }
843
+
844
+ [data-theme="dark"] .sw .track {
845
+ background: rgba(120, 120, 128, .28);
846
+ border-color: rgba(255, 255, 255, .16);
847
+ }
848
+
849
+ /* 滑块:对齐 Glass UI(28px 行高 · 8px 轨道 · 主色 range · WebGL knob) */
850
+ .slider,
851
+ .lg-slider {
852
+ position: relative;
853
+ z-index: 0;
854
+ display: flex;
855
+ align-items: center;
856
+ width: 100%;
857
+ height: 28px;
858
+ isolation: isolate;
859
+ }
860
+ .slider .rail,
861
+ .lg-slider .rail {
862
+ position: absolute;
863
+ left: 0;
864
+ right: 0;
865
+ top: 50%;
866
+ z-index: 1;
867
+ height: 8px;
868
+ border-radius: 999px;
869
+ transform: translateY(-50%);
870
+ overflow: hidden;
871
+ background-color: rgba(0, 0, 0, .12);
872
+ box-shadow: none;
873
+ }
874
+ [data-theme="dark"] .slider .rail,
875
+ [data-theme="dark"] .lg-slider .rail {
876
+ background-color: rgba(255, 255, 255, .20);
877
+ }
878
+ .slider.rainbow .rail,
879
+ .lg-slider.rainbow .rail {
880
+ height: 16px;
881
+ border-radius: 8px;
882
+ background: var(--lg-rainbow-track);
883
+ box-shadow: inset 0 1px 2px rgba(255, 255, 255, .6), 0 4px 12px -3px rgba(90, 70, 130, .45);
884
+ }
885
+ .slider input[type="range"],
886
+ .lg-slider input[type="range"] {
887
+ position: relative;
888
+ z-index: 7;
889
+ pointer-events: auto;
890
+ width: 100%;
891
+ height: 28px;
892
+ margin: 0;
893
+ background: transparent;
894
+ cursor: grab;
895
+ -webkit-appearance: none;
896
+ appearance: none;
897
+ }
898
+ .slider input[type="range"]::-webkit-slider-thumb,
899
+ .lg-slider input[type="range"]::-webkit-slider-thumb {
900
+ -webkit-appearance: none;
901
+ width: 44px;
902
+ height: 28px;
903
+ border-radius: 999px; /* 横向胶囊握把(同 iOS 26 滑块) */
904
+ border: 1px solid rgba(255, 255, 255, .35);
905
+ background-color: rgba(255, 255, 255, .14);
906
+ background-image: none;
907
+ -webkit-backdrop-filter: blur(16px) saturate(185%);
908
+ backdrop-filter: blur(16px) saturate(185%);
909
+ box-shadow:
910
+ inset 0 1px 0 rgba(255, 255, 255, .45),
911
+ 0 2px 8px -4px rgba(15, 23, 42, .22);
912
+ transition: transform .2s var(--lg-ease-spring);
913
+ }
914
+ .slider input[type="range"]::-webkit-slider-thumb:hover,
915
+ .lg-slider input[type="range"]::-webkit-slider-thumb:hover { transform: scale(1.08); }
916
+ /* 拖动中旋钮放大(scale 走弹簧过渡,松手弹回)——对齐参考站滑块手感 */
917
+ .slider input[type="range"]:active::-webkit-slider-thumb,
918
+ .lg-slider input[type="range"]:active::-webkit-slider-thumb { transform: scale(1.14); }
919
+ .slider input[type="range"]::-moz-range-thumb,
920
+ .lg-slider input[type="range"]::-moz-range-thumb {
921
+ width: 44px;
922
+ height: 28px;
923
+ border-radius: 999px;
924
+ border: 1px solid rgba(255, 255, 255, .9);
925
+ background: rgba(255, 255, 255, .7);
926
+ box-shadow: inset 0 2px 2px #fff, 0 8px 18px -6px rgba(22, 28, 45, .5);
927
+ }
928
+ .slider.blue .rail,
929
+ .lg-slider.blue .rail {
930
+ background-color: rgba(120, 120, 128, .28);
931
+ }
932
+ .slider .fill,
933
+ .lg-slider .fill {
934
+ position: absolute;
935
+ left: 0;
936
+ top: 0;
937
+ z-index: 1;
938
+ height: 100%;
939
+ width: 0;
940
+ border-radius: inherit;
941
+ background-color: #0a84ff;
942
+ pointer-events: none;
943
+ transition: width .08s linear;
944
+ }
945
+ .slider.rainbow .fill,
946
+ .lg-slider.rainbow .fill { display: none; }
947
+ .slider .thumb,
948
+ .lg-slider .thumb {
949
+ display: none;
950
+ position: absolute;
951
+ top: 50%;
952
+ left: 0;
953
+ z-index: 6;
954
+ width: 44px;
955
+ height: 28px;
956
+ margin: 0;
957
+ border-radius: 999px;
958
+ border: 1px solid transparent;
959
+ background-color: #fff;
960
+ background-image:
961
+ linear-gradient(rgba(255, 255, 255, .07), rgba(255, 255, 255, .07)),
962
+ linear-gradient(135deg, rgba(255, 255, 255, .34), rgba(255, 255, 255, .06) 35%, rgba(255, 255, 255, .06) 65%, rgba(255, 255, 255, .34));
963
+ background-clip: padding-box, border-box;
964
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, .10), 0 2px 4px -2px rgba(0, 0, 0, .10);
965
+ transform: translateY(-50%);
966
+ pointer-events: none;
967
+ transition: left .08s linear, transform .2s var(--lg-ease-spring);
968
+ }
969
+ html.lg-on .slider .thumb,
970
+ html.lg-on .lg-slider .thumb {
971
+ display: block;
972
+ background-color: rgba(255, 255, 255, .12) !important;
973
+ background-image: none !important;
974
+ border: 1px solid rgba(255, 255, 255, .32);
975
+ -webkit-backdrop-filter: blur(18px) saturate(190%);
976
+ backdrop-filter: blur(18px) saturate(190%);
977
+ box-shadow:
978
+ inset 0 1px 0 rgba(255, 255, 255, .42),
979
+ 0 2px 8px -5px rgba(15, 23, 42, .2);
980
+ }
981
+ html.lg-on .slider .thumb.lg:not([data-glass-live]):not(.thumb-rainbow),
982
+ html.lg-on .lg-slider .thumb.lg:not([data-glass-live]):not(.thumb-rainbow) {
983
+ background:
984
+ linear-gradient(rgba(255, 255, 255, .08), rgba(255, 255, 255, .08)) padding-box,
985
+ linear-gradient(135deg, rgba(255, 255, 255, .28), rgba(255, 255, 255, .04) 40%, rgba(255, 255, 255, .04) 60%, rgba(255, 255, 255, .22)) border-box !important;
986
+ -webkit-backdrop-filter: blur(18px) saturate(190%) !important;
987
+ backdrop-filter: blur(18px) saturate(190%) !important;
988
+ }
989
+ html.lg-on .slider input[type="range"]::-webkit-slider-thumb,
990
+ html.lg-on .lg-slider input[type="range"]::-webkit-slider-thumb {
991
+ -webkit-appearance: none;
992
+ opacity: 0 !important;
993
+ background: transparent !important;
994
+ box-shadow: none !important;
995
+ }
996
+ html.lg-on .slider input[type="range"]::-moz-range-thumb,
997
+ html.lg-on .lg-slider input[type="range"]::-moz-range-thumb {
998
+ opacity: 0 !important;
999
+ border: none;
1000
+ background: transparent !important;
1001
+ box-shadow: none !important;
1002
+ }
1003
+ /* 彩虹轨:专用白玻璃拇指(勿叠 .lg-clear,2px blur 会把轨道染成色块) */
1004
+ html.lg-on .slider.rainbow .thumb.thumb-rainbow,
1005
+ html.lg-on .lg-slider.rainbow .thumb.thumb-rainbow {
1006
+ z-index: 8;
1007
+ --rainbow-w: 100%;
1008
+ --rainbow-x: 0px;
1009
+ background-color: transparent !important;
1010
+ background-image:
1011
+ linear-gradient(180deg, rgba(255, 255, 255, .58) 0%, rgba(255, 255, 255, .14) 48%, rgba(255, 255, 255, .08) 100%),
1012
+ var(--lg-rainbow-track) !important;
1013
+ background-size: 100% 100%, var(--rainbow-w) 16px !important;
1014
+ background-position: 0 0, var(--rainbow-x) center !important;
1015
+ background-repeat: no-repeat !important;
1016
+ background-clip: padding-box !important;
1017
+ border: 1px solid rgba(255, 255, 255, .62) !important;
1018
+ -webkit-backdrop-filter: blur(14px) saturate(140%) brightness(1.08);
1019
+ backdrop-filter: blur(14px) saturate(140%) brightness(1.08);
1020
+ box-shadow:
1021
+ inset 0 1.5px 0 rgba(255, 255, 255, .88),
1022
+ inset 0 -0.5px 0 rgba(255, 255, 255, .22),
1023
+ 0 2px 8px -3px rgba(15, 23, 42, .22);
1024
+ }
1025
+ html.lg-lens html.lg-on .slider.rainbow .thumb.thumb-rainbow,
1026
+ html.lg-lens html.lg-on .lg-slider.rainbow .thumb.thumb-rainbow {
1027
+ -webkit-backdrop-filter: url(#lg-lens) blur(18px) saturate(140%) brightness(1.1);
1028
+ backdrop-filter: url(#lg-lens) blur(18px) saturate(140%) brightness(1.1);
1029
+ }
1030
+ /* 步进器 */
1031
+ .stepper {
1032
+ display: inline-flex;
1033
+ align-items: center;
1034
+ border-radius: var(--lg-radius-sm);
1035
+ overflow: hidden;
1036
+ }
1037
+ html.lg-on .stepper.lg {
1038
+ overflow: hidden;
1039
+ border-radius: var(--lg-radius-sm);
1040
+ }
1041
+ .stepper button {
1042
+ width: 44px;
1043
+ height: 40px;
1044
+ border: none;
1045
+ background: transparent;
1046
+ font-size: 18px;
1047
+ color: var(--lg-ink);
1048
+ cursor: pointer;
1049
+ transition: background .2s;
1050
+ }
1051
+ .stepper button:hover { background: rgba(255, 255, 255, .45); }
1052
+ .stepper button:disabled { opacity: .35; cursor: not-allowed; }
1053
+ .stepper .val {
1054
+ width: 50px;
1055
+ height: 40px;
1056
+ line-height: 40px;
1057
+ text-align: center;
1058
+ font-size: 14px;
1059
+ font-weight: 600;
1060
+ font-variant-numeric: tabular-nums;
1061
+ border-left: 1px solid rgba(60, 60, 67, .12);
1062
+ border-right: 1px solid rgba(60, 60, 67, .12);
1063
+ }
1064
+
1065
+ /* 复选 / 单选 */
1066
+ .check {
1067
+ display: inline-flex;
1068
+ align-items: center;
1069
+ gap: 10px;
1070
+ font-size: 14px;
1071
+ font-weight: 500;
1072
+ color: var(--lg-ink);
1073
+ cursor: pointer;
1074
+ }
1075
+ .check input { position: absolute; width: 0; height: 0; opacity: 0; }
1076
+ .check .box {
1077
+ flex: none;
1078
+ display: grid;
1079
+ place-items: center;
1080
+ width: 24px;
1081
+ height: 24px;
1082
+ border-radius: 8px;
1083
+ border: 1px solid rgba(120, 120, 128, .35);
1084
+ background: rgba(255, 255, 255, .55);
1085
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .9);
1086
+ font-size: 13px;
1087
+ color: transparent;
1088
+ transition: all .25s var(--lg-ease-spring);
1089
+ }
1090
+ .check input:checked + .box {
1091
+ color: #fff;
1092
+ border-color: rgba(255, 255, 255, .55);
1093
+ background: linear-gradient(135deg, var(--lg-blue), var(--lg-blue-deep));
1094
+ box-shadow:
1095
+ inset 0 1px 1px rgba(255, 255, 255, .55),
1096
+ 0 4px 10px -2px rgba(10, 132, 255, .55);
1097
+ transform: scale(1.04);
1098
+ }
1099
+ .check input:focus-visible + .box { outline: 3px solid rgba(10, 132, 255, .45); outline-offset: 2px; }
1100
+ .check.round .box { border-radius: 50%; }
1101
+
1102
+ /* 磁贴开关 */
1103
+ .tile {
1104
+ position: relative;
1105
+ display: inline-grid;
1106
+ place-items: center;
1107
+ width: 62px;
1108
+ height: 62px;
1109
+ border-radius: 19px;
1110
+ cursor: pointer;
1111
+ }
1112
+ .tile input { position: absolute; inset: 0; z-index: 2; margin: 0; opacity: 0; cursor: pointer; }
1113
+ .tile .face {
1114
+ position: absolute;
1115
+ inset: 0;
1116
+ display: grid;
1117
+ place-items: center;
1118
+ border-radius: inherit;
1119
+ border: 1px solid rgba(255, 255, 255, .7);
1120
+ background: linear-gradient(var(--lg-wash), var(--lg-wash));
1121
+ -webkit-backdrop-filter: blur(10px) saturate(160%);
1122
+ backdrop-filter: blur(10px) saturate(160%);
1123
+ box-shadow:
1124
+ inset 0 1.5px .5px -.5px var(--lg-sheen),
1125
+ 0 1px 2px rgba(0, 0, 0, .06),
1126
+ 0 6px 14px -6px var(--lg-inner-shade);
1127
+ font-size: 23px;
1128
+ transition: all .35s var(--lg-ease-spring);
1129
+ }
1130
+ .tile input:checked ~ .face {
1131
+ color: #fff;
1132
+ border-color: rgba(255, 255, 255, .55);
1133
+ background: linear-gradient(145deg, #5eb0ff 0%, #0a84ff 42%, #0066d6 100%);
1134
+ transform: scale(1.05);
1135
+ box-shadow:
1136
+ inset 0 1.5px .5px rgba(255, 255, 255, .88),
1137
+ inset 0 -1px 0 rgba(0, 80, 180, .35),
1138
+ 0 6px 16px -4px rgba(10, 132, 255, .72),
1139
+ 0 2px 4px rgba(0, 60, 140, .18);
1140
+ }
1141
+ .tile input:checked ~ .face.warm {
1142
+ border-color: rgba(255, 255, 255, .5);
1143
+ background: linear-gradient(145deg, #ffc857 0%, #ff9f0a 44%, #e88700 100%);
1144
+ transform: scale(1.05);
1145
+ box-shadow:
1146
+ inset 0 1.5px .5px rgba(255, 255, 255, .9),
1147
+ inset 0 -1px 0 rgba(180, 90, 0, .35),
1148
+ 0 6px 16px -4px rgba(255, 159, 10, .78),
1149
+ 0 2px 4px rgba(160, 80, 0, .22);
1150
+ }
1151
+
1152
+ /* 评分 */
1153
+ .rate {
1154
+ display: inline-flex;
1155
+ gap: 2px;
1156
+ font-size: 20px;
1157
+ line-height: 1;
1158
+ color: #ffc300;
1159
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .14);
1160
+ }
1161
+ .rate .off { color: rgba(120, 120, 128, .28); text-shadow: none; }
1162
+ .rate.lg { font-size: 26px; }
1163
+
1164
+ /* 色板 */
1165
+ .swatches { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
1166
+ .swatches input { position: absolute; width: 0; height: 0; opacity: 0; }
1167
+ .swatches label {
1168
+ width: 30px;
1169
+ height: 30px;
1170
+ border-radius: 50%;
1171
+ border: 2px solid transparent;
1172
+ cursor: pointer;
1173
+ box-shadow:
1174
+ inset 0 1px 1px rgba(255, 255, 255, .55),
1175
+ 0 2px 6px rgba(0, 0, 0, .2);
1176
+ transition: transform .22s var(--lg-ease-spring), box-shadow .22s;
1177
+ }
1178
+ .swatches input:checked + label {
1179
+ border-color: rgba(255, 255, 255, .95);
1180
+ box-shadow: 0 0 0 3px rgba(10, 132, 255, .5), inset 0 1px 1px rgba(255, 255, 255, .55);
1181
+ transform: scale(1.08);
1182
+ }
1183
+ .swatches input:focus-visible + label { outline: 3px solid rgba(10, 132, 255, .45); outline-offset: 3px; }
1184
+
1185
+ /* ============================================================
1186
+ 07 反馈
1187
+ ============================================================ */
1188
+ .badge {
1189
+ display: inline-flex;
1190
+ align-items: center;
1191
+ gap: 6px;
1192
+ height: 28px;
1193
+ padding: 0 12px;
1194
+ border-radius: 999px;
1195
+ border: 1px solid transparent;
1196
+ font-size: 12.5px;
1197
+ font-weight: 600;
1198
+ background:
1199
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
1200
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
1201
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
1202
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
1203
+ box-shadow:
1204
+ inset 0 1px 0 var(--lg-highlight),
1205
+ 0 1px 2px var(--lg-drop);
1206
+ }
1207
+ .badge .n {
1208
+ display: grid;
1209
+ place-items: center;
1210
+ min-width: 17px;
1211
+ height: 17px;
1212
+ padding: 0 5px;
1213
+ border-radius: 9px;
1214
+ background: var(--lg-red);
1215
+ color: #fff;
1216
+ font-size: 10.5px;
1217
+ }
1218
+ .badge .dot {
1219
+ width: 7px;
1220
+ height: 7px;
1221
+ border-radius: 50%;
1222
+ background: var(--lg-green);
1223
+ box-shadow: 0 0 0 3px rgba(52, 199, 89, .2);
1224
+ }
1225
+
1226
+ .pill {
1227
+ display: inline-flex;
1228
+ align-items: center;
1229
+ height: 22px;
1230
+ padding: 0 9px;
1231
+ border-radius: 11px;
1232
+ font-size: 10.5px;
1233
+ font-weight: 700;
1234
+ white-space: nowrap;
1235
+ }
1236
+ .pill.ok { color: #1d8b3c; background: rgba(52, 199, 89, .22); }
1237
+ .pill.wait { color: #9a5600; background: rgba(255, 159, 10, .24); }
1238
+ .pill.stop { color: #b3261e; background: rgba(255, 59, 48, .16); }
1239
+ .pill.info { color: var(--lg-blue-deep); background: rgba(10, 132, 255, .16); }
1240
+ [data-theme="dark"] .pill.ok { color: #6ee7a0; }
1241
+ [data-theme="dark"] .pill.wait { color: #ffce7a; }
1242
+ [data-theme="dark"] .pill.stop { color: #ff9c94; }
1243
+ [data-theme="dark"] .pill.info { color: #8cc4ff; }
1244
+
1245
+ .progress { width: 100%; }
1246
+ .progress .bar {
1247
+ height: 8px;
1248
+ border-radius: 4px;
1249
+ overflow: hidden;
1250
+ border: 1px solid rgba(255, 255, 255, .55);
1251
+ background: rgba(120, 120, 128, .18);
1252
+ box-shadow: inset 0 1px 2px rgba(22, 28, 45, .12);
1253
+ }
1254
+ .progress .fill {
1255
+ height: 100%;
1256
+ border-radius: inherit;
1257
+ background: var(--lg-rainbow-fill, linear-gradient(90deg, #3a7cf6, #4cd964, #ffd60a, #ff9f0a, #ff375f, #bf5af2));
1258
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .65);
1259
+ transition: width .5s cubic-bezier(.34, 1.4, .64, 1);
1260
+ }
1261
+ .progress .fill.solid { background: linear-gradient(90deg, var(--lg-blue), #4c9dff); }
1262
+ .progress .fill.ok { background: linear-gradient(90deg, var(--lg-green), #28a745); }
1263
+ .progress .fill.warn { background: linear-gradient(90deg, var(--lg-orange), #ff6b00); }
1264
+
1265
+ .ring {
1266
+ --val: 72%;
1267
+ width: 78px;
1268
+ height: 78px;
1269
+ display: grid;
1270
+ place-items: center;
1271
+ border-radius: 50%;
1272
+ border: 1px solid rgba(255, 255, 255, .8);
1273
+ font-size: 14px;
1274
+ font-weight: 700;
1275
+ font-variant-numeric: tabular-nums;
1276
+ background:
1277
+ radial-gradient(closest-side, rgba(255, 255, 255, .62) 78%, transparent 79%),
1278
+ conic-gradient(var(--lg-blue) var(--val), rgba(255, 255, 255, .35) 0);
1279
+ -webkit-backdrop-filter: blur(6px);
1280
+ backdrop-filter: blur(6px);
1281
+ box-shadow: inset 0 1px .5px var(--lg-sheen), 0 6px 16px -6px var(--lg-inner-shade);
1282
+ }
1283
+
1284
+ .spinner {
1285
+ width: 26px;
1286
+ height: 26px;
1287
+ border-radius: 50%;
1288
+ border: 2.5px solid rgba(255, 255, 255, .35);
1289
+ border-top-color: var(--lg-blue);
1290
+ animation: lg-spin .8s linear infinite;
1291
+ }
1292
+ .spinner.dark { border-color: rgba(60, 60, 67, .16); border-top-color: var(--lg-ink); }
1293
+ .spinner.sm { width: 18px; height: 18px; border-width: 2px; }
1294
+
1295
+ @keyframes lg-shimmer {
1296
+ from { background-position: 130% 0; }
1297
+ to { background-position: -40% 0; }
1298
+ }
1299
+ .sk {
1300
+ border-radius: 7px;
1301
+ background: linear-gradient(100deg,
1302
+ rgba(255, 255, 255, .30) 30%,
1303
+ rgba(255, 255, 255, .80) 48%,
1304
+ rgba(255, 255, 255, .30) 66%);
1305
+ background-size: 220% 100%;
1306
+ animation: lg-shimmer 1.5s ease-in-out infinite;
1307
+ }
1308
+ [data-theme="dark"] .sk {
1309
+ background: linear-gradient(100deg,
1310
+ rgba(255, 255, 255, .05) 30%,
1311
+ rgba(255, 255, 255, .14) 48%,
1312
+ rgba(255, 255, 255, .05) 66%);
1313
+ background-size: 220% 100%;
1314
+ }
1315
+
1316
+ @keyframes lg-toast-in {
1317
+ from { opacity: 0; transform: translateY(-22px) scale(.92); }
1318
+ }
1319
+ @keyframes lg-toast-out {
1320
+ to { opacity: 0; transform: translateY(-16px) scale(.95); }
1321
+ }
1322
+ .toast-zone {
1323
+ position: fixed;
1324
+ top: 78px;
1325
+ left: 50%;
1326
+ transform: translateX(-50%);
1327
+ z-index: var(--lg-z-toast);
1328
+ display: flex;
1329
+ flex-direction: column;
1330
+ align-items: center;
1331
+ gap: 10px;
1332
+ pointer-events: none;
1333
+ }
1334
+ .toast {
1335
+ display: flex;
1336
+ align-items: center;
1337
+ gap: 11px;
1338
+ padding: 12px 19px;
1339
+ border-radius: 20px;
1340
+ font-size: 13.5px;
1341
+ font-weight: 600;
1342
+ pointer-events: auto;
1343
+ animation: lg-toast-in .45s var(--lg-ease-spring);
1344
+ }
1345
+ .toast .ti {
1346
+ display: grid;
1347
+ place-items: center;
1348
+ width: 27px;
1349
+ height: 27px;
1350
+ border-radius: 50%;
1351
+ background: linear-gradient(135deg, var(--lg-green), #28a745);
1352
+ color: #fff;
1353
+ font-size: 13px;
1354
+ }
1355
+ .toast.out { animation: lg-toast-out .35s ease forwards; }
1356
+
1357
+ /* 空态:图标 + 解释 + 一个可执行动作 */
1358
+ .empty { width: 100%; padding: 4px 8px 10px; text-align: center; }
1359
+ .empty .ei {
1360
+ display: grid;
1361
+ place-items: center;
1362
+ width: 56px;
1363
+ height: 56px;
1364
+ margin: 0 auto 12px;
1365
+ border: 1px solid rgba(255, 255, 255, .85);
1366
+ border-radius: 19px;
1367
+ background: linear-gradient(135deg, rgba(255, 255, 255, .72), rgba(255, 255, 255, .34));
1368
+ box-shadow:
1369
+ inset 0 1.5px .5px -.5px var(--lg-sheen),
1370
+ 0 8px 18px -8px rgba(22, 28, 45, .4);
1371
+ -webkit-backdrop-filter: blur(10px) saturate(160%);
1372
+ backdrop-filter: blur(10px) saturate(160%);
1373
+ font-size: 23px;
1374
+ }
1375
+ .empty h4 { font-size: 14px; font-weight: 700; letter-spacing: 0; }
1376
+ .empty p { margin: 4px 0 14px; font-size: 12px; line-height: 1.55; color: var(--lg-ink-2); }
1377
+
1378
+ /* 通知卡 */
1379
+ .notice {
1380
+ display: flex;
1381
+ align-items: flex-start;
1382
+ gap: 11px;
1383
+ width: 100%;
1384
+ padding: 11px 13px;
1385
+ border-radius: 15px;
1386
+ }
1387
+ .notice .ni {
1388
+ display: grid;
1389
+ place-items: center;
1390
+ flex: none;
1391
+ width: 30px;
1392
+ height: 30px;
1393
+ border-radius: 10px;
1394
+ color: #fff;
1395
+ font-size: 14px;
1396
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .4);
1397
+ }
1398
+ .notice .nb { flex: 1; min-width: 0; }
1399
+ .notice .nb b { display: block; font-size: 12.5px; font-weight: 600; }
1400
+ .notice .nb small { display: block; margin-top: 1px; font-size: 11px; line-height: 1.45; color: var(--lg-ink-2); }
1401
+ .notice .nt { flex: none; font-size: 10.5px; color: var(--lg-ink-3); }
1402
+
1403
+ /* ============================================================
1404
+ 07b 内容卡与封面
1405
+ ---- 内容卡故意不做玻璃:正文需要稳定底色 ----
1406
+ ============================================================ */
1407
+ .card {
1408
+ display: flex;
1409
+ flex-direction: column;
1410
+ gap: 4px;
1411
+ padding: 15px 16px;
1412
+ border-radius: var(--lg-radius-md);
1413
+ background: rgba(255, 255, 255, .88);
1414
+ border: 1px solid rgba(255, 255, 255, .78);
1415
+ box-shadow:
1416
+ 0 1px 2px rgba(0, 0, 0, .04),
1417
+ 0 14px 28px -22px var(--lg-inner-shade);
1418
+ }
1419
+ .card .ct { font-size: 13.5px; font-weight: 700; letter-spacing: -.2px; }
1420
+ .card .cs { font-size: 11.5px; line-height: 1.6; color: var(--lg-ink-2); }
1421
+ .card .cfoot {
1422
+ display: flex;
1423
+ align-items: center;
1424
+ gap: 8px;
1425
+ margin-top: 9px;
1426
+ font-size: 11px;
1427
+ color: var(--lg-ink-3);
1428
+ }
1429
+ /* 需要浮在照片上时才叠 .glass;内容卡默认不建议玻璃化 */
1430
+ .card.glass {
1431
+ background: linear-gradient(135deg, var(--lg-fill-1), var(--lg-fill-2));
1432
+ border-color: var(--lg-stroke);
1433
+ }
1434
+
1435
+ /* 封面:卡片顶部的渐变图位,也用于活动/文章缩略 */
1436
+ .cover {
1437
+ position: relative;
1438
+ height: 128px;
1439
+ overflow: hidden;
1440
+ border-radius: var(--lg-radius-sm);
1441
+ background: linear-gradient(140deg, #5ac8fa, var(--lg-blue));
1442
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .45);
1443
+ }
1444
+ .cover.c1 { background: linear-gradient(140deg, var(--lg-orange), #ff375f); }
1445
+ .cover.c2 { background: linear-gradient(140deg, #5ac8fa, var(--lg-blue)); }
1446
+ .cover.c3 { background: linear-gradient(140deg, var(--lg-purple), #7d3cf0); }
1447
+ .cover.c4 { background: linear-gradient(140deg, #4cd964, var(--lg-blue)); }
1448
+ .cover .cv-t {
1449
+ position: absolute;
1450
+ left: 13px;
1451
+ bottom: 11px;
1452
+ right: 13px;
1453
+ font-size: 13px;
1454
+ font-weight: 700;
1455
+ line-height: 1.35;
1456
+ color: #fff;
1457
+ text-shadow: 0 1px 4px rgba(0, 0, 0, .28);
1458
+ }
1459
+ [data-theme="dark"] .card {
1460
+ background: rgba(255, 255, 255, .055);
1461
+ border-color: rgba(255, 255, 255, .1);
1462
+ }
1463
+
1464
+ /* 行内横幅 */
1465
+ .banner {
1466
+ display: flex;
1467
+ align-items: flex-start;
1468
+ gap: 9px;
1469
+ width: 100%;
1470
+ padding: 11px 13px;
1471
+ border-radius: var(--lg-radius-sm);
1472
+ border: 1px solid transparent;
1473
+ font-size: 12.5px;
1474
+ line-height: 1.55;
1475
+ -webkit-backdrop-filter: blur(10px) saturate(150%);
1476
+ backdrop-filter: blur(10px) saturate(150%);
1477
+ }
1478
+ .banner .bi {
1479
+ flex: none;
1480
+ display: grid;
1481
+ place-items: center;
1482
+ width: 18px;
1483
+ height: 18px;
1484
+ margin-top: 1px;
1485
+ border-radius: 50%;
1486
+ color: #fff;
1487
+ font-size: 11px;
1488
+ font-weight: 800;
1489
+ }
1490
+ .banner b { font-weight: 700; }
1491
+ .banner.info { background: linear-gradient(135deg, rgba(10, 132, 255, .15), rgba(10, 132, 255, .06)) padding-box, linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box; }
1492
+ .banner.info .bi { background: var(--lg-blue); }
1493
+ .banner.ok { background: linear-gradient(135deg, rgba(52, 199, 89, .16), rgba(52, 199, 89, .06)) padding-box, linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box; }
1494
+ .banner.ok .bi { background: var(--lg-green); }
1495
+ .banner.warn { background: linear-gradient(135deg, rgba(255, 159, 10, .18), rgba(255, 159, 10, .07)) padding-box, linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box; }
1496
+ .banner.warn .bi { background: var(--lg-orange); }
1497
+
1498
+
1499
+ /* 提示气泡 */
1500
+ .tip-wrap { position: relative; display: inline-block; }
1501
+ .tip {
1502
+ position: absolute;
1503
+ bottom: calc(100% + 10px);
1504
+ left: 50%;
1505
+ transform: translateX(-50%) translateY(5px);
1506
+ padding: 7px 12px;
1507
+ border-radius: 11px;
1508
+ font-size: 12px;
1509
+ font-weight: 600;
1510
+ white-space: nowrap;
1511
+ opacity: 0;
1512
+ pointer-events: none;
1513
+ transition: .25s var(--lg-ease-spring);
1514
+ }
1515
+ .tip-wrap:hover .tip,
1516
+ .tip-wrap:focus-within .tip { opacity: 1; transform: translateX(-50%) translateY(0); }
1517
+
1518
+ /* 弹窗:regular + 背景压暗,适合文字密集内容 */
1519
+ dialog.alert {
1520
+ margin: auto; /* 抵消全局 reset,恢复原生 dialog 居中 */
1521
+ width: min(330px, calc(100vw - 48px));
1522
+ padding: 28px 26px 20px;
1523
+ border: 1px solid transparent;
1524
+ border-radius: 20px; /* overlay 档圆角 */
1525
+ text-align: center;
1526
+ color: var(--lg-ink);
1527
+ background:
1528
+ linear-gradient(rgba(255, 255, 255, .80), rgba(255, 255, 255, .62)) padding-box,
1529
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
1530
+ -webkit-backdrop-filter: blur(24px) saturate(180%);
1531
+ backdrop-filter: blur(24px) saturate(180%);
1532
+ box-shadow:
1533
+ inset 0 1px 0 var(--lg-highlight),
1534
+ 0 1px 2px var(--lg-drop),
1535
+ 0 30px 70px -20px rgba(22, 28, 45, .55);
1536
+ }
1537
+ dialog.alert::backdrop {
1538
+ background: rgba(30, 35, 50, .18);
1539
+ -webkit-backdrop-filter: blur(6px);
1540
+ backdrop-filter: blur(6px);
1541
+ }
1542
+ dialog.alert h3 { margin-bottom: 8px; font-size: 17px; font-weight: 700; letter-spacing: 0; }
1543
+ dialog.alert p { margin-bottom: 20px; font-size: 13px; color: var(--lg-ink-2); }
1544
+ dialog.alert .acts { display: flex; gap: 9px; }
1545
+ dialog.alert .acts .btn { flex: 1; }
1546
+ [data-theme="dark"] dialog.alert {
1547
+ background:
1548
+ linear-gradient(rgba(28, 30, 38, .88), rgba(22, 24, 30, .84)) padding-box,
1549
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
1550
+ }
1551
+
1552
+ /* ============================================================
1553
+ 07b 扩展组件
1554
+ ---- 上传区 / 轮播指示点 / 命令面板 / 日期选择 / 头像 ----
1555
+ ============================================================ */
1556
+
1557
+ /* 上传拖放区:虚线描边而非玻璃,避免和容器抢材质 */
1558
+ .dropzone {
1559
+ display: flex;
1560
+ flex-direction: column;
1561
+ align-items: center;
1562
+ gap: 3px;
1563
+ width: 100%;
1564
+ padding: 20px 18px;
1565
+ border-radius: var(--lg-radius-md);
1566
+ border: 1.5px dashed rgba(60, 60, 67, .22);
1567
+ background: rgba(255, 255, 255, .3);
1568
+ text-align: center;
1569
+ cursor: pointer;
1570
+ transition: border-color .2s, background .2s;
1571
+ }
1572
+ .dropzone:hover,
1573
+ .dropzone.is-over {
1574
+ border-color: var(--lg-blue);
1575
+ background: rgba(10, 132, 255, .06);
1576
+ }
1577
+ .dropzone .dz-ico {
1578
+ display: grid;
1579
+ place-items: center;
1580
+ width: 38px;
1581
+ height: 38px;
1582
+ margin-bottom: 5px;
1583
+ border-radius: 12px;
1584
+ font-size: 17px;
1585
+ color: var(--lg-blue-deep);
1586
+ background: rgba(10, 132, 255, .12);
1587
+ }
1588
+ .dropzone b { font-size: 12.5px; font-weight: 600; }
1589
+ .dropzone small { font-size: 11px; color: var(--lg-ink-2); }
1590
+ .dropzone .dz-files { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
1591
+ .dz-file {
1592
+ display: inline-flex;
1593
+ align-items: center;
1594
+ gap: 6px;
1595
+ padding: 5px 8px;
1596
+ border-radius: 9px;
1597
+ background: rgba(255, 255, 255, .62);
1598
+ border: 1px solid rgba(255, 255, 255, .7);
1599
+ font-size: 10.5px;
1600
+ font-weight: 600;
1601
+ }
1602
+ .dz-file i { font-style: normal; color: var(--lg-ink-3); font-size: 9px; }
1603
+ [data-theme="dark"] .dropzone { border-color: rgba(255, 255, 255, .18); background: rgba(255, 255, 255, .03); }
1604
+ [data-theme="dark"] .dz-file { background: rgba(255, 255, 255, .08); border-color: rgba(255, 255, 255, .1); }
1605
+
1606
+ /* 轮播 / 分页指示点:选中态拉长成胶囊 */
1607
+ .dots { display: flex; align-items: center; gap: 6px; }
1608
+ .dots button {
1609
+ width: 7px;
1610
+ height: 7px;
1611
+ padding: 0;
1612
+ border: none;
1613
+ border-radius: 50%;
1614
+ background: rgba(29, 29, 31, .22);
1615
+ cursor: pointer;
1616
+ transition: width .25s var(--lg-ease-spring), background .25s;
1617
+ }
1618
+ .dots button.on { width: 20px; border-radius: 4px; background: var(--lg-ink); }
1619
+ .dots.light button { background: rgba(255, 255, 255, .45); }
1620
+ .dots.light button.on { background: #fff; }
1621
+ [data-theme="dark"] .dots button { background: rgba(255, 255, 255, .26); }
1622
+ [data-theme="dark"] .dots button.on { background: #f5f5f7; }
1623
+
1624
+ /* 命令面板:⌘K 搜索 + 分组 + 键盘选中 */
1625
+ .cmdk {
1626
+ display: flex;
1627
+ flex-direction: column;
1628
+ gap: 1px;
1629
+ width: 100%;
1630
+ padding: 7px;
1631
+ border-radius: var(--lg-radius-md);
1632
+ }
1633
+ .cmdk .ck-in {
1634
+ display: flex;
1635
+ align-items: center;
1636
+ gap: 9px;
1637
+ padding: 8px 10px 10px;
1638
+ margin-bottom: 4px;
1639
+ border-bottom: 1px solid rgba(60, 60, 67, .1);
1640
+ }
1641
+ .cmdk .ck-in input {
1642
+ flex: 1;
1643
+ min-width: 0;
1644
+ border: none;
1645
+ background: transparent;
1646
+ font: inherit;
1647
+ font-size: 13px;
1648
+ color: var(--lg-ink);
1649
+ outline: none;
1650
+ }
1651
+ .cmdk .ck-in input::placeholder { color: var(--lg-ink-3); }
1652
+ .cmdk kbd {
1653
+ padding: 2px 5px;
1654
+ border-radius: 5px;
1655
+ background: rgba(120, 120, 128, .14);
1656
+ font-family: ui-monospace, Menlo, monospace;
1657
+ font-size: 9.5px;
1658
+ color: var(--lg-ink-2);
1659
+ }
1660
+ .cmdk .ck-g {
1661
+ padding: 7px 10px 4px;
1662
+ font-size: 9.5px;
1663
+ font-weight: 700;
1664
+ letter-spacing: .9px;
1665
+ text-transform: uppercase;
1666
+ color: var(--lg-ink-3);
1667
+ }
1668
+ .cmdk .ck-i {
1669
+ display: flex;
1670
+ align-items: center;
1671
+ gap: 9px;
1672
+ padding: 8px 10px;
1673
+ border-radius: var(--lg-radius-xs);
1674
+ font-size: 12.5px;
1675
+ color: var(--lg-ink);
1676
+ cursor: pointer;
1677
+ transition: background .2s, transform .2s var(--lg-ease-spring), box-shadow .2s;
1678
+ }
1679
+ .cmdk .ck-i > span:first-child { width: 16px; text-align: center; color: var(--lg-ink-2); }
1680
+ .cmdk .ck-i .k {
1681
+ margin-left: auto;
1682
+ font-family: ui-monospace, Menlo, monospace;
1683
+ font-size: 10px;
1684
+ color: var(--lg-ink-3);
1685
+ }
1686
+ /* 对齐参考站:hover 淡灰(accent)、按压 .98 + 内阴影 */
1687
+ .cmdk .ck-i:hover,
1688
+ .cmdk .ck-i.on { background: rgba(120, 120, 128, .14); }
1689
+ .cmdk .ck-i:active {
1690
+ background: rgba(120, 120, 128, .22);
1691
+ transform: scale(.98);
1692
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, .12);
1693
+ }
1694
+ [data-theme="dark"] .cmdk .ck-in { border-bottom-color: rgba(255, 255, 255, .1); }
1695
+ [data-theme="dark"] .cmdk .ck-i:hover,
1696
+ [data-theme="dark"] .cmdk .ck-i.on { background: rgba(255, 255, 255, .1); }
1697
+ [data-theme="dark"] .cmdk .ck-i:active {
1698
+ background: rgba(255, 255, 255, .16);
1699
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, .3);
1700
+ }
1701
+
1702
+ /* 日期选择 */
1703
+ .datepicker { width: 254px; padding: 11px; border-radius: var(--lg-radius-md); }
1704
+ .dp-head {
1705
+ display: flex;
1706
+ align-items: center;
1707
+ justify-content: space-between;
1708
+ margin-bottom: 7px;
1709
+ padding: 0 2px;
1710
+ font-size: 12.5px;
1711
+ font-weight: 700;
1712
+ }
1713
+ .dp-head button {
1714
+ display: grid;
1715
+ place-items: center;
1716
+ width: 26px;
1717
+ height: 26px;
1718
+ border: none;
1719
+ border-radius: 8px;
1720
+ background: transparent;
1721
+ color: var(--lg-ink-2);
1722
+ font-size: 13px;
1723
+ cursor: pointer;
1724
+ transition: background .2s;
1725
+ }
1726
+ .dp-head button:hover { background: rgba(120, 120, 128, .14); }
1727
+ .dp-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px; text-align: center; }
1728
+ .dp-grid .dw { padding: 3px 0 4px; font-size: 9px; font-weight: 700; color: var(--lg-ink-3); }
1729
+ .dp-grid button {
1730
+ height: 28px;
1731
+ border: none;
1732
+ border-radius: 8px;
1733
+ background: transparent;
1734
+ font: inherit;
1735
+ font-size: 11.5px;
1736
+ color: var(--lg-ink);
1737
+ cursor: pointer;
1738
+ transition: background .18s, color .18s, transform .2s var(--lg-ease-spring), box-shadow .2s;
1739
+ }
1740
+ .dp-grid button:hover { background: rgba(120, 120, 128, .14); }
1741
+ .dp-grid button:active {
1742
+ background: rgba(120, 120, 128, .22);
1743
+ transform: scale(.94);
1744
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, .10);
1745
+ }
1746
+ .dp-grid button.mute { color: var(--lg-ink-3); }
1747
+ .dp-grid button.today { box-shadow: inset 0 0 0 1.5px var(--lg-blue); color: var(--lg-blue-deep); font-weight: 700; }
1748
+ .dp-grid button.on {
1749
+ background: var(--lg-blue);
1750
+ color: #fff;
1751
+ font-weight: 700;
1752
+ box-shadow: 0 3px 8px -2px rgba(10, 132, 255, .6);
1753
+ }
1754
+ [data-theme="dark"] .dp-grid button:hover { background: rgba(255, 255, 255, .1); }
1755
+ [data-theme="dark"] .dp-grid button.today { color: #8cc4ff; }
1756
+
1757
+ /* 头像(带在线状态点) */
1758
+ .avatar {
1759
+ position: relative;
1760
+ display: inline-grid;
1761
+ place-items: center;
1762
+ width: 36px;
1763
+ height: 36px;
1764
+ flex: none;
1765
+ border-radius: 50%;
1766
+ font-size: 13px;
1767
+ font-weight: 600;
1768
+ color: #fff;
1769
+ background: linear-gradient(140deg, #5ac8fa, #0a84ff);
1770
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .4);
1771
+ }
1772
+ .avatar.lg { width: 56px; height: 56px; font-size: 20px; }
1773
+ .avatar .st {
1774
+ position: absolute;
1775
+ right: -1px;
1776
+ bottom: -1px;
1777
+ width: 10px;
1778
+ height: 10px;
1779
+ border-radius: 50%;
1780
+ background: var(--lg-green);
1781
+ box-shadow: 0 0 0 2px #fff;
1782
+ }
1783
+ .avatar .st.away { background: var(--lg-orange); }
1784
+ .avatar .st.off { background: var(--lg-ink-3); }
1785
+ [data-theme="dark"] .avatar .st { box-shadow: 0 0 0 2px #14161c; }
1786
+
1787
+ /* ============================================================
1788
+ 07d 明暗切换圆钮
1789
+ ---- 图标由 glass.js 注入 SVG(太阳 / 月亮),不用字符 ----
1790
+ ============================================================ */
1791
+ .theme-toggle {
1792
+ display: grid;
1793
+ place-items: center;
1794
+ width: 38px;
1795
+ height: 38px;
1796
+ flex: none;
1797
+ margin-left: 4px;
1798
+ padding: 0;
1799
+ border: 1px solid transparent;
1800
+ border-radius: 50%;
1801
+ background:
1802
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
1803
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
1804
+ color: var(--lg-ink);
1805
+ cursor: pointer;
1806
+ box-shadow: inset 0 1px 0 var(--lg-highlight), 0 2px 6px rgba(22, 28, 45, .12);
1807
+ transition: transform .3s var(--lg-ease-spring), background .3s, border-color .3s;
1808
+ }
1809
+ .theme-toggle svg { display: block; width: 16px; height: 16px; }
1810
+ .theme-toggle:hover { transform: scale(1.06); }
1811
+
1812
+
1813
+ /* ============================================================
1814
+ 08 无障碍、降级与打印
1815
+ ============================================================ */
1816
+
1817
+ /* 键盘焦点:只在键盘导航时出现,不干扰鼠标 */
1818
+ :focus-visible {
1819
+ outline: 2.5px solid rgba(10, 132, 255, .9);
1820
+ outline-offset: 2px;
1821
+ }
1822
+ .btn:focus-visible,
1823
+ .fab:focus-visible { outline-offset: 3px; }
1824
+
1825
+ /* 减少动效 */
1826
+ @media (prefers-reduced-motion: reduce) {
1827
+ *,
1828
+ *::before,
1829
+ *::after {
1830
+ animation-duration: .001ms !important;
1831
+ animation-iteration-count: 1 !important;
1832
+ transition-duration: .001ms !important;
1833
+ scroll-behavior: auto !important;
1834
+ }
1835
+ }
1836
+
1837
+ /* 减少透明度:系统级无障碍设置,直接退回不透明底 */
1838
+ @media (prefers-reduced-transparency: reduce) {
1839
+ .glass,
1840
+ .glass.thin,
1841
+ .glass.clear,
1842
+ .btn,
1843
+ .field,
1844
+ .searchbar,
1845
+ .selectbox select,
1846
+ .ta,
1847
+ .seg,
1848
+ .chip,
1849
+ .badge,
1850
+ .banner {
1851
+ -webkit-backdrop-filter: none !important;
1852
+ backdrop-filter: none !important;
1853
+ background: #f7f7fa !important;
1854
+ }
1855
+ [data-theme="dark"] .glass,
1856
+ [data-theme="dark"] .btn,
1857
+ [data-theme="dark"] .field { background: #1b1d24 !important; }
1858
+ }
1859
+
1860
+ /* 不支持 backdrop-filter:用高不透明度底保证可读性,而不是让文字糊掉 */
1861
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
1862
+ .glass,
1863
+ .btn,
1864
+ .field,
1865
+ .searchbar,
1866
+ .chip,
1867
+ .badge {
1868
+ background: rgba(255, 255, 255, .93);
1869
+ }
1870
+ [data-theme="dark"] .glass { background: rgba(28, 30, 38, .96); }
1871
+ }
1872
+
1873
+ /* 打印:玻璃一律转白底黑字 */
1874
+ @media print {
1875
+ .glass,
1876
+ .btn,
1877
+ .field,
1878
+ .chip,
1879
+ .badge {
1880
+ -webkit-backdrop-filter: none !important;
1881
+ backdrop-filter: none !important;
1882
+ background: #fff !important;
1883
+ box-shadow: none !important;
1884
+ border: 1px solid #ddd !important;
1885
+ }
1886
+ .fab,
1887
+ .toast-zone { display: none !important; }
1888
+ }
1889
+
1890
+ /* ============================================================
1891
+ 07c 时间线与步骤条
1892
+ ---- 两端通用:订单进度、审批流、发布状态 ----
1893
+ ============================================================ */
1894
+ .tl { display: flex; flex-direction: column; width: 100%; }
1895
+ .tl-row { position: relative; display: flex; gap: 11px; padding-bottom: 15px; }
1896
+ .tl-row:last-child { padding-bottom: 0; }
1897
+ .tl-row::before {
1898
+ content: "";
1899
+ position: absolute;
1900
+ left: 8.5px;
1901
+ top: 20px;
1902
+ bottom: 0;
1903
+ width: 1.5px;
1904
+ background: rgba(60, 60, 67, .13);
1905
+ }
1906
+ [data-theme="dark"] .tl-row::before { background: rgba(255, 255, 255, .1); }
1907
+ .tl-row:last-child::before { display: none; }
1908
+ .tl-dot {
1909
+ flex: none;
1910
+ width: 18px;
1911
+ height: 18px;
1912
+ margin-top: 1px;
1913
+ border: 2px solid rgba(255, 255, 255, .9);
1914
+ border-radius: 50%;
1915
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .18);
1916
+ }
1917
+ .tl-txt { font-size: 12.5px; font-weight: 600; line-height: 1.35; }
1918
+ .tl-txt small { display: block; margin-top: 2px; font-size: 10.5px; font-weight: 500; color: var(--lg-ink-2); }
1919
+
1920
+ /* ============================================================
1921
+ 步骤条
1922
+ ============================================================ */
1923
+ .steps { display: flex; align-items: center; width: 100%; }
1924
+ .stp { display: flex; align-items: center; gap: 8px; flex: none; }
1925
+ .stp .b {
1926
+ display: grid;
1927
+ place-items: center;
1928
+ width: 26px;
1929
+ height: 26px;
1930
+ border: 1px solid rgba(255, 255, 255, .82);
1931
+ border-radius: 50%;
1932
+ background: rgba(255, 255, 255, .5);
1933
+ box-shadow: inset 0 1px .5px var(--lg-sheen);
1934
+ font-size: 11px;
1935
+ font-weight: 700;
1936
+ color: var(--lg-ink-2);
1937
+ }
1938
+ .stp .lab { font-size: 11.5px; font-weight: 600; color: var(--lg-ink-3); white-space: nowrap; }
1939
+ .stp.done .b {
1940
+ color: #fff;
1941
+ border-color: rgba(255, 255, 255, .65);
1942
+ background: linear-gradient(135deg, var(--lg-green), #28a745);
1943
+ }
1944
+ .stp.now .b {
1945
+ color: #fff;
1946
+ border-color: rgba(255, 255, 255, .65);
1947
+ background: linear-gradient(135deg, var(--lg-blue), var(--lg-blue-deep));
1948
+ box-shadow:
1949
+ inset 0 1px .5px rgba(255, 255, 255, .7),
1950
+ 0 4px 10px -3px rgba(10, 132, 255, .6);
1951
+ }
1952
+ .stp.done .lab,
1953
+ .stp.now .lab { color: var(--lg-ink); }
1954
+ .stp-line { flex: 1; height: 2px; margin: 0 9px; border-radius: 1px; background: rgba(60, 60, 67, .14); }
1955
+ .stp-line.fill { background: linear-gradient(90deg, var(--lg-green), var(--lg-blue)); }
1956
+
1957
+ /* 下拉菜单(全站统一:docs / web / 模板顶栏) */
1958
+ .dd { position: relative; display: inline-block; }
1959
+ .dd .menu {
1960
+ position: absolute;
1961
+ top: calc(100% + 8px);
1962
+ left: 0;
1963
+ z-index: 30;
1964
+ display: none;
1965
+ min-width: 210px;
1966
+ padding: 6px;
1967
+ border-radius: 16px;
1968
+ }
1969
+ .dd:hover .menu,
1970
+ .dd:focus-within .menu { display: block; animation: lg-menu-in .22s var(--lg-ease-out); }
1971
+ .dd.right .menu { left: auto; right: 0; }
1972
+ @keyframes lg-menu-in {
1973
+ from { opacity: 0; transform: translateY(-6px) scale(.98); }
1974
+ }
1975
+ .dd .mi {
1976
+ display: flex;
1977
+ align-items: center;
1978
+ gap: 9px;
1979
+ width: 100%;
1980
+ padding: 9px 11px;
1981
+ border: none;
1982
+ border-radius: 10px;
1983
+ background: transparent;
1984
+ font-size: 12.5px;
1985
+ font-weight: 500;
1986
+ text-align: left;
1987
+ color: var(--lg-ink);
1988
+ cursor: pointer;
1989
+ font-family: inherit;
1990
+ }
1991
+ .dd .mi:hover { background: rgba(255, 255, 255, .6); }
1992
+ .dd .mi .k { margin-left: auto; font-size: 10.5px; color: var(--lg-ink-3); }
1993
+ .dd .mi.danger { color: var(--lg-red); }
1994
+ .dd .sep-line { height: 1px; margin: 5px 8px; background: rgba(60, 60, 67, .12); }
1995
+ [data-theme="dark"] .dd .mi:hover { background: rgba(255, 255, 255, .1); }
1996
+
1997
+ /* ============================================================
1998
+ 07e 站点顶栏(全站页面共用的浮动玻璃胶囊)
1999
+ ---- 原 glass-web.css 定义,因所有页面都要用而提升至此 ----
2000
+ ============================================================ */
2001
+ .topbar-web {
2002
+ position: sticky;
2003
+ top: 10px;
2004
+ z-index: var(--lg-z-sticky);
2005
+ display: flex;
2006
+ align-items: center;
2007
+ gap: 10px;
2008
+ width: min(1120px, calc(100% - 40px));
2009
+ max-width: calc(100% - 40px);
2010
+ margin: 10px auto 0;
2011
+ padding: 0 10px 0 16px;
2012
+ height: 56px;
2013
+ min-height: 56px;
2014
+ border-radius: 28px;
2015
+ box-sizing: border-box;
2016
+ }
2017
+ .topbar-web .topbar-actions {
2018
+ display: flex;
2019
+ align-items: center;
2020
+ gap: 8px;
2021
+ flex-shrink: 0;
2022
+ }
2023
+ .topbar-web .brand {
2024
+ display: flex;
2025
+ align-items: center;
2026
+ gap: 9px;
2027
+ font-size: 14px;
2028
+ font-weight: 700;
2029
+ letter-spacing: -.2px;
2030
+ text-decoration: none;
2031
+ color: var(--lg-ink);
2032
+ }
2033
+ .topbar-web .brand .mark {
2034
+ width: 22px;
2035
+ height: 22px;
2036
+ flex: none;
2037
+ border-radius: 7px;
2038
+ background: conic-gradient(from 210deg, var(--lg-blue), var(--lg-purple), var(--lg-red), var(--lg-orange), var(--lg-green), var(--lg-blue));
2039
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .6), 0 2px 6px rgba(0, 0, 0, .15);
2040
+ }
2041
+ /* 导航:无外层轨道,仅选中项透明玻璃胶囊(对齐 Glass UI) */
2042
+ .topbar-web nav[data-site-nav] {
2043
+ margin-left: auto;
2044
+ display: flex;
2045
+ align-items: center;
2046
+ gap: 4px;
2047
+ padding: 0;
2048
+ border: none;
2049
+ background: none;
2050
+ box-shadow: none;
2051
+ }
2052
+ .topbar-web nav[data-site-nav] a {
2053
+ position: relative;
2054
+ padding: 6px 13px;
2055
+ border-radius: 999px;
2056
+ border: 1px solid transparent;
2057
+ font-size: 13px;
2058
+ font-weight: 500;
2059
+ color: var(--lg-ink-2);
2060
+ text-decoration: none;
2061
+ transition:
2062
+ color .22s var(--lg-ease-out),
2063
+ background .28s var(--lg-ease-out),
2064
+ border-color .28s var(--lg-ease-out),
2065
+ box-shadow .28s var(--lg-ease-out),
2066
+ transform .35s var(--lg-ease-spring);
2067
+ }
2068
+ .topbar-web nav[data-site-nav] a:hover {
2069
+ color: var(--lg-ink);
2070
+ background: rgba(255, 255, 255, .18);
2071
+ }
2072
+ .topbar-web nav[data-site-nav] a.on {
2073
+ color: var(--lg-ink);
2074
+ font-weight: 600;
2075
+ border-color: rgba(255, 255, 255, .32);
2076
+ background: linear-gradient(180deg, rgba(255, 255, 255, .26) 0%, rgba(255, 255, 255, .08) 100%);
2077
+ -webkit-backdrop-filter: blur(12px) saturate(160%);
2078
+ backdrop-filter: blur(12px) saturate(160%);
2079
+ box-shadow:
2080
+ inset 0 1px 0 rgba(255, 255, 255, .55),
2081
+ 0 1px 2px rgba(15, 23, 42, .06);
2082
+ }
2083
+ [data-theme="dark"] .topbar-web nav[data-site-nav] a:hover {
2084
+ background: rgba(255, 255, 255, .07);
2085
+ }
2086
+ [data-theme="dark"] .topbar-web nav[data-site-nav] a.on {
2087
+ border-color: rgba(255, 255, 255, .18);
2088
+ background: linear-gradient(180deg, rgba(255, 255, 255, .12) 0%, rgba(255, 255, 255, .04) 100%);
2089
+ box-shadow:
2090
+ inset 0 1px 0 rgba(255, 255, 255, .22),
2091
+ 0 1px 2px rgba(0, 0, 0, .15);
2092
+ }
2093
+ .topbar-web.is-scrolled {
2094
+ background: linear-gradient(135deg, rgba(255, 255, 255, .82), rgba(255, 255, 255, .66));
2095
+ box-shadow:
2096
+ inset 0 1.5px .5px -.5px var(--lg-sheen),
2097
+ 0 1px 2px rgba(0, 0, 0, .06),
2098
+ 0 18px 40px -20px rgba(22, 28, 45, .45);
2099
+ }
2100
+ [data-theme="dark"] .topbar-web.is-scrolled {
2101
+ background: linear-gradient(135deg, rgba(40, 43, 52, .9), rgba(26, 28, 35, .86));
2102
+ }
2103
+
2104
+ /* 页面标签(如「使用文档 · v1.1」) */
2105
+ .topbar-web .tag {
2106
+ padding: 4px 10px;
2107
+ border: 1px solid var(--lg-line);
2108
+ border-radius: 10px;
2109
+ background: rgba(120, 120, 128, .08);
2110
+ font-size: 11px;
2111
+ font-weight: 600;
2112
+ color: var(--lg-ink-2);
2113
+ white-space: nowrap;
2114
+ }
2115
+ [data-theme="dark"] .topbar-web .tag { background: rgba(255, 255, 255, .06); border-color: rgba(255, 255, 255, .12); }
2116
+
2117
+ /* 窄屏收起菜单,保留品牌与主题钮 */
2118
+ @media (max-width: 760px) {
2119
+ .topbar-web nav[data-site-nav] { display: none; }
2120
+ }
2121
+
2122
+ /* ============================================================
2123
+ 07f 全站页面切换(site-topbar.js · 淡入淡出,避免与 VT 叠层)
2124
+ ============================================================ */
2125
+ @keyframes lg-page-in {
2126
+ from { opacity: 0; transform: translateY(10px) scale(.992); filter: blur(8px); }
2127
+ to { opacity: 1; transform: none; filter: none; }
2128
+ }
2129
+ @keyframes lg-page-out {
2130
+ from { opacity: 1; transform: none; filter: none; }
2131
+ to { opacity: 0; transform: translateY(-6px) scale(.996); filter: blur(5px); }
2132
+ }
2133
+ body.lg-page-enter > header.topbar-web,
2134
+ body.lg-page-enter > main,
2135
+ body.lg-page-enter > .wrap,
2136
+ body.lg-page-enter > .admin-shell {
2137
+ animation: lg-page-in .48s var(--lg-ease-out) both;
2138
+ }
2139
+ body.lg-page-leave > header.topbar-web,
2140
+ body.lg-page-leave > main,
2141
+ body.lg-page-leave > .wrap,
2142
+ body.lg-page-leave > .admin-shell {
2143
+ animation: lg-page-out .26s var(--lg-ease-out) both;
2144
+ }
2145
+ @media (prefers-reduced-motion: reduce) {
2146
+ body.lg-page-enter > header.topbar-web,
2147
+ body.lg-page-enter > main,
2148
+ body.lg-page-enter > .wrap,
2149
+ body.lg-page-enter > .admin-shell,
2150
+ body.lg-page-leave > header.topbar-web,
2151
+ body.lg-page-leave > main,
2152
+ body.lg-page-leave > .wrap,
2153
+ body.lg-page-leave > .admin-shell { animation: none; }
2154
+ }
2155
+
2156
+ /* 顶栏 8 项 + 标签:中等宽度略收紧,避免挤破胶囊 */
2157
+ @media (max-width: 980px) {
2158
+ .topbar-web nav[data-site-nav] a {
2159
+ padding: 6px 10px;
2160
+ font-size: 12.5px;
2161
+ }
2162
+ .topbar-web .tag { display: none; }
2163
+ }
2164
+
2165
+ /* ============================================================
2166
+ 07c 迷你控制中心(营销页 hero 可玩演示)
2167
+ 开关列表 / 天气 / 正在播放 / 信息气泡 / 悬浮 Dock
2168
+ ============================================================ */
2169
+ .hero-cc { width: min(620px, 100%); margin: 48px auto 0; display: grid; gap: 12px; }
2170
+ .cc-grid { display: grid; grid-template-columns: 1.3fr 1fr; gap: 12px; }
2171
+ .cc-card { border-radius: 28px; padding: 16px; text-align: left; }
2172
+ .cc-row { display: flex; align-items: center; gap: 11px; padding: 8px 0; }
2173
+ .cc-row + .cc-row { border-top: .5px solid rgba(120, 120, 128, .22); }
2174
+ .cc-ico {
2175
+ width: 30px; height: 30px; border-radius: 9px; flex: none;
2176
+ display: grid; place-items: center; font-size: 14px; color: #fff;
2177
+ box-shadow: inset 0 1px .5px rgba(255, 255, 255, .6), 0 2px 5px -1px rgba(22, 28, 45, .35);
2178
+ }
2179
+ .cc-row b { flex: 1; font-size: 14px; font-weight: 600; }
2180
+ .cc-card h4 { font-size: 12.5px; font-weight: 700; color: var(--lg-ink-2); margin: 0 0 7px; }
2181
+ .cc-weather .deg { font-size: 42px; font-weight: 300; letter-spacing: -1.5px; line-height: 1.15; }
2182
+ .cc-weather span { display: block; font-size: 12.5px; color: var(--lg-ink-2); }
2183
+ .cc-now { display: grid; grid-template-columns: 54px 1fr auto; gap: 12px; align-items: center; }
2184
+ .cc-cover {
2185
+ width: 54px; height: 54px; border-radius: 14px; display: grid; place-items: center;
2186
+ font-size: 24px; color: #fff; background: linear-gradient(150deg, #6d7fa8, #46537a);
2187
+ box-shadow: inset 0 1.5px .5px -.5px rgba(255, 255, 255, .55), 0 6px 14px -4px rgba(40, 50, 90, .5);
2188
+ }
2189
+ .cc-now .tt b { display: block; font-size: 14px; }
2190
+ .cc-now .tt span { font-size: 12px; color: var(--lg-ink-2); }
2191
+ .cc-play {
2192
+ width: 40px; height: 40px; border-radius: 50%; border: 1px solid transparent;
2193
+ background:
2194
+ linear-gradient(var(--lg-wash), var(--lg-wash)) padding-box,
2195
+ linear-gradient(135deg, var(--lg-rim-hi), var(--lg-rim-lo) 35%, var(--lg-rim-lo) 65%, var(--lg-rim-hi)) border-box;
2196
+ color: var(--lg-ink); font-size: 14px; cursor: pointer;
2197
+ -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
2198
+ backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-sat));
2199
+ box-shadow: inset 0 1px 0 var(--lg-highlight), 0 1px 2px var(--lg-drop);
2200
+ transition: transform .45s var(--lg-ease-spring);
2201
+ }
2202
+ .cc-play:active { transform: scale(1.04, .96); }
2203
+ .cc-msg p { font-size: 13.5px; line-height: 1.55; margin: 0; }
2204
+ .hero-dock { display: flex; justify-content: center; align-items: flex-end; gap: 10px; padding: 12px 16px; border-radius: 28px; }
2205
+ .dapp {
2206
+ width: 52px; height: 52px; border-radius: 14px; border: 1px solid rgba(255, 255, 255, .55);
2207
+ display: grid; place-items: center; font-size: 22px; color: #fff; cursor: pointer;
2208
+ box-shadow: inset 0 1px 1px rgba(255, 255, 255, .65), 0 4px 10px -3px rgba(0, 0, 0, .35);
2209
+ transition: transform .2s;
2210
+ }
2211
+ .dapp:hover { transform: scale(1.25); }
2212
+ .dapp:hover + .dapp { transform: scale(1.12); }
2213
+ .dapp:has(+ .dapp:hover) { transform: scale(1.12); }
2214
+ .dapp:active { transform: scale(1.04, .96); }
2215
+ .dapp.a1 { background: linear-gradient(150deg, #5ac8fa, #0a84ff); }
2216
+ .dapp.a2 { background: linear-gradient(150deg, #ffd60a, #ff9f0a); }
2217
+ .dapp.a3 { background: linear-gradient(150deg, #ff6482, #ff375f); }
2218
+ .dapp.a4 { background: linear-gradient(150deg, #bf5af2, #7d3cf0); }
2219
+ .dapp.a5 { background: linear-gradient(150deg, #4cd964, #28a745); }
2220
+ .cc-grid > .cc-card { animation: lg-cc-pop .6s var(--lg-ease-spring) backwards; }
2221
+ .cc-grid > :nth-child(1) { animation-delay: .05s; }
2222
+ .cc-grid > :nth-child(2) { animation-delay: .13s; }
2223
+ .cc-grid > :nth-child(3) { animation-delay: .21s; }
2224
+ .cc-grid > :nth-child(4) { animation-delay: .29s; }
2225
+ .hero-dock { animation: lg-cc-pop .6s var(--lg-ease-spring) .38s backwards; }
2226
+ @keyframes lg-cc-pop { from { opacity: 0; transform: translateY(18px) scale(.9); } }
2227
+ @media (prefers-reduced-motion: reduce) { .cc-grid > .cc-card, .hero-dock { animation: none; } }
2228
+ @media (max-width: 640px) { .cc-grid { grid-template-columns: 1fr; } }