@jungherz-de/glasskit 1.3.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.
package/glasskit.css ADDED
@@ -0,0 +1,1267 @@
1
+ /* ============================================================
2
+ GLASSKIT COMPONENT LIBRARY
3
+ Jungherz GmbH – v1.3
4
+
5
+ Features:
6
+ - Scoped Reset (box-sizing Fix)
7
+ - Dark Mode (Standard)
8
+ - Light Mode via [data-theme="light"]
9
+ - 22 Komponenten
10
+ ============================================================ */
11
+
12
+
13
+ /* ============================================================
14
+ 0. SCOPED RESET
15
+ ============================================================ */
16
+ [class*="glass-"],
17
+ [class*="glass-"]::before,
18
+ [class*="glass-"]::after,
19
+ [class*="gl-"] {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+
24
+ /* ============================================================
25
+ 1. DESIGN TOKENS – DARK MODE (Standard)
26
+ ============================================================ */
27
+ :root,
28
+ [data-theme="dark"] {
29
+ /* ---- Farben ---- */
30
+ --gl-color-primary: #f5a623;
31
+ --gl-color-primary-dark: #d4692a;
32
+ --gl-color-primary-mid: #e07a24;
33
+ --gl-color-bg-dark: #0e2530;
34
+ --gl-color-bg-mid: #1a3d4e;
35
+ --gl-color-bg-light: #1b3e50;
36
+ --gl-color-text: #ffffff;
37
+ --gl-color-text-muted: rgba(255, 255, 255, 0.60);
38
+ --gl-color-text-on-light: #1a3a4a;
39
+ --gl-color-text-heading: #ffffff;
40
+ --gl-color-success: #34c759;
41
+ --gl-color-error: #ff3b30;
42
+ --gl-color-warning: #ffcc00;
43
+
44
+ /* ---- Glas-Oberflächen ---- */
45
+ --gl-surface-1: rgba(255, 255, 255, 0.08);
46
+ --gl-surface-2: rgba(255, 255, 255, 0.10);
47
+ --gl-surface-3: rgba(255, 255, 255, 0.14);
48
+ --gl-surface-4: rgba(255, 255, 255, 0.16);
49
+ --gl-surface-5: rgba(255, 255, 255, 0.22);
50
+ --gl-surface-milk: rgba(255, 255, 255, 0.55);
51
+ --gl-surface-milk-strong: rgba(255, 255, 255, 0.75);
52
+ --gl-surface-overlay: rgba(0, 0, 0, 0.50);
53
+
54
+ /* Card Glow Gradient */
55
+ --gl-card-glow-top: rgba(255, 255, 255, 0.32);
56
+ --gl-card-glow-mid: rgba(255, 255, 255, 0.22);
57
+ --gl-card-glow-low: rgba(255, 255, 255, 0.14);
58
+ --gl-card-glow-bottom: rgba(255, 255, 255, 0.08);
59
+
60
+ /* Card Text & Icons */
61
+ --gl-card-icon-color: rgba(255, 255, 255, 0.8);
62
+ --gl-card-text-color: rgba(255, 255, 255, 0.7);
63
+
64
+ /* ---- Borders ---- */
65
+ --gl-border-subtle: rgba(255, 255, 255, 0.18);
66
+ --gl-border-medium: rgba(255, 255, 255, 0.30);
67
+ --gl-border-strong: rgba(255, 255, 255, 0.40);
68
+ --gl-border-milk: rgba(255, 255, 255, 0.60);
69
+ --gl-border-warm: rgba(255, 200, 100, 0.35);
70
+ --gl-border-focus: rgba(245, 166, 35, 0.60);
71
+
72
+ /* ---- Icon-Farben ---- */
73
+ --gl-icon-default: rgba(255, 255, 255, 0.6);
74
+ --gl-icon-muted: rgba(255, 255, 255, 0.45);
75
+ --gl-icon-strong: rgba(255, 255, 255, 0.8);
76
+ --gl-icon-on-primary: #ffffff;
77
+ --gl-icon-on-secondary: #1a3a4a;
78
+ --gl-icon-on-tertiary: rgba(255, 255, 255, 0.6);
79
+
80
+ /* ---- Blur ---- */
81
+ --gl-blur: 24px;
82
+ --gl-blur-light: 16px;
83
+ --gl-blur-soft: 12px;
84
+ --gl-blur-heavy: 40px;
85
+
86
+ /* ---- Radii ---- */
87
+ --gl-radius-pill: 50%;
88
+ --gl-radius-full: 9999px;
89
+ --gl-radius-card: 24px;
90
+ --gl-radius-btn: 16px;
91
+ --gl-radius-input: 14px;
92
+ --gl-radius-sm: 12px;
93
+ --gl-radius-xs: 8px;
94
+
95
+ /* ---- Shadows ---- */
96
+ --gl-shadow-card: 0 8px 32px rgba(0, 0, 0, 0.18);
97
+ --gl-shadow-btn: 0 4px 16px rgba(0, 0, 0, 0.12);
98
+ --gl-shadow-btn-primary: 0 6px 24px rgba(230, 130, 40, 0.35),
99
+ 0 2px 8px rgba(0, 0, 0, 0.15);
100
+ --gl-shadow-glow: 0 2px 12px rgba(255, 255, 255, 0.08),
101
+ 0 4px 16px rgba(0, 0, 0, 0.15);
102
+ --gl-shadow-modal: 0 24px 80px rgba(0, 0, 0, 0.4),
103
+ 0 8px 32px rgba(0, 0, 0, 0.2);
104
+ --gl-shadow-toast: 0 8px 32px rgba(0, 0, 0, 0.25);
105
+ --gl-shadow-focus: 0 0 0 3px rgba(245, 166, 35, 0.3);
106
+
107
+ /* ---- Inset Highlights ---- */
108
+ --gl-inset-subtle: inset 0 1px 1px rgba(255, 255, 255, 0.10);
109
+ --gl-inset-medium: inset 0 1px 1px rgba(255, 255, 255, 0.15);
110
+ --gl-inset-strong: inset 0 1px 2px rgba(255, 255, 255, 0.25);
111
+ --gl-inset-milk: inset 0 1px 2px rgba(255, 255, 255, 0.40);
112
+
113
+ /* ---- Hintergrund-Effekte ---- */
114
+ --gl-bg-aurora-1: rgba(60, 160, 160, 0.25);
115
+ --gl-bg-aurora-2: rgba(200, 140, 60, 0.12);
116
+ --gl-bg-aurora-3: rgba(80, 180, 200, 0.18);
117
+ --gl-bg-light-streak-1: rgba(90, 210, 200, 0.14);
118
+ --gl-bg-light-streak-2: rgba(110, 200, 190, 0.10);
119
+ --gl-bg-warm-glow: rgba(220, 160, 70, 0.10);
120
+
121
+ /* ---- Spacing ---- */
122
+ --gl-space-2xs: 4px;
123
+ --gl-space-xs: 8px;
124
+ --gl-space-sm: 12px;
125
+ --gl-space-md: 16px;
126
+ --gl-space-lg: 20px;
127
+ --gl-space-xl: 24px;
128
+ --gl-space-2xl: 32px;
129
+ --gl-space-3xl: 40px;
130
+ --gl-space-4xl: 56px;
131
+
132
+ /* ---- Typography ---- */
133
+ --gl-font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display',
134
+ 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
135
+ --gl-font-size-xs: 13px;
136
+ --gl-font-size-sm: 14px;
137
+ --gl-font-size-base: 15px;
138
+ --gl-font-size-btn: 16px;
139
+ --gl-font-size-lg: 18px;
140
+ --gl-font-size-title: 24px;
141
+ --gl-font-size-modal: 20px;
142
+ --gl-font-weight-normal: 400;
143
+ --gl-font-weight-medium: 500;
144
+ --gl-font-weight-semibold: 600;
145
+
146
+ /* ---- Transitions ---- */
147
+ --gl-transition: all 0.25s ease;
148
+ --gl-transition-fast: all 0.15s ease;
149
+ --gl-transition-modal: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
150
+
151
+ /* ---- Tab-Bar ---- */
152
+ --gl-tab-bar-height: 82px;
153
+
154
+ /* ---- Input Placeholder ---- */
155
+ --gl-placeholder: rgba(255, 255, 255, 0.35);
156
+
157
+ /* ---- Accordion ---- */
158
+ --gl-accordion-body-color: var(--gl-color-text-muted);
159
+
160
+ /* ---- Toggle (inaktiv) ---- */
161
+ --gl-toggle-thumb-bg: linear-gradient(to bottom,
162
+ rgba(255,255,255,0.9) 0%,
163
+ rgba(255,255,255,0.7) 100%);
164
+
165
+ /* ---- Range Track ---- */
166
+ --gl-range-track-bg: var(--gl-surface-2);
167
+ --gl-range-track-border: var(--gl-border-subtle);
168
+ }
169
+
170
+
171
+ /* ============================================================
172
+ 1b. DESIGN TOKENS – LIGHT MODE
173
+ ============================================================ */
174
+ [data-theme="light"] {
175
+ --gl-color-primary: #e8852d;
176
+ --gl-color-primary-dark: #c96a1e;
177
+ --gl-color-primary-mid: #d97826;
178
+ --gl-color-bg-dark: #e8ecf1;
179
+ --gl-color-bg-mid: #f0f4f8;
180
+ --gl-color-bg-light: #f5f7fa;
181
+ --gl-color-text: #1a2a36;
182
+ --gl-color-text-muted: rgba(26, 42, 54, 0.55);
183
+ --gl-color-text-on-light: #1a3a4a;
184
+ --gl-color-text-heading: #0f1f2a;
185
+ --gl-color-success: #28a745;
186
+ --gl-color-error: #dc3545;
187
+ --gl-color-warning: #e6a800;
188
+
189
+ --gl-surface-1: rgba(255, 255, 255, 0.50);
190
+ --gl-surface-2: rgba(255, 255, 255, 0.60);
191
+ --gl-surface-3: rgba(255, 255, 255, 0.70);
192
+ --gl-surface-4: rgba(255, 255, 255, 0.75);
193
+ --gl-surface-5: rgba(255, 255, 255, 0.85);
194
+ --gl-surface-milk: rgba(255, 255, 255, 0.85);
195
+ --gl-surface-milk-strong: rgba(255, 255, 255, 0.92);
196
+ --gl-surface-overlay: rgba(0, 0, 0, 0.25);
197
+
198
+ --gl-card-glow-top: rgba(255, 255, 255, 0.90);
199
+ --gl-card-glow-mid: rgba(255, 255, 255, 0.78);
200
+ --gl-card-glow-low: rgba(255, 255, 255, 0.65);
201
+ --gl-card-glow-bottom: rgba(255, 255, 255, 0.50);
202
+
203
+ --gl-card-icon-color: rgba(26, 42, 54, 0.5);
204
+ --gl-card-text-color: rgba(26, 42, 54, 0.6);
205
+
206
+ --gl-border-subtle: rgba(0, 0, 0, 0.08);
207
+ --gl-border-medium: rgba(0, 0, 0, 0.12);
208
+ --gl-border-strong: rgba(0, 0, 0, 0.15);
209
+ --gl-border-milk: rgba(0, 0, 0, 0.10);
210
+ --gl-border-warm: rgba(232, 133, 45, 0.30);
211
+ --gl-border-focus: rgba(232, 133, 45, 0.50);
212
+
213
+ --gl-icon-default: rgba(26, 42, 54, 0.50);
214
+ --gl-icon-muted: rgba(26, 42, 54, 0.35);
215
+ --gl-icon-strong: rgba(26, 42, 54, 0.70);
216
+ --gl-icon-on-primary: #ffffff;
217
+ --gl-icon-on-secondary: #1a3a4a;
218
+ --gl-icon-on-tertiary: rgba(26, 42, 54, 0.50);
219
+
220
+ --gl-shadow-card: 0 4px 20px rgba(0, 0, 0, 0.06);
221
+ --gl-shadow-btn: 0 2px 10px rgba(0, 0, 0, 0.06);
222
+ --gl-shadow-btn-primary: 0 4px 16px rgba(232, 133, 45, 0.25),
223
+ 0 2px 6px rgba(0, 0, 0, 0.08);
224
+ --gl-shadow-glow: 0 2px 8px rgba(0, 0, 0, 0.05),
225
+ 0 4px 12px rgba(0, 0, 0, 0.04);
226
+ --gl-shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.12),
227
+ 0 4px 16px rgba(0, 0, 0, 0.08);
228
+ --gl-shadow-toast: 0 4px 20px rgba(0, 0, 0, 0.10);
229
+ --gl-shadow-focus: 0 0 0 3px rgba(232, 133, 45, 0.25);
230
+
231
+ --gl-inset-subtle: inset 0 1px 1px rgba(255, 255, 255, 0.60);
232
+ --gl-inset-medium: inset 0 1px 1px rgba(255, 255, 255, 0.70);
233
+ --gl-inset-strong: inset 0 1px 2px rgba(255, 255, 255, 0.80);
234
+ --gl-inset-milk: inset 0 1px 2px rgba(255, 255, 255, 0.90);
235
+
236
+ --gl-bg-aurora-1: rgba(100, 200, 220, 0.15);
237
+ --gl-bg-aurora-2: rgba(240, 180, 100, 0.10);
238
+ --gl-bg-aurora-3: rgba(120, 200, 230, 0.12);
239
+ --gl-bg-light-streak-1: rgba(140, 230, 220, 0.10);
240
+ --gl-bg-light-streak-2: rgba(160, 220, 210, 0.08);
241
+ --gl-bg-warm-glow: rgba(240, 180, 100, 0.08);
242
+
243
+ --gl-placeholder: rgba(26, 42, 54, 0.30);
244
+ --gl-accordion-body-color: var(--gl-color-text-muted);
245
+ --gl-toggle-thumb-bg: linear-gradient(to bottom, #ffffff 0%, #f0f0f0 100%);
246
+ --gl-range-track-bg: var(--gl-surface-2);
247
+ --gl-range-track-border: var(--gl-border-subtle);
248
+ }
249
+
250
+
251
+ /* ============================================================
252
+ 2. HINTERGRUND
253
+ ============================================================ */
254
+ .glass-bg {
255
+ background:
256
+ radial-gradient(ellipse at 20% 40%, var(--gl-bg-aurora-1) 0%, transparent 55%),
257
+ radial-gradient(ellipse at 80% 65%, var(--gl-bg-aurora-2) 0%, transparent 50%),
258
+ radial-gradient(ellipse at 50% 20%, var(--gl-bg-aurora-3) 0%, transparent 50%),
259
+ linear-gradient(170deg,
260
+ var(--gl-color-bg-light) 0%,
261
+ var(--gl-color-bg-mid) 50%,
262
+ var(--gl-color-bg-dark) 100%
263
+ );
264
+ position: relative;
265
+ min-height: 100vh;
266
+ overflow-x: hidden;
267
+ font-family: var(--gl-font-family);
268
+ color: var(--gl-color-text);
269
+ -webkit-font-smoothing: antialiased;
270
+ transition: background 0.4s ease, color 0.3s ease;
271
+ }
272
+
273
+ .glass-bg::before {
274
+ content: '';
275
+ position: absolute;
276
+ top: 20%; left: -30%;
277
+ width: 160%; height: 55%;
278
+ background:
279
+ radial-gradient(ellipse at 35% 45%, var(--gl-bg-light-streak-1) 0%, transparent 50%),
280
+ radial-gradient(ellipse at 65% 55%, var(--gl-bg-light-streak-2) 0%, transparent 45%);
281
+ transform: rotate(-8deg);
282
+ pointer-events: none; z-index: 0;
283
+ }
284
+
285
+ .glass-bg::after {
286
+ content: '';
287
+ position: absolute;
288
+ top: 40%; right: -20%;
289
+ width: 70%; height: 50%;
290
+ background: radial-gradient(ellipse at center,
291
+ var(--gl-bg-warm-glow) 0%, transparent 65%
292
+ );
293
+ pointer-events: none; z-index: 0;
294
+ }
295
+
296
+ .glass-bg > * { position: relative; z-index: 1; }
297
+
298
+ .glass-bg--has-tab-bar {
299
+ padding-bottom: var(--gl-tab-bar-height);
300
+ }
301
+
302
+
303
+ /* ============================================================
304
+ 3. NAVIGATION
305
+ ============================================================ */
306
+ .glass-nav {
307
+ display: flex;
308
+ justify-content: space-between;
309
+ align-items: center;
310
+ padding: 0 var(--gl-space-xs);
311
+ }
312
+
313
+ .glass-pill {
314
+ width: 46px; height: 46px;
315
+ border-radius: var(--gl-radius-pill);
316
+ background: var(--gl-surface-3);
317
+ backdrop-filter: blur(var(--gl-blur));
318
+ -webkit-backdrop-filter: blur(var(--gl-blur));
319
+ border: 1.5px solid var(--gl-border-strong);
320
+ display: flex; align-items: center; justify-content: center;
321
+ cursor: pointer;
322
+ transition: var(--gl-transition);
323
+ color: var(--gl-color-text);
324
+ box-shadow: var(--gl-shadow-glow), var(--gl-inset-medium);
325
+ outline: none;
326
+ -webkit-tap-highlight-color: transparent;
327
+ }
328
+
329
+ .glass-pill:hover { background: var(--gl-surface-5); transform: scale(1.05); }
330
+ .glass-pill:active { transform: scale(0.95); }
331
+
332
+ .glass-pill svg {
333
+ width: 20px; height: 20px;
334
+ fill: none; stroke: var(--gl-color-text); stroke-width: 2.2;
335
+ stroke-linecap: round; stroke-linejoin: round;
336
+ }
337
+
338
+
339
+ /* ============================================================
340
+ 4. SEITENTITEL
341
+ ============================================================ */
342
+ .glass-title {
343
+ text-align: center;
344
+ color: var(--gl-color-text-heading);
345
+ font-size: var(--gl-font-size-title);
346
+ font-weight: var(--gl-font-weight-semibold);
347
+ line-height: 1.3;
348
+ text-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
349
+ letter-spacing: -0.3px;
350
+ }
351
+
352
+
353
+ /* ============================================================
354
+ 5. GLASS CARD
355
+ ============================================================ */
356
+ .glass-card {
357
+ background: var(--gl-surface-2);
358
+ backdrop-filter: blur(var(--gl-blur));
359
+ -webkit-backdrop-filter: blur(var(--gl-blur));
360
+ border: 1.5px solid var(--gl-border-medium);
361
+ border-radius: var(--gl-radius-card);
362
+ padding: var(--gl-space-3xl) var(--gl-space-xl) var(--gl-space-2xl);
363
+ box-shadow: var(--gl-shadow-card), var(--gl-inset-strong);
364
+ }
365
+
366
+ .glass-card--glow {
367
+ position: relative; overflow: hidden;
368
+ background: linear-gradient(to bottom,
369
+ var(--gl-card-glow-top) 0%,
370
+ var(--gl-card-glow-mid) 25%,
371
+ var(--gl-card-glow-low) 55%,
372
+ var(--gl-card-glow-bottom) 100%
373
+ );
374
+ }
375
+
376
+ .glass-card--glow::before {
377
+ content: '';
378
+ position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
379
+ background: linear-gradient(90deg,
380
+ transparent 0%, rgba(255,255,255,0.5) 30%,
381
+ rgba(255,255,255,0.6) 50%, rgba(255,255,255,0.5) 70%, transparent 100%
382
+ );
383
+ z-index: 1;
384
+ }
385
+
386
+ .glass-card__icon {
387
+ display: flex; align-items: center; justify-content: center;
388
+ margin: 0 auto var(--gl-space-lg);
389
+ }
390
+
391
+ .glass-card__icon svg {
392
+ width: 64px; height: 64px;
393
+ stroke: var(--gl-card-icon-color); stroke-width: 1.2; fill: none;
394
+ }
395
+
396
+ .glass-card__text {
397
+ color: var(--gl-card-text-color);
398
+ font-size: var(--gl-font-size-base);
399
+ font-weight: var(--gl-font-weight-normal);
400
+ line-height: 1.55; text-align: center;
401
+ }
402
+
403
+
404
+ /* ============================================================
405
+ 6. BUTTONS
406
+ ============================================================ */
407
+ .glass-btn {
408
+ display: flex; align-items: center; justify-content: center;
409
+ gap: 10px; width: 100%; height: 56px;
410
+ border: none; border-radius: var(--gl-radius-btn);
411
+ font-family: var(--gl-font-family);
412
+ font-size: var(--gl-font-size-btn);
413
+ font-weight: var(--gl-font-weight-semibold);
414
+ cursor: pointer; transition: var(--gl-transition);
415
+ outline: none; -webkit-tap-highlight-color: transparent;
416
+ }
417
+
418
+ .glass-btn svg { width: 20px; height: 20px; flex-shrink: 0; }
419
+
420
+ /* Primary */
421
+ .glass-btn--primary {
422
+ background: linear-gradient(135deg,
423
+ var(--gl-color-primary) 0%, var(--gl-color-primary-mid) 50%,
424
+ var(--gl-color-primary-dark) 100%
425
+ );
426
+ color: white;
427
+ border: 1px solid var(--gl-border-warm);
428
+ box-shadow: var(--gl-shadow-btn-primary), var(--gl-inset-strong);
429
+ }
430
+ .glass-btn--primary svg { fill: var(--gl-icon-on-primary); stroke: var(--gl-icon-on-primary); stroke-width: 0; }
431
+ .glass-btn--primary:hover { transform: translateY(-1px); }
432
+ .glass-btn--primary:active { transform: translateY(1px); }
433
+
434
+ /* Secondary */
435
+ .glass-btn--secondary {
436
+ background: linear-gradient(to bottom,
437
+ var(--gl-surface-milk-strong) 0%, var(--gl-surface-milk) 100%
438
+ );
439
+ backdrop-filter: blur(var(--gl-blur));
440
+ -webkit-backdrop-filter: blur(var(--gl-blur));
441
+ border: 1.5px solid var(--gl-border-milk);
442
+ color: var(--gl-color-text-on-light);
443
+ box-shadow: var(--gl-shadow-btn), var(--gl-inset-milk);
444
+ }
445
+ .glass-btn--secondary svg {
446
+ fill: none; stroke: var(--gl-icon-on-secondary);
447
+ stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
448
+ }
449
+ .glass-btn--secondary:hover { transform: translateY(-1px); }
450
+ .glass-btn--secondary:active { transform: translateY(1px); }
451
+
452
+ /* Tertiary */
453
+ .glass-btn--tertiary {
454
+ background: var(--gl-surface-2);
455
+ backdrop-filter: blur(var(--gl-blur-light));
456
+ -webkit-backdrop-filter: blur(var(--gl-blur-light));
457
+ border: 1px solid var(--gl-border-subtle);
458
+ color: var(--gl-color-text-muted);
459
+ box-shadow: 0 4px 12px rgba(0,0,0,0.10), var(--gl-inset-subtle);
460
+ }
461
+ .glass-btn--tertiary svg {
462
+ fill: none; stroke: var(--gl-icon-on-tertiary);
463
+ stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
464
+ }
465
+ .glass-btn--tertiary:hover {
466
+ background: var(--gl-surface-4); color: var(--gl-color-text);
467
+ transform: translateY(-1px);
468
+ }
469
+ .glass-btn--tertiary:active { transform: translateY(1px); }
470
+
471
+ /* Größen */
472
+ .glass-btn--sm { height: 44px; font-size: var(--gl-font-size-sm); border-radius: var(--gl-radius-sm); }
473
+ .glass-btn--lg { height: 64px; font-size: var(--gl-font-size-lg); }
474
+ .glass-btn--auto { width: auto; padding: 0 var(--gl-space-xl); }
475
+
476
+
477
+ /* ============================================================
478
+ 7. STATUS CARD
479
+ ============================================================ */
480
+ .glass-status {
481
+ background: var(--gl-surface-1);
482
+ backdrop-filter: blur(var(--gl-blur-light));
483
+ -webkit-backdrop-filter: blur(var(--gl-blur-light));
484
+ border: 1px solid var(--gl-border-subtle);
485
+ border-radius: var(--gl-radius-btn);
486
+ padding: var(--gl-space-md) var(--gl-space-lg);
487
+ display: flex; align-items: center; gap: var(--gl-space-sm);
488
+ box-shadow: 0 4px 12px rgba(0,0,0,0.08), var(--gl-inset-subtle);
489
+ }
490
+
491
+ .glass-status svg {
492
+ width: 20px; height: 20px; flex-shrink: 0;
493
+ stroke: var(--gl-icon-muted); stroke-width: 2; fill: none;
494
+ stroke-linecap: round; stroke-linejoin: round;
495
+ }
496
+
497
+ .glass-status p {
498
+ color: var(--gl-color-text-muted);
499
+ font-size: var(--gl-font-size-sm);
500
+ font-weight: var(--gl-font-weight-normal);
501
+ line-height: 1.45;
502
+ }
503
+
504
+
505
+ /* ============================================================
506
+ 8. INPUT FIELDS
507
+ ============================================================ */
508
+ .glass-input-group {
509
+ display: flex; flex-direction: column; gap: var(--gl-space-xs);
510
+ }
511
+
512
+ .glass-label {
513
+ font-size: var(--gl-font-size-sm);
514
+ font-weight: var(--gl-font-weight-medium);
515
+ color: var(--gl-icon-strong);
516
+ padding-left: var(--gl-space-2xs);
517
+ }
518
+
519
+ .glass-input {
520
+ width: 100%; height: 52px;
521
+ padding: 0 var(--gl-space-md);
522
+ background: var(--gl-surface-2);
523
+ backdrop-filter: blur(var(--gl-blur-light));
524
+ -webkit-backdrop-filter: blur(var(--gl-blur-light));
525
+ border: 1.5px solid var(--gl-border-medium);
526
+ border-radius: var(--gl-radius-input);
527
+ color: var(--gl-color-text);
528
+ font-family: var(--gl-font-family);
529
+ font-size: var(--gl-font-size-base);
530
+ transition: var(--gl-transition);
531
+ outline: none;
532
+ box-shadow: var(--gl-inset-subtle);
533
+ -webkit-tap-highlight-color: transparent;
534
+ }
535
+
536
+ .glass-input::placeholder { color: var(--gl-placeholder); }
537
+
538
+ .glass-input:focus {
539
+ border-color: var(--gl-border-focus);
540
+ background: var(--gl-surface-3);
541
+ box-shadow: var(--gl-shadow-focus), var(--gl-inset-medium);
542
+ }
543
+
544
+ .glass-input:disabled { opacity: 0.4; cursor: not-allowed; }
545
+ .glass-input--error { border-color: var(--gl-color-error); }
546
+ .glass-input--error:focus {
547
+ box-shadow: 0 0 0 3px rgba(255, 59, 48, 0.25), var(--gl-inset-medium);
548
+ }
549
+
550
+ .glass-hint {
551
+ font-size: var(--gl-font-size-xs);
552
+ color: var(--gl-color-text-muted);
553
+ padding-left: var(--gl-space-2xs);
554
+ }
555
+ .glass-hint--error { color: var(--gl-color-error); }
556
+
557
+ /* Textarea */
558
+ .glass-textarea {
559
+ width: 100%; min-height: 120px;
560
+ padding: var(--gl-space-md);
561
+ background: var(--gl-surface-2);
562
+ backdrop-filter: blur(var(--gl-blur-light));
563
+ -webkit-backdrop-filter: blur(var(--gl-blur-light));
564
+ border: 1.5px solid var(--gl-border-medium);
565
+ border-radius: var(--gl-radius-input);
566
+ color: var(--gl-color-text);
567
+ font-family: var(--gl-font-family);
568
+ font-size: var(--gl-font-size-base);
569
+ line-height: 1.5; resize: vertical;
570
+ transition: var(--gl-transition);
571
+ outline: none;
572
+ box-shadow: var(--gl-inset-subtle);
573
+ }
574
+ .glass-textarea::placeholder { color: var(--gl-placeholder); }
575
+ .glass-textarea:focus {
576
+ border-color: var(--gl-border-focus);
577
+ background: var(--gl-surface-3);
578
+ box-shadow: var(--gl-shadow-focus), var(--gl-inset-medium);
579
+ }
580
+
581
+
582
+ /* ============================================================
583
+ 9. SELECT
584
+ ============================================================ */
585
+ .glass-select {
586
+ width: 100%; height: 52px;
587
+ padding: 0 var(--gl-space-3xl) 0 var(--gl-space-md);
588
+ background: var(--gl-surface-2);
589
+ backdrop-filter: blur(var(--gl-blur-light));
590
+ -webkit-backdrop-filter: blur(var(--gl-blur-light));
591
+ border: 1.5px solid var(--gl-border-medium);
592
+ border-radius: var(--gl-radius-input);
593
+ color: var(--gl-color-text);
594
+ font-family: var(--gl-font-family);
595
+ font-size: var(--gl-font-size-base);
596
+ transition: var(--gl-transition);
597
+ outline: none;
598
+ box-shadow: var(--gl-inset-subtle);
599
+ cursor: pointer;
600
+ appearance: none; -webkit-appearance: none;
601
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.6)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
602
+ background-repeat: no-repeat;
603
+ background-position: right 16px center;
604
+ }
605
+ .glass-select:focus {
606
+ border-color: var(--gl-border-focus);
607
+ box-shadow: var(--gl-shadow-focus), var(--gl-inset-medium);
608
+ }
609
+ .glass-select option { background: var(--gl-color-bg-mid); color: var(--gl-color-text); }
610
+
611
+
612
+ /* ============================================================
613
+ 10. SEARCH FIELD
614
+ ============================================================ */
615
+ .glass-search {
616
+ position: relative; display: flex; align-items: center;
617
+ }
618
+
619
+ .glass-search__icon {
620
+ position: absolute; left: var(--gl-space-md);
621
+ width: 18px; height: 18px;
622
+ stroke: var(--gl-icon-muted) !important;
623
+ stroke-width: 2 !important;
624
+ stroke-linecap: round !important;
625
+ stroke-linejoin: round !important;
626
+ fill: none !important;
627
+ pointer-events: none;
628
+ z-index: 2;
629
+ }
630
+
631
+ .glass-search .glass-input {
632
+ padding-left: 44px;
633
+ border-radius: var(--gl-radius-full);
634
+ }
635
+
636
+
637
+ /* ============================================================
638
+ 11. TOGGLE SWITCH
639
+ ============================================================ */
640
+ .glass-toggle {
641
+ display: inline-flex; align-items: center;
642
+ gap: var(--gl-space-sm); cursor: pointer;
643
+ -webkit-tap-highlight-color: transparent;
644
+ }
645
+
646
+ .glass-toggle__input { position: absolute; opacity: 0; width: 0; height: 0; }
647
+
648
+ .glass-toggle__track {
649
+ position: relative; width: 52px; height: 30px;
650
+ background: var(--gl-surface-2);
651
+ backdrop-filter: blur(var(--gl-blur-soft));
652
+ -webkit-backdrop-filter: blur(var(--gl-blur-soft));
653
+ border: 1.5px solid var(--gl-border-medium);
654
+ border-radius: var(--gl-radius-full);
655
+ transition: var(--gl-transition);
656
+ box-shadow: var(--gl-inset-subtle);
657
+ flex-shrink: 0;
658
+ }
659
+
660
+ .glass-toggle__thumb {
661
+ position: absolute; top: 3px; left: 3px;
662
+ width: 22px; height: 22px;
663
+ border-radius: var(--gl-radius-pill);
664
+ background: var(--gl-toggle-thumb-bg);
665
+ box-shadow: 0 2px 6px rgba(0,0,0,0.2), var(--gl-inset-milk);
666
+ transition: var(--gl-transition);
667
+ }
668
+
669
+ .glass-toggle__input:checked + .glass-toggle__track {
670
+ background: linear-gradient(135deg,
671
+ var(--gl-color-primary) 0%, var(--gl-color-primary-dark) 100%
672
+ );
673
+ border-color: var(--gl-border-warm);
674
+ }
675
+
676
+ .glass-toggle__input:checked + .glass-toggle__track .glass-toggle__thumb {
677
+ transform: translateX(22px);
678
+ }
679
+
680
+ .glass-toggle__input:focus-visible + .glass-toggle__track { box-shadow: var(--gl-shadow-focus); }
681
+
682
+ .glass-toggle__label {
683
+ font-size: var(--gl-font-size-base);
684
+ color: var(--gl-color-text);
685
+ user-select: none;
686
+ }
687
+
688
+
689
+ /* ============================================================
690
+ 12. CHECKBOX
691
+ ============================================================ */
692
+ .glass-checkbox {
693
+ display: inline-flex; align-items: center;
694
+ gap: var(--gl-space-sm); cursor: pointer;
695
+ -webkit-tap-highlight-color: transparent;
696
+ }
697
+ .glass-checkbox__input { position: absolute; opacity: 0; width: 0; height: 0; }
698
+
699
+ .glass-checkbox__box {
700
+ width: 24px; height: 24px;
701
+ border-radius: var(--gl-radius-xs);
702
+ background: var(--gl-surface-2);
703
+ backdrop-filter: blur(var(--gl-blur-soft));
704
+ -webkit-backdrop-filter: blur(var(--gl-blur-soft));
705
+ border: 1.5px solid var(--gl-border-medium);
706
+ display: flex; align-items: center; justify-content: center;
707
+ transition: var(--gl-transition);
708
+ box-shadow: var(--gl-inset-subtle);
709
+ flex-shrink: 0;
710
+ }
711
+
712
+ .glass-checkbox__box svg {
713
+ width: 14px; height: 14px;
714
+ stroke: white; stroke-width: 3; fill: none;
715
+ stroke-linecap: round; stroke-linejoin: round;
716
+ opacity: 0; transform: scale(0.5);
717
+ transition: var(--gl-transition-fast);
718
+ }
719
+
720
+ .glass-checkbox__input:checked + .glass-checkbox__box {
721
+ background: linear-gradient(135deg,
722
+ var(--gl-color-primary) 0%, var(--gl-color-primary-dark) 100%
723
+ );
724
+ border-color: var(--gl-border-warm);
725
+ }
726
+ .glass-checkbox__input:checked + .glass-checkbox__box svg { opacity: 1; transform: scale(1); }
727
+ .glass-checkbox__input:focus-visible + .glass-checkbox__box { box-shadow: var(--gl-shadow-focus); }
728
+
729
+ .glass-checkbox__label {
730
+ font-size: var(--gl-font-size-base);
731
+ color: var(--gl-color-text); user-select: none;
732
+ }
733
+
734
+
735
+ /* ============================================================
736
+ 13. RADIO BUTTON
737
+ ============================================================ */
738
+ .glass-radio {
739
+ display: inline-flex; align-items: center;
740
+ gap: var(--gl-space-sm); cursor: pointer;
741
+ -webkit-tap-highlight-color: transparent;
742
+ }
743
+ .glass-radio__input { position: absolute; opacity: 0; width: 0; height: 0; }
744
+
745
+ .glass-radio__circle {
746
+ width: 24px; height: 24px;
747
+ border-radius: var(--gl-radius-pill);
748
+ background: var(--gl-surface-2);
749
+ backdrop-filter: blur(var(--gl-blur-soft));
750
+ border: 1.5px solid var(--gl-border-medium);
751
+ display: flex; align-items: center; justify-content: center;
752
+ transition: var(--gl-transition);
753
+ box-shadow: var(--gl-inset-subtle);
754
+ flex-shrink: 0;
755
+ }
756
+
757
+ .glass-radio__dot {
758
+ width: 10px; height: 10px;
759
+ border-radius: var(--gl-radius-pill);
760
+ background: white;
761
+ opacity: 0; transform: scale(0);
762
+ transition: var(--gl-transition-fast);
763
+ }
764
+
765
+ .glass-radio__input:checked + .glass-radio__circle {
766
+ background: linear-gradient(135deg,
767
+ var(--gl-color-primary) 0%, var(--gl-color-primary-dark) 100%
768
+ );
769
+ border-color: var(--gl-border-warm);
770
+ }
771
+ .glass-radio__input:checked + .glass-radio__circle .glass-radio__dot { opacity: 1; transform: scale(1); }
772
+ .glass-radio__input:focus-visible + .glass-radio__circle { box-shadow: var(--gl-shadow-focus); }
773
+
774
+ .glass-radio__label {
775
+ font-size: var(--gl-font-size-base);
776
+ color: var(--gl-color-text); user-select: none;
777
+ }
778
+
779
+
780
+ /* ============================================================
781
+ 14. RANGE SLIDER
782
+ ============================================================ */
783
+ .glass-range-group { display: flex; flex-direction: column; gap: var(--gl-space-xs); }
784
+ .glass-range-header { display: flex; justify-content: space-between; align-items: baseline; }
785
+
786
+ .glass-range-value {
787
+ font-size: var(--gl-font-size-sm);
788
+ font-weight: var(--gl-font-weight-semibold);
789
+ color: var(--gl-color-primary);
790
+ font-variant-numeric: tabular-nums;
791
+ }
792
+
793
+ .glass-range {
794
+ -webkit-appearance: none; appearance: none;
795
+ width: 100%; height: 6px;
796
+ border-radius: var(--gl-radius-full);
797
+ background: var(--gl-range-track-bg);
798
+ border: 1px solid var(--gl-range-track-border);
799
+ outline: none; cursor: pointer;
800
+ }
801
+
802
+ .glass-range::-webkit-slider-thumb {
803
+ -webkit-appearance: none; appearance: none;
804
+ width: 26px; height: 26px;
805
+ border-radius: var(--gl-radius-pill);
806
+ background: linear-gradient(135deg,
807
+ var(--gl-color-primary) 0%, var(--gl-color-primary-dark) 100%
808
+ );
809
+ border: 2px solid rgba(255,255,255,0.5);
810
+ box-shadow: 0 2px 8px rgba(230,130,40,0.35), var(--gl-inset-strong);
811
+ margin-top: -10px; cursor: pointer;
812
+ transition: var(--gl-transition);
813
+ }
814
+
815
+ .glass-range::-webkit-slider-thumb:hover { transform: scale(1.1); }
816
+
817
+ .glass-range::-moz-range-thumb {
818
+ width: 26px; height: 26px;
819
+ border-radius: var(--gl-radius-pill);
820
+ background: linear-gradient(135deg,
821
+ var(--gl-color-primary) 0%, var(--gl-color-primary-dark) 100%
822
+ );
823
+ border: 2px solid rgba(255,255,255,0.5);
824
+ box-shadow: 0 2px 8px rgba(230,130,40,0.35);
825
+ cursor: pointer;
826
+ }
827
+
828
+ .glass-range::-moz-range-track {
829
+ height: 6px; border-radius: var(--gl-radius-full);
830
+ background: var(--gl-range-track-bg);
831
+ border: 1px solid var(--gl-range-track-border);
832
+ }
833
+
834
+ .glass-range:focus-visible { box-shadow: var(--gl-shadow-focus); }
835
+
836
+
837
+ /* ============================================================
838
+ 15. PROGRESS BAR
839
+ ============================================================ */
840
+ .glass-progress { width: 100%; display: flex; flex-direction: column; gap: var(--gl-space-xs); }
841
+ .glass-progress__header { display: flex; justify-content: space-between; align-items: baseline; }
842
+
843
+ .glass-progress__label {
844
+ font-size: var(--gl-font-size-sm);
845
+ font-weight: var(--gl-font-weight-medium);
846
+ color: var(--gl-icon-strong);
847
+ }
848
+
849
+ .glass-progress__value {
850
+ font-size: var(--gl-font-size-xs);
851
+ font-weight: var(--gl-font-weight-semibold);
852
+ color: var(--gl-color-text-muted);
853
+ font-variant-numeric: tabular-nums;
854
+ }
855
+
856
+ .glass-progress__track {
857
+ width: 100%; height: 8px;
858
+ border-radius: var(--gl-radius-full);
859
+ background: var(--gl-surface-2);
860
+ border: 1px solid var(--gl-border-subtle);
861
+ overflow: hidden;
862
+ box-shadow: var(--gl-inset-subtle);
863
+ }
864
+
865
+ .glass-progress__fill {
866
+ height: 100%; border-radius: var(--gl-radius-full);
867
+ background: linear-gradient(90deg,
868
+ var(--gl-color-primary) 0%, var(--gl-color-primary-dark) 100%
869
+ );
870
+ box-shadow: 0 0 8px rgba(245,166,35,0.3), var(--gl-inset-strong);
871
+ transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
872
+ position: relative;
873
+ }
874
+
875
+ .glass-progress__fill::after {
876
+ content: '';
877
+ position: absolute; top: 0; left: 0; right: 0; height: 50%;
878
+ border-radius: var(--gl-radius-full);
879
+ background: linear-gradient(to bottom, rgba(255,255,255,0.3) 0%, transparent 100%);
880
+ }
881
+
882
+ .glass-progress--sm .glass-progress__track { height: 4px; }
883
+ .glass-progress--lg .glass-progress__track { height: 12px; }
884
+
885
+ .glass-progress--success .glass-progress__fill {
886
+ background: linear-gradient(90deg, #34c759 0%, #2da44e 100%);
887
+ box-shadow: 0 0 8px rgba(52,199,89,0.3), var(--gl-inset-strong);
888
+ }
889
+ .glass-progress--error .glass-progress__fill {
890
+ background: linear-gradient(90deg, #ff3b30 0%, #d63027 100%);
891
+ box-shadow: 0 0 8px rgba(255,59,48,0.3), var(--gl-inset-strong);
892
+ }
893
+
894
+
895
+ /* ============================================================
896
+ 16. MODAL
897
+ ============================================================ */
898
+ .glass-modal-overlay {
899
+ position: fixed; inset: 0;
900
+ background: var(--gl-surface-overlay);
901
+ backdrop-filter: blur(var(--gl-blur-soft));
902
+ -webkit-backdrop-filter: blur(var(--gl-blur-soft));
903
+ display: flex; align-items: center; justify-content: center;
904
+ padding: var(--gl-space-lg); z-index: 1000;
905
+ opacity: 0; pointer-events: none;
906
+ transition: var(--gl-transition-modal);
907
+ font-family: var(--gl-font-family);
908
+ -webkit-font-smoothing: antialiased;
909
+ }
910
+ .glass-modal-overlay.is-active { opacity: 1; pointer-events: auto; }
911
+
912
+ .glass-modal {
913
+ width: 100%; max-width: 340px;
914
+ background: linear-gradient(to bottom,
915
+ var(--gl-card-glow-top) 0%, var(--gl-card-glow-bottom) 100%
916
+ );
917
+ backdrop-filter: blur(var(--gl-blur-heavy));
918
+ -webkit-backdrop-filter: blur(var(--gl-blur-heavy));
919
+ border: 1.5px solid var(--gl-border-medium);
920
+ border-radius: var(--gl-radius-card);
921
+ overflow: hidden;
922
+ box-shadow: var(--gl-shadow-modal);
923
+ transform: scale(0.9) translateY(20px);
924
+ transition: var(--gl-transition-modal);
925
+ position: relative;
926
+ }
927
+ .glass-modal-overlay.is-active .glass-modal { transform: scale(1) translateY(0); }
928
+
929
+ .glass-modal::before {
930
+ content: '';
931
+ position: absolute; top: 0; left: 10%; right: 10%; height: 1px;
932
+ background: linear-gradient(90deg,
933
+ transparent 0%, rgba(255,255,255,0.4) 30%,
934
+ rgba(255,255,255,0.5) 50%, rgba(255,255,255,0.4) 70%, transparent 100%
935
+ );
936
+ }
937
+
938
+ .glass-modal__header { padding: var(--gl-space-xl) var(--gl-space-xl) var(--gl-space-sm); text-align: center; }
939
+ .glass-modal__title { font-size: var(--gl-font-size-modal); font-weight: var(--gl-font-weight-semibold); color: var(--gl-color-text); }
940
+ .glass-modal__body { padding: var(--gl-space-sm) var(--gl-space-xl) var(--gl-space-xl); text-align: center; }
941
+ .glass-modal__body p { color: var(--gl-color-text-muted); font-size: var(--gl-font-size-base); line-height: 1.55; }
942
+ .glass-modal__footer { display: flex; border-top: 1px solid var(--gl-border-subtle); }
943
+
944
+ .glass-modal__action {
945
+ flex: 1; height: 52px;
946
+ background: transparent; border: none;
947
+ font-family: var(--gl-font-family);
948
+ font-size: var(--gl-font-size-btn);
949
+ font-weight: var(--gl-font-weight-medium);
950
+ color: var(--gl-color-text-muted);
951
+ cursor: pointer; transition: var(--gl-transition-fast); outline: none;
952
+ }
953
+ .glass-modal__action:hover { background: var(--gl-surface-1); }
954
+ .glass-modal__action + .glass-modal__action { border-left: 1px solid var(--gl-border-subtle); }
955
+ .glass-modal__action--primary { color: var(--gl-color-primary); font-weight: var(--gl-font-weight-semibold); }
956
+ .glass-modal__action--danger { color: var(--gl-color-error); font-weight: var(--gl-font-weight-semibold); }
957
+
958
+
959
+ /* ============================================================
960
+ 17. TOAST
961
+ ============================================================ */
962
+ .glass-toast {
963
+ position: fixed; top: var(--gl-space-4xl); left: 50%;
964
+ transform: translateX(-50%) translateY(-20px);
965
+ min-width: 280px; max-width: 340px;
966
+ padding: var(--gl-space-md) var(--gl-space-lg);
967
+ background: linear-gradient(to bottom,
968
+ var(--gl-surface-4) 0%, var(--gl-surface-2) 100%
969
+ );
970
+ backdrop-filter: blur(var(--gl-blur));
971
+ -webkit-backdrop-filter: blur(var(--gl-blur));
972
+ border: 1px solid var(--gl-border-medium);
973
+ border-radius: var(--gl-radius-btn);
974
+ display: flex; align-items: center; gap: var(--gl-space-sm);
975
+ box-shadow: var(--gl-shadow-toast), var(--gl-inset-medium);
976
+ z-index: 1100;
977
+ opacity: 0; pointer-events: none;
978
+ transition: var(--gl-transition-modal);
979
+ font-family: var(--gl-font-family);
980
+ -webkit-font-smoothing: antialiased;
981
+ }
982
+ .glass-toast.is-visible { opacity: 1; transform: translateX(-50%) translateY(0); pointer-events: auto; }
983
+
984
+ .glass-toast__icon {
985
+ width: 22px; height: 22px; flex-shrink: 0;
986
+ stroke-width: 2; fill: none; stroke-linecap: round; stroke-linejoin: round;
987
+ }
988
+ .glass-toast--success .glass-toast__icon { stroke: var(--gl-color-success); }
989
+ .glass-toast--error .glass-toast__icon { stroke: var(--gl-color-error); }
990
+ .glass-toast--warning .glass-toast__icon { stroke: var(--gl-color-warning); }
991
+
992
+ .glass-toast__text {
993
+ font-size: var(--gl-font-size-sm);
994
+ font-weight: var(--gl-font-weight-medium);
995
+ color: var(--gl-color-text); line-height: 1.4;
996
+ }
997
+
998
+
999
+ /* ============================================================
1000
+ 18. TAB BAR
1001
+ ============================================================ */
1002
+ .glass-tab-bar {
1003
+ position: fixed; bottom: 0; left: 0; right: 0;
1004
+ height: var(--gl-tab-bar-height);
1005
+ background: linear-gradient(to bottom,
1006
+ var(--gl-surface-3) 0%, var(--gl-surface-1) 100%
1007
+ );
1008
+ backdrop-filter: blur(var(--gl-blur));
1009
+ -webkit-backdrop-filter: blur(var(--gl-blur));
1010
+ border-top: 1px solid var(--gl-border-subtle);
1011
+ display: flex; justify-content: space-around;
1012
+ align-items: flex-start;
1013
+ padding-top: var(--gl-space-xs);
1014
+ padding-bottom: env(safe-area-inset-bottom, 8px);
1015
+ z-index: 900;
1016
+ box-shadow: 0 -4px 20px rgba(0,0,0,0.08), var(--gl-inset-subtle);
1017
+ }
1018
+
1019
+ .glass-tab-bar__item {
1020
+ display: flex; flex-direction: column; align-items: center;
1021
+ gap: var(--gl-space-2xs);
1022
+ padding: var(--gl-space-2xs) var(--gl-space-sm);
1023
+ background: none; border: none; cursor: pointer;
1024
+ transition: var(--gl-transition); outline: none;
1025
+ -webkit-tap-highlight-color: transparent;
1026
+ min-width: 60px;
1027
+ }
1028
+
1029
+ .glass-tab-bar__icon {
1030
+ width: 24px; height: 24px;
1031
+ display: flex; align-items: center; justify-content: center;
1032
+ position: relative;
1033
+ }
1034
+
1035
+ .glass-tab-bar__icon svg {
1036
+ width: 24px; height: 24px; fill: none;
1037
+ stroke: var(--gl-icon-muted); stroke-width: 1.8;
1038
+ stroke-linecap: round; stroke-linejoin: round;
1039
+ transition: var(--gl-transition);
1040
+ }
1041
+
1042
+ .glass-tab-bar__label {
1043
+ font-size: 10px; font-weight: var(--gl-font-weight-medium);
1044
+ color: var(--gl-icon-muted); transition: var(--gl-transition);
1045
+ letter-spacing: 0.2px;
1046
+ }
1047
+
1048
+ .glass-tab-bar__item.is-active .glass-tab-bar__icon svg {
1049
+ stroke: var(--gl-color-primary);
1050
+ filter: drop-shadow(0 0 6px rgba(245,166,35,0.35));
1051
+ }
1052
+ .glass-tab-bar__item.is-active .glass-tab-bar__label { color: var(--gl-color-primary); }
1053
+
1054
+ .glass-tab-bar__item.is-active .glass-tab-bar__icon::after {
1055
+ content: '';
1056
+ position: absolute; bottom: -6px; left: 50%; transform: translateX(-50%);
1057
+ width: 4px; height: 4px;
1058
+ border-radius: var(--gl-radius-pill);
1059
+ background: var(--gl-color-primary);
1060
+ box-shadow: 0 0 6px rgba(245,166,35,0.5);
1061
+ }
1062
+
1063
+ .glass-tab-bar__item:not(.is-active):hover .glass-tab-bar__icon svg { stroke: var(--gl-icon-default); }
1064
+ .glass-tab-bar__item:not(.is-active):hover .glass-tab-bar__label { color: var(--gl-icon-default); }
1065
+
1066
+ .glass-tab-bar__badge {
1067
+ position: absolute; top: -4px; right: -8px;
1068
+ min-width: 16px; height: 16px; padding: 0 4px;
1069
+ border-radius: var(--gl-radius-full);
1070
+ background: var(--gl-color-error); color: white;
1071
+ font-size: 10px; font-weight: var(--gl-font-weight-semibold);
1072
+ display: flex; align-items: center; justify-content: center;
1073
+ box-shadow: 0 2px 6px rgba(255,59,48,0.4);
1074
+ }
1075
+
1076
+
1077
+ /* ============================================================
1078
+ 19. ACCORDION
1079
+ ============================================================ */
1080
+ .glass-accordion { display: flex; flex-direction: column; gap: var(--gl-space-xs); }
1081
+
1082
+ .glass-accordion__item {
1083
+ background: var(--gl-surface-2);
1084
+ backdrop-filter: blur(var(--gl-blur-light));
1085
+ -webkit-backdrop-filter: blur(var(--gl-blur-light));
1086
+ border: 1px solid var(--gl-border-subtle);
1087
+ border-radius: var(--gl-radius-btn);
1088
+ overflow: hidden;
1089
+ transition: var(--gl-transition);
1090
+ box-shadow: var(--gl-inset-subtle);
1091
+ }
1092
+
1093
+ .glass-accordion__item.is-open {
1094
+ background: var(--gl-surface-3);
1095
+ border-color: var(--gl-border-medium);
1096
+ box-shadow: 0 4px 16px rgba(0,0,0,0.10), var(--gl-inset-medium);
1097
+ }
1098
+
1099
+ .glass-accordion__trigger {
1100
+ width: 100%; display: flex; align-items: center;
1101
+ justify-content: space-between; gap: var(--gl-space-sm);
1102
+ padding: var(--gl-space-md) var(--gl-space-lg);
1103
+ background: none; border: none; cursor: pointer;
1104
+ font-family: var(--gl-font-family);
1105
+ font-size: var(--gl-font-size-base);
1106
+ font-weight: var(--gl-font-weight-semibold);
1107
+ color: var(--gl-color-text); text-align: left;
1108
+ outline: none; transition: var(--gl-transition);
1109
+ -webkit-tap-highlight-color: transparent;
1110
+ }
1111
+
1112
+ .glass-accordion__trigger:hover { color: var(--gl-color-primary); }
1113
+
1114
+ .glass-accordion__trigger-icon { display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
1115
+
1116
+ .glass-accordion__trigger-icon svg {
1117
+ width: 18px; height: 18px; fill: none;
1118
+ stroke: var(--gl-icon-default); stroke-width: 2;
1119
+ stroke-linecap: round; stroke-linejoin: round;
1120
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1121
+ }
1122
+
1123
+ .glass-accordion__item.is-open .glass-accordion__trigger-icon svg {
1124
+ transform: rotate(180deg);
1125
+ stroke: var(--gl-color-primary);
1126
+ }
1127
+
1128
+ .glass-accordion__content {
1129
+ max-height: 0; overflow: hidden;
1130
+ transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1);
1131
+ }
1132
+ .glass-accordion__item.is-open .glass-accordion__content { max-height: 500px; }
1133
+
1134
+ .glass-accordion__body {
1135
+ padding: 0 var(--gl-space-lg) var(--gl-space-lg);
1136
+ color: var(--gl-accordion-body-color);
1137
+ font-size: var(--gl-font-size-sm); line-height: 1.6;
1138
+ }
1139
+
1140
+
1141
+ /* ============================================================
1142
+ 20. BADGE
1143
+ ============================================================ */
1144
+ .glass-badge {
1145
+ display: inline-flex; align-items: center; gap: var(--gl-space-2xs);
1146
+ padding: var(--gl-space-2xs) var(--gl-space-sm);
1147
+ background: var(--gl-surface-3);
1148
+ backdrop-filter: blur(var(--gl-blur-soft));
1149
+ -webkit-backdrop-filter: blur(var(--gl-blur-soft));
1150
+ border: 1px solid var(--gl-border-subtle);
1151
+ border-radius: var(--gl-radius-full);
1152
+ font-size: var(--gl-font-size-xs);
1153
+ font-weight: var(--gl-font-weight-medium);
1154
+ color: var(--gl-color-text);
1155
+ box-shadow: var(--gl-inset-subtle);
1156
+ }
1157
+ .glass-badge--primary {
1158
+ background: linear-gradient(135deg, rgba(245,166,35,0.25) 0%, rgba(212,105,42,0.20) 100%);
1159
+ border-color: var(--gl-border-warm); color: var(--gl-color-primary);
1160
+ }
1161
+ .glass-badge--success {
1162
+ background: rgba(52,199,89,0.15); border-color: rgba(52,199,89,0.30); color: var(--gl-color-success);
1163
+ }
1164
+ .glass-badge--error {
1165
+ background: rgba(255,59,48,0.15); border-color: rgba(255,59,48,0.30); color: var(--gl-color-error);
1166
+ }
1167
+
1168
+
1169
+ /* ============================================================
1170
+ 21. DIVIDER
1171
+ ============================================================ */
1172
+ .glass-divider {
1173
+ height: 1px; border: none;
1174
+ background: linear-gradient(90deg,
1175
+ transparent 0%, var(--gl-border-subtle) 20%,
1176
+ var(--gl-border-medium) 50%, var(--gl-border-subtle) 80%, transparent 100%
1177
+ );
1178
+ }
1179
+
1180
+
1181
+ /* ============================================================
1182
+ 22. AVATAR
1183
+ ============================================================ */
1184
+ .glass-avatar {
1185
+ width: 44px; height: 44px;
1186
+ border-radius: var(--gl-radius-pill);
1187
+ background: var(--gl-surface-3);
1188
+ backdrop-filter: blur(var(--gl-blur-soft));
1189
+ -webkit-backdrop-filter: blur(var(--gl-blur-soft));
1190
+ border: 1.5px solid var(--gl-border-strong);
1191
+ display: flex; align-items: center; justify-content: center;
1192
+ overflow: hidden;
1193
+ box-shadow: var(--gl-shadow-glow), var(--gl-inset-medium);
1194
+ flex-shrink: 0;
1195
+ font-size: var(--gl-font-size-btn);
1196
+ font-weight: var(--gl-font-weight-semibold);
1197
+ color: var(--gl-color-text);
1198
+ }
1199
+ .glass-avatar img { width: 100%; height: 100%; object-fit: cover; }
1200
+ .glass-avatar--sm { width: 32px; height: 32px; font-size: var(--gl-font-size-xs); }
1201
+ .glass-avatar--lg { width: 56px; height: 56px; font-size: var(--gl-font-size-lg); }
1202
+
1203
+
1204
+ /* ============================================================
1205
+ 23. THEME TOGGLE BUTTON
1206
+ ============================================================ */
1207
+ .glass-theme-toggle {
1208
+ width: 46px; height: 46px;
1209
+ border-radius: var(--gl-radius-pill);
1210
+ background: var(--gl-surface-3);
1211
+ backdrop-filter: blur(var(--gl-blur));
1212
+ -webkit-backdrop-filter: blur(var(--gl-blur));
1213
+ border: 1.5px solid var(--gl-border-strong);
1214
+ display: flex; align-items: center; justify-content: center;
1215
+ cursor: pointer; transition: var(--gl-transition);
1216
+ box-shadow: var(--gl-shadow-glow), var(--gl-inset-medium);
1217
+ outline: none; -webkit-tap-highlight-color: transparent;
1218
+ }
1219
+ .glass-theme-toggle:hover { background: var(--gl-surface-5); transform: scale(1.05); }
1220
+ .glass-theme-toggle:active { transform: scale(0.95); }
1221
+
1222
+ .glass-theme-toggle svg {
1223
+ width: 20px; height: 20px;
1224
+ fill: none; stroke: var(--gl-color-text); stroke-width: 2;
1225
+ stroke-linecap: round; stroke-linejoin: round;
1226
+ }
1227
+
1228
+ .glass-theme-toggle .icon-sun { display: none; }
1229
+ .glass-theme-toggle .icon-moon { display: block; }
1230
+ [data-theme="light"] .glass-theme-toggle .icon-sun { display: block; }
1231
+ [data-theme="light"] .glass-theme-toggle .icon-moon { display: none; }
1232
+
1233
+
1234
+ /* ============================================================
1235
+ 24. UTILITIES
1236
+ ============================================================ */
1237
+ .gl-stack { display: flex; flex-direction: column; }
1238
+ .gl-row { display: flex; flex-direction: row; align-items: center; }
1239
+
1240
+ .gl-stack--2xs { gap: var(--gl-space-2xs); }
1241
+ .gl-stack--xs { gap: var(--gl-space-xs); }
1242
+ .gl-stack--sm { gap: var(--gl-space-sm); }
1243
+ .gl-stack--md { gap: var(--gl-space-md); }
1244
+ .gl-stack--lg { gap: var(--gl-space-lg); }
1245
+ .gl-stack--xl { gap: var(--gl-space-xl); }
1246
+
1247
+ .gl-row--xs { gap: var(--gl-space-xs); }
1248
+ .gl-row--sm { gap: var(--gl-space-sm); }
1249
+ .gl-row--md { gap: var(--gl-space-md); }
1250
+
1251
+ .gl-text-center { text-align: center; }
1252
+ .gl-text-muted { color: var(--gl-color-text-muted); }
1253
+ .gl-text-sm { font-size: var(--gl-font-size-sm); }
1254
+
1255
+ .gl-mt-sm { margin-top: var(--gl-space-sm); }
1256
+ .gl-mt-md { margin-top: var(--gl-space-md); }
1257
+ .gl-mt-lg { margin-top: var(--gl-space-lg); }
1258
+ .gl-mt-xl { margin-top: var(--gl-space-xl); }
1259
+
1260
+ .gl-mb-sm { margin-bottom: var(--gl-space-sm); }
1261
+ .gl-mb-md { margin-bottom: var(--gl-space-md); }
1262
+ .gl-mb-lg { margin-bottom: var(--gl-space-lg); }
1263
+ .gl-mb-xl { margin-bottom: var(--gl-space-xl); }
1264
+
1265
+ .gl-px { padding-left: var(--gl-space-lg); padding-right: var(--gl-space-lg); }
1266
+ .gl-w-full { width: 100%; }
1267
+ .gl-flex-1 { flex: 1; }