@genfeedai/workflow-ui 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/canvas.mjs +19 -17
  2. package/dist/canvas.mjs.map +1 -0
  3. package/dist/{chunk-MGLAKMDP.mjs → chunk-2BHILUF7.mjs} +2 -0
  4. package/dist/chunk-2BHILUF7.mjs.map +1 -0
  5. package/dist/{chunk-U4QPE4CY.mjs → chunk-2C2AAXJP.mjs} +2 -0
  6. package/dist/chunk-2C2AAXJP.mjs.map +1 -0
  7. package/dist/{chunk-ZSITTZ4S.mjs → chunk-3GWH2ZOH.mjs} +5 -3
  8. package/dist/chunk-3GWH2ZOH.mjs.map +1 -0
  9. package/dist/{chunk-XRC3O5GK.mjs → chunk-4JOFNZW6.mjs} +2 -0
  10. package/dist/chunk-4JOFNZW6.mjs.map +1 -0
  11. package/dist/{chunk-2FUPL67V.mjs → chunk-72UIUFXH.mjs} +23 -13
  12. package/dist/chunk-72UIUFXH.mjs.map +1 -0
  13. package/dist/{chunk-GPYIIWD5.mjs → chunk-7DJHFOIW.mjs} +3 -1
  14. package/dist/chunk-7DJHFOIW.mjs.map +1 -0
  15. package/dist/{chunk-QQVHGJ2G.mjs → chunk-AZJFDWBF.mjs} +2 -0
  16. package/dist/chunk-AZJFDWBF.mjs.map +1 -0
  17. package/dist/{chunk-C6MQBJFC.mjs → chunk-G3HCTMAZ.mjs} +3 -1
  18. package/dist/chunk-G3HCTMAZ.mjs.map +1 -0
  19. package/dist/{chunk-IYFWAJBB.mjs → chunk-HMTYPFOT.mjs} +3 -1
  20. package/dist/chunk-HMTYPFOT.mjs.map +1 -0
  21. package/dist/{chunk-7LV4UAUS.mjs → chunk-IKR6GVZ4.mjs} +2 -0
  22. package/dist/chunk-IKR6GVZ4.mjs.map +1 -0
  23. package/dist/{chunk-YUIK4AHM.mjs → chunk-JSF4FHBH.mjs} +3 -1
  24. package/dist/chunk-JSF4FHBH.mjs.map +1 -0
  25. package/dist/{chunk-53XDE62A.mjs → chunk-NDDAL2OG.mjs} +8 -6
  26. package/dist/chunk-NDDAL2OG.mjs.map +1 -0
  27. package/dist/{chunk-OJWVEEMM.mjs → chunk-R5L7WB7F.mjs} +4 -2
  28. package/dist/chunk-R5L7WB7F.mjs.map +1 -0
  29. package/dist/{chunk-B4EAAKYF.mjs → chunk-SBB2YW3Y.mjs} +2 -0
  30. package/dist/chunk-SBB2YW3Y.mjs.map +1 -0
  31. package/dist/{chunk-FWJIAW2E.mjs → chunk-SHU7JPQY.mjs} +7 -5
  32. package/dist/chunk-SHU7JPQY.mjs.map +1 -0
  33. package/dist/chunk-SRPSHHHV.mjs +3 -0
  34. package/dist/chunk-SRPSHHHV.mjs.map +1 -0
  35. package/dist/{chunk-ESVULCFY.mjs → chunk-TOFB4BTA.mjs} +3 -1
  36. package/dist/chunk-TOFB4BTA.mjs.map +1 -0
  37. package/dist/{chunk-ORVDYXDP.mjs → chunk-VKXTPLM7.mjs} +6 -4
  38. package/dist/chunk-VKXTPLM7.mjs.map +1 -0
  39. package/dist/{chunk-VVQ4CH77.mjs → chunk-X3XNTD4R.mjs} +5 -2
  40. package/dist/chunk-X3XNTD4R.mjs.map +1 -0
  41. package/dist/chunk-YYFM6P4C.mjs +3 -0
  42. package/dist/chunk-YYFM6P4C.mjs.map +1 -0
  43. package/dist/hooks.mjs +13 -11
  44. package/dist/hooks.mjs.map +1 -0
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.mjs +34 -26
  47. package/dist/index.mjs.map +1 -0
  48. package/dist/lib.mjs +6 -4
  49. package/dist/lib.mjs.map +1 -0
  50. package/dist/nodes.mjs +15 -13
  51. package/dist/nodes.mjs.map +1 -0
  52. package/dist/panels.mjs +5 -3
  53. package/dist/panels.mjs.map +1 -0
  54. package/dist/provider.mjs +5 -3
  55. package/dist/provider.mjs.map +1 -0
  56. package/dist/stores.mjs +8 -6
  57. package/dist/stores.mjs.map +1 -0
  58. package/dist/toolbar.mjs +7 -5
  59. package/dist/toolbar.mjs.map +1 -0
  60. package/dist/ui.mjs +4 -2
  61. package/dist/ui.mjs.map +1 -0
  62. package/dist/workflowStore-XYPHB6DS.mjs +4 -0
  63. package/dist/workflowStore-XYPHB6DS.mjs.map +1 -0
  64. package/package.json +3 -3
  65. package/dist/chunk-LDN7IX4Y.mjs +0 -1
  66. package/dist/chunk-MLJJBBTB.mjs +0 -1
  67. package/dist/workflowStore-N2F7WIG3.mjs +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/canvas/ConnectionDropMenu.tsx","../src/canvas/EdgeToolbar.tsx","../src/canvas/EditableEdge.tsx","../src/types/groups.ts","../src/canvas/GroupOverlay.tsx","../src/canvas/HelperLines.tsx","../src/canvas/NodeSearch.tsx","../src/canvas/PauseEdge.tsx","../src/canvas/ReferenceEdge.tsx","../src/canvas/ShortcutHelpModal.tsx","../src/components/CostModal.tsx","../src/components/GlobalImageHistory.tsx","../src/components/MultiSelectToolbar.tsx","../src/components/NotificationToast.tsx","../src/canvas/WorkflowCanvas.tsx"],"names":["useReactFlow","useMemo","jsxs","jsx","memo","Pause","useState","useRef","useEffect","useCallback","Fragment","Trash2","useReactFlowStore","NODE_DEFINITIONS","Search","X","getBezierPath","BaseEdge","position"],"mappings":"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","file":"chunk-NDDAL2OG.mjs","sourcesContent":["'use client';\n\nimport type { HandleType, NodeCategory, NodeType } from '@genfeedai/types';\nimport {\n CONNECTION_RULES,\n getNodesByCategory,\n NODE_DEFINITIONS,\n} from '@genfeedai/types';\nimport { useReactFlow } from '@xyflow/react';\nimport { Plus, Search, X } from 'lucide-react';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n ai: 'AI',\n composition: 'Composition',\n input: 'Input',\n output: 'Output',\n processing: 'Processing',\n};\n\nconst CATEGORY_ORDER: NodeCategory[] = [\n 'input',\n 'ai',\n 'processing',\n 'output',\n 'composition',\n];\n\nfunction ConnectionDropMenuComponent() {\n const { connectionDropMenu, closeConnectionDropMenu } = useUIStore();\n const { addNode, findCompatibleHandle, onConnect } = useWorkflowStore();\n const reactFlow = useReactFlow();\n const [search, setSearch] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const backdropRef = useRef<HTMLDivElement>(null);\n\n const isOpen = connectionDropMenu !== null;\n\n // Get compatible node types based on the source handle type\n const compatibleNodes = useMemo(() => {\n if (!connectionDropMenu) return [];\n\n const sourceType = connectionDropMenu.sourceHandleType;\n const compatibleTargetTypes = CONNECTION_RULES[sourceType] ?? [];\n\n const nodesByCategory = getNodesByCategory();\n const result: Array<{\n type: NodeType;\n label: string;\n category: NodeCategory;\n }> = [];\n\n for (const category of CATEGORY_ORDER) {\n const defs = nodesByCategory[category] ?? [];\n for (const def of defs) {\n // Check if any of this node's inputs accept a compatible type\n const hasCompatibleInput = def.inputs.some((input) =>\n compatibleTargetTypes.includes(input.type),\n );\n if (hasCompatibleInput) {\n result.push({\n category,\n label: def.label,\n type: def.type,\n });\n }\n }\n }\n\n return result;\n }, [connectionDropMenu]);\n\n // Filter by search\n const filteredNodes = useMemo(() => {\n if (!search.trim()) return compatibleNodes;\n const query = search.toLowerCase();\n return compatibleNodes.filter(\n (n) =>\n n.label.toLowerCase().includes(query) ||\n n.type.toLowerCase().includes(query),\n );\n }, [compatibleNodes, search]);\n\n // Group filtered nodes by category\n const groupedNodes = useMemo(() => {\n const grouped: Partial<Record<NodeCategory, typeof filteredNodes>> = {};\n for (const node of filteredNodes) {\n if (!grouped[node.category]) grouped[node.category] = [];\n grouped[node.category]!.push(node);\n }\n return grouped;\n }, [filteredNodes]);\n\n // Auto-focus input when opened\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setSelectedIndex(0);\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }, [isOpen]);\n\n // Reset selection when search changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [search]);\n\n // Scroll selected item into view\n useEffect(() => {\n if (listRef.current) {\n const items = listRef.current.querySelectorAll('[data-node-item]');\n const selected = items[selectedIndex] as HTMLElement | undefined;\n selected?.scrollIntoView({ block: 'nearest' });\n }\n }, [selectedIndex]);\n\n const handleSelect = useCallback(\n (nodeType: NodeType) => {\n if (!connectionDropMenu) return;\n\n // Convert screen position to flow position for node placement\n const position = reactFlow.screenToFlowPosition({\n x: connectionDropMenu.screenPosition.x,\n y: connectionDropMenu.screenPosition.y,\n });\n\n // Create the node\n const newNodeId = addNode(nodeType, position);\n\n // Auto-connect: find compatible handle on the new node\n const compatibleHandle = findCompatibleHandle(\n connectionDropMenu.sourceNodeId,\n connectionDropMenu.sourceHandleId,\n newNodeId,\n );\n\n if (compatibleHandle) {\n onConnect({\n source: connectionDropMenu.sourceNodeId,\n sourceHandle: connectionDropMenu.sourceHandleId,\n target: newNodeId,\n targetHandle: compatibleHandle,\n });\n }\n\n closeConnectionDropMenu();\n },\n [\n connectionDropMenu,\n reactFlow,\n addNode,\n findCompatibleHandle,\n onConnect,\n closeConnectionDropMenu,\n ],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex((prev) =>\n Math.min(prev + 1, filteredNodes.length - 1),\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === 'Enter' && filteredNodes[selectedIndex]) {\n e.preventDefault();\n handleSelect(filteredNodes[selectedIndex].type);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeConnectionDropMenu();\n }\n },\n [filteredNodes, selectedIndex, handleSelect, closeConnectionDropMenu],\n );\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === backdropRef.current) {\n closeConnectionDropMenu();\n }\n };\n\n if (!isOpen || !connectionDropMenu) return null;\n\n // Position the menu at the cursor location\n const menuStyle: React.CSSProperties = {\n left: connectionDropMenu.screenPosition.x,\n position: 'fixed',\n top: connectionDropMenu.screenPosition.y,\n zIndex: 50,\n };\n\n let flatIndex = 0;\n\n return (\n <div\n ref={backdropRef}\n className=\"fixed inset-0 z-40\"\n onClick={handleBackdropClick}\n >\n <div\n style={menuStyle}\n className=\"bg-[var(--background)] border border-[var(--border)] rounded-lg shadow-xl w-64 max-h-80 flex flex-col\"\n role=\"dialog\"\n aria-label=\"Add Node\"\n >\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-[var(--border)]\">\n <Plus className=\"w-3.5 h-3.5 text-[var(--muted-foreground)]\" />\n <span className=\"text-xs font-medium\">Add Connected Node</span>\n </div>\n\n {/* Search */}\n <div className=\"px-3 py-2\" onKeyDown={handleKeyDown}>\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-[var(--muted-foreground)]\" />\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Search compatible nodes...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full pl-7 pr-2 py-1.5 text-xs bg-[var(--secondary)] border border-[var(--border)] rounded-md outline-none focus:ring-1 focus:ring-[var(--ring)]\"\n />\n </div>\n </div>\n\n {/* Node list */}\n <div\n ref={listRef}\n className=\"flex-1 overflow-y-auto px-1.5 pb-1.5\"\n onKeyDown={handleKeyDown}\n >\n {filteredNodes.length === 0 ? (\n <div className=\"text-center text-[var(--muted-foreground)] text-xs py-4\">\n No compatible nodes found\n </div>\n ) : (\n Object.entries(groupedNodes).map(([category, nodes]) => {\n if (!nodes || nodes.length === 0) return null;\n return (\n <div key={category} className=\"mb-1\">\n <div className=\"text-[10px] font-semibold text-[var(--muted-foreground)] uppercase tracking-wider px-2 py-1\">\n {CATEGORY_LABELS[category as NodeCategory]}\n </div>\n {nodes.map((node) => {\n const currentIndex = flatIndex++;\n return (\n <button\n key={node.type}\n data-node-item\n onClick={() => handleSelect(node.type)}\n className={`w-full text-left px-2 py-1.5 rounded text-xs transition-colors ${\n currentIndex === selectedIndex\n ? 'bg-[var(--primary)]/10 text-[var(--foreground)]'\n : 'text-[var(--foreground)] hover:bg-[var(--secondary)]'\n }`}\n >\n {node.label}\n </button>\n );\n })}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport const ConnectionDropMenu = memo(ConnectionDropMenuComponent);\n","'use client';\n\nimport { useReactFlow } from '@xyflow/react';\nimport { Pause, Play, Trash2 } from 'lucide-react';\nimport { memo, useMemo } from 'react';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nfunction EdgeToolbarComponent() {\n const { selectedEdgeId, selectEdge } = useUIStore();\n const { edges, toggleEdgePause, removeEdge } = useWorkflowStore();\n const reactFlow = useReactFlow();\n\n const selectedEdge = useMemo(\n () => (selectedEdgeId ? edges.find((e) => e.id === selectedEdgeId) : null),\n [selectedEdgeId, edges],\n );\n\n const position = useMemo(() => {\n if (!selectedEdge) return null;\n\n // Get source and target node positions to compute midpoint\n const sourceNode = reactFlow.getNode(selectedEdge.source);\n const targetNode = reactFlow.getNode(selectedEdge.target);\n if (!sourceNode || !targetNode) return null;\n\n const midX =\n (sourceNode.position.x +\n (sourceNode.measured?.width ?? 280) / 2 +\n (targetNode.position.x + (targetNode.measured?.width ?? 280) / 2)) /\n 2;\n const midY =\n (sourceNode.position.y +\n (sourceNode.measured?.height ?? 200) / 2 +\n (targetNode.position.y + (targetNode.measured?.height ?? 200) / 2)) /\n 2;\n\n return reactFlow.flowToScreenPosition({ x: midX, y: midY });\n }, [selectedEdge, reactFlow]);\n\n if (!selectedEdge || !position) return null;\n\n const hasPause = selectedEdge.data?.hasPause === true;\n\n const handleTogglePause = (e: React.MouseEvent) => {\n e.stopPropagation();\n toggleEdgePause(selectedEdge.id);\n };\n\n const handleDelete = (e: React.MouseEvent) => {\n e.stopPropagation();\n removeEdge(selectedEdge.id);\n selectEdge(null);\n };\n\n return (\n <div\n className=\"fixed z-30 flex items-center gap-1 bg-[var(--background)] border border-[var(--border)] rounded-lg shadow-lg px-1.5 py-1\"\n style={{\n left: position.x,\n top: position.y - 40,\n transform: 'translateX(-50%)',\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <button\n onClick={handleTogglePause}\n title={hasPause ? 'Resume edge' : 'Pause edge'}\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n {hasPause ? (\n <Play className=\"h-3.5 w-3.5\" />\n ) : (\n <Pause className=\"h-3.5 w-3.5\" />\n )}\n </button>\n <div className=\"h-4 w-px bg-[var(--border)]\" />\n <button\n onClick={handleDelete}\n title=\"Delete edge\"\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-red-500/10 hover:text-red-500\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n}\n\nexport const EdgeToolbar = memo(EdgeToolbarComponent);\n","'use client';\n\nimport type { HandleType } from '@genfeedai/types';\nimport type { EdgeProps } from '@xyflow/react';\nimport { BaseEdge, getBezierPath } from '@xyflow/react';\nimport { Pause } from 'lucide-react';\nimport { memo } from 'react';\n\nconst DATA_TYPE_COLORS: Record<HandleType, [string, string]> = {\n audio: ['#f97316', '#fb923c'], // orange\n image: ['#3b82f6', '#60a5fa'], // blue\n number: ['#6b7280', '#9ca3af'], // gray\n text: ['#22c55e', '#4ade80'], // green\n video: ['#8b5cf6', '#a78bfa'], // purple\n};\n\nconst DEFAULT_COLORS: [string, string] = ['#6b7280', '#9ca3af'];\n\nfunction EditableEdgeComponent({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n data,\n selected,\n}: EdgeProps) {\n const [edgePath, labelX, labelY] = getBezierPath({\n sourcePosition,\n sourceX,\n sourceY,\n targetPosition,\n targetX,\n targetY,\n });\n\n const hasPause = data?.hasPause === true;\n const dataType = (data?.dataType as HandleType) ?? null;\n const [colorStart, colorEnd] = dataType\n ? (DATA_TYPE_COLORS[dataType] ?? DEFAULT_COLORS)\n : DEFAULT_COLORS;\n\n const gradientId = `edge-gradient-${id}`;\n\n return (\n <>\n {/* Gradient definition */}\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor={colorStart} />\n <stop offset=\"100%\" stopColor={colorEnd} />\n </linearGradient>\n </defs>\n\n {/* Transparent hit area for easier clicking */}\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={20}\n className=\"react-flow__edge-interaction\"\n />\n\n {/* Visible edge */}\n <BaseEdge\n path={edgePath}\n markerEnd={markerEnd}\n style={{\n ...style,\n stroke: `url(#${gradientId})`,\n strokeWidth: selected ? 3 : 2,\n ...(hasPause && {\n strokeDasharray: '8 4',\n }),\n }}\n />\n\n {/* Pause indicator at midpoint */}\n {hasPause && (\n <foreignObject\n width={20}\n height={20}\n x={labelX - 10}\n y={labelY - 10}\n className=\"pointer-events-none\"\n >\n <div className=\"flex items-center justify-center w-5 h-5 rounded-full bg-amber-500 text-white shadow-sm\">\n <Pause className=\"w-3 h-3\" />\n </div>\n </foreignObject>\n )}\n\n {/* Selection indicator */}\n {selected && !hasPause && (\n <foreignObject\n width={8}\n height={8}\n x={labelX - 4}\n y={labelY - 4}\n className=\"pointer-events-none\"\n >\n <div\n className=\"w-2 h-2 rounded-full\"\n style={{ backgroundColor: colorStart }}\n />\n </foreignObject>\n )}\n </>\n );\n}\n\nexport const EditableEdge = memo(EditableEdgeComponent);\n","/**\n * Node Group UI Constants\n * Re-exports types from shared package, defines Tailwind-specific styling\n */\n\n// Re-export types from shared package\nexport type { GroupColor, NodeGroup } from '@genfeedai/types';\n\nimport type { GroupColor } from '@genfeedai/types';\n\nexport const GROUP_COLORS: Record<\n GroupColor,\n { bg: string; border: string; text: string }\n> = {\n blue: {\n bg: 'bg-blue-500/10',\n border: 'border-blue-500/30',\n text: 'text-blue-400',\n },\n gray: {\n bg: 'bg-gray-500/10',\n border: 'border-gray-500/30',\n text: 'text-gray-400',\n },\n green: {\n bg: 'bg-green-500/10',\n border: 'border-green-500/30',\n text: 'text-green-400',\n },\n orange: {\n bg: 'bg-orange-500/10',\n border: 'border-orange-500/30',\n text: 'text-orange-400',\n },\n pink: {\n bg: 'bg-pink-500/10',\n border: 'border-pink-500/30',\n text: 'text-pink-400',\n },\n purple: {\n bg: 'bg-purple-500/10',\n border: 'border-purple-500/30',\n text: 'text-purple-400',\n },\n red: {\n bg: 'bg-red-500/10',\n border: 'border-red-500/30',\n text: 'text-red-400',\n },\n yellow: {\n bg: 'bg-yellow-500/10',\n border: 'border-yellow-500/30',\n text: 'text-yellow-400',\n },\n};\n\nexport const DEFAULT_GROUP_COLORS: GroupColor[] = [\n 'purple',\n 'blue',\n 'green',\n 'yellow',\n 'orange',\n 'red',\n 'pink',\n 'gray',\n];\n","'use client';\n\nimport type { WorkflowNode } from '@genfeedai/types';\nimport {\n useNodes,\n useReactFlow,\n useViewport,\n ViewportPortal,\n} from '@xyflow/react';\nimport { clsx } from 'clsx';\nimport { Lock, Palette, Trash2, Unlock } from 'lucide-react';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport type { GroupColor, NodeGroup } from '../types/groups';\nimport { DEFAULT_GROUP_COLORS, GROUP_COLORS } from '../types/groups';\n\nconst HEADER_HEIGHT = 32;\n\nexport interface GroupBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Calculate bounds for a group of nodes\n * Uses a Map for O(1) node lookup instead of O(n) filter\n */\nfunction calculateGroupBounds(\n nodeIds: string[],\n nodeMap: Map<string, WorkflowNode>,\n): GroupBounds | null {\n if (nodeIds.length === 0) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let foundAny = false;\n\n for (const nodeId of nodeIds) {\n const node = nodeMap.get(nodeId);\n if (!node) continue;\n\n foundAny = true;\n const width = node.measured?.width ?? 200;\n const height = node.measured?.height ?? 100;\n\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + width);\n maxY = Math.max(maxY, node.position.y + height);\n }\n\n if (!foundAny) return null;\n\n const padding = 24;\n return {\n height: maxY - minY + padding * 2 + HEADER_HEIGHT,\n width: maxX - minX + padding * 2,\n x: minX - padding,\n y: minY - padding - HEADER_HEIGHT,\n };\n}\n\ninterface GroupBackgroundProps {\n group: NodeGroup;\n bounds: GroupBounds;\n}\n\n/**\n * Group background - renders BELOW nodes\n * Uses flow coordinates directly (ViewportPortal handles transform)\n */\nfunction GroupBackground({ group, bounds }: GroupBackgroundProps) {\n const colors = GROUP_COLORS[group.color ?? 'purple'];\n\n return (\n <div\n className={clsx(\n 'absolute rounded-lg border-2 border-dashed',\n colors.bg,\n colors.border,\n group.isLocked && 'opacity-60',\n )}\n style={{\n height: bounds.height,\n left: bounds.x,\n top: bounds.y,\n width: bounds.width,\n }}\n />\n );\n}\n\ninterface GroupControlsProps {\n group: NodeGroup;\n bounds: GroupBounds;\n nodeMap: Map<string, WorkflowNode>;\n zoom: number;\n}\n\n/**\n * Group controls (header with drag, buttons) - renders ABOVE nodes\n * Uses flow coordinates directly (ViewportPortal handles transform)\n */\nfunction GroupControls({ group, bounds, nodeMap, zoom }: GroupControlsProps) {\n const { setNodes } = useReactFlow();\n const { toggleGroupLock, deleteGroup, setGroupColor, setDirty, renameGroup } =\n useWorkflowStore();\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [editName, setEditName] = useState(group.name);\n const inputRef = useRef<HTMLInputElement>(null);\n const colorPickerRef = useRef<HTMLDivElement>(null);\n\n // Drag state\n const [isDragging, setIsDragging] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n const nodeStartPositionsRef = useRef<Map<string, { x: number; y: number }>>(\n new Map(),\n );\n\n // Update edit name when group name changes externally\n useEffect(() => {\n if (!isEditing) {\n setEditName(group.name);\n }\n }, [group.name, isEditing]);\n\n // Focus input when editing starts\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n // Close color picker when clicking outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n colorPickerRef.current &&\n !colorPickerRef.current.contains(e.target as Node)\n ) {\n setShowColorPicker(false);\n }\n };\n\n if (showColorPicker) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showColorPicker]);\n\n const handleNameSubmit = useCallback(() => {\n if (editName.trim() && editName !== group.name) {\n renameGroup(group.id, editName.trim());\n } else {\n setEditName(group.name);\n }\n setIsEditing(false);\n }, [editName, group.name, group.id, renameGroup]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleNameSubmit();\n } else if (e.key === 'Escape') {\n setEditName(group.name);\n setIsEditing(false);\n }\n },\n [handleNameSubmit, group.name],\n );\n\n // Handle drag start on group header\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (group.isLocked) return;\n // Don't start drag if clicking on buttons or inputs\n if (\n (e.target as HTMLElement).closest('button') ||\n (e.target as HTMLElement).closest('input')\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n\n setIsDragging(true);\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n\n // Save initial positions of all nodes in group using O(1) Map lookup\n const positions = new Map<string, { x: number; y: number }>();\n for (const nodeId of group.nodeIds) {\n const node = nodeMap.get(nodeId);\n if (node) {\n positions.set(nodeId, { x: node.position.x, y: node.position.y });\n }\n }\n nodeStartPositionsRef.current = positions;\n },\n [group.isLocked, group.nodeIds, nodeMap],\n );\n\n // Handle drag move and end\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n\n // Convert screen delta to flow coordinates (divide by zoom)\n const deltaX = (e.clientX - dragStartRef.current.x) / zoom;\n const deltaY = (e.clientY - dragStartRef.current.y) / zoom;\n\n setNodes((currentNodes) =>\n currentNodes.map((node) => {\n const startPos = nodeStartPositionsRef.current.get(node.id);\n if (!startPos) return node;\n return {\n ...node,\n position: {\n x: startPos.x + deltaX,\n y: startPos.y + deltaY,\n },\n };\n }),\n );\n };\n\n const handleMouseUp = () => {\n setDirty(true);\n setIsDragging(false);\n dragStartRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, zoom, setNodes, setDirty]);\n\n const colors = GROUP_COLORS[group.color ?? 'purple'];\n\n const handleColorSelect = (color: GroupColor) => {\n setGroupColor(group.id, color);\n setShowColorPicker(false);\n };\n\n return (\n <>\n {/* Group Header - draggable */}\n <div\n onMouseDown={handleMouseDown}\n className={clsx(\n 'absolute flex items-center justify-between px-3 rounded-t-lg select-none pointer-events-auto',\n colors.bg,\n colors.border,\n 'border-2 border-b-0 border-dashed',\n !group.isLocked && 'cursor-grab',\n isDragging && 'cursor-grabbing',\n group.isLocked && 'opacity-60',\n )}\n style={{\n height: HEADER_HEIGHT,\n left: bounds.x,\n top: bounds.y,\n width: bounds.width,\n }}\n >\n {/* Editable Name */}\n {isEditing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={editName}\n onChange={(e) => setEditName(e.target.value)}\n onBlur={handleNameSubmit}\n onKeyDown={handleKeyDown}\n className={clsx(\n 'flex-1 bg-transparent border-none outline-none text-sm font-medium px-0 py-0',\n colors.text,\n )}\n style={{ minWidth: 0 }}\n />\n ) : (\n <span\n className={clsx('font-medium truncate cursor-text', colors.text)}\n style={{ fontSize: 14 }}\n onClick={() => setIsEditing(true)}\n >\n {group.name}\n </span>\n )}\n <div className=\"flex items-center gap-1\">\n {/* Color Picker */}\n <div className=\"relative\" ref={colorPickerRef}>\n <button\n onClick={(e) => {\n e.stopPropagation();\n setShowColorPicker(!showColorPicker);\n }}\n className={clsx(\n 'p-1 rounded hover:bg-white/10 transition-colors',\n colors.text,\n )}\n title=\"Change group color\"\n >\n <Palette className=\"w-4 h-4\" />\n </button>\n {showColorPicker && (\n <div className=\"absolute top-8 right-0 z-50 bg-card border border-border rounded-lg shadow-lg p-2 flex gap-1 flex-wrap w-[120px]\">\n {DEFAULT_GROUP_COLORS.map((color) => (\n <button\n key={color}\n onClick={(e) => {\n e.stopPropagation();\n handleColorSelect(color);\n }}\n className={clsx(\n 'w-6 h-6 rounded-md border-2 transition-transform hover:scale-110',\n GROUP_COLORS[color].bg,\n color === group.color\n ? 'border-white'\n : 'border-transparent',\n )}\n title={color}\n />\n ))}\n </div>\n )}\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleGroupLock(group.id);\n }}\n className={clsx(\n 'p-1 rounded hover:bg-white/10 transition-colors',\n colors.text,\n )}\n title={group.isLocked ? 'Unlock group' : 'Lock group'}\n >\n {group.isLocked ? (\n <Lock className=\"w-4 h-4\" />\n ) : (\n <Unlock className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation();\n deleteGroup(group.id);\n }}\n className={clsx(\n 'p-1 rounded hover:bg-white/10 transition-colors',\n colors.text,\n )}\n title=\"Delete group\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Lock Badge */}\n {group.isLocked && (\n <div\n className={clsx(\n 'absolute px-2 py-0.5 rounded text-xs font-medium pointer-events-none',\n colors.bg,\n colors.text,\n )}\n style={{\n left: bounds.x + 12,\n top: bounds.y + HEADER_HEIGHT + 8,\n }}\n >\n LOCKED\n </div>\n )}\n </>\n );\n}\n\n/**\n * Renders group backgrounds BELOW nodes (z-index: -1)\n * Must be placed inside ReactFlow component\n *\n * Optimization: Computes bounds once per group using a shared nodeMap\n */\nfunction GroupBackgroundsPortalComponent() {\n const { groups } = useWorkflowStore();\n const nodes = useNodes() as WorkflowNode[];\n\n // Create node lookup Map once - O(n) instead of O(n²) for all groups\n const nodeMap = useMemo(() => new Map(nodes.map((n) => [n.id, n])), [nodes]);\n\n // Pre-compute all bounds once\n const groupBounds = useMemo(() => {\n const result = new Map<string, GroupBounds>();\n for (const group of groups) {\n const bounds = calculateGroupBounds(group.nodeIds, nodeMap);\n if (bounds) {\n result.set(group.id, bounds);\n }\n }\n return result;\n }, [groups, nodeMap]);\n\n if (groups.length === 0) return null;\n\n return (\n <ViewportPortal>\n <div\n style={{\n left: 0,\n pointerEvents: 'none',\n position: 'absolute',\n top: 0,\n zIndex: -1,\n }}\n >\n {groups.map((group) => {\n const bounds = groupBounds.get(group.id);\n if (!bounds) return null;\n return (\n <GroupBackground key={group.id} group={group} bounds={bounds} />\n );\n })}\n </div>\n </ViewportPortal>\n );\n}\n\n/**\n * Renders group headers/controls ABOVE nodes (z-index: 1000)\n * Must be placed inside ReactFlow component\n *\n * Optimization: Computes bounds once per group using a shared nodeMap\n */\nfunction GroupControlsOverlayComponent() {\n const { groups } = useWorkflowStore();\n const nodes = useNodes() as WorkflowNode[];\n const { zoom } = useViewport();\n\n // Create node lookup Map once - O(n) instead of O(n²) for all groups\n const nodeMap = useMemo(() => new Map(nodes.map((n) => [n.id, n])), [nodes]);\n\n // Pre-compute all bounds once\n const groupBounds = useMemo(() => {\n const result = new Map<string, GroupBounds>();\n for (const group of groups) {\n const bounds = calculateGroupBounds(group.nodeIds, nodeMap);\n if (bounds) {\n result.set(group.id, bounds);\n }\n }\n return result;\n }, [groups, nodeMap]);\n\n if (groups.length === 0) return null;\n\n return (\n <ViewportPortal>\n <div\n style={{\n left: 0,\n pointerEvents: 'none',\n position: 'absolute',\n top: 0,\n zIndex: 1000,\n }}\n >\n {groups.map((group) => {\n const bounds = groupBounds.get(group.id);\n if (!bounds) return null;\n return (\n <GroupControls\n key={group.id}\n group={group}\n bounds={bounds}\n nodeMap={nodeMap}\n zoom={zoom}\n />\n );\n })}\n </div>\n </ViewportPortal>\n );\n}\n\nexport const GroupBackgroundsPortal = memo(GroupBackgroundsPortalComponent);\nexport const GroupControlsOverlay = memo(GroupControlsOverlayComponent);\n\n// Legacy export for backwards compatibility - combines both portals\nfunction GroupOverlayComponent() {\n return (\n <>\n <GroupBackgroundsPortal />\n <GroupControlsOverlay />\n </>\n );\n}\n\nexport const GroupOverlay = memo(GroupOverlayComponent);\n","'use client';\n\nimport { useStore as useReactFlowStore } from '@xyflow/react';\nimport { memo, useCallback, useEffect, useState } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\n// Threshold for snapping (in pixels at zoom level 1)\nconst SNAP_THRESHOLD = 5;\n\ninterface HelperLine {\n type: 'horizontal' | 'vertical';\n position: number; // X for vertical, Y for horizontal\n start: number; // Start position (Y for vertical, X for horizontal)\n end: number; // End position\n}\n\ninterface HelperLinesProps {\n draggingNodeId: string | null;\n}\n\nfunction HelperLinesComponent({ draggingNodeId }: HelperLinesProps) {\n const [lines, setLines] = useState<HelperLine[]>([]);\n const nodes = useWorkflowStore((state) => state.nodes);\n const transform = useReactFlowStore((state) => state.transform);\n\n // Calculate helper lines when a node is being dragged\n const calculateHelperLines = useCallback(\n (draggingId: string) => {\n const draggingNode = nodes.find((n) => n.id === draggingId);\n if (!draggingNode) {\n setLines([]);\n return;\n }\n\n const otherNodes = nodes.filter(\n (n) => n.id !== draggingId && !n.selected,\n );\n if (otherNodes.length === 0) {\n setLines([]);\n return;\n }\n\n // Get dragging node bounds (using default size if not available)\n const dragWidth =\n draggingNode.measured?.width ?? draggingNode.width ?? 220;\n const dragHeight =\n draggingNode.measured?.height ?? draggingNode.height ?? 100;\n const dragLeft = draggingNode.position.x;\n const dragRight = dragLeft + dragWidth;\n const dragTop = draggingNode.position.y;\n const dragBottom = dragTop + dragHeight;\n const dragCenterX = dragLeft + dragWidth / 2;\n const dragCenterY = dragTop + dragHeight / 2;\n\n const newLines: HelperLine[] = [];\n\n for (const node of otherNodes) {\n const nodeWidth = node.measured?.width ?? node.width ?? 220;\n const nodeHeight = node.measured?.height ?? node.height ?? 100;\n const nodeLeft = node.position.x;\n const nodeRight = nodeLeft + nodeWidth;\n const nodeTop = node.position.y;\n const nodeBottom = nodeTop + nodeHeight;\n const nodeCenterX = nodeLeft + nodeWidth / 2;\n const nodeCenterY = nodeTop + nodeHeight / 2;\n\n // Check vertical alignments (X positions)\n const verticalChecks = [\n { dragPos: dragLeft, label: 'left-left', nodePos: nodeLeft },\n { dragPos: dragLeft, label: 'left-right', nodePos: nodeRight },\n { dragPos: dragRight, label: 'right-left', nodePos: nodeLeft },\n { dragPos: dragRight, label: 'right-right', nodePos: nodeRight },\n {\n dragPos: dragCenterX,\n label: 'center-center-x',\n nodePos: nodeCenterX,\n },\n ];\n\n for (const check of verticalChecks) {\n if (Math.abs(check.dragPos - check.nodePos) <= SNAP_THRESHOLD) {\n newLines.push({\n end: Math.max(dragBottom, nodeBottom) + 20,\n position: check.nodePos,\n start: Math.min(dragTop, nodeTop) - 20,\n type: 'vertical',\n });\n }\n }\n\n // Check horizontal alignments (Y positions)\n const horizontalChecks = [\n { dragPos: dragTop, label: 'top-top', nodePos: nodeTop },\n { dragPos: dragTop, label: 'top-bottom', nodePos: nodeBottom },\n { dragPos: dragBottom, label: 'bottom-top', nodePos: nodeTop },\n { dragPos: dragBottom, label: 'bottom-bottom', nodePos: nodeBottom },\n {\n dragPos: dragCenterY,\n label: 'center-center-y',\n nodePos: nodeCenterY,\n },\n ];\n\n for (const check of horizontalChecks) {\n if (Math.abs(check.dragPos - check.nodePos) <= SNAP_THRESHOLD) {\n newLines.push({\n end: Math.max(dragRight, nodeRight) + 20,\n position: check.nodePos,\n start: Math.min(dragLeft, nodeLeft) - 20,\n type: 'horizontal',\n });\n }\n }\n }\n\n // Deduplicate lines by position (keep unique lines)\n const uniqueLines: HelperLine[] = [];\n const seenPositions = new Set<string>();\n\n for (const line of newLines) {\n const key = `${line.type}-${Math.round(line.position)}`;\n if (!seenPositions.has(key)) {\n seenPositions.add(key);\n // Extend line to cover all matching nodes\n const existingLine = uniqueLines.find(\n (l) =>\n l.type === line.type && Math.abs(l.position - line.position) < 1,\n );\n if (existingLine) {\n existingLine.start = Math.min(existingLine.start, line.start);\n existingLine.end = Math.max(existingLine.end, line.end);\n } else {\n uniqueLines.push(line);\n }\n }\n }\n\n setLines(uniqueLines);\n },\n [nodes],\n );\n\n // Update helper lines when dragging node changes position\n useEffect(() => {\n if (draggingNodeId) {\n calculateHelperLines(draggingNodeId);\n } else {\n setLines([]);\n }\n }, [draggingNodeId, calculateHelperLines]);\n\n if (lines.length === 0) return null;\n\n // Transform from flow coordinates to screen coordinates\n const [tx, ty, zoom] = transform;\n\n return (\n <svg\n className=\"absolute inset-0 pointer-events-none z-[1000]\"\n style={{ height: '100%', overflow: 'visible', width: '100%' }}\n >\n {lines.map((line, index) => {\n if (line.type === 'vertical') {\n // Vertical line (constant X)\n const x = line.position * zoom + tx;\n const y1 = line.start * zoom + ty;\n const y2 = line.end * zoom + ty;\n return (\n <line\n key={`v-${index}`}\n x1={x}\n y1={y1}\n x2={x}\n y2={y2}\n stroke=\"#3b82f6\"\n strokeWidth={1}\n strokeDasharray=\"4 2\"\n />\n );\n } else {\n // Horizontal line (constant Y)\n const y = line.position * zoom + ty;\n const x1 = line.start * zoom + tx;\n const x2 = line.end * zoom + tx;\n return (\n <line\n key={`h-${index}`}\n x1={x1}\n y1={y}\n x2={x2}\n y2={y}\n stroke=\"#3b82f6\"\n strokeWidth={1}\n strokeDasharray=\"4 2\"\n />\n );\n }\n })}\n </svg>\n );\n}\n\nexport const HelperLines = memo(HelperLinesComponent);\n","'use client';\n\nimport type { WorkflowNode } from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport { useReactFlow } from '@xyflow/react';\nimport { Search, X } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nexport function NodeSearch() {\n const { activeModal, closeModal } = useUIStore();\n const { nodes, setSelectedNodeIds } = useWorkflowStore();\n const reactFlow = useReactFlow();\n const [search, setSearch] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const listRef = useRef<HTMLDivElement>(null);\n const backdropRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isOpen = activeModal === 'nodeSearch';\n\n // Auto-focus input when opened\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n // Filter nodes by search query (fuzzy match on label, type, and comment)\n const filteredNodes = useMemo(() => {\n if (!search.trim()) return nodes;\n\n const query = search.toLowerCase();\n return nodes.filter((node) => {\n const label = (node.data.label || '').toLowerCase();\n const type = (node.type || '').toLowerCase();\n const comment = (\n (node.data as { comment?: string }).comment || ''\n ).toLowerCase();\n const nodeDefLabel =\n NODE_DEFINITIONS[\n node.type as keyof typeof NODE_DEFINITIONS\n ]?.label?.toLowerCase() || '';\n\n return (\n label.includes(query) ||\n type.includes(query) ||\n comment.includes(query) ||\n nodeDefLabel.includes(query)\n );\n });\n }, [nodes, search]);\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0);\n }, []);\n\n // Scroll selected item into view\n useEffect(() => {\n if (listRef.current) {\n const selectedItem = listRef.current.children[selectedIndex] as\n | HTMLElement\n | undefined;\n selectedItem?.scrollIntoView({ block: 'nearest' });\n }\n }, [selectedIndex]);\n\n const handleSelectNode = useCallback(\n (node: WorkflowNode) => {\n // Select the node\n setSelectedNodeIds([node.id]);\n\n // Fit view to the selected node with animation\n reactFlow.fitView({\n duration: 300,\n nodes: [node],\n padding: 0.5,\n });\n\n // Close the search modal\n closeModal();\n setSearch('');\n },\n [setSelectedNodeIds, reactFlow, closeModal],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex((prev) =>\n Math.min(prev + 1, filteredNodes.length - 1),\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === 'Enter' && filteredNodes[selectedIndex]) {\n e.preventDefault();\n handleSelectNode(filteredNodes[selectedIndex]);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n handleClose();\n }\n },\n [filteredNodes, selectedIndex, handleSelectNode],\n );\n\n const handleClose = () => {\n closeModal();\n setSearch('');\n setSelectedIndex(0);\n };\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === backdropRef.current) {\n handleClose();\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n ref={backdropRef}\n onClick={handleBackdropClick}\n className=\"fixed inset-0 z-50 flex items-start justify-center pt-[20vh]\"\n style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}\n >\n <div\n className=\"bg-[var(--background)] border border-[var(--border)] rounded-lg shadow-xl w-full max-w-lg\"\n role=\"dialog\"\n aria-label=\"Find Node\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--border)]\">\n <div className=\"flex items-center gap-2\">\n <Search className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n <span className=\"text-sm font-medium\">Find Node</span>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1 rounded hover:bg-[var(--secondary)] transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4\" onKeyDown={handleKeyDown}>\n <div className=\"relative mb-3\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Search nodes by name, type, or comment...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full pl-9 pr-3 py-2 text-sm bg-[var(--secondary)] border border-[var(--border)] rounded-md outline-none focus:ring-1 focus:ring-[var(--ring)]\"\n autoFocus\n />\n </div>\n\n <div\n ref={listRef}\n className=\"max-h-[300px] overflow-y-auto space-y-1\"\n >\n {filteredNodes.length === 0 ? (\n <div className=\"text-center text-muted-foreground py-8\">\n {search\n ? `No nodes found for \"${search}\"`\n : 'No nodes in workflow'}\n </div>\n ) : (\n filteredNodes.map((node, index) => {\n const nodeDef =\n NODE_DEFINITIONS[node.type as keyof typeof NODE_DEFINITIONS];\n const comment = (node.data as { comment?: string }).comment;\n\n return (\n <button\n key={node.id}\n onClick={() => handleSelectNode(node)}\n className={`w-full flex items-center gap-3 p-2 rounded text-left transition-colors ${\n index === selectedIndex\n ? 'bg-primary/10 border border-primary/30'\n : 'hover:bg-secondary/50 border border-transparent'\n }`}\n >\n <div className=\"flex-shrink-0 w-8 h-8 rounded bg-secondary flex items-center justify-center text-xs font-medium\">\n {nodeDef?.label?.charAt(0) || '?'}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate text-sm\">\n {node.data.label}\n </div>\n <div className=\"text-xs text-muted-foreground truncate\">\n {nodeDef?.label || node.type}\n {comment && ` · ${comment}`}\n </div>\n </div>\n </button>\n );\n })\n )}\n </div>\n\n {filteredNodes.length > 0 && (\n <div className=\"mt-3 pt-3 border-t border-border text-xs text-muted-foreground flex gap-4\">\n <span>\n <kbd className=\"px-1.5 py-0.5 bg-secondary rounded\">\n up/down\n </kbd>{' '}\n Navigate\n </span>\n <span>\n <kbd className=\"px-1.5 py-0.5 bg-secondary rounded\">Enter</kbd>{' '}\n Select\n </span>\n <span>\n <kbd className=\"px-1.5 py-0.5 bg-secondary rounded\">Esc</kbd>{' '}\n Close\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { EdgeProps } from '@xyflow/react';\nimport { BaseEdge, getBezierPath } from '@xyflow/react';\nimport { Pause } from 'lucide-react';\nimport { memo } from 'react';\n\nfunction PauseEdgeComponent({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n data,\n}: EdgeProps) {\n const [edgePath, labelX, labelY] = getBezierPath({\n sourcePosition,\n sourceX,\n sourceY,\n targetPosition,\n targetX,\n targetY,\n });\n\n const hasPause = data?.hasPause === true;\n\n return (\n <>\n <BaseEdge\n path={edgePath}\n markerEnd={markerEnd}\n style={{\n ...style,\n ...(hasPause && {\n stroke: '#f59e0b',\n strokeDasharray: '5 5',\n }),\n }}\n />\n {hasPause && (\n <foreignObject\n width={20}\n height={20}\n x={labelX - 10}\n y={labelY - 10}\n className=\"pointer-events-none\"\n >\n <div className=\"flex items-center justify-center w-5 h-5 rounded-full bg-amber-500 text-white\">\n <Pause className=\"w-3 h-3\" />\n </div>\n </foreignObject>\n )}\n </>\n );\n}\n\nexport const PauseEdge = memo(PauseEdgeComponent);\n","'use client';\n\nimport { BaseEdge, type EdgeProps, getBezierPath } from '@xyflow/react';\nimport { useMemo } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nconst REFERENCE_COLOR = '#52525b';\n\nexport function ReferenceEdge({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style,\n markerEnd,\n source,\n target,\n}: EdgeProps) {\n const nodes = useWorkflowStore((state) => state.nodes);\n\n const isConnectedToSelection = useMemo(() => {\n const selectedNodes = nodes.filter((n) => n.selected);\n if (selectedNodes.length === 0) return false;\n return selectedNodes.some((n) => n.id === source || n.id === target);\n }, [nodes, source, target]);\n\n const [edgePath] = useMemo(() => {\n return getBezierPath({\n curvature: 0.25,\n sourcePosition,\n sourceX,\n sourceY,\n targetPosition,\n targetX,\n targetY,\n });\n }, [sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition]);\n\n const gradientId = useMemo(() => {\n const selectionKey = isConnectedToSelection ? 'active' : 'dimmed';\n return `reference-gradient-${selectionKey}-${id}`;\n }, [isConnectedToSelection, id]);\n\n return (\n <>\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop\n offset=\"0%\"\n stopColor={REFERENCE_COLOR}\n stopOpacity={isConnectedToSelection ? 1 : 0.25}\n />\n <stop\n offset=\"50%\"\n stopColor={REFERENCE_COLOR}\n stopOpacity={isConnectedToSelection ? 0.55 : 0.1}\n />\n <stop\n offset=\"100%\"\n stopColor={REFERENCE_COLOR}\n stopOpacity={isConnectedToSelection ? 1 : 0.25}\n />\n </linearGradient>\n </defs>\n\n <BaseEdge\n id={id}\n path={edgePath}\n markerEnd={markerEnd}\n style={{\n ...style,\n stroke: `url(#${gradientId})`,\n strokeDasharray: '6 4',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n strokeWidth: 2,\n }}\n />\n\n {/* Invisible wider path for easier selection */}\n <path\n d={edgePath}\n fill=\"none\"\n strokeWidth={10}\n stroke=\"transparent\"\n className=\"react-flow__edge-interaction\"\n />\n </>\n );\n}\n","'use client';\n\nimport { Keyboard, Search, X } from 'lucide-react';\nimport { useMemo, useRef, useState } from 'react';\nimport { useUIStore } from '../stores/uiStore';\n\ninterface ShortcutItem {\n keys: string;\n description: string;\n category: string;\n}\n\nconst SHORTCUTS: ShortcutItem[] = [\n // Navigation\n { category: 'Navigation', description: 'Pan canvas', keys: 'Scroll' },\n { category: 'Navigation', description: 'Zoom in/out', keys: 'Ctrl + Scroll' },\n {\n category: 'Navigation',\n description: 'Fit view to selection (or all)',\n keys: 'F',\n },\n { category: 'Navigation', description: 'Toggle sidebar', keys: 'M' },\n\n // Selection\n { category: 'Selection', description: 'Select node', keys: 'Click' },\n {\n category: 'Selection',\n description: 'Add to selection',\n keys: 'Shift + Click',\n },\n { category: 'Selection', description: 'Marquee select', keys: 'Drag' },\n { category: 'Selection', description: 'Select all nodes', keys: 'Ctrl + A' },\n { category: 'Selection', description: 'Search nodes', keys: 'Ctrl + F' },\n\n // Editing\n { category: 'Editing', description: 'Undo', keys: 'Ctrl + Z' },\n { category: 'Editing', description: 'Redo', keys: 'Ctrl + Shift + Z' },\n { category: 'Editing', description: 'Copy', keys: 'Ctrl + C' },\n { category: 'Editing', description: 'Cut', keys: 'Ctrl + X' },\n { category: 'Editing', description: 'Paste', keys: 'Ctrl + V' },\n { category: 'Editing', description: 'Duplicate', keys: 'Ctrl + D' },\n {\n category: 'Editing',\n description: 'Delete selected',\n keys: 'Delete / Backspace',\n },\n\n // Nodes\n { category: 'Nodes', description: 'Add Image Gen node', keys: 'Shift + I' },\n { category: 'Nodes', description: 'Add Video Gen node', keys: 'Shift + V' },\n { category: 'Nodes', description: 'Add Prompt node', keys: 'Shift + P' },\n { category: 'Nodes', description: 'Add LLM node', keys: 'Shift + L' },\n\n // Organization\n {\n category: 'Organization',\n description: 'Toggle lock on selected',\n keys: 'L',\n },\n {\n category: 'Organization',\n description: 'Group selected nodes',\n keys: 'Ctrl + G',\n },\n {\n category: 'Organization',\n description: 'Ungroup',\n keys: 'Ctrl + Shift + G',\n },\n {\n category: 'Organization',\n description: 'Unlock all nodes',\n keys: 'Ctrl + Shift + L',\n },\n\n // Help\n { category: 'Help', description: 'Show this help', keys: '?' },\n];\n\nconst CATEGORIES = [\n 'Navigation',\n 'Selection',\n 'Editing',\n 'Nodes',\n 'Organization',\n 'Help',\n];\n\nexport function ShortcutHelpModal() {\n const { activeModal, closeModal } = useUIStore();\n const [searchQuery, setSearchQuery] = useState('');\n const backdropRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isOpen = activeModal === 'shortcutHelp';\n\n const filteredShortcuts = useMemo(() => {\n if (!searchQuery.trim()) return SHORTCUTS;\n\n const query = searchQuery.toLowerCase();\n return SHORTCUTS.filter(\n (shortcut) =>\n shortcut.keys.toLowerCase().includes(query) ||\n shortcut.description.toLowerCase().includes(query) ||\n shortcut.category.toLowerCase().includes(query),\n );\n }, [searchQuery]);\n\n const groupedShortcuts = useMemo(() => {\n const grouped: Record<string, ShortcutItem[]> = {};\n for (const category of CATEGORIES) {\n const items = filteredShortcuts.filter((s) => s.category === category);\n if (items.length > 0) {\n grouped[category] = items;\n }\n }\n return grouped;\n }, [filteredShortcuts]);\n\n const handleClose = () => {\n closeModal();\n setSearchQuery('');\n };\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === backdropRef.current) {\n handleClose();\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n ref={backdropRef}\n onClick={handleBackdropClick}\n className=\"fixed inset-0 z-50 flex items-start justify-center pt-[15vh]\"\n style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}\n >\n <div\n className=\"bg-[var(--background)] border border-[var(--border)] rounded-lg shadow-xl w-full max-w-2xl\"\n role=\"dialog\"\n aria-label=\"Keyboard Shortcuts\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--border)]\">\n <div className=\"flex items-center gap-2\">\n <Keyboard className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n <span className=\"text-sm font-medium\">Keyboard Shortcuts</span>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1 rounded hover:bg-[var(--secondary)] transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n <div className=\"relative mb-4\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Search shortcuts...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-9 pr-3 py-2 text-sm bg-[var(--secondary)] border border-[var(--border)] rounded-md outline-none focus:ring-1 focus:ring-[var(--ring)]\"\n autoFocus\n />\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto space-y-6 pr-2\">\n {Object.entries(groupedShortcuts).map(([category, shortcuts]) => (\n <div key={category}>\n <h3 className=\"text-sm font-semibold text-muted-foreground mb-2\">\n {category}\n </h3>\n <div className=\"space-y-1\">\n {shortcuts.map((shortcut) => (\n <div\n key={shortcut.keys}\n className=\"flex items-center justify-between py-1.5 px-2 rounded hover:bg-secondary/50\"\n >\n <span className=\"text-sm\">{shortcut.description}</span>\n <kbd className=\"px-2 py-1 text-xs font-mono bg-secondary rounded border border-border\">\n {shortcut.keys}\n </kbd>\n </div>\n ))}\n </div>\n </div>\n ))}\n\n {filteredShortcuts.length === 0 && (\n <div className=\"text-center text-muted-foreground py-8\">\n No shortcuts found for &quot;{searchQuery}&quot;\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { DollarSign, X } from 'lucide-react';\nimport { useMemo, useRef } from 'react';\nimport { calculateWorkflowCost, formatCost } from '../lib/costCalculator';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nexport function CostModal() {\n const { activeModal, closeModal } = useUIStore();\n const nodes = useWorkflowStore((state) => state.nodes);\n const actualCost = useExecutionStore((state) => state.actualCost);\n const backdropRef = useRef<HTMLDivElement>(null);\n\n const isOpen = activeModal === 'cost';\n\n const breakdown = useMemo(() => calculateWorkflowCost(nodes), [nodes]);\n\n const handleClose = () => {\n closeModal();\n };\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === backdropRef.current) {\n handleClose();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose();\n }\n };\n\n if (!isOpen) return null;\n\n const hasActualCost = actualCost > 0;\n const variance = hasActualCost ? actualCost - breakdown.total : 0;\n\n return (\n <div\n ref={backdropRef}\n onClick={handleBackdropClick}\n onKeyDown={handleKeyDown}\n className=\"fixed inset-0 z-50 flex items-start justify-center pt-[15vh]\"\n style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}\n >\n <div\n className=\"bg-[var(--background)] border border-[var(--border)] rounded-lg shadow-xl w-full max-w-lg\"\n role=\"dialog\"\n aria-label=\"Cost Breakdown\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--border)]\">\n <div className=\"flex items-center gap-2\">\n <DollarSign className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n <span className=\"text-sm font-medium\">Cost Breakdown</span>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1 rounded hover:bg-[var(--secondary)] transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {breakdown.items.length === 0 ? (\n <div className=\"text-center text-[var(--muted-foreground)] py-8\">\n No billable nodes in workflow\n </div>\n ) : (\n <>\n {/* Table */}\n <div className=\"max-h-[40vh] overflow-y-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-[var(--muted-foreground)] border-b border-[var(--border)]\">\n <th className=\"pb-2 font-medium\">Node</th>\n <th className=\"pb-2 font-medium\">Model</th>\n <th className=\"pb-2 font-medium\">Unit</th>\n <th className=\"pb-2 font-medium text-right\">Cost</th>\n </tr>\n </thead>\n <tbody>\n {breakdown.items.map((estimate) => (\n <tr\n key={estimate.nodeId}\n className=\"border-b border-[var(--border)] last:border-0\"\n >\n <td\n className=\"py-2 truncate max-w-[120px]\"\n title={estimate.nodeLabel}\n >\n {estimate.nodeLabel}\n </td>\n <td className=\"py-2 text-[var(--muted-foreground)] font-mono text-xs\">\n {estimate.model}\n </td>\n <td className=\"py-2 text-[var(--muted-foreground)] text-xs\">\n {estimate.unit}\n </td>\n <td className=\"py-2 text-right font-mono\">\n {formatCost(estimate.subtotal)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Summary */}\n <div className=\"mt-4 pt-3 border-t border-[var(--border)] space-y-1.5\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-[var(--muted-foreground)]\">\n Estimated Total\n </span>\n <span className=\"font-mono font-medium\">\n {formatCost(breakdown.total)}\n </span>\n </div>\n {hasActualCost && (\n <>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-[var(--muted-foreground)]\">\n Actual Cost\n </span>\n <span className=\"font-mono font-medium text-green-500\">\n {formatCost(actualCost)}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-[var(--muted-foreground)]\">\n Variance\n </span>\n <span\n className={`font-mono text-xs ${\n variance > 0\n ? 'text-red-400'\n : variance < 0\n ? 'text-green-400'\n : 'text-[var(--muted-foreground)]'\n }`}\n >\n {variance > 0 ? '+' : ''}\n {formatCost(variance)}\n </span>\n </div>\n </>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { ImageHistoryItem } from '../stores/workflow/types';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nconst EMPTY_HISTORY: ImageHistoryItem[] = [];\n\nfunction formatRelativeTime(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'Just now';\n}\n\nfunction calculateFanPosition(index: number, _total: number) {\n const verticalSpacing = 60;\n const curveStrength = 0.15;\n const xOffset = index * index * curveStrength;\n\n const x = -28 + xOffset;\n const y = -(index * verticalSpacing + 56);\n\n return { x, y };\n}\n\nfunction FanItem({\n item,\n index,\n total,\n onDragStart,\n}: {\n item: ImageHistoryItem;\n index: number;\n total: number;\n onDragStart: (e: React.DragEvent, item: ImageHistoryItem) => void;\n}) {\n const { x, y } = calculateFanPosition(index, total);\n const delay = index * 30;\n\n return (\n <button\n draggable\n onDragStart={(e) => onDragStart(e, item)}\n className=\"absolute w-14 h-14 rounded-lg overflow-hidden border-2 border-neutral-600 hover:border-blue-500 shadow-lg cursor-grab active:cursor-grabbing transition-colors duration-150 animate-fan-enter group\"\n style={\n {\n '--fan-x': `${x}px`,\n '--fan-y': `${y}px`,\n animationDelay: `${delay}ms`,\n zIndex: 10 - index,\n } as React.CSSProperties\n }\n title={`${formatRelativeTime(item.timestamp)}\\n${item.prompt?.substring(0, 50) || ''}...`}\n >\n <img\n src={item.image}\n alt={`History ${index + 1}`}\n className=\"w-full h-full object-cover pointer-events-none\"\n draggable={false}\n />\n </button>\n );\n}\n\nfunction HistorySidebar({\n history,\n onClear,\n onClose,\n onDragStart,\n triggerRect,\n}: {\n history: ImageHistoryItem[];\n onClear: () => void;\n onClose: () => void;\n onDragStart: (e: React.DragEvent, item: ImageHistoryItem) => void;\n triggerRect: DOMRect | null;\n}) {\n const sidebarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n sidebarRef.current &&\n !sidebarRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [onClose]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n const sidebarStyle: React.CSSProperties = {\n position: 'fixed',\n zIndex: 200,\n };\n\n if (triggerRect) {\n const left = Math.max(16, triggerRect.left - 140);\n const bottom = window.innerHeight - triggerRect.top + 8;\n sidebarStyle.left = `${left}px`;\n sidebarStyle.bottom = `${bottom}px`;\n } else {\n sidebarStyle.right = '100px';\n sidebarStyle.bottom = '100px';\n }\n\n return createPortal(\n <div\n ref={sidebarRef}\n className=\"w-80 max-h-[420px] bg-neutral-800 border border-neutral-600 rounded-lg shadow-xl flex flex-col\"\n style={sidebarStyle}\n >\n <div className=\"px-4 py-3 border-b border-neutral-700 flex items-center justify-between shrink-0\">\n <span className=\"text-sm text-neutral-200 font-medium\">\n All History ({history.length})\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onClear}\n className=\"text-[10px] text-neutral-500 hover:text-red-400 transition-colors\"\n title=\"Clear all history\"\n >\n Clear All\n </button>\n <button\n onClick={onClose}\n className=\"w-5 h-5 rounded hover:bg-neutral-700 flex items-center justify-center text-neutral-400 hover:text-white transition-colors\"\n title=\"Close\"\n >\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1.5\">\n {history.map((item, index) => (\n <div\n key={item.id}\n draggable\n onDragStart={(e) => onDragStart(e, item)}\n className=\"flex gap-3 p-2 rounded-lg hover:bg-neutral-700/50 cursor-grab active:cursor-grabbing group transition-colors\"\n >\n <div className=\"w-14 h-14 rounded overflow-hidden shrink-0 border border-neutral-600 group-hover:border-blue-500 transition-colors\">\n <img\n src={item.image}\n alt={`History ${index + 1}`}\n className=\"w-full h-full object-cover pointer-events-none\"\n draggable={false}\n />\n </div>\n <div className=\"flex-1 min-w-0 flex flex-col justify-center\">\n <p className=\"text-[11px] text-neutral-300 truncate\">\n {item.prompt?.substring(0, 60) || 'No prompt'}\n </p>\n <p className=\"text-[10px] text-neutral-500 mt-0.5\">\n {formatRelativeTime(item.timestamp)}\n {item.model ? ` · ${item.model}` : ''}\n </p>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"px-4 py-2 border-t border-neutral-700 bg-neutral-900/50 shrink-0\">\n <span className=\"text-[10px] text-neutral-500\">\n Drag images to canvas to create nodes\n </span>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport function GlobalImageHistory() {\n const [isOpen, setIsOpen] = useState(false);\n const [showSidebar, setShowSidebar] = useState(false);\n const drawerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const history = useWorkflowStore(\n (state) => state.globalImageHistory ?? EMPTY_HISTORY,\n );\n const clearGlobalHistory = useWorkflowStore(\n (state) => state.clearGlobalHistory,\n );\n\n const fanItems = history.slice(0, 10);\n const hasOverflow = history.length > 10;\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n drawerRef.current &&\n !drawerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen && !showSidebar) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, showSidebar]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (showSidebar) {\n setShowSidebar(false);\n } else {\n setIsOpen(false);\n }\n }\n };\n if (isOpen || showSidebar) {\n document.addEventListener('keydown', handleKeyDown);\n }\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, showSidebar]);\n\n const handleDragStart = useCallback(\n (e: React.DragEvent, item: ImageHistoryItem) => {\n e.dataTransfer.setData(\n 'application/history-image',\n JSON.stringify({\n image: item.image,\n prompt: item.prompt,\n timestamp: item.timestamp,\n }),\n );\n e.dataTransfer.effectAllowed = 'copy';\n\n // Defer state change to prevent unmounting mid-drag\n setTimeout(() => {\n setIsOpen(false);\n setShowSidebar(false);\n }, 0);\n },\n [],\n );\n\n const handleShowAll = useCallback(() => {\n setIsOpen(false);\n setShowSidebar(true);\n }, []);\n\n const handleCloseSidebar = useCallback(() => {\n setShowSidebar(false);\n }, []);\n\n const handleClear = useCallback(() => {\n clearGlobalHistory();\n setIsOpen(false);\n setShowSidebar(false);\n }, [clearGlobalHistory]);\n\n if (history.length === 0) return null;\n\n return (\n <div ref={drawerRef} className=\"absolute bottom-4 right-64 z-10\">\n <button\n ref={triggerRef}\n onClick={() => setIsOpen(!isOpen)}\n className=\"relative w-8 h-8 rounded-lg flex items-center justify-center bg-neutral-800 hover:bg-neutral-700 border border-neutral-600 text-neutral-400 hover:text-white shadow-lg transition-colors\"\n title={`${history.length} image${history.length > 1 ? 's' : ''} in history`}\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span className=\"absolute -top-1.5 -right-1.5 min-w-[18px] h-[18px] px-1 bg-blue-500 rounded-full text-[10px] text-white flex items-center justify-center font-bold\">\n {history.length > 99 ? '99+' : history.length}\n </span>\n </button>\n\n {isOpen && (\n <div\n className=\"absolute bottom-full right-1/2 translate-x-1/2 mb-2\"\n style={{ zIndex: 100 }}\n >\n <div className=\"relative w-0 h-0\">\n {fanItems.map((item, index) => (\n <FanItem\n key={item.id}\n item={item}\n index={index}\n total={fanItems.length}\n onDragStart={handleDragStart}\n />\n ))}\n </div>\n\n {hasOverflow &&\n (() => {\n const topItemPos = calculateFanPosition(\n fanItems.length - 1,\n fanItems.length,\n );\n return (\n <button\n onClick={handleShowAll}\n className=\"absolute animate-fan-enter bg-neutral-800 hover:bg-neutral-700 border border-neutral-600 rounded-lg px-2 py-1 text-[10px] text-neutral-300 hover:text-white shadow-lg transition-colors whitespace-nowrap\"\n style={\n {\n '--fan-x': `${topItemPos.x}px`,\n '--fan-y': `${topItemPos.y - 60}px`,\n animationDelay: `${fanItems.length * 30}ms`,\n } as React.CSSProperties\n }\n >\n +{history.length - 10} more\n </button>\n );\n })()}\n </div>\n )}\n\n {showSidebar && (\n <HistorySidebar\n history={history}\n onClear={handleClear}\n onClose={handleCloseSidebar}\n onDragStart={handleDragStart}\n triggerRect={triggerRef.current?.getBoundingClientRect() || null}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { WorkflowNode } from '@genfeedai/types';\nimport { useReactFlow } from '@xyflow/react';\nimport {\n AlignHorizontalSpaceAround,\n AlignVerticalSpaceAround,\n Grid3X3,\n Group,\n Ungroup,\n} from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nconst NODE_GAP = 32;\nconst EST_NODE_WIDTH = 280;\nconst EST_NODE_HEIGHT = 200;\n\ninterface MultiSelectToolbarProps {\n onDownloadAsZip?: (nodes: WorkflowNode[]) => void;\n}\n\nfunction MultiSelectToolbarComponent({\n onDownloadAsZip,\n}: MultiSelectToolbarProps) {\n const {\n nodes,\n selectedNodeIds,\n onNodesChange,\n createGroup,\n deleteGroup,\n groups,\n } = useWorkflowStore();\n const reactFlow = useReactFlow();\n\n const selectedNodes = useMemo(\n () => nodes.filter((n) => selectedNodeIds.includes(n.id)),\n [nodes, selectedNodeIds],\n );\n\n // Find if selected nodes belong to a group\n const selectedGroup = useMemo(() => {\n if (selectedNodes.length < 2) return null;\n return (\n groups.find((g) =>\n selectedNodeIds.every((id) => g.nodeIds.includes(id)),\n ) ?? null\n );\n }, [groups, selectedNodeIds, selectedNodes.length]);\n\n // Position: above bounding box of selected nodes\n const toolbarPosition = useMemo(() => {\n if (selectedNodes.length < 2) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n\n for (const node of selectedNodes) {\n const x = node.position.x;\n const y = node.position.y;\n const w = node.measured?.width ?? EST_NODE_WIDTH;\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x + w > maxX) maxX = x + w;\n }\n\n const centerX = (minX + maxX) / 2;\n const topY = minY - 48;\n\n return reactFlow.flowToScreenPosition({ x: centerX, y: topY });\n }, [selectedNodes, reactFlow]);\n\n const stackHorizontal = useCallback(() => {\n if (selectedNodes.length < 2) return;\n const sorted = [...selectedNodes].sort(\n (a, b) => a.position.x - b.position.x,\n );\n const baseY = sorted[0].position.y;\n\n const changes = sorted.map((node, i) => ({\n id: node.id,\n position: {\n x: sorted[0].position.x + i * (EST_NODE_WIDTH + NODE_GAP),\n y: baseY,\n },\n type: 'position' as const,\n }));\n\n onNodesChange(changes);\n }, [selectedNodes, onNodesChange]);\n\n const stackVertical = useCallback(() => {\n if (selectedNodes.length < 2) return;\n const sorted = [...selectedNodes].sort(\n (a, b) => a.position.y - b.position.y,\n );\n const baseX = sorted[0].position.x;\n\n const changes = sorted.map((node, i) => ({\n id: node.id,\n position: {\n x: baseX,\n y: sorted[0].position.y + i * (EST_NODE_HEIGHT + NODE_GAP),\n },\n type: 'position' as const,\n }));\n\n onNodesChange(changes);\n }, [selectedNodes, onNodesChange]);\n\n const arrangeGrid = useCallback(() => {\n if (selectedNodes.length < 2) return;\n const cols = Math.ceil(Math.sqrt(selectedNodes.length));\n\n // Sort nodes top-to-bottom, left-to-right\n const sorted = [...selectedNodes].sort((a, b) => {\n const rowDiff =\n Math.floor(a.position.y / EST_NODE_HEIGHT) -\n Math.floor(b.position.y / EST_NODE_HEIGHT);\n if (rowDiff !== 0) return rowDiff;\n return a.position.x - b.position.x;\n });\n\n const baseX = sorted[0].position.x;\n const baseY = sorted[0].position.y;\n\n const changes = sorted.map((node, i) => ({\n id: node.id,\n position: {\n x: baseX + (i % cols) * (EST_NODE_WIDTH + NODE_GAP),\n y: baseY + Math.floor(i / cols) * (EST_NODE_HEIGHT + NODE_GAP),\n },\n type: 'position' as const,\n }));\n\n onNodesChange(changes);\n }, [selectedNodes, onNodesChange]);\n\n const handleGroup = useCallback(() => {\n if (selectedNodeIds.length < 2) return;\n createGroup(selectedNodeIds);\n }, [selectedNodeIds, createGroup]);\n\n const handleUngroup = useCallback(() => {\n if (!selectedGroup) return;\n deleteGroup(selectedGroup.id);\n }, [selectedGroup, deleteGroup]);\n\n if (selectedNodes.length < 2 || !toolbarPosition) return null;\n\n return (\n <div\n className=\"fixed z-30 flex items-center gap-1 bg-[var(--background)] border border-[var(--border)] rounded-lg shadow-lg px-1.5 py-1\"\n style={{\n left: toolbarPosition.x,\n top: toolbarPosition.y,\n transform: 'translateX(-50%)',\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* Selection count */}\n <span className=\"px-1.5 text-xs font-medium text-[var(--muted-foreground)]\">\n {selectedNodeIds.length}\n </span>\n\n <div className=\"h-4 w-px bg-[var(--border)]\" />\n\n {/* Stack Horizontal */}\n <button\n onClick={stackHorizontal}\n title=\"Stack horizontal\"\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n <AlignHorizontalSpaceAround className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Stack Vertical */}\n <button\n onClick={stackVertical}\n title=\"Stack vertical\"\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n <AlignVerticalSpaceAround className=\"h-3.5 w-3.5\" />\n </button>\n\n {/* Grid */}\n <button\n onClick={arrangeGrid}\n title=\"Arrange as grid\"\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n <Grid3X3 className=\"h-3.5 w-3.5\" />\n </button>\n\n <div className=\"h-4 w-px bg-[var(--border)]\" />\n\n {/* Group / Ungroup */}\n {selectedGroup ? (\n <button\n onClick={handleUngroup}\n title=\"Ungroup\"\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n <Ungroup className=\"h-3.5 w-3.5\" />\n </button>\n ) : (\n <button\n onClick={handleGroup}\n title=\"Group\"\n className=\"flex h-7 w-7 items-center justify-center rounded text-[var(--muted-foreground)] transition hover:bg-[var(--secondary)] hover:text-[var(--foreground)]\"\n >\n <Group className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n );\n}\n\nexport const MultiSelectToolbar = memo(MultiSelectToolbarComponent);\n","'use client';\n\nimport {\n AlertTriangle,\n Check,\n CheckCircle,\n Copy,\n Info,\n X,\n XCircle,\n} from 'lucide-react';\nimport { useCallback, useState } from 'react';\nimport { useUIStore } from '../stores/uiStore';\n\nconst typeStyles = {\n error: 'bg-red-900 border-red-700 text-red-100',\n info: 'bg-neutral-800 border-neutral-600 text-neutral-100',\n success: 'bg-green-900 border-green-700 text-green-100',\n warning: 'bg-orange-900 border-orange-600 text-orange-100',\n} as const;\n\nconst typeIcons = {\n error: XCircle,\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n} as const;\n\nfunction NotificationItem({\n id,\n type,\n title,\n message,\n}: {\n id: string;\n type: 'info' | 'success' | 'warning' | 'error';\n title: string;\n message?: string;\n}) {\n const removeNotification = useUIStore((state) => state.removeNotification);\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n const textToCopy = message ? `${title}\\n\\n${message}` : title;\n await navigator.clipboard.writeText(textToCopy);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [title, message]);\n\n const Icon = typeIcons[type];\n\n return (\n <div\n className={`flex flex-col rounded-lg border shadow-xl animate-in fade-in slide-in-from-top-4 duration-300 max-w-md ${typeStyles[type]}`}\n >\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Icon className=\"w-5 h-5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <span className=\"text-sm font-medium\">{title}</span>\n {message && (\n <p className=\"text-xs opacity-80 mt-0.5 break-words\">{message}</p>\n )}\n </div>\n <button\n onClick={handleCopy}\n className=\"p-1 rounded hover:bg-white/10 transition-colors shrink-0\"\n title=\"Copy message\"\n >\n {copied ? (\n <Check className=\"w-4 h-4\" />\n ) : (\n <Copy className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={() => removeNotification(id)}\n className=\"p-1 rounded hover:bg-white/10 transition-colors shrink-0\"\n title=\"Dismiss\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n );\n}\n\nexport function NotificationToast() {\n const notifications = useUIStore((state) => state.notifications);\n\n if (notifications.length === 0) return null;\n\n return (\n <div className=\"fixed top-6 right-6 z-[200] flex flex-col gap-2\">\n {notifications.map((notification) => (\n <NotificationItem\n key={notification.id}\n id={notification.id}\n type={notification.type}\n title={notification.title}\n message={notification.message}\n />\n ))}\n </div>\n );\n}\n","'use client';\n\nimport {\n Background,\n BackgroundVariant,\n type Connection,\n ConnectionMode,\n Controls,\n type EdgeTypes,\n MiniMap,\n type Node,\n type NodeTypes,\n ReactFlow,\n SelectionMode,\n useReactFlow,\n} from '@xyflow/react';\nimport { PanelLeft } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport '@xyflow/react/dist/style.css';\n\nimport type {\n HandleType,\n ImageGenNodeData,\n NodeType,\n VideoGenNodeData,\n WorkflowEdge,\n WorkflowNode,\n} from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport { CostModal } from '../components/CostModal';\nimport { ContextMenu } from '../components/context-menu';\nimport { GlobalImageHistory } from '../components/GlobalImageHistory';\nimport { MultiSelectToolbar } from '../components/MultiSelectToolbar';\nimport { NotificationToast } from '../components/NotificationToast';\nimport { useCanvasKeyboardShortcuts } from '../hooks/useCanvasKeyboardShortcuts';\nimport { useContextMenu } from '../hooks/useContextMenu';\nimport { nodeTypes as defaultNodeTypes } from '../nodes';\nimport { NodeDetailModal } from '../nodes/NodeDetailModal';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useSettingsStore } from '../stores/settingsStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { getHandleType } from '../stores/workflow/helpers/nodeHelpers';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport { ConnectionDropMenu } from './ConnectionDropMenu';\nimport { EdgeToolbar } from './EdgeToolbar';\nimport { EditableEdge } from './EditableEdge';\nimport { GroupOverlay } from './GroupOverlay';\nimport { HelperLines } from './HelperLines';\nimport { NodeSearch } from './NodeSearch';\nimport { ReferenceEdge } from './ReferenceEdge';\nimport { ShortcutHelpModal } from './ShortcutHelpModal';\n\nconst DEFAULT_NODE_COLOR = '#6b7280';\n\n/**\n * Check if the model's schema supports image input\n * Used to determine whether to enable/disable image input handles\n */\nfunction supportsImageInput(\n schema: Record<string, unknown> | undefined,\n): boolean {\n if (!schema) return true; // Default to true if no schema\n\n const properties = (schema as { properties?: Record<string, unknown> })\n .properties;\n if (!properties) return true;\n\n // Check for common image input field names across providers\n return !!(\n properties.image ||\n properties.image_input ||\n properties.image_url ||\n properties.image_urls ||\n properties.start_image ||\n properties.first_frame_image ||\n properties.reference_images\n );\n}\n\nfunction getEdgeDataType(\n edge: WorkflowEdge,\n nodeMap: Map<string, WorkflowNode>,\n): HandleType | null {\n const sourceNode = nodeMap.get(edge.source);\n if (!sourceNode) return null;\n\n const nodeDef = NODE_DEFINITIONS[sourceNode.type as NodeType];\n if (!nodeDef) return null;\n\n const sourceHandle = nodeDef.outputs.find((h) => h.id === edge.sourceHandle);\n return sourceHandle?.type ?? null;\n}\n\nconst edgeTypesMap: EdgeTypes = {\n bezier: EditableEdge,\n default: EditableEdge,\n reference: ReferenceEdge,\n};\n\ninterface WorkflowCanvasProps {\n /** Override default node types. Pass merged core + cloud nodeTypes here. */\n nodeTypes?: NodeTypes;\n /** Optional callback for download-as-ZIP of selected nodes */\n onDownloadAsZip?: (nodes: WorkflowNode[]) => void;\n}\n\nexport function WorkflowCanvas({\n nodeTypes: nodeTypesProp,\n onDownloadAsZip,\n}: WorkflowCanvasProps = {}) {\n const {\n nodes,\n edges,\n onNodesChange,\n onEdgesChange,\n onConnect,\n isValidConnection,\n findCompatibleHandle,\n addNode,\n selectedNodeIds,\n setSelectedNodeIds,\n toggleNodeLock,\n createGroup,\n deleteGroup,\n unlockAllNodes,\n groups,\n getConnectedNodeIds,\n } = useWorkflowStore();\n\n const {\n selectNode,\n selectEdge,\n setHighlightedNodeIds,\n highlightedNodeIds,\n showPalette,\n togglePalette,\n openModal,\n openConnectionDropMenu,\n } = useUIStore();\n const reactFlow = useReactFlow();\n const { edgeStyle, showMinimap } = useSettingsStore();\n const isRunning = useExecutionStore((state) => state.isRunning);\n const currentNodeId = useExecutionStore((state) => state.currentNodeId);\n const executingNodeIds = useExecutionStore((state) => state.executingNodeIds);\n const activeNodeExecutions = useExecutionStore(\n (state) => state.activeNodeExecutions,\n );\n const hasActiveNodeExecutions = useExecutionStore(\n (state) => state.activeNodeExecutions.size > 0,\n );\n\n const [isMinimapVisible, setIsMinimapVisible] = useState(false);\n const [draggingNodeId, setDraggingNodeId] = useState<string | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const MINIMAP_HIDE_DELAY = 1500; // ms after stopping movement\n\n const {\n isOpen: isContextMenuOpen,\n position: contextMenuPosition,\n menuItems: contextMenuItems,\n openNodeMenu,\n openEdgeMenu,\n openPaneMenu,\n openSelectionMenu,\n close: closeContextMenu,\n } = useContextMenu();\n\n const openShortcutHelp = useCallback(\n () => openModal('shortcutHelp'),\n [openModal],\n );\n const openNodeSearch = useCallback(\n () => openModal('nodeSearch'),\n [openModal],\n );\n\n const deleteSelectedElements = useCallback(() => {\n const nodesToDelete = nodes.filter((n) => selectedNodeIds.includes(n.id));\n const edgesToDelete = edges.filter((e) => e.selected);\n if (nodesToDelete.length > 0) {\n onNodesChange(\n nodesToDelete.map((n) => ({ id: n.id, type: 'remove' as const })),\n );\n }\n if (edgesToDelete.length > 0) {\n onEdgesChange(\n edgesToDelete.map((e) => ({ id: e.id, type: 'remove' as const })),\n );\n }\n }, [nodes, edges, selectedNodeIds, onNodesChange, onEdgesChange]);\n\n useCanvasKeyboardShortcuts({\n addNode,\n createGroup,\n deleteGroup,\n deleteSelectedElements,\n fitView: reactFlow.fitView,\n groups,\n nodes,\n openNodeSearch,\n openShortcutHelp,\n selectedNodeIds,\n toggleNodeLock,\n togglePalette,\n unlockAllNodes,\n });\n\n useEffect(() => {\n if (selectedNodeIds.length === 0) {\n setHighlightedNodeIds([]);\n } else {\n const connectedIds = getConnectedNodeIds(selectedNodeIds);\n setHighlightedNodeIds(connectedIds);\n }\n }, [selectedNodeIds, getConnectedNodeIds, setHighlightedNodeIds]);\n\n const nodeMap = useMemo(() => new Map(nodes.map((n) => [n.id, n])), [nodes]);\n\n const isEdgeTargetingDisabledInput = useCallback(\n (edge: WorkflowEdge): boolean => {\n const targetNode = nodeMap.get(edge.target);\n if (!targetNode) return false;\n\n if (targetNode.type === 'imageGen' && edge.targetHandle === 'images') {\n const nodeData = targetNode.data as ImageGenNodeData;\n const hasImageSupport = supportsImageInput(\n nodeData?.selectedModel?.inputSchema,\n );\n return !hasImageSupport;\n }\n\n if (targetNode.type === 'videoGen') {\n if (\n edge.targetHandle === 'image' ||\n edge.targetHandle === 'lastFrame'\n ) {\n const nodeData = targetNode.data as VideoGenNodeData;\n const hasImageSupport = supportsImageInput(\n nodeData?.selectedModel?.inputSchema,\n );\n return !hasImageSupport;\n }\n }\n\n return false;\n },\n [nodeMap],\n );\n\n const styledEdges = useMemo(() => {\n const executionScope =\n executingNodeIds.length > 0 ? new Set(executingNodeIds) : null;\n const highlightedSet =\n highlightedNodeIds.length > 0 ? new Set(highlightedNodeIds) : null;\n\n return edges.map((edge) => {\n const dataType = getEdgeDataType(edge, nodeMap);\n const typeClass = dataType ? `edge-${dataType}` : '';\n const isDisabledTarget = isEdgeTargetingDisabledInput(edge);\n // Enrich edge data with dataType for EditableEdge coloring\n const enrichedData = { ...edge.data, dataType };\n\n if (!isRunning && hasActiveNodeExecutions) {\n const isActiveEdge =\n activeNodeExecutions.has(edge.source) ||\n activeNodeExecutions.has(edge.target);\n\n if (isActiveEdge && !isDisabledTarget) {\n return {\n ...edge,\n animated: false,\n className: `${typeClass} executing`.trim(),\n data: enrichedData,\n };\n }\n }\n\n if (isRunning) {\n const isInExecutionScope =\n !executionScope ||\n executionScope.has(edge.source) ||\n executionScope.has(edge.target);\n const isExecutingEdge =\n currentNodeId &&\n (edge.source === currentNodeId || edge.target === currentNodeId);\n\n if (isDisabledTarget) {\n return {\n ...edge,\n animated: false,\n className: `${typeClass} edge-disabled`.trim(),\n data: enrichedData,\n };\n }\n\n if (!isInExecutionScope) {\n return {\n ...edge,\n animated: false,\n className: typeClass,\n data: enrichedData,\n };\n }\n\n return {\n ...edge,\n animated: false,\n className:\n `${typeClass} ${isExecutingEdge ? 'executing' : 'active-pipe'}`.trim(),\n data: enrichedData,\n };\n }\n\n if (isDisabledTarget) {\n return {\n ...edge,\n className: `${typeClass} edge-disabled`.trim(),\n data: enrichedData,\n };\n }\n\n if (highlightedSet) {\n const isConnected =\n highlightedSet.has(edge.source) && highlightedSet.has(edge.target);\n return {\n ...edge,\n className:\n `${typeClass} ${isConnected ? 'highlighted' : 'dimmed'}`.trim(),\n data: enrichedData,\n };\n }\n\n return {\n ...edge,\n className: typeClass,\n data: enrichedData,\n };\n });\n }, [\n edges,\n nodeMap,\n highlightedNodeIds,\n isRunning,\n currentNodeId,\n executingNodeIds,\n activeNodeExecutions,\n hasActiveNodeExecutions,\n isEdgeTargetingDisabledInput,\n ]);\n\n const handleNodeClick = useCallback(\n (_event: React.MouseEvent, node: WorkflowNode) => {\n selectNode(node.id);\n },\n [selectNode],\n );\n\n const handlePaneClick = useCallback(() => {\n selectNode(null);\n selectEdge(null);\n setSelectedNodeIds([]);\n }, [selectNode, selectEdge, setSelectedNodeIds]);\n\n const handleEdgeClick = useCallback(\n (_event: React.MouseEvent, edge: WorkflowEdge) => {\n selectEdge(edge.id);\n },\n [selectEdge],\n );\n\n const handleSelectionChange = useCallback(\n ({ nodes: selectedNodes }: { nodes: WorkflowNode[] }) => {\n setSelectedNodeIds(selectedNodes.map((n) => n.id));\n },\n [setSelectedNodeIds],\n );\n\n const handleNodeContextMenu = useCallback(\n (event: React.MouseEvent, node: Node) => {\n event.preventDefault();\n if (selectedNodeIds.length > 1 && selectedNodeIds.includes(node.id)) {\n openSelectionMenu(selectedNodeIds, event.clientX, event.clientY);\n } else {\n openNodeMenu(node.id, event.clientX, event.clientY);\n }\n },\n [selectedNodeIds, openNodeMenu, openSelectionMenu],\n );\n\n const handleEdgeContextMenu = useCallback(\n (event: React.MouseEvent, edge: WorkflowEdge) => {\n event.preventDefault();\n openEdgeMenu(edge.id, event.clientX, event.clientY);\n },\n [openEdgeMenu],\n );\n\n const handlePaneContextMenu = useCallback(\n (event: MouseEvent | React.MouseEvent) => {\n event.preventDefault();\n openPaneMenu(event.clientX, event.clientY);\n },\n [openPaneMenu],\n );\n\n const handleSelectionContextMenu = useCallback(\n (event: React.MouseEvent, selectedNodes: Node[]) => {\n event.preventDefault();\n const nodeIds = selectedNodes.map((n) => n.id);\n openSelectionMenu(nodeIds, event.clientX, event.clientY);\n },\n [openSelectionMenu],\n );\n\n const handleDrop = useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n\n // Handle history image drops\n const historyData = event.dataTransfer.getData(\n 'application/history-image',\n );\n if (historyData) {\n try {\n const parsed = JSON.parse(historyData) as {\n image: string;\n prompt?: string;\n };\n const position = reactFlow.screenToFlowPosition({\n x: event.clientX,\n y: event.clientY,\n });\n const nodeId = addNode('imageInput' as NodeType, position);\n if (nodeId && parsed.image) {\n const { updateNodeData } = useWorkflowStore.getState();\n updateNodeData(nodeId, { outputImage: parsed.image });\n }\n } catch {\n // Invalid history data\n }\n return;\n }\n\n const nodeType = event.dataTransfer.getData('nodeType') as NodeType;\n if (!nodeType) return;\n\n const position = reactFlow.screenToFlowPosition({\n x: event.clientX,\n y: event.clientY,\n });\n\n addNode(nodeType, position);\n },\n [addNode, reactFlow],\n );\n\n const handleDragOver = useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n }, []);\n\n const handleNodeDragStart = useCallback(\n (_event: React.MouseEvent, node: Node) => {\n setDraggingNodeId(node.id);\n },\n [],\n );\n\n const handleNodeDrag = useCallback((_event: React.MouseEvent, node: Node) => {\n // Update dragging node ID to trigger helper lines recalculation\n setDraggingNodeId(node.id);\n }, []);\n\n const handleNodeDragStop = useCallback(() => {\n setDraggingNodeId(null);\n }, []);\n\n const handleConnectEnd = useCallback(\n (event: MouseEvent | TouchEvent, connectionState: unknown) => {\n const state = connectionState as {\n fromNode?: { id: string } | null;\n fromHandle?: { id?: string | null } | null;\n };\n const sourceNodeId = state.fromNode?.id;\n const sourceHandleId = state.fromHandle?.id;\n if (!sourceNodeId || !sourceHandleId) return;\n\n const target = event.target as HTMLElement;\n const nodeElement = target.closest('.react-flow__node');\n\n if (!nodeElement) {\n // Dropped on empty canvas — open connection drop menu\n const sourceNode = nodes.find((n) => n.id === sourceNodeId);\n if (!sourceNode) return;\n\n const sourceHandleType = getHandleType(\n sourceNode.type as NodeType,\n sourceHandleId,\n 'source',\n );\n if (!sourceHandleType) return;\n\n const clientX =\n 'clientX' in event\n ? event.clientX\n : (event.touches?.[0]?.clientX ?? 0);\n const clientY =\n 'clientY' in event\n ? event.clientY\n : (event.touches?.[0]?.clientY ?? 0);\n\n const flowPosition = reactFlow.screenToFlowPosition({\n x: clientX,\n y: clientY,\n });\n\n openConnectionDropMenu({\n position: flowPosition,\n screenPosition: { x: clientX, y: clientY },\n sourceHandleId,\n sourceHandleType,\n sourceNodeId,\n });\n return;\n }\n\n const targetNodeId = nodeElement.getAttribute('data-id');\n if (!targetNodeId || targetNodeId === sourceNodeId) return;\n\n const droppedOnHandle = target.closest('.react-flow__handle');\n if (droppedOnHandle) return;\n\n const compatibleHandle = findCompatibleHandle(\n sourceNodeId,\n sourceHandleId,\n targetNodeId,\n );\n if (!compatibleHandle) return;\n\n onConnect({\n source: sourceNodeId,\n sourceHandle: sourceHandleId,\n target: targetNodeId,\n targetHandle: compatibleHandle,\n });\n },\n [findCompatibleHandle, onConnect, nodes, reactFlow, openConnectionDropMenu],\n );\n\n const checkValidConnection = useCallback(\n (connection: Connection | WorkflowEdge): boolean => {\n const conn: Connection = {\n source: connection.source,\n sourceHandle: connection.sourceHandle ?? null,\n target: connection.target,\n targetHandle: connection.targetHandle ?? null,\n };\n return isValidConnection(conn);\n },\n [isValidConnection],\n );\n\n const handleMoveStart = useCallback(() => {\n if (!showMinimap) return;\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n setIsMinimapVisible(true);\n }, [showMinimap]);\n\n const handleMoveEnd = useCallback(() => {\n if (!showMinimap) return;\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n hideTimeoutRef.current = setTimeout(() => {\n setIsMinimapVisible(false);\n hideTimeoutRef.current = null;\n }, MINIMAP_HIDE_DELAY);\n }, [showMinimap]);\n\n useEffect(() => {\n return () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n return (\n <div\n className=\"w-full h-full relative\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n >\n {!showPalette && (\n <button\n onClick={togglePalette}\n className=\"absolute top-3 left-3 z-10 p-1.5 bg-[var(--background)] border border-[var(--border)] rounded-md hover:bg-[var(--secondary)] transition-colors group\"\n title=\"Open sidebar (M)\"\n >\n <PanelLeft className=\"w-4 h-4 text-[var(--muted-foreground)] group-hover:text-[var(--foreground)]\" />\n </button>\n )}\n <ReactFlow<WorkflowNode, WorkflowEdge>\n nodes={nodes}\n edges={styledEdges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onConnectEnd={handleConnectEnd as never}\n onNodeClick={handleNodeClick}\n onPaneClick={handlePaneClick}\n onSelectionChange={handleSelectionChange}\n onNodeContextMenu={handleNodeContextMenu}\n onEdgeContextMenu={handleEdgeContextMenu}\n onPaneContextMenu={handlePaneContextMenu}\n onSelectionContextMenu={handleSelectionContextMenu}\n onNodeDragStart={handleNodeDragStart}\n onNodeDrag={handleNodeDrag}\n onNodeDragStop={handleNodeDragStop}\n onEdgeClick={handleEdgeClick}\n isValidConnection={checkValidConnection}\n nodeTypes={nodeTypesProp ?? defaultNodeTypes}\n edgeTypes={edgeTypesMap}\n fitView\n snapToGrid\n snapGrid={[16, 16]}\n minZoom={0.1}\n maxZoom={4}\n nodeDragThreshold={5}\n connectionMode={ConnectionMode.Loose}\n selectionMode={SelectionMode.Partial}\n selectionOnDrag\n panOnDrag={[1, 2]}\n onMoveStart={handleMoveStart}\n onMoveEnd={handleMoveEnd}\n deleteKeyCode={['Backspace', 'Delete']}\n defaultEdgeOptions={{\n animated: false,\n type: edgeStyle,\n }}\n edgesFocusable\n edgesReconnectable\n proOptions={{ hideAttribution: true }}\n onlyRenderVisibleElements={nodes.length > 50}\n >\n <GroupOverlay />\n <Background\n variant={BackgroundVariant.Dots}\n gap={16}\n size={1}\n color=\"rgba(255, 255, 255, 0.08)\"\n />\n <Controls />\n {showMinimap && (\n <MiniMap\n nodeStrokeWidth={0}\n nodeColor={() => DEFAULT_NODE_COLOR}\n zoomable\n pannable\n maskColor=\"rgba(0, 0, 0, 0.8)\"\n className={`!bg-transparent !border-[var(--border)] !rounded-lg transition-opacity duration-300 ${\n isMinimapVisible ? 'opacity-100' : 'opacity-0 pointer-events-none'\n }`}\n />\n )}\n <HelperLines draggingNodeId={draggingNodeId} />\n </ReactFlow>\n {isContextMenuOpen && (\n <ContextMenu\n x={contextMenuPosition.x}\n y={contextMenuPosition.y}\n items={contextMenuItems}\n onClose={closeContextMenu}\n />\n )}\n <EdgeToolbar />\n <MultiSelectToolbar onDownloadAsZip={onDownloadAsZip} />\n <NodeDetailModal />\n <ShortcutHelpModal />\n <NodeSearch />\n <ConnectionDropMenu />\n <CostModal />\n <NotificationToast />\n <GlobalImageHistory />\n </div>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
1
+ import { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
2
2
  import { create } from 'zustand';
3
3
  import { ProviderTypeEnum, NodeStatusEnum } from '@genfeedai/types';
4
4
 
@@ -245,7 +245,7 @@ var useSettingsStore = create((set, get) => {
245
245
  },
246
246
  setEdgeStyle: (style) => {
247
247
  setAndPersist(() => ({ edgeStyle: style }));
248
- import('./workflowStore-N2F7WIG3.mjs').then(({ useWorkflowStore: useWorkflowStore2 }) => {
248
+ import('./workflowStore-XYPHB6DS.mjs').then(({ useWorkflowStore: useWorkflowStore2 }) => {
249
249
  useWorkflowStore2.getState().setEdgeStyle(style);
250
250
  });
251
251
  },
@@ -1096,3 +1096,5 @@ var useExecutionStore = create()((...args) => {
1096
1096
  });
1097
1097
 
1098
1098
  export { PROVIDER_INFO, useExecutionStore, useSettingsStore, useUIStore };
1099
+ //# sourceMappingURL=chunk-R5L7WB7F.mjs.map
1100
+ //# sourceMappingURL=chunk-R5L7WB7F.mjs.map