zudo-doc
GitHub リポジトリ

検索したい単語を入力

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

デザインシステム

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

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

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

タイトトークン戦略

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

scaffold の src/styles/global.css は、Tailwind の preflight(リセット)と utilities(ユーティリティクラス)のみをインポートした後、パッケージのトークンスタイルシートをインポートします。デフォルトの Tailwind テーマ層は意図的にスキップされます:

@layer zd-preflight, zd-flow;
@import "tailwindcss/preflight" layer(zd-preflight);
@import "tailwindcss/utilities";
@import "@takazudo/zudo-doc/theme.css";
@import "@takazudo/zudo-doc/safelist.css";
@import "@takazudo/zudo-doc/content.css";
@import "@takazudo/zudo-doc/page-loading.css";
@import "@takazudo/zudo-doc/features.css";

/* Override package defaults here when the project needs to. */
@theme {
  /* e.g. --color-accent: oklch(0.6 0.2 250); */
}

@takazudo/zudo-doc/theme.css がデフォルトの @theme トークンを提供します。パッケージのソースである packages/zudo-doc/src/theme.css が唯一の情報源であり、scaffold の後続の空の @theme ブロックは上書きポイントです。出荷されるブロックは --color-*: initial で始まり、プロジェクトのカラートークンを再追加する前に Tailwind のデフォルトパレットを消去します。

Info

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

利用できるTailwindの語彙

タイトトークン戦略は Tailwind のユーティリティ構文を取り除くものではありません。トークンを持つユーティリティを絞り込みます。MDX やコンポーネントでは以下のプロジェクト語彙を使ってください。

機能するもの機能しないもの(スタイルなし)
プロジェクトトークン: text-captionbg-accentpx-hsp-*py-vsp-*w-icon-*z-modal などの z-index tier数値スペーシング: p-4mt-8w-64
tracking-tighttracking-normaltracking-widetracking-widertracking-tightertracking-widest
roundedrounded-lgrounded-fullデフォルトの文字サイズ: text-smtext-lg
静的ユーティリティ: flexgrid-cols-3hidden、...デフォルトパレット: bg-blue-500(設計上リセットされる)
任意値: m-[13.37px]w-[42%] — 完全なエスケープハッチshadow-md(存在するのは shadow-lg のみ)

scaffold は @source のカバレッジと Tailwind の自動検出によって、MDX コンテンツ、src/components/src/chrome-bindings.tsxpages/ を走査します。走査対象外の場所で使ったクラスはスタイルなしのマークアップとして出力されるため、新しいソース位置を導入するときは @source ディレクティブを追加してください。

Tailwind のデフォルト語彙を再有効化するには、tailwindcss/theme をインポートするか、プロジェクトの @theme 上書きブロックに必要なトークンを定義します。値がプロジェクトのデザイン言語の一部なら、ローカルのセマンティックトークンを優先してください。

この語彙を MDX コンポーネントで使う例は、カスタムコンポーネントを参照してください。

スペーシング

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

水平スペーシング(hsp)

トークン使用例
hsp-2xs0.125rem (2px)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-3xs0.25rem (4px)py-vsp-3xs
vsp-2xs0.4375rem (7px)py-vsp-2xs
vsp-xs0.875rem (14px)py-vsp-xs
vsp-sm1.25rem (20px)gap-y-vsp-sm
vsp-md1.5rem (24px)py-vsp-md
vsp-lg1.75rem (28px)py-vsp-lg
vsp-xl2.5rem (40px)py-vsp-xl
vsp-2xl3.5rem (56px)py-vsp-2xl

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

<!-- Horizontal padding + vertical padding -->
<div class="px-hsp-lg py-vsp-md">Content with asymmetric spacing</div>

<!-- Grid with dual-axis gaps -->
<div class="grid gap-x-hsp-md gap-y-vsp-lg">Grid items</div>

Tip

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

要素サイズ

アイコンサイズ

トークン使用例
icon-xs0.75rem (12px)w-icon-xs h-icon-xs
icon-sm1rem (16px)w-icon-sm h-icon-sm
icon-md1.25rem (20px)w-icon-md h-icon-md
icon-lg1.5rem (24px)w-icon-lg h-icon-lg

エレベーション

定義されているシャドウトークンは1つだけです。

トークン使用例
lg0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)shadow-lg

タイポグラフィ

フォントサイズ

各セマンティックロールは抽象スケール(--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

字間(Letter Spacing)

4段階のスケールです。大きな見出しには tracking-tight を使うと視覚的に引き締まり、tracking-normal はブラウザのデフォルトにリセットします。tracking-wide / tracking-wider はラベルやスモールキャップスのテキストに適しています。

トークン使用例
tight-0.025emtracking-tight
normalnormaltracking-normal
wide0.05emtracking-wide
wider0.1emtracking-wider

フォントファミリー

トークンスタック使用例
sansシステムサンセリフスタックfont-sans
monoシステムモノスペーススタックfont-mono
<h1 class="text-heading font-bold leading-tight">Page Title</h1>
<p class="text-body font-normal leading-normal">Body text</p>
<code class="text-small font-mono">inline code</code>

角丸(Border Radius)

トークン使用例
DEFAULT0.25rem (4px)rounded
lg0.5rem (8px)rounded-lg
full9999pxrounded-full
<button class="rounded bg-accent text-bg">Default radius</button>
<div class="rounded-lg bg-surface">Card with larger radius</div>
<span class="rounded-full bg-muted">Pill badge</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">
  Responsive horizontal padding
</div>

Z-index Tier

任意のスタック値ではなく、意味を持つ z-index tier を使ってください。

トークン使用例
content0z-content
local-11z-local-1
local-22z-local-2
local-33z-local-3
sidebar10z-sidebar
toolbar20z-toolbar
dropdown30z-dropdown
popover40z-popover
modal-backdrop50z-modal-backdrop
modal60z-modal
toast70z-toast
tooltip80z-tooltip
drag90z-drag

カラー

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

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

使用ルール

Tailwindのデフォルトテーマは無効

Tailwindのデフォルトテーマはインポートされていません。プロジェクトトークンは @takazudo/zudo-doc/theme.css から来て、その後にプロジェクトの @theme 上書きブロックが適用されます。定義されていないトークンはスタイルなしのマークアップになります。

推奨

<!-- Semantic color tokens -->
<p class="text-fg">Primary text</p>
<div class="bg-surface border border-muted">Panel</div>
<a class="text-accent hover:text-accent-hover">Link</a>

<!-- Spacing tokens -->
<div class="px-hsp-lg py-vsp-md">Proper spacing</div>
<div class="gap-x-hsp-sm gap-y-vsp-md">Grid gaps</div>

<!-- Typography tokens -->
<h2 class="text-title font-semibold leading-tight">Heading</h2>

非推奨

<!-- DON'T: Tailwind defaults — not defined and produce nothing -->
<div class="p-4 bg-gray-500 text-sm">Broken</div>

<!-- DON'T: Hardcoded hex — breaks theming -->
<div class="bg-[#1e1e2e] text-[#f8f8f2]">Breaks on theme switch</div>

デフォルトトークンは @takazudo/zudo-doc/theme.css から提供され、packages/zudo-doc/src/theme.css が唯一の情報源です。scaffold の src/styles/global.css はそれらのデフォルトをインポートし、プロジェクトの上書きポイントを提供します。

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

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

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

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

<a class="text-accent hover:underline focus-visible:underline">Link</a>
<a class="text-fg hover:text-accent hover:underline focus-visible:underline">Sidebar item</a>

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

<!-- DON'T: mouse users get an underline, keyboard users don't -->
<a class="text-fg hover:underline">Inaccessible to keyboard focus</a>

NG(コントロール):

<!-- DON'T: buttons use border/bg hover, not underline -->
<button class="hover:underline">Use hover:bg-accent/10 instead</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-14T08:13:16+09:00更新: 2026-07-14T00:11:12+09:00

AI Assistant

Ask a question about the documentation.

Preview theme

Loading theme previews…