138 Commits
Author SHA1 Message Date
stuttlepress f04e44cd24 bump version number v1.1.2 2026-09-30 15:22:04 -05:00
stuttlepress 6e9ba948a2 Add Int (Constrained) node. 2026-09-30 15:17:40 -05:00
stuttlepress 9cf5aad21c outpaint updates 2026-09-16 14:29:39 -05:00
stuttlepress 83b16ca184 Update README.md 2026-08-06 15:55:40 -05:00
stuttlepress e8b5323416 Add MiniMax H3 Duration node
Converts a requested duration in seconds to a MiniMax H3-compatible
frame count (17k+5 at 24 fps) and the resulting revised duration.
2026-08-06 15:53:22 -05:00
stuttlepress 3a998c7130 bump version number v1.1.1 2026-07-16 14:55:14 -05:00
stuttlepress b17762dc07 Updated example workflows 2026-07-16 14:53:50 -05:00
stuttlepress ecc0aa8718 Fix canvas drag under Nodes 2.0 2026-07-16 12:27:27 -05:00
stuttlepress 54e93ef1de Clarify README note on Nodes 2.0 wheel-capture contract
Name both halves of the opt-out: the data-capture-wheel attribute and the
contains(document.activeElement) gate that hover-focus exists to satisfy.
Removing either one silently breaks scroll-to-zoom.
2026-07-16 12:05:21 -05:00
stuttlepress 94d6c2db26 Consolidate local repo notes under gitignored repo-notes/ 2026-07-16 00:55:32 -05:00
stuttlepress db40a4ea29 update README 2026-07-16 00:41:29 -05:00
stuttlepress 5272030cb6 Fix for mousewheel zoom not working under Nodes 2.0. 2026-07-16 00:30:54 -05:00
stuttlepress 3906305132 Update README.md 2026-07-15 17:18:26 -05:00
stuttlepress 78fe13c6e2 bump version number v1.1.0 2026-07-15 16:25:17 -05:00
stuttlepress 44ac696bed Note V3/Nodes 2.0 migration in README 2026-07-15 16:12:04 -05:00
stuttlepress b3ff18be0f Stop tracking VACE_OUTPAINT_HARDENING.md
Another working-notes file, not needed by end users; keep it local via
.gitignore like V3_DOC_GAPS.md.
2026-07-15 15:47:44 -05:00
stuttlepress 0673145037 Stop tracking V3_DOC_GAPS.md and move fragility note to Video Outpaint section
The doc-gaps scratch file is working notes, not something end users need;
keep it local via .gitignore. Moved the reverse-engineered-behavior callout
up next to Video Outpaint since that's the node it actually concerns.
2026-07-15 15:45:42 -05:00
stuttlepressandClaude Opus 4.8 1520be9bfb Harden VACEOutpaint canvas: idempotent widget reconcile + sizing guard
Replace the ordering-dependent onConfigure value-latching dance with a
convergent refreshFromWidgets() reconcile that is safe to call any time:
crop_state is parsed to a source-space st.pendingCrop, consumed exactly
once by the first successful initLayout, and colors + AR-lock button are
reconciled from the hidden widgets. Removes _latched* state and the
per-site replay logic; collapses the double-rAF init to a single frame
(ResizeObserver uniformly owns geometry-readiness).

Sizing contract is hardened belt-and-suspenders: add getHeight and the
--comfy-widget-min-height CSS var alongside getMinHeight, and add a
one-shot warnIfSizingIgnored() that flags (never fights) a frontend that
stops honoring the undocumented DOM-widget sizing options.

Fix two blob-URL leaks via setFrameImg/revokeIfBlob: the scrub blob
overwritten by applyFrameData's data: URL, and the final blob on removal.

Also document in V3_DOC_GAPS #2 that only the onResize width-clamp was
actually shipped-and-reverted. Full plan in VACE_OUTPAINT_HARDENING.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 14:46:24 -05:00
stuttlepress f9e1c5cbd6 ignore .qwen 2026-07-08 16:30:52 -05:00
stuttlepress 71a7b57f3e Polish VACEOutpaint V3 migration and refresh docs
- Restore the "🪐 Video Outpaint" display name and move the node to the
  Wan VACE Prep/Video category
- Disconnect the canvas ResizeObserver on node removal to avoid a leak
- Update README: drop the stale "unregistered/legacy V1" notes now that
  all nodes are V3, and add a brief note on the reverse-engineered,
  potentially fragile V3 behaviors
2026-06-28 11:03:30 -05:00
stuttlepress c630f2ecae Migrate VACEOutpaint to V3 and rewrite its resize handling
Migrate the last remaining V1 node (VACEOutpaint) to the V3 io.ComfyNode
API and register it in get_node_list(). The Python change is mechanical;
the stdlib io import is aliased to _io to avoid clashing with comfy's io.

Rewrite the JS node-sizing for Nodes 2.0. The old onResize/computeSize
hack inverted the V3 sizing model and caused runaway vertical growth on
horizontal drag. Drive height via the getMinHeight option with a flex
column that lets the canvas absorb extra height. There is no working
min-width channel for DOM widgets in Nodes 2.0, so contain the controls
with CSS (overflow:hidden, wrap/scroll rows) instead of forcing a floor.

Add V3_DOC_GAPS.md documenting the V3/Nodes 2.0 gaps hit during migration.
2026-06-28 10:23:51 -05:00
stuttlepress 66cc3e6322 remove V3 migration test checklist 2026-06-28 09:12:31 -05:00
stuttlepress 2e1c9ee931 initial V3 migration 2026-06-28 09:11:35 -05:00
stuttlepress 96bbb88ad3 Update README: document three new experimental nodes 2026-06-27 00:30:59 -05:00
stuttlepress 9947c3b131 Add EXPERIMENTAL flag and 🪐 emoji to new nodes 2026-06-27 00:20:28 -05:00
stuttlepress cff026eeea Add WanFirstLastMiddleFrameToVideo and WanVACEFirstMiddleLast nodes 2026-06-23 04:03:02 -05:00
stuttlepress a915d6899f initial audio support 2026-06-21 21:05:23 -05:00
stuttlepress 8ec2e360d3 VACE_Extend workflow maintenance update
replace deprecated batch images node
documentation fix
2026-06-21 12:25:43 -05:00
stuttlepress bb8fbf18c0 Remove reference_image input from WanVACEInpaint
Handle reference images via WanVaceToVideo.reference_image instead,
which properly VAE-encodes, channels-doubles, and prepends the frame
alongside the control video latent. Avoids double-prepending when
both nodes tried to handle it.
2026-06-01 13:57:43 -05:00
stuttlepress fd26858b55 bump version number 2026-05-28 18:33:32 -05:00
stuttlepress a9ad9c782b Reduce memory consumption when crop area is much larger than output resolution v1.0.25 2026-05-28 18:32:01 -05:00
stuttlepress 7a44b899fc bump version number 2026-05-28 10:55:35 -05:00
stuttlepress b60c9caa5e Fixed bug in LTX outpainting workflow that prevented original audio from passing through. v1.0.24 2026-05-28 10:53:47 -05:00
stuttlepress c7f83ad304 Version number bump 2026-05-26 14:23:01 -05:00
stuttlepress 1a04180090 Improved LTX-2 outpainting example workflow v1.0.23 2026-05-26 14:20:11 -05:00
stuttlepress 534a0bfdfe Improved LTX-2 outpainting example workflow 2026-05-26 14:12:16 -05:00
stuttlepress c35cc785b1 v1.0.22 v1.0.22 2026-05-26 12:25:12 -05:00
stuttlepress eaa1e9d06c Fix a race condition that could cause mask color selection to be reset. 2026-05-26 12:22:39 -05:00
stuttlepress c1c855fe2c Nodes 2.0 notes update 2026-05-26 12:21:46 -05:00
stuttlepress 1b598ae956 increment version number v1.0.21 2026-05-12 14:44:12 -05:00
stuttlepress 939f25ad55 .gitignore 2026-05-12 14:31:44 -05:00
stuttlepress 68aff828eb Hide internal state widgets in V2 renderer
V2 checks widget.type to decide whether to render; setting only
widget.hidden = true was insufficient. Adding widget.type = "hidden"
matches the V2-compatible pattern used across the ComfyUI ecosystem.
2026-05-12 14:30:41 -05:00
stuttlepress 7501641cd3 Fix VACEOutpaint infinite expand loop in V2 renderer
In ComfyUI's V2 (Vue) renderer, node height is derived from the DOM
widget's rendered size, so setting dom.wrap.style.height inside onResize
creates a feedback loop: each DOM change causes V2 to fire onResize again
with a larger size[1], growing the node without bound.

The fix measures the actual node-height overhead (everything above
dom.wrap) from V2's own first onResize call, where size[1] is DOM-derived
and therefore encodes the exact overhead needed for a zero-change
equilibrium. The handler returns early without touching the DOM until this
measurement is taken, so the loop never starts. A secondary recalibration
step corrects the overhead if V2's internal chrome value shifts post-init
(observed in diagnostic data). The dom.wrap.offsetHeight === h guard is
the terminal condition for both cases.

V1 behavior is unchanged: overhead is pre-seeded with the hardcoded
CTRL_H + NODE_CHROME and no measurement or recalibration runs.

Thank you to @fullthrottler for identifying the root cause and suggesting a temporary fix.
2026-05-12 14:22:19 -05:00
stuttlepress d7f62946f6 Fix outpaint widget becoming unresponsive when node starts offscreen
If a workflow is loaded with the outpaint node outside the visible
viewport, ComfyUI gives the DOM widget clientWidth=0. The double-rAF
initLayout call returned false, and the old code did an early return
that skipped wireInteractions, setupResizeObserver, and the
execution_success listener entirely. The node had no event handlers
and no way to recover.

- Double-rAF no longer returns early on layout failure; interactions
  and the ResizeObserver are always wired up
- ResizeObserver handles !st.initialized by running the full deferred
  init sequence the first time the wrap gets a valid size
- initLayout returns false early when maxW or maxH <= 0, preventing
  degenerate scale values from a partially-visible wrap
2026-05-12 13:20:20 -05:00
stuttlepress a12269b27c Merge branch 'feature/vace-inpaint' 2026-04-18 19:43:39 -05:00
stuttlepress 2513133293 increment version number 2026-04-17 17:13:24 -05:00
stuttlepress 46d5fcb0e3 Fix outpaint node connection in LTX workflow 2026-04-17 17:12:24 -05:00
stuttlepress f0466509fb increment version number v1.0.19 2026-04-16 14:31:47 -05:00
stuttlepress 6498a085a7 Add example LTX Outpaint workflow 2026-04-16 14:29:35 -05:00
stuttlepress 1ad8843044 Add custom pad color support
- Control video pad color is now customizable, allowing direct use with the LTX-2 outpainting lora and any other applications that require a specific color.
- Node renamed to Video Outpaint to reflect its utility beyond VACE.
2026-04-16 14:22:47 -05:00