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