Files
olivv-cs-ComfyUI-FunPack/easy_gen/frontend/easy.css
T
digital-garbageandClaude 3222fbcb31 Easy Gen: Interrupt button on the progress panel
Easy Gen had no way to stop a run — the only exit was the ComfyUI queue. Adds
the same "■ Interrupt" control the Cutting Room's player readout uses (shared
.gen-interrupt styling), living inside the progress panel so it exists only
while there is something to stop.

ComfyUI records an interrupted prompt in history as status_str "error" with no
media, which the status endpoint cannot tell apart from a real crash — so watch()
remembers that the stop was asked for and reports "Generation stopped." instead
of "Generation failed.", while still showing any partial media the run wrote.
A failed interrupt call re-enables the button and says so rather than leaving a
dead control over a run that is still going.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-26 20:22:48 +03:00

122 lines
6.4 KiB
CSS

/* Easy Gen layout on top of the Editor's shared styles.css (design tokens,
.btn/.modal/.sw-*/.welcome-* rules) — big preview, prompt bar, nothing else. */
html, body.easy-body {
margin: 0; height: 100%; background: var(--ink-0); color: var(--text);
font-family: var(--font-ui);
}
.easy-app {
height: 100vh; display: flex; flex-direction: column;
}
.easy-top {
height: var(--menubar-h); flex: none; display: flex; align-items: center; gap: 14px;
padding: 0 16px; border-bottom: 1px solid var(--line); background: var(--ink-1);
}
.easy-project-name { color: var(--muted); font-size: 13px; }
.easy-top .easy-health-chip { margin-left: auto; }
a.brand { text-decoration: none; color: inherit; }
a.brand:hover .brand-sub { color: var(--amber-2); }
.easy-preview {
flex: 1; min-height: 0; display: flex; align-items: center; justify-content: center;
background: var(--ink-0); position: relative; padding: 24px;
}
.easy-preview-inner {
width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;
}
.easy-preview-inner img, .easy-preview-inner video {
max-width: 100%; max-height: 100%; border-radius: var(--radius); box-shadow: var(--shadow);
background: #000;
}
.easy-preview-empty {
color: var(--faint); font-size: 14px; font-family: var(--font-display);
}
.easy-preview-error { color: var(--danger); max-width: 60ch; text-align: center; white-space: pre-wrap; }
.easy-preview-close {
position: absolute; top: 34px; right: 34px; width: 28px; height: 28px; padding: 0;
border-radius: 50%; background: rgba(12,11,9,.72); border: 1px solid var(--line);
color: var(--text); font-size: 13px; cursor: pointer; display: flex; align-items: center; justify-content: center;
backdrop-filter: blur(2px); transition: border-color .12s, color .12s;
}
.easy-preview-close[hidden] { display: none; } /* class display:flex above would otherwise beat [hidden] */
.easy-preview-close:hover { border-color: var(--danger); color: var(--danger); }
.easy-preview-badge {
position: absolute; top: 34px; left: 34px; padding: 4px 10px; border-radius: 999px;
background: rgba(12,11,9,.72); border: 1px solid var(--line); color: var(--muted);
font-size: 11.5px; letter-spacing: .3px; backdrop-filter: blur(2px);
}
.easy-progress {
position: absolute; left: 24px; right: 24px; bottom: 24px;
background: var(--ink-1); border: 1px solid var(--line); border-radius: var(--radius);
padding: 10px 14px; box-shadow: var(--shadow);
}
.easy-progress-bar {
height: 6px; border-radius: 4px; background: linear-gradient(90deg, var(--amber), var(--amber-2));
width: 0%; transition: width .2s ease; margin-bottom: 6px;
}
.easy-progress-row { display: flex; align-items: center; gap: 10px; }
.easy-progress-label { flex: 1; min-width: 0; font-size: 12px; color: var(--muted); font-family: var(--font-mono);
overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.easy-progress-stop:disabled { opacity: .6; cursor: default; }
.easy-bar {
flex: none; display: flex; align-items: flex-end; gap: 12px;
padding: 14px 16px; border-top: 1px solid var(--line); background: var(--ink-1);
}
.easy-upload-btn, .easy-gallery-btn, .easy-vars-btn { flex: none; align-self: stretch; padding: 0 16px; }
.easy-prompt {
flex: 1; resize: none; background: var(--ink-2); border: 1px solid var(--line);
border-radius: var(--radius); color: var(--text); font: 14px/1.4 var(--font-ui);
padding: 10px 12px;
}
.easy-prompt:focus { outline: none; border-color: var(--amber); }
.easy-actions { flex: none; display: flex; flex-direction: column; align-items: stretch; gap: 6px; }
.easy-generate-btn { padding: 10px 26px; font-size: 14px; }
.easy-advanced-btn { align-self: center; }
/* Prompt $name variables — own modal window, opened from the header button. */
.easy-vars-hint { color: var(--muted); font-size: 12px; line-height: 1.5; margin-bottom: 8px; }
.easy-vars-hint.easy-var-warn { color: var(--amber); }
.easy-vars-empty { color: var(--faint); font-size: 12px; }
.easy-var-list { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.easy-var-row { display: flex; gap: 6px; align-items: flex-start; width: 100%; }
.easy-var-row > .easy-var-dollar, .easy-var-row > .easy-var-eq, .easy-var-row > .btn { margin-top: 6px; }
.easy-var-dollar { color: var(--amber); font-family: var(--font-mono); opacity: .8; }
.easy-var-eq { color: var(--muted); }
.easy-var-in {
background: var(--ink-2); border: 1px solid var(--line); border-radius: var(--radius);
color: var(--text); font: 13px/1.4 var(--font-ui); padding: 6px 9px; min-width: 0;
}
.easy-var-in:focus { outline: none; border-color: var(--amber); }
.easy-var-name { flex: 0 0 22%; font-family: var(--font-mono); }
/* Value is an auto-growing textarea (JS sets the height) — no manual resize handle, no scrollbar. */
.easy-var-val { flex: 1; resize: none; overflow: hidden; }
.easy-var-row .btn { flex: 0 0 auto; }
#easy-vars-btn.easy-vars-warn { color: var(--amber); border-color: var(--amber); }
.es-io-controls { display: flex; align-items: center; gap: 8px; }
.es-io-mode { background: var(--ink-2); border: 1px solid var(--line); color: var(--text);
border-radius: 6px; font-size: 12px; padding: 4px 6px; }
.gal-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; }
.gal-cell { cursor: pointer; border: 1px solid var(--line); border-radius: 10px; overflow: hidden;
background: var(--ink-2); transition: border-color .15s; }
.gal-cell:hover { border-color: var(--amber); }
.gal-thumb { position: relative; aspect-ratio: 1 / 1; background: var(--ink-0); display: flex; align-items: center; justify-content: center; }
.gal-thumb img, .gal-thumb video { width: 100%; height: 100%; object-fit: cover; }
.gal-name { padding: 6px 8px; font-size: 11.5px; color: var(--muted); white-space: nowrap;
overflow: hidden; text-overflow: ellipsis; }
.gal-pin-btn { position: absolute; top: 4px; right: 4px; z-index: 2; width: 22px; height: 22px;
border-radius: 6px; background: rgba(10, 9, 7, .72); border: 1px solid var(--line);
filter: grayscale(1); font-size: 12px; cursor: pointer; display: flex; align-items: center;
justify-content: center; padding: 0; }
.gal-pin-btn:hover { filter: none; }
.gal-pin-btn.active { filter: none; background: var(--amber-soft); border-color: var(--amber); }
.gal-pin-badge { position: absolute; top: 4px; left: 4px; z-index: 2; font-size: 10.5px;
background: rgba(10, 9, 7, .72); border-radius: 4px; padding: 1px 4px; line-height: 1.4; }