diff --git a/web/dynamic_loader.js b/web/dynamic_loader.js index acb6196..a640bd2 100644 --- a/web/dynamic_loader.js +++ b/web/dynamic_loader.js @@ -727,9 +727,24 @@ app.registerExtension({ const originalOnRemoved = node.onRemoved; const originalWidgetOnRemove = composerWidget.onRemove; let composerDisposed = false; + const healComposerHeight = () => { + if (!composerDisposed) node._healRunawayHeight?.(); + }; + const composerResizeObserver = new ResizeObserver(healComposerHeight); + composerResizeObserver.observe(composerHost); + const originalOnSelected = node.onSelected; + node.onSelected = function() { + const result = originalOnSelected?.apply(this, arguments); + requestAnimationFrame(healComposerHeight); + return result; + }; + requestAnimationFrame(healComposerHeight); + setTimeout(healComposerHeight, 0); + setTimeout(healComposerHeight, 250); const disposeComposer = () => { if (composerDisposed) return; composerDisposed = true; + composerResizeObserver.disconnect(); closeMenu(); menu.remove(); document.removeEventListener("pointerdown", closeMenuOutside, true); diff --git a/web/dynamic_utils.js b/web/dynamic_utils.js index 5b7325a..f9d8b6f 100644 --- a/web/dynamic_utils.js +++ b/web/dynamic_utils.js @@ -64,6 +64,18 @@ export function setupSizeManager(node) { const initialMinHeight = node.computeSize?.()[1] || 0; node._userMinHeight = 0; node._isResizing = false; + const isRunawayHeight = height => height > MAX_RESTORED_HEIGHT + && height > initialMinHeight + MAX_RESTORED_EXTRA_HEIGHT; + node._healRunawayHeight = function() { + const height = node.size?.[1] || 0; + if (node._isResizing || !isRunawayHeight(height)) return false; + node._isResizing = true; + node._userMinHeight = 0; + node.setSize([node.size[0], initialMinHeight]); + node._isResizing = false; + node.setDirtyCanvas(true, true); + return true; + }; // 1. 攔截讀取工作流配置 const originalOnConfigure = node.onConfigure; @@ -71,14 +83,8 @@ export function setupSizeManager(node) { if (originalOnConfigure) originalOnConfigure.apply(this, arguments); if (data && data.size) { const restoredHeight = data.size[1]; - const runawayHeight = restoredHeight > MAX_RESTORED_HEIGHT - && restoredHeight > initialMinHeight + MAX_RESTORED_EXTRA_HEIGHT; - node._userMinHeight = runawayHeight ? 0 : restoredHeight; - if (runawayHeight) { - node._isResizing = true; - node.setSize([node.size[0], initialMinHeight]); - node._isResizing = false; - } + node._userMinHeight = restoredHeight; + node._healRunawayHeight(); } }; @@ -88,6 +94,7 @@ export function setupSizeManager(node) { if (originalOnResize) originalOnResize.apply(this, arguments); if (!node._isResizing) { node._userMinHeight = size[1]; + node._healRunawayHeight(); } };