zudo-doc

Type to search...

to open search from anywhere

EN/JA/DE

カラー

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

zudo-docの3層カラー戦略、パレットシステム、カラースキーム、カスタマイズ。

zudo-docは3層カラー戦略を採用し、サイト上のすべての色をテーマ切り替え可能にしています。Tailwindのデフォルトカラーはすべてinitialにリセットされ、プロジェクトトークンのみが機能します。これにより、カラースキームを切り替えるだけでサイト全体が一括で更新されます。

3層カラー戦略

カラーは3つの層で構成されています。各層は上位の層のみを参照します:

名前目的定義場所
1パレットカラースキームから取得した生のカラー値ColorSchemeProvider:root
2セマンティックデザイン上の意味 — 各色がUIで何を表すかsrc/styles/global.css @theme
3コンポーネント特定コンポーネント向けのスコープ付きオーバーライド.zd-contentglobal.css内)

この階層構造により:

  • パレットの差し替え(カラースキーム変更)→ サイト全体が更新
  • セマンティックトークンの再マッピング(例:accentをシアンから青に変更)→ accentを使用するすべてのコンポーネントが更新
  • コンポーネントトークンのオーバーライド → 他のコンポーネントに影響なし

Tier 1:16色パレット

zudo-docのカラーシステムは16色パレットを採用しています。各カラースキームは16のインデックスカラースロットに加え、背景、前景、選択色の値を提供します。

パレットスロット

スロット名前明るい版明るい版の名前典型的な用途
0Black8Bright Blackサーフェス、ミュートテキスト、ボーダー
1Red9Bright Red危険、エラー
2Green10Bright Green成功、ヒント
3Yellow11Bright Yellow警告
4Blue12Bright Blue情報、ノート
5Magenta13Bright Magentaコードハイライト
6Cyan14Bright Cyanアクセント、リンク
7White15Bright Whiteテキスト、明るい要素

📝 Note

実際の色は固定ではありません — Draculaの「Red」は#ff5555ですが、Nordの「Red」は#bf616aです。名前はあくまで慣例です。そのためzudo-docでは色名ではなく抽象的な番号付きトークン(p0p15)を使用しています。

パレットカラーの注入方法

ColorSchemeProviderコンポーネント(src/components/color-scheme-provider.astro)がアクティブなカラースキームを読み取り、ビルド時に:rootにCSSカスタムプロパティを注入します:

:root {
  --zd-bg: #282a36;
  --zd-fg: #f8f8f2;
  --zd-cursor: #f8f8f2;
  --zd-sel-bg: #44475a;
  --zd-sel-fg: #ffffff;
  --zd-0: #21222c;   /* パレットスロット 0(Black) */
  --zd-1: #ff5555;   /* パレットスロット 1(Red) */
  /* ... --zd-15 まで続く */
}

これらの--zd-*プロパティがすべての基準値です。セマンティックトークン、コンポーネントトークン、Tailwindユーティリティ — すべてがこれらに帰結します。

Tier 2:セマンティックトークン

src/styles/global.css@themeブロックが、パレットプロパティをデザイン上の意味を持つTailwind互換トークンにマッピングします:

@theme {
  --color-*: initial;  /* Tailwindデフォルトをすべてリセット */

  /* ベース */
  --color-bg: var(--zd-bg);
  --color-fg: var(--zd-fg);
  --color-sel-bg: var(--zd-sel-bg);
  --color-sel-fg: var(--zd-sel-fg);

  /* パレット直接アクセス(p0–p15) */
  --color-p0: var(--zd-0);
  --color-p1: var(--zd-1);
  /* ... --color-p15 まで続く */

  /* セマンティックエイリアス */
  --color-surface: var(--zd-surface);
  --color-muted: var(--zd-muted);
  --color-accent: var(--zd-accent);
  --color-accent-hover: var(--zd-accent-hover);
  --color-code-bg: var(--zd-code-bg);
  --color-code-fg: var(--zd-code-fg);
  --color-success: var(--zd-success);
  --color-danger: var(--zd-danger);
  --color-warning: var(--zd-warning);
  --color-info: var(--zd-info);
}

@themeに登録されると、標準のTailwindユーティリティクラスとして使用できます:bg-surfacetext-accentborder-mutedなど。

セマンティックトークンリファレンス

トークンデフォルトパレットスロット用途
bg--zd-bgページ背景
fg--zd-fgメインテキスト
surfacep0(Black)パネル/サイドバーのサーフェス
mutedp8(Bright Black)ミュートテキスト、ボーダー、コメント
accentp6(Cyan)リンク、アクティブ状態、CTA
accent-hoverp14(Bright Cyan)accentのホバー状態
sel-bg--zd-sel-bg選択時の背景
sel-fg--zd-sel-fg選択時の前景
code-bgp0(Black)コードブロック背景
code-fgp13(Bright Magenta)インラインコードテキスト
successp2(Green)成功状態、確認
dangerp1(Red)エラー、破壊的操作
warningp3(Yellow)警告メッセージ
infop4(Blue)情報ハイライト

スキームごとのセマンティックオーバーライド

各カラースキームはsrc/config/color-schemes.tssemanticプロパティを通じて、デフォルトのパレットスロットマッピングをオーバーライドできます。例えば、Draculaはmutedをカスタムグレーにオーバーライドし、Solarized Lightはaccentをマゼンタに再マッピングしています:

"Solarized Light": {
  // ...palette, background, foreground...
  semantic: {
    accent: "#d33682",     // デフォルトのシアンではなくマゼンタ
    accentHover: "#6c71c4",
    surface: "#f4efdd",
  },
},

解決ロジックはsrc/config/color-scheme-utils.tsにあり、各セマンティックプロパティは明示的にオーバーライドされていない場合、デフォルトのパレットスロットにフォールバックします。

Tier 3:コンポーネントトークン

一部のコンポーネントは、Tier 2のセマンティックトークンを参照する独自のカラー変数を定義しています。これらは内部的な実装の詳細です。

コンテンツタイポグラフィ

.zd-contentクラスはセマンティックトークンを使用した直接的な要素スタイリングを提供します(外部タイポグラフィプラグイン不要):

.zd-content {
  color: var(--color-fg);
  font-size: var(--text-body);
  line-height: var(--leading-relaxed);
}

.zd-content :where(a) {
  color: var(--color-accent);
}

.zd-content :where(code:not(pre code)) {
  color: var(--color-code-fg);
  background-color: var(--color-code-bg);
}

.zd-content :where(li::marker) {
  color: var(--color-muted);
}
/* ... */

ℹ️ Info

Tier 3のトークンはコンポーネント内部のものです。独自のUIを構築する際は、Tier 2のセマンティックトークンまたはTier 1のパレットトークンを直接使用してください。

カラートークンの使い方

セマンティックトークンを優先

標準的なUIパターンにはセマンティックトークンを使用します:

<!-- テキスト -->
<p class="text-fg">メインテキスト</p>
<p class="text-muted">補助テキスト</p>
<a class="text-accent hover:text-accent-hover">リンク</a>

<!-- 背景 -->
<div class="bg-bg">ページ背景</div>
<div class="bg-surface">パネルやサイドバー</div>

<!-- ボーダー -->
<div class="border border-muted">ボーダー付き要素</div>

必要に応じてパレットトークンにフォールバック

適切なセマンティックトークンがない場合はp0p15を使用します — バッジ、装飾要素、ステータスインジケーターなどに:

<span class="text-p1">エラーテキスト(赤)</span>
<span class="text-p2">成功テキスト(緑)</span>
<span class="text-p3">警告テキスト(黄)</span>
<span class="text-p4">情報テキスト(青)</span>

カラースキーム

アクティブなカラースキームを変更するには、src/config/settings.tsを編集します:

export const settings = {
  colorScheme: "Dracula",  // ここを変更
  siteName: "zudo-doc",
  // ...
};

デフォルトテーマ

zudo-docにはライトテーマとダークテーマのデフォルトが含まれています。利用可能なスキームはsrc/config/color-schemes.tsを参照してください。

カスタムカラースキームの追加

src/config/color-schemes.tscolorSchemesオブジェクトに新しいエントリを追加します:

"My Theme": {
  background: "#1a1a2e",
  foreground: "#e0e0e0",
  cursor: "#e0e0e0",
  selectionBg: "#3a3a5e",
  selectionFg: "#e0e0e0",
  palette: [
    "#16213e", "#e74c3c", "#2ecc71", "#f39c12",  // 0-3: Black, Red, Green, Yellow
    "#3498db", "#9b59b6", "#1abc9c", "#ecf0f1",  // 4-7: Blue, Magenta, Cyan, White
    "#2c3e50", "#e67e73", "#55d98d", "#f5b041",  // 8-11: Bright Black–Yellow
    "#5dade2", "#bb8fce", "#48c9b0", "#fdfefe",  // 12-15: Bright Blue–White
  ],
  shikiTheme: "one-dark-pro",
  // オプション:セマンティックのデフォルトをオーバーライド
  semantic: {
    muted: "#7f8c8d",
    surface: "#1f1f3a",
  },
},

ColorSchemeインターフェースに必要なプロパティ:

  • backgroundforegroundcursorselectionBgselectionFg — ベースカラー
  • palette — 16要素のタプル(カラースロット 0〜15)
  • shikiTheme — シンタックスハイライト用のShikiテーマ名
  • semantic(オプション)— セマンティックトークンのデフォルトパレットスロットマッピングをオーバーライド

やってはいけないこと

🚨 カラーのアンチパターン

Tailwindデフォルトを使わないinitialにリセットされています:

<!-- NG -->
<div class="bg-gray-800 text-blue-500">色が表示されない</div>

<!-- OK -->
<div class="bg-surface text-accent">正しく動作する</div>

16進数値をハードコードしない — テーマ切り替えが壊れます:

<!-- NG -->
<div class="bg-[#1e1e2e]">テーマ切り替えで壊れる</div>

<!-- OK -->
<div class="bg-p0">どのテーマにも適応する</div>

Tier 3の変数を自分のコンポーネントで参照しない

/* NG */
.my-component {
  color: var(--tw-prose-links);
}

/* OK */
.my-component {
  color: var(--color-accent);
}