Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>ComfyUI Workflow</title> | |
| <style> | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| body { | |
| font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', system-ui, sans-serif; | |
| background-color: #000000; | |
| color: #f5f5f7; | |
| line-height: 1.6; | |
| padding: 20px; | |
| min-height: 100vh; | |
| } | |
| .container { | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| } | |
| .header { | |
| text-align: center; | |
| margin-bottom: 40px; | |
| padding: 40px 20px; | |
| } | |
| .header h1 { | |
| font-size: 48px; | |
| font-weight: 600; | |
| color: #ffffff; | |
| margin-bottom: 12px; | |
| letter-spacing: -0.02em; | |
| } | |
| .header p { | |
| font-size: 18px; | |
| color: #86868b; | |
| font-weight: 400; | |
| } | |
| .controls { | |
| display: flex; | |
| gap: 12px; | |
| margin-bottom: 24px; | |
| justify-content: center; | |
| } | |
| .btn { | |
| padding: 12px 24px; | |
| border: none; | |
| border-radius: 24px; | |
| font-size: 14px; | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| font-family: inherit; | |
| } | |
| .btn-primary { | |
| background: #ffffff; | |
| color: #000000; | |
| } | |
| .btn-primary:hover { | |
| background: #f5f5f7; | |
| transform: scale(0.98); | |
| } | |
| .btn-secondary { | |
| background: #1d1d1f; | |
| color: #f5f5f7; | |
| border: 1px solid #424245; | |
| } | |
| .btn-secondary:hover { | |
| background: #2d2d2f; | |
| transform: scale(0.98); | |
| } | |
| .json-container { | |
| background-color: #1d1d1f; | |
| border-radius: 16px; | |
| padding: 32px; | |
| overflow-x: auto; | |
| border: 1px solid #424245; | |
| box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); | |
| } | |
| pre { | |
| margin: 0; | |
| font-family: 'SF Mono', 'Monaco', 'Menlo', 'Consolas', monospace; | |
| font-size: 13px; | |
| line-height: 1.6; | |
| white-space: pre-wrap; | |
| word-wrap: break-word; | |
| } | |
| .json-key { | |
| color: #9cdcfe; | |
| } | |
| .json-string { | |
| color: #ce9178; | |
| } | |
| .json-number { | |
| color: #b5cea8; | |
| } | |
| .json-boolean { | |
| color: #569cd6; | |
| } | |
| .json-null { | |
| color: #569cd6; | |
| } | |
| .success { | |
| color: #30d158; | |
| } | |
| @media (max-width: 768px) { | |
| .header h1 { | |
| font-size: 32px; | |
| } | |
| .controls { | |
| flex-direction: column; | |
| } | |
| .json-container { | |
| padding: 20px; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <div class="header"> | |
| <h1>ComfyUI Workflow</h1> | |
| <p>View and download your workflow JSON</p> | |
| </div> | |
| <div class="controls"> | |
| <button class="btn btn-primary" onclick="downloadJSON()">Download JSON</button> | |
| <button class="btn btn-secondary" onclick="copyToClipboard()">Copy to Clipboard</button> | |
| </div> | |
| <div class="json-container"> | |
| <pre id="json-content">{ | |
| "last_node_id": 12, | |
| "last_link_id": 11, | |
| "nodes": [ | |
| { | |
| "id": 1, | |
| "type": "CheckpointLoaderSimple", | |
| "pos": [ | |
| 50, | |
| 300 | |
| ], | |
| "size": { | |
| "0": 350, | |
| "1": 100 | |
| }, | |
| "flags": {}, | |
| "order": 0, | |
| "mode": 0, | |
| "outputs": [ | |
| { | |
| "name": "MODEL", | |
| "type": "MODEL", | |
| "links": [ | |
| 2 | |
| ], | |
| "shape": 3, | |
| "slot_index": 0 | |
| }, | |
| { | |
| "name": "CLIP", | |
| "type": "CLIP", | |
| "links": [ | |
| 1 | |
| ], | |
| "shape": 3, | |
| "slot_index": 1 | |
| }, | |
| { | |
| "name": "VAE", | |
| "type": "VAE", | |
| "links": [ | |
| 3 | |
| ], | |
| "shape": 3, | |
| "slot_index": 2 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "CheckpointLoaderSimple" | |
| }, | |
| "widgets_values": [ | |
| "v1-5-pruned-emaonly.safetensors" | |
| ] | |
| }, | |
| { | |
| "id": 2, | |
| "type": "CLIPTextEncode", | |
| "pos": [ | |
| 450, | |
| 200 | |
| ], | |
| "size": { | |
| "0": 400, | |
| "1": 200 | |
| }, | |
| "flags": {}, | |
| "order": 1, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "clip", | |
| "type": "CLIP", | |
| "link": 1 | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "CONDITIONING", | |
| "type": "CONDITIONING", | |
| "links": [ | |
| 4 | |
| ], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "CLIPTextEncode" | |
| }, | |
| "widgets_values": [ | |
| "a beautiful landscape painting, mountains, lake, sunset, highly detailed, masterpiece" | |
| ] | |
| }, | |
| { | |
| "id": 3, | |
| "type": "CLIPTextEncode", | |
| "pos": [ | |
| 450, | |
| 450 | |
| ], | |
| "size": { | |
| "0": 400, | |
| "1": 200 | |
| }, | |
| "flags": {}, | |
| "order": 2, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "clip", | |
| "type": "CLIP", | |
| "link": 1 | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "CONDITIONING", | |
| "type": "CONDITIONING", | |
| "links": [ | |
| 5 | |
| ], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "CLIPTextEncode" | |
| }, | |
| "widgets_values": [ | |
| "blurry, low quality, distorted, deformed, ugly, bad anatomy" | |
| ] | |
| }, | |
| { | |
| "id": 4, | |
| "type": "EmptyLatentImage", | |
| "pos": [ | |
| 450, | |
| 700 | |
| ], | |
| "size": { | |
| "0": 315, | |
| "1": 110 | |
| }, | |
| "flags": {}, | |
| "order": 3, | |
| "mode": 0, | |
| "outputs": [ | |
| { | |
| "name": "LATENT", | |
| "type": "LATENT", | |
| "links": [ | |
| 6 | |
| ], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "EmptyLatentImage" | |
| }, | |
| "widgets_values": [ | |
| 512, | |
| 512, | |
| 1 | |
| ] | |
| }, | |
| { | |
| "id": 5, | |
| "type": "KSampler", | |
| "pos": [ | |
| 900, | |
| 400 | |
| ], | |
| "size": { | |
| "0": 300, | |
| "1": 262 | |
| }, | |
| "flags": {}, | |
| "order": 4, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "model", | |
| "type": "MODEL", | |
| "link": 2 | |
| }, | |
| { | |
| "name": "positive", | |
| "type": "CONDITIONING", | |
| "link": 4 | |
| }, | |
| { | |
| "name": "negative", | |
| "type": "CONDITIONING", | |
| "link": 5 | |
| }, | |
| { | |
| "name": "latent_image", | |
| "type": "LATENT", | |
| "link": 6 | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "LATENT", | |
| "type": "LATENT", | |
| "links": [ | |
| 7 | |
| ], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "KSampler" | |
| }, | |
| "widgets_values": [ | |
| 42, | |
| "randomize", | |
| 20, | |
| 8, | |
| "euler", | |
| "normal" | |
| ] | |
| }, | |
| { | |
| "id": 6, | |
| "type": "VAEDecode", | |
| "pos": [ | |
| 1250, | |
| 400 | |
| ], | |
| "size": { | |
| "0": 210, | |
| "1": 46 | |
| }, | |
| "flags": {}, | |
| "order": 5, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "samples", | |
| "type": "LATENT", | |
| "link": 7 | |
| }, | |
| { | |
| "name": "vae", | |
| "type": "VAE", | |
| "link": 3 | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "IMAGE", | |
| "type": "IMAGE", | |
| "links": [ | |
| 8 | |
| ], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "VAEDecode" | |
| } | |
| }, | |
| { | |
| "id": 7, | |
| "type": "SaveImage", | |
| "pos": [ | |
| 1500, | |
| 400 | |
| ], | |
| "size": { | |
| "0": 315, | |
| "1": 270 | |
| }, | |
| "flags": {}, | |
| "order": 6, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "images", | |
| "type": "IMAGE", | |
| "link": 8 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "SaveImage" | |
| }, | |
| "widgets_values": [ | |
| "ComfyUI" | |
| ] | |
| }, | |
| { | |
| "id": 8, | |
| "type": "LoadImage", | |
| "pos": [ | |
| 50, | |
| 50 | |
| ], | |
| "size": { | |
| "0": 315, | |
| "1": 314 | |
| }, | |
| "flags": {}, | |
| "order": 7, | |
| "mode": 0, | |
| "outputs": [ | |
| { | |
| "name": "IMAGE", | |
| "type": "IMAGE", | |
| "links": [], | |
| "shape": 3, | |
| "slot_index": 0 | |
| }, | |
| { | |
| "name": "MASK", | |
| "type": "MASK", | |
| "links": [], | |
| "shape": 3, | |
| "slot_index": 1 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "LoadImage" | |
| }, | |
| "widgets_values": [ | |
| "example.png", | |
| "image" | |
| ] | |
| }, | |
| { | |
| "id": 9, | |
| "type": "ImageScale", | |
| "pos": [ | |
| 450, | |
| 50 | |
| ], | |
| "size": { | |
| "0": 315, | |
| "1": 130 | |
| }, | |
| "flags": {}, | |
| "order": 8, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "image", | |
| "type": "IMAGE", | |
| "link": null | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "IMAGE", | |
| "type": "IMAGE", | |
| "links": [], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "ImageScale" | |
| }, | |
| "widgets_values": [ | |
| "nearest-exact", | |
| 512, | |
| 512, | |
| "disabled" | |
| ] | |
| }, | |
| { | |
| "id": 10, | |
| "type": "ImageBatch", | |
| "pos": [ | |
| 900, | |
| 50 | |
| ], | |
| "size": { | |
| "0": 210, | |
| "1": 46 | |
| }, | |
| "flags": {}, | |
| "order": 9, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "image1", | |
| "type": "IMAGE", | |
| "link": null | |
| }, | |
| { | |
| "name": "image2", | |
| "type": "IMAGE", | |
| "link": null | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "IMAGE", | |
| "type": "IMAGE", | |
| "links": [], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "ImageBatch" | |
| } | |
| }, | |
| { | |
| "id": 11, | |
| "type": "PreviewImage", | |
| "pos": [ | |
| 1250, | |
| 50 | |
| ], | |
| "size": { | |
| "0": 299.916748046875, | |
| "1": 327.4180603027344 | |
| }, | |
| "flags": {}, | |
| "order": 10, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "images", | |
| "type": "IMAGE", | |
| "link": null | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "PreviewImage" | |
| } | |
| }, | |
| { | |
| "id": 12, | |
| "type": "CLIPSetLastLayer", | |
| "pos": [ | |
| 50, | |
| 450 | |
| ], | |
| "size": { | |
| "0": 315, | |
| "1": 58 | |
| }, | |
| "flags": {}, | |
| "order": 11, | |
| "mode": 0, | |
| "inputs": [ | |
| { | |
| "name": "clip", | |
| "type": "CLIP", | |
| "link": null | |
| } | |
| ], | |
| "outputs": [ | |
| { | |
| "name": "CLIP", | |
| "type": "CLIP", | |
| "links": [], | |
| "shape": 3, | |
| "slot_index": 0 | |
| } | |
| ], | |
| "properties": { | |
| "Node name for S&R": "CLIPSetLastLayer" | |
| }, | |
| "widgets_values": [ | |
| -2 | |
| ] | |
| } | |
| ], | |
| "links": [ | |
| [ | |
| 1, | |
| 1, | |
| 1, | |
| 2, | |
| 0, | |
| "CLIP" | |
| ], | |
| [ | |
| 2, | |
| 1, | |
| 0, | |
| 5, | |
| 0, | |
| "MODEL" | |
| ], | |
| [ | |
| 3, | |
| 1, | |
| 2, | |
| 6, | |
| 1, | |
| "VAE" | |
| ], | |
| [ | |
| 4, | |
| 2, | |
| 0, | |
| 5, | |
| 1, | |
| "CONDITIONING" | |
| ], | |
| [ | |
| 5, | |
| 3, | |
| 0, | |
| 5, | |
| 2, | |
| "CONDITIONING" | |
| ], | |
| [ | |
| 6, | |
| 4, | |
| 0, | |
| 5, | |
| 3, | |
| "LATENT" | |
| ], | |
| [ | |
| 7, | |
| 5, | |
| 0, | |
| 6, | |
| 0, | |
| "LATENT" | |
| ], | |
| [ | |
| 8, | |
| 6, | |
| 0, | |
| 7, | |
| 0, | |
| "IMAGE" | |
| ] | |
| ], | |
| "groups": [], | |
| "config": {}, | |
| "extra": { | |
| "ds": { | |
| "scale": 1, | |
| "offset": [ | |
| 0, | |
| 0 | |
| ] | |
| } | |
| }, | |
| "version": 0.4 | |
| }</pre> | |
| </div> | |
| </div> | |
| <script> | |
| function copyToClipboard() { | |
| const jsonContent = document.getElementById('json-content').textContent; | |
| navigator.clipboard.writeText(jsonContent).then(() => { | |
| const btn = event.target; | |
| const originalText = btn.textContent; | |
| btn.textContent = 'Copied!'; | |
| btn.classList.add('success'); | |
| setTimeout(() => { | |
| btn.textContent = originalText; | |
| btn.classList.remove('success'); | |
| }, 2000); | |
| }).catch(err => { | |
| alert('Failed to copy to clipboard'); | |
| }); | |
| } | |
| function downloadJSON() { | |
| const jsonContent = document.getElementById('json-content').textContent; | |
| const blob = new Blob([jsonContent], { type: 'application/json' }); | |
| const url = URL.createObjectURL(blob); | |
| const a = document.createElement('a'); | |
| a.href = url; | |
| a.download = 'comfyui_workflow.json'; | |
| document.body.appendChild(a); | |
| a.click(); | |
| document.body.removeChild(a); | |
| URL.revokeObjectURL(url); | |
| const btn = event.target; | |
| const originalText = btn.textContent; | |
| btn.textContent = 'Downloaded!'; | |
| btn.classList.add('success'); | |
| setTimeout(() => { | |
| btn.textContent = originalText; | |
| btn.classList.remove('success'); | |
| }, 2000); | |
| } | |
| // Add syntax highlighting | |
| function highlightJSON() { | |
| const content = document.getElementById('json-content'); | |
| let html = content.innerHTML; | |
| // Highlight different JSON elements | |
| html = html.replace(/"([^"]+)":/g, '<span class="json-key">"$1":</span>'); | |
| html = html.replace(/: "([^"]*)"/g, ': <span class="json-string">"$1"</span>'); | |
| html = html.replace(/: (-?\d+\.?\d*)/g, ': <span class="json-number">$1</span>'); | |
| html = html.replace(/: (true|false)/g, ': <span class="json-boolean">$1</span>'); | |
| html = html.replace(/: null/g, ': <span class="json-null">null</span>'); | |
| content.innerHTML = html; | |
| } | |
| // Apply syntax highlighting after page load | |
| window.addEventListener('load', highlightJSON); | |
| </script> | |
| </body> | |
| </html> |