Glassmorphism UI Library
Vollständige CSS-Komponentenbibliothek im Glasmorphism-Stil – entwickelt von der Jungherz GmbH. Reines CSS, keine Abhängigkeiten, Dark & Light Mode.
Installation
Eine CSS-Datei einbinden – fertig. Optional ein Theme-Override für andere Markenfarben.
Design Tokens
Alle visuellen Werte werden über CSS Custom Properties gesteuert.
Farbpalette
| Token | Dark-Wert | Verwendung |
|---|---|---|
--gl-color-primary | #f5a623 | Primärfarbe, Buttons, aktive Elemente |
--gl-color-primary-dark | #d4692a | Gradient-Endwert |
--gl-color-text | #ffffff | Standard-Textfarbe |
--gl-color-text-muted | rgba(255,255,255,0.60) | Sekundärer Text |
--gl-color-success | #34c759 | Erfolg-Status |
--gl-color-error | #ff3b30 | Fehler-Status |
--gl-color-warning | #ffcc00 | Warn-Status |
--gl-color-{state}-surface, -border, -on-surface | color-mix(…) | Getönte Fläche, Rand und Schrift eines Status-Badges, abgeleitet von der Statusfarbe — für success, error und seit 1.18.0 warning |
Glasflächen
| Token | Wert | Verwendung |
|---|---|---|
--gl-surface-1 | rgba(…, 0.08) | Subtilste Fläche (Status) |
--gl-surface-2 | rgba(…, 0.10) | Standard (Inputs, Cards) |
--gl-surface-3 | rgba(…, 0.14) | Nav-Pills, Badges |
--gl-surface-4 | rgba(…, 0.16) | Hover-States |
--gl-surface-5 | rgba(…, 0.22) | Starker Hover |
--gl-surface-milk-strong | rgba(…, 0.75) | Secondary Button |
Spacing & Radii
| Token | Wert | Token | Wert |
|---|---|---|---|
--gl-space-2xs | 4px | --gl-radius-xs | 8px |
--gl-space-xs | 8px | --gl-radius-sm | 12px |
--gl-space-sm | 12px | --gl-radius-input | 14px |
--gl-space-md | 16px | --gl-radius-btn | 16px |
--gl-space-lg | 20px | --gl-radius-card | 24px |
--gl-space-xl | 24px | --gl-radius-full | 9999px |
--gl-space-2xl | 32px | --gl-radius-pill | 50% |
Dichte
| Token | Standard | Kompakt | Verwendung |
|---|---|---|---|
--gl-control-height | 52px | 40px | Input, Select, Suchfeld |
--gl-control-padding-x | nicht gesetzt → --gl-space-md | --gl-space-sm | Innenabstand links und rechts von Input, Select, Textarea |
--gl-btn-height | 56px | 40px | Button |
--gl-btn-height-sm | 44px | 32px | Button --sm |
--gl-btn-height-lg | 64px | 48px | Button --lg |
--gl-textarea-min-height | 120px | 88px | Textarea |
--gl-list-item-min-height | 56px | 48px | Listenzeile |
--gl-list-item-padding-y | nicht gesetzt → --gl-space-md | 10px | Listenzeile, oben und unten |
--gl-toggle-width × -height | 52 × 30px | 44 × 26px | Toggle-Spur |
--gl-toggle-thumb-size | 22px | 18px | Toggle-Knopf |
--gl-check-size | 24px | 20px | Checkbox, Radio |
--gl-modal-action-height | 52px | 44px | Modal-Aktionen |
Theming (Light / Dark)
Das Theme wird über data-theme am <html>-Element gesteuert.
Rechts nach links
Seit 1.20.0 folgen die Komponenten der Schreibrichtung. dir="rtl" auf <html> oder einem beliebigen Container genügt: Abstände, Positionen und Rahmen sind logische Eigenschaften, also spiegeln sich Labels und Hinweise, das Such-Icon, die Trennlinien der Liste, die Popover-Anker, die Tab-Badges, die Modal-Aktionen, das × des Toasts und die Ausrichtung von Akkordeon, Liste, Tabelle und Prose. Wo zwei Werte gemeinsam wandern müssen — der Chevron des Selects und der Platz für ihn, der Knopf des Schalters und sein Weg, der Verlauf der Fortschrittsfüllung — steht die Regel unter :dir(rtl): Chrome und Edge ab 120, Safari ab 16.4, Firefox ab 49. Ein älterer Browser lässt diese Teile links nach rechts, statt sie auseinanderzureißen.
Druckdialoge lassen Hintergrundgrafiken standardmäßig weg, und manche Zustände sind nur mit einem Hintergrund gezeichnet. Seit 1.21.1 behalten diese Teile auf Papier ihre Farben — das angehakte Kästchen und sein Haken, das gewählte Radio, die Spur des Toggles, die Füllung des Fortschrittsbalkens, der aktuelle Schritt, der gewählte Tag von Datumsstreifen und Kalender, der Knopf des Schiebereglers und die Tonpunkte —, der Rest der Seite druckt sparsam. Einzustellen ist nichts. Eine dunkle Seite druckt ihre helle Schrift und ihre Flächen auf weißes Papier; eine Seite, die gedruckt werden soll, wechselt dafür ins helle Theme:
Dichte (Kompakt)
Admin-Oberflächen, Desktop-Layouts und schmale Formulare brauchen dichtere Bedienelemente. Seit 1.21.0 sind ihre Größen Dichte-Tokens, und data-density="compact" am <html>-Element setzt einen kleineren Satz: Felder und Buttons 40px hoch statt 52 und 56, kleinere Toggles, Checkboxen und Radios, dichtere Listenzeilen und Modal-Aktionen. Farben, Schrift und Abstände bleiben, wie sie sind. Ohne das Attribut behält jedes Element die Größe, die es immer hatte.
Die Vorschau setzt das Attribut auf ihre rechte Spalte. Auf einer Seite gehört es an <html>, neben data-theme: Ein Element weiter unten mit data-theme="dark" setzt die Standardgrößen wieder.
Einzug und Weg des Toggle-Knopfs — in beiden Schreibrichtungen — und die Ausrichtung von Toggle, Checkbox und Radio an der ersten Zeile leiten sich aus den Tokens ab. Jede Größe, die ein Projekt setzt, bleibt so ausgerichtet. Die Regeln lesen jede Größe mit dem bisherigen Wert als Fallback, wie --gl-modal-max-width: Eine Seite, deren Token-Sheet älter ist, behält die alten Größen.
Hintergrund
Der Glaseffekt braucht einen farbigen Hintergrund.
| Klasse | Beschreibung |
|---|---|
.glass-bg | Vollständiger Hintergrund mit Aurora-Lichteffekten |
.glass-bg--has-tab-bar | Modifier: Padding unten für Tab-Bar |
.glass-bg--has-tab-bar-floating | Modifier: Padding unten für Floating-Tab-Bar + Accessory |
Pill-Buttons
Runde Icon-Buttons für Navigation und Aktionen.
| Klasse | Beschreibung |
|---|---|
.glass-pill | Standard Glas-Kreis (46×46px) |
.glass-theme-toggle | Pill mit Mond/Sonne-Icon-Switch |
Tab-Bar
Fixierte Bottom-Navigation mit Glas-Hintergrund und optionalem Badge.
Tab-Bar – Floating
Pillenförmige, zentrierte, schwebende Variante im iOS-26-Liquid-Glass-Stil. Optional mit einer eigenständigen .glass-tab-bar__accessory-Kapsel daneben (z. B. Suche, Erstellen) – mit eigenem Glasmaterial. Der aktive Tab erhält einen weichen radialen Spotlight-Halo statt des Punkt-Underlines.
Akzent-Varianten für das Accessory
Mit --accent, --success oder --error wird das Accessory farbig untermalt (gefüllter Hintergrund, weißes Icon).
| Klasse | Beschreibung |
|---|---|
.glass-tab-bar-dock | Wrapper: fest unten zentriert, hält Tab-Bar + Accessory |
.glass-tab-bar-dock--accessory-left | Modifier: Accessory links statt rechts |
.glass-tab-bar--floating | Modifier auf .glass-tab-bar: Pillenform, max-content-Breite |
.glass-tab-bar__accessory | Eigenständige Glas-Kapsel neben der Tab-Bar |
.glass-tab-bar__accessory--accent | Gefüllt mit Primärfarbe |
.glass-tab-bar__accessory--success | Gefüllt mit Success-Farbe |
.glass-tab-bar__accessory--error | Gefüllt mit Error-Farbe |
.glass-bg--has-tab-bar-floating | Background-Padding-Helper für die Floating-Variante |
Titel
Verträge aufnehmen
& hochladen
Card
Vertrag fotografieren, Kanten prüfen und gesammelt hochladen.
| Klasse | Beschreibung |
|---|---|
.glass-card | Basis-Glasfläche |
.glass-card--glow | Hell → milchig Verlauf + Lichtstreifen |
.glass-card__icon | Zentrierter Icon-Wrapper |
.glass-card__text | Beschreibungstext |
Buttons
| Klasse | Beschreibung |
|---|---|
.glass-btn | Basis (56px, volle Breite) |
--primary | Farbiger Gradient |
--secondary | Milchig-weiß |
--tertiary | Subtiles Glas |
--sm | 44px Höhe |
--lg | 64px Höhe |
--auto | Auto-Breite |
:disabled, [aria-disabled="true"] | Gedimmt auf 0,45, Cursor not-allowed, kein Hover (seit 1.21.2) |
svg.glass-icon--fill | Bewusst gefülltes Icon (z. B. Brand-Logos) |
Ein deaktivierter Button — disabled, oder aria-disabled="true" an einem a.glass-btn, der sich nicht deaktivieren lässt — ist gedimmt, zeigt den Cursor not-allowed und hebt sich beim Hover nicht mehr an (seit 1.21.2; vorher sah er genau aus wie ein aktiver). Der Link selbst navigiert weiter, wenn die Seite ihn nicht abfängt. Dasselbe gilt für Pill, Tab-Bar-Accessory, Modal-Aktionen, interaktive Listenzeilen und die Monatspfeile des Kalenders; Toggle, Checkbox und Radio dimmen Bedienelement und Label, Select, Textarea und Range dimmen wie das Input.
Badge
Varianten: --primary, --success, --warning (seit 1.18.0) und --error. Jede nimmt Fläche, Rand und Schrift aus den Token -surface, -border und -on-surface ihrer Statusfarbe — wer die Statusfarbe umfärbt, färbt das ganze Badge um.
Chips
Ein Badge dient auch als Filter-Chip. --interactive macht ihn anfassbar — Zeiger, Hover-Tönung, Fokusring — und --selected zeigt, welcher Chip aktiv ist. Nimm einen echten <button> und leg den Zustand in aria-pressed, damit die Zeile per Tastatur bedienbar ist und als Umschalter angesagt wird.
--selected vertieft die Farbe, die der Badge schon hat, statt sie zu übergehen — ein Status-Chip bleibt beim Auswählen also in seiner eigenen Farbe.
| Klasse | Beschreibung |
|---|---|
--interactive | Anklickbar: Zeiger, Hover-Tönung, Fokusring, Druck-Rückmeldung |
--selected | Der aktive Chip — vertieft die eigene Farbe des Badges |
--gl-badge-accent | Die Farbe, die beide Zustände vertiefen. Pro Badge setzbar, wenn ein Chip eine eigene Farbe bekommen soll. |
Avatar
Divider
Status-Hinweis
Noch keine Verträge vorhanden.
Liste
Gruppierter Settings-Container für gestapelte Zeilen. Items unterstützen ein führendes Icon, Titel + optionalen Untertitel sowie ein Trailing-Element (Chevron, Wert, Button). Trennlinien zwischen Items werden automatisch gezeichnet — kein zusätzliches Markup nötig.
Settings-Stil (Icon + Titel + Untertitel + Trailing)
-
iOS 26.4 Update2,1 GB · Jetzt verfügbar
-
Apple OneFamilie — verlängert sich am 28. Apr.22,95 €
-
Mitteilungen
- Alle Abos anzeigen
Kompaktes Menü (zentrierter Text, ohne Icons)
- Vertrag teilen
- Duplizieren
- Löschen
Gruppierte Sektionen mit großen Icons
-
Geladene Medien prüfenSpare bis zu 1,38 GB ein. Prüfe alle auf deinem Gerät geladenen Videos und Audiodateien und entferne sie bei Bedarf.
-
AusweisApp BundVersion 2.5.124 MB
-
Der Geist aus der MaschineTeilweise angesehen237,1 MB
- Alle Downloads anzeigen
Klassen-Referenz
| Klasse | Beschreibung |
|---|---|
.glass-list | Gruppierter Surface-Container |
.glass-list--flush | Edge-to-Edge-Variante (kein seitlicher Margin / Radius). Setzt voraus, dass der Eltern-Container --gl-space-lg Padding hat. |
.glass-list--bare | Entfernt Hintergrund, Border & Shadow — für die Einbettung in .glass-popover oder .glass-card. |
.glass-list__item | Listenzeile (als <li>, <a> oder <button>) |
.glass-list__section-header | Sektionslabel oberhalb einer .glass-list — Uppercase, klein, gedämpft |
.glass-list__item--interactive | Fügt Hover- / Focus- / Active-States hinzu |
.glass-list__item--center | Zentrierte Single-Text-Variante mit Ellipsis-Truncation |
.glass-list__item--danger | Roter Text für destruktive Aktionen |
.glass-list__item--accent | Primärfarbener Text für Akzent-Aktionen |
.glass-list__leading | Leading-Slot (28×28, enthält ein Icon-SVG) |
.glass-list__leading--lg | Großer Leading-Slot (40×40, abgerundetes Quadrat, unterstützt <img>) |
.glass-list__content | Flexibler mittlerer Slot — nimmt verbleibende Breite, ermöglicht Truncation |
.glass-list__title | Primärer Text (medium weight, ellipsis) |
.glass-list__subtitle | Sekundärer Text (klein, gedämpft, ellipsis) |
.glass-list__subtitle--wrap | Mehrzeiliger Subtitle (bis 3 Zeilen, mit Ellipsis-Clamp) |
.glass-list__trailing | Trailing-Slot — Chevron, Wert, Button, Badge |
.glass-list__value | Gedämpfter Text in .glass-list__trailing (z.B. Dateigröße) |
Trennlinien zwischen Zeilen werden automatisch via ::after gerendert. Items mit Leading-Icon erhalten einen icon-aligned Inset; Items ohne — kein __leading, oder eines mit dem Attribut hidden (seit 1.20.0) — bekommen das normale Padding-Inset. Ein verstecktes __leading oder __trailing nimmt keinen Platz ein. Das letzte Item hat nie eine Trennlinie. SVG-Icon-Konvention: 24px für Leading, 18px für Trailing, stroke: currentColor, stroke-width: 2.
Modal
Zentrierter Dialog mit Blur-Overlay. Sichtbarkeit wird über die .is-active-Klasse auf dem Overlay-Element gesteuert — das Umschalten benötigt etwas JavaScript.
Vertrag löschen?
Dieser Vorgang kann nicht rückgängig gemacht werden.
Klassen-Referenz
| Klasse | Beschreibung |
|---|---|
.glass-modal-overlay | Fullscreen Blur-Overlay |
.glass-modal-overlay.is-active | Sichtbar + animiert |
dialog.glass-modal-overlay | Das Overlay als natives Dialog-Element, geöffnet mit showModal() (seit 1.20.0) |
.glass-modal | Dialog-Container, höchstens --gl-modal-max-width breit (340px, wenn nicht gesetzt) |
__header / __title | Titel-Bereich |
__body | Inhaltsbereich |
__footer / __action | Aktionsleiste |
__action--primary | Primäre Aktion |
__action--danger | Gefährliche Aktion |
Hinweis: die .is-active-Klasse gehört auf das .glass-modal-overlay, nicht auf .glass-modal selbst. Das Overlay übernimmt den Fullscreen-Backdrop, und sein :is-active-Zustand triggert sowohl das Backdrop-Fade-In als auch die Scale-Up-Animation des inneren Dialogs.
Als natives Dialog-Element
Seit 1.20.0 darf das Overlay auch ein <dialog> sein. Mit showModal() geöffnet liegt es in der Top Layer; die Seite dahinter ist für Zeiger, Tastatur und Screenreader inert; der Fokus wandert hinein und beim Schließen dorthin zurück, wo er herkam; Escape schließt. GlassKit nimmt dem Dialog seinen eigenen Kasten und Backdrop, er sieht also genau aus wie das <div>-Overlay. Seinen Namen bekommt er über aria-labelledby vom Titel. <glk-modal> aus GlassKit Elements arbeitet so.
Solange ein modaler Dialog offen ist, ist alles außerhalb inert — ein Toast, der dann erscheint, ist weder anklickbar noch wird er vorgelesen. Rückmeldungen gehören in den Dialog, oder der Dialog schließt zuerst.
Breite
Das Panel ist höchstens --gl-modal-max-width breit — 340 px, wenn nicht gesetzt (seit 1.20.0; vorher ein fester Wert). Ein Dialog mit Formular oder Tabelle darf breiter werden:
Toast
Sichtbar via .is-visible. Varianten: --success, --error, --warning.
Mit Aktion (seit 1.19.0): __action ist eine kleine Pille im Ton des Toasts — primär beim schlichten Toast, in der Statusfarbe bei einer Variante — und __close das × am Ende; es braucht ein aria-label. Beide haben eine Trefferfläche von 44 px. Ein Toast mit Aktion darf bis 480 px breit werden, der Text bricht um, die Knöpfe schrumpfen nie; er sollte stehen bleiben, bis einer davon benutzt wird. Der Toast sitzt --gl-toast-top vom oberen Rand (56 px, wenn nicht gesetzt) — setz ihn unter deine Kopfzeile und nimm bei viewport-fit=cover env(safe-area-inset-top) dazu. Er bleibt auch mit Aktion oben: ein Ort für jeden Toast.
| Klasse | Beschreibung |
|---|---|
.glass-toast, .is-visible | Oben fixiert, sichtbar eingeblendet |
--success, --error, --warning | Färben das Symbol; tönen die Aktion in der Statusfarbe |
__icon, __text | 22-px-Symbol, Nachricht (bricht um, gibt nach) |
__action | Eine Aktion: Pille im Ton des Toasts, 44 px Trefferfläche, schrumpft nie (seit 1.19.0) |
__close | Das ×, 28 px mit 44 px Trefferfläche (seit 1.19.0) |
--gl-toast-top | Abstand vom oberen Rand, Vorgabe var(--gl-space-4xl) (seit 1.19.0) |
Popover
Verankertes Dropdown- / Menü-Container. Trigger und .glass-popover in einem .glass-popover-anchor verschachteln. Sichtbarkeit wird über die .is-open-Klasse gesteuert — das Umschalten benötigt ein bisschen JavaScript.
Klassen-Referenz
| Klasse | Beschreibung |
|---|---|
.glass-popover-anchor | Positionierungs-Kontext für den Popover (umschließt Trigger + Popover) |
.glass-popover | Floating Glass-Surface, ausgeblendet bis .is-open |
.glass-popover.is-open | Sichtbarer Zustand — Fade- + Scale-Animation |
.glass-popover--top | Öffnet nach oben (über dem Trigger) |
.glass-popover--start | Linke Kante am Trigger ausrichten |
.glass-popover--end | Rechte Kante am Trigger ausrichten |
Hinweis: die Toggle-Funktion darf nicht togglePopover heißen — dieser Name kollidiert mit der nativen HTMLElement.togglePopover()-Methode der HTML Popover API, und Inline-onclick-Handler werfen einen NotSupportedError.
Input
Datums- und Zeitfelder — type="date", time, datetime-local, month — nehmen dieselbe Klasse. Sie verzichten auf das native Aussehen (seit 1.17.0): iOS zeichnete sie breiter als ihre Spalte, ein leeres schmaler als ein gefülltes, den Wert mittig. Jetzt sitzen sie wie jedes andere Feld in ihrer Spalte, der Wert am Anfang; der native Picker öffnet weiter.
Präfix und Suffix
Ein Icon, eine Währung, eine Einheit oder ein Button im Kasten des Feldes (seit 1.22.0): das Input in .glass-input-wrap legen und __prefix und __suffix daneben setzen. Sie liegen auf dem Feld, mittig, an seinem Anfang und Ende — von rechts nach links tauschen sie die Seiten. Das Padding des Feldes wächst um ihre Breite, --gl-input-prefix-size und --gl-input-suffix-size: 18px, ein Icon, wenn nicht gesetzt — für eine breitere Einheit setzen. Es folgt dem Modifier --prefix / --suffix, oder einem sichtbaren Affix, wo :has() unterstützt wird. Ein Klick auf Text, ein Icon oder ein deaktiviertes Bedienelement erreicht das Feld; aktive Bedienelemente, Links und Elemente mit tabindex nehmen ihren eigenen, formularassoziierte Custom Elements wie <glk-button> eingeschlossen (seit 1.22.2). Das tun sie auch in einem Container, der mit pointer-events: none gesperrt ist: ihn mit inert sperren oder sie deaktivieren. <glk-input> aus GlassKit Elements hat darauf die Slots prefix und suffix und misst die Breite selbst.
Textarea
Select
Der Chevron ist --gl-select-chevron, ein SVG in der gedämpften Textfarbe des jeweiligen Themes — seit 1.20.0; vorher blieb er auch im hellen Theme weiß und war kaum zu sehen. Mit einem eigenen url(…) im Token lässt er sich ersetzen. Von rechts nach links wandern der Chevron und der Platz für ihn nach links.
Suchfeld
Toggle Switch
Das Input ist unsichtbar, liegt aber über der Spur und nimmt den Klick selbst an (seit 1.20.0): Ein Testwerkzeug, das den Schalter über seine Rolle anklickt, erreicht es — vorher zeichnete die Spur darüber und nahm den Klick. Es deckt nur die Spur ab; der Labeltext, der auch einen Link enthalten kann, bleibt beim Label. Ein leeres __label nimmt keinen Platz ein, ein Schalter ohne Text hält also keine 12 px Lücke dafür frei. Beides gilt genauso für Checkbox und Radio Button. Von rechts nach links beginnt der Knopf rechts.
Checkbox
Wie beim Toggle liegt das Input über der Box, und ein leeres __label nimmt keinen Platz ein (seit 1.20.0).
Radio Button
Wie beim Toggle liegt das Input über dem Kreis, und ein leeres __label nimmt keinen Platz ein (seit 1.20.0).
Range Slider
Progress Bar
| Klasse | Beschreibung |
|---|---|
.glass-progress | Basis-Container |
--sm / --lg | Track-Höhe: 4px / 12px |
--success / --error | Farb-Varianten |
Accordion
Skeleton
Ladeplatzhalter: schimmernde Zeilen stehen für Text, der noch nicht da ist. Die Breite jeder Zeile setzt der Aufrufer; der Schimmer folgt dem Theme und steht unter prefers-reduced-motion still. Den Bereich mit aria-busy="true" markieren, damit Hilfstechnik das Laden erkennt.
| Klasse | Beschreibung |
|---|---|
.glass-skeleton | Stapel aus Zeilen, 10px Abstand |
.glass-skeleton__line | Eine Schimmerzeile (12px); Breite per Inline-Style |
.glass-skeleton__line--title | Höhere Zeile (18px) für eine Überschrift |
Tabelle
Eine gewöhnliche <table> auf Glas: Haarlinien zwischen den Zeilen, gedämpfter Kopf, Zahlen rechtsbündig in Tabellenziffern. Der Wrapper .glass-table-wrap scrollt seitlich, wo die Spalten nicht passen. Die Klasse gehört auf die Tabelle selbst — aus einem Shadow Root erreicht ::slotted() die Zellen nicht, deshalb ist das bewusst Dokument-CSS.
| Datum | Posten | Betrag |
|---|---|---|
| 2026-09-18 | Rechnung 1042 | 1.240,00 |
| 2026-09-19 | Erstattung | −80,00 |
| 2026-09-20 | Offen | – |
| Klasse | Beschreibung |
|---|---|
.glass-table-wrap | Optionaler Container mit seitlichem Scrollen |
.glass-table | Die Tabelle: Haarlinien, Hover-Hervorhebung |
.glass-table__num | Rechtsbündig, Tabellenziffern — auf th und td |
.glass-table__muted | Sekundäre Textfarbe für eine Zelle |
Fließtext
Fließtext, den die App nicht von Hand geschrieben hat — gerendertes Markdown, Hilfe- und Infoseiten. Eine Klasse auf dem Container stylt Überschriften, Absätze, Listen, Links, Code, Zitate, Bilder und Tabellen. Bewusst Dokument-CSS: der Inhalt ist Light DOM, und ::slotted() endet auf der ersten Ebene.
Erste Schritte
glasskit.css einbinden, data-theme auf <html> setzen, fertig. Alles Weitere ist optional — siehe die Design-Tokens.
- Dark Mode ist der Standard
- Light Mode über
data-theme="light"
Der Glaseffekt braucht einen farbigen Hintergrund, um sichtbar zu sein.
Segmentwahl
Eine kleine, exklusive Auswahl als ein Bedienelement — Ampel, Vormittag / Nachmittag, Modus. Knöpfe in einer role="group"; der gewählte trägt aria-pressed="true", und genau an diesem Attribut hängt das Styling, damit Zustand und Semantik nicht auseinanderlaufen. Die Ton-Modifier setzen einen Punkt in einer Zustandsfarbe vor die Beschriftung. Probier es: Klick oder Tab auf einen Knopf und Leertaste. Mehr Optionen als Platz? Ohne Modifier bleibt die Zeile einzeilig und läuft über den Rand; --scroll lässt sie seitwärts scrollen, --wrap bricht sie um. Beide lassen sich mit --full kombinieren.
| Klasse | Beschreibung |
|---|---|
.glass-segmented | Die Gruppe: eingelassene Glas-Schiene, Knöpfe darin |
--full | Knöpfe teilen sich die Breite |
--scroll | Eine Zeile, die seitwärts scrollt, wenn die Optionen nicht passen; Scrollbar versteckt (seit 1.17.0) |
--wrap | Bricht die Zeile um, wenn die Optionen nicht passen (seit 1.17.0) |
__item | Eine Option; aria-pressed="true" markiert die gewählte, disabled dämpft |
__item--success / --warning / --error | Ton: setzt --gl-segmented-tone für den Punkt |
__dot | Der Punkt vor der Beschriftung, in der Tonfarbe |
Schrittanzeige
Fortschritt durch einen kurzen Ablauf: nummerierte Kreise mit Haarlinien dazwischen, erledigte auf der Erfolgsfläche (mit SVG-Haken), der aktuelle in der Primärfarbe und mit aria-current="step".
- Tag
- Fenster
- 3Hund
- 4Bestätigen
Die Liste ist ein Größen-Container: unter 360 px behält nur der aktuelle Schritt seine Beschriftung, die anderen zeigen ihre Nummer; davor kürzen Beschriftungen mit Ellipse. Maßgeblich ist die Breite des Blocks, nicht des Viewports — hier in einem 300-px-Rahmen:
- Tag
- 2Zeitfenster wählen
- 3Hund
- 4Bestätigen
| Klasse | Beschreibung |
|---|---|
.glass-steps | Die Liste; ein Größen-Container, in einer Flex-Zeile also mit Breite versehen |
__item, __item--done, __item--current | Ein Schritt und seine Zustände |
__num | Der Kreis: Nummer, oder ein SVG-Haken wenn erledigt |
__label | Die Beschriftung; unter 360 px ausgeblendet, außer am aktuellen Schritt |
__line | Haarlinie zwischen den Schritten |
Bottom-Sheet
Das Bottom-Sheet ist das mobile Geschwister des Modals: ein Overlay, das einblendet, und ein Panel, das von der Unterkante hochfährt, nur oben gerundet, mit Griff und Safe-Area-Abstand. Eigener Block statt Modal-Modifier, weil Layout, Einfahrbewegung und Geste verschieden sind. --inline bettet das Panel ohne Overlay in den Fluss ein; die Overlay-Form braucht ein wenig JavaScript, unten gezeigt und in GlassKit Elements als <glk-sheet> umgesetzt.
Umbuchen auf …
| Klasse | Beschreibung |
|---|---|
.glass-sheet-overlay | Fixiertes Overlay: Scrim, Blur, Panel an der Unterkante; startet bei Opacity 0 |
.is-active | Overlay sichtbar, Panel hochgefahren — per Skript geschaltet |
.glass-sheet | Das Panel: Milchglas, oben gerundet, unten Safe-Area-Abstand |
--inline | Im Fluss, ohne Overlay, rundum gerundet |
__grip, __title, __body, __actions | Griff, Überschrift, Inhalt, Aktionsspalte |
Leerzustand
Für leere Listen und Ergebnisseiten: eine zentrierte Spalte mit runder Icon-Fläche, Titel, kurzem gedämpftem Text und Platz für eine oder mehrere Aktionen nebeneinander.
Noch keine Buchungen
Such dir einen Tag und einen Hund aus — das Team freut sich.
| Klasse | Beschreibung |
|---|---|
.glass-empty | Zentrierte Spalte |
__icon | 48-px-Kreisfläche, darin ein 24-px-Strich-Icon (::slotted(svg)-Zwilling für Elements) |
__title, __text | Überschrift und gedämpfter Text (max. 38 Zeichen breit) |
__action | Platz für eine oder mehrere Aktionen: nebeneinander mit 8 px Abstand, umbrechend und zentriert, wenn es eng wird (seit 1.17.0) |
Wochenstreifen
Eine Reihe von Tages-Chips, die seitwärts scrollt — ein Buchungshorizont, die Tage um heute. Jeder Chip ist ein <button> mit Wochentag, Tageszahl und einem Punkt, den ein Ton-Modifier einfärbt; ohne Ton bleibt der Punkt transparent, damit Chips mit und ohne Markierung gleich hoch sind. Der gewählte Chip trägt aria-pressed="true" wie in der Segmentwahl; :disabled oder aria-disabled="true" dimmt einen Tag, der nicht wählbar ist. Die Scrollbar ist versteckt. Gib jedem Knopf ein aria-label mit dem vollen Datum — das sichtbare „Di 22“ ist kein Name. <glk-date-strip> in GlassKit Elements baut das aus Daten, mit Pfeiltasten und zentriertem gewähltem Chip.
| Klasse | Beschreibung |
|---|---|
.glass-date-strip | Scrollende Reihe; versteckte Scrollbar; 4 px Innenabstand, damit der eigene Überlauf den Fokusring nicht beschneidet |
__day | Chip-Knopf, mindestens 44 px; [aria-pressed="true"] gewählt, :disabled / [aria-disabled="true"] gedimmt |
__day--today | Unterstreicht die Zahl |
__wd, __num | Wochentag in Versalien, Tageszahl |
__mark | 6-px-Punkt; ohne Ton transparent |
__mark--primary, --success, --warning, --error | Ton des Punkts über --gl-date-strip-tone; auf dem gewählten Chip wird jeder Ton zur Schriftfarbe auf Primär (--gl-date-strip-ink) |
Monatskalender
Ein Monat: Titel zwischen zwei runden Navigationsknöpfen, Wochentagszeile und 42 quadratische Tages-Knöpfe mit bis zu drei Punkten unter der Zahl. Der gewählte Tag trägt aria-pressed="true", --today zeichnet einen warmen Rahmen, --other dimmt einen Tag des Nachbarmonats, :disabled oder aria-disabled="true" dimmt einen Tag außerhalb des erlaubten Bereichs — die zweite Form bleibt für Pfeiltasten fokussierbar. Der Block ist eine role="group" aus Knöpfen mit dem vollen Datum als Namen, kein role="grid". <glk-calendar> in GlassKit Elements baut ihn, mit Tastaturnavigation und Namen aus Intl.
| Klasse | Beschreibung |
|---|---|
.glass-calendar | Block; __head mit __title (Ellipse, wenn es eng wird) und zwei __nav-Knöpfen, 32 px rund, mit SVG-Chevron |
__grid | Sieben Spalten, 4 px Abstand |
__wd | Wochentags-Kopfzelle, gedämpfte Versalien |
__day | Quadratischer Tages-Knopf; [aria-pressed="true"] gewählt, --today warmer Rahmen, --other gedimmter Nachbarmonat, :disabled / [aria-disabled="true"] gedimmt und nicht wählbar |
__marks, __mark | 5-px-Punkte unter der Zahl, bis zu drei; __mark--primary / --success / --warning / --error über --gl-calendar-tone, die Schriftfarbe auf dem gewählten Tag über --gl-calendar-ink |
Bildauswahl
Ein Bild wählen, mit Vorschau: eine 72-px-Fläche — das Bild mit object-fit: cover oder ein Platzhalter-Icon — und eine Spalte mit Beschriftung, Hinweis und Aktionen, die gewöhnliche .glass-btn-Knöpfe sind; der Block bringt keine eigene Knopfoptik mit. --round macht die Fläche rund für Avatare; eine lange Beschriftung bricht um und drückt die Fläche nie zusammen. Jedes Bild, nicht nur Fotos. <glk-image-picker> in GlassKit Elements ergänzt Dateidialog, EXIF-Drehung und Verkleinerung.
| Klasse | Beschreibung |
|---|---|
.glass-image-picker | Zeile: Fläche links, Spalte rechts, 14 px Abstand |
__preview | 72-px-Fläche; img füllt sie, svg ist der 28-px-Platzhalter in der gedämpften Icon-Farbe |
__preview--round | Kreis, für Avatare |
__meta | Spalte, die nachgibt (min-width: 0) |
__label, __hint | Beschriftung im Look von .glass-label, bricht überall um; kleiner gedämpfter Hinweis |
__actions | Umbrechende Reihe aus .glass-btn-Knöpfen |
Utilities
Stack (vertikal)
.gl-stack
.gl-stack--xs (8px)
.gl-stack--sm (12px)
.gl-stack--md (16px)
.gl-stack--lg (20px)
.gl-stack--xl (24px)
Row (horizontal)
.gl-row
.gl-row--xs (8px)
.gl-row--sm (12px)
.gl-row--md (16px)
Margin Top
.gl-mt-sm (12px)
.gl-mt-md (16px)
.gl-mt-lg (20px)
.gl-mt-xl (24px)
Margin Bottom
.gl-mb-sm (12px)
.gl-mb-md (16px)
.gl-mb-lg (20px)
.gl-mb-xl (24px)
Text
.gl-text-center
.gl-text-muted
.gl-text-sm
Layout
.gl-px (padding horizontal)
.gl-w-full (width: 100%)
.gl-flex-1 (flex: 1)
📋 Alle Klassen auf einen Blick
| Komponente | Klassen | Modifier / States |
|---|---|---|
| Hintergrund | .glass-bg | --has-tab-bar |
| Navigation | .glass-nav | – |
| Pill-Button | .glass-pill | :disabled |
| Theme-Toggle | .glass-theme-toggle | – |
| Titel | .glass-title | – |
| Card | .glass-card | --glow |
| Button | .glass-btn | --primary, --secondary, --tertiary, --sm, --lg, --auto, :disabled |
| Badge | .glass-badge | --primary, --success, --warning, --error, --interactive, --selected |
| Avatar | .glass-avatar | --sm, --lg |
| Divider | .glass-divider | – |
| Status | .glass-status | – |
| Liste | .glass-list | --flush, --bare, __item--interactive, __item--center, __item--danger, __item--accent, __leading--lg, __subtitle--wrap, __value, __section-header |
| Skeleton | .glass-skeleton | __line, __line--title |
| Tabelle | .glass-table | -wrap, __num, __muted |
| Fließtext | .glass-prose | – |
| Segmentwahl | .glass-segmented | --full, --scroll, --wrap, __item, __item--success/--warning/--error, __dot, [aria-pressed] |
| Schrittanzeige | .glass-steps | __item, __item--done, __item--current, __num, __label, __line |
| Bottom-Sheet | .glass-sheet-overlay + .glass-sheet | .is-active, --inline, __grip, __title, __body, __actions |
| Leerzustand | .glass-empty | __icon, __title, __text, __action |
| Wochenstreifen | .glass-date-strip | __day, __day--today, __wd, __num, __mark, __mark--primary/--success/--warning/--error, [aria-pressed], :disabled |
| Monatskalender | .glass-calendar | __head, __title, __nav, __grid, __wd, __day, __day--today, __day--other, __marks, __mark--primary/--success/--warning/--error, [aria-pressed], [aria-disabled] |
| Bildauswahl | .glass-image-picker | __preview, __preview--round, __meta, __label, __hint, __actions |
| Popover | .glass-popover | --top, --start, --end, .is-open |
| Input | .glass-input | --error, :disabled; .glass-input-wrap with __prefix / __suffix |
| Textarea | .glass-textarea | :disabled |
| Select | .glass-select | :disabled |
| Suchfeld | .glass-search | – |
| Toggle | .glass-toggle | :checked, :disabled |
| Checkbox | .glass-checkbox | :checked, :disabled |
| Radio | .glass-radio | :checked, :disabled |
| Range | .glass-range | :disabled |
| Progress | .glass-progress | --sm, --lg, --success, --error |
| Modal | .glass-modal-overlay | .is-active |
| Toast | .glass-toast | --success, --error, --warning, .is-visible, __action, __close |
| Tab-Bar | .glass-tab-bar | .is-active auf Items |
| Tab-Bar Floating | .glass-tab-bar-dock + .glass-tab-bar--floating | __accessory, __accessory--accent/--success/--error, --accessory-left |
| Accordion | .glass-accordion | .is-open auf Items |
🤖 KI / LLM-Referenz
GlassKit liefert eine SKILL.md mit – eine strukturierte, maschinenlesbare Komponenten-Referenz für KI-Assistenten, LLMs und Code-Generierungs-Tools.
| Feature | Beschreibung |
|---|---|
| Copy-Paste HTML | Alle 34 Komponenten mit exakter Verschachtelung und BEM-Hierarchie |
| Design-Token-Tabellen | Farben, Surfaces, Blur, Radii, Spacing, Shadows, Typography |
| State-Klassen-Mapping | is-active, is-open, is-visible, :checked – wo was hingehört |
| Composition Patterns | 6 fertige Seiten-Layouts: Login, Dashboard, Formular, Modal, Einstellungen, Fortschritt |
| Häufige Fehler | Typische Fehler und deren Korrekturen |
Anhängen oder referenzieren Sie SKILL.md, wenn Sie eine KI bitten, GlassKit-HTML zu generieren – für produktionsreife Ergebnisse.
🧩 Die GlassKit-Familie
GlassKit ist das CSS-Fundament einer dreischichtigen Familie – drei Schichten, eine Designsprache. Für alles jenseits einzelner Komponenten sind die Schwesterprojekte der vorgesehene Weg.
| Schicht | Projekt | Einsatz |
|---|---|---|
| CSS-Fundament | 🧊 GlassKit (Sie sind hier) | Die Designsprache: Pure-CSS-Komponenten, Design Tokens, Dark & Light. |
| App-Schicht | GlassKit Elements | Drop-in Web Components (glk-button, glk-card, …) für App-UIs. |
| Website-Schicht | GlassKit Web | Eine komplette Website bauen – das offizielle Astro-Template mit Sections, i18n und SEO auf dem GlassKit-Fundament. |