Compare commits

...
1 Commits
Author SHA1 Message Date
ketle-manandClaude Sonnet 4.6 e7fdfc41ad Redesign GenerateUI tab layout: 3-tab structure with inline Raw JSON (v0.2.4)
- Reorganized from 5 tabs (Prompt/Image/Model/Settings/Raw JSON) to 3 tabs (Input/Model/Settings)
- Each tab shows a Raw JSON column (540px) for instant preview and direct editing from any tab
- Input tab: Prompt (top) + Image (bottom) stacked vertically in left column
- Model tab: model selectors with filter in left column
- Settings tab: KSampler (top) + LatentImage (bottom) stacked vertically in left column
- Raw JSON widget shared across tabs via DOM appendChild on tab switch
- Right column slimmed to 280px: Generate/Seed/Results only
- Docs: DEVLOG, README, i18n help keys, index.html help tab updated for v0.2.4

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 18:01:45 +09:00
8 changed files with 255 additions and 75 deletions
+43
View File
@@ -1,5 +1,48 @@
# DEVLOG - ComfyUI-Workflow-Studio
## 2026-03-29: v0.2.4 GenerateUIタブ レイアウト再設計
### 概要
- GenerateUIのサブタブを5タブ(Prompt/Image/Model/Settings/RawJSON)→ 3タブ(Input/Model/Settings)に整理
- 各タブ内にRaw JSONエディタを右列として常時表示。どのタブでもJSON変更をリアルタイム確認・直接編集・Apply可能
- Raw JSONタブを廃止(独立タブとしての Raw JSON は不要)
- 右列(生成コントロール)はGenerate/Seed/結果画像のみにスリム化
### 変更内容
#### `templates/index.html` — タブ構成刷新
- **Inputタブ**: 左列=Prompt(上段)+ Image(下段)の縦2段、右列=Raw JSON(540px)
- **Modelタブ**: 左列=モデル選択フォーム(スクロール)、右列=Raw JSON(540px)
- **Settingsタブ**: 左列=KSampler(上段)+ LatentImage(下段)の縦2段、右列=Raw JSON(540px)
- Raw JSONのDOMノード(`wfm-gen-rawjson-widget`)はページ内に1つ定義し、タブ切替時にJSで対応する列へ移動
- 右列(`.wfm-gen-right`): 280px幅、Generate/Stop/Progress/Seed+結果画像のみ
#### `static/js/generate-tab.js` — タブ切替時にRaw JSONを移動
- `moveRawJsonToTab(tabKey)` 追加: `wfm-gen-rawjson-widget` を `wfm-gen-rawjson-col-{tabKey}` へ `appendChild`
- 初期表示(Input)とタブクリック時に自動移動
#### `static/js/comfyui-editor.js` — Settings縦2段化
- `renderSettingsTab`: KSampler / LatentImageを横2列グリッド → 縦2段(`flex-direction:column`)に変更
- `renderAll` の末尾に `_syncRawJson()` 追加(ワークフロー読込直後にRaw JSONが即時反映)
#### `static/css/main.css` — 新レイアウト用スタイル
- `.wfm-gen-tab-cols`: タブ内2列レイアウト(flex行)
- `.wfm-gen-params-col`: 左サブ列(flex:1、縦積み)
- `.wfm-gen-params-col--scroll`: Model/Settings用スクロール変種
- `.wfm-gen-params-section`: Input用上下2段の各セクション(flex:1、overflow-y:auto)
- `.wfm-gen-rawjson-col`: Raw JSON列(540px固定幅)
- `#wfm-gen-rawjson-widget` / `.wfm-gen-rawjson-header` / `.wfm-gen-rawjson-editor`: Raw JSONウィジェットスタイル
### 技術的な判断
- **Raw JSONをDOMで移動**: タブごとにtextareaのIDは1つである必要があるため、DOMノードをappendChildで移動する方式を採用。イベントリスナーはノードに付いたまま引き継がれる
- **Raw JSON列幅540px**: テキストエディタとして十分な視認性を確保しつつ、パラメータ列にも十分な幅を残す設定
---
## 2026-03-29: v0.2.3 バッジ統一・GenUI Model・サイドパネルModels拡充
### 概要
+13 -4
View File
@@ -5,7 +5,7 @@ A comprehensive workflow management and generation UI plugin for [ComfyUI](https
Browse, organize, and execute workflows directly from a dedicated studio interface — without switching between windows or manually editing JSON.
![Workflow Studio](https://img.shields.io/badge/ComfyUI-Custom_Node-blue)
![Version](https://img.shields.io/badge/version-0.2.3-green)
![Version](https://img.shields.io/badge/version-0.2.4-green)
## Screenshots
@@ -50,11 +50,14 @@ Browse, organize, and execute workflows directly from a dedicated studio interfa
- **Embedded workflow metadata** — workflow JSON is embedded in the PNG (tEXt chunk), compatible with ComfyUI's drag-and-drop import
- **Auto-import** — the captured workflow is automatically imported and appears in the Workflow tab
### GenerateUI Tab
- **Auto-generated parameter UI** — prompt, model, sampler, image, and other settings extracted from the workflow
### GenerateUI Tab (v0.2.4)
- **3-tab layout** — Input / Model / Settings tabs, each with a Raw JSON column on the right for instant preview and direct editing
- **Input tab** — Prompt (top) and Image drag-and-drop (bottom) in the left column; Raw JSON (540px) in the right column
- **Model tab** — Checkpoint, VAE, LoRA, ControlNet, UNET, TextEncoder selectors with filter; Raw JSON on the right
- **Settings tab** — KSampler (top) and LatentImage (bottom) in the left column; Raw JSON on the right
- **Always-visible Raw JSON** — edit the API-format JSON directly from any tab with syntax highlighting; Apply button reloads the workflow
- **One-click generation** — queue prompts to ComfyUI without leaving the studio
- **Seed control** — randomize, lock, or manually set seeds
- **Raw JSON editor** — view and edit the API-format JSON with syntax highlighting
- **UI-to-API conversion** — automatic conversion supporting subgraphs (nested workflows), COMBO types, and display-only node exclusion
- **Eagle integration** — auto-save generated images to [Eagle](https://eagle.cool/) with metadata
@@ -188,6 +191,12 @@ Click the **camera icon** (next to the W button) in ComfyUI's top bar to capture
## Changelog
### v0.2.4
- **GenerateUI tab redesign** — reorganized from 5 tabs (Prompt/Image/Model/Settings/Raw JSON) to 3 tabs (Input/Model/Settings); each tab shows a Raw JSON column (540px) for instant JSON preview and direct editing from any tab
- **Input tab** — Prompt and Image stacked vertically in the left column
- **Settings tab** — KSampler and LatentImage stacked vertically in the left column
- **Raw JSON tab removed** — Raw JSON is now always visible as a right-column panel within each tab
### v0.2.3
- **Badge system unified** — Workflow and Models tabs now share a single badge palette (`⚙ Badge` button); workflow auto-analysis model type system removed in favor of user-defined free-label badges
- **GenUI Model button** — apply any model from the Models tab directly to the corresponding node in GenerateUI's current workflow (available in detail modal and side panel; Checkpoint / LoRA / VAE / ControlNet / UNET / TextEncoder)
+96 -12
View File
@@ -505,11 +505,12 @@ body {
}
.wfm-gen-right {
width: 360px;
width: 280px;
flex-shrink: 0;
display: flex;
flex-direction: column;
overflow-y: auto;
border-left: 1px solid var(--wfm-border);
padding: 12px;
gap: 12px;
}
@@ -546,13 +547,55 @@ body {
.wfm-gen-subtab-content {
display: none;
padding: 12px 16px;
overflow-y: auto;
flex: 1;
overflow: hidden;
}
.wfm-gen-subtab-content.active {
display: block;
display: flex;
}
/* ── Tab inner layout: params col + rawjson col ── */
.wfm-gen-tab-cols {
display: flex;
flex: 1;
overflow: hidden;
}
/* Left sub-column: parameter controls */
.wfm-gen-params-col {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
border-right: 1px solid var(--wfm-border);
}
/* Scrollable variant (Model / Settings single-section) */
.wfm-gen-params-col--scroll {
overflow-y: auto;
padding: 12px 14px;
}
/* Stacked sections inside params col (Input: Prompt on top, Image below) */
.wfm-gen-params-section {
flex: 1;
overflow-y: auto;
padding: 10px 14px;
min-height: 0;
}
.wfm-gen-params-section--top-border {
border-top: 1px solid var(--wfm-border);
}
/* Right sub-column: Raw JSON */
.wfm-gen-rawjson-col {
width: 540px;
flex-shrink: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.wfm-gen-status {
@@ -572,13 +615,6 @@ body {
color: var(--wfm-danger);
}
.wfm-gen-panel {
background: var(--wfm-surface);
border: 1px solid var(--wfm-border);
border-radius: var(--wfm-radius);
padding: 12px;
}
.wfm-gen-progress-container {
display: flex;
align-items: center;
@@ -609,8 +645,56 @@ body {
text-align: right;
}
.wfm-gen-result {
/* Raw JSON widget (shared, moved between tabs by JS) */
#wfm-gen-rawjson-widget {
flex: 1;
min-height: 0;
}
.wfm-gen-rawjson-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 10px;
background: var(--wfm-bg-secondary);
border-bottom: 1px solid var(--wfm-border);
flex-shrink: 0;
}
.wfm-gen-rawjson-label {
font-size: 12px;
font-weight: 600;
color: var(--wfm-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.wfm-gen-rawjson-editor {
flex: 1 !important;
height: auto !important;
}
.wfm-gen-col-title {
font-size: 12px;
font-weight: 600;
margin: 0 0 10px 0;
color: var(--wfm-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 1px solid var(--wfm-border);
padding-bottom: 6px;
}
/* Generation panel in right column */
.wfm-gen-panel {
background: var(--wfm-surface);
border: 1px solid var(--wfm-border);
border-radius: var(--wfm-radius);
padding: 12px;
flex-shrink: 0;
}
.wfm-gen-result {
display: flex;
flex-direction: column;
align-items: center;
+1
View File
@@ -256,6 +256,7 @@ function applyI18nToHtml() {
"wfm-help-gen-1": "helpGen1", "wfm-help-gen-2": "helpGen2",
"wfm-help-gen-3": "helpGen3", "wfm-help-gen-4": "helpGen4",
"wfm-help-gen-5": "helpGen5", "wfm-help-gen-6": "helpGen6", "wfm-help-gen-7": "helpGen7",
"wfm-help-gen-8": "helpGen8", "wfm-help-gen-9": "helpGen9", "wfm-help-gen-10": "helpGen10",
"wfm-help-prompt-1": "helpPrompt1", "wfm-help-prompt-2": "helpPrompt2",
"wfm-help-prompt-3": "helpPrompt3", "wfm-help-prompt-4": "helpPrompt4",
"wfm-help-prompt-5": "helpPrompt5", "wfm-help-prompt-6": "helpPrompt6",
+5 -4
View File
@@ -61,6 +61,7 @@ export const comfyEditor = {
this.renderImageTab(analysis, "wfm-gen-image-fields");
this.renderModelTab(analysis, "wfm-gen-model-fields");
this.renderSettingsTab(analysis, "wfm-gen-settings-fields");
_syncRawJson();
},
renderPromptTab(analysis, containerId) {
@@ -208,9 +209,9 @@ export const comfyEditor = {
const latent = analysis.latent_nodes?.[0];
el.innerHTML = `
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
<div>
<h3 style="font-size:14px;margin-bottom:12px;">KSampler</h3>
<div style="display:flex;flex-direction:column;gap:0;">
<div style="padding-bottom:14px;border-bottom:1px solid var(--wfm-border);margin-bottom:14px;">
<h3 style="font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;color:var(--wfm-text-secondary);margin:0 0 12px;">KSampler</h3>
${sampler ? `
<input type="hidden" id="wfm-settings-sampler-id" value="${sampler.id}">
<div class="wfm-form-group">
@@ -245,7 +246,7 @@ export const comfyEditor = {
` : "<p class='wfm-placeholder'>No KSampler node found</p>"}
</div>
<div>
<h3 style="font-size:14px;margin-bottom:12px;">Latent Image</h3>
<h3 style="font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;color:var(--wfm-text-secondary);margin:0 0 12px;">Latent Image</h3>
${latent ? `
<input type="hidden" id="wfm-settings-latent-id" value="${latent.id}">
<div class="wfm-form-group">
+15 -1
View File
@@ -246,6 +246,16 @@ export async function initGenerateTab() {
showToast("Interrupted", "info");
});
// Move shared Raw JSON widget into the active tab's rawjson-col
function moveRawJsonToTab(tabKey) {
const widget = document.getElementById("wfm-gen-rawjson-widget");
const col = document.getElementById(`wfm-gen-rawjson-col-${tabKey}`);
if (widget && col) {
col.appendChild(widget);
widget.style.display = "flex";
}
}
// Subtab navigation
document.querySelectorAll(".wfm-gen-subtab-btn").forEach((btn) => {
btn.addEventListener("click", () => {
@@ -254,10 +264,14 @@ export async function initGenerateTab() {
btn.classList.add("active");
document.querySelectorAll(".wfm-gen-subtab-content").forEach((c) => c.classList.remove("active"));
document.getElementById(`wfm-gen-subtab-${target}`)?.classList.add("active");
moveRawJsonToTab(target);
});
});
// Raw JSON apply
// Initial placement: move to first active tab (input)
moveRawJsonToTab("input");
// Raw JSON apply (always-visible panel in right column)
document.getElementById("wfm-gen-apply-raw-btn")?.addEventListener("click", async () => {
const textarea = document.getElementById("wfm-gen-raw-json");
if (!textarea) return;
+24 -15
View File
@@ -301,11 +301,14 @@ const LANGUAGES = {
helpWf7: "Badge management: add, rename, delete badges with custom colors shared with the Models tab (⚙ Badge button)",
helpGen1: "Connect/disconnect ComfyUI and check connection status",
helpGen2: "Load workflows from Workflow tab (App format .app.json not supported)",
helpGen3: "Edit parameters: Prompt, Image (drag & drop), Model (checkpoint/VAE/LoRA/ControlNet with filter), Settings (steps/CFG/sampler/scheduler/resolution), Raw JSON",
helpGen4: "Seed control: random, fixed, increment, decrement",
helpGen5: "Generate, progress display, and stop",
helpGen6: "View results with main image and thumbnail history",
helpGen7: "Eagle integration: auto-save generated images to Eagle",
helpGen3: "3-tab layout — Input (Prompt + Image), Model, Settings — each with a Raw JSON column for instant preview and direct editing",
helpGen4: "Input tab: Prompt (top) and Image drag-and-drop (bottom) in the left column",
helpGen5: "Model tab: Checkpoint, VAE, LoRA, ControlNet, UNET, TextEncoder selectors with filter",
helpGen6: "Settings tab: KSampler (top) and LatentImage (bottom) in the left column",
helpGen7: "Raw JSON always visible in the right column of each tab — edit directly and Apply to reload the workflow",
helpGen8: "Seed control: random, fixed, increment, decrement",
helpGen9: "Generate, progress display, stop, and view results",
helpGen10: "Eagle integration: auto-save generated images to Eagle",
helpPrompt1: "AI assistant (Ollama): model selection, chat for prompt consultation, image attachment (vision models)",
helpPrompt2: "Apply AI responses to GenerateUI prompts",
helpPrompt3: "Translation: JA\u2194EN, ZH\u2194EN",
@@ -759,11 +762,14 @@ const LANGUAGES = {
helpWf7: "バッジ管理:バッジの追加・名前変更・削除、カスタム色設定(Modelsタブと共有)— ⚙ Badgeボタン",
helpGen1: "ComfyUIの接続・切断、接続状態の確認",
helpGen2: "Workflowタブからワークフローを読み込み(App形式 .app.json は非対応)",
helpGen3: "パラメータ編集:プロンプト、画像(ドラッグ&ドロップ)、モデル(checkpoint/VAE/LoRA/ControlNet、フィルタ検索)、設定(Steps/CFG/サンプラー/スケジューラ/解像度)、Raw JSON",
helpGen4: "シード管理:ランダム / 固定 / 増加 / 減少",
helpGen5: "画像生成、進捗表示、生成停止",
helpGen6: "メイン画像とサムネイル履歴で結果表示",
helpGen7: "Eagle連携:生成画像をEagleへ自動保存",
helpGen3: "3タブ構成 — Input(プロンプト+画像)、Model、Settings — 各タブにRaw JSON列を常時表示",
helpGen4: "Inputタブ:左列にPrompt(上段)+ Image ドラッグ&ドロップ(下段)",
helpGen5: "Modelタブ:Checkpoint/VAE/LoRA/ControlNet/UNET/TextEncoderのセレクタ(フィルタ検索付き)",
helpGen6: "Settingsタブ:左列にKSampler(上段)+ LatentImage(下段)",
helpGen7: "Raw JSONを各タブの右列に常時表示 — 直接編集してApplyでワークフロー即時反映",
helpGen8: "シード管理:ランダム / 固定 / 増加 / 減少",
helpGen9: "画像生成、進捗表示、生成停止、結果表示",
helpGen10: "Eagle連携:生成画像をEagleへ自動保存",
helpPrompt1: "AIアシスタント(Ollama):モデル選択、チャットでプロンプト相談、画像添付(ビジョンモデル対応)",
helpPrompt2: "AIの応答をGenerateUIのプロンプトに適用",
helpPrompt3: "翻訳機能:日⇔英、中⇔英",
@@ -1213,11 +1219,14 @@ const LANGUAGES = {
helpWf7: "徽章管理:添加、重命名、删除徽章并自定义颜色(与Models标签共享)— ⚙ Badge按钮",
helpGen1: "连接/断开ComfyUI,检查连接状态",
helpGen2: "从工作流标签页加载工作流(不支持App格式.app.json)",
helpGen3: "编辑参数:提示词、图片(拖放)、模型(checkpoint/VAE/LoRA/ControlNet含筛选)、设置(Steps/CFG/采样器/调度器/分辨率)、Raw JSON",
helpGen4: "种子管理:随机/固定/递增/递减",
helpGen5: "生成图片、进度显示、停止生成",
helpGen6: "主图和缩略图历史查看结果",
helpGen7: "Eagle集成:自动保存生成图片到Eagle",
helpGen3: "3标签布局 — Input(提示词+图片)、Model、Settings — 每个标签含Raw JSON列实时预览",
helpGen4: "Input标签:左列为Prompt(上)+ Image拖放(下)",
helpGen5: "Model标签:Checkpoint/VAE/LoRA/ControlNet/UNET/TextEncoder选择器(含筛选)",
helpGen6: "Settings标签:左列为KSampler(上)+ LatentImage(下)",
helpGen7: "Raw JSON在每个标签右列常驻显示 — 直接编辑并Apply即时重载工作流",
helpGen8: "种子管理:随机/固定/递增/递减",
helpGen9: "生成图片、进度显示、停止生成、查看结果",
helpGen10: "Eagle集成:自动保存生成图片到Eagle",
helpPrompt1: "AI助手(Ollama):模型选择、聊天咨询提示词、图片附件(视觉模型)",
helpPrompt2: "将AI回复应用到生成UI的提示词",
helpPrompt3: "翻译功能:日\u2194英、中\u2194英",
+58 -39
View File
@@ -279,53 +279,57 @@
<!-- Editor Layout -->
<div class="wfm-gen-layout">
<!-- Left Column: Parameter Editor -->
<!-- Left Column: Parameter Tabs -->
<div class="wfm-gen-left">
<!-- Subtab Navigation -->
<!-- Tab Navigation -->
<div class="wfm-gen-subtab-nav">
<button class="wfm-gen-subtab-btn active" data-subtab="prompt">Prompt</button>
<button class="wfm-gen-subtab-btn" data-subtab="image">Image</button>
<button class="wfm-gen-subtab-btn active" data-subtab="input">Input</button>
<button class="wfm-gen-subtab-btn" data-subtab="model">Model</button>
<button class="wfm-gen-subtab-btn" data-subtab="settings">Settings</button>
<button class="wfm-gen-subtab-btn" data-subtab="raw">Raw JSON</button>
</div>
<!-- Subtab: Prompt -->
<div id="wfm-gen-subtab-prompt" class="wfm-gen-subtab-content active">
<div id="wfm-gen-prompt-fields">
<p class="wfm-placeholder">Load a workflow to edit prompts</p>
<!-- Tab: Input — left sub-col: Prompt(top)+Image(bottom), right sub-col: Raw JSON -->
<div id="wfm-gen-subtab-input" class="wfm-gen-subtab-content active">
<div class="wfm-gen-tab-cols">
<div class="wfm-gen-params-col">
<div class="wfm-gen-params-section">
<h3 class="wfm-gen-col-title">Prompt</h3>
<div id="wfm-gen-prompt-fields">
<p class="wfm-placeholder">Load a workflow to edit prompts</p>
</div>
</div>
<div class="wfm-gen-params-section wfm-gen-params-section--top-border">
<h3 class="wfm-gen-col-title">Image</h3>
<div id="wfm-gen-image-fields">
<p class="wfm-placeholder">Load a workflow to set input images</p>
</div>
</div>
</div>
<div class="wfm-gen-rawjson-col" id="wfm-gen-rawjson-col-input"></div>
</div>
</div>
<!-- Subtab: Image Input -->
<div id="wfm-gen-subtab-image" class="wfm-gen-subtab-content">
<div id="wfm-gen-image-fields">
<p class="wfm-placeholder">Load a workflow to set input images</p>
</div>
</div>
<!-- Subtab: Model -->
<!-- Tab: Model — left sub-col: model selects, right sub-col: Raw JSON -->
<div id="wfm-gen-subtab-model" class="wfm-gen-subtab-content">
<div id="wfm-gen-model-fields">
<p class="wfm-placeholder">Load a workflow to edit models</p>
<div class="wfm-gen-tab-cols">
<div class="wfm-gen-params-col wfm-gen-params-col--scroll">
<div id="wfm-gen-model-fields">
<p class="wfm-placeholder">Load a workflow to edit models</p>
</div>
</div>
<div class="wfm-gen-rawjson-col" id="wfm-gen-rawjson-col-model"></div>
</div>
</div>
<!-- Subtab: Settings -->
<!-- Tab: Settings — left sub-col: KSampler(top)+LatentImage(bottom), right sub-col: Raw JSON -->
<div id="wfm-gen-subtab-settings" class="wfm-gen-subtab-content">
<div id="wfm-gen-settings-fields">
<p class="wfm-placeholder">Load a workflow to edit settings</p>
</div>
</div>
<!-- Subtab: Raw JSON -->
<div id="wfm-gen-subtab-raw" class="wfm-gen-subtab-content">
<div style="margin-bottom:8px;">
<button id="wfm-gen-apply-raw-btn" class="wfm-btn wfm-btn-sm">Apply JSON</button>
</div>
<div class="wfm-json-container" style="height:500px;">
<pre id="wfm-gen-raw-json-highlight" class="wfm-json-highlight"></pre>
<textarea id="wfm-gen-raw-json" class="wfm-json-editor" spellcheck="false" placeholder="Paste workflow JSON here..."></textarea>
<div class="wfm-gen-tab-cols">
<div class="wfm-gen-params-col wfm-gen-params-col--scroll">
<div id="wfm-gen-settings-fields">
<p class="wfm-placeholder">Load a workflow to edit settings</p>
</div>
</div>
<div class="wfm-gen-rawjson-col" id="wfm-gen-rawjson-col-settings"></div>
</div>
</div>
</div>
@@ -350,7 +354,7 @@
<!-- Seed -->
<div style="display:flex;gap:8px;align-items:center;margin-top:8px;">
<label style="font-size:12px;color:var(--wfm-text-secondary);white-space:nowrap;">Seed:</label>
<input type="number" id="wfm-gen-seed-value" class="wfm-input" value="-1" style="width:140px;">
<input type="number" id="wfm-gen-seed-value" class="wfm-input" value="-1" style="width:130px;">
<select id="wfm-gen-seed-mode" class="wfm-select" style="width:auto;">
<option value="random">Random</option>
<option value="fixed">Fixed</option>
@@ -367,6 +371,18 @@
</div>
</div>
</div>
<!-- Raw JSON shared widget (moved into active tab's rawjson-col by JS) -->
<div id="wfm-gen-rawjson-widget" style="display:none;flex-direction:column;height:100%;">
<div class="wfm-gen-rawjson-header">
<span class="wfm-gen-rawjson-label">Raw JSON</span>
<button id="wfm-gen-apply-raw-btn" class="wfm-btn wfm-btn-sm">Apply</button>
</div>
<div class="wfm-json-container wfm-gen-rawjson-editor">
<pre id="wfm-gen-raw-json-highlight" class="wfm-json-highlight"></pre>
<textarea id="wfm-gen-raw-json" class="wfm-json-editor" spellcheck="false" placeholder="Paste workflow JSON here..."></textarea>
</div>
</div>
</section>
<!-- Prompt Tab -->
@@ -510,11 +526,14 @@
<ul>
<li id="wfm-help-gen-1">Connect/disconnect ComfyUI and check connection status</li>
<li id="wfm-help-gen-2">Load workflows from Workflow tab (App format .app.json not supported)</li>
<li id="wfm-help-gen-3">Edit parameters: Prompt, Image (drag &amp; drop), Model (checkpoint/VAE/LoRA/ControlNet with filter), Settings (steps/CFG/sampler/scheduler/resolution), Raw JSON</li>
<li id="wfm-help-gen-4">Seed control: random, fixed, increment, decrement</li>
<li id="wfm-help-gen-5">Generate, progress display, and stop</li>
<li id="wfm-help-gen-6">View results with main image and thumbnail history</li>
<li id="wfm-help-gen-7">Eagle integration: auto-save generated images to Eagle</li>
<li id="wfm-help-gen-3">3-tab layout — Input (Prompt + Image), Model, Settings — each with a Raw JSON column for instant preview and direct editing</li>
<li id="wfm-help-gen-4">Input tab: Prompt (top) and Image drag-and-drop (bottom) in the left column</li>
<li id="wfm-help-gen-5">Model tab: Checkpoint, VAE, LoRA, ControlNet, UNET, TextEncoder selectors with filter</li>
<li id="wfm-help-gen-6">Settings tab: KSampler (top) and LatentImage (bottom) in the left column</li>
<li id="wfm-help-gen-7">Raw JSON always visible in the right column of each tab — edit directly and Apply to reload the workflow</li>
<li id="wfm-help-gen-8">Seed control: random, fixed, increment, decrement</li>
<li id="wfm-help-gen-9">Generate, progress display, stop, and view results</li>
<li id="wfm-help-gen-10">Eagle integration: auto-save generated images to Eagle</li>
</ul>
</div>