Communitygithub.com

OKLCHカラーパレット生成

ベースカラーから知覚的に均一な色ランプを生成し、アクセシブルなカラーパレットをOKLCHで構成します。ガマットクランプされた9〜12ステップのスケールを構築し、複数の色相を各ステップで統一、WCAGコントラストと色覚障害対応の検証を行うバンドルスクリプトを提供します。

OKLCHカラーパレット生成 とは?

このスキルは、HSL/RGBではなくOKLCH色空間を利用して、知覚的に均一なカラーランプとアクセシブルなカラーパレットを生成することに特化しています。HSLでは同じ明度でも色相によって知覚される明るさが異なる(黄色は明るく、青は暗く見える)問題があるため、OKLCHを推奨します。ユーザーがブランドカラーからティント・シェードを展開したり、デザインシステムのカラートークンを構築、あるいは既存パレットのコントラストや色覚障害対応を検証したい場合に使用します。バンドルされたPythonスクリプトgenerate_ramp.pyを使用して、ガマットクランプされた9〜12ステップのランプを生成し、複数の色相を同一呼び出しで生成することで、各ステップ間でL(明度)とクロマ割合が一致し、異なる色相のスケール(例:blue-500とred-500)が兄弟のように感じられるようにします。また、WCAG AAコントラスト基準と色覚障害シミュレーション(CVD)の検証も行い、Radixスタイルのセマンティックエイリアス割り当てやダークモードのリマッピングもサポートしています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/TheSonOfThomp/skills/tree/HEAD/skills/color-palette

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

カラーパレット

ベースカラーを拡張して知覚的に均一なランプを生成し、それらを組み合わせてパレットを構成します。すべての計算はバンドルされたジェネレーターに委譲し、このスキルの判断は設定と検証にあります。

原理(なぜOKLCHか)

  • HSL/RGBでランプを生成してはいけません。 HSLの明度は嘘をつきます(同じ値≠同じ知覚明度)。また、ティントやシェードを適用すると色相がずれます。同じHSL明度でも黄色は明るすぎ、青は暗すぎて見えます。
  • OKLCHは作業空間として優れています:L(明度)、C(クロマ)、H(色相)— 同じ数値は同じに見え、ネイティブCSSでも使用可能です。
  • クロマはステップごとにガマットクランプする必要があります。 非常に明るい/暗いステップでは高いクロマは物理的に不可能です。ジェネレーターはブラウザにクリッピングさせるのではなく、クロマを減らします。
  • 1つのコントラストアンカー: 白色テキストはL ≈ 0.55以下からWCAG AAをパスし、黒色テキストはL ≈ 0.60以上からパスします。中間ステップはこれらのターゲットの周囲に配置されます。

完全な理論と出典: references/theory.md

ワークフロー

1. 目標を明確にする

ユーザーと確認します(既に分かっていることはスキップ):ベースカラーやブランドカラー、ステップ数(11が標準、9は控えめ、Radixスタイルのロールが必要な場合は12)、パレットに必要な色相(ブランド+セマンティック:成功/警告/危険/情報+ニュートラル)、ダークモードの有無。

2. ランプを生成する

cd "{skill_dir}/scripts" && python3 generate_ramp.py "#3b82f6" --steps 11 --chroma 90
# 複数色相パレット:1回の呼び出しで、カンマ区切りの名前
python3 generate_ramp.py "#3b82f6" "#e11d48" "#22c55e" --names blue,red,green --format css

主要なフラグ: --chroma N(各ステップのガマット最大値に対するクロマの割合。80〜95が標準、高いほど鮮やか)、--hue-drift D(明→暗で意図的に色相を変化させる。例:暗い黄色をオレンジに近づける。リクエストがあった場合のみ)、--cvd(デュータン(第二色盲)シミュレーションの16進数値)、--format table|css|json

複数色相ルール: すべての色相を1回の呼び出しで生成し、各ステップで同じLとクロマ割合を共有させます。これにより、blue-500 と red-500 が兄弟のように感じられるようになります。決して異なる範囲で1つの色相を再生成してはいけません。

3. 検証する

表形式の出力を読み、以下を確認します。

  • 明度が単調増加し、隣接ステップ間のΔEがほぼ一定(均一度カラム)
  • 意図したfg/bgステップペアがWCAG AAをパスしている(白色テキストには vs-white ≥ 4.5 のステップが必要。黒色テキストには vs-black ≥ 4.5 のステップが必要)
  • 色相間のΔE警告がない(同じステップの異なる色相間でOklab色差ΔE ≥ 0.05)
  • --cvd を使用した場合:デュータンシミュレート後のステップ色が、意味を持つUIに使用されるステップでまだ識別可能であること

ユーザーが既存のパレットを監査用に提供した場合、各ステップをOKLCHに変換し(--format json で再構築するか、手動で変換)、同じ4つのポイントを確認します。

4. パレットを構成する

  • ステップにロールを割り当てます(Radix規約):1-2 アプリ背景 · 3-5 コンポーネント背景(通常/ホバー/アクティブ) · 6-8 ボーダー/フォーカス · 9-10 ソリッド背景とホバー(ステップ9が最も純粋でクロマが高い) · 11-12 テキスト(低/高コントラスト)。
  • セマンティックにエイリアスを付けます: スケールが1つの意味を提供する場合、--red-500 ではなく --danger-500 とします。1つのスケールが複数のエイリアスをバックアップできます。
  • ダークモード=リマップ、再生成しない: スケールはそのままに、セマンティック割り当てを反転させます(最も明るいステップが最も暗いサーフェスに、テキスト色は両端が入れ替わります)。OKLCHでの知覚的な均一性により、逆マッピングでも同様に読みやすくなります。

5. 成果を納品する

--format css の出力をファイルに書き出します(@supports 内に16進数フォールバック付きのカスタムプロパティ)。さらに、検証レポートをチャットに出力します。デザインシステムが対象であれば、トークン命名(プリミティブスケール+セマンティックエイリアス層)を提案します。

よくある修正

症状修正方法
50/100ステップが薄く見える想定内 — 白色付近ではクロマが物理的に制限されます。「修正」するためにクランプしないでください
色相の鮮やかさが不均一に見えるすべての色相を同じ呼び出しで生成してください。--chroma 80 を試してください
500ステップが白色テキストのコントラストを満たさない大きなテキストやグラフィックであれば許容するか、中間明度を調整します(--hue-drift は役に立ちません。アンカーを移動してください)
暗い黄色がオリーブ色に見える意図的に --hue-drift 10-15 でオレンジに近づけるか、ブランドの好みとして受け入れます

関連スキル