🇬🇧 EN

Glassmorphism UI Library

Vollständige CSS-Komponentenbibliothek im Glasmorphism-Stil – entwickelt von der Jungherz GmbH. Reines CSS, keine Abhängigkeiten, Dark & Light Mode.

v1.22.2 CSS only Dark + Light 34 Komponenten

Installation

Eine CSS-Datei einbinden – fertig. Optional ein Theme-Override für andere Markenfarben.

<!-- Basis-Library --> <link rel="stylesheet" href="glasskit.css"> <!-- Optional: Theme-Override --> <link rel="stylesheet" href="theme-override.css"> <!-- Dark Mode (Standard) --> <html data-theme="dark"> <!-- Light Mode --> <html data-theme="light">

Design Tokens

Alle visuellen Werte werden über CSS Custom Properties gesteuert.

Farbpalette

TokenDark-WertVerwendung
--gl-color-primary#f5a623Primärfarbe, Buttons, aktive Elemente
--gl-color-primary-dark#d4692aGradient-Endwert
--gl-color-text#ffffffStandard-Textfarbe
--gl-color-text-mutedrgba(255,255,255,0.60)Sekundärer Text
--gl-color-success#34c759Erfolg-Status
--gl-color-error#ff3b30Fehler-Status
--gl-color-warning#ffcc00Warn-Status
--gl-color-{state}-surface, -border, -on-surfacecolor-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

TokenWertVerwendung
--gl-surface-1rgba(…, 0.08)Subtilste Fläche (Status)
--gl-surface-2rgba(…, 0.10)Standard (Inputs, Cards)
--gl-surface-3rgba(…, 0.14)Nav-Pills, Badges
--gl-surface-4rgba(…, 0.16)Hover-States
--gl-surface-5rgba(…, 0.22)Starker Hover
--gl-surface-milk-strongrgba(…, 0.75)Secondary Button

Spacing & Radii

TokenWertTokenWert
--gl-space-2xs4px--gl-radius-xs8px
--gl-space-xs8px--gl-radius-sm12px
--gl-space-sm12px--gl-radius-input14px
--gl-space-md16px--gl-radius-btn16px
--gl-space-lg20px--gl-radius-card24px
--gl-space-xl24px--gl-radius-full9999px
--gl-space-2xl32px--gl-radius-pill50%

Dichte

TokenStandardKompaktVerwendung
--gl-control-height52px40pxInput, Select, Suchfeld
--gl-control-padding-xnicht gesetzt → --gl-space-md--gl-space-smInnenabstand links und rechts von Input, Select, Textarea
--gl-btn-height56px40pxButton
--gl-btn-height-sm44px32pxButton --sm
--gl-btn-height-lg64px48pxButton --lg
--gl-textarea-min-height120px88pxTextarea
--gl-list-item-min-height56px48pxListenzeile
--gl-list-item-padding-ynicht gesetzt → --gl-space-md10pxListenzeile, oben und unten
--gl-toggle-width × -height52 × 30px44 × 26pxToggle-Spur
--gl-toggle-thumb-size22px18pxToggle-Knopf
--gl-check-size24px20pxCheckbox, Radio
--gl-modal-action-height52px44pxModal-Aktionen

Theming (Light / Dark)

Das Theme wird über data-theme am <html>-Element gesteuert.

// Theme per JavaScript wechseln: function toggleTheme() { const html = document.documentElement; const current = html.getAttribute('data-theme'); html.setAttribute('data-theme', current === 'dark' ? 'light' : 'dark' ); }

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.

Drucken

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:

let printTheme = null; addEventListener('beforeprint', () => { printTheme = document.documentElement.getAttribute('data-theme'); document.documentElement.setAttribute('data-theme', 'light'); }); addEventListener('afterprint', () => { if (printTheme) document.documentElement.setAttribute('data-theme', printTheme); else document.documentElement.removeAttribute('data-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.

Standard
Kompakt

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.

<html data-theme="dark" data-density="compact"> // Zur Laufzeit umschalten: document.documentElement.setAttribute('data-density', 'compact'); document.documentElement.removeAttribute('data-density'); /* Ein Token für beide Dichten – oder nur für kompakt: */ :root { --gl-btn-height: 48px; } [data-density='compact'] { --gl-btn-height: 36px; }

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.

KlasseBeschreibung
.glass-bgVollständiger Hintergrund mit Aurora-Lichteffekten
.glass-bg--has-tab-barModifier: Padding unten für Tab-Bar
.glass-bg--has-tab-bar-floatingModifier: Padding unten für Floating-Tab-Bar + Accessory
<div class="glass-bg glass-bg--has-tab-bar"> <!-- Inhalte --> </div>

Pill-Buttons

Runde Icon-Buttons für Navigation und Aktionen.

KlasseBeschreibung
.glass-pillStandard Glas-Kreis (46×46px)
.glass-theme-togglePill mit Mond/Sonne-Icon-Switch

Tab-Bar

Fixierte Bottom-Navigation mit Glas-Hintergrund und optionalem Badge.

<nav class="glass-tab-bar"> <button class="glass-tab-bar__item is-active"> <span class="glass-tab-bar__icon"><!-- SVG --></span> <span class="glass-tab-bar__label">Start</span> </button> <button class="glass-tab-bar__item"> <span class="glass-tab-bar__icon"> <!-- SVG --> <span class="glass-tab-bar__badge">3</span> </span> <span class="glass-tab-bar__label">Verträge</span> </button> </nav>

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.

<div class="glass-tab-bar-dock"> <nav class="glass-tab-bar glass-tab-bar--floating"> <button class="glass-tab-bar__item is-active"> <span class="glass-tab-bar__icon"><!-- SVG --></span> <span class="glass-tab-bar__label">Start</span> </button> <!-- weitere Items --> </nav> <button class="glass-tab-bar__accessory" aria-label="Suche"> <!-- SVG --> </button> </div>

Akzent-Varianten für das Accessory

Mit --accent, --success oder --error wird das Accessory farbig untermalt (gefüllter Hintergrund, weißes Icon).

KlasseBeschreibung
.glass-tab-bar-dockWrapper: fest unten zentriert, hält Tab-Bar + Accessory
.glass-tab-bar-dock--accessory-leftModifier: Accessory links statt rechts
.glass-tab-bar--floatingModifier auf .glass-tab-bar: Pillenform, max-content-Breite
.glass-tab-bar__accessoryEigenständige Glas-Kapsel neben der Tab-Bar
.glass-tab-bar__accessory--accentGefüllt mit Primärfarbe
.glass-tab-bar__accessory--successGefüllt mit Success-Farbe
.glass-tab-bar__accessory--errorGefüllt mit Error-Farbe
.glass-bg--has-tab-bar-floatingBackground-Padding-Helper für die Floating-Variante

Titel

Verträge aufnehmen
& hochladen

<h1 class="glass-title">Seitentitel</h1>

Card

Vertrag fotografieren, Kanten prüfen und gesammelt hochladen.

<div class="glass-card glass-card--glow"> <div class="glass-card__icon"><!-- SVG --></div> <p class="glass-card__text">Text</p> </div>
KlasseBeschreibung
.glass-cardBasis-Glasfläche
.glass-card--glowHell → milchig Verlauf + Lichtstreifen
.glass-card__iconZentrierter Icon-Wrapper
.glass-card__textBeschreibungstext

Buttons

KlasseBeschreibung
.glass-btnBasis (56px, volle Breite)
--primaryFarbiger Gradient
--secondaryMilchig-weiß
--tertiarySubtiles Glas
--sm44px Höhe
--lg64px Höhe
--autoAuto-Breite
:disabled, [aria-disabled="true"]Gedimmt auf 0,45, Cursor not-allowed, kein Hover (seit 1.21.2)
svg.glass-icon--fillBewusst 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

Standard Aktiv Fertig Offen Fehler
<span class="glass-badge glass-badge--primary">Aktiv</span>

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.

<button class="glass-badge glass-badge--interactive glass-badge--selected" aria-pressed="true">aktiv</button> <button class="glass-badge glass-badge--interactive" aria-pressed="false">beworben</button>
KlasseBeschreibung
--interactiveAnklickbar: Zeiger, Hover-Tönung, Fokusring, Druck-Rückmeldung
--selectedDer aktive Chip — vertieft die eigene Farbe des Badges
--gl-badge-accentDie Farbe, die beide Zustände vertiefen. Pro Badge setzbar, wenn ein Chip eine eigene Farbe bekommen soll.

Avatar

S
M
L
<div class="glass-avatar glass-avatar--lg">L</div>

Divider


<hr class="glass-divider">

Status-Hinweis

Noch keine Verträge vorhanden.

<div class="glass-status"> <svg viewBox="0 0 24 24"><!-- Icon --></svg> <p>Noch keine Verträge vorhanden.</p> </div>

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 Update
    2,1 GB · Jetzt verfügbar
  • Apple One
    Familie — verlängert sich am 28. Apr.
    22,95 €
  • Mitteilungen
  • Alle Abos anzeigen
<ul class="glass-list"> <li class="glass-list__item glass-list__item--interactive"> <span class="glass-list__leading"><svg>...</svg></span> <div class="glass-list__content"> <div class="glass-list__title">iOS 26.4 Update</div> <div class="glass-list__subtitle">2,1 GB · Jetzt verfügbar</div> </div> <div class="glass-list__trailing"><svg>...</svg></div> </li> <!-- Weitere Items… Trennlinien erscheinen automatisch --> <li class="glass-list__item glass-list__item--center">Alle anzeigen</li> </ul>

Kompaktes Menü (zentrierter Text, ohne Icons)

  • Vertrag teilen
  • Duplizieren
  • Löschen
<ul class="glass-list"> <li class="glass-list__item glass-list__item--center glass-list__item--interactive">Vertrag teilen</li> <li class="glass-list__item glass-list__item--center glass-list__item--interactive">Duplizieren</li> <li class="glass-list__item glass-list__item--center glass-list__item--interactive glass-list__item--danger">Löschen</li> </ul>

Gruppierte Sektionen mit großen Icons

Empfehlungen
  • Geladene Medien prüfen
    Spare bis zu 1,38 GB ein. Prüfe alle auf deinem Gerät geladenen Videos und Audiodateien und entferne sie bei Bedarf.
  • AusweisApp Bund
    Version 2.5.1
    24 MB
Hörbücher
  • Der Geist aus der Maschine
    Teilweise angesehen
    237,1 MB
  • Alle Downloads anzeigen
<div class="glass-list__section-header">Empfehlungen</div> <ul class="glass-list"> <li class="glass-list__item glass-list__item--interactive"> <span class="glass-list__leading glass-list__leading--lg"><svg>...</svg></span> <div class="glass-list__content"> <div class="glass-list__title">Geladene Medien prüfen</div> <div class="glass-list__subtitle glass-list__subtitle--wrap">Mehrzeilige Beschreibung...</div> </div> <div class="glass-list__trailing"> <span class="glass-list__value">24 MB</span> <svg>...</svg> </div> </li> <li class="glass-list__item glass-list__item--accent glass-list__item--center">Alle anzeigen</li> </ul>

Klassen-Referenz

KlasseBeschreibung
.glass-listGruppierter Surface-Container
.glass-list--flushEdge-to-Edge-Variante (kein seitlicher Margin / Radius). Setzt voraus, dass der Eltern-Container --gl-space-lg Padding hat.
.glass-list--bareEntfernt Hintergrund, Border & Shadow — für die Einbettung in .glass-popover oder .glass-card.
.glass-list__itemListenzeile (als <li>, <a> oder <button>)
.glass-list__section-headerSektionslabel oberhalb einer .glass-list — Uppercase, klein, gedämpft
.glass-list__item--interactiveFügt Hover- / Focus- / Active-States hinzu
.glass-list__item--centerZentrierte Single-Text-Variante mit Ellipsis-Truncation
.glass-list__item--dangerRoter Text für destruktive Aktionen
.glass-list__item--accentPrimärfarbener Text für Akzent-Aktionen
.glass-list__leadingLeading-Slot (28×28, enthält ein Icon-SVG)
.glass-list__leading--lgGroßer Leading-Slot (40×40, abgerundetes Quadrat, unterstützt <img>)
.glass-list__contentFlexibler mittlerer Slot — nimmt verbleibende Breite, ermöglicht Truncation
.glass-list__titlePrimärer Text (medium weight, ellipsis)
.glass-list__subtitleSekundärer Text (klein, gedämpft, ellipsis)
.glass-list__subtitle--wrapMehrzeiliger Subtitle (bis 3 Zeilen, mit Ellipsis-Clamp)
.glass-list__trailingTrailing-Slot — Chevron, Wert, Button, Badge
.glass-list__valueGedä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.

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.

Dokument erfolgreich hochgeladen!
Neue Version verfügbar
<div class="glass-toast glass-toast--success"> <svg class="glass-toast__icon">...</svg> <span class="glass-toast__text">Erfolgreich!</span> </div> <!-- with an action --> <div class="glass-toast is-visible" role="status"> <svg class="glass-toast__icon">...</svg> <span class="glass-toast__text">Neue Version verfügbar</span> <button class="glass-toast__action">Neu laden</button> <button class="glass-toast__close" aria-label="Schließen"><!-- × SVG --></button> </div>
KlasseBeschreibung
.glass-toast, .is-visibleOben fixiert, sichtbar eingeblendet
--success, --error, --warningFärben das Symbol; tönen die Aktion in der Statusfarbe
__icon, __text22-px-Symbol, Nachricht (bricht um, gibt nach)
__actionEine Aktion: Pille im Ton des Toasts, 44 px Trefferfläche, schrumpft nie (seit 1.19.0)
__closeDas ×, 28 px mit 44 px Trefferfläche (seit 1.19.0)
--gl-toast-topAbstand 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.

  • Teilen
  • Duplizieren
  • Löschen
<div class="glass-popover-anchor"> <button class="glass-btn glass-btn--secondary" onclick="togglePop(this)">Menü öffnen</button> <div class="glass-popover"> <ul class="glass-list glass-list--bare"> <li class="glass-list__item glass-list__item--interactive">Teilen</li> <li class="glass-list__item glass-list__item--interactive">Löschen</li> </ul> </div> </div> <script> // Hinweis: NICHT `togglePopover` benennen — kollidiert mit der nativen // HTMLElement.togglePopover()-API-Methode. function togglePop(btn) { btn.nextElementSibling.classList.toggle('is-open'); } </script>

Klassen-Referenz

KlasseBeschreibung
.glass-popover-anchorPositionierungs-Kontext für den Popover (umschließt Trigger + Popover)
.glass-popoverFloating Glass-Surface, ausgeblendet bis .is-open
.glass-popover.is-openSichtbarer Zustand — Fade- + Scale-Animation
.glass-popover--topÖffnet nach oben (über dem Trigger)
.glass-popover--startLinke Kante am Trigger ausrichten
.glass-popover--endRechte 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

Bitte gültige E-Mail angeben
EUR

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.

<div class="glass-input-group"> <label class="glass-label">Label</label> <input class="glass-input" type="text"> <span class="glass-hint">Hilfetext</span> </div>

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.

<div class="glass-input-wrap glass-input-wrap--suffix" style="--gl-input-suffix-size: 30px"> <input class="glass-input" inputmode="decimal"> <span class="glass-input-wrap__suffix">EUR</span> </div>

Textarea

<textarea class="glass-textarea"></textarea>

Select

<select class="glass-select"> <option>Bitte wählen…</option> </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.

Toggle Switch

<label class="glass-toggle"> <input class="glass-toggle__input" type="checkbox"> <span class="glass-toggle__track"> <span class="glass-toggle__thumb"></span> </span> <span class="glass-toggle__label">Label</span> </label>

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

75%

Progress Bar

Standard68%
Erfolg100%
KlasseBeschreibung
.glass-progressBasis-Container
--sm / --lgTrack-Höhe: 4px / 12px
--success / --errorFarb-Varianten

Accordion

Die ausführliche Antwort auf diese Frage.
Die Antwort auf Frage zwei.

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.

<div class="glass-skeleton" aria-busy="true"> <div class="glass-skeleton__line glass-skeleton__line--title" style="width:55%"></div> <div class="glass-skeleton__line"></div> <div class="glass-skeleton__line" style="width:80%"></div> </div>
KlasseBeschreibung
.glass-skeletonStapel aus Zeilen, 10px Abstand
.glass-skeleton__lineEine Schimmerzeile (12px); Breite per Inline-Style
.glass-skeleton__line--titleHö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.

DatumPostenBetrag
2026-09-18Rechnung 10421.240,00
2026-09-19Erstattung−80,00
2026-09-20Offen–
<div class="glass-table-wrap"> <table class="glass-table"> <thead><tr><th>Datum</th><th class="glass-table__num">Betrag</th></tr></thead> <tbody><tr><td>2026-09-18</td><td class="glass-table__num">1.240,00</td></tr></tbody> </table> </div>
KlasseBeschreibung
.glass-table-wrapOptionaler Container mit seitlichem Scrollen
.glass-tableDie Tabelle: Haarlinien, Hover-Hervorhebung
.glass-table__numRechtsbündig, Tabellenziffern — auf th und td
.glass-table__mutedSekundä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.
<article class="glass-prose"> <!-- gerendertes Markdown: h1–h3, p, ul/ol, a, code, pre, blockquote, img, hr, table --> </article>

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.

<div class="glass-segmented glass-segmented--full" role="group" aria-label="Status"> <button class="glass-segmented__item glass-segmented__item--success" aria-pressed="true"> <span class="glass-segmented__dot"></span>Grün </button> <button class="glass-segmented__item" aria-pressed="false">Hilfeseite</button> </div>
KlasseBeschreibung
.glass-segmentedDie Gruppe: eingelassene Glas-Schiene, Knöpfe darin
--fullKnöpfe teilen sich die Breite
--scrollEine Zeile, die seitwärts scrollt, wenn die Optionen nicht passen; Scrollbar versteckt (seit 1.17.0)
--wrapBricht die Zeile um, wenn die Optionen nicht passen (seit 1.17.0)
__itemEine Option; aria-pressed="true" markiert die gewählte, disabled dämpft
__item--success / --warning / --errorTon: setzt --gl-segmented-tone für den Punkt
__dotDer 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".

  1. Tag
  2. Fenster
  3. 3Hund
  4. 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:

  1. Tag
  2. 2Zeitfenster wählen
  3. 3Hund
  4. 4Bestätigen
<ol class="glass-steps"> <li class="glass-steps__item glass-steps__item--done"> <span class="glass-steps__num"><!-- check SVG --></span><span class="glass-steps__label">Tag</span> </li> <li class="glass-steps__line" aria-hidden="true"></li> <li class="glass-steps__item glass-steps__item--current" aria-current="step"> <span class="glass-steps__num">2</span><span class="glass-steps__label">Fenster</span> </li> </ol>
KlasseBeschreibung
.glass-stepsDie Liste; ein Größen-Container, in einer Flex-Zeile also mit Breite versehen
__item, __item--done, __item--currentEin Schritt und seine Zustände
__numDer Kreis: Nummer, oder ein SVG-Haken wenn erledigt
__labelDie Beschriftung; unter 360 px ausgeblendet, außer am aktuellen Schritt
__lineHaarlinie 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 …

Inhalt des Sheets: Liste, Text, Formular. Dieses hier ist eingebettet.
<div class="glass-sheet-overlay" hidden> <div class="glass-sheet" role="dialog" aria-modal="true"> <div class="glass-sheet__grip"></div> <h2 class="glass-sheet__title">Umbuchen auf …</h2> <div class="glass-sheet__body">…</div> <div class="glass-sheet__actions">…</div> </div> </div> // öffnen: hidden entfernen, Reflow erzwingen, im nächsten Frame .is-active setzen // schließen: .is-active entfernen, hidden nach transitionend (Sicherheitsnetz 400 ms)
KlasseBeschreibung
.glass-sheet-overlayFixiertes Overlay: Scrim, Blur, Panel an der Unterkante; startet bei Opacity 0
.is-activeOverlay sichtbar, Panel hochgefahren — per Skript geschaltet
.glass-sheetDas Panel: Milchglas, oben gerundet, unten Safe-Area-Abstand
--inlineIm Fluss, ohne Overlay, rundum gerundet
__grip, __title, __body, __actionsGriff, Ü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.

<div class="glass-empty"> <span class="glass-empty__icon"><!-- SVG --></span> <p class="glass-empty__title">Noch keine Buchungen</p> <p class="glass-empty__text">…</p> <div class="glass-empty__action">…</div> </div>
KlasseBeschreibung
.glass-emptyZentrierte Spalte
__icon48-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)
__actionPlatz 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.

<div class="glass-date-strip" role="group" aria-label="Pick a day"> <button class="glass-date-strip__day glass-date-strip__day--today" aria-pressed="false" aria-label="Tuesday, 22 September 2026"> <span class="glass-date-strip__wd">Tu</span><span class="glass-date-strip__num">22</span> <span class="glass-date-strip__mark glass-date-strip__mark--success"></span> </button> <button class="glass-date-strip__day" aria-pressed="true" aria-label="…">…</button> <button class="glass-date-strip__day" aria-pressed="false" disabled>…</button> </div>
KlasseBeschreibung
.glass-date-stripScrollende Reihe; versteckte Scrollbar; 4 px Innenabstand, damit der eigene Überlauf den Fokusring nicht beschneidet
__dayChip-Knopf, mindestens 44 px; [aria-pressed="true"] gewählt, :disabled / [aria-disabled="true"] gedimmt
__day--todayUnterstreicht die Zahl
__wd, __numWochentag in Versalien, Tageszahl
__mark6-px-Punkt; ohne Ton transparent
__mark--primary, --success, --warning, --errorTon 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.

September 2026
<div class="glass-calendar"> <div class="glass-calendar__head"> <button class="glass-calendar__nav" aria-label="Previous month"><!-- SVG chevron --></button> <div class="glass-calendar__title">September 2026</div> <button class="glass-calendar__nav" aria-label="Next month">…</button> </div> <div class="glass-calendar__grid" role="group" aria-label="Pick a day"> <span class="glass-calendar__wd" aria-hidden="true">Mo</span> <!-- × 7 --> <button class="glass-calendar__day glass-calendar__day--other" aria-pressed="false" aria-label="Monday, 31 August 2026"> <span>31</span><span class="glass-calendar__marks"></span> </button> <button class="glass-calendar__day glass-calendar__day--today" aria-pressed="true" aria-label="…"> <span>22</span><span class="glass-calendar__marks"><span class="glass-calendar__mark glass-calendar__mark--warning"></span></span> </button> <!-- 42 cells --> </div> </div>
KlasseBeschreibung
.glass-calendarBlock; __head mit __title (Ellipse, wenn es eng wird) und zwei __nav-Knöpfen, 32 px rund, mit SVG-Chevron
__gridSieben Spalten, 4 px Abstand
__wdWochentags-Kopfzelle, gedämpfte Versalien
__dayQuadratischer Tages-Knopf; [aria-pressed="true"] gewählt, --today warmer Rahmen, --other gedimmter Nachbarmonat, :disabled / [aria-disabled="true"] gedimmt und nicht wählbar
__marks, __mark5-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.

Foto des Hundes JPG oder PNG · wird vor dem Hochladen auf 1024 px verkleinert
Profilfoto
<div class="glass-image-picker" role="group" aria-labelledby="photo-label"> <div class="glass-image-picker__preview glass-image-picker__preview--round"><img src="…" alt=""></div> <div class="glass-image-picker__meta"> <span class="glass-image-picker__label" id="photo-label">Profile photo</span> <span class="glass-image-picker__hint">JPG or PNG</span> <div class="glass-image-picker__actions"> <button class="glass-btn glass-btn--secondary glass-btn--sm glass-btn--auto">Change</button> <button class="glass-btn glass-btn--tertiary glass-btn--sm glass-btn--auto">Remove</button> </div> </div> </div>
KlasseBeschreibung
.glass-image-pickerZeile: Fläche links, Spalte rechts, 14 px Abstand
__preview72-px-Fläche; img füllt sie, svg ist der 28-px-Platzhalter in der gedämpften Icon-Farbe
__preview--roundKreis, für Avatare
__metaSpalte, die nachgibt (min-width: 0)
__label, __hintBeschriftung im Look von .glass-label, bricht überall um; kleiner gedämpfter Hinweis
__actionsUmbrechende 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

KomponenteKlassenModifier / 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.

FeatureBeschreibung
Copy-Paste HTMLAlle 34 Komponenten mit exakter Verschachtelung und BEM-Hierarchie
Design-Token-TabellenFarben, Surfaces, Blur, Radii, Spacing, Shadows, Typography
State-Klassen-Mappingis-active, is-open, is-visible, :checked – wo was hingehört
Composition Patterns6 fertige Seiten-Layouts: Login, Dashboard, Formular, Modal, Einstellungen, Fortschritt
Häufige FehlerTypische Fehler und deren Korrekturen

Anhängen oder referenzieren Sie SKILL.md, wenn Sie eine KI bitten, GlassKit-HTML zu generieren – für produktionsreife Ergebnisse.

# Dateipfad glasskit/SKILL.md # Auch im npm-Paket enthalten npm install @jungherz-de/glasskit node_modules/@jungherz-de/glasskit/SKILL.md

🧩 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.

SchichtProjektEinsatz
CSS-Fundament🧊 GlassKit (Sie sind hier)Die Designsprache: Pure-CSS-Komponenten, Design Tokens, Dark & Light.
App-SchichtGlassKit ElementsDrop-in Web Components (glk-button, glk-card, …) für App-UIs.
Website-SchichtGlassKit WebEine komplette Website bauen – das offizielle Astro-Template mit Sections, i18n und SEO auf dem GlassKit-Fundament.