Thank you for your interest in contributing to this project! This guide will help you get started.
- Node.js 22+ und pnpm
- Git
# Repository klonen
git clone <your-repository-url>
cd <your-theme-name>
# Abhängigkeiten installieren
pnpm install
# Playwright-Browser installieren
pnpm exec playwright install
# Entwicklung starten (Theme Watch & Beispiel-App)
pnpm startDer Start-Befehl kombiniert rollup --watch mit einem lokalen Beispiel auf Basis von @public-ui/sample-react. So können Sie die Styles im Kontext einer Anwendung prüfen, während das Theme kontinuierlich neu gebaut wird.
Sind Sie fertig, überprüfen Sie das Ergebnis mit den Snapshot-Tests und checken Sie bei Bedarf aktualisierte Referenz-Snapshots ein:
pnpm test # Snapshots prüfen
pnpm test-update # Referenz-Snapshots aktualisierenDieses Theme verwendet CSS Cascade Layers für vorhersagbares Styling:
// Layer-Reihenfolge (niedrigste bis höchste Spezifität)
@layer kol-theme-global; // Globale Theme-Styles
@layer kol-theme-component; // Component-spezifische Stylessrc/
├── components/ # Component-Styles (@layer kol-theme-component)
│ ├── button.scss
│ ├── input.scss
│ └── ...
├── global.scss # Globale Theme-Styles (@layer kol-theme-global)
├── global/ # Zusätzliche globale Styles (z. B. Icons)
├── mixins/ # Sass Mixins und Utilities (keine Layer)
├── globals.d.ts # TypeScript Deklarationen für SCSS-Module
└── index.ts # Theme-Einstiegspunkt (exportiert `CUSTOM_THEME`)
## Styling-Regeln
### Layer-Durchsetzung
Custom Stylelint-Regeln stellen ordnungsgemäße Layer-Nutzung sicher:
1. **Component-Dateien** (`src/components/*.scss`) **MÜSSEN** `@layer kol-theme-component` verwenden
2. **Global-Datei** (`src/global.scss`) **MUSS** `@layer kol-theme-global` verwenden
3. **Utility-Dateien** (Mixins, Helfer) **DÜRFEN KEINE** Layer verwenden
4. Nur zugelassene Layer-Namen sind erlaubt: `kol-theme-global`, `kol-theme-component`
### Web Component Encapsulation
**WICHTIG**: Theme-Dateien **MÜSSEN** `:host` statt `:root` verwenden für Web Component Kapselung:
```scss
// ✅ Korrekt: :host für Web Component Styling
@layer kol-theme-global {
:host {
--font-family: var(--theme-font-family);
background-color: white;
color: black;
}
}
@@ -169,189 +172,190 @@ Diese Regeln stellen sicher:
}
- Erstellen und testen:
pnpm build
pnpm lint
pnpm testsrc/global.scss innerhalb des globalen Layers bearbeiten:
@layer kol-theme-global {
:host {
// Globale Theme-Variablen und Styles
}
}Utilities in src/mixins/ ohne Layer hinzufügen:
// src/mixins/my-utility.scss
@mixin my-utility {
// Utility-Styles (kein @layer nötig)
}pnpm dev # Watch-Modus mit Hot Reload
pnpm start # Entwicklungsserverpnpm build # Optimierter Produktions-Buildassets/- Statische Assets und Schriftartendist/- Kompilierte CSS-Dateien
pnpm test # Visual Tests ausführen
pnpm test-update # Visual Snapshots aktualisierenDie Visual Tests benötigen korrekt geladene Assets (Schriftarten und Icons), um aussagekräftige Screenshots zu erstellen:
- inject-assets.css - Zentrale Asset-Injektionsdatei mit @import-Anweisungen für:
assets/material-symbols-subset/style.css- Reduziertes Material Icons Setassets/fira-sans-v17-latin/style.css- Fira Sans Schriftfamilie (400-700)
Die Visual Tests setzen THEME_CSS=$(pwd)/inject-assets.css, um genau diese Datei in die Beispiel-Anwendung zu laden.
Wichtig: Ohne korrekt geladene Assets würden Visual Tests fälschlicherweise als "geändert" erkannt, da Fallback-Schriftarten oder fehlende Icons verwendet würden.
pnpm lint # Stylelint + ESLint
pnpm format # Prettier-FormatierungFühren Sie immer den vollständigen Validierungs-Workflow aus:
pnpm build # Sauberen Build sicherstellen
pnpm format # Formatierung korrigieren
pnpm lint # Code-Qualität prüfen
pnpm test # Visual Tests validieren- Verwenden Sie Tabs für Einrückung (außer Markdown-Dateien verwenden Leerzeichen)
- Zeilenlänge: 160 Zeichen
- Einfache Anführungszeichen in SCSS/CSS
- BEM-Namenskonvention für CSS-Klassen befolgen
- Semantische Variablennamen verwenden
- Niemals Layer-Regeln umgehen - Alles CSS muss in entsprechenden Layern sein
- Component-Isolation - Component-Styles betreffen nur ihre Component
- Globale Zurückhaltung - Globaler Layer nur für theme-weite Variablen und Host-Styles
- Kein Layer-Mixing - Layered und nicht-layered CSS nicht in derselben Datei mischen
| Datei | Zweck |
|---|---|
.stylelintrc.json |
Stylelint-Konfiguration mit Custom-Regeln |
eslint.config.js |
ESLint-Konfiguration für JavaScript/TypeScript |
rollup.config.js |
Build-Konfiguration |
prettier.config.js |
Code-Formatierungsregeln |
stylelint-rules/ |
Custom Stylelint-Regel-Implementierungen |
Stylelint Layer-Fehler:
CSS rule "selector" must be inside @layer kol-theme-component
→ Wrappen Sie alles CSS in den entsprechenden Layer für den Dateistandort.
Build-Fehler:
pnpm clean # Dist und Cache löschen
pnpm install # Abhängigkeiten neu installieren
pnpm build # Neu erstellenVisual Test-Fehler:
pnpm test-update # Snapshots aktualisieren wenn Änderungen beabsichtigt sind- Untersuchen Sie bestehende Component-Implementierungen in
src/components/. - Prüfen Sie die Custom Stylelint-Regeln in
stylelint-rules/. - Führen Sie
pnpm lintfür spezifische Fehlermeldungen aus.
Problem: Assets werden trotz "Disable cache" nicht aktualisiert. Chrome lädt weiterhin alte Versionen, auch nach hartem Reload.
Ursache: In Chrome hängt sehr wahrscheinlich ein Service Worker dazwischen. Das DevTools-Häkchen „Disable cache" betrifft nur den HTTP-Cache, nicht den Cache Storage eines Service Workers. Der SW serviert dann weiterhin alte Assets.
-
DevTools → Application → Service Workers
- „Unregister" klicken
- Optional: „Update on reload" aktivieren
-
Application → Clear storage
- Alle Häkchen an („Unregister service workers", „Cache storage", „IndexedDB", …)
- Clear site data klicken
-
Neu laden (am besten mit Rechtsklick auf den Reload-Button → Empty cache and hard reload)
-
Service Worker deaktivieren: In
main.tsx/index.tsxsicherstellen, dass der SW nicht registriert wird:// serviceWorker.unregister() verwenden // oder registerServiceWorker entfernen
-
Nur in Produktion: SW nur in Prod-Builds registrieren:
if (process.env.NODE_ENV === 'production') { // Service Worker nur in Production registrieren }
-
Cache-Headers korrekt setzen:
index.htmlbekommtCache-Control: no-store- Hash-Dateien (
*.js,*.css) dürfen gecacht werden
-
DevTools Einstellungen: In Chrome DevTools (Application → Service Workers) „Bypass for network" oder „Update on reload" aktivieren während der Entwicklung
-
Keine falschen Proxy-Headers: Bei Vite/Webpack keine Reverse-Proxy-Header oder CDN-Layer verwenden, die
max-ageauf HTML setzen
Falls es kein Service Worker ist:
- DevServer-Headers prüfen: HTML sollte
no-storehaben, Assets mit Hash + langes Caching - Back/Forward Cache: Chrome's bfcache kann verwirren - teste mit
location.reload(true)oderwindow.onpageshow-Handler (event.persisted)
In 90% der Fälle ist es der Service Worker. Unregister + Clear Storage behebt das sofort.
- Forken Sie das Repository
- Erstellen Sie einen Feature-Branch (
git checkout -b feature/amazing-feature) - Committen Sie Ihre Änderungen (
git commit -m 'Add amazing feature') - Pushen Sie zum Branch (
git push origin feature/amazing-feature) - Öffnen Sie einen Pull Request
- Beschreiben Sie Ihre Änderungen ausführlich
- Fügen Sie Screenshots bei UI-Änderungen hinzu
- Stellen Sie sicher, dass alle Tests bestehen
- Folgen Sie den Code-Style-Richtlinien
- Aktualisieren Sie die Dokumentation falls nötig
- Moderne Browser mit CSS Cascade Layers Unterstützung
- Chrome 99+, Firefox 97+, Safari 15.4+
- Für ältere Browser sollte ein CSS Layers Polyfill verwendet werden
Vielen Dank für Ihren Beitrag!