HB DevTools

Technical Docs

Color Converter の設計

HEX・RGB・HSL などの色空間を相互変換する純粋関数の設計と、HSL変換アルゴリズムの数学的背景を解説します。

1. 設計思想 — なぜこのツールが必要か

CSSでは色を #3b82f6(HEX)・rgb(59, 130, 246)(RGB)・hsl(217, 91%, 60%)(HSL)など複数の形式で表現できます。 デザインツール(Figma, Adobe XD など)からコピーした値と、 コードベースや shadcn/ui が期待する形式が一致しないことは日常的に発生します。

HEXからRGBへの変換は暗算でもできますが、HEXからHSLへの変換は三角関数と条件分岐を含む複雑な計算です。 これを瞬時に行えるツールの需要は高く、特にデザインシステムを構築する際に重宝します。

2. 技術アーキテクチャ

convertColor(input: string): ColorConvertOutput が単一のエントリポイントです。 入力文字列を複数のパーサーで試行し、最初にマッチしたパーサーの結果から 全形式(HEX・RGB・RGBA・HSL)を一度に算出して返します。

  • パーサー群: parseHexparseRgbparseRgbaparseHslString の4関数が それぞれ正規表現で入力を検証し、RGBAコンポーネントに分解します。
  • 変換関数: rgbToHslhslToRgb が 色空間間の変換を担います。内部でのみ使用される純粋な数値変換関数です。
  • buildResult: RGBAコンポーネントを受け取り、ColorConvertResult(全形式の文字列を含む)を組み立てます。

3. ロジック解説

HEXパーサーは3桁・4桁・6桁・8桁の4パターンに対応します。 3桁の場合は各桁を2回繰り返して6桁相当として解釈します(例: #abc#aabbcc)。 8桁の場合は最後の2桁がアルファ値(0〜255)となります。

RGB→HSL変換では、まず各チャンネルを0〜1に正規化します。 輝度(lightness)は l = (max + min) / 2 で求め、 彩度(saturation)は l > 0.5 かどうかで計算式が変わります (明るい色と暗い色で異なる計算式を使うことで、視覚的に正確な彩度が得られます)。

HSL→RGB変換では、まず色の鮮やかさを表す補助値c = (1 - |2l - 1|) × s と、隣接する色成分への遷移量x = c × (1 - |(h / 60) mod 2 - 1|) を算出し、 色相の60°ごとの6セクターに応じてR/G/Bに値を割り当てます。

4. 品質管理

src/lib/tools/__tests__/color-converter.test.ts に Vitest による単体テストを実装しています。

  • パーサーテスト: 3桁・6桁HEX、RGB・RGBA・HSL各形式の正常パース、 および無効な値(r=256 など境界値オーバー)のエラー確認。
  • 変換精度テスト: 既知の色(赤 #ff0000、白 #ffffff、 黒 #000000)の変換結果が正確な値と一致するか検証。
  • 往復変換テスト: HEX→RGB→HSL→RGBと変換した結果が 元の値に復元されることを確認(丸め誤差の許容範囲内で)。