File size: 9,042 Bytes
68f7925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# HTML プレビュー・セクション管理システム設計書

## 1. 概要

改善案生成結果の HTML プレビュー機能において、セクションの可視性制御、順序管理、iframe 内表示、位置同期を統合的に管理するシステムの設計仕様。

## 2. システムアーキテクチャ

### 2.1 4層アーキテクチャ構成

```mermaid
graph TB
    A[セクション管理レイヤー<br/>useSectionManager] --> B[HTML生成・表示レイヤー<br/>TabContentRenderer]
    B --> C[位置同期レイヤー<br/>usePreciseSectionAlignment]
    B --> D[スクロール制御レイヤー<br/>handleSectionClick]

    E[Zustand Store] --> A
    F[ContentSection[]] --> A
    G[FV/CN HTML Generation] --> B
    H[iframe Display] --> B
    I[Environment Variables] --> C
```

### 2.2 レイヤー間の責任分離

| レイヤー | 責任 | 主要機能 |
|---------|------|---------|
| **セクション管理** | セクション状態の管理 | 可視性制御、順序管理、永続化 |
| **HTML生成・表示** | UI統合とHTML生成 | FV/CN HTML生成、iframe表示、ダウンロード |
| **位置同期** | iframe内位置同期 | セクション位置測定、カード位置計算 |
| **スクロール制御** | ユーザー操作対応 | セクションクリック、スムーズスクロール |

## 3. セクション管理レイヤー仕様

### 3.1 useSectionManager の機能

#### 3.1.1 型定義
```typescript
interface SectionVisibility {
  [key: string]: {
    visible: boolean;   // セクションの表示/非表示
    order: number;      // セクションの表示順序
  };
}

interface UseSectionManagerReturn {
  sectionVisibility: SectionVisibility;
  handleSectionVisibility: (key: string) => void;
  handleSectionOrder: (key: string, direction: 'asc' | 'desc') => void;
  filterAndSortSections: (sections: ContentSection[]) => ContentSection[];
  getSectionInfoForDropdown: (sections: ContentSection[]) => SectionInfo[];
  resetSectionVisibility: () => void;
  hasChanges: boolean;
}
```

#### 3.1.2 状態管理の仕組み
- **キー形式**: `${section.大区分}-${section.中区分}`
- **初期状態**: 全セクション visible: true, order: インデックス順
- **永続化**: Zustand store でタブ間状態保持
- **変更検知**: 初期状態と現在状態の diff による hasChanges 判定

#### 3.1.3 主要機能
```typescript
// セクション可視性の切り替え
handleSectionVisibility('ヘッダー-メインビジュアル');

// セクション順序の変更
handleSectionOrder('コンテンツ-商品紹介', 'asc');

// 可視セクションのフィルタリング・ソート
const visibleSections = filterAndSortSections(allSections);

// 初期状態にリセット
resetSectionVisibility();
```

## 4. HTML生成・表示レイヤー仕様

### 4.1 TabContentRenderer の責任

#### 4.1.1 統合制御機能
- **セクション管理統合**: useSectionManager の呼び出しと状態管理
- **HTML生成制御**: FV/CN HTML生成の条件判定と実行
- **iframe表示制御**: 生成されたHTMLのiframe表示
- **ダウンロード機能**: 画像・コードダウンロードの実装

#### 4.1.2 生成条件の制御
```typescript
// HTML生成の有効化条件
const htmlGenerationEnabled = React.useMemo(() => {
  const hasMinimalData = hasFvData && hasCnData;

  if (dummyMode) {
    return hasScreenshot && hasMinimalData;
  } else if (generateAllTabs) {
    return hasScreenshot && hasMinimalData;
  } else {
    return hasScreenshot && hasMinimalData;
  }
}, [dummyMode, generateAllTabs, hasScreenshot, hasFvData, hasCnData]);
```

#### 4.1.3 モード別動作
- **ダミーモード**: 事前生成されたダミーHTML/画像を使用
- **全タブ生成モード**: 全タブで一括HTML生成
- **通常モード**: アクティブタブのみHTML生成

## 5. 位置同期レイヤー仕様

### 5.1 usePreciseSectionAlignment の機能

#### 5.1.1 環境制御
```typescript
// 環境変数による機能制御
const isAlignmentFeatureEnabled = process.env.NEXT_PUBLIC_ENABLE_SECTION_ALIGNMENT === 'true';
const alignmentEnabled = isAlignmentFeatureEnabled && isActive && !!tabCnData && tabCnData.length > 0;
```

#### 5.1.2 位置同期アルゴリズム
- **測定**: iframe内セクション要素の位置・サイズ測定
- **計算**: セクションとカードの位置対応計算
- **同期**: transform: translateY による位置調整

#### 5.1.3 観測機能
- **MutationObserver**: iframe内DOM構造変更の監視
- **ResizeObserver**: セクションサイズ変更の監視
- **デバウンス処理**: 150ms のデバウンスで性能最適化

## 6. スクロール制御レイヤー仕様

### 6.1 handleSectionClick の動作

#### 6.1.1 セクション検索アルゴリズム
```typescript
const searchMethods = [
  () => iframeDoc.querySelector(`[data-section-key="${sectionKey}"]`),
  () => iframeDoc.querySelector(`[aria-label="${sectionKey}"]`),
  () => iframeDoc.querySelector(`[aria-label*="${sectionKey}"]`),
  // 複数のフォールバック手法...
];
```

#### 6.1.2 スクロール位置計算
```typescript
// 最終スクロール位置の計算
const iframeRect = iframe.getBoundingClientRect();
const finalScrollTop = window.scrollY + iframeRect.top + sectionOffsetTop - 36; // sticky tab height

window.scrollTo({
  top: Math.max(0, finalScrollTop),
  behavior: 'smooth',
});
```

## 7. データフローと状態管理

### 7.1 データフロー
```
ContentSection[]

useSectionManager (状態管理)

TabContentRenderer (UI統合)

[並行処理]
  ├─ HTML生成 → iframe表示
  ├─ 位置同期 (usePreciseSectionAlignment)
  └─ スクロール制御 (handleSectionClick)
```

### 7.2 状態永続化
- **保存場所**: Zustand store
- **保存単位**: タブ名単位での状態管理
- **保存内容**: sectionVisibility オブジェクト
- **復元タイミング**: タブ切り替え時の自動復元

### 7.3 変更検知システム
```typescript
const checkHasChanges = (current: SectionVisibility, initial: SectionVisibility) => {
  // 可視性変更の検知
  if (current[key].visible !== initial[key].visible) return true;

  // 順序変更の検知
  if (current[key].order !== initial[key].order) return true;

  return false;
};
```

## 8. 環境設定と制御

### 8.1 環境変数による機能制御
- `NEXT_PUBLIC_ENABLE_SECTION_ALIGNMENT`: 位置同期機能の有効/無効
- 各生成モードの制御: dummyMode, generateAllTabs

### 8.2 条件分岐による最適化
- **ローカル環境**: 画像生成をスキップ(RateLimit回避)
- **ダミーモード**: 事前生成データの使用
- **デプロイ環境**: 全機能の有効化

## 9. パフォーマンス仕様

### 9.1 応答性能
- **状態更新**: デバウンス 150ms
- **HTML生成**: 非同期処理による UI ブロック回避
- **位置同期**: リアルタイム更新(有効時のみ)
- **スクロール**: smooth behavior による自然な動作

### 9.2 メモリ効率
- **Observer**: 必要時のみアクティブ化
- **状態管理**: 必要最小限のデータ保持
- **HTML**: ミニファイ化された軽量コンテンツ

## 10. エラーハンドリング

### 10.1 段階的フォールバック
```typescript
// セクション検索の段階的フォールバック
for (let i = 0; i < searchMethods.length; i++) {
  try {
    targetElement = searchMethods[i]();
    if (targetElement) break;
  } catch (error) {
    console.log(`Search method ${i + 1} failed:`, error);
  }
}
```

### 10.2 エラー時の安全な動作
- **セクション未発見**: iframe先頭への安全なスクロール
- **HTML生成失敗**: エラー表示とリトライ機能
- **位置同期失敗**: デフォルト表示への自動フォールバック

## 11. 実装のポイント

### 11.1 責任分離の徹底
- **セクション管理**: 完全に独立したレイヤー
- **HTML生成**: 非同期処理による分離
- **位置同期**: 環境変数による任意機能
- **スクロール制御**: ユーザー操作への専念

### 11.2 拡張性の確保
- **モジュラー設計**: 各レイヤーの独立性
- **設定可能**: 環境変数による柔軟な制御
- **フォールバック**: 段階的な機能劣化

### 11.3 デバッグ支援
- **詳細ログ**: 各段階での状態出力
- **段階的検索**: 複数手法による要素発見
- **状態可視化**: hasChanges による変更状態の明示

## 12. 今後の発展可能性

### 12.1 機能拡張
- **セクション編集**: インライン編集機能
- **プレビュー強化**: リアルタイムプレビュー
- **エクスポート拡張**: 多形式対応

### 12.2 性能改善
- **仮想化**: 大量セクションの効率的表示
- **キャッシュ**: 生成結果のインテリジェントキャッシュ
- **並列化**: 生成処理の更なる並列化