diff --git a/src/lib/litegraph/src/LGraphNode.ts b/src/lib/litegraph/src/LGraphNode.ts index bd032c7e06..99eb1c14d5 100644 --- a/src/lib/litegraph/src/LGraphNode.ts +++ b/src/lib/litegraph/src/LGraphNode.ts @@ -4187,7 +4187,12 @@ export class LGraphNode // Ref: https://github.com/Comfy-Org/ComfyUI_frontend/issues/2652 // TODO: Move the layout logic before drawing of the node shape, so we don't // need to trigger extra round of rendering. - if (y > bodyHeight) { + // In Vue mode, the DOM is the source of truth for node sizing — the + // ResizeObserver feeds measurements back to the layout store. Allowing + // LiteGraph to also call setSize() here creates an infinite feedback loop + // (LG grows node → CSS min-height increases → textarea fills extra space → + // ResizeObserver reports larger size → LG grows node again). + if (!LiteGraph.vueNodesMode && y > bodyHeight) { this.setSize([this.size[0], y]) this.graph.setDirtyCanvas(false, true) } diff --git a/src/renderer/core/layout/sync/useLayoutSync.ts b/src/renderer/core/layout/sync/useLayoutSync.ts index 221fe64eb9..06449a1cc1 100644 --- a/src/renderer/core/layout/sync/useLayoutSync.ts +++ b/src/renderer/core/layout/sync/useLayoutSync.ts @@ -50,8 +50,12 @@ export function useLayoutSync() { liteNode.size[0] !== layout.size.width || liteNode.size[1] !== layout.size.height ) { - // Use setSize() to trigger onResize callback - liteNode.setSize([layout.size.width, layout.size.height]) + // Update internal size directly (like position above) to avoid + // the size setter writing back to layoutStore with Canvas source, + // which would create a feedback loop through handleLayoutChange. + liteNode.size[0] = layout.size.width + liteNode.size[1] = layout.size.height + liteNode.onResize?.(liteNode.size) } }