| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | 
                        - /**
 -  * Node navigation utilities for workflow
 -  * This module provides functions for node selection, focusing and scrolling in workflow
 -  */
 - 
 - /**
 -  * Interface for node selection event detail
 -  */
 - export type NodeSelectionDetail = {
 -   nodeId: string;
 -   focus?: boolean;
 - }
 - 
 - /**
 -  * Select a node in the workflow
 -  * @param nodeId - The ID of the node to select
 -  * @param focus - Whether to focus/scroll to the node
 -  */
 - export function selectWorkflowNode(nodeId: string, focus = false): void {
 -   // Create and dispatch a custom event for node selection
 -   const event = new CustomEvent('workflow:select-node', {
 -     detail: {
 -       nodeId,
 -       focus,
 -     },
 -   })
 -   document.dispatchEvent(event)
 - }
 - 
 - /**
 -  * Scroll to a specific node in the workflow
 -  * @param nodeId - The ID of the node to scroll to
 -  */
 - export function scrollToWorkflowNode(nodeId: string): void {
 -   // Create and dispatch a custom event for scrolling to node
 -   const event = new CustomEvent('workflow:scroll-to-node', {
 -     detail: { nodeId },
 -   })
 -   document.dispatchEvent(event)
 - }
 - 
 - /**
 -  * Setup node selection event listener
 -  * @param handleNodeSelect - Function to handle node selection
 -  * @returns Cleanup function
 -  */
 - export function setupNodeSelectionListener(
 -   handleNodeSelect: (nodeId: string) => void,
 - ): () => void {
 -   // Event handler for node selection
 -   const handleNodeSelection = (event: CustomEvent<NodeSelectionDetail>) => {
 -     const { nodeId, focus } = event.detail
 -     if (nodeId) {
 -       // Select the node
 -       handleNodeSelect(nodeId)
 - 
 -       // If focus is requested, scroll to the node
 -       if (focus) {
 -         // Use a small timeout to ensure node selection happens first
 -         setTimeout(() => {
 -           scrollToWorkflowNode(nodeId)
 -         }, 100)
 -       }
 -     }
 -   }
 - 
 -   // Add event listener
 -   document.addEventListener(
 -     'workflow:select-node',
 -     handleNodeSelection as EventListener,
 -   )
 - 
 -   // Return cleanup function
 -   return () => {
 -     document.removeEventListener(
 -       'workflow:select-node',
 -       handleNodeSelection as EventListener,
 -     )
 -   }
 - }
 - 
 - /**
 -  * Setup scroll to node event listener with ReactFlow
 -  * @param nodes - The workflow nodes
 -  * @param reactflow - The ReactFlow instance
 -  * @returns Cleanup function
 -  */
 - export function setupScrollToNodeListener(
 -   nodes: any[],
 -   reactflow: any,
 - ): () => void {
 -   // Event handler for scrolling to node
 -   const handleScrollToNode = (event: CustomEvent<NodeSelectionDetail>) => {
 -     const { nodeId } = event.detail
 -     if (nodeId) {
 -       // Find the target node
 -       const node = nodes.find(n => n.id === nodeId)
 -       if (node) {
 -         // Use ReactFlow's fitView API to scroll to the node
 -         reactflow.fitView({
 -           nodes: [node],
 -           padding: 0.2,
 -           duration: 800,
 -           minZoom: 0.5,
 -           maxZoom: 1,
 -         })
 -       }
 -     }
 -   }
 - 
 -   // Add event listener
 -   document.addEventListener(
 -     'workflow:scroll-to-node',
 -     handleScrollToNode as EventListener,
 -   )
 - 
 -   // Return cleanup function
 -   return () => {
 -     document.removeEventListener(
 -       'workflow:scroll-to-node',
 -       handleScrollToNode as EventListener,
 -     )
 -   }
 - }
 
 
  |