Farbpalette
Erweitere Basisfarben zu wahrnehmungsgleichmäßigen Skalen und setze sie zu einer Palette zusammen. Die gesamte Mathematik wird an den gebündelten Generator delegiert; die Aufgabe dieses Skills liegt in der Konfiguration und Validierung.
Prinzipien (Warum OKLCH)
- Erstelle niemals Skalen in HSL/RGB. HSL-Helligkeit lügt (gleicher Wert ≠ gleiche wahrgenommene Helligkeit) und der Farbton driftet beim Abdunkeln/Aufhellen. Gleiche HSL-Helligkeit lässt Gelb zu hell und Blau zu dunkel erscheinen.
- OKLCH ist der Arbeitsraum: L (Helligkeit), C (Chroma), H (Farbton) — gleiche Zahlen sehen gleich aus, und es ist natives CSS.
- Chroma muss pro Stufe gamut-begrenzt werden. Hohe Chroma ist bei sehr hellen/dunklen Stufen physikalisch unmöglich; der Generator reduziert sie, anstatt dass der Browser sie abschneidet.
- Ein Kontrastanker: Weißer Text besteht WCAG AA ab L ≈ 0,55 abwärts, schwarzer Text ab L ≈ 0,60 aufwärts. Die mittleren Stufen werden um diese Ziele herum platziert.
Vollständige Theorie und Quellen: references/theory.md
Arbeitsablauf
1. Ziel klären
Bestätige mit dem Benutzer (überspringe, was bereits bekannt ist): Basisfarbe(n) oder Markenfarben; Stufenanzahl (11 ist Standard, 9 kompakt, 12 wenn Radix-artige Rollen benötigt werden); welche Farbtöne die Palette benötigt (Marke + semantisch: Erfolg/Warnung/Gefahr/Info + neutral); Dunkelmodus erforderlich?
2. Die Skalen generieren
cd "{skill_dir}/scripts" && python3 generate_ramp.py "#3b82f6" --steps 11 --chroma 90
# Multi-Farbton-Palette: ein Aufruf, durch Komma getrennte Namen
python3 generate_ramp.py "#3b82f6" "#e11d48" "#22c55e" --names blau,rot,gruen --format css
Wichtige Flags: --chroma N (Prozent des gamut-Maximums pro Stufe; 80–95 typisch, höher = intensiver), --hue-drift D (bewusste Farbtonverschiebung hell→dunkel, z. B. dunkles Gelb in Richtung Orange; nur auf Anfrage), --cvd (deutan-simulierte Hex-Werte), --format table|css|json.
Multi-Farbton-Regel: Generiere alle Farbtöne in EINEM Aufruf, damit sie auf jeder Stufe identische Helligkeit und Chroma-Prozentsätze teilen — das sorgt dafür, dass sich blau-500 und rot-500 wie Geschwister anfühlen. Generiere niemals einen Farbton mit anderen Grenzen neu.
3. Validieren
Lies die Tabellenausgabe und überprüfe:
- Helligkeit monoton, ΔE zwischen benachbarten Stufen annähernd konstant (Gleichmäßigkeitsspalte)
- Beabsichtigte Vordergrund-/Hintergrund-Stufenpaare bestehen WCAG AA (weißer Text benötigt eine Stufe mit
vs-white ≥ 4,5; schwarzer Textvs-black ≥ 4,5) - Keine Warnung zu ΔE zwischen Farbtönen (≥ 0,05 Oklab zwischen gleichnamigen Stufen)
- Mit
--cvd: Deutan-simulierte Stufen sind an den für bedeutungstragende UI verwendeten Stufen noch unterscheidbar
Wenn der Benutzer eine bestehende Palette zur Prüfung bereitgestellt hat, konvertiere jede Stufe in OKLCH (--format json bei einer Rekonstruktion oder manuelle Konvertierung) und überprüfe dieselben vier Punkte.
4. Die Palette komponieren
- Rollen Stufen zuweisen (Radix-Konvention): 1–2 App-Hintergründe · 3–5 Komponenten-Hintergrund (normal/hover/active) · 6–8 Rahmen/Fokus · 9–10 Solider Hintergrund und Hover (Stufe 9 = reinste, höchste Chroma) · 11–12 Text (niedriger/hoher Kontrast).
- Semantisch aliasen:
--danger-500, nicht--rot-500, wenn eine Skala einer Bedeutung dient. Eine Skala kann mehrere Aliase bedienen. - Dunkelmodus = neu zuordnen, nicht neu generieren: Behalte die Skala bei, kehre die semantischen Zuweisungen um (hellste Stufe wird dunkelste Oberfläche, Textfarben tauschen die Enden). Die wahrnehmungsmäßige Gleichmäßigkeit in OKLCH macht die umgekehrte Zuordnung gleichermaßen lesbar.
5. Ausliefern
Schreibe die --format css-Ausgabe in eine Datei (CSS-Custom-Properties mit Hex-Fallbacks innerhalb von @supports) sowie den Validierungsbericht in den Chat. Wenn ein Designsystem das Ziel ist, schlage eine Token-Benennung vor (primitive Skala + semantische Aliasebene).
Häufige Korrekturen
| Symptom | Lösung |
|---|---|
| Stufen 50/100 wirken blass | Erwartet — Chroma ist nahe Weiß physikalisch begrenzt; „behebe“ es nicht durch Beschneiden |
| Farbtöne wirken ungleich in ihrer Lebendigkeit | Gleicher Aufruf für alle Farbtöne; versuche --chroma 80 |
| Eine 500er-Stufe besteht Kontrast für weißen Text nicht | Akzeptiere es für großen Text/Grafiken oder senke die mittlere Helligkeit (--hue-drift hilft nicht; verschiebe den Anker) |
| Dunkles Gelb wirkt oliv | Bewusster --hue-drift 10–15 in Richtung Orange oder akzeptiere es als Markengeschmack |