diff --git a/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts b/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts index 4d4e274d3c..07c60a4b1e 100644 --- a/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts +++ b/src/renderer/extensions/vueNodes/composables/useVueNodeResizeTracking.ts @@ -8,9 +8,11 @@ * Supports different element types (nodes, slots, widgets, etc.) with * customizable data attributes and update handlers. */ -import { getCurrentInstance, onMounted, onUnmounted, toValue } from 'vue' +import { getCurrentInstance, onMounted, onUnmounted, toValue, watch } from 'vue' import type { MaybeRefOrGetter } from 'vue' +import { useDocumentVisibility } from '@vueuse/core' + import { useSharedCanvasPositionConversion } from '@/composables/element/useCanvasPositionConversion' import { LiteGraph } from '@/lib/litegraph/src/litegraph' import { layoutStore } from '@/renderer/core/layout/store/layoutStore' @@ -59,9 +61,37 @@ const trackingConfigs: Map = new Map([ ] ]) +// Elements whose ResizeObserver fired while the tab was hidden +const deferredElements = new Set() +const visibility = useDocumentVisibility() + +watch(visibility, (state) => { + if (state !== 'visible' || deferredElements.size === 0) return + + // Re-observe deferred elements to trigger fresh measurements + for (const element of deferredElements) { + if (element.isConnected) { + resizeObserver.observe(element) + } + } + deferredElements.clear() +}) + // Single ResizeObserver instance for all Vue elements const resizeObserver = new ResizeObserver((entries) => { if (useCanvasStore().linearMode) return + + // Skip measurements when tab is hidden — bounding rects are unreliable + if (visibility.value === 'hidden') { + for (const entry of entries) { + if (entry.target instanceof HTMLElement) { + deferredElements.add(entry.target) + resizeObserver.unobserve(entry.target) + } + } + return + } + // Canvas is ready when this code runs; no defensive guards needed. const conv = useSharedCanvasPositionConversion() // Group updates by type, then flush via each config's handler