diff --git a/src/components/nodes/BaseNode.tsx b/src/components/nodes/BaseNode.tsx
index d1093d1f..2c061f27 100644
--- a/src/components/nodes/BaseNode.tsx
+++ b/src/components/nodes/BaseNode.tsx
@@ -32,6 +32,7 @@ export function BaseNode({
}: BaseNodeProps) {
const currentNodeIds = useWorkflowStore((state) => state.currentNodeIds);
const nodes = useWorkflowStore((state) => state.nodes);
+ const setHoveredNodeId = useWorkflowStore((state) => state.setHoveredNodeId);
const isCurrentlyExecuting = currentNodeIds.includes(id);
const { getNodes, setNodes } = useReactFlow();
@@ -82,6 +83,8 @@ export function BaseNode({
${!fullBleed && selected ? "border-blue-500 ring-2 ring-blue-500/40 shadow-lg shadow-blue-500/25" : ""}
${className}
`}
+ onMouseEnter={() => setHoveredNodeId(id)}
+ onMouseLeave={() => setHoveredNodeId(null)}
>
{children}
diff --git a/src/components/nodes/FloatingNodeHeader.tsx b/src/components/nodes/FloatingNodeHeader.tsx
index 49b710b8..8da8f732 100644
--- a/src/components/nodes/FloatingNodeHeader.tsx
+++ b/src/components/nodes/FloatingNodeHeader.tsx
@@ -4,6 +4,7 @@ import { ReactNode, useState, useEffect, useRef, useCallback } from "react";
import { createPortal } from "react-dom";
import { useReactFlow } from "@xyflow/react";
import { NodeType } from "@/types";
+import { useWorkflowStore } from "@/store/workflowStore";
export interface CommentNavigationProps {
currentIndex: number;
@@ -51,7 +52,9 @@ export function FloatingNodeHeader({
onCommentChange,
commentNavigation,
}: FloatingNodeHeaderProps) {
- const [isHovered, setIsHovered] = useState(false);
+ const [isHeaderHovered, setIsHeaderHovered] = useState(false);
+ const isBodyHovered = useWorkflowStore((state) => state.hoveredNodeId === id);
+ const isHovered = isHeaderHovered || isBodyHovered;
const [isEditingTitle, setIsEditingTitle] = useState(false);
const [editTitleValue, setEditTitleValue] = useState(customTitle || "");
const [isEditingComment, setIsEditingComment] = useState(false);
@@ -278,8 +281,8 @@ export function FloatingNodeHeader({
width: `${width}px`,
zIndex: selected ? 10000 : 9000,
}}
- onMouseEnter={() => setIsHovered(true)}
- onMouseLeave={() => setIsHovered(false)}
+ onMouseEnter={() => setIsHeaderHovered(true)}
+ onMouseLeave={() => setIsHeaderHovered(false)}
onMouseDown={handleHeaderMouseDown}
>
diff --git a/src/store/workflowStore.ts b/src/store/workflowStore.ts
index a8528e26..d0f19244 100644
--- a/src/store/workflowStore.ts
+++ b/src/store/workflowStore.ts
@@ -243,9 +243,11 @@ interface WorkflowStore {
openModalCount: number;
isModalOpen: boolean;
showQuickstart: boolean;
+ hoveredNodeId: string | null;
incrementModalCount: () => void;
decrementModalCount: () => void;
setShowQuickstart: (show: boolean) => void;
+ setHoveredNodeId: (id: string | null) => void;
// Execution
isRunning: boolean;
@@ -450,6 +452,7 @@ const workflowStoreImpl: StateCreator = (set, get) => ({
openModalCount: 0,
isModalOpen: false,
showQuickstart: true,
+ hoveredNodeId: null,
isRunning: false,
currentNodeIds: [], // Changed from currentNodeId for parallel execution
pausedAtNodeId: null,
@@ -522,6 +525,10 @@ const workflowStoreImpl: StateCreator = (set, get) => ({
set({ showQuickstart: show });
},
+ setHoveredNodeId: (id: string | null) => {
+ set({ hoveredNodeId: id });
+ },
+
addNode: (type: NodeType, position: XYPosition, initialData?: Partial) => {
const id = `${type}-${++nodeIdCounter}`;