Vize

グローバルプレビューコントロール

toolbar を設定すると、プロジェクト固有のコントロールを Musea のアドオンツールバーに追加できます。 変更はバリアント一覧、Props、アクセシビリティ、全画面、複数ビューポートの各 iframe に届きます。 Vue アプリはその場で更新されるため、グローバル値の変更で iframe 内の状態は失われません。

コントロールを定義する

import { musea } from "@vizejs/vite-plugin-musea";

musea({
  previewSetup: "musea.preview.ts",
  toolbar: [
    {
      id: "brand",
      title: "ブランド",
      type: "select",
      options: ["default", "brand-a", "brand-b"],
      default: "default",
    },
    {
      id: "scheme",
      title: "コンポーネントのテーマ",
      type: "toggle",
      options: [
        { value: "light", label: "ライト", icon: "☀" },
        { value: "dark", label: "ダーク", icon: "☾" },
      ],
      default: "light",
    },
    {
      id: "locale",
      title: "言語",
      type: "select",
      options: [
        { value: "en", label: "English" },
        { value: "ja", label: "日本語" },
      ],
      default: "en",
    },
  ],
});
フィールド 動作
id 一意のキー。英字で始まり、以降は英字・数字・_・- を使えます。
title 表示ラベルとアクセシブルな名前。
type select は選択リスト、toggle はラベル付きの2つのボタン。
options 空でない文字列配列、または { value, label, icon? } の配列。値は文字列・有限の数値・真偽値で、重複はできません。
default 選択肢と型まで一致する初期値。
icon Unicode 記号などのテキスト。HTML や SVG の文字列もテキストとして表示します。

無効な設定はプラグインの読み込み時にエラーになります。Vue 3 と Vue 2.7 で利用できます。 toolbar を省略すると、従来のプレビュー動作を保ちます。 組み込みの Light/Dark ボタンは引き続きキャンバスの背景色を変更し、コンポーネントのテーマとは独立しています。

プレビューに反映する

toolbar に1つ以上のコントロールがある場合、第2引数の context で同じ Vue ref を受け取れます。 初期値をマウント前に読み、変更は ref の監視で反映します。コントロールがなければ context は渡されません。 設定をまたいでセットアップを再利用する場合は、第2引数の有無を確認してください。 app だけを受け取る従来の関数もそのまま使えます。

// musea.preview.ts
import { watch, type App } from "vue";
import type { MuseaPreviewContext } from "@vizejs/vite-plugin-musea";
import { createI18n } from "vue-i18n";

export default function setup(app: App, context?: MuseaPreviewContext) {
  const i18n = createI18n({
    legacy: false,
    locale: context?.globals.value.locale === "ja" ? "ja" : "en",
    messages: { en: {}, ja: {} },
  });
  app.use(i18n);

  if (!context) return;
  const { globals } = context;

  const stop = watch(
    globals,
    (values) => {
      document.documentElement.dataset.brand = String(values.brand);
      document.documentElement.dataset.scheme = String(values.scheme);
      i18n.global.locale.value = values.locale === "ja" ? "ja" : "en";
    },
    { immediate: true },
  );
  app.onUnmount(stop);
}

監視関数の中で Vuetify のテーマ API、CSS カスタムプロパティ、密度、文字の方向などを更新できます。 Vue 2.7 では app.onUnmount(stop) の代わりに app.$on("hook:destroyed", stop) で監視を解除してください。 各 iframe が個別の ref を持ち、Musea が検証済みの同じ値を全 iframe に配信します。 Props 操作でアプリが再マウントされても、その iframe の現在の ref を引き継ぎます。

状態を共有・復元する

値はギャラリーの base path ごとにローカルストレージへ保存し、SPA のページ移動でも維持します。 URL の museaGlobals クエリには値の JSON を入れるため、現在のギャラリー URL を共有すると別のブラウザでも状態を再現できます。 URL に指定した値は保存値より優先します。未知のキーは無視し、無効な選択肢は設定した初期値に戻します。 他のクエリと URL のハッシュは保持します。

ローカルストレージが無効でも、変更の反映、ページ移動、共有 URL は動きます。 静的ビルドのギャラリーにも同じコントロールとプレビューセットアップを含めます。

動作例は pnpm --dir examples/vite-musea gallery:globals で試せます。ブランド・テーマ・言語を切り替えられます。 通常の example コマンドは既存の設定を使います。

グローバル値の全組み合わせを自動撮影する VRT は未実装です。既存の VRT は設定した初期値を使い、 コントロールを追加しただけではスクリーンショットのケースは増えません。