CSS Design System für alle xPulse Tools – Struktur, Farben, Effekte und
Animationen in einem Package. Kein separates @xpulse/theme – alles lebt in
@xpulse/theme.
Ein Theme ist eine CSS-Datei die Custom Properties, Komponenten-Styles,
Hover/Focus-Effekte und Animationen definiert. Themes werden per Discovery
automatisch gefunden – kein manuelles Registrieren.
Theme-Namen werden aus dem gebündelten CSS per Regex extrahiert –
kein Filename-Parsing, kein manuelles Registrieren:
1
[data-theme="dark"] → 'dark'
2
[data-theme="light"] → 'light'
3
[data-theme="app"] → 'app'
Nur Themes die im CSS als Selektor auftauchen, gelten als bekannt.
App-Theme-Overrides
App-CSS unter src/themes/ wird ans Bundle-Ende angehängt.
Der app-Theme-Link wird zusätzlich als separater <link> eingebunden (via themeAssets()).
xpulse.json Konfiguration
1
{
2
"theme":{
3
"default":"dark",
4
"allow":["dark","light"],
5
"cache":{
6
"enabled":true,
7
"ttl":0
8
}
9
}
10
}
Key
Beschreibung
Default
theme.default
Aktives Theme beim Start
"dark"
theme.allow
Welche Themes der User wählen darf. [] = alle entdeckten Themes erlaubt
[]
theme.cache.enabled
CSS-Bundle cachen (siehe Caching-Abschnitt)
true
theme.cache.ttl
Cache-Ablauf in Sekunden. 0 = kein Ablauf
0
Wenn allow leer oder nicht gesetzt – alle entdeckten Themes sind erlaubt.
Wenn allow genau ["dark", "light"] enthält – Toggle-Button statt Select.
Wenn allow mehr als 2 Themes enthält – Select-Dropdown.
Wenn allow nur ein Theme enthält – kein Switcher in der UI.
// root → wo nach src/themes/ gesucht wird (default: cwd)
9
// force → Cache ignorieren und Bundle neu bauen
10
11
// Aktives Default-Theme (aus Config)
12
theme.current(); // → 'dark'
13
14
// Alle im CSS entdeckten Themes
15
theme.available(); // → ['dark', 'light']
16
17
// Erlaubte Themes (gefiltert durch theme.allow)
18
theme.allowed(); // → ['dark', 'light']
19
20
// Existenzprüfung
21
theme.has('dark'); // → true
22
23
// Theme-Wechsel (Server-seitig)
24
theme.set('light');
25
26
// Toggle (nur wenn genau 2 Themes in allowed())
27
theme.toggle();
28
29
// URLs
30
theme.href(); // → '/_theme/css/xpulse.css'
31
theme.scriptHref(); // → '/_theme/theme.js'
Wie der Toggle funktioniert
Theme-Wechsel wird durch data-theme-Attribut auf <html> gesteuert –
CSS-Selektoren html[data-theme="dark"] greifen ohne JS-seitiges DOM-Styling.
Zur Sicherheit wird zusätzlich die Klasse theme-${name} gesetzt.
Bestehende xPulse-Projekte nutzen noch die alten unprefix-ten Properties.
Migration bei v1.4.0 (Component Based):
Alt
Neu
--bg
--xpulse-bg
--surface
--xpulse-surface
--border
--xpulse-border
--muted
--xpulse-muted
--text
--xpulse-text
--text-dim
--xpulse-text-dim
--accent
--xpulse-accent
--accent2
--xpulse-accent2
--danger
--xpulse-danger
--mono
--xpulse-font-mono
--serif
--xpulse-font-serif
.btn-primary
.xpulse-btn-primary
.btn-secondary
.xpulse-btn-secondary
.btn-danger
.xpulse-btn-danger
.btn-icon
.xpulse-btn-icon
.field
.xpulse-field
.field-label
.xpulse-field-label
.field-hint
.xpulse-field-hint
@keyframes fadeIn
@keyframes xpulse-fadeIn
@keyframes spin
@keyframes xpulse-spin
Chat-spezifische Properties (--sidebar-width, --topbar-height) und
Klassen (.status-dot, .status-badge, .waiting-dots) bleiben im
Chat-CSS ohne Umbenennung.
Dokumentation
Die Komponentendokumentation wird als eigenständige HTML-Seite gerendert –
analog zu Bootstrap/Tailwind: live Vorschau + Code-Snippet nebeneinander.
1
xpulse.one/doc/component/theme/
Aufbau:
Jede Komponente hat einen Block mit:
Rendered Preview (echtes HTML mit aktivem Theme)
Code-Snippet (copy-pasteable)
Varianten (z.B. alle Button-Typen)
Theme-Toggle direkt in der Doku sichtbar – dark/light live umschalten
Custom Properties Übersicht als Tabelle mit Live-Farbvorschau
Animationen als Live-Demo
Das Docs-HTML lebt in docs/de/components.html + docs/en/components.html
als eigenständige HTML-Docs – rendered direkt im Docs-Bereich von xpulse.one
via <iframe> oder inline eingebettet (siehe GLOBAL_concept-docs.md).