diff --git a/browser_tests/tests/interaction.spec.ts b/browser_tests/tests/interaction.spec.ts index 870642a67c..5b54ccaba2 100644 --- a/browser_tests/tests/interaction.spec.ts +++ b/browser_tests/tests/interaction.spec.ts @@ -171,6 +171,8 @@ test.describe('Node Interaction', () => { test('Can drag node', { tag: '@screenshot' }, async ({ comfyPage }) => { await comfyPage.nodeOps.dragTextEncodeNode2() + // Move mouse away to avoid hover highlight on the node at the drop position. + await comfyPage.canvasOps.moveMouseToEmptyArea() await comfyPage.nextFrame() await expect(comfyPage.canvas).toHaveScreenshot('dragged-node1.png') }) diff --git a/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png b/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png index 3aaa6aeecf..9bbb027fbd 100644 Binary files a/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png and b/browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png differ diff --git a/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/no-workflow-webp-chromium-linux.png b/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/no-workflow-webp-chromium-linux.png index d807d4c259..49fbd6ce83 100644 Binary files a/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/no-workflow-webp-chromium-linux.png and b/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/no-workflow-webp-chromium-linux.png differ diff --git a/browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-no-connection-chromium-linux.png b/browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-no-connection-chromium-linux.png index 86ba1bdb89..85818d60a2 100644 Binary files a/browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-no-connection-chromium-linux.png and b/browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-no-connection-chromium-linux.png differ diff --git a/src/components/graph/widgets/DomWidget.vue b/src/components/graph/widgets/DomWidget.vue index 7f97d04e13..f90a43c7c2 100644 --- a/src/components/graph/widgets/DomWidget.vue +++ b/src/components/graph/widgets/DomWidget.vue @@ -102,30 +102,40 @@ const updateDomClipping = () => { * and update the position of the widget accordingly. */ const { left, top } = useElementBounding(canvasStore.getCanvas().canvas) + +function composeStyle() { + const override = widgetState.positionOverride + const isDisabled = override + ? (override.widget.computedDisabled ?? widget.computedDisabled) + : widget.computedDisabled + + style.value = { + ...positionStyle.value, + ...(enableDomClipping.value ? clippingStyle.value : {}), + zIndex: widgetState.zIndex, + pointerEvents: widgetState.readonly || isDisabled ? 'none' : 'auto', + opacity: isDisabled ? 0.5 : 1 + } +} + watch( - [() => widgetState, left, top], - ([widgetState, _, __]) => { + [() => widgetState, left, top, enableDomClipping], + ([widgetState]) => { updatePosition(widgetState) if (enableDomClipping.value) { updateDomClipping() } - - const override = widgetState.positionOverride - const isDisabled = override - ? (override.widget.computedDisabled ?? widget.computedDisabled) - : widget.computedDisabled - - style.value = { - ...positionStyle.value, - ...(enableDomClipping.value ? clippingStyle.value : {}), - zIndex: widgetState.zIndex, - pointerEvents: widgetState.readonly || isDisabled ? 'none' : 'auto', - opacity: isDisabled ? 0.5 : 1 - } + composeStyle() }, { deep: true } ) +// Recompose style when clippingStyle updates asynchronously via RAF. +// updateClipPath() schedules clip-path calculation in a requestAnimationFrame, +// so clippingStyle.value updates after the main watcher has already composed +// style. This watcher ensures the new clip-path is applied to the DOM. +watch(clippingStyle, composeStyle, { deep: true }) + watch( () => widgetState.visible, (newVisible, oldVisible) => {