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