ヘッダーの右側 — 検索、外観メニュー、言語スイッチャー、バージョンスイッチャー、GitHub リンク、Design Token / AI Chat トリガー — は `headerRightItems` という 1 つの配列フィールドからレンダリングされます。各エントリは discriminated union で、配列の順番どおりに描画されます。

[Dynamic content unavailable in text export]

左側のタブは [ヘッダーナビゲーション](https://zudo-doc.takazudomodular.com/ja/docs/guides/header-navigation) で設定します。どちらも `zfb.config.ts` に定義しますが、互いに独立しています。



## デフォルト設定

```ts title="zfb.config.ts"
export default defineConfig(
  zudoDoc({
    // ...
    githubUrl: "https://github.com/zudolab/zudo-doc",
    headerRightItems: [
      { type: "trigger", trigger: "design-token-panel" },
      { type: "trigger", trigger: "ai-chat" },
      { type: "component", component: "version-switcher" },
      { type: "component", component: "github-link" },
      { type: "component", component: "theme-toggle" },
      { type: "component", component: "search" },
      { type: "component", component: "language-switcher" },
    ],
  }),
);
```

## アイテム種別

### `component`

組み込みの UI 要素を参照します。多くは対応する機能フラグが無効だと自動的にスキップされますが、`search` にはフラグによる制御がありません。

| コンポーネント | 機能フラグ |
|---|---|
| `theme-toggle` | `colorMode` |
| `language-switcher` | `locales`(少なくとも 1 つの非デフォルトロケールが必要) |
| `version-switcher` | `versions` |
| `github-link` | `githubUrl` |
| `search` | なし — 常に利用可能 |

```ts
{ type: "component", component: "github-link" }
```

機能を無効化すればエントリは黙って除外されるので、配列に残したままでも問題ありません。`search` には専用の機能フラグがありません — レンダラーは常に利用可能で、表示するかどうか・どの位置に表示するかは配列内の記述だけで決まります。

### `trigger`

組み込みのモーダルやパネルを開きます。

| トリガー | 機能フラグ |
|---|---|
| `design-token-panel` | `designTokenPanel` |
| `ai-chat` | `aiAssistant` |

```ts
{ type: "trigger", trigger: "ai-chat" }
```

`design-token-panel` トリガーボタンは `window` に `toggle-design-token-panel` カスタムイベントをディスパッチします。zdtpパネル（`@takazudo/zdtp`）はこのイベントをネイティブに受け取るため、追加の配線は不要です。

### `link`

任意の外部/内部リンクをアイコン付きで描画します。

```ts
{
  type: "link",
  href: "https://discord.example",
  ariaLabel: "Discord",
  icon: "github", // only "github" is bundled today
}
```

外部 URL は自動的に新しいタブで開きます。

### `html`

任意のマークアップを差し込むためのエスケープハッチです。

```ts
{ type: "html", html: '<span class="text-caption">beta</span>' }
```

文字列がそのまま出力されるため、使いどころは限定してください。

## カスタマイズ例

### GitHub アイコンをあなたのリポジトリへ向ける

`zfb.config.ts`の`zudoDoc({...})`でトップレベルの `githubUrl` を書き換えるだけで済みます。`github-link` コンポーネントはこの値を読むので、配列側に URL を書き足す必要はありません。

```ts title="zfb.config.ts"
export default defineConfig(
  zudoDoc({
    githubUrl: "https://github.com/your-org/your-repo",
  }),
);
```

`githubUrl: false` を指定すると、配列を編集せずにアイコンだけ消せます。

### アイテムを外す

機能フラグでの非表示ではなく、配列から該当エントリを削除してください。たとえば AI chat トリガーを隠すなら:

```ts
headerRightItems: [
  { type: "trigger", trigger: "design-token-panel" },
  // { type: "trigger", trigger: "ai-chat" },  // removed
  { type: "component", component: "version-switcher" },
  { type: "component", component: "github-link" },
  { type: "component", component: "theme-toggle" },
  { type: "component", component: "language-switcher" },
],
```

### カスタムリンクを追加する

```ts
headerRightItems: [
  // ...existing items
  {
    type: "link",
    href: "https://discord.gg/your-server",
    ariaLabel: "Discord",
    icon: "github", // until more icons are bundled
  },
],
```

### カスタムレンダラーを追加する

プロジェクト固有のコンポーネント名は `chromeBindings.headerRightComponents` で解決します。型付きの設定手順全体は [Host Chrome Bindings](https://zudo-doc.takazudomodular.com/ja/docs/reference/host-chrome-bindings) を参照してください。クライアント island に対応する静的な登録経路も用意していない限り、レンダラーは SSR 表示用として扱います。

登録済み island の props が現在のページではなくブラウザーセッションに属する場合は、遷移前から存在する island 自体か、persist されたヘッダー内の祖先要素に `data-zd-props-preserve` を付けます。オプトアウトは遷移前から存在する DOM を基準に判定され、対象 island のシリアライズ済み props は置き換えられず、remount 対象にもなりません。persist されたヘッダー自体に属性を付けると配下の全 island がオプトアウトされるため、遷移先ページの props を受け取るべき island には付けないでください。

## 外観メニューのカスタマイズ

組み込みの`theme-toggle`は標準ヘッダーの外観メニューです。同じメニューを別の場所へ置く場合は、公開`@takazudo/zudo-doc/theme-toggle`サブパスから`ThemeToggle`をインポートし、固定ターゲットのサーバー境界で合成します。

```tsx
import { ThemeToggle } from "@takazudo/zudo-doc/theme-toggle";
```

エクスポートされる `ThemeToggle` は、コンパクトな `<button>` と Light / Dark / System のメニューを描画します。太陽、月、モニターのアイコンは選択中の設定を表します。System が選択されている場合、デバイス設定でページの実効ライト/ダーク表示が変わっても、モニターアイコンのままです。`defaultMode` は引き続きライト/ダークのフォールバックで、`respectPrefersColorScheme` は初回訪問時に System を選ぶかどうかを制御します。メニューとアクセシビリティ用の文字列は `labels` プロップでローカライズできます。好きな場所に配置してその周りに UI を組み合わせることはできますが、ボタンのマークアップとアイコンは固定です — インポートはパッケージの外観メニューを再利用する(そして後述の衝突を避ける)ためのものであって、見た目を変更するためのものではありません。異なるメニューのマークアップやアイコンが必要な場合は、自前のコンポーネントを作り、パッケージの island マーカーを主張しないように `ThemeToggle` **以外の**名前を付けてください。

### なぜパッケージの island をインポートするのか

各クライアントエントリーには一意のアイランドidentityが必要です。別のソースファイルが`ThemeToggle`を名乗る状態は、無害な警告やスキャン順による上書きではなくエラーです。パッケージのエントリーを再利用します。別のメニューを作る場合は、クライアントエントリーに異なるエクスポート名を付け、その1つのターゲットをサーバー境界へ静的にインポートします。`displayName`の設定や重複するローカルshimでパッケージのアイランドを置き換えないでください。

このリポジトリは`node scripts/check-client-export-names.mjs`でエントリーグラフを検証し、ビルド前にidentityの重複を拒否します。virtual bindings内のレンダラーだけでは、クライアントエントリーへのスキャナー到達性を保証できません。[Custom Components](https://zudo-doc.takazudomodular.com/ja/docs/guides/custom-components#%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%82%A4%E3%83%A9%E3%83%B3%E3%83%89%EF%BC%88%E5%AE%9F%E9%A8%93%E7%9A%84%EF%BC%89)の具体的な静的ルートインポートに従ってください。

[Dynamic content unavailable in text export]

外観コントロールは公開 `@takazudo/zudo-doc/theme-toggle` サブパスからインポートします。zudo-react のクライアントコンポーネントなので、静的にインポートしたサーバー境界から `Island` でマウントします。



[Dynamic content unavailable in text export]

パッケージの `applyColorScheme`(`theme-toggle/color-scheme-sync.ts` 内)は、実効カラースキームの変更時に Design Token Panel の状態を意図的に **クリアしません** — ストレージのライフサイクルは `@takazudo/zdtp` が管理します。デバイス設定が現在の外観と一致しているときに System を選んでも、保存される設定だけが変わり、パネルは再構築されません。その後デバイス設定が変わると、アクティブなモードが更新されます。Palette・Spacing・Font・Size の編集は外観の変更をまたいでそのまま保持され、Color タブの ref/literal のデフォルトはアクティブなモードに合わせて設定されます。保存された Color のオーバーライドはスキームとモードごとに管理されます。ライトで編集したマッピングがダークのデフォルトや保存済みマッピングを上書きすることはなく、各モードに戻るとそのモードで保存した設定が復元されます。パッケージ標準のビルダーは、`panelSettings.colorMode` に `Default Light` と `Default Dark` をそれぞれ別の識別名として指定しています。詳しいセマンティクスは[モードスコープの編集モデル](https://zudo-doc.takazudomodular.com/ja/docs/reference/design-token-panel#%E3%82%BF%E3%83%96%E6%A7%8B%E6%88%90-color-%E3%83%A2%E3%83%BC%E3%83%89%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%AE%E7%B7%A8%E9%9B%86%E3%83%A2%E3%83%87%E3%83%AB)を参照してください。



## 並び順

配列に書いた順にレンダリングされます。クラスタは右寄せなので、最初のエントリがナビ寄り、末尾のエントリがビューポート端寄りに配置されます。