Tailwind CSS風カラースケールを自動生成するツールを作った話
はじめに
Webアプリケーションを開発していると、必ず直面するのが「配色」の問題だ。
特にTailwind CSSを使っていると、blue-500とかgray-100みたいな段階的なカラースケールの便利さに慣れてしまう。でも、いざ自分のブランドカラーで同じことをやろうとすると、これが意外と大変なんですよね。
「この#3B82F6を500として、50から950まで綺麗なグラデーションを作りたい」
そう思って手作業で色を調整したことがある人、結構いるんじゃないでしょうか。
今回は、その面倒な作業を自動化するツールを作った経緯と、どういう設計思想で作ったのかをまとめてみます。
なぜこのツールを作ったのか
Tailwind CSSのカラーシステムの良さ
Tailwind CSSのカラースケールには、いくつかの優れた特徴がある。
- 50から950までの11段階で、細かいニュアンスを表現できる
- 500が「基準色」として位置づけられている
- 明暗のバランスが取れていて、どの段階を使っても破綻しにくい
このシステムのおかげで、「ホバー時は一段暗く」「背景は薄めに」といった調整が直感的にできる。
既存ツールの課題
カラーパレット生成ツールは世の中にたくさん存在する。だけど、Tailwind CSSの構造に特化したものは意外と少なかった。
あっても、類似色(色相を回転させた色)まで同時に生成してくれるものは見つからなかったんですよね。デザインシステムを作るとき、メインカラーだけじゃなくてアクセントカラーも一緒に決めたい。そのニーズを満たすツールが欲しかったのだ。
ツールの設計思想
入力は最小限に
操作はシンプルにしたかった。カラーピッカーで色を選ぶか、HEXコードを入力する。それだけ。
余計な設定項目は設けない。「使い方を調べる」というステップを踏ませたくなかったから。

出力は実用的に
生成されたカラースケールは、すぐにプロジェクトで使える形式で出力される。
HEX形式とHSL形式の両方に対応した。特にHSL形式は、shadcn/uiのCSS変数形式に合わせてある。これで、コピペするだけでテーマに組み込める。
/* HEX形式 */
:root {
--color-50: #eff6ff;
--color-100: #dbeafe;
--color-500: #3b82f6;
--color-900: #1e3a8a;
}
/* HSL形式(shadcn/ui対応) */
@layer base {
:root {
--50: 214 100% 97%;
--100: 214 95% 93%;
--500: 217 91% 60%;
--900: 224 76% 33%;
}
}
類似色も同時生成
メインカラーを選ぶと、色相を±30°、±60°ずらした類似色のスケールも自動生成される。
これがあると、セカンダリカラーやアクセントカラーの選定がスムーズになる。色相環上で近い位置にある色は、自然と調和するからだ。
| 色相 | 用途例 |
|---|---|
| -60° | 補助的なアクセント |
| -30° | セカンダリカラー候補 |
| 0° | メインカラー |
| +30° | セカンダリカラー候補 |
| +60° | 補助的なアクセント |
技術的なアプローチ
カラースケール生成のアルゴリズム
スケールの生成には、シンプルな線形補間を採用した。
明るくする場合は、RGB各成分を255(白)に向かって補間する。暗くする場合は、0(黒)に向かって補間する。
// 明るくする(例:400→300)
const lightenFactor = 0.18; // 18%白に近づける
newR = r + (255 - r) * lightenFactor;
// 暗くする(例:600→700)
const darkenFactor = 0.18; // 18%黒に近づける
newR = r * (1 - darkenFactor);
この方法のメリットは、どんな入力色でも破綻しにくいこと。彩度が高い色でも低い色でも、それなりに自然なグラデーションになる。
なぜHSLで色相回転するのか
類似色の生成にはHSL色空間を使っている。
HSL(Hue, Saturation, Lightness)は、色相・彩度・明度で色を表現する方式だ。色相だけを変えて、彩度と明度を維持すれば、調和のとれた色が得られる。
function rotateHue(hex: string, degrees: number): string {
const { h, s, l } = hexToHsl(hex);
const newHue = (h + degrees + 360) % 360;
return hslToHex(newHue, s, l);
}
RGB色空間で同じことをしようとすると、かなり複雑な計算が必要になる。HSLを使うことで、コードもシンプルになった。
使い方のヒント
デザインシステムへの組み込み
このツールで生成したスケールは、Tailwind CSSの設定ファイルにそのまま追加できる。
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
brand: {
50: '#eff6ff',
100: '#dbeafe',
200: '#bfdbfe',
// ...以下略
}
}
}
}
}
これでbg-brand-100やtext-brand-700といったクラスが使えるようになる。
アクセシビリティへの配慮
各色にはコントラストチェッカーへのリンクがついている。背景色と文字色の組み合わせが、WCAG基準を満たしているか確認できる。
見た目の美しさだけでなく、読みやすさも大事。この連携機能は、そういう意味で重要だと思っている。
今後の展望
現状はベースカラー1色からの生成だけど、将来的には複数色の関係性を考慮した生成機能も検討している。
例えば、「メインカラーとセカンダリカラーを両方指定して、バランスの取れたパレットを提案する」みたいな機能。これがあると、より実践的なデザインワークフローに対応できそうだ。
おわりに
配色は、デザインの基盤となる要素だ。でも、技術的なツールでサポートできる部分も多い。
今回作ったツールが、少しでも誰かの開発を楽にできれば嬉しい。使ってみてフィードバックがあれば、ぜひ教えてほしい。
ツールはこちら → Color Scale Generator
Discussion