zudo-doc
GitHub リポジトリ

検索したい単語を入力

いつでも検索バーを開ける

デザインシステム

作成 2026年3月11日更新 2026年6月7日Takeshi Takatsudo

zudo-docのタイトトークン戦略 — スペーシング、タイポグラフィ、カラーなど。

zudo-docはタイトトークン戦略を採用しています。Tailwindフレームワーク全体をインポートするのではなく、preflightutilitiesのみを読み込み、デフォルトテーマ層を完全にスキップします。小さく意図的なデザイントークンのセットをゼロから定義します。このページでは、スペーシング、タイポグラフィ、カラー、角丸、ブレークポイントの全体像を解説します。

タイトトークン戦略

Tailwind CSSには数百の組み込み値(カラー、スペーシングスケール、フォントサイズなど)が用意されています。テーマ切り替え可能なプロジェクトでは、これらのデフォルト値が問題を引き起こします。ハードコードされた値はテーマ変更を無視し、一貫性を崩します。

zudo-docではsrc/styles/global.css内で選択的インポートを使い、preflight(リセット)とutilities(ユーティリティクラス)のみを読み込んでいます。デフォルトテーマ層は完全にスキップされます:

@import "tailwindcss/preflight";
@import "tailwindcss/utilities";

@theme {
  --color-*: initial;  /* Tailwindのデフォルトカラーをリセット */
  --color-bg: var(--zd-bg);
  --color-fg: var(--zd-fg);
  /* ... */
}

@themeブロックは--color-*: initialで始まり、Tailwindのデフォルトカラートークンをすべて消去してからプロジェクトトークンを定義します。@theme内で明示的に定義されたトークンのみが機能します。未定義のトークン(p-4bg-gray-500など)を使っても効果はありません。値自体が存在しないためです。これにより無効なトークンはビルドエラーやスタイル欠落として現れ、視覚的なバグにはなりません

Info

これが核となる設計思想です。プロジェクトに必要なものだけを定義する。システム内のすべての値は意図的であり、Tailwindデフォルトの誤使用はすぐに判明します。

スペーシング

zudo-docではスペーシングを**水平(hsp)垂直(vsp)**の2軸に分離しています。レイアウトにおいてそれぞれ異なる役割を果たすためです。水平スペーシングはインラインのリズムやガターを制御し、垂直スペーシングはコンテンツの流れやセクション間の余白を制御します。垂直スケールは大きいサイズほど広がり、コンテンツにより多くの余白を与えます。

水平スペーシング(hsp)

トークン使用例
hsp-2xs0.25rem (4px)px-hsp-2xs
hsp-xs0.375rem (6px)px-hsp-xs
hsp-sm0.5rem (8px)gap-x-hsp-sm
hsp-md0.75rem (12px)px-hsp-md
hsp-lg1rem (16px)px-hsp-lg
hsp-xl1.5rem (24px)px-hsp-xl
hsp-2xl2rem (32px)px-hsp-2xl

垂直スペーシング(vsp)

トークン使用例
vsp-2xs0.25rem (4px)py-vsp-2xs
vsp-xs0.5rem (8px)py-vsp-xs
vsp-sm0.75rem (12px)gap-y-vsp-sm
vsp-md1rem (16px)py-vsp-md
vsp-lg1.5rem (24px)py-vsp-lg
vsp-xl2rem (32px)py-vsp-xl
vsp-2xl3rem (48px)py-vsp-2xl

両軸とも00px)とpx1px)のユーティリティ値も含まれます。

<!-- 水平パディング + 垂直パディング -->
<div class="px-hsp-lg py-vsp-md">非対称なスペーシングのコンテンツ</div>

<!-- 2軸ギャップのグリッド -->
<div class="grid gap-x-hsp-md gap-y-vsp-lg">グリッドアイテム</div>

Tip

hsp-lg1remですがvsp-lg1.5remと、垂直軸は大きいサイズほど広がります。これは意図的な設計です。垂直方向の流れには水平方向のリズムより多くの余白が必要です。

タイポグラフィ

フォントサイズ

各セマンティックロールは抽象スケール(--text-scale-*)のステップを参照します。以下は解決後のサイズです。

トークン使用例
micro0.75rem / 12pxtext-micro
caption0.875rem / 14pxtext-caption
small1rem / 16pxtext-small
body1.2rem / 19.2pxtext-body
title1.4rem / 22.4pxtext-title
heading3rem / 48pxtext-heading
display3.75rem / 60pxtext-display

フォントウェイト

トークン使用例
normal400font-normal
medium500font-medium
semibold600font-semibold
bold700font-bold

行の高さ

トークン使用例
tight1.25leading-tight
snug1.375leading-snug
normal1.5leading-normal
relaxed1.625leading-relaxed

フォントファミリー

トークンスタック使用例
sansシステムサンセリフスタックfont-sans
monoシステムモノスペーススタックfont-mono
<h1 class="text-heading font-bold leading-tight">ページタイトル</h1>
<p class="text-body font-normal leading-normal">本文テキスト</p>
<code class="text-small font-mono">インラインコード</code>

角丸(Border Radius)

トークン使用例
DEFAULT0.25rem (4px)rounded
lg0.5rem (8px)rounded-lg
full9999pxrounded-full
<button class="rounded bg-accent text-bg">デフォルトの角丸</button>
<div class="rounded-lg bg-surface">大きめの角丸のカード</div>
<span class="rounded-full bg-muted">ピルバッジ</span>

ブレークポイント

トークン使用例
sm640pxsm:flex
lg1024pxlg:grid-cols-2
xl1280pxxl:max-w-5xl
<div class="px-hsp-sm sm:px-hsp-md lg:px-hsp-lg xl:px-hsp-xl">
  レスポンシブな水平パディング
</div>

カラー

カラーは3層戦略を採用しています。生のパレット値(Tier 1)がセマンティックトークン(Tier 2)に流れ込み、さらにコンポーネントスコープのトークン(Tier 3)に供給されます。各層は上の層のみを参照するため、カラースキームを切り替えるとサイト全体が一括で更新されます。

カラートークンシステム、カラースキーム、カスタマイズの詳細はカラーリファレンスを参照してください。

使用ルール

Tailwindデフォルトは無効

Tailwindのデフォルトテーマはインポートされていません。tailwindcss/preflighttailwindcss/utilitiesのみが読み込まれます。プロジェクトで定義されたトークンのみが機能します。

推奨

<!-- セマンティックカラートークン -->
<p class="text-fg">メインテキスト</p>
<div class="bg-surface border border-muted">パネル</div>
<a class="text-accent hover:text-accent-hover">リンク</a>

<!-- スペーシングトークン -->
<div class="px-hsp-lg py-vsp-md">適切なスペーシング</div>
<div class="gap-x-hsp-sm gap-y-vsp-md">グリッドギャップ</div>

<!-- タイポグラフィトークン -->
<h2 class="text-title font-semibold leading-tight">見出し</h2>

非推奨

<!-- NG: Tailwindデフォルト — 未定義で何も表示されない -->
<div class="p-4 bg-gray-500 text-sm">表示されない</div>

<!-- NG: ハードコードされたhex — テーマ切り替えで壊れる -->
<div class="bg-[#1e1e2e] text-[#f8f8f2]">テーマ切り替え時に壊れる</div>

すべてのトークンはsrc/styles/global.cssで定義されています。このファイルがデザインシステムの唯一の情報源です。

インタラクションのルール

リンク要素にホバー時の下線を使う

遷移する 要素(<a href>、またはリンクとして振る舞う要素)は、ホバー時とキーボードフォーカス時にアンダーラインを表示します。ボタン、トグル、コントロールは対象外で、ボーダー/背景の変化で代替します。

OK(ナビゲーション用のリンク):

<a class="text-accent hover:underline focus-visible:underline">リンク</a>
<a class="text-fg hover:text-accent hover:underline focus-visible:underline">サイドバー項目</a>

NG(focus-visible が欠けている):

<!-- NG: マウスだけ下線、キーボード操作では出ない -->
<a class="text-fg hover:underline">キーボードフォーカスで下線が出ない</a>

NG(コントロール):

<!-- NG: ボタンは下線ではなくボーダー/背景ホバーを使う -->
<button class="hover:underline">代わりに hover:bg-accent/10 などを使う</button>

hover:underline focus-visible:underline のペアが正規形です。必ず両方を書き、片方だけにはしないでください。実装例:packages/zudo-doc/src/header/header.tsxsrc/components/site-tree-nav.tsxpackages/zudo-doc/src/footer/footer.tsx

より深い背景(ライト/ダークのコントラスト、下線だけで足りるか色の変化も必要か)は、ローカルの /css-wisdom スキルを参照してください。light-mode/dark-mode と three-tier トークン戦略のセクションがトレードオフを扱っています。

Revision History

Takeshi Takatsudo作成: 2026-03-11T22:32:04+09:00更新: 2026-06-07T16:32:08+09:00

AI Assistant

Ask a question about the documentation.