diff --git a/.internal/page-template.md b/.internal/page-template.md
index f503de6f..afc543cc 100644
--- a/.internal/page-template.md
+++ b/.internal/page-template.md
@@ -2,7 +2,7 @@
このテンプレートは、APG パターンページの構成を統一するためのガイドラインです。
-> **Note**: ページは動的ルーティング(`[pattern]/[framework]/index.astro`)で自動生成される。個別のページファイル作成は不要。新しいパターンを追加するには `meta.ts` と `DemoSection.astro` を作成すればよい。
+> **Note**: ページは動的ルーティング(`[pattern]/[framework]/index.astro`)で自動生成される。個別のページファイル作成は不要。新しいパターンを追加するには `meta.ts` と framework 別の `DemoSection.{react,vue,svelte,web-component}.astro` 4 ファイルを作成すればよい。
## 章構成 (tocItems)
@@ -49,7 +49,8 @@ const tocItems = [
| ファイル | 役割 | 検出パターン |
|---------|------|-------------|
| `meta.ts` | メタデータ定義 | `/src/patterns/*/meta.ts` |
-| `DemoSection.astro` | デモ表示 | `/src/patterns/*/DemoSection.astro` |
+| `DemoSection.{react,vue,svelte,web-component}.astro` | framework 別デモ表示 | `/src/patterns/*/DemoSection.{react,vue,svelte,web-component}.astro` |
+| `{pattern}-demo-data.ts` | 共通 demo data(任意) | `/src/patterns/{pattern}/{pattern}-demo-data.ts` |
| `TestingDocs.astro` | テスト解説 | `/src/patterns/*/TestingDocs.astro` |
| `{Component}.{tsx,vue,svelte,astro}` | ソースコード表示 | `/src/patterns/**/*.{tsx,vue,svelte,astro}` (`?raw`) |
| `{Component}.test.*` | テストコード表示 | `/src/patterns/**/*.test.*` (`?raw`) |
@@ -58,7 +59,9 @@ const tocItems = [
## 章の説明
### 1. Demo
-- `DemoSection.astro` コンポーネントが `framework` prop に基づいて適切なフレームワーク実装を表示
+- ページ側 dispatcher が `framework` 値から `DemoSection.{react,vue,svelte,web-component}.astro` の該当ファイルを動的 import して呼ぶ(`Astro Web Component` は `web-component` キー)
+- 各 framework 別ファイルは `locale` prop だけを受け取り、自分の framework の実装ファイルだけを静的 import する
+- 4 framework で内容が完全に同一かつ概ね 8 行以上の純 data は `{pattern}-demo-data.ts` に切り出して全 4 ファイルから import する
- 複数のバリエーションがある場合は DemoSection 内で `
` 小見出しで分割
### 2. Native HTML(条件付き)
@@ -108,7 +111,10 @@ const tocItems = [
### 必須ファイル
- [ ] `src/patterns/{pattern}/meta.ts` - パターンメタデータ(`PatternMeta` 型)
-- [ ] `src/patterns/{pattern}/DemoSection.astro` - 全フレームワーク統合デモ
+- [ ] `src/patterns/{pattern}/DemoSection.react.astro` - React 用デモ
+- [ ] `src/patterns/{pattern}/DemoSection.vue.astro` - Vue 用デモ
+- [ ] `src/patterns/{pattern}/DemoSection.svelte.astro` - Svelte 用デモ
+- [ ] `src/patterns/{pattern}/DemoSection.web-component.astro` - Astro Web Component 用デモ
- [ ] `src/patterns/{pattern}/{Component}.tsx` - React 実装
- [ ] `src/patterns/{pattern}/{Component}.vue` - Vue 実装
- [ ] `src/patterns/{pattern}/{Component}.svelte` - Svelte 実装
@@ -119,6 +125,7 @@ const tocItems = [
- [ ] `src/content/accessibility-docs/{pattern}/ja.mdx` - アクセシビリティ解説(日本語)
- [ ] `src/patterns/{pattern}/{pattern}.md` - AI 向けガイド
- [ ] `src/patterns/{pattern}/NativeHtmlNotice.astro` - Native HTML 説明(該当パターンのみ)
+- [ ] `src/patterns/{pattern}/{pattern}-demo-data.ts` - 共通 demo data(4 framework で完全一致する 8 行以上の純 data がある場合のみ)
### meta.ts 構成確認
- [ ] `PatternMeta` 型に準拠している
diff --git a/.internal/pattern-planning-prompt.md b/.internal/pattern-planning-prompt.md
index 44905c6c..6606379f 100644
--- a/.internal/pattern-planning-prompt.md
+++ b/.internal/pattern-planning-prompt.md
@@ -137,7 +137,8 @@ Phase 1 で llm.md とテストを先に作成し、その後実装に進みま
### Phase 3: メタデータ・ドキュメント
- [ ] `meta.ts` - パターンメタデータ(`PatternMeta` 型)
-- [ ] `DemoSection.astro` - 全フレームワーク統合デモ
+- [ ] `DemoSection.react.astro` / `DemoSection.vue.astro` / `DemoSection.svelte.astro` / `DemoSection.web-component.astro` - framework 別デモ
+- [ ] `{pattern}-demo-data.ts` - 共通 demo data(4 framework で完全一致する 8 行以上の純 data がある場合のみ)
- [ ] `TestingDocs.astro` - テスト解説 ※ `.internal/TestingDocs-template.astro` を参照
- [ ] `NativeHtmlNotice.astro` - ネイティブ HTML 注記(該当パターンのみ)
- [ ] `src/content/accessibility-docs/{pattern}/en.mdx` - ARIA 仕様解説(英語)
@@ -689,8 +690,8 @@ export interface {ComponentName}Props extends Omit<
# meta.ts の存在確認
ls -la src/patterns/{pattern}/meta.ts
- # DemoSection の存在確認
- ls -la src/patterns/{pattern}/DemoSection.astro
+ # DemoSection の存在確認(framework 別 4 ファイル)
+ ls -la src/patterns/{pattern}/DemoSection.{react,vue,svelte,web-component}.astro
# アクセシビリティドキュメントの確認
ls -la src/content/accessibility-docs/{pattern}/en.mdx
@@ -713,7 +714,11 @@ export interface {ComponentName}Props extends Omit<
### メタデータ・デモ
- [ ] meta.ts(PatternMeta 型)
- - [ ] DemoSection.astro
+ - [ ] DemoSection.react.astro
+ - [ ] DemoSection.vue.astro
+ - [ ] DemoSection.svelte.astro
+ - [ ] DemoSection.web-component.astro
+ - [ ] {pattern}-demo-data.ts(共通 data がある場合のみ)
### ドキュメント
- [ ] src/content/accessibility-docs/{pattern}/en.mdx
diff --git a/.internal/site-specification.md b/.internal/site-specification.md
index 64163ffb..74289a00 100644
--- a/.internal/site-specification.md
+++ b/.internal/site-specification.md
@@ -221,7 +221,11 @@ src/
├── patterns/ # APG パターン実装
│ └── button/ # 例: button パターン
│ ├── meta.ts # パターンメタデータ(単一の真実源)
-│ ├── DemoSection.astro # 全フレームワーク統合デモ
+│ ├── DemoSection.react.astro # React 用デモ
+│ ├── DemoSection.vue.astro # Vue 用デモ
+│ ├── DemoSection.svelte.astro # Svelte 用デモ
+│ ├── DemoSection.web-component.astro # Astro Web Component 用デモ
+│ ├── {pattern}-demo-data.ts # 共通 demo data(必要なときのみ)
│ ├── TestingDocs.astro # テストドキュメント
│ ├── Button.tsx # React 実装
│ ├── Button.vue # Vue 実装
@@ -266,7 +270,8 @@ src/
各パターンの `meta.ts` が `PatternMeta` 型でメタデータを一元定義する。動的ルーティング(`[pattern]/[framework]/index.astro`)が `import.meta.glob()` で全パターンの `meta.ts` を検出し、`getStaticPaths()` で 4フレームワーク × 2言語 のページをビルド時に生成する。
- **`meta.ts`**: タイトル、説明、TOC、リソース、フレームワーク別 API ドキュメント。全テキストは `Record` で i18n 対応
-- **`DemoSection.astro`**: 4フレームワークの実装を静的 import し、`framework` prop で切り替え表示
+- **`DemoSection.{react,vue,svelte,web-component}.astro`**: framework ごとに分割した薄い Astro。それぞれ自分の framework の実装ファイルだけを静的 import する。ページ側 dispatcher が `framework` から該当ファイルを選んで動的 import で呼ぶ
+- **`{pattern}-demo-data.ts`** (任意): 4 framework で内容が完全に同一かつ概ね 8 行以上の純 data を切り出した共通ファイル
- **`content/accessibility-docs/`**: MDX でアクセシビリティ解説を記述。frontmatter は `pattern` と `locale` のみ
---
diff --git a/CLAUDE.md b/CLAUDE.md
index 4f0ff45f..80f0961e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -43,12 +43,11 @@ src/
├── patterns/ # APG パターン実装
│ └── button/ # 例: button パターン
│ ├── meta.ts # パターンメタデータ(単一の真実源)
-│ ├── DemoSection.astro # 全フレームワーク統合デモ(legacy)
-│ │ # ↓ または framework 別に分割(後述)
-│ ├── DemoSection.react.astro # React 用デモ(split 後)
-│ ├── DemoSection.vue.astro # Vue 用デモ(split 後)
-│ ├── DemoSection.svelte.astro # Svelte 用デモ(split 後)
-│ ├── DemoSection.web-component.astro # Astro Web Component 用(split 後)
+│ ├── DemoSection.react.astro # React 用デモ
+│ ├── DemoSection.vue.astro # Vue 用デモ
+│ ├── DemoSection.svelte.astro # Svelte 用デモ
+│ ├── DemoSection.web-component.astro # Astro Web Component 用デモ
+│ ├── {pattern}-demo-data.ts # 共通 demo data(必要なときのみ。後述)
│ ├── TestingDocs.astro # テストドキュメント
│ ├── Button.tsx # React 実装
│ ├── Button.vue # Vue 実装
@@ -83,11 +82,9 @@ src/
各パターンの `meta.ts` が単一の真実源(Single Source of Truth)となる。1つの `meta.ts` から 4フレームワーク × 2言語 = 8ページが動的に生成される。
- **`meta.ts`**: タイトル、説明、TOC、リソース、フレームワーク別メタデータ(ソースファイル、API Props/Events/Slots)を `PatternMeta` 型で定義。全テキストは `Record` で i18n 対応
-- **`DemoSection.*.astro`** (推奨): framework ごとに分割した薄い Astro。`DemoSection.{react,vue,svelte,web-component}.astro` が、それぞれ自分の framework の実装ファイルだけを静的 import する。ページ側 dispatcher が `framework` から該当ファイルを選んで呼ぶ
-- **`{pattern}-demo-data.ts`** (任意): 4 framework で内容が完全に同一かつ概ね 8 行以上の純 data (配列/オブジェクトリテラル) を切り出した共通ファイル。framework 固有の prop 名 (Vue `ariaLabel` ↔ React/Astro `aria-label`) や関数 (`renderCell` など) は含めず、各 `DemoSection.{framework}.astro` 側で吸収する
-- **`DemoSection.astro`** (legacy): 4 framework の実装を 1 ファイルで静的 import する旧形式。dispatcher にフォールバックとして残してあり、まだ移行していない pattern で使われている。**注意**: legacy 形式は `@vitejs/plugin-react v6` + Vite 8 + Vue SFC `