ひとことで言うと#
色、フォントサイズ、余白、角丸などのデザインの基本値を「トークン」という名前つき変数として一元管理する仕組み。デザインツールとコードの両方で同じトークンを参照することで、デザインと実装のズレをなくし、変更にも強くなる。
押さえておきたい用語#
- グローバルトークン(Primitive)
- 生の値を定義する最下層のトークン。
blue-500: #3B82F6のように色名+段階で命名する。 - セマンティックトークン(Semantic)
- 意味や用途で命名されたトークン。
color-primary: blue-500のようにグローバルトークンを参照する。 - コンポーネントトークン
- 特定UIコンポーネント専用のトークン。
button-background: color-primaryのようにセマンティックトークンを参照する。 - Single Source of Truth(SSOT)
- トークンの定義元を1つに絞ること。JSONで管理し、Figma・CSS・iOS・Androidに変換するのが理想。
- Style Dictionary
- Amazonが開発したトークン変換ツール。1つのJSON定義から複数プラットフォーム向けの出力を自動生成する。
デザイントークンの全体像#
こんな悩みに効く#
- デザインで指定した色と実装の色が微妙にずれている
- ブランドカラーを変更するたびに、全画面を手作業で直している
- Web・iOS・Androidでデザインがバラバラになる
基本の使い方#
デザインの中で繰り返し使われる基本値を洗い出す。
- 色: プライマリ、セカンダリ、背景、テキスト、エラーなど
- タイポグラフィ: フォントファミリー、サイズ、行間、太さ
- スペーシング: 余白(4px, 8px, 16px…)
- その他: 角丸、シャドウ、ボーダー、アニメーション
ポイント: まず使用頻度が高いものからトークン化する。いきなり全部やろうとしない。
トークンを3層構造で整理するのが一般的。
- グローバルトークン(Primitive): 生の値。
blue-500: #3B82F6のように色名+段階で定義 - セマンティックトークン(Semantic): 意味で定義。
color-primary: blue-500、color-error: red-500 - コンポーネントトークン: 特定UIの値。
button-background: color-primary
ポイント: コードで直接使うのはセマンティックトークン以上。グローバルトークンは直接参照しない。
デザインツールと開発環境の両方でトークンを参照できるようにする。
- Figmaのローカル変数やスタイルとしてトークンを登録
- コードではCSS変数、Sass変数、JSON形式で管理
- Style DictionaryやTokens Studioなどのツールで変換・同期する
ポイント: トークンのソースは1つ(Single Source of Truth)にする。JSONで管理し、そこからFigma・CSS・iOS・Androidに変換するのが理想。
トークンの追加・変更・廃止のプロセスを定める。
- 新しいトークンを追加する際のレビュープロセス
- 既存トークンを変更する際の影響範囲の確認方法
- 非推奨トークンの移行期間とマイグレーションガイド
- バージョニングの方針
ポイント: トークンの数が無制限に増えないよう、追加には承認プロセスを設ける。
具体例#
課題: 100画面以上のWebアプリにダークモードを追加したいが、色がハードコードされていて影響範囲が膨大。
トークン設計:
/* グローバルトークン */
--gray-100: #F3F4F6;
--gray-900: #111827;
/* セマンティックトークン(ライトモード) */
--color-bg-primary: var(--gray-100);
--color-text-primary: var(--gray-900);
/* セマンティックトークン(ダークモード) */
[data-theme="dark"] {
--color-bg-primary: var(--gray-900);
--color-text-primary: var(--gray-100);
}結果: セマンティックトークンの値を切り替えるだけで、100画面すべてが自動的にダークモードに対応。個別の画面修正はゼロ。以降のカラー変更も、トークンの値を1箇所変えるだけで全画面に反映されるようになった。
課題: Web・iOS・Androidでボタンの角丸やフォントサイズが微妙にずれている。デザイナー1名がFigmaで修正しても、エンジニア3名がそれぞれ手動で実装するため、ズレが繰り返し発生。
対応: JSON形式でトークンを定義し、Style Dictionaryで各プラットフォーム向けに自動変換する体制を構築。
{
"border-radius-button": { "value": "8px" },
"font-size-body": { "value": "16px" }
}→ CSS変数、Swift定数、Kotlin定数に自動変換
結果: デザイン修正の反映時間が平均3日から0.5日に短縮。プラットフォーム間の差異報告が月12件からゼロになった。
課題: ブランドカラーを青系から緑系に変更。対象はWebアプリ、マーケティングサイト、社内ツールの計3プロダクト・200画面以上。従来なら3ヶ月かかる見積もり。
対応: 事前にセマンティックトークンで全プロダクトを統一管理していたため、グローバルトークンの色定義を差し替えるだけで対応。
--brand-primary: #2563EB(青)→--brand-primary: #16A34A(緑)- 関連するホバー色・アクティブ色もグローバルトークン側で一括更新
結果: 200画面以上のカラー変更が1日で完了。手作業の修正箇所はゼロ。「3ヶ月の見積もりが1日」という事実が、トークン管理への社内投資の説得材料になった。
やりがちな失敗パターン#
- トークンの粒度が細かすぎる — ボタンの状態ごと、画面ごとにトークンを作ると管理不能になる。セマンティックレベルで共通化できるものは共通化する
- 名前の付け方に一貫性がない —
primary-btn-bg、buttonBackgroundPrimary、btn_primary_colorが混在すると混乱する。命名規則を最初に決めて厳守する - デザインツールとコードが別管理になる — Figmaのスタイルとコードの変数が同期されていないと、結局ズレが生じる。自動同期の仕組みを構築する
- 最初から完璧なトークン体系を目指す — 全プロパティをトークン化してから始めようとすると、いつまでも導入できない。色とタイポグラフィから始めて段階的に拡張するのが現実的
まとめ#
デザイントークンは、デザインの基本値を名前つき変数として一元管理する仕組み。グローバル→セマンティック→コンポーネントの3層構造で設計し、デザインツールとコードの両方から同じトークンを参照する。テーマ切り替えやブランド変更にも強く、デザインシステムの基盤となる重要な仕組み。