@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/CHANGELOG.md +157 -0
- package/LICENSE +21 -0
- package/README.md +544 -0
- package/glasskit-styles.js +9 -0
- package/glasskit.css +1267 -0
- package/glasskit.min.css +4 -0
- package/package.json +47 -0
- package/theme-override.css +127 -0
package/README.md
ADDED
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://img.shields.io/badge/version-1.3-orange?style=flat-square" alt="Version">
|
|
3
|
+
<img src="https://img.shields.io/badge/CSS-only-blue?style=flat-square" alt="CSS only">
|
|
4
|
+
<img src="https://img.shields.io/badge/components-22-green?style=flat-square" alt="Components">
|
|
5
|
+
<img src="https://img.shields.io/badge/license-MIT-lightgrey?style=flat-square" alt="License">
|
|
6
|
+
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-v1.3.0-f5a623?style=flat-square" alt="Changelog"></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/@jungherz-de/glasskit"><img src="https://img.shields.io/npm/v/@jungherz-de/glasskit?style=flat-square&color=cb3837&label=npm" alt="npm"></a>
|
|
8
|
+
<a href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit/"><img src="https://img.shields.io/badge/CDN-jsDelivr-blue?style=flat-square" alt="jsDelivr"></a>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<h1 align="center">🧊 GlassKit</h1>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<img src="intro_screenshot.png" alt="GlassKit Preview" width="720">
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<strong>A modern glassmorphism CSS component library.</strong><br>
|
|
19
|
+
22 Komponenten · Dark & Light Mode · Keine Abhängigkeiten · Design Tokens
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="#-installation">Installation</a> ·
|
|
24
|
+
<a href="#-quick-start">Quick Start</a> ·
|
|
25
|
+
<a href="#-komponenten">Komponenten</a> ·
|
|
26
|
+
<a href="#-theming">Theming</a> ·
|
|
27
|
+
<a href="#-web-components--shadow-dom">Web Components</a> ·
|
|
28
|
+
<a href="#-dokumentation">Docs</a> ·
|
|
29
|
+
<a href="CHANGELOG.md">Changelog</a> ·
|
|
30
|
+
<a href="#-lizenz">Lizenz</a>
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## ✨ Was ist GlassKit?
|
|
36
|
+
|
|
37
|
+
GlassKit ist eine vollständige **CSS-Komponentenbibliothek** im Glassmorphism-Stil – inspiriert von **iOS 26 Liquid Glass** und visionOS. Apple hat mit iOS 26 das Glasdesign grundlegend neu definiert: tiefere Blur-Effekte, leuchtende Ränder und dynamische Lichtreflexe auf Oberflächen. GlassKit bringt genau diesen Look ins Web – für Apps und UIs, die sich modern und nativ anfühlen.
|
|
38
|
+
|
|
39
|
+
**Eine CSS-Datei. Keine Build-Tools. Keine Abhängigkeiten.**
|
|
40
|
+
|
|
41
|
+
<br>
|
|
42
|
+
|
|
43
|
+
### Warum GlassKit?
|
|
44
|
+
|
|
45
|
+
- 🎨 **Reines CSS** – kein JavaScript-Framework nötig
|
|
46
|
+
- 🌗 **Dark & Light Mode** – ein Attribut wechseln genügt
|
|
47
|
+
- 🎛️ **Design Tokens** – alle Werte zentral über CSS Custom Properties steuerbar
|
|
48
|
+
- 📱 **Mobile-first** – optimiert für Touch-Geräte und `safe-area-inset`
|
|
49
|
+
- 🔌 **Framework-agnostisch** – funktioniert mit React, Vue, Svelte, plain HTML oder jedem anderen Stack
|
|
50
|
+
- 🧩 **Shadow-DOM-ready** – Constructable Stylesheet für Web Components mitgeliefert
|
|
51
|
+
- 🪶 **Leichtgewichtig** – ~45 KB (unkomprimiert), keine externen Abhängigkeiten
|
|
52
|
+
- 🎯 **BEM-artige Namenskonvention** – `glass-*` Prefix, kein Konflikt mit bestehendem CSS
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 📥 Installation
|
|
57
|
+
|
|
58
|
+
GlassKit kann auf verschiedenen Wegen eingebunden werden – wähle den, der am besten zu deinem Projekt passt:
|
|
59
|
+
|
|
60
|
+
### CDN (empfohlen für schnellen Einstieg)
|
|
61
|
+
|
|
62
|
+
Kein Download, kein Build-Tool – einfach einbinden und loslegen:
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<!-- jsDelivr – Minifiziert -->
|
|
66
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.3.0/glasskit.min.css">
|
|
67
|
+
|
|
68
|
+
<!-- jsDelivr – Unminifiziert (zum Lesen/Debuggen) -->
|
|
69
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@jungherz-de/glasskit@1.3.0/glasskit.css">
|
|
70
|
+
|
|
71
|
+
<!-- unpkg – Alternative -->
|
|
72
|
+
<link rel="stylesheet" href="https://unpkg.com/@jungherz-de/glasskit@1.3.0/glasskit.min.css">
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
> **Tipp:** Ersetze `@1.3.0` durch `@latest` für immer die neueste Version – oder pinne auf eine feste Version für maximale Stabilität.
|
|
76
|
+
|
|
77
|
+
### npm / yarn / pnpm
|
|
78
|
+
|
|
79
|
+
Für Projekte mit Build-Pipeline:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# npm
|
|
83
|
+
npm install @jungherz-de/glasskit
|
|
84
|
+
|
|
85
|
+
# yarn
|
|
86
|
+
yarn add @jungherz-de/glasskit
|
|
87
|
+
|
|
88
|
+
# pnpm
|
|
89
|
+
pnpm add @jungherz-de/glasskit
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Danach im CSS oder Build-Tool importieren:
|
|
93
|
+
|
|
94
|
+
```css
|
|
95
|
+
/* In deiner CSS-Datei */
|
|
96
|
+
@import '@jungherz-de/glasskit/glasskit.css';
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```js
|
|
100
|
+
// Oder in JS (Webpack, Vite, etc.)
|
|
101
|
+
import '@jungherz-de/glasskit/glasskit.css';
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Direkter Download
|
|
105
|
+
|
|
106
|
+
Lade die Dateien direkt vom [GitHub Release](https://github.com/JUNGHERZ/GlassKit/releases/latest) herunter:
|
|
107
|
+
|
|
108
|
+
```html
|
|
109
|
+
<!-- Lokal einbinden -->
|
|
110
|
+
<link rel="stylesheet" href="glasskit.min.css">
|
|
111
|
+
|
|
112
|
+
<!-- Optional: eigenes Theme -->
|
|
113
|
+
<link rel="stylesheet" href="theme-override.css">
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 🚀 Quick Start
|
|
119
|
+
|
|
120
|
+
### 1. Theme setzen
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<!-- Dark Mode (Standard) -->
|
|
124
|
+
<html data-theme="dark">
|
|
125
|
+
|
|
126
|
+
<!-- Light Mode -->
|
|
127
|
+
<html data-theme="light">
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 2. Loslegen
|
|
131
|
+
|
|
132
|
+
```html
|
|
133
|
+
<div class="glass-bg">
|
|
134
|
+
|
|
135
|
+
<nav class="glass-nav">
|
|
136
|
+
<button class="glass-pill">
|
|
137
|
+
<svg viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
|
|
138
|
+
</button>
|
|
139
|
+
</nav>
|
|
140
|
+
|
|
141
|
+
<h1 class="glass-title">Hallo Welt</h1>
|
|
142
|
+
|
|
143
|
+
<div class="glass-card glass-card--glow">
|
|
144
|
+
<p class="glass-card__text">Das ist GlassKit.</p>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<button class="glass-btn glass-btn--primary">
|
|
148
|
+
Los geht's
|
|
149
|
+
</button>
|
|
150
|
+
|
|
151
|
+
</div>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 📦 Komponenten
|
|
157
|
+
|
|
158
|
+
### Navigation & Layout
|
|
159
|
+
|
|
160
|
+
| Komponente | Klasse | Beschreibung |
|
|
161
|
+
|---|---|---|
|
|
162
|
+
| **Hintergrund** | `.glass-bg` | Aurora-Gradient mit Lichteffekten |
|
|
163
|
+
| **Nav-Bar** | `.glass-nav` | Transparente Navigation |
|
|
164
|
+
| **Pill-Button** | `.glass-pill` | Runder Glas-Icon-Button (46×46) |
|
|
165
|
+
| **Tab-Bar** | `.glass-tab-bar` | Fixierte Bottom-Navigation |
|
|
166
|
+
| **Accordion** | `.glass-accordion` | Aufklappbare Inhalte |
|
|
167
|
+
| **Divider** | `.glass-divider` | Fading-Trennlinie |
|
|
168
|
+
|
|
169
|
+
### Inhalte
|
|
170
|
+
|
|
171
|
+
| Komponente | Klasse | Beschreibung |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| **Titel** | `.glass-title` | Seitentitel mit Text-Shadow |
|
|
174
|
+
| **Card** | `.glass-card` | Glas-Container für Inhalte |
|
|
175
|
+
| **Card (Glow)** | `.glass-card--glow` | Card mit Hell→Milchig-Verlauf |
|
|
176
|
+
| **Badge** | `.glass-badge` | Tags & Labels |
|
|
177
|
+
| **Avatar** | `.glass-avatar` | Glas-Kreis (sm/md/lg) |
|
|
178
|
+
| **Status** | `.glass-status` | Hinweis-Card mit Icon |
|
|
179
|
+
|
|
180
|
+
### Aktionen & Feedback
|
|
181
|
+
|
|
182
|
+
| Komponente | Klasse | Beschreibung |
|
|
183
|
+
|---|---|---|
|
|
184
|
+
| **Button (Primary)** | `.glass-btn--primary` | Farbiger Gradient – Hauptaktion |
|
|
185
|
+
| **Button (Secondary)** | `.glass-btn--secondary` | Milchig-weiß – Sekundäraktion |
|
|
186
|
+
| **Button (Tertiary)** | `.glass-btn--tertiary` | Subtiles Glas – Tertiäraktion |
|
|
187
|
+
| **Modal** | `.glass-modal` | Zentrierter Dialog mit Blur-Overlay |
|
|
188
|
+
| **Toast** | `.glass-toast` | Temporäre Benachrichtigung |
|
|
189
|
+
|
|
190
|
+
### Formularelemente
|
|
191
|
+
|
|
192
|
+
| Komponente | Klasse | Beschreibung |
|
|
193
|
+
|---|---|---|
|
|
194
|
+
| **Input** | `.glass-input` | Textfeld mit Glas-Hintergrund |
|
|
195
|
+
| **Textarea** | `.glass-textarea` | Mehrzeilige Eingabe |
|
|
196
|
+
| **Select** | `.glass-select` | Dropdown mit Custom-Chevron |
|
|
197
|
+
| **Suchfeld** | `.glass-search` | Input mit Lupen-Icon |
|
|
198
|
+
| **Toggle** | `.glass-toggle` | iOS-artiger Switch |
|
|
199
|
+
| **Checkbox** | `.glass-checkbox` | Animiertes Häkchen |
|
|
200
|
+
| **Radio** | `.glass-radio` | Animierter Punkt |
|
|
201
|
+
| **Range Slider** | `.glass-range` | Slider mit Gradient-Thumb |
|
|
202
|
+
| **Progress Bar** | `.glass-progress` | Fortschrittsbalken mit Schimmer |
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 🌗 Theming
|
|
207
|
+
|
|
208
|
+
### Dark / Light Mode
|
|
209
|
+
|
|
210
|
+
GlassKit unterstützt zwei Themes out of the box. Der Wechsel erfolgt über ein `data-theme` Attribut:
|
|
211
|
+
|
|
212
|
+
```js
|
|
213
|
+
// Toggle
|
|
214
|
+
function toggleTheme() {
|
|
215
|
+
const html = document.documentElement;
|
|
216
|
+
const current = html.getAttribute('data-theme');
|
|
217
|
+
html.setAttribute('data-theme', current === 'dark' ? 'light' : 'dark');
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Es gibt auch eine fertige **Theme-Toggle-Komponente**:
|
|
222
|
+
|
|
223
|
+
```html
|
|
224
|
+
<button class="glass-theme-toggle" onclick="toggleTheme()">
|
|
225
|
+
<svg class="icon-moon" viewBox="0 0 24 24">
|
|
226
|
+
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
|
|
227
|
+
</svg>
|
|
228
|
+
<svg class="icon-sun" viewBox="0 0 24 24">
|
|
229
|
+
<circle cx="12" cy="12" r="5"/>
|
|
230
|
+
<!-- ... Strahlen ... -->
|
|
231
|
+
</svg>
|
|
232
|
+
</button>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Eigene Markenfarben
|
|
236
|
+
|
|
237
|
+
Erstelle eine `theme-override.css` und lade sie **nach** der Basis-Library:
|
|
238
|
+
|
|
239
|
+
```css
|
|
240
|
+
/* theme-override.css */
|
|
241
|
+
:root {
|
|
242
|
+
--gl-color-primary: #007AFF;
|
|
243
|
+
--gl-color-primary-dark: #0055CC;
|
|
244
|
+
--gl-color-primary-mid: #0066E0;
|
|
245
|
+
|
|
246
|
+
--gl-border-warm: rgba(0, 122, 255, 0.35);
|
|
247
|
+
--gl-border-focus: rgba(0, 122, 255, 0.60);
|
|
248
|
+
|
|
249
|
+
--gl-shadow-btn-primary: 0 6px 24px rgba(0, 100, 220, 0.35),
|
|
250
|
+
0 2px 8px rgba(0, 0, 0, 0.15);
|
|
251
|
+
--gl-shadow-focus: 0 0 0 3px rgba(0, 122, 255, 0.3);
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Im `theme-override.css` Template sind bereits **4 Beispiel-Themes** vorbereitet:
|
|
256
|
+
- 🔵 Ocean Blue
|
|
257
|
+
- 🟢 Emerald Green
|
|
258
|
+
- 🌹 Rose
|
|
259
|
+
- 🎨 Custom (leer, zum Ausfüllen)
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 🎛️ Design Tokens
|
|
264
|
+
|
|
265
|
+
Alle visuellen Werte werden über CSS Custom Properties gesteuert:
|
|
266
|
+
|
|
267
|
+
```css
|
|
268
|
+
/* Farben */
|
|
269
|
+
--gl-color-primary /* Primärfarbe */
|
|
270
|
+
--gl-color-text /* Textfarbe */
|
|
271
|
+
--gl-color-text-muted /* Sekundärer Text */
|
|
272
|
+
|
|
273
|
+
/* Glasflächen (Abstufungen) */
|
|
274
|
+
--gl-surface-1 … --gl-surface-5
|
|
275
|
+
|
|
276
|
+
/* Blur */
|
|
277
|
+
--gl-blur /* 24px – Standard */
|
|
278
|
+
--gl-blur-light /* 16px */
|
|
279
|
+
--gl-blur-heavy /* 40px */
|
|
280
|
+
|
|
281
|
+
/* Radii */
|
|
282
|
+
--gl-radius-card /* 24px */
|
|
283
|
+
--gl-radius-btn /* 16px */
|
|
284
|
+
--gl-radius-input /* 14px */
|
|
285
|
+
|
|
286
|
+
/* Spacing */
|
|
287
|
+
--gl-space-xs … --gl-space-4xl
|
|
288
|
+
|
|
289
|
+
/* Shadows & Insets */
|
|
290
|
+
--gl-shadow-card
|
|
291
|
+
--gl-inset-strong
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Die vollständige Token-Referenz findest du in der [Dokumentation](docs.html).
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 🛠️ Utility-Klassen
|
|
299
|
+
|
|
300
|
+
```css
|
|
301
|
+
/* Flex-Layout */
|
|
302
|
+
.gl-stack /* Vertikaler Stack */
|
|
303
|
+
.gl-stack--sm /* Gap: 12px */
|
|
304
|
+
.gl-row /* Horizontale Reihe */
|
|
305
|
+
.gl-row--sm /* Gap: 12px */
|
|
306
|
+
|
|
307
|
+
/* Spacing */
|
|
308
|
+
.gl-mt-md /* Margin-Top: 16px */
|
|
309
|
+
.gl-mb-lg /* Margin-Bottom: 20px */
|
|
310
|
+
.gl-px /* Padding horizontal */
|
|
311
|
+
|
|
312
|
+
/* Text */
|
|
313
|
+
.gl-text-center
|
|
314
|
+
.gl-text-muted
|
|
315
|
+
.gl-text-sm
|
|
316
|
+
|
|
317
|
+
/* Layout */
|
|
318
|
+
.gl-w-full
|
|
319
|
+
.gl-flex-1
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 🧩 Web Components / Shadow DOM
|
|
325
|
+
|
|
326
|
+
Das Shadow DOM kapselt Styles – externe Stylesheets wie `glasskit.css` werden nicht automatisch in den Shadow Tree vererbt. GlassKit liefert deshalb ein fertiges **Constructable Stylesheet** mit, das du direkt in Web Components nutzen kannst.
|
|
327
|
+
|
|
328
|
+
### Das Problem
|
|
329
|
+
|
|
330
|
+
- CSS-Klassen (`.glass-card`, `.glass-btn` etc.) wirken **nicht** im Shadow DOM
|
|
331
|
+
- Nur **CSS Custom Properties** (`--gl-*`) durchdringen die Shadow-Boundary automatisch
|
|
332
|
+
- Ohne Lösung müsste jede Komponente das CSS selbst laden und parsen
|
|
333
|
+
|
|
334
|
+
### Die Lösung: `glasskit-styles.js`
|
|
335
|
+
|
|
336
|
+
GlassKit stellt ein ES-Modul bereit, das die minifizierte CSS als [Constructable Stylesheet](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet) exportiert. Das Stylesheet wird **einmal** im Speicher gehalten und kann von beliebig vielen Shadow Roots geteilt werden – ohne doppeltes Parsen.
|
|
337
|
+
|
|
338
|
+
```js
|
|
339
|
+
import { glassSheet } from '@jungherz-de/glasskit/glasskit-styles.js';
|
|
340
|
+
|
|
341
|
+
// In einer Web Component:
|
|
342
|
+
class MyCard extends HTMLElement {
|
|
343
|
+
constructor() {
|
|
344
|
+
super();
|
|
345
|
+
const shadow = this.attachShadow({ mode: 'open' });
|
|
346
|
+
shadow.adoptedStyleSheets = [glassSheet];
|
|
347
|
+
shadow.innerHTML = `
|
|
348
|
+
<div class="glass-card glass-card--glow">
|
|
349
|
+
<p class="glass-card__text"><slot></slot></p>
|
|
350
|
+
</div>
|
|
351
|
+
`;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
customElements.define('my-card', MyCard);
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Beispiel: Hybrids.js
|
|
358
|
+
|
|
359
|
+
GlassKit funktioniert hervorragend mit leichtgewichtigen Web-Component-Frameworks wie [Hybrids](https://hybrids.js.org/):
|
|
360
|
+
|
|
361
|
+
```js
|
|
362
|
+
import { define, html } from 'hybrids';
|
|
363
|
+
import { glassSheet } from '@jungherz-de/glasskit/glasskit-styles.js';
|
|
364
|
+
|
|
365
|
+
define({
|
|
366
|
+
tag: 'my-card',
|
|
367
|
+
render: () => html`
|
|
368
|
+
<div class="glass-card glass-card--glow">
|
|
369
|
+
<p class="glass-card__text">
|
|
370
|
+
<slot></slot>
|
|
371
|
+
</p>
|
|
372
|
+
</div>
|
|
373
|
+
`.css(glassSheet),
|
|
374
|
+
});
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Beispiel: Lit
|
|
378
|
+
|
|
379
|
+
```js
|
|
380
|
+
import { LitElement, html } from 'lit';
|
|
381
|
+
import { glassSheet } from '@jungherz-de/glasskit/glasskit-styles.js';
|
|
382
|
+
|
|
383
|
+
class MyCard extends LitElement {
|
|
384
|
+
static styles = [glassSheet];
|
|
385
|
+
|
|
386
|
+
render() {
|
|
387
|
+
return html`
|
|
388
|
+
<div class="glass-card glass-card--glow">
|
|
389
|
+
<p class="glass-card__text"><slot></slot></p>
|
|
390
|
+
</div>
|
|
391
|
+
`;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
customElements.define('my-card', MyCard);
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Exports
|
|
398
|
+
|
|
399
|
+
| Export | Typ | Beschreibung |
|
|
400
|
+
|---|---|---|
|
|
401
|
+
| `glassSheet` | `CSSStyleSheet` | Fertiges Constructable Stylesheet – direkt für `adoptedStyleSheets` |
|
|
402
|
+
| `css` | `string` | CSS als String – Fallback für Umgebungen ohne Constructable Stylesheet Support |
|
|
403
|
+
|
|
404
|
+
### Theming im Shadow DOM
|
|
405
|
+
|
|
406
|
+
Da CSS Custom Properties die Shadow-Boundary durchdringen, funktioniert der **Theme-Wechsel automatisch**. Setze `data-theme` wie gewohnt auf dem `<html>` Element – alle GlassKit-Tokens werden in allen Shadow Roots aktualisiert:
|
|
407
|
+
|
|
408
|
+
```js
|
|
409
|
+
// Funktioniert global – auch für alle Web Components
|
|
410
|
+
document.documentElement.setAttribute('data-theme', 'light');
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
> **Tipp:** Für maximale Performance bei vielen Komponenten-Instanzen empfiehlt es sich, `glassSheet` einmal zu importieren und in allen Komponenten zu teilen. Der Browser hält das Stylesheet nur einmal im Speicher.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## 📁 Projektstruktur
|
|
418
|
+
|
|
419
|
+
```
|
|
420
|
+
glasskit/
|
|
421
|
+
├── glasskit.css # Kern-Library (alle Komponenten + Tokens)
|
|
422
|
+
├── glasskit.min.css # Minifizierte Version (auto-generated bei Release)
|
|
423
|
+
├── glasskit-styles.js # Constructable Stylesheet für Shadow DOM (auto-generated)
|
|
424
|
+
├── theme-override.css # Template für eigene Themes
|
|
425
|
+
├── build-styles-js.mjs # Build-Script für glasskit-styles.js
|
|
426
|
+
├── package.json # npm-Paketdefinition
|
|
427
|
+
├── index.html # Landingpage mit iPhone-Wireframe
|
|
428
|
+
├── showcase.html # Interaktiver Showcase aller Komponenten
|
|
429
|
+
├── docs.html # Vollständige Dokumentation
|
|
430
|
+
├── LICENSE # MIT License
|
|
431
|
+
└── README.md # Diese Datei
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## 📖 Dokumentation
|
|
437
|
+
|
|
438
|
+
Die vollständige Dokumentation mit **Live-Previews**, **Copy-Paste Code-Blocks** und **Klassen-Tabellen** findest du in der `docs.html`:
|
|
439
|
+
|
|
440
|
+
- Sidebar-Navigation zu allen 22 Komponenten
|
|
441
|
+
- Live-Previews im echten Glasmorphism-Hintergrund
|
|
442
|
+
- Design-Token-Referenz
|
|
443
|
+
- Theming-Anleitung
|
|
444
|
+
- Komplette Klassen-Übersicht am Ende
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## 🌐 Browser-Kompatibilität
|
|
449
|
+
|
|
450
|
+
GlassKit nutzt `backdrop-filter` für die Glaseffekte. Support:
|
|
451
|
+
|
|
452
|
+
| Browser | Support |
|
|
453
|
+
|---|---|
|
|
454
|
+
| Safari (iOS/macOS) | ✅ Voll |
|
|
455
|
+
| Chrome / Edge | ✅ Voll |
|
|
456
|
+
| Firefox | ✅ Ab Version 103 |
|
|
457
|
+
| Samsung Internet | ✅ Voll |
|
|
458
|
+
|
|
459
|
+
> **Hinweis:** In Browsern ohne `backdrop-filter`-Support werden die Elemente mit den definierten Hintergrundfarben dargestellt – die UI bleibt nutzbar, nur ohne Blur-Effekt.
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## 📋 States & Modifier – Cheat Sheet
|
|
464
|
+
|
|
465
|
+
```
|
|
466
|
+
Interaktive States:
|
|
467
|
+
.is-active → Tab-Bar Item, Modal Overlay
|
|
468
|
+
.is-open → Accordion Item
|
|
469
|
+
.is-visible → Toast
|
|
470
|
+
:checked → Toggle, Checkbox, Radio
|
|
471
|
+
:focus → Input, Textarea, Select, Range
|
|
472
|
+
:disabled → Input
|
|
473
|
+
|
|
474
|
+
Button-Modifier:
|
|
475
|
+
.glass-btn--primary / --secondary / --tertiary
|
|
476
|
+
.glass-btn--sm / --lg / --auto
|
|
477
|
+
|
|
478
|
+
Card-Modifier:
|
|
479
|
+
.glass-card--glow
|
|
480
|
+
|
|
481
|
+
Progress-Modifier:
|
|
482
|
+
.glass-progress--sm / --lg
|
|
483
|
+
.glass-progress--success / --error
|
|
484
|
+
|
|
485
|
+
Badge-Modifier:
|
|
486
|
+
.glass-badge--primary / --success / --error
|
|
487
|
+
|
|
488
|
+
Avatar-Modifier:
|
|
489
|
+
.glass-avatar--sm / --lg
|
|
490
|
+
|
|
491
|
+
Toast-Modifier:
|
|
492
|
+
.glass-toast--success / --error / --warning
|
|
493
|
+
|
|
494
|
+
Modal-Action-Modifier:
|
|
495
|
+
.glass-modal__action--primary / --danger
|
|
496
|
+
|
|
497
|
+
Background-Modifier:
|
|
498
|
+
.glass-bg--has-tab-bar
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## 🤝 Contributing
|
|
504
|
+
|
|
505
|
+
Beiträge sind willkommen! So kannst du helfen:
|
|
506
|
+
|
|
507
|
+
1. **Fork** das Repository
|
|
508
|
+
2. Erstelle einen **Feature-Branch** (`git checkout -b feature/meine-idee`)
|
|
509
|
+
3. **Commit** deine Änderungen (`git commit -m 'feat: Neue Komponente XY'`)
|
|
510
|
+
4. **Push** den Branch (`git push origin feature/meine-idee`)
|
|
511
|
+
5. Öffne einen **Pull Request**
|
|
512
|
+
|
|
513
|
+
### Guidelines
|
|
514
|
+
|
|
515
|
+
- Halte die **BEM-artige Namenskonvention** ein (`glass-*` Prefix)
|
|
516
|
+
- Nutze bestehende **Design Tokens** statt harter Werte
|
|
517
|
+
- Stelle sicher, dass neue Komponenten in **Dark und Light Mode** funktionieren
|
|
518
|
+
- Teste auf **Mobile** (Touch-Targets mindestens 44px)
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## 📄 Lizenz
|
|
523
|
+
|
|
524
|
+
GlassKit ist unter der **MIT License** veröffentlicht. Siehe [LICENSE](LICENSE) für Details.
|
|
525
|
+
|
|
526
|
+
Frei nutzbar für persönliche und kommerzielle Projekte.
|
|
527
|
+
|
|
528
|
+
---
|
|
529
|
+
|
|
530
|
+
## 📋 Changelog
|
|
531
|
+
|
|
532
|
+
Alle Änderungen, Bugfixes und Design Decisions sind im **[CHANGELOG.md](CHANGELOG.md)** dokumentiert.
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## 🏢 Credits
|
|
537
|
+
|
|
538
|
+
Entwickelt von der **[Jungherz GmbH](https://www.jungherz.com)**
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
<p align="center">
|
|
543
|
+
<sub>Gebaut mit 🧊 und viel Liebe zum Detail.</sub>
|
|
544
|
+
</p>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// GlassKit v1.3.0 – Constructable Stylesheet
|
|
2
|
+
// Auto-generated by build-styles-js.mjs – do not edit manually.
|
|
3
|
+
|
|
4
|
+
const css = "[class*=gl-],[class*=glass-],[class*=glass-]::after,[class*=glass-]::before{box-sizing:border-box}:root,[data-theme=dark]{--gl-color-primary:#f5a623;--gl-color-primary-dark:#d4692a;--gl-color-primary-mid:#e07a24;--gl-color-bg-dark:#0e2530;--gl-color-bg-mid:#1a3d4e;--gl-color-bg-light:#1b3e50;--gl-color-text:#ffffff;--gl-color-text-muted:rgba(255, 255, 255, 0.60);--gl-color-text-on-light:#1a3a4a;--gl-color-text-heading:#ffffff;--gl-color-success:#34c759;--gl-color-error:#ff3b30;--gl-color-warning:#ffcc00;--gl-surface-1:rgba(255, 255, 255, 0.08);--gl-surface-2:rgba(255, 255, 255, 0.10);--gl-surface-3:rgba(255, 255, 255, 0.14);--gl-surface-4:rgba(255, 255, 255, 0.16);--gl-surface-5:rgba(255, 255, 255, 0.22);--gl-surface-milk:rgba(255, 255, 255, 0.55);--gl-surface-milk-strong:rgba(255, 255, 255, 0.75);--gl-surface-overlay:rgba(0, 0, 0, 0.50);--gl-card-glow-top:rgba(255, 255, 255, 0.32);--gl-card-glow-mid:rgba(255, 255, 255, 0.22);--gl-card-glow-low:rgba(255, 255, 255, 0.14);--gl-card-glow-bottom:rgba(255, 255, 255, 0.08);--gl-card-icon-color:rgba(255, 255, 255, 0.8);--gl-card-text-color:rgba(255, 255, 255, 0.7);--gl-border-subtle:rgba(255, 255, 255, 0.18);--gl-border-medium:rgba(255, 255, 255, 0.30);--gl-border-strong:rgba(255, 255, 255, 0.40);--gl-border-milk:rgba(255, 255, 255, 0.60);--gl-border-warm:rgba(255, 200, 100, 0.35);--gl-border-focus:rgba(245, 166, 35, 0.60);--gl-icon-default:rgba(255, 255, 255, 0.6);--gl-icon-muted:rgba(255, 255, 255, 0.45);--gl-icon-strong:rgba(255, 255, 255, 0.8);--gl-icon-on-primary:#ffffff;--gl-icon-on-secondary:#1a3a4a;--gl-icon-on-tertiary:rgba(255, 255, 255, 0.6);--gl-blur:24px;--gl-blur-light:16px;--gl-blur-soft:12px;--gl-blur-heavy:40px;--gl-radius-pill:50%;--gl-radius-full:9999px;--gl-radius-card:24px;--gl-radius-btn:16px;--gl-radius-input:14px;--gl-radius-sm:12px;--gl-radius-xs:8px;--gl-shadow-card:0 8px 32px rgba(0, 0, 0, 0.18);--gl-shadow-btn:0 4px 16px rgba(0, 0, 0, 0.12);--gl-shadow-btn-primary:0 6px 24px rgba(230, 130, 40, 0.35),0 2px 8px rgba(0, 0, 0, 0.15);--gl-shadow-glow:0 2px 12px rgba(255, 255, 255, 0.08),0 4px 16px rgba(0, 0, 0, 0.15);--gl-shadow-modal:0 24px 80px rgba(0, 0, 0, 0.4),0 8px 32px rgba(0, 0, 0, 0.2);--gl-shadow-toast:0 8px 32px rgba(0, 0, 0, 0.25);--gl-shadow-focus:0 0 0 3px rgba(245, 166, 35, 0.3);--gl-inset-subtle:inset 0 1px 1px rgba(255, 255, 255, 0.10);--gl-inset-medium:inset 0 1px 1px rgba(255, 255, 255, 0.15);--gl-inset-strong:inset 0 1px 2px rgba(255, 255, 255, 0.25);--gl-inset-milk:inset 0 1px 2px rgba(255, 255, 255, 0.40);--gl-bg-aurora-1:rgba(60, 160, 160, 0.25);--gl-bg-aurora-2:rgba(200, 140, 60, 0.12);--gl-bg-aurora-3:rgba(80, 180, 200, 0.18);--gl-bg-light-streak-1:rgba(90, 210, 200, 0.14);--gl-bg-light-streak-2:rgba(110, 200, 190, 0.10);--gl-bg-warm-glow:rgba(220, 160, 70, 0.10);--gl-space-2xs:4px;--gl-space-xs:8px;--gl-space-sm:12px;--gl-space-md:16px;--gl-space-lg:20px;--gl-space-xl:24px;--gl-space-2xl:32px;--gl-space-3xl:40px;--gl-space-4xl:56px;--gl-font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Roboto,Helvetica,Arial,sans-serif;--gl-font-size-xs:13px;--gl-font-size-sm:14px;--gl-font-size-base:15px;--gl-font-size-btn:16px;--gl-font-size-lg:18px;--gl-font-size-title:24px;--gl-font-size-modal:20px;--gl-font-weight-normal:400;--gl-font-weight-medium:500;--gl-font-weight-semibold:600;--gl-transition:all 0.25s ease;--gl-transition-fast:all 0.15s ease;--gl-transition-modal:all 0.3s cubic-bezier(0.4, 0, 0.2, 1);--gl-tab-bar-height:82px;--gl-placeholder:rgba(255, 255, 255, 0.35);--gl-accordion-body-color:var(--gl-color-text-muted);--gl-toggle-thumb-bg:linear-gradient(to bottom,\n rgba(255,255,255,0.9) 0%,\n rgba(255,255,255,0.7) 100%);--gl-range-track-bg:var(--gl-surface-2);--gl-range-track-border:var(--gl-border-subtle)}[data-theme=light]{--gl-color-primary:#e8852d;--gl-color-primary-dark:#c96a1e;--gl-color-primary-mid:#d97826;--gl-color-bg-dark:#e8ecf1;--gl-color-bg-mid:#f0f4f8;--gl-color-bg-light:#f5f7fa;--gl-color-text:#1a2a36;--gl-color-text-muted:rgba(26, 42, 54, 0.55);--gl-color-text-on-light:#1a3a4a;--gl-color-text-heading:#0f1f2a;--gl-color-success:#28a745;--gl-color-error:#dc3545;--gl-color-warning:#e6a800;--gl-surface-1:rgba(255, 255, 255, 0.50);--gl-surface-2:rgba(255, 255, 255, 0.60);--gl-surface-3:rgba(255, 255, 255, 0.70);--gl-surface-4:rgba(255, 255, 255, 0.75);--gl-surface-5:rgba(255, 255, 255, 0.85);--gl-surface-milk:rgba(255, 255, 255, 0.85);--gl-surface-milk-strong:rgba(255, 255, 255, 0.92);--gl-surface-overlay:rgba(0, 0, 0, 0.25);--gl-card-glow-top:rgba(255, 255, 255, 0.90);--gl-card-glow-mid:rgba(255, 255, 255, 0.78);--gl-card-glow-low:rgba(255, 255, 255, 0.65);--gl-card-glow-bottom:rgba(255, 255, 255, 0.50);--gl-card-icon-color:rgba(26, 42, 54, 0.5);--gl-card-text-color:rgba(26, 42, 54, 0.6);--gl-border-subtle:rgba(0, 0, 0, 0.08);--gl-border-medium:rgba(0, 0, 0, 0.12);--gl-border-strong:rgba(0, 0, 0, 0.15);--gl-border-milk:rgba(0, 0, 0, 0.10);--gl-border-warm:rgba(232, 133, 45, 0.30);--gl-border-focus:rgba(232, 133, 45, 0.50);--gl-icon-default:rgba(26, 42, 54, 0.50);--gl-icon-muted:rgba(26, 42, 54, 0.35);--gl-icon-strong:rgba(26, 42, 54, 0.70);--gl-icon-on-primary:#ffffff;--gl-icon-on-secondary:#1a3a4a;--gl-icon-on-tertiary:rgba(26, 42, 54, 0.50);--gl-shadow-card:0 4px 20px rgba(0, 0, 0, 0.06);--gl-shadow-btn:0 2px 10px rgba(0, 0, 0, 0.06);--gl-shadow-btn-primary:0 4px 16px rgba(232, 133, 45, 0.25),0 2px 6px rgba(0, 0, 0, 0.08);--gl-shadow-glow:0 2px 8px rgba(0, 0, 0, 0.05),0 4px 12px rgba(0, 0, 0, 0.04);--gl-shadow-modal:0 16px 48px rgba(0, 0, 0, 0.12),0 4px 16px rgba(0, 0, 0, 0.08);--gl-shadow-toast:0 4px 20px rgba(0, 0, 0, 0.10);--gl-shadow-focus:0 0 0 3px rgba(232, 133, 45, 0.25);--gl-inset-subtle:inset 0 1px 1px rgba(255, 255, 255, 0.60);--gl-inset-medium:inset 0 1px 1px rgba(255, 255, 255, 0.70);--gl-inset-strong:inset 0 1px 2px rgba(255, 255, 255, 0.80);--gl-inset-milk:inset 0 1px 2px rgba(255, 255, 255, 0.90);--gl-bg-aurora-1:rgba(100, 200, 220, 0.15);--gl-bg-aurora-2:rgba(240, 180, 100, 0.10);--gl-bg-aurora-3:rgba(120, 200, 230, 0.12);--gl-bg-light-streak-1:rgba(140, 230, 220, 0.10);--gl-bg-light-streak-2:rgba(160, 220, 210, 0.08);--gl-bg-warm-glow:rgba(240, 180, 100, 0.08);--gl-placeholder:rgba(26, 42, 54, 0.30);--gl-accordion-body-color:var(--gl-color-text-muted);--gl-toggle-thumb-bg:linear-gradient(to bottom, #ffffff 0%, #f0f0f0 100%);--gl-range-track-bg:var(--gl-surface-2);--gl-range-track-border:var(--gl-border-subtle)}.glass-bg{background:radial-gradient(ellipse at 20% 40%,var(--gl-bg-aurora-1) 0,transparent 55%),radial-gradient(ellipse at 80% 65%,var(--gl-bg-aurora-2) 0,transparent 50%),radial-gradient(ellipse at 50% 20%,var(--gl-bg-aurora-3) 0,transparent 50%),linear-gradient(170deg,var(--gl-color-bg-light) 0,var(--gl-color-bg-mid) 50%,var(--gl-color-bg-dark) 100%);position:relative;min-height:100vh;overflow-x:hidden;font-family:var(--gl-font-family);color:var(--gl-color-text);-webkit-font-smoothing:antialiased;transition:background .4s,color .3s}.glass-bg::before{content:'';position:absolute;top:20%;left:-30%;width:160%;height:55%;background:radial-gradient(ellipse at 35% 45%,var(--gl-bg-light-streak-1) 0,transparent 50%),radial-gradient(ellipse at 65% 55%,var(--gl-bg-light-streak-2) 0,transparent 45%);transform:rotate(-8deg);pointer-events:none;z-index:0}.glass-bg::after{content:'';position:absolute;top:40%;right:-20%;width:70%;height:50%;background:radial-gradient(ellipse at center,var(--gl-bg-warm-glow) 0,transparent 65%);pointer-events:none;z-index:0}.glass-bg>*{position:relative;z-index:1}.glass-bg--has-tab-bar{padding-bottom:var(--gl-tab-bar-height)}.glass-nav{display:flex;justify-content:space-between;align-items:center;padding:0 var(--gl-space-xs)}.glass-pill{width:46px;height:46px;border-radius:var(--gl-radius-pill);background:var(--gl-surface-3);backdrop-filter:blur(var(--gl-blur));-webkit-backdrop-filter:blur(var(--gl-blur));border:1.5px solid var(--gl-border-strong);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:var(--gl-transition);color:var(--gl-color-text);box-shadow:var(--gl-shadow-glow),var(--gl-inset-medium);outline:0;-webkit-tap-highlight-color:transparent}.glass-pill:hover{background:var(--gl-surface-5);transform:scale(1.05)}.glass-pill:active{transform:scale(.95)}.glass-pill svg{width:20px;height:20px;fill:none;stroke:var(--gl-color-text);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}.glass-title{text-align:center;color:var(--gl-color-text-heading);font-size:var(--gl-font-size-title);font-weight:var(--gl-font-weight-semibold);line-height:1.3;text-shadow:0 2px 12px rgba(0,0,0,.15);letter-spacing:-.3px}.glass-card{background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur));-webkit-backdrop-filter:blur(var(--gl-blur));border:1.5px solid var(--gl-border-medium);border-radius:var(--gl-radius-card);padding:var(--gl-space-3xl) var(--gl-space-xl) var(--gl-space-2xl);box-shadow:var(--gl-shadow-card),var(--gl-inset-strong)}.glass-card--glow{position:relative;overflow:hidden;background:linear-gradient(to bottom,var(--gl-card-glow-top) 0,var(--gl-card-glow-mid) 25%,var(--gl-card-glow-low) 55%,var(--gl-card-glow-bottom) 100%)}.glass-card--glow::before{content:'';position:absolute;top:0;left:10%;right:10%;height:1px;background:linear-gradient(90deg,transparent 0,rgba(255,255,255,.5) 30%,rgba(255,255,255,.6) 50%,rgba(255,255,255,.5) 70%,transparent 100%);z-index:1}.glass-card__icon{display:flex;align-items:center;justify-content:center;margin:0 auto var(--gl-space-lg)}.glass-card__icon svg{width:64px;height:64px;stroke:var(--gl-card-icon-color);stroke-width:1.2;fill:none}.glass-card__text{color:var(--gl-card-text-color);font-size:var(--gl-font-size-base);font-weight:var(--gl-font-weight-normal);line-height:1.55;text-align:center}.glass-btn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;height:56px;border:none;border-radius:var(--gl-radius-btn);font-family:var(--gl-font-family);font-size:var(--gl-font-size-btn);font-weight:var(--gl-font-weight-semibold);cursor:pointer;transition:var(--gl-transition);outline:0;-webkit-tap-highlight-color:transparent}.glass-btn svg{width:20px;height:20px;flex-shrink:0}.glass-btn--primary{background:linear-gradient(135deg,var(--gl-color-primary) 0,var(--gl-color-primary-mid) 50%,var(--gl-color-primary-dark) 100%);color:#fff;border:1px solid var(--gl-border-warm);box-shadow:var(--gl-shadow-btn-primary),var(--gl-inset-strong)}.glass-btn--primary svg{fill:var(--gl-icon-on-primary);stroke:var(--gl-icon-on-primary);stroke-width:0}.glass-btn--primary:hover{transform:translateY(-1px)}.glass-btn--primary:active{transform:translateY(1px)}.glass-btn--secondary{background:linear-gradient(to bottom,var(--gl-surface-milk-strong) 0,var(--gl-surface-milk) 100%);backdrop-filter:blur(var(--gl-blur));-webkit-backdrop-filter:blur(var(--gl-blur));border:1.5px solid var(--gl-border-milk);color:var(--gl-color-text-on-light);box-shadow:var(--gl-shadow-btn),var(--gl-inset-milk)}.glass-btn--secondary svg{fill:none;stroke:var(--gl-icon-on-secondary);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.glass-btn--secondary:hover{transform:translateY(-1px)}.glass-btn--secondary:active{transform:translateY(1px)}.glass-btn--tertiary{background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-light));-webkit-backdrop-filter:blur(var(--gl-blur-light));border:1px solid var(--gl-border-subtle);color:var(--gl-color-text-muted);box-shadow:0 4px 12px rgba(0,0,0,.1),var(--gl-inset-subtle)}.glass-btn--tertiary svg{fill:none;stroke:var(--gl-icon-on-tertiary);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.glass-btn--tertiary:hover{background:var(--gl-surface-4);color:var(--gl-color-text);transform:translateY(-1px)}.glass-btn--tertiary:active{transform:translateY(1px)}.glass-btn--sm{height:44px;font-size:var(--gl-font-size-sm);border-radius:var(--gl-radius-sm)}.glass-btn--lg{height:64px;font-size:var(--gl-font-size-lg)}.glass-btn--auto{width:auto;padding:0 var(--gl-space-xl)}.glass-status{background:var(--gl-surface-1);backdrop-filter:blur(var(--gl-blur-light));-webkit-backdrop-filter:blur(var(--gl-blur-light));border:1px solid var(--gl-border-subtle);border-radius:var(--gl-radius-btn);padding:var(--gl-space-md) var(--gl-space-lg);display:flex;align-items:center;gap:var(--gl-space-sm);box-shadow:0 4px 12px rgba(0,0,0,.08),var(--gl-inset-subtle)}.glass-status svg{width:20px;height:20px;flex-shrink:0;stroke:var(--gl-icon-muted);stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}.glass-status p{color:var(--gl-color-text-muted);font-size:var(--gl-font-size-sm);font-weight:var(--gl-font-weight-normal);line-height:1.45}.glass-input-group{display:flex;flex-direction:column;gap:var(--gl-space-xs)}.glass-label{font-size:var(--gl-font-size-sm);font-weight:var(--gl-font-weight-medium);color:var(--gl-icon-strong);padding-left:var(--gl-space-2xs)}.glass-input{width:100%;height:52px;padding:0 var(--gl-space-md);background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-light));-webkit-backdrop-filter:blur(var(--gl-blur-light));border:1.5px solid var(--gl-border-medium);border-radius:var(--gl-radius-input);color:var(--gl-color-text);font-family:var(--gl-font-family);font-size:var(--gl-font-size-base);transition:var(--gl-transition);outline:0;box-shadow:var(--gl-inset-subtle);-webkit-tap-highlight-color:transparent}.glass-input::placeholder{color:var(--gl-placeholder)}.glass-input:focus{border-color:var(--gl-border-focus);background:var(--gl-surface-3);box-shadow:var(--gl-shadow-focus),var(--gl-inset-medium)}.glass-input:disabled{opacity:.4;cursor:not-allowed}.glass-input--error{border-color:var(--gl-color-error)}.glass-input--error:focus{box-shadow:0 0 0 3px rgba(255,59,48,.25),var(--gl-inset-medium)}.glass-hint{font-size:var(--gl-font-size-xs);color:var(--gl-color-text-muted);padding-left:var(--gl-space-2xs)}.glass-hint--error{color:var(--gl-color-error)}.glass-textarea{width:100%;min-height:120px;padding:var(--gl-space-md);background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-light));-webkit-backdrop-filter:blur(var(--gl-blur-light));border:1.5px solid var(--gl-border-medium);border-radius:var(--gl-radius-input);color:var(--gl-color-text);font-family:var(--gl-font-family);font-size:var(--gl-font-size-base);line-height:1.5;resize:vertical;transition:var(--gl-transition);outline:0;box-shadow:var(--gl-inset-subtle)}.glass-textarea::placeholder{color:var(--gl-placeholder)}.glass-textarea:focus{border-color:var(--gl-border-focus);background:var(--gl-surface-3);box-shadow:var(--gl-shadow-focus),var(--gl-inset-medium)}.glass-select{width:100%;height:52px;padding:0 var(--gl-space-3xl) 0 var(--gl-space-md);background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-light));-webkit-backdrop-filter:blur(var(--gl-blur-light));border:1.5px solid var(--gl-border-medium);border-radius:var(--gl-radius-input);color:var(--gl-color-text);font-family:var(--gl-font-family);font-size:var(--gl-font-size-base);transition:var(--gl-transition);outline:0;box-shadow:var(--gl-inset-subtle);cursor:pointer;appearance:none;-webkit-appearance:none;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\");background-repeat:no-repeat;background-position:right 16px center}.glass-select:focus{border-color:var(--gl-border-focus);box-shadow:var(--gl-shadow-focus),var(--gl-inset-medium)}.glass-select option{background:var(--gl-color-bg-mid);color:var(--gl-color-text)}.glass-search{position:relative;display:flex;align-items:center}.glass-search__icon{position:absolute;left:var(--gl-space-md);width:18px;height:18px;stroke:var(--gl-icon-muted)!important;stroke-width:2!important;stroke-linecap:round!important;stroke-linejoin:round!important;fill:none!important;pointer-events:none;z-index:2}.glass-search .glass-input{padding-left:44px;border-radius:var(--gl-radius-full)}.glass-toggle{display:inline-flex;align-items:center;gap:var(--gl-space-sm);cursor:pointer;-webkit-tap-highlight-color:transparent}.glass-toggle__input{position:absolute;opacity:0;width:0;height:0}.glass-toggle__track{position:relative;width:52px;height:30px;background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-soft));-webkit-backdrop-filter:blur(var(--gl-blur-soft));border:1.5px solid var(--gl-border-medium);border-radius:var(--gl-radius-full);transition:var(--gl-transition);box-shadow:var(--gl-inset-subtle);flex-shrink:0}.glass-toggle__thumb{position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:var(--gl-radius-pill);background:var(--gl-toggle-thumb-bg);box-shadow:0 2px 6px rgba(0,0,0,.2),var(--gl-inset-milk);transition:var(--gl-transition)}.glass-toggle__input:checked+.glass-toggle__track{background:linear-gradient(135deg,var(--gl-color-primary) 0,var(--gl-color-primary-dark) 100%);border-color:var(--gl-border-warm)}.glass-toggle__input:checked+.glass-toggle__track .glass-toggle__thumb{transform:translateX(22px)}.glass-toggle__input:focus-visible+.glass-toggle__track{box-shadow:var(--gl-shadow-focus)}.glass-toggle__label{font-size:var(--gl-font-size-base);color:var(--gl-color-text);user-select:none}.glass-checkbox{display:inline-flex;align-items:center;gap:var(--gl-space-sm);cursor:pointer;-webkit-tap-highlight-color:transparent}.glass-checkbox__input{position:absolute;opacity:0;width:0;height:0}.glass-checkbox__box{width:24px;height:24px;border-radius:var(--gl-radius-xs);background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-soft));-webkit-backdrop-filter:blur(var(--gl-blur-soft));border:1.5px solid var(--gl-border-medium);display:flex;align-items:center;justify-content:center;transition:var(--gl-transition);box-shadow:var(--gl-inset-subtle);flex-shrink:0}.glass-checkbox__box svg{width:14px;height:14px;stroke:white;stroke-width:3;fill:none;stroke-linecap:round;stroke-linejoin:round;opacity:0;transform:scale(.5);transition:var(--gl-transition-fast)}.glass-checkbox__input:checked+.glass-checkbox__box{background:linear-gradient(135deg,var(--gl-color-primary) 0,var(--gl-color-primary-dark) 100%);border-color:var(--gl-border-warm)}.glass-checkbox__input:checked+.glass-checkbox__box svg{opacity:1;transform:scale(1)}.glass-checkbox__input:focus-visible+.glass-checkbox__box{box-shadow:var(--gl-shadow-focus)}.glass-checkbox__label{font-size:var(--gl-font-size-base);color:var(--gl-color-text);user-select:none}.glass-radio{display:inline-flex;align-items:center;gap:var(--gl-space-sm);cursor:pointer;-webkit-tap-highlight-color:transparent}.glass-radio__input{position:absolute;opacity:0;width:0;height:0}.glass-radio__circle{width:24px;height:24px;border-radius:var(--gl-radius-pill);background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-soft));border:1.5px solid var(--gl-border-medium);display:flex;align-items:center;justify-content:center;transition:var(--gl-transition);box-shadow:var(--gl-inset-subtle);flex-shrink:0}.glass-radio__dot{width:10px;height:10px;border-radius:var(--gl-radius-pill);background:#fff;opacity:0;transform:scale(0);transition:var(--gl-transition-fast)}.glass-radio__input:checked+.glass-radio__circle{background:linear-gradient(135deg,var(--gl-color-primary) 0,var(--gl-color-primary-dark) 100%);border-color:var(--gl-border-warm)}.glass-radio__input:checked+.glass-radio__circle .glass-radio__dot{opacity:1;transform:scale(1)}.glass-radio__input:focus-visible+.glass-radio__circle{box-shadow:var(--gl-shadow-focus)}.glass-radio__label{font-size:var(--gl-font-size-base);color:var(--gl-color-text);user-select:none}.glass-range-group{display:flex;flex-direction:column;gap:var(--gl-space-xs)}.glass-range-header{display:flex;justify-content:space-between;align-items:baseline}.glass-range-value{font-size:var(--gl-font-size-sm);font-weight:var(--gl-font-weight-semibold);color:var(--gl-color-primary);font-variant-numeric:tabular-nums}.glass-range{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:var(--gl-radius-full);background:var(--gl-range-track-bg);border:1px solid var(--gl-range-track-border);outline:0;cursor:pointer}.glass-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:26px;height:26px;border-radius:var(--gl-radius-pill);background:linear-gradient(135deg,var(--gl-color-primary) 0,var(--gl-color-primary-dark) 100%);border:2px solid rgba(255,255,255,.5);box-shadow:0 2px 8px rgba(230,130,40,.35),var(--gl-inset-strong);margin-top:-10px;cursor:pointer;transition:var(--gl-transition)}.glass-range::-webkit-slider-thumb:hover{transform:scale(1.1)}.glass-range::-moz-range-thumb{width:26px;height:26px;border-radius:var(--gl-radius-pill);background:linear-gradient(135deg,var(--gl-color-primary) 0,var(--gl-color-primary-dark) 100%);border:2px solid rgba(255,255,255,.5);box-shadow:0 2px 8px rgba(230,130,40,.35);cursor:pointer}.glass-range::-moz-range-track{height:6px;border-radius:var(--gl-radius-full);background:var(--gl-range-track-bg);border:1px solid var(--gl-range-track-border)}.glass-range:focus-visible{box-shadow:var(--gl-shadow-focus)}.glass-progress{width:100%;display:flex;flex-direction:column;gap:var(--gl-space-xs)}.glass-progress__header{display:flex;justify-content:space-between;align-items:baseline}.glass-progress__label{font-size:var(--gl-font-size-sm);font-weight:var(--gl-font-weight-medium);color:var(--gl-icon-strong)}.glass-progress__value{font-size:var(--gl-font-size-xs);font-weight:var(--gl-font-weight-semibold);color:var(--gl-color-text-muted);font-variant-numeric:tabular-nums}.glass-progress__track{width:100%;height:8px;border-radius:var(--gl-radius-full);background:var(--gl-surface-2);border:1px solid var(--gl-border-subtle);overflow:hidden;box-shadow:var(--gl-inset-subtle)}.glass-progress__fill{height:100%;border-radius:var(--gl-radius-full);background:linear-gradient(90deg,var(--gl-color-primary) 0,var(--gl-color-primary-dark) 100%);box-shadow:0 0 8px rgba(245,166,35,.3),var(--gl-inset-strong);transition:width .5s cubic-bezier(.4, 0, .2, 1);position:relative}.glass-progress__fill::after{content:'';position:absolute;top:0;left:0;right:0;height:50%;border-radius:var(--gl-radius-full);background:linear-gradient(to bottom,rgba(255,255,255,.3) 0,transparent 100%)}.glass-progress--sm .glass-progress__track{height:4px}.glass-progress--lg .glass-progress__track{height:12px}.glass-progress--success .glass-progress__fill{background:linear-gradient(90deg,#34c759 0,#2da44e 100%);box-shadow:0 0 8px rgba(52,199,89,.3),var(--gl-inset-strong)}.glass-progress--error .glass-progress__fill{background:linear-gradient(90deg,#ff3b30 0,#d63027 100%);box-shadow:0 0 8px rgba(255,59,48,.3),var(--gl-inset-strong)}.glass-modal-overlay{position:fixed;inset:0;background:var(--gl-surface-overlay);backdrop-filter:blur(var(--gl-blur-soft));-webkit-backdrop-filter:blur(var(--gl-blur-soft));display:flex;align-items:center;justify-content:center;padding:var(--gl-space-lg);z-index:1000;opacity:0;pointer-events:none;transition:var(--gl-transition-modal);font-family:var(--gl-font-family);-webkit-font-smoothing:antialiased}.glass-modal-overlay.is-active{opacity:1;pointer-events:auto}.glass-modal{width:100%;max-width:340px;background:linear-gradient(to bottom,var(--gl-card-glow-top) 0,var(--gl-card-glow-bottom) 100%);backdrop-filter:blur(var(--gl-blur-heavy));-webkit-backdrop-filter:blur(var(--gl-blur-heavy));border:1.5px solid var(--gl-border-medium);border-radius:var(--gl-radius-card);overflow:hidden;box-shadow:var(--gl-shadow-modal);transform:scale(.9) translateY(20px);transition:var(--gl-transition-modal);position:relative}.glass-modal-overlay.is-active .glass-modal{transform:scale(1) translateY(0)}.glass-modal::before{content:'';position:absolute;top:0;left:10%;right:10%;height:1px;background:linear-gradient(90deg,transparent 0,rgba(255,255,255,.4) 30%,rgba(255,255,255,.5) 50%,rgba(255,255,255,.4) 70%,transparent 100%)}.glass-modal__header{padding:var(--gl-space-xl) var(--gl-space-xl) var(--gl-space-sm);text-align:center}.glass-modal__title{font-size:var(--gl-font-size-modal);font-weight:var(--gl-font-weight-semibold);color:var(--gl-color-text)}.glass-modal__body{padding:var(--gl-space-sm) var(--gl-space-xl) var(--gl-space-xl);text-align:center}.glass-modal__body p{color:var(--gl-color-text-muted);font-size:var(--gl-font-size-base);line-height:1.55}.glass-modal__footer{display:flex;border-top:1px solid var(--gl-border-subtle)}.glass-modal__action{flex:1;height:52px;background:0 0;border:none;font-family:var(--gl-font-family);font-size:var(--gl-font-size-btn);font-weight:var(--gl-font-weight-medium);color:var(--gl-color-text-muted);cursor:pointer;transition:var(--gl-transition-fast);outline:0}.glass-modal__action:hover{background:var(--gl-surface-1)}.glass-modal__action+.glass-modal__action{border-left:1px solid var(--gl-border-subtle)}.glass-modal__action--primary{color:var(--gl-color-primary);font-weight:var(--gl-font-weight-semibold)}.glass-modal__action--danger{color:var(--gl-color-error);font-weight:var(--gl-font-weight-semibold)}.glass-toast{position:fixed;top:var(--gl-space-4xl);left:50%;transform:translateX(-50%) translateY(-20px);min-width:280px;max-width:340px;padding:var(--gl-space-md) var(--gl-space-lg);background:linear-gradient(to bottom,var(--gl-surface-4) 0,var(--gl-surface-2) 100%);backdrop-filter:blur(var(--gl-blur));-webkit-backdrop-filter:blur(var(--gl-blur));border:1px solid var(--gl-border-medium);border-radius:var(--gl-radius-btn);display:flex;align-items:center;gap:var(--gl-space-sm);box-shadow:var(--gl-shadow-toast),var(--gl-inset-medium);z-index:1100;opacity:0;pointer-events:none;transition:var(--gl-transition-modal);font-family:var(--gl-font-family);-webkit-font-smoothing:antialiased}.glass-toast.is-visible{opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto}.glass-toast__icon{width:22px;height:22px;flex-shrink:0;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}.glass-toast--success .glass-toast__icon{stroke:var(--gl-color-success)}.glass-toast--error .glass-toast__icon{stroke:var(--gl-color-error)}.glass-toast--warning .glass-toast__icon{stroke:var(--gl-color-warning)}.glass-toast__text{font-size:var(--gl-font-size-sm);font-weight:var(--gl-font-weight-medium);color:var(--gl-color-text);line-height:1.4}.glass-tab-bar{position:fixed;bottom:0;left:0;right:0;height:var(--gl-tab-bar-height);background:linear-gradient(to bottom,var(--gl-surface-3) 0,var(--gl-surface-1) 100%);backdrop-filter:blur(var(--gl-blur));-webkit-backdrop-filter:blur(var(--gl-blur));border-top:1px solid var(--gl-border-subtle);display:flex;justify-content:space-around;align-items:flex-start;padding-top:var(--gl-space-xs);padding-bottom:env(safe-area-inset-bottom,8px);z-index:900;box-shadow:0 -4px 20px rgba(0,0,0,.08),var(--gl-inset-subtle)}.glass-tab-bar__item{display:flex;flex-direction:column;align-items:center;gap:var(--gl-space-2xs);padding:var(--gl-space-2xs) var(--gl-space-sm);background:0 0;border:none;cursor:pointer;transition:var(--gl-transition);outline:0;-webkit-tap-highlight-color:transparent;min-width:60px}.glass-tab-bar__icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;position:relative}.glass-tab-bar__icon svg{width:24px;height:24px;fill:none;stroke:var(--gl-icon-muted);stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;transition:var(--gl-transition)}.glass-tab-bar__label{font-size:10px;font-weight:var(--gl-font-weight-medium);color:var(--gl-icon-muted);transition:var(--gl-transition);letter-spacing:.2px}.glass-tab-bar__item.is-active .glass-tab-bar__icon svg{stroke:var(--gl-color-primary);filter:drop-shadow(0 0 6px rgba(245,166,35,.35))}.glass-tab-bar__item.is-active .glass-tab-bar__label{color:var(--gl-color-primary)}.glass-tab-bar__item.is-active .glass-tab-bar__icon::after{content:'';position:absolute;bottom:-6px;left:50%;transform:translateX(-50%);width:4px;height:4px;border-radius:var(--gl-radius-pill);background:var(--gl-color-primary);box-shadow:0 0 6px rgba(245,166,35,.5)}.glass-tab-bar__item:not(.is-active):hover .glass-tab-bar__icon svg{stroke:var(--gl-icon-default)}.glass-tab-bar__item:not(.is-active):hover .glass-tab-bar__label{color:var(--gl-icon-default)}.glass-tab-bar__badge{position:absolute;top:-4px;right:-8px;min-width:16px;height:16px;padding:0 4px;border-radius:var(--gl-radius-full);background:var(--gl-color-error);color:#fff;font-size:10px;font-weight:var(--gl-font-weight-semibold);display:flex;align-items:center;justify-content:center;box-shadow:0 2px 6px rgba(255,59,48,.4)}.glass-accordion{display:flex;flex-direction:column;gap:var(--gl-space-xs)}.glass-accordion__item{background:var(--gl-surface-2);backdrop-filter:blur(var(--gl-blur-light));-webkit-backdrop-filter:blur(var(--gl-blur-light));border:1px solid var(--gl-border-subtle);border-radius:var(--gl-radius-btn);overflow:hidden;transition:var(--gl-transition);box-shadow:var(--gl-inset-subtle)}.glass-accordion__item.is-open{background:var(--gl-surface-3);border-color:var(--gl-border-medium);box-shadow:0 4px 16px rgba(0,0,0,.1),var(--gl-inset-medium)}.glass-accordion__trigger{width:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--gl-space-sm);padding:var(--gl-space-md) var(--gl-space-lg);background:0 0;border:none;cursor:pointer;font-family:var(--gl-font-family);font-size:var(--gl-font-size-base);font-weight:var(--gl-font-weight-semibold);color:var(--gl-color-text);text-align:left;outline:0;transition:var(--gl-transition);-webkit-tap-highlight-color:transparent}.glass-accordion__trigger:hover{color:var(--gl-color-primary)}.glass-accordion__trigger-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.glass-accordion__trigger-icon svg{width:18px;height:18px;fill:none;stroke:var(--gl-icon-default);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .3s cubic-bezier(.4, 0, .2, 1)}.glass-accordion__item.is-open .glass-accordion__trigger-icon svg{transform:rotate(180deg);stroke:var(--gl-color-primary)}.glass-accordion__content{max-height:0;overflow:hidden;transition:max-height .35s cubic-bezier(.4, 0, .2, 1)}.glass-accordion__item.is-open .glass-accordion__content{max-height:500px}.glass-accordion__body{padding:0 var(--gl-space-lg) var(--gl-space-lg);color:var(--gl-accordion-body-color);font-size:var(--gl-font-size-sm);line-height:1.6}.glass-badge{display:inline-flex;align-items:center;gap:var(--gl-space-2xs);padding:var(--gl-space-2xs) var(--gl-space-sm);background:var(--gl-surface-3);backdrop-filter:blur(var(--gl-blur-soft));-webkit-backdrop-filter:blur(var(--gl-blur-soft));border:1px solid var(--gl-border-subtle);border-radius:var(--gl-radius-full);font-size:var(--gl-font-size-xs);font-weight:var(--gl-font-weight-medium);color:var(--gl-color-text);box-shadow:var(--gl-inset-subtle)}.glass-badge--primary{background:linear-gradient(135deg,rgba(245,166,35,.25) 0,rgba(212,105,42,.2) 100%);border-color:var(--gl-border-warm);color:var(--gl-color-primary)}.glass-badge--success{background:rgba(52,199,89,.15);border-color:rgba(52,199,89,.3);color:var(--gl-color-success)}.glass-badge--error{background:rgba(255,59,48,.15);border-color:rgba(255,59,48,.3);color:var(--gl-color-error)}.glass-divider{height:1px;border:none;background:linear-gradient(90deg,transparent 0,var(--gl-border-subtle) 20%,var(--gl-border-medium) 50%,var(--gl-border-subtle) 80%,transparent 100%)}.glass-avatar{width:44px;height:44px;border-radius:var(--gl-radius-pill);background:var(--gl-surface-3);backdrop-filter:blur(var(--gl-blur-soft));-webkit-backdrop-filter:blur(var(--gl-blur-soft));border:1.5px solid var(--gl-border-strong);display:flex;align-items:center;justify-content:center;overflow:hidden;box-shadow:var(--gl-shadow-glow),var(--gl-inset-medium);flex-shrink:0;font-size:var(--gl-font-size-btn);font-weight:var(--gl-font-weight-semibold);color:var(--gl-color-text)}.glass-avatar img{width:100%;height:100%;object-fit:cover}.glass-avatar--sm{width:32px;height:32px;font-size:var(--gl-font-size-xs)}.glass-avatar--lg{width:56px;height:56px;font-size:var(--gl-font-size-lg)}.glass-theme-toggle{width:46px;height:46px;border-radius:var(--gl-radius-pill);background:var(--gl-surface-3);backdrop-filter:blur(var(--gl-blur));-webkit-backdrop-filter:blur(var(--gl-blur));border:1.5px solid var(--gl-border-strong);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:var(--gl-transition);box-shadow:var(--gl-shadow-glow),var(--gl-inset-medium);outline:0;-webkit-tap-highlight-color:transparent}.glass-theme-toggle:hover{background:var(--gl-surface-5);transform:scale(1.05)}.glass-theme-toggle:active{transform:scale(.95)}.glass-theme-toggle svg{width:20px;height:20px;fill:none;stroke:var(--gl-color-text);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.glass-theme-toggle .icon-sun{display:none}.glass-theme-toggle .icon-moon,[data-theme=light] .glass-theme-toggle .icon-sun{display:block}[data-theme=light] .glass-theme-toggle .icon-moon{display:none}.gl-stack{display:flex;flex-direction:column}.gl-row{display:flex;flex-direction:row;align-items:center}.gl-stack--2xs{gap:var(--gl-space-2xs)}.gl-stack--xs{gap:var(--gl-space-xs)}.gl-stack--sm{gap:var(--gl-space-sm)}.gl-stack--md{gap:var(--gl-space-md)}.gl-stack--lg{gap:var(--gl-space-lg)}.gl-stack--xl{gap:var(--gl-space-xl)}.gl-row--xs{gap:var(--gl-space-xs)}.gl-row--sm{gap:var(--gl-space-sm)}.gl-row--md{gap:var(--gl-space-md)}.gl-text-center{text-align:center}.gl-text-muted{color:var(--gl-color-text-muted)}.gl-text-sm{font-size:var(--gl-font-size-sm)}.gl-mt-sm{margin-top:var(--gl-space-sm)}.gl-mt-md{margin-top:var(--gl-space-md)}.gl-mt-lg{margin-top:var(--gl-space-lg)}.gl-mt-xl{margin-top:var(--gl-space-xl)}.gl-mb-sm{margin-bottom:var(--gl-space-sm)}.gl-mb-md{margin-bottom:var(--gl-space-md)}.gl-mb-lg{margin-bottom:var(--gl-space-lg)}.gl-mb-xl{margin-bottom:var(--gl-space-xl)}.gl-px{padding-left:var(--gl-space-lg);padding-right:var(--gl-space-lg)}.gl-w-full{width:100%}.gl-flex-1{flex:1}\n/*# sourceMappingURL=glasskit.min.css.map */";
|
|
5
|
+
|
|
6
|
+
const glassSheet = new CSSStyleSheet();
|
|
7
|
+
glassSheet.replaceSync(css);
|
|
8
|
+
|
|
9
|
+
export { glassSheet, css };
|