# DEVLOG — comfyui-comic-creater --- ## 2026-08-08(3Dテキストに SVG立体化・表面/側面カラー分離・設定モーダルのタブ化を追加、未リリース) `feature/text3d-svg-material`ブランチで作業。参考アプリ`3d-text-generator`(React/three.js製プロトタイプ)の「SVGパス立体化」「表面色・側面色の個別指定」を、既存の3Dテキスト機能(レイアウトタブ・Imageタブ共有)へ移植し、あわせてユーザーからのフィードバックを受けて⚙設定モーダルをタブ構成に再設計した。 **SVG立体化モード**: 「テキスト」「SVG」のモード切替ボタンを追加。SVGモードではSVGファイルを選択すると、SVGLoader(three r160、`comfyui-vrm-pose-editor`が配信するthree.module.jsと同バージョンでvendor化)でパースしたベクターパスを`THREE.ExtrudeGeometry`で押し出す(`text3d-core.js`の`_buildSvgGeometry()`、参考アプリ`svgToShapes.ts`のロジックをvanilla js化して移植)。未パス化のテキスト要素(``)やビットマップ画像(``)を含むSVGは警告を表示する。 **表面/側面カラー分離**: `THREE.ExtrudeGeometry`が標準で持つ「表裏キャップ面=materialIndex 0」「側面=materialIndex 1」の2グループ(three.js本体の実装仕様)を利用し、`new THREE.Mesh(geometry, [frontMaterial, sideMaterial])`と配列を渡すだけで表面色・側面色を別マテリアルにした。テキスト・SVG両モード共通。面取り(厚み・サイズ・分割数)も詳細スライダーで調整できるようにした。 **バグ修正1: 面取りの値によってSVGの3Dビューが真っ黒になる不具合**。当初は「SVGのviewBoxサイズと押し出し座標系のスケール不一致」を疑ったが、実機調査(`gl.readPixels()`でキャンバスの実ピクセル値を直接確認)の結果、WebGL自体は正常に描画できており、原因は別にあると判明。⚙設定モーダルは実描画中のcanvasを一時的に自分のプレビュー枠へ「借りて」表示する仕組みだが、レイアウトタブ側の「コマの画面上位置にcanvasを追従させるResizeObserver」がモーダル表示中も動き続けており、モーダルが借りている最中のcanvasラッパーを、コマの本来の位置(画面外)へ強制的に書き戻してしまっていた(`text3d-settings-modal.js`に`onClose`コールバックを追加し、`25-text3d-bridge.js`側でモーダルを開く前にResizeObserverを止め、閉じたら再セットアップするよう修正)。あわせて、three.jsのExtrudeGeometry自体が面取りの自己交差で頂点座標や法線ベクトルを破綻させるケース(three.js本体の既知の制約)に対する防御コードも追加し、破綻を検知した場合は面取りを自動的に無効化して再構築し、無音で真っ黒になる代わりに警告メッセージを出すようにした(`_isGeometryValid()`)。 **⚙設定モーダルのタブ化**(ユーザー要望): 3カラム構成に再設計。左=「ライト」「マテリアル」「カメラ」のタブ切替パネル、中央=実描画中のプレビュー、右=常時表示の「テキスト」パネル(テキスト内容・フォント・整列・**行間スライダー(新規)**)。従来ツールバーに常時表示していたテキスト入力・フォント選択・整列ボタンをモーダルへ移動し、ツールバーはモード切替・押し出し厚み・面取りON/OFF・⚙3D設定ボタンのみのシンプルな構成にした。これに伴い、フォント読込ロジックをDOM値読取(`fontSelect.value`)から`state.text3d.fontFamily`/`fontSource`(stateが正)駆動へリファクタリング(モーダルは開いている間しかDOM要素が存在しないため)。フォント一覧取得はレイアウトタブ・Imageタブで実装が異なる(Google一覧の取得元・システムフォントキャッシュが別々)ため、モーダル自体はロジックを持たず`fontControls`コールバック一式を呼び出し側から受け取って委譲する設計にした。テキスト・整列・行間はモーダル内でeditorへ直接適用されるため、モーダルを閉じた時点(`onClose`)で`editor.getParams()`から読み戻してstateに同期する。 **UI文言調整**(ユーザー要望): モーダルタイトルを多言語化しない固定名称「3D Text Editor」に変更(3Dポーズの「RC」ボタン表記と同じ扱い)。⚙ボタンを「⚙ 設定」→「⚙ 3D設定」に変更しツールチップに「テキスト編集」を追加。テキスト内容の初期値を空文字から「text」に変更し、「コマに配置」を押しただけで即座に3Dビューに何か表示され操作に迷わないようにした。 Kaptureで実機E2E確認済み: SVGファイル選択・立体化・表面/側面カラー分離・面取り詳細スライダー(意図的に極端な値を試し、以前は真っ黒になっていた組み合わせでも正しく表示され続けることを確認)・タブ切替・フォントソース切替(Google/システム)・整列・行間スライダーのライブ反映・モーダルを閉じた後の状態保持・UI文言変更を確認。新規コード起因のコンソールエラーなし。ヘルプ(ja/en/zh、22-help-tab.jsの`_HELP_DATA`と`_HELP_I18N.en`/`.zh`両方)・README 3言語を更新済み。バージョン番号は未更新(リリースは別途依頼時に対応)。 --- ## 2026-08-07(デフォルトワークフロー系チェックボックスがRunに反映されないバグを修正、v1.30.1) ユーザー報告「T2I一括生成でデフォルトワークフローのチェックを外して別のワークフロー(boogu_t2i.json)を生成UIタブに読み込んで実行したが、ernie_t2i.jsonで実行される」を調査。 **原因**: T2I/I2Iモーダルの「デフォルトワークフローを使用する」チェックボックス・ファイル名入力欄は、実行(Run)時には一切参照されず、**「保存」ボタンを押してlocalStorageへ書き込んで初めて次回以降の実行に反映される**設計になっていた。`requestPanelImageFromWorkflowStudio()`/`sendI2IRunToWorkflowStudio()`(14-integrations.js)が、呼び出し時の引数ではなく内部でモジュールスコープの`_t2iSettings`/`_i2iSettings`(保存済み設定)を直接参照していたため。チェックボックスを変更しただけで「保存」を押し忘れると、画面表示と実際の挙動が食い違う(今回は前回セッションでON+`ernie_t2i.json`を保存済みだったため、OFFにしても保存し直さない限りernie_t2i.jsonのまま実行され続けた)。 同じ設計上の欠陥が、スクリプトタブのT2I/I2Iモーダルだけでなく、**レイアウトタブのI2Iモーダル**(15-pixifx-bridge.js)と**ImageタブのSelect I2Iパネル**(image-tab.js)の計4箇所すべてに存在していたため、まとめて修正した。 **修正**: `requestPanelImageFromWorkflowStudio(prompt, width, height, negative, wfOverride)`/`sendI2IRunToWorkflowStudio(imageBlob, params, wfOverride)`(14-integrations.js)に、任意の`wfOverride: {enabled, file}`引数を追加。渡された場合はそちらを優先し、省略時は従来通り保存済み設定(`getT2ISettingsState()`/`getI2ISettingsState()`)を使う(既存呼び出し元との後方互換を維持)。4箇所すべてのRunボタンのクリックハンドラで、モーダル/パネルに**今表示されているチェックボックス・ファイル名入力欄の値**をそのまま`wfOverride`として渡すよう変更。これにより「保存」ボタンは「次回モーダルを開いたときの初期値を保存する」という役割に純化され、Runは常に画面表示中の設定通りに実行されるようになった。 Kaptureで実機E2E確認済み: Comic Creator画面内のWorkflow Studioタブ経由で`boogu_t2i.json`を生成UIタブへ手動ロードし、T2Iモーダルで「デフォルトワークフローを使用する」をOFFにした状態(**「保存」ボタンは押さず**)でRunを実行。コンソールログで`[Eagle] Saved: Boogu_00005_.png`/`Boogu_00006_.png`(Booguモデル、boogu_t2i.json由来)を確認し、修正前に発生していた「ernie_t2i.jsonで実行される」問題が解消されたことを確認(test1作品、2コマとも成功)。検証後は「元に戻す」でtest1作品を挿入前の状態に復元済み。新規コード起因のコンソールエラーなし。v1.30.1としてリリース。 --- ## 2026-08-07(「画像を一括生成」(T2I)をI2I同様のモーダルに変更、ヘルプ更新、v1.30.0) ユーザーから「`ernie_t2i.json`をWorkflow Studioの生成UIタブに読み込んで実行したが、別のワークフローが実行されたようだ」との報告を受け調査。 **原因調査**: コードのバグではなく、ユーザーが手動でワークフローをロードしたのがComic Creator画面内に埋め込まれたWorkflow Studio(`wfmgallery-iframe`)ではなく、ブラウザの別タブとして独立に開いた`/wfm`だったことが原因と判明。Kaptureで両タブを確認したところ、Comic Creator内のiframe側は起動時に自動ロードされるデフォルトワークフロー(`2.json`)のままで、ユーザーが別タブでロードした`ernie_t2i.json`は反映されていなかった(同じURLでも別ブラウザタブ=別JS実行コンテキストのため状態が共有されない)。「画像を一括生成」(`requestPanelImageFromWorkflowStudio`)は「専用ワークフロー選択には未対応で常にGenerate UIに現在ロード中のワークフローをそのまま使う」設計だったため、iframe側の`2.json`がそのまま実行されていた。 **対応(ユーザー要望)**: - **T2I版「画像を一括生成」のモーダル化**: 既存の「画像を一括生成(I2I)」と同じ構成(全体Positive/Negativeプロンプト、「コマの画像プロンプトが空の場合はスルーする」チェック、デフォルトワークフロー指定)を持つ専用モーダルに変更。`_handleAutoImageGenerateClick`を`_runAutoImageGenerateT2I`+`_openAutoComicT2IModal`に置き換え(`26-auto-comic-bridge.js`)。I2I/Nanobananaモーダルと共有していたPositive結合ヘルパー`_composeI2IPositive`を`_composeOverallPrompt`へ汎用リネーム。 - `14-integrations.js`に、I2I/Inpaint設定と同じ独立パターンで`_t2iSettings`(localStorage `ccc_t2i_settings`)・`getT2ISettingsState`/`saveT2ISettingsState`を新設(T2I/I2I/Inpaintそれぞれ別々のデフォルトワークフローを持てる)。`requestPanelImageFromWorkflowStudio(prompt, width, height, negative)`を拡張し、T2I設定が有効な場合は実行前にワークフローJSONを取得してWorkflow Studio側へ渡すようにした。 - Workflow Studio側`gallery-tab.js`の`_wfmReceiveGenerateRequest`をI2I/Inpaintと同じパターンに拡張(`negative`・`workflowData`・`workflowFilename`引数を追加、詳細はComfyUI-Workflow-Studio側DEVLOG参照)。 - モーダル下部の見出しをI2Iと共通の「I2I設定」のまま流用していたところ紛らわしかったため、専用の「T2I設定」ラベル(`script.autoT2ISettingsHeading`)を追加。 - **ヘルプ更新(ja/en/zh)**: 「画像を一括生成」の説明をモーダル仕様に更新。「Workflow Studio連携について」の独立`
  • `を新設し、L/T2I/I2I連携機能が対象とするのはComic Creator画面内の「Workflow Studio」タブに埋め込まれたインスタンスであり、ブラウザの別タブ・別ウィンドウで開いたWorkflow Studioとは無関係である点を明記(今回の調査結果を踏まえた注意喚起)。「画像を一括生成(I2I)」の説明にDenoise指定は対応ワークフロー(denoiseパラメータを持つノードを含むもの)のみ有効という注記を追加。 Kaptureで実機E2E確認済み: T2Iモーダルの表示・入力保持(Positive/Negative/スルーチェック/デフォルトWF設定)を確認。`ccc_t2i_settings`が`ccc_i2i_settings`/`ccc_inpaint_settings`とは独立してlocalStorageに保存されることを確認。実際にComic Creator画面内のWorkflow Studioタブ経由で`ernie_t2i.json`をT2I設定のデフォルトワークフローに指定してRunを実行し、`/queue`監視・コンソールログで`ernie_t2i.json`のモデル(`Ernie-Image-Turbo`)による生成が実行されEagleへ保存されたことを確認(test1作品、2コマとも成功、レイアウトタブへ自動挿入)。検証後は「元に戻す」でtest1作品を挿入前の状態に復元済み。新規コード起因のコンソールエラーなし。ユーザー指示によりボタン名を「画像を一括生成」→「画像を一括生成(T2I)」に変更(i18n・ヘルプ・README 3言語とも追従)。v1.30.0としてリリース。 --- ## 2026-08-05(半自動マンガ「画像を一括生成(Nanobanana)」機能を追加、v1.29.0) `feature/semi-auto-comic-nanobanana`ブランチで作業。スクリプトタブの半自動マンガ作成機能に、既存の「画像を一括生成(I2I)」(Workflow Studio連携)と対になる、Nanobanana(Gemini画像生成API、CC自身が持つ独立タブ`nanobanana.js`と同じ連携)を使うバッチI2I生成機能を追加した。まずは既存I2Iモーダルとは別のボタン・別のモーダルとして実装し、バックエンド選択式の1モーダルへの統合は将来の検討課題とする。 - `auto-comic-core.js`に、既存`pickSdxlResolution`と同じ対数スケール比較ロジックの`pickNanobananaResolution(aspectRatio)`を追加。Nanobananaの解像度プリセット(5種類、値はSDXLと現状同一)から、コマのbboxアスペクト比に最も近いものを自動選択する。 - `nanobanana.js`の`NanobananaManager`内に埋め込まれていた「APIキー確認」「生成API呼び出し」「base64正規化+サーバー保存+Eagle自動保存」の3ロジックを、モジュールスコープの独立関数(`checkNanobananaKeyStatus`/`requestNanobananaGenerate`/`saveNanobananaImageAndMaybeEagle`)として切り出しexport。既存Nanobananaタブ自体もこれらを呼ぶ形にリファクタリングし、挙動を変えずに半自動マンガ側と共有できるようにした。 - `26-auto-comic-bridge.js`に「画像を一括生成(Nanobanana)」ボタン・モーダル(`_openAutoComicNanobananaModal`)・実行ロジック(`_runAutoImageGenerateNanobanana`)を追加。既存I2Iモーダルと同じ対象コマ絞り込み・Positive結合・`pushHistory`の設計を踏襲しつつ、モデル選択(3種)・I2I強度スライダー・接続状態表示を持つ。各コマの現在の画像を`_getPanelImageBlob`でラスタライズしdata URL化してNanobanana APIへ送信し、結果はコマのbboxへ`preserveAspectRatio:'none'`でストレッチ挿入する(T2I/I2Iバッチと同じスケール調整方式)。 - 判明した既存事実: `py/ccc.py`の`handle_nanobanana_generate`は`width`/`height`を実ピクセル指定ではなくアスペクト比文字列に変換してGeminiへ渡すのみで、`strength`パラメータは一切処理していない。既存Nanobananaタブのstrengthスライダーも現状バックエンド未反映であり、新モーダルのstrengthスライダーも同じ制約を引き継ぐ(バックエンド改修は今回スコープ外)。 - Kaptureで実機E2E確認済み: 既存Nanobananaタブの回帰なし(リファクタリング後も接続状態表示・生成が正常動作)、新モーダルのUI表示・入力項目がすべて正常、test1作品(半自動マンガ、2コマ)で実際にRunを実行し2コマとも生成成功→レイアウトタブへ自動切替→コマ全面へ隙間なくストレッチ挿入を確認。ネットワークログで`/api/ccc/nanobanana/generate`→`/api/ccc/save-nanobanana-image`→`/api/ccc/eagle/add`の呼び出し順序を確認(Eagle未起動環境のため`eagle/add`は500だったが、fire-and-forgetのため他コマの処理には影響せず両コマとも成功)。挿入された``の`href`が`data:image/...;base64,...`形式であること、および作品保存→リロード→再読込後も画像が壊れずに表示されることを確認(過去のblob URL永続化バグの再発なし)。新規コード起因のコンソールエラーなし。 - ヘルプ(ja/en/zh、「プロット」節に新規`
  • `)・README(3言語)を更新済み。バージョンアップ・mainへのマージ・プッシュは別途指示があるまで行わない。 - **追加修正: I2I強度スライダーを削除、「2K」生成トグルを追加(Nanobananaタブ・半自動マンガモーダル両方)。** ユーザー指示によりGemini画像生成APIの公式ドキュメント(`https://ai.google.dev/gemini-api/docs/image-generation`・`https://ai.google.dev/api/generate-content`)を確認した結果、(1) I2Iの変化度合いを数値で指定するパラメータ(denoising strength等)はAPIに一切存在せず、変化の強さはPositiveプロンプトの文章のみで制御する仕様であることが確定した。(2) `generateContent`エンドポイントの`GenerationConfig.imageConfig`(`ImageConfig`型)に、既存実装が使っている`aspectRatio`に加えて`imageSize`フィールド(`"1K"`/`"2K"`/`"4K"`、未指定時は`"1K"`)が存在することが判明した(モデルにより対応状況が異なり、`gemini-3.1-flash-lite-image`は`1K`のみ対応、`gemini-3.1-flash-image`/`gemini-3-pro-image`は`2K`/`4K`まで対応)。これを受けて、①`nanobanana.js`・`26-auto-comic-bridge.js`・`templates/index.html`から`nanobanana-i2i-strength`スライダー(UIのみでバックエンド未反映だった)を削除、②`py/ccc.py`の`handle_nanobanana_generate`に`image_size`リクエストパラメータを追加し`imageConfig.imageSize`へ渡すよう変更、③両UIの解像度セレクト隣に「2K」チェックボックスを追加(選択したアスペクト比を維持したまま約2倍相当の解像度で生成、対応モデル選択時のみ有効)。i18nキー`nb.i2iStrength`を`nb.2kLabel`/`nb.2kHint`に置き換え(3言語)。Kaptureで確認したところ、JS側(UIの表示・strength削除・リクエストペイロードへの`image_size`付与)は正常動作を確認したが、`py/ccc.py`の変更はComfyUIのカスタムノードロード方式上サーバー再起動が必要だった(ユーザーが再起動を実施)。再起動後、Nanobananaタブで`gemini-3.1-flash-image`モデル+「2K」ONで生成→`naturalWidth`/`naturalHeight`が2048×2048(既定の1024×1024から狙い通り2倍)になることを確認。`gemini-3.1-flash-lite-image`(2K非対応)では従来通り1024×1024のまま生成されることも確認済み。半自動マンガのNanobananaモーダルでも同モデル+2K ONでtest1作品の2コマに対しRunを実行し、2件とも生成成功→コマのbboxへスケール調整挿入(挿入された``のdata URL長が従来の1K生成時(26万〜100万文字程度)に対し2K生成時は245万〜360万文字程度と明確に大きく、高解像度化を確認)。両モーダルとも新規コード起因のコンソールエラーなし。 --- ## 2026-08-05(Imageタブヘルプの翻訳漏れ修正・レイアウトタブ表示サイズの不連続ジャンプ修正・アセットパネル「P」タブ更新漏れ修正、v1.28.0) ユーザー報告の3件に対応。いずれもバグ修正で、未リリースの下記「3Dポーズタブに風エフェクト」(2026-08-04)と合わせてv1.28.0としてまとめてリリースする。 **1. Imageタブヘルプの翻訳漏れ修正**: ユーザーが以前のセッションで見つけていた「Imageタブ『アクションバー: 開始/終了』見出しの『下書き』ボタンの説明が英語・中国語版に欠けている」を確認・修正。`22-help-tab.js`の日本語版(163行目)には`Upload`/`New`/**下書き**/`Close`の4項目があったが、英語版(`Action Bar: Start/End`)・中国語版(`操作栏:开始/结束`)には`Upload`/`New`/`Close`の3項目しかなく、下書きボタンの説明が丸ごと欠落していた。また関連するもう1箇所、「アクションバー: 保存系ボタンの違い」の「レイアウトに送る」説明末尾にある「ただし『下書き』ボタンで作成したキャンバスは例外で、常に下書きレイヤーへページ全面サイズで挿入される」という一文も英語・中国語版に反映されていなかった。日本語版の内容に合わせて両言語とも追記し、3言語を揃えた。 **2. レイアウトタブ「表示サイズ」スライダーの不連続ジャンプ修正**: 「表示100%から105%に変更すると数値とかけ離れた大きさになる」という報告を受け調査。`02-assets.js`の`_applyLayoutPreviewSize(pct)`が、`pct <= 100`のときだけ`max-height:80vh`を適用し、101%以上では丸ごと解除する実装になっていたのが原因。100%ちょうどの時点では高さ制限によりSVGの実効表示幅が縮小されていたため、101%になった瞬間に制限が消えて「親コンテナ幅のpct%」がそのまま適用され、Kaptureでの実測でも100%→105%で幅572px→822px相当(本来なら601px、5%増のはず)まで跳ね上がることを確認した。修正としてSVGのviewBoxから求めた本来の縦横比をもとに、「コンテナ幅」と「高さ80vh」のうち小さい方を100%の基準サイズとし、pctをその基準への倍率として一貫適用するようCSSの`min()`/`calc()`で書き換えた(`max-height`の分岐は撤廃し常に`none`に)。線形性により、これは実質「pctによらず常にどちらか一方の制約だけが効く」計算と数学的に同一になるため、ウィンドウリサイズにも追従する。Kaptureで100%→105%(572.57→601.20px、809.77→850.26px、いずれも正確に×1.05)、25%(正常縮小)、300%(正常拡大・横スクロールバー機能)を実機確認済み。新規コードに起因するコンソールエラーなし。 **3. アセットパネル「P」タブの更新漏れ修正**: 「レイアウトタブでPタブ(ページサムネイル一覧)を表示している状態のまま他タブへ移動し、そちらでページ関連の操作(保存・並び替え・リネーム・削除・作品切替等)をしてからレイアウトタブに戻ると、Pタブの中身が移動前のまま更新されず違和感がある」という報告を受け調査。`01-state.js`の`switchTab()`は、`tabId === 'layout'`で戻ってきた際に`renderLayoutTab()`(メインキャンバス)と`renderAssetFontGrid()`のみを再描画しており、`renderPageThumbGrid()`(Pタブの中身)は呼んでいなかったことが原因。他タブでの変更自体は`07-pages.js`の`renderPageSelector()`経由で`state.pages`やDOM(`#page-thumb-grid`)には正しく反映されるが、レイアウトタブに戻るだけではその再描画がトリガーされない設計だった。`switchTab()`のレイアウトタブ復帰処理に、アセットパネルの現在のアクティブタブが`pages`の場合のみ`renderPageThumbGrid()`を呼ぶ分岐を追加。 --- ## 2026-08-04(3Dポーズタブに風エフェクト(そよ風・発生源マーカー)の操作ボタンを追加、v1.28.0) comfyui-vrm-pose-editor側(開発元: `vrmpose_light_plus_2\3dpose_light_editor`)に新規実装された「風エフェクト」機能へ、Comic Creator側のUIを追従させた。ユーザーからの「Workflow Studioのレイアウトタブの3Dポーズ機能の更新も必要か」という質問を受けて調査したところ、Workflow Studio自体には3Dポーズ機能が無く、実体はComic Creator側のレイアウトタブ「3Dポーズ」サブタブであることが判明。そちらへの追加対応を行った。 **背景(comfyui-vrm-pose-editor側の新機能)**: `pose_editor_core.js`に、VRMの揺れボーン(髪・スカート等)へthree-vrmのgravityDir/gravityPowerを毎フレーム上書きする方式でsin波合成のそよ風を加える機能(`_windEnabled`等、editor APIとして`getWindEnabled()/toggleWindEnabled()/getWindStrength()/setWindStrength()/getWindDirection()/setWindDirection()/getWindTurbulence()/setWindTurbulence()`)と、視線(LookAt)機能と同じ仕組みでドラッグ可能な3Dコーンから風向きを指定できる「発生源マーカー」機能(`getWindSourceEnabled()/toggleWindSourceEnabled()`)が追加された。 **Comic Creator側の対応**: Comic Creatorは`pose_editor_core.js`・`light_editor.js`・`pose_library.js`のみを`/extensions/comfyui-vrm-pose-editor/`経由の動的importで参照しており(`pose_editor_3d.js`のツールバーDOMには依存していない)、独自のツールバーHTML(`templates/index.html`、`pose3d-lookat-btn`等)とイベントハンドラ(`static/js/main/23-pose3d-bridge.js`)からeditor APIを個別に呼び出す設計になっている。そのため今回のAPI追加だけではUI操作ができず、過去の視線・揺れ物理トグル追加時と同様、対となるUIボタンを手動で追加する必要があった。 - `templates/index.html`: `pose3d-springbone-btn`(🎐揺れ)の直後に`pose3d-wind-btn`(🌬 風)・`pose3d-windsource-btn`(🧭 発生源)ボタンを追加。 - `static/js/main/23-pose3d-bridge.js`: `initPose3DTab()`内でDOM取得を追加し、既存の`lookAtBtn`/`springBoneBtn`と同じパターン(`editor.toggleXxx()`→ボタンのtextContent・背景色を更新)でイベントハンドラを追加。 - `static/js/i18n.js`: `layout.pose3dWindTitle`/`layout.pose3dWindSourceTitle`を日本語・英語・中国語の3言語で追加。 - 強さ・向き・そよぎの詳細パラメータ調整、発生源マーカーONの間の「向き」スライダー無効化は、既存の`pose3d-light-btn`(ライトエディタ)経由でそのまま利用可能(`light_editor.js`自体を動的importしているだけのため、Comic Creator側の追加実装なしで自動的に反映される)。 **検証**: Kaptureで実機確認済み。レイアウトタブ→3Dポーズサブタブ→コマに配置後、「風」ボタンで`editor.toggleWindEnabled()`が呼ばれボタンが青くハイライトすること、「発生源」ボタンで`editor.toggleWindSourceEnabled()`が呼ばれ3Dビュー(`pose3d-canvas`)内にオレンジのコーンマーカーが実際に表示されることを確認。新規コードに起因するコンソールエラーは発生しなかった。なお、このタブでは「default model」の自動ロードがComic Creator側の既存の仕様(baseUrl解決)により404になる(今回の変更とは無関係の既存の挙動)ため、実VRMモデルでの揺れ確認はできていない。 **ドキュメント**: ヘルプ(`22-help-tab.js`、日英中3言語)の「3Dポーズサブタブ」節に「🌬 風」「🧭 発生源」の説明を追加。あわせて、日本語版にのみ存在し英語・中国語版では抜けていた「👁 視線」「🎐 揺れ」の説明も今回3言語で揃えた。README(3言語)の「3D ポーズ」機能概要にも風エフェクトの記載を追加済み。リリースはユーザー判断で後日行う予定。 **重大な不具合と修正**: 上記ヘルプ更新の直後、ユーザーから「ページタブの作品管理で作品一覧が表示されない。新規作成・テンプレートタブ・レイアウトタブも開かない」という報告があり調査した。原因は`22-help-tab.js`の英語版ヘルプ本文(3Dポーズサブタブ節、今回追加した「👁 LookAt」「🎐 Sway」「🌬 Wind」の説明文)に含まれる`model's`/`marker's`という所有格のアポストロフィが**エスケープされずに生のまま**JS文字列リテラル(`'...'`)内に混入していたこと。文字列がそこで終端したとブラウザのパーサーに誤認識され、`SyntaxError: Unexpected identifier 's'`でモジュール評価そのものが失敗し、ヘルプタブどころか作品管理・テンプレート・レイアウトタブまで巻き込んで全機能が使用不能になっていた。`node --check`ではなぜかこの構文エラーが検出されず(トークン列としてたまたま成立してしまっていたためと推測)、実際にブラウザで評価して初めて顕在化する類のバグだった。 - **原因特定**: `git stash`で今回の全変更を一時退避してエラーが消えることを確認したのち、`git checkout stash@{0} -- `で1ファイルずつ復元しながらKaptureでブラウザの再現確認を繰り返す二分探索で`22-help-tab.js`に絞り込んだ。ファイルサイズ・ネットワークレスポンスのバイト完全一致も確認し、文字化けやキャッシュ起因ではないことを先に排除した。 - **修正**: 該当3箇所の`model's`/`marker's`を`model\'s`/`marker\'s`にエスケープ。中国語版・日本語版には所有格アポストロフィ表現自体が存在しないため、他言語への修正は不要だった。 - **教訓**: JS文字列リテラルへ長文の英語説明文を追加する際は、`node --check`が通っても実ブラウザでの構文的な健全性の担保にはならない場合がある。所有格・短縮形のアポストロフィ(`'s`、`doesn't`等)を含む英文をシングルクォート文字列へ追加するときは特に注意する。 - **検証**: 修正後、`node --check`・実ブラウザともにエラーが解消し、Kaptureで「作品管理」の作品一覧・「テンプレート」タブのサムネイル一覧・「レイアウト」タブ(ツールペイン・レイヤーパネル含む)がすべて正常に表示・動作することを確認した。3Dポーズサブタブの🌬/🧭ボタンも引き続き正しく表示されることを確認済み。 --- ## 2026-08-04(プロットに「フキダシ形状」列を追加、セリフごとに自動生成の形状を指定可能に、v1.27.0) ユーザー依頼「プロットにフキダシ形状指定の列を追加したい。セリフごとにドロップダウンで選択可能とし、フキダシを自動生成ボタンで指定のフキダシ形状で作成したい。指定がない場合は現在の矩形で作成としたい。」に対応。Phase 1設計時点で「今回は見送り」としていた項目([[feature-semi-auto-manga-creation]]参照)を実装した。 **データ構造**: `21a-script-manga.js`のセリフオブジェクトに`shape`フィールドを追加(`{character, text, shape}`)。値は空文字(未指定=自動生成時は角丸矩形にフォールバック)または`normal`/`rect`/`thought`/`bomb`/`cloudpuffy`/`cloudwavy`(`09c-balloon-handles.js`の`h2-shape-type`セレクトと同じ6値)。`_scriptMangaBlankDialogue()`・`_scriptMangaNormalize()`を更新し、旧形式データ(`shape`フィールドなし)は読込時に自動的に空文字(既定=角丸矩形)へ補完される。 **UI**: プロットのコマワリテーブルに列を追加(シーン|コマ番|画像プロンプト|セリフ番|要素|セリフ/説明等|**フキダシ形状**の7列)。各セリフ行に`