# HTML プレビュー・セクション管理システム設計書 ## 1. 概要 改善案生成結果の HTML プレビュー機能において、セクションの可視性制御、順序管理、iframe 内表示、位置同期を統合的に管理するシステムの設計仕様。 ## 2. システムアーキテクチャ ### 2.1 4層アーキテクチャ構成 ```mermaid graph TB A[セクション管理レイヤー
useSectionManager] --> B[HTML生成・表示レイヤー
TabContentRenderer] B --> C[位置同期レイヤー
usePreciseSectionAlignment] B --> D[スクロール制御レイヤー
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 性能改善 - **仮想化**: 大量セクションの効率的表示 - **キャッシュ**: 生成結果のインテリジェントキャッシュ - **並列化**: 生成処理の更なる並列化