diff --git a/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue b/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
index d0a195ffb..4e7e7c80d 100644
--- a/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
+++ b/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
@@ -26,19 +26,8 @@
nodeLabel: 'node-lib-tree-node-label',
nodeChildren: ({ props }) => ({
'data-comfy-node-name': props.node?.data?.name,
- onMouseenter: (event: MouseEvent) => {
- hoveredComfyNodeName = props.node?.data?.name
-
- const hoverTarget = event.target as HTMLElement
- const targetRect = hoverTarget.getBoundingClientRect()
- if (sidebarLocation === 'left') {
- nodePreviewStyle.top = `${targetRect.top - 40}px`
- nodePreviewStyle.left = `${targetRect.right}px`
- } else {
- nodePreviewStyle.top = `${targetRect.top - 40}px`
- nodePreviewStyle.left = `${targetRect.left - 400}px`
- }
- },
+ onMouseenter: (event: MouseEvent) =>
+ handleNodeHover(event, props.node?.data?.name),
onMouseleave: () => {
hoveredComfyNodeName = null
}
@@ -63,6 +52,7 @@
:style="nodePreviewStyle"
>
@@ -75,7 +65,7 @@
import Badge from 'primevue/badge'
import ToggleButton from 'primevue/togglebutton'
import { ComfyNodeDefImpl, useNodeDefStore } from '@/stores/nodeDefStore'
-import { computed, ref } from 'vue'
+import { computed, ref, nextTick } from 'vue'
import type { TreeNode } from 'primevue/treenode'
import TreePlus from '@/components/primevueOverride/TreePlus.vue'
import NodePreview from '@/components/node/NodePreview.vue'
@@ -92,6 +82,7 @@ const hoveredComfyNode = computed(() => {
}
return nodeDefStore.nodeDefsByName[hoveredComfyNodeName.value] || null
})
+const previewRef = ref | null>(null)
const settingStore = useSettingStore()
const sidebarLocation = computed<'left' | 'right'>(() =>
@@ -128,4 +119,30 @@ const fillNodeInfo = (node: TreeNode): TreeNode => {
: children.reduce((acc, child) => acc + child.totalNodes, 0)
}
}
+
+const handleNodeHover = async (
+ event: MouseEvent,
+ nodeName: string | undefined
+) => {
+ hoveredComfyNodeName.value = nodeName || null
+
+ if (!nodeName) return
+
+ const hoverTarget = event.target as HTMLElement
+ const targetRect = hoverTarget.getBoundingClientRect()
+
+ await nextTick()
+
+ const previewHeight = previewRef.value?.$el.offsetHeight || 0
+ const availableSpaceBelow = window.innerHeight - targetRect.bottom
+
+ nodePreviewStyle.value.top = previewHeight > availableSpaceBelow
+ ? `${Math.max(0, targetRect.top - (previewHeight - availableSpaceBelow) - 20)}px`
+ : `${targetRect.top - 40}px`
+ if (sidebarLocation.value === 'left') {
+ nodePreviewStyle.value.left = `${targetRect.right}px`
+ } else {
+ nodePreviewStyle.value.left = `${targetRect.left - 400}px`
+ }
+}