Communitygithub.com

oklch-Palettformel

Erstelle oder migriere die neutrale Palette einer Benutzeroberfläche (Hintergründe, Oberflächen, Linien, Text) als OKLCH-Formel, die von wenigen Eingaben gesteuert wird – anstatt Dutzende handverlesene Hex-Werte zu verwenden. Inklusive Hell- und Dunkelmodus, schrittweisen Leiter-Überschreibungen, einem Anpassungsskript zur Reproduktion bestehender Farben und einem Browser-Kontrast-Audit.

Was ist oklch-Palettformel?

Diese Fähigkeit ersetzt die manuelle Auswahl von 15–30 Hex-Werten für die neutrale Palette einer UI (Hintergründe, Oberflächen, Linien, Text) durch eine OKLCH-Formel. Sie wird durch nur drei Parameter gesteuert: `--hue`, `--lightness` und `--chroma` (oder `--contrast`). Dadurch können Hell- und Dunkelmodi konsistent verwaltet werden, ohne dass zwei separate Farbsätze von Hand gepflegt werden müssen. Das Tool bietet ein Anpassungsskript (`fit_palette.py`), das die Formel an bestehende Hex-Paletten anpasst und Abweichungen in ΔE pro Token ausgibt. Ein Browser-Kontrast-Audit (`palette-audit.mjs`) prüft alle Token auf Einhaltung der WCAG-Kontrastverhältnisse (4.5:1 für Text, 3:1 für Bedienelementränder). Die Palette basiert auf einer 'Leiter'-Struktur, bei der jedes Token eine Position auf einer Helligkeitstreppe hat. Durch Ändern eines Eingabeparameters verschiebt sich die gesamte Rampe, sodass die Kontrastabstände zwischen den Token erhalten bleiben. Überschreibungen einzelner Leiterstufen sind möglich, ohne die Farben direkt anzupassen. Unterstützt wird die Integration mit Tailwind v4 über `@theme`, wobei die Formel auf dem thematisierten Element deklariert wird. Das Tool eignet sich für die Erstellung neuer Themes, die Einführung von Dark Mode, die Umfärbung bestehender Produkte oder die Konsolidierung mehrerer App-Paletten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Adamparishspok/skills/tree/HEAD/skills/oklch-palette-formula

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht oklch-Palettformel?

Die neutralen Farben eines Produkts (Seitenhintergrund, Kartenoberflächen, Vertiefungen, Haarspitzen, vier Textstufen) bestehen normalerweise aus 15 bis 30 Hex-Werten pro Theme, die per Auge ausgewählt werden. Sie weichen ab, der Dunkelmodus ist ein zweiter handverlesener Satz, und niemand weiß, welche Paare noch den Kontrast bestehen. Ersetze sie durch eine Formel:

Oberflächenähnlicher Token:  L = Papier + Tiefe  × n(Token)     Chroma = Tönung      Farbton = Farbton
Text-Token:                 L = Tinte  + Stufe   × n(Token)     Chroma = Tinten-Tönung  Farbton = Farbton

n(Token) ist die Position des Tokens auf einer Leiter, eine Leiter pro Theme. Verschiebe eine Eingabe, und die gesamte Rampe bewegt sich mit – die Abstände zwischen den Stufen, also der Ort, an dem der Kontrast lebt, bleiben bei einer Umfärbung erhalten. Eine Umfärbung eines Produkts ist eine Zeile (--hue).

Drei Regler (--hue, --lightness, --chroma oder --contrast) steuern jede Farbe.

Dateien

  • references/palette.css: Einsetzbare Regeln mit Starteingaben und Leitern.
  • scripts/fit_palette.py: Passe Eingaben an eine vorhandene Hex-Palette an und gib ΔE pro Token aus.
  • scripts/ladders.json: Die Standardleitern (hell, dunkel).
  • scripts/palette-audit.mjs: Löse jeden Token in einem echten Browser in beiden Themes auf und schlage bei fehlendem Kontrast Alarm.
  • scripts/oklch.py: Konvertierungen und ΔE / WCAG-Hilfsfunktionen.

Vorgehensweise

  1. Benenne die Token nach ihrer Rolle, nicht nach ihrem Wert. Die Standardwerte:

    • Hintergründe: ground (Seite), panel (Schienen, Balken), surface (Karten, Menüs), surface-2 (Vertiefungen), surface-3 (Chips, hervorgehobene Zeilen), field.
    • Linien: line, line-2, line-3 (Haarspitzen, hellste bis dunkelste), plus field-line, der Rand eines Bedienelements, der 3:1 überschreiten muss.
    • Tinte: ink, ink-2, ink-3, ink-4 (Text, dunkelste bis dezenteste). Jede Tintenstufe ist Text, daher muss jede 4.5:1 überschreiten.
  2. Passe an, wähle nicht neu aus. Führe für ein bestehendes Produkt python3 scripts/fit_palette.py theme.css aus. Es liest die --color-* Hex-Deklarationen (hell, dann die [data-theme="dark"]-Regel), passt die Eingaben gegen die Standardleiter an und gibt ΔE pro Token aus. Unter 2 ist visuell identisch.

  3. Überschreibe Leiterstufen, wo das Design sie anders anordnet, niemals die Farbe. Bewerte Kandidaten mit fit_palette.py theme.css light '<Eingaben>' '<Überschreibungen>', bis das schlimmste ΔE unter ~2 liegt. Typische Überschreibungen: field: 0 (Eingabefelder entsprechen der Kartenfläche), ein breiteres line-3, eine größere Lücke zwischen ink und ink-2.

  4. Schreibe die Regeln (siehe references/palette.css):

    • Setze die Eingaben und die --color-*-Formeln auf das Element, das das Theme-Attribut trägt.
    • Wiederhole jede Eingabe, die du änderst, in der dunklen Regel. Eine für die Standardwerte des Kits geschriebene dunkle Regel würde sonst mit ihren Werten gewinnen.
    • Bei Tailwind v4 behalte die Token-Namen in @theme, damit die Hilfsklassen existieren; die Laufzeit-Deklarationen überschreiben sie.
  5. Prüfe in einem echten Browser: node scripts/palette-audit.mjs <url>. Es zeichnet jeden Token, liest sRGB zurück und prüft:

    • jede Tintenstufe bei 4.5:1 gegen jeden Hintergrund;
    • field-line und ring bei 3:1.

    Behebe einen Fehler, indem du die Leiterstufe dieses Tokens verschiebst, nicht indem du eine Farbe gesondert behandelst. Erwarte Fehler bei vorhandenen Paletten: In einer Migration von 17 Apps fand das Audit in mehr als der Hälfte fehlerhafte ink-4- oder field-line-Werte, die zuvor ausgeliefert wurden.

Fallstricke

  • var() innerhalb einer benutzerdefinierten Eigenschaft wird dort aufgelöst, wo sie deklariert ist.
    • Deklariere die Formeln auf :root und setze Eingaben auf einem Kind: Das Kind wird nie neu eingefärbt.
    • Alias-Token (--color-heading: var(--color-ink)) müssen ebenfalls auf demselben thematisierten Element deklariert werden.
  • Tailwind v4 @theme-Werte leben auf :root. Ein auf einen App-Root beschränktes Theme ([data-app]) muss die Formel dort deklarieren, nicht in @theme.
  • Alles, was Farben an eine Canvas- oder Kartenbibliothek übergibt (getComputedStyle(...).getPropertyValue('--color-x')) empfängt jetzt einen unaufgelösten oklch(calc(...))-String. Löse ihn zuerst auf: Zeichne ein Testelement und lies einen 1-Pixel-Canvas aus – genauso wie das Audit es tut.
  • Ein Farbton für Hintergründe und Tinten. Wenn die Tinten des Designs einen anderen Farbton haben als die Hintergründe, halte --ink-tint niedrig; bei L 0.98 wirkt jedes Chroma als Farbstich.
  • Marken-, Status- und Diagrammfarben bleiben außerhalb der Formel. Leite Text-auf-Tönung-Varianten (z. B. brand-text) vom selben Farbton bei einer festen Helligkeit ab, anstatt sie separat auszuwählen.
  • Gemischte Farbtöne, nur helle Paletten, die von Kompositionen abgetastet wurden, passen möglicherweise nicht innerhalb von ~2 ΔE. Überspringe sie, anstatt das Design zu verzerren. Das Audit gilt trotzdem.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Adamparishspok/skills

Make a website, web app or online store ready for AI agents. Scan it with Cloudflare's Agent Readiness checks, decide which checks apply to this kind of site, ship the discovery files and headers in priority order, and add the AI-first basics the scanner does not score (server-rendered content, JSON-LD, llms.txt). Covers robots.txt AI rules, Content Signals, sitemap, Markdown for Agents (Accept text/markdown), Link headers, API catalog, OAuth discovery, auth.md, MCP server card, A2A agent card, agent skills index, WebMCP, and commerce protocols (ACP, UCP, AP2, MPP, x402). Use when making a site AI-ready, agent-ready or AI-first, or fixing an isitagentready.com or Cloudflare Agent Readiness report. Triggers on: AI ready, agent ready, AI-first, agent readiness, isitagentready, AI Crawl Control, Markdown for Agents, text/markdown, llms.txt, GPTBot, ClaudeBot, AI crawlers, Content-Signal, ai-train, api-catalog, .well-known, oauth-protected-resource, auth.md, MCP server card, agent card, agent skills, WebMCP, a...

Adamparishspok/skills

Install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator.

Adamparishspok/skills

Give an interface one shared tempo and a small vocabulary of hover and state micro-interactions: duration tiers (tap/pop/hover/card/layout) for CSS and Motion, swap hand-offs, rows whose highlight grows in, trailing arrows, chevron nudges, card lifts without translate, scroll-edge fades, and icon/label swaps for copy and toggle buttons. Use when animations feel inconsistent, durations are scattered magic numbers, hovers only change colour, or a product feels flat or unfinished. Triggers on: animation duration, transition timing, hover state, micro-interaction, polish, copy button feedback, menu icon to close, back arrow, card hover, scroll fade, motion tokens, Framer Motion durations.

Adamparishspok/skills

Consolidate several apps or prototypes onto one shared component library without flattening their looks. Covers finding duplicated local components (buttons, selects, fields, modals, pagers, toasts), making shared components token-sized so each suite or app sets its own measurements, mapping variant names, deciding what stays app-specific, and the tailwind-merge traps that silently break custom tokens. Use when several apps each grew their own Btn/Select/Modal, when a design system's components "don't fit" a second product, or when retheming a family of apps. Triggers on: shared component library, design system consolidation, duplicate components, retheme, suite of apps, shadcn retokened, token-driven components, cn tailwind-merge custom tokens, variant mapping.

Verwandte Skills