Zudo Token Panel
GitHub リポジトリ

検索したい単語を入力

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

クイックスタート

パネルを設定し、最小限のタブマニフェストを宣言して、開発者ツールのコンソールから切り替えます。

このページでは @takazudo/zdtp を動かすための最小構成を示します。configurePanel({...}) を呼び出し、1 タブのマニフェストを宣言し、ブラウザーコンソールからパネルを開くところまでを扱います。PanelConfig の全フィールドは configurePanel リファレンスで詳しく説明しています。

組み込む内容

パッケージの公開インターフェースは、一度だけ設定する初期化処理です。

import { configurePanel, type PanelConfig } from '@takazudo/zdtp';

configurePanel({
  storagePrefix: 'myapp-design-token-panel',
  consoleNamespace: 'myapp',
  modalClassPrefix: 'myapp-design-token-panel-modal',
  schemaId: 'myapp-design-tokens/v1',
  exportFilenameBase: 'myapp-design-tokens',
  tabs: myTabs,
});

設定すると、window.<consoleNamespace> に 3 つの非同期ヘルパー showDesignPanel()hideDesignPanel()toggleDesignPanel() が追加されます。どれかを呼ぶとパネルモジュールが遅延 import され、UI がマウントされます。固定名の window.zdtp グローバル(zdtp.show() / zdtp.hide() / zdtp.toggle())も追加されるため、パネルを開くだけなら独自の consoleNamespace を覚える必要はありません。全体像は設定リファレンスを参照してください。

Astro ホストでは自動的に呼び出されます

Astro レイアウトへ <DesignTokenPanelHost config={myPanelConfig} /> を配置すると、ホストアダプターがインライン JSON 設定を読み、代わりに configurePanel(...) を呼び出します。手動で呼ぶ必要はありません。Vite + React または Next.js では、パネルモジュールを import する前に自分で呼び出します。

ステップ 1 — 最小限の PanelConfig を定義する

ソースの近くに設定用ファイルを作ります。パッケージに必要なのは、5 つの識別子(ストレージプレフィックス、コンソール名前空間、モーダルクラスプレフィックス、スキーマ ID、エクスポートファイル名)とタブ配列だけです。

// src/lib/my-panel-config.ts
import type { PanelConfig } from '@takazudo/zdtp';
import { myTabs } from './my-tabs';

export const myPanelConfig: PanelConfig = {
  storagePrefix: 'myapp-design-token-panel',
  consoleNamespace: 'myapp',
  modalClassPrefix: 'myapp-design-token-panel-modal',
  schemaId: 'myapp-design-tokens/v1',
  exportFilenameBase: 'myapp-design-tokens',
  tabs: myTabs,
};

識別子には、通常はアプリの slug など、アプリ固有で曖昧でない値を選びます。storagePrefix は永続化するすべての localStorage キーを制御する唯一の設定です。後から変更すると、ユーザーが保存した調整内容を読み出せなくなります。

ステップ 2 — 最小限の tabs マニフェスト

PanelConfig.tabsreadonly TabConfig[] です。パネルのタブストリップに表示する各タブが、この配列の 1 エントリになります。TabConfig は安定した id、表示ラベル、編集可能な CSS 変数行を持つ 1 つ以上のティアで構成されます。

最も単純で実用的なマニフェストは、1 ティアと 2 アイテムを持つスペーシングタブです。

// src/lib/my-tabs.ts
import type { TabConfig } from '@takazudo/zdtp';

export const myTabs: readonly TabConfig[] = [
  {
    id: 'spacing',
    label: 'Spacing',
    tiers: [
      {
        id: 'base',
        label: 'Base spacing',
        items: [
          {
            id: 'myapp-spacing-md',
            cssVar: '--myapp-spacing-md',
            label: 'Spacing M',
            group: 'hsp',
            default: '1rem',
            type: { kind: 'length', min: 0, max: 4, step: 0.0625, unit: 'rem' },
          },
          {
            id: 'myapp-spacing-lg',
            cssVar: '--myapp-spacing-lg',
            label: 'Spacing L',
            group: 'vsp',
            default: '2rem',
            type: { kind: 'length', min: 0, max: 6, step: 0.0625, unit: 'rem' },
          },
        ],
      },
    ],
  },
];

cssVar は、パネルが setProperty() を使って :root へ書き込む CSS カスタムプロパティです。スタイルシートが同じ変数名を参照していることを確認してください。type フィールドは判別可能なユニオン型('length''number''select''text''color')で、行に表示するエディターを制御します。

抽象ティアモデル

スペーシング、タイポグラフィ、サイズ、カラー、イージングなど、カスタムドメインを含むすべてのタブファミリーで同じ TabConfig 形式を使います。タブは複数のティアを持つことができ、あるティアから別のティアのアイテム ID を参照できるため、ロー値への変更をセマンティックロールへ自動的に波及できます。全体の考え方と 2 ティア間参照の例はアーキテクチャを参照してください。

ステップ 3 — configurePanel(...) を呼び、パネルを切り替える

Astro 以外のホスト(Vite + React、Next.js、独自の Vite SPA)では、通常はエントリモジュールから、アプリ起動時に configurePanel(...) を一度呼びます。その後、開発者ツールのコンソールを開きます。

// src/main.ts (Vite + React) or app/layout.tsx (Next.js, with 'use client')
import { configurePanel } from '@takazudo/zdtp';
import '@takazudo/zdtp/styles';
import { myPanelConfig } from './lib/my-panel-config';

configurePanel(myPanelConfig);

ブラウザーの開発者ツールコンソールで次を実行します。

window.myapp.toggleDesignPanel();
// or, without remembering your own consoleNamespace:
zdtp.toggle();

最初の呼び出しでパネルモジュールを遅延 import してマウントします。それ以降の呼び出しでは、メモ化された同じモジュール Promise を共有します。

3 つの非同期ヘルパー

3 つのコンソールヘルパーはすべて async です。シグネチャは showDesignPanel(): Promise<void>hideDesignPanel(): Promise<void>toggleDesignPanel(): Promise<void> です。既存の window.<consoleNamespace> オブジェクトへマージされるため、ホストは複数の開発ツールで名前空間を共有できます。

Astro では configurePanel(...) を直接呼びません。レイアウトへホストコンポーネントを配置し、ホストアダプターに接続を任せます。

---
// src/layouts/Layout.astro
import DesignTokenPanelHost from '@takazudo/zdtp/astro/DesignTokenPanelHost.astro';
import '@takazudo/zdtp/styles';
import { myPanelConfig } from '../lib/my-panel-config';
---

<!doctype html>
<html lang="en">
  <body>
    <slot />
    <DesignTokenPanelHost config={myPanelConfig} />
  </body>
</html>

<script>
  void import('@takazudo/zdtp/astro/host-adapter');
</script>

<DesignTokenPanelHost> コンポーネントとホストアダプターの <script> ブロックは対になっており、常に両方が必要です。script を省くと JSON 設定ペイロードがページに残り、それを読む JavaScript がありません。

パネルのマウントを確認する

ブラウザーでページを開き、開発者ツールで次を実行します。

window.myapp.toggleDesignPanel();

Preact でレンダリングされたサイドパネルが表示されます。スライダーを動かすと、対応する --myapp-* CSS 変数が :root 上ですぐに更新されます。ページを再読み込みすると、最初の描画前にオーバーライドが再適用され、FOUT は発生しません。

パネルにスタイルが適用されていない場合

パネルは初回マウント時にスタイルシートを自己注入するため、import '@takazudo/zdtp/styles' は不要です。背景が透明、ページ既定のフォントが使われるなど UI が欠けている場合は、パネルモジュール自体の読み込みに失敗しています。バンドラー設定を確認し、peer dependency の preact がインストールされていることを確認してください。

次のステップ

ここまでで「パネルが描画され、CSS 変数が更新される」状態になりました。PanelConfig の全体とタブマニフェストの詳細は configurePanel リファレンスへ、フレームワーク別のスニペットはフレームワーク比較へ進んでください。

Revision History

作成更新