@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/hooks/useCanvasKeyboardShortcuts.ts","../src/hooks/useNodeActions.ts","../src/lib/autoLayout.ts","../src/hooks/usePaneActions.ts","../src/components/context-menu/menus/edgeMenu.tsx","../src/components/context-menu/ContextMenuSeparator.tsx","../src/components/context-menu/ContextMenuItem.tsx","../src/components/context-menu/ContextMenu.tsx","../src/components/context-menu/menus/nodeMenu.tsx","../src/components/context-menu/menus/paneMenu.tsx","../src/components/context-menu/menus/selectionMenu.tsx","../src/hooks/useContextMenu.ts"],"names":["useCallback","jsx","useState","useRef","useEffect","Trash2","Image","Scissors","Copy","Lock","LockOpen","useReactFlow"],"mappings":"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","file":"chunk-VKXTPLM7.mjs","sourcesContent":["import type { NodeType, WorkflowNode } from '@genfeedai/types';\nimport type { FitViewOptions } from '@xyflow/react';\nimport { useEffect } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport type { NodeGroup } from '../types/groups';\n\ninterface UseCanvasKeyboardShortcutsParams {\n selectedNodeIds: string[];\n groups: NodeGroup[];\n nodes: WorkflowNode[];\n toggleNodeLock: (nodeId: string) => void;\n createGroup: (nodeIds: string[]) => string;\n deleteGroup: (groupId: string) => void;\n unlockAllNodes: () => void;\n addNode: (type: NodeType, position: { x: number; y: number }) => string;\n togglePalette: () => void;\n fitView: (options?: FitViewOptions) => void;\n openShortcutHelp: () => void;\n openNodeSearch: () => void;\n deleteSelectedElements: () => void;\n}\n\n/**\n * Hook that handles keyboard shortcuts for the workflow canvas\n *\n * Shortcuts:\n * - M: Toggle sidebar/palette\n * - L: Toggle lock on selected nodes\n * - F: Fit view to selection (or all if none selected)\n * - ?: Show shortcut help modal\n * - Ctrl/Cmd+F: Open node search\n * - Ctrl/Cmd+G: Create group from selection\n * - Ctrl/Cmd+Shift+G: Ungroup selected nodes\n * - Ctrl/Cmd+Shift+L: Unlock all nodes\n * - Shift+I: Add image generator node\n * - Shift+V: Add video generator node\n * - Shift+P: Add prompt node\n * - Shift+L: Add LLM node\n * - Ctrl/Cmd+Z: Undo\n * - Ctrl/Cmd+Shift+Z: Redo\n */\nexport function useCanvasKeyboardShortcuts({\n selectedNodeIds,\n groups,\n nodes,\n toggleNodeLock,\n createGroup,\n deleteGroup,\n unlockAllNodes,\n addNode,\n togglePalette,\n fitView,\n openShortcutHelp,\n openNodeSearch,\n deleteSelectedElements,\n}: UseCanvasKeyboardShortcutsParams) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ignore if typing in input\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement ||\n (e.target as HTMLElement)?.contentEditable === 'true' ||\n (e.target as HTMLElement)?.closest?.(\n '[role=\"textbox\"], [role=\"combobox\"], [role=\"searchbox\"]',\n )\n ) {\n return;\n }\n\n const isMod = e.ctrlKey || e.metaKey;\n\n // Delete/Backspace - Delete selected elements\n if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault();\n deleteSelectedElements();\n return;\n }\n\n // M - Toggle sidebar (Todoist style)\n if (e.key === 'm' && !isMod && !e.shiftKey) {\n e.preventDefault();\n togglePalette();\n }\n\n // F - Fit view to selection (or all nodes if none selected)\n if (e.key === 'f' && !isMod && !e.shiftKey) {\n e.preventDefault();\n if (selectedNodeIds.length > 0) {\n // Fit to selected nodes\n const selectedNodes = nodes.filter((n) =>\n selectedNodeIds.includes(n.id),\n );\n fitView({ duration: 200, nodes: selectedNodes, padding: 0.3 });\n } else {\n // Fit to all nodes\n fitView({ duration: 200, padding: 0.2 });\n }\n }\n\n // ? - Show shortcut help modal\n if (e.key === '?' && e.shiftKey && !isMod) {\n e.preventDefault();\n openShortcutHelp();\n }\n\n // Ctrl/Cmd+F - Open node search\n if (e.key === 'f' && isMod && !e.shiftKey) {\n e.preventDefault();\n openNodeSearch();\n }\n\n // L - Toggle lock on selected nodes\n if (e.key === 'l' && !isMod && !e.shiftKey) {\n e.preventDefault();\n for (const nodeId of selectedNodeIds) {\n toggleNodeLock(nodeId);\n }\n }\n\n // Ctrl+G - Create group from selected nodes\n if (e.key === 'g' && isMod && !e.shiftKey) {\n e.preventDefault();\n if (selectedNodeIds.length > 1) {\n createGroup(selectedNodeIds);\n }\n }\n\n // Ctrl+Shift+G - Ungroup (delete group containing selected nodes)\n if (e.key === 'g' && isMod && e.shiftKey) {\n e.preventDefault();\n for (const nodeId of selectedNodeIds) {\n const group = groups.find((g) => g.nodeIds.includes(nodeId));\n if (group) {\n deleteGroup(group.id);\n break;\n }\n }\n }\n\n // Ctrl+Shift+L - Unlock all nodes\n if (e.key === 'l' && isMod && e.shiftKey) {\n e.preventDefault();\n unlockAllNodes();\n }\n\n // Shift+I - Add image generator node at viewport center\n if (e.key === 'I' && e.shiftKey && !isMod) {\n e.preventDefault();\n const position = {\n x: window.innerWidth / 2 - 150,\n y: window.innerHeight / 2 - 150,\n };\n addNode('imageGen', position);\n }\n\n // Shift+V - Add video generator node at viewport center\n if (e.key === 'V' && e.shiftKey && !isMod) {\n e.preventDefault();\n const position = {\n x: window.innerWidth / 2 - 150,\n y: window.innerHeight / 2 - 150,\n };\n addNode('videoGen', position);\n }\n\n // Shift+P - Add prompt node at viewport center\n if (e.key === 'P' && e.shiftKey && !isMod) {\n e.preventDefault();\n const position = {\n x: window.innerWidth / 2 - 150,\n y: window.innerHeight / 2 - 150,\n };\n addNode('prompt', position);\n }\n\n // Shift+L - Add LLM node at viewport center\n if ((e.key === 'L' || e.key === 'l') && e.shiftKey && !isMod) {\n e.preventDefault();\n const position = {\n x: window.innerWidth / 2 - 150,\n y: window.innerHeight / 2 - 150,\n };\n addNode('llm', position);\n }\n\n // Cmd/Ctrl+Z - Undo\n if (e.key === 'z' && isMod && !e.shiftKey) {\n e.preventDefault();\n useWorkflowStore.temporal.getState().undo();\n }\n\n // Cmd/Ctrl+Shift+Z - Redo\n if (e.key === 'z' && isMod && e.shiftKey) {\n e.preventDefault();\n useWorkflowStore.temporal.getState().redo();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [\n selectedNodeIds,\n toggleNodeLock,\n createGroup,\n deleteGroup,\n unlockAllNodes,\n groups,\n nodes,\n addNode,\n togglePalette,\n fitView,\n openShortcutHelp,\n openNodeSearch,\n deleteSelectedElements,\n ]);\n}\n","import type {\n WorkflowEdge,\n WorkflowNode,\n WorkflowNodeData,\n} from '@genfeedai/types';\nimport { nanoid } from 'nanoid';\nimport { useCallback, useState } from 'react';\nimport {\n selectDuplicateNode,\n selectEdges,\n selectNodes,\n selectRemoveNode,\n} from '../stores/workflow/selectors';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\ninterface ClipboardData {\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n isCut: boolean;\n}\n\n/**\n * Create remapped nodes and edges from clipboard data at the given position offset.\n * Shared by both `pasteNodes` and `getPasteData`.\n */\nfunction createPastePayload(\n clipboard: ClipboardData,\n offsetX: number,\n offsetY: number,\n): { nodes: WorkflowNode[]; edges: WorkflowEdge[] } {\n const { nodes: clipboardNodes, edges: clipboardEdges } = clipboard;\n\n // Create a map from old IDs to new IDs\n const idMap = new Map<string, string>();\n for (const node of clipboardNodes) {\n idMap.set(node.id, nanoid(8));\n }\n\n // Calculate the top-left corner of the copied nodes for offset calculation\n const minX = Math.min(...clipboardNodes.map((n) => n.position.x));\n const minY = Math.min(...clipboardNodes.map((n) => n.position.y));\n\n // Create new nodes with remapped IDs and offset positions\n const newNodes: WorkflowNode[] = clipboardNodes.map((node) => ({\n ...node,\n data: {\n ...node.data,\n error: undefined,\n jobId: null,\n status: 'idle',\n } as WorkflowNodeData,\n id: idMap.get(node.id)!,\n position: {\n x: node.position.x - minX + offsetX,\n y: node.position.y - minY + offsetY,\n },\n selected: true,\n }));\n\n // Remap edges to use new node IDs\n const newEdges: WorkflowEdge[] = clipboardEdges.map((edge) => ({\n ...edge,\n id: nanoid(8),\n source: idMap.get(edge.source)!,\n target: idMap.get(edge.target)!,\n }));\n\n return { edges: newEdges, nodes: newNodes };\n}\n\nexport function useNodeActions() {\n const nodes = useWorkflowStore(selectNodes);\n const edges = useWorkflowStore(selectEdges);\n const removeNode = useWorkflowStore(selectRemoveNode);\n const duplicateNode = useWorkflowStore(selectDuplicateNode);\n const [clipboard, setClipboard] = useState<ClipboardData | null>(null);\n\n const deleteNode = useCallback(\n (nodeId: string) => {\n removeNode(nodeId);\n },\n [removeNode],\n );\n\n const duplicate = useCallback(\n (nodeId: string) => {\n return duplicateNode(nodeId);\n },\n [duplicateNode],\n );\n\n const copyNode = useCallback(\n (nodeId: string) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (node) {\n // Copy the node and any edges between copied nodes (just one node here)\n setClipboard({ edges: [], isCut: false, nodes: [node] });\n }\n },\n [nodes],\n );\n\n const copyMultipleNodes = useCallback(\n (nodeIds: string[]) => {\n const nodeSet = new Set(nodeIds);\n const nodesToCopy = nodes.filter((n) => nodeSet.has(n.id));\n // Copy edges that connect nodes within the selection\n const edgesToCopy = edges.filter(\n (e) => nodeSet.has(e.source) && nodeSet.has(e.target),\n );\n if (nodesToCopy.length > 0) {\n setClipboard({ edges: edgesToCopy, isCut: false, nodes: nodesToCopy });\n }\n },\n [nodes, edges],\n );\n\n const cutNode = useCallback(\n (nodeId: string) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (node) {\n setClipboard({ edges: [], isCut: true, nodes: [node] });\n removeNode(nodeId);\n }\n },\n [nodes, removeNode],\n );\n\n const cutMultipleNodes = useCallback(\n (nodeIds: string[]) => {\n const nodeSet = new Set(nodeIds);\n const nodesToCut = nodes.filter((n) => nodeSet.has(n.id));\n const edgesToCut = edges.filter(\n (e) => nodeSet.has(e.source) && nodeSet.has(e.target),\n );\n if (nodesToCut.length > 0) {\n setClipboard({ edges: edgesToCut, isCut: true, nodes: nodesToCut });\n for (const nodeId of nodeIds) {\n removeNode(nodeId);\n }\n }\n },\n [nodes, edges, removeNode],\n );\n\n const deleteMultipleNodes = useCallback(\n (nodeIds: string[]) => {\n for (const nodeId of nodeIds) {\n removeNode(nodeId);\n }\n },\n [removeNode],\n );\n\n const duplicateMultipleNodes = useCallback(\n (nodeIds: string[]) => {\n const newIds: string[] = [];\n for (const nodeId of nodeIds) {\n const newId = duplicateNode(nodeId);\n if (newId) {\n newIds.push(newId);\n }\n }\n return newIds;\n },\n [duplicateNode],\n );\n\n /**\n * Paste nodes from clipboard at the given position offset.\n * Returns the new node IDs if paste was successful.\n */\n const pasteNodes = useCallback(\n (\n offsetX: number,\n offsetY: number,\n ): { nodeIds: string[]; edgeIds: string[] } | null => {\n if (!clipboard || clipboard.nodes.length === 0) return null;\n\n const payload = createPastePayload(clipboard, offsetX, offsetY);\n\n // Clear cut clipboard after paste (cut is one-time)\n if (clipboard.isCut) {\n setClipboard(null);\n }\n\n return {\n edgeIds: payload.edges.map((e) => e.id),\n nodeIds: payload.nodes.map((n) => n.id),\n };\n },\n [clipboard],\n );\n\n /**\n * Get nodes and edges to paste with remapped IDs.\n * Used by the context menu to actually add them to the store.\n */\n const getPasteData = useCallback(\n (\n offsetX: number,\n offsetY: number,\n ): { nodes: WorkflowNode[]; edges: WorkflowEdge[] } | null => {\n if (!clipboard || clipboard.nodes.length === 0) return null;\n\n const payload = createPastePayload(clipboard, offsetX, offsetY);\n\n // Clear cut clipboard after paste (cut is one-time)\n if (clipboard.isCut) {\n setClipboard(null);\n }\n\n return payload;\n },\n [clipboard],\n );\n\n return {\n clipboard,\n copyMultipleNodes,\n copyNode,\n cutMultipleNodes,\n cutNode,\n deleteMultipleNodes,\n deleteNode,\n duplicate,\n duplicateMultipleNodes,\n getPasteData,\n pasteNodes,\n };\n}\n","import Dagre from '@dagrejs/dagre';\nimport type { NodeType } from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport type { Edge, Node } from '@xyflow/react';\n\ninterface LayoutOptions {\n direction?: 'TB' | 'LR' | 'BT' | 'RL';\n nodeSpacing?: number;\n rankSpacing?: number;\n}\n\nconst DEFAULT_NODE_WIDTH = 280;\nconst DEFAULT_NODE_HEIGHT = 200;\nconst MIN_GAP = 40;\n\ninterface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Get node bounding box from current position\n */\nfunction getNodeRect(node: Node): Rect {\n return {\n height: node.measured?.height ?? DEFAULT_NODE_HEIGHT,\n width: node.measured?.width ?? DEFAULT_NODE_WIDTH,\n x: node.position.x,\n y: node.position.y,\n };\n}\n\n/**\n * Get the index of an input handle on a node (used for vertical ordering)\n */\nfunction getInputHandleIndex(nodeType: string, handleId: string): number {\n const nodeDef = NODE_DEFINITIONS[nodeType as NodeType];\n if (!nodeDef) return 0;\n const index = nodeDef.inputs.findIndex((h) => h.id === handleId);\n return index === -1 ? 0 : index;\n}\n\n/**\n * Check if two rectangles overlap (including gap)\n */\nfunction rectsOverlap(a: Rect, b: Rect, gap: number): boolean {\n return (\n a.x < b.x + b.width + gap &&\n a.x + a.width + gap > b.x &&\n a.y < b.y + b.height + gap &&\n a.y + a.height + gap > b.y\n );\n}\n\n/**\n * Calculate overlap amount on each axis\n */\nfunction getOverlap(a: Rect, b: Rect, gap: number): { x: number; y: number } {\n const aCenterX = a.x + a.width / 2;\n const aCenterY = a.y + a.height / 2;\n const bCenterX = b.x + b.width / 2;\n const bCenterY = b.y + b.height / 2;\n\n const dx = bCenterX - aCenterX;\n const dy = bCenterY - aCenterY;\n\n const minDistX = (a.width + b.width) / 2 + gap;\n const minDistY = (a.height + b.height) / 2 + gap;\n\n const overlapX = minDistX - Math.abs(dx);\n const overlapY = minDistY - Math.abs(dy);\n\n return { x: overlapX, y: overlapY };\n}\n\n/**\n * Reorder nodes vertically based on which handle they connect to on the target.\n * This minimizes edge crossings by placing nodes that connect to top handles\n * above nodes that connect to bottom handles.\n */\nfunction reorderByHandlePosition(nodes: Node[], edges: Edge[]): Node[] {\n const nodeMap = new Map(nodes.map((n) => [n.id, n]));\n\n // Group edges by target node\n const edgesByTarget = new Map<string, Edge[]>();\n for (const edge of edges) {\n const existing = edgesByTarget.get(edge.target) ?? [];\n existing.push(edge);\n edgesByTarget.set(edge.target, existing);\n }\n\n // For each target, reorder its source nodes based on handle index\n for (const [targetId, targetEdges] of edgesByTarget) {\n if (targetEdges.length < 2) continue;\n\n const targetNode = nodeMap.get(targetId);\n if (!targetNode) continue;\n\n // Get source nodes with their target handle indices\n const sourceInfos: {\n nodeId: string;\n handleIndex: number;\n currentY: number;\n }[] = [];\n\n for (const edge of targetEdges) {\n const sourceNode = nodeMap.get(edge.source);\n if (!sourceNode) continue;\n\n const handleIndex = getInputHandleIndex(\n targetNode.type as string,\n edge.targetHandle ?? '',\n );\n sourceInfos.push({\n currentY: sourceNode.position.y,\n handleIndex,\n nodeId: edge.source,\n });\n }\n\n if (sourceInfos.length < 2) continue;\n\n // Sort by handle index (top handles first)\n sourceInfos.sort((a, b) => a.handleIndex - b.handleIndex);\n\n // Get the Y positions sorted (top positions first)\n const sortedYPositions = sourceInfos\n .map((s) => s.currentY)\n .sort((a, b) => a - b);\n\n // Assign Y positions: node connecting to top handle gets top Y position\n for (let i = 0; i < sourceInfos.length; i++) {\n const node = nodeMap.get(sourceInfos[i].nodeId);\n if (node) {\n node.position.y = sortedYPositions[i];\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Resolve all overlaps using iterative collision detection\n * Based on xyflow's recommended naive O(n^2) approach\n * https://xyflow.com/blog/node-collision-detection-algorithms\n */\nfunction resolveCollisions(nodes: Node[]): Node[] {\n const maxIterations = 100;\n let iteration = 0;\n let hasCollision = true;\n\n while (hasCollision && iteration < maxIterations) {\n hasCollision = false;\n iteration++;\n\n for (let i = 0; i < nodes.length; i++) {\n for (let j = i + 1; j < nodes.length; j++) {\n const nodeA = nodes[i];\n const nodeB = nodes[j];\n\n const rectA = getNodeRect(nodeA);\n const rectB = getNodeRect(nodeB);\n\n if (rectsOverlap(rectA, rectB, MIN_GAP)) {\n hasCollision = true;\n\n const overlap = getOverlap(rectA, rectB, MIN_GAP);\n\n const aCenterX = rectA.x + rectA.width / 2;\n const aCenterY = rectA.y + rectA.height / 2;\n const bCenterX = rectB.x + rectB.width / 2;\n const bCenterY = rectB.y + rectB.height / 2;\n\n if (overlap.x < overlap.y && overlap.x > 0) {\n const pushX = overlap.x / 2;\n if (bCenterX >= aCenterX) {\n nodeA.position.x -= pushX;\n nodeB.position.x += pushX;\n } else {\n nodeA.position.x += pushX;\n nodeB.position.x -= pushX;\n }\n } else if (overlap.y > 0) {\n const pushY = overlap.y / 2;\n if (bCenterY >= aCenterY) {\n nodeA.position.y -= pushY;\n nodeB.position.y += pushY;\n } else {\n nodeA.position.y += pushY;\n nodeB.position.y -= pushY;\n }\n }\n }\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Auto-layout nodes using dagre algorithm with collision resolution\n * @param nodes - React Flow nodes\n * @param edges - React Flow edges\n * @param options - Layout configuration\n * @returns Nodes with updated positions\n */\nexport function getLayoutedNodes(\n nodes: Node[],\n edges: Edge[],\n options: LayoutOptions = {},\n): Node[] {\n if (nodes.length === 0) return nodes;\n\n const { direction = 'LR', nodeSpacing = 50, rankSpacing = 120 } = options;\n\n const graph = new Dagre.graphlib.Graph().setDefaultEdgeLabel(() => ({}));\n\n graph.setGraph({\n acyclicer: 'greedy',\n marginx: 50,\n marginy: 50,\n nodesep: nodeSpacing,\n rankdir: direction,\n ranker: 'network-simplex',\n ranksep: rankSpacing,\n });\n\n // Add nodes with their actual measured dimensions\n for (const node of nodes) {\n const width = node.measured?.width ?? DEFAULT_NODE_WIDTH;\n const height = node.measured?.height ?? DEFAULT_NODE_HEIGHT;\n graph.setNode(node.id, { height, width });\n }\n\n // Add edges\n for (const edge of edges) {\n graph.setEdge(edge.source, edge.target);\n }\n\n Dagre.layout(graph);\n\n // Apply dagre positions (dagre returns center coordinates)\n const layoutedNodes = nodes.map((node) => {\n const nodeWithPosition = graph.node(node.id);\n const width = node.measured?.width ?? DEFAULT_NODE_WIDTH;\n const height = node.measured?.height ?? DEFAULT_NODE_HEIGHT;\n\n return {\n ...node,\n position: {\n x: nodeWithPosition.x - width / 2,\n y: nodeWithPosition.y - height / 2,\n },\n };\n });\n\n // Reorder nodes to minimize edge crossings based on handle positions\n reorderByHandlePosition(layoutedNodes, edges);\n\n // Resolve any remaining overlaps with collision detection\n return resolveCollisions(layoutedNodes);\n}\n","import type { NodeType } from '@genfeedai/types';\nimport { useReactFlow } from '@xyflow/react';\nimport { useCallback } from 'react';\nimport { getLayoutedNodes } from '../lib/autoLayout';\nimport { useSettingsStore } from '../stores/settingsStore';\nimport { selectAddNode } from '../stores/workflow/selectors';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nexport function usePaneActions() {\n const addNode = useWorkflowStore(selectAddNode);\n const reactFlow = useReactFlow();\n\n const addNodeAtPosition = useCallback(\n (type: string, screenX: number, screenY: number) => {\n const position = reactFlow.screenToFlowPosition({\n x: screenX,\n y: screenY,\n });\n addNode(type as NodeType, position);\n },\n [addNode, reactFlow],\n );\n\n const selectAll = useCallback(() => {\n reactFlow.setNodes((nds) =>\n nds.map((node) => ({\n ...node,\n selected: true,\n })),\n );\n }, [reactFlow]);\n\n const fitView = useCallback(() => {\n reactFlow.fitView({ padding: 0.2 });\n }, [reactFlow]);\n\n const autoLayout = useCallback(\n (direction: 'TB' | 'LR' = 'LR') => {\n const edgeStyle = useSettingsStore.getState().edgeStyle;\n // Use React Flow's internal nodes which have measured dimensions populated\n const currentNodes = reactFlow.getNodes();\n const currentEdges = reactFlow.getEdges();\n const layoutedNodes = getLayoutedNodes(currentNodes, currentEdges, {\n direction,\n });\n reactFlow.setNodes(layoutedNodes);\n\n // Normalize all edges to use consistent style\n reactFlow.setEdges((eds) =>\n eds.map((edge) => ({\n ...edge,\n type: edgeStyle,\n })),\n );\n\n // Fit view after layout with a small delay to allow DOM update\n setTimeout(() => {\n reactFlow.fitView({ padding: 0.2 });\n }, 50);\n },\n [reactFlow],\n );\n\n return {\n addNodeAtPosition,\n autoLayout,\n fitView,\n selectAll,\n };\n}\n","import { Trash2 } from 'lucide-react';\nimport type { ContextMenuItemConfig } from '../ContextMenu';\n\ninterface EdgeMenuOptions {\n edgeId: string;\n onDelete: (edgeId: string) => void;\n}\n\nexport function getEdgeMenuItems({\n edgeId,\n onDelete,\n}: EdgeMenuOptions): ContextMenuItemConfig[] {\n return [\n {\n danger: true,\n icon: <Trash2 className=\"w-4 h-4\" />,\n id: 'delete',\n label: 'Delete Connection',\n onClick: () => onDelete(edgeId),\n },\n ];\n}\n","'use client';\n\nexport function ContextMenuSeparator() {\n return <div className=\"h-px bg-[var(--border)] my-1\" />;\n}\n","'use client';\n\nimport { ChevronRight } from 'lucide-react';\nimport { type ReactNode, useCallback, useRef, useState } from 'react';\nimport type { ContextMenuItemConfig } from './ContextMenu';\nimport { ContextMenuSeparator } from './ContextMenuSeparator';\n\nexport interface ContextMenuItemProps {\n id: string;\n label?: string;\n icon?: ReactNode;\n shortcut?: string;\n disabled?: boolean;\n danger?: boolean;\n submenu?: ContextMenuItemConfig[];\n onClick: () => void;\n onClose?: () => void;\n isSelected?: boolean;\n}\n\nexport function ContextMenuItem({\n label,\n icon,\n shortcut,\n disabled,\n danger,\n submenu,\n onClick,\n onClose,\n isSelected,\n}: ContextMenuItemProps) {\n const [showSubmenu, setShowSubmenu] = useState(false);\n const itemRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleMouseEnter = useCallback(() => {\n if (submenu && !disabled) {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n setShowSubmenu(true);\n }\n }, [submenu, disabled]);\n\n const handleMouseLeave = useCallback(() => {\n if (submenu) {\n timeoutRef.current = setTimeout(() => {\n setShowSubmenu(false);\n }, 100);\n }\n }, [submenu]);\n\n const handleSubmenuClick = useCallback(\n (item: ContextMenuItemConfig) => {\n if (!item.disabled && item.onClick) {\n item.onClick();\n onClose?.();\n }\n },\n [onClose],\n );\n\n const hasSubmenu = submenu && submenu.length > 0;\n\n return (\n <div\n ref={itemRef}\n className=\"relative\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <button\n onClick={hasSubmenu ? undefined : onClick}\n disabled={disabled}\n className={`\n w-full flex items-center gap-3 px-3 py-2 text-left text-sm rounded-md\n transition-colors outline-none\n ${isSelected || showSubmenu ? 'bg-[var(--secondary)]' : ''}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-[var(--secondary)] cursor-pointer'}\n ${danger && !disabled ? 'text-red-400 hover:text-red-300' : 'text-[var(--foreground)]'}\n `}\n >\n {icon && (\n <span\n className={`w-4 h-4 flex items-center justify-center ${danger ? 'text-red-400' : 'text-[var(--muted-foreground)]'}`}\n >\n {icon}\n </span>\n )}\n {label && <span className=\"flex-1\">{label}</span>}\n {shortcut && !hasSubmenu && (\n <span className=\"text-xs text-[var(--muted-foreground)] ml-4\">\n {shortcut}\n </span>\n )}\n {hasSubmenu && (\n <ChevronRight className=\"w-4 h-4 text-[var(--muted-foreground)]\" />\n )}\n </button>\n\n {/* Submenu */}\n {hasSubmenu && showSubmenu && (\n <div\n className=\"absolute left-full top-0 ml-1 min-w-[200px] py-1 bg-[var(--card)] border border-[var(--border)] rounded-lg shadow-lg backdrop-blur-sm z-50\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {submenu.map((item) => {\n if (item.separator) {\n return <ContextMenuSeparator key={item.id} />;\n }\n\n return (\n <button\n key={item.id}\n onClick={() => handleSubmenuClick(item)}\n disabled={item.disabled}\n className={`\n w-full flex items-center gap-3 px-3 py-2 text-left text-sm rounded-md\n transition-colors outline-none\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-[var(--secondary)] cursor-pointer'}\n ${item.danger && !item.disabled ? 'text-red-400 hover:text-red-300' : 'text-[var(--foreground)]'}\n `}\n >\n {item.icon && (\n <span\n className={`w-4 h-4 flex items-center justify-center ${item.danger ? 'text-red-400' : 'text-[var(--muted-foreground)]'}`}\n >\n {item.icon}\n </span>\n )}\n {item.label && <span className=\"flex-1\">{item.label}</span>}\n {item.shortcut && (\n <span className=\"text-xs text-[var(--muted-foreground)] ml-4\">\n {item.shortcut}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { ContextMenuItem } from './ContextMenuItem';\nimport { ContextMenuSeparator } from './ContextMenuSeparator';\n\nexport interface ContextMenuItemConfig {\n id: string;\n label?: string;\n icon?: React.ReactNode;\n shortcut?: string;\n disabled?: boolean;\n danger?: boolean;\n separator?: boolean;\n submenu?: ContextMenuItemConfig[];\n onClick?: () => void;\n}\n\n/** Helper to create a separator item */\nexport function createSeparator(id: string): ContextMenuItemConfig {\n return { id, separator: true };\n}\n\ninterface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuItemConfig[];\n onClose: () => void;\n}\n\nexport function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [position, setPosition] = useState({ x, y });\n\n // Calculate position to keep menu on screen\n useEffect(() => {\n if (menuRef.current) {\n const rect = menuRef.current.getBoundingClientRect();\n const padding = 8;\n\n let newX = x;\n let newY = y;\n\n // Check right edge\n if (x + rect.width + padding > window.innerWidth) {\n newX = x - rect.width;\n }\n\n // Check bottom edge\n if (y + rect.height + padding > window.innerHeight) {\n newY = y - rect.height;\n }\n\n // Ensure not off left/top\n newX = Math.max(padding, newX);\n newY = Math.max(padding, newY);\n\n setPosition({ x: newX, y: newY });\n }\n }, [x, y]);\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n onClose();\n }\n };\n\n // Delay to avoid immediate close from the same click that opened the menu\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 0);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [onClose]);\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const selectableIndices = items\n .map((item, index) => (!item.separator && !item.disabled ? index : -1))\n .filter((index) => index !== -1);\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n onClose();\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (selectableIndices.length > 0) {\n const currentSelectableIndex =\n selectableIndices.indexOf(selectedIndex);\n const nextIndex =\n currentSelectableIndex === -1\n ? 0\n : (currentSelectableIndex + 1) % selectableIndices.length;\n setSelectedIndex(selectableIndices[nextIndex]);\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (selectableIndices.length > 0) {\n const currentSelectableIndex =\n selectableIndices.indexOf(selectedIndex);\n const prevIndex =\n currentSelectableIndex === -1\n ? selectableIndices.length - 1\n : (currentSelectableIndex - 1 + selectableIndices.length) %\n selectableIndices.length;\n setSelectedIndex(selectableIndices[prevIndex]);\n }\n break;\n case 'Enter':\n event.preventDefault();\n if (selectedIndex >= 0 && selectedIndex < items.length) {\n const item = items[selectedIndex];\n if (!item.separator && !item.disabled && item.onClick) {\n item.onClick();\n onClose();\n }\n }\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [items, selectedIndex, onClose]);\n\n const handleItemClick = useCallback(\n (item: ContextMenuItemConfig) => {\n if (!item.disabled && item.onClick) {\n item.onClick();\n onClose();\n }\n },\n [onClose],\n );\n\n return (\n <div\n ref={menuRef}\n className=\"fixed z-50 min-w-[200px] py-1 bg-[var(--card)] border border-[var(--border)] rounded-lg shadow-lg backdrop-blur-sm\"\n style={{ left: position.x, top: position.y }}\n >\n {items.map((item, index) => {\n if (item.separator) {\n return <ContextMenuSeparator key={item.id} />;\n }\n\n return (\n <ContextMenuItem\n key={item.id}\n id={item.id}\n label={item.label}\n icon={item.icon}\n shortcut={item.shortcut}\n disabled={item.disabled}\n danger={item.danger}\n submenu={item.submenu}\n onClick={() => handleItemClick(item)}\n onClose={onClose}\n isSelected={index === selectedIndex}\n />\n );\n })}\n </div>\n );\n}\n","import {\n Copy,\n Image,\n Lock,\n LockOpen,\n Palette,\n Scissors,\n Trash2,\n} from 'lucide-react';\nimport { type ContextMenuItemConfig, createSeparator } from '../ContextMenu';\n\ntype NodeColor =\n | 'none'\n | 'purple'\n | 'blue'\n | 'green'\n | 'yellow'\n | 'orange'\n | 'red'\n | 'pink'\n | 'gray';\n\nconst NODE_COLOR_VALUES: Record<NodeColor, string | null> = {\n blue: '#3b82f6',\n gray: '#6b7280',\n green: '#22c55e',\n none: null,\n orange: '#f97316',\n pink: '#ec4899',\n purple: '#a855f7',\n red: '#ef4444',\n yellow: '#eab308',\n};\n\nconst NODE_COLOR_LABELS: Record<NodeColor, string> = {\n blue: 'Blue',\n gray: 'Gray',\n green: 'Green',\n none: 'Default',\n orange: 'Orange',\n pink: 'Pink',\n purple: 'Purple',\n red: 'Red',\n yellow: 'Yellow',\n};\n\nconst NODE_COLORS: NodeColor[] = [\n 'none',\n 'purple',\n 'blue',\n 'green',\n 'yellow',\n 'orange',\n 'red',\n 'pink',\n 'gray',\n];\n\ninterface NodeMenuOptions {\n nodeId: string;\n isLocked: boolean;\n hasMediaOutput: boolean;\n currentColor?: string;\n onDuplicate: (nodeId: string) => void;\n onLock: (nodeId: string) => void;\n onUnlock: (nodeId: string) => void;\n onCut: (nodeId: string) => void;\n onCopy: (nodeId: string) => void;\n onDelete: (nodeId: string) => void;\n onSetAsThumbnail?: (nodeId: string) => void;\n onSetColor?: (nodeId: string, color: string | null) => void;\n}\n\nexport function getNodeMenuItems({\n nodeId,\n isLocked,\n hasMediaOutput,\n currentColor,\n onDuplicate,\n onLock,\n onUnlock,\n onCut,\n onCopy,\n onDelete,\n onSetAsThumbnail,\n onSetColor,\n}: NodeMenuOptions): ContextMenuItemConfig[] {\n const items: ContextMenuItemConfig[] = [\n {\n icon: <Copy className=\"w-4 h-4\" />,\n id: 'duplicate',\n label: 'Duplicate',\n onClick: () => onDuplicate(nodeId),\n shortcut: '⌘D',\n },\n ];\n\n // Add \"Set as Thumbnail\" option for nodes with media output\n if (hasMediaOutput && onSetAsThumbnail) {\n items.push({\n icon: <Image className=\"w-4 h-4\" />,\n id: 'setThumbnail',\n label: 'Set as Thumbnail',\n onClick: () => onSetAsThumbnail(nodeId),\n });\n }\n\n // Add color picker submenu\n if (onSetColor) {\n const colorSubmenu: ContextMenuItemConfig[] = NODE_COLORS.map((color) => {\n const colorValue = NODE_COLOR_VALUES[color];\n const isSelected =\n colorValue === currentColor || (color === 'none' && !currentColor);\n return {\n icon: (\n <div\n className=\"w-4 h-4 rounded-sm border border-border\"\n style={{ backgroundColor: colorValue || 'transparent' }}\n />\n ),\n id: `color-${color}`,\n label: `${isSelected ? '✓ ' : ''}${NODE_COLOR_LABELS[color]}`,\n onClick: () => onSetColor(nodeId, colorValue),\n };\n });\n\n items.push({\n icon: <Palette className=\"w-4 h-4\" />,\n id: 'setColor',\n label: 'Set Color',\n submenu: colorSubmenu,\n });\n }\n\n items.push(createSeparator('separator-1'));\n\n items.push(\n isLocked\n ? {\n icon: <LockOpen className=\"w-4 h-4\" />,\n id: 'unlock',\n label: 'Unlock Node',\n onClick: () => onUnlock(nodeId),\n shortcut: 'L',\n }\n : {\n icon: <Lock className=\"w-4 h-4\" />,\n id: 'lock',\n label: 'Lock Node',\n onClick: () => onLock(nodeId),\n shortcut: 'L',\n },\n );\n\n items.push(createSeparator('separator-2'));\n\n items.push(\n {\n icon: <Scissors className=\"w-4 h-4\" />,\n id: 'cut',\n label: 'Cut',\n onClick: () => onCut(nodeId),\n shortcut: '⌘X',\n },\n {\n icon: <Copy className=\"w-4 h-4\" />,\n id: 'copy',\n label: 'Copy',\n onClick: () => onCopy(nodeId),\n shortcut: '⌘C',\n },\n );\n\n items.push(createSeparator('separator-3'));\n\n items.push({\n danger: true,\n icon: <Trash2 className=\"w-4 h-4\" />,\n id: 'delete',\n label: 'Delete',\n onClick: () => onDelete(nodeId),\n shortcut: '⌫',\n });\n\n return items;\n}\n","import { getNodesByCategory, type NodeCategory } from '@genfeedai/types';\nimport {\n ArrowLeftFromLine,\n ArrowRightToLine,\n AudioLines,\n Brain,\n CheckCircle,\n Clipboard,\n Crop,\n FileText,\n FileVideo,\n Film,\n GitBranch,\n Grid3X3,\n Image,\n Layers,\n LayoutGrid,\n type LucideIcon,\n Maximize,\n Maximize2,\n MessageSquare,\n Mic,\n Monitor,\n Navigation,\n Pencil,\n Scissors,\n Sparkles,\n Subtitles,\n Video,\n Volume2,\n Wand2,\n} from 'lucide-react';\nimport { type ContextMenuItemConfig, createSeparator } from '../ContextMenu';\n\n// Icon mapping from node definition icon strings to Lucide components\nconst NODE_ICONS: Record<string, LucideIcon> = {\n ArrowLeftFromLine,\n ArrowRightToLine,\n AudioLines,\n Brain,\n CheckCircle,\n Crop,\n FileText,\n FileVideo,\n Film,\n GitBranch,\n Grid3X3,\n Image,\n Layers,\n Maximize,\n Maximize2,\n MessageSquare,\n Mic,\n Navigation,\n Pencil,\n Scissors,\n Sparkles,\n Subtitles,\n Video,\n Volume2,\n Wand2,\n};\n\nconst CATEGORY_LABELS: Record<NodeCategory, string> = {\n ai: 'AI Generation',\n composition: 'Composition',\n input: 'Input',\n output: 'Output',\n processing: 'Processing',\n};\n\nconst CATEGORY_ICONS: Record<NodeCategory, LucideIcon> = {\n ai: Sparkles,\n composition: GitBranch,\n input: Image,\n output: Monitor,\n processing: Wand2,\n};\n\ninterface PaneMenuOptions {\n screenX: number;\n screenY: number;\n hasClipboard: boolean;\n onAddNode: (type: string, screenX: number, screenY: number) => void;\n onPaste: () => void;\n onSelectAll: () => void;\n onFitView: () => void;\n onAutoLayout: () => void;\n}\n\nexport function getPaneMenuItems({\n screenX,\n screenY,\n hasClipboard,\n onAddNode,\n onPaste,\n onSelectAll,\n onFitView,\n onAutoLayout,\n}: PaneMenuOptions): ContextMenuItemConfig[] {\n const nodesByCategory = getNodesByCategory();\n // Filter out categories with no nodes (e.g., deprecated 'output' category)\n const categories = (\n ['input', 'ai', 'processing', 'output', 'composition'] as NodeCategory[]\n ).filter((cat) => nodesByCategory[cat].length > 0);\n\n // Generate category submenus with all nodes\n const addNodeItems: ContextMenuItemConfig[] = categories.map((category) => {\n const CategoryIcon = CATEGORY_ICONS[category];\n const nodes = nodesByCategory[category];\n\n return {\n icon: <CategoryIcon className=\"w-4 h-4\" />,\n id: `add-${category}`,\n label: CATEGORY_LABELS[category],\n submenu: nodes.map((node) => {\n const NodeIcon = NODE_ICONS[node.icon] ?? Sparkles;\n return {\n icon: <NodeIcon className=\"w-4 h-4\" />,\n id: `add-${node.type}`,\n label: node.label,\n onClick: () => onAddNode(node.type, screenX, screenY),\n };\n }),\n };\n });\n\n return [\n ...addNodeItems,\n createSeparator('separator-1'),\n {\n disabled: !hasClipboard,\n icon: <Clipboard className=\"w-4 h-4\" />,\n id: 'paste',\n label: 'Paste',\n onClick: onPaste,\n shortcut: '⌘V',\n },\n createSeparator('separator-2'),\n {\n id: 'select-all',\n label: 'Select All',\n onClick: onSelectAll,\n shortcut: '⌘A',\n },\n {\n icon: <Maximize className=\"w-4 h-4\" />,\n id: 'fit-view',\n label: 'Fit View',\n onClick: onFitView,\n shortcut: 'F',\n },\n {\n icon: <LayoutGrid className=\"w-4 h-4\" />,\n id: 'auto-layout',\n label: 'Auto-layout Nodes',\n onClick: onAutoLayout,\n shortcut: 'L',\n },\n ];\n}\n","import {\n AlignHorizontalJustifyCenter,\n AlignVerticalJustifyCenter,\n Copy,\n Group,\n Lock,\n LockOpen,\n Trash2,\n} from 'lucide-react';\nimport { type ContextMenuItemConfig, createSeparator } from '../ContextMenu';\n\ninterface SelectionMenuOptions {\n nodeIds: string[];\n onGroup: (nodeIds: string[]) => void;\n onDuplicateAll: (nodeIds: string[]) => void;\n onLockAll: (nodeIds: string[]) => void;\n onUnlockAll: (nodeIds: string[]) => void;\n onAlignHorizontal: (nodeIds: string[]) => void;\n onAlignVertical: (nodeIds: string[]) => void;\n onDeleteAll: (nodeIds: string[]) => void;\n}\n\nexport function getSelectionMenuItems({\n nodeIds,\n onGroup,\n onDuplicateAll,\n onLockAll,\n onUnlockAll,\n onAlignHorizontal,\n onAlignVertical,\n onDeleteAll,\n}: SelectionMenuOptions): ContextMenuItemConfig[] {\n const count = nodeIds.length;\n\n return [\n {\n icon: <Group className=\"w-4 h-4\" />,\n id: 'group',\n label: 'Create Group',\n onClick: () => onGroup(nodeIds),\n shortcut: '⌘G',\n },\n {\n icon: <Copy className=\"w-4 h-4\" />,\n id: 'duplicate-all',\n label: `Duplicate ${count} Nodes`,\n onClick: () => onDuplicateAll(nodeIds),\n shortcut: '⌘D',\n },\n createSeparator('separator-1'),\n {\n icon: <Lock className=\"w-4 h-4\" />,\n id: 'lock-all',\n label: 'Lock All',\n onClick: () => onLockAll(nodeIds),\n shortcut: 'L',\n },\n {\n icon: <LockOpen className=\"w-4 h-4\" />,\n id: 'unlock-all',\n label: 'Unlock All',\n onClick: () => onUnlockAll(nodeIds),\n },\n createSeparator('separator-2'),\n {\n icon: <AlignHorizontalJustifyCenter className=\"w-4 h-4\" />,\n id: 'align-horizontal',\n label: 'Align Horizontally',\n onClick: () => onAlignHorizontal(nodeIds),\n },\n {\n icon: <AlignVerticalJustifyCenter className=\"w-4 h-4\" />,\n id: 'align-vertical',\n label: 'Align Vertically',\n onClick: () => onAlignVertical(nodeIds),\n },\n createSeparator('separator-3'),\n {\n danger: true,\n icon: <Trash2 className=\"w-4 h-4\" />,\n id: 'delete-all',\n label: `Delete ${count} Nodes`,\n onClick: () => onDeleteAll(nodeIds),\n shortcut: '⌫',\n },\n ];\n}\n","import type { WorkflowNodeData } from '@genfeedai/types';\nimport { useReactFlow } from '@xyflow/react';\nimport { useCallback, useMemo, useRef } from 'react';\nimport type { ContextMenuItemConfig } from '../components/context-menu';\nimport {\n getEdgeMenuItems,\n getNodeMenuItems,\n getPaneMenuItems,\n getSelectionMenuItems,\n} from '../components/context-menu/menus';\nimport { useWorkflowUIConfig } from '../provider/WorkflowUIProvider';\nimport { useContextMenuStore } from '../stores/contextMenuStore';\nimport {\n selectCreateGroup,\n selectNodes,\n selectSetSelectedNodeIds,\n selectToggleNodeLock,\n selectUpdateNodeData,\n selectWorkflowId,\n} from '../stores/workflow/selectors';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport { useNodeActions } from './useNodeActions';\nimport { usePaneActions } from './usePaneActions';\n\nexport function useContextMenu() {\n const {\n isOpen,\n position,\n menuType,\n targetId,\n targetIds,\n openNodeMenu,\n openEdgeMenu,\n openPaneMenu,\n openSelectionMenu,\n close,\n } = useContextMenuStore();\n\n const { workflowsApi } = useWorkflowUIConfig();\n\n const nodes = useWorkflowStore(selectNodes);\n const removeEdge = useWorkflowStore((state) => state.removeEdge);\n const toggleNodeLock = useWorkflowStore(selectToggleNodeLock);\n const createGroup = useWorkflowStore(selectCreateGroup);\n const workflowId = useWorkflowStore(selectWorkflowId);\n const addNodesAndEdges = useWorkflowStore((state) => state.addNodesAndEdges);\n const setSelectedNodeIds = useWorkflowStore(selectSetSelectedNodeIds);\n const updateNodeData = useWorkflowStore(selectUpdateNodeData);\n const {\n clipboard,\n deleteNode,\n duplicate,\n copyNode,\n cutNode,\n deleteMultipleNodes,\n duplicateMultipleNodes,\n getPasteData,\n } = useNodeActions();\n const { addNodeAtPosition, selectAll, fitView, autoLayout } =\n usePaneActions();\n const reactFlow = useReactFlow();\n\n // Stable reference for handlers that don't need to change\n const stableHandlersRef = useRef({\n addNodeAtPosition,\n autoLayout,\n copyNode,\n cutNode,\n deleteMultipleNodes,\n deleteNode,\n duplicate,\n duplicateMultipleNodes,\n fitView,\n removeEdge,\n selectAll,\n });\n\n // Update ref on each render (avoids stale closures while maintaining stable reference)\n stableHandlersRef.current = {\n addNodeAtPosition,\n autoLayout,\n copyNode,\n cutNode,\n deleteMultipleNodes,\n deleteNode,\n duplicate,\n duplicateMultipleNodes,\n fitView,\n removeEdge,\n selectAll,\n };\n\n const lockNode = useCallback(\n (nodeId: string) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (node && !node.data.locked) {\n toggleNodeLock(nodeId);\n }\n },\n [nodes, toggleNodeLock],\n );\n\n const unlockNode = useCallback(\n (nodeId: string) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (node?.data.locked) {\n toggleNodeLock(nodeId);\n }\n },\n [nodes, toggleNodeLock],\n );\n\n const groupNodes = useCallback(\n (nodeIds: string[]) => {\n if (nodeIds.length > 1) {\n createGroup(nodeIds);\n }\n },\n [createGroup],\n );\n\n const lockAllNodes = useCallback(\n (nodeIds: string[]) => {\n for (const nodeId of nodeIds) {\n const node = nodes.find((n) => n.id === nodeId);\n if (node && !node.data.locked) {\n toggleNodeLock(nodeId);\n }\n }\n },\n [nodes, toggleNodeLock],\n );\n\n const unlockAllNodes = useCallback(\n (nodeIds: string[]) => {\n for (const nodeId of nodeIds) {\n const node = nodes.find((n) => n.id === nodeId);\n if (node?.data.locked) {\n toggleNodeLock(nodeId);\n }\n }\n },\n [nodes, toggleNodeLock],\n );\n\n const alignNodesHorizontally = useCallback(\n (nodeIds: string[]) => {\n if (nodeIds.length < 2) return;\n\n const selectedNodes = nodes.filter((n) => nodeIds.includes(n.id));\n if (selectedNodes.length < 2) return;\n\n // Calculate average Y position\n const avgY =\n selectedNodes.reduce((sum, n) => sum + n.position.y, 0) /\n selectedNodes.length;\n\n // Update all selected nodes to the same Y position\n reactFlow.setNodes((nds) =>\n nds.map((node) =>\n nodeIds.includes(node.id)\n ? { ...node, position: { ...node.position, y: avgY } }\n : node,\n ),\n );\n },\n [nodes, reactFlow],\n );\n\n const alignNodesVertically = useCallback(\n (nodeIds: string[]) => {\n if (nodeIds.length < 2) return;\n\n const selectedNodes = nodes.filter((n) => nodeIds.includes(n.id));\n if (selectedNodes.length < 2) return;\n\n // Calculate average X position\n const avgX =\n selectedNodes.reduce((sum, n) => sum + n.position.x, 0) /\n selectedNodes.length;\n\n // Update all selected nodes to the same X position\n reactFlow.setNodes((nds) =>\n nds.map((node) =>\n nodeIds.includes(node.id)\n ? { ...node, position: { ...node.position, x: avgX } }\n : node,\n ),\n );\n },\n [nodes, reactFlow],\n );\n\n const pasteNodes = useCallback(() => {\n if (!clipboard) return;\n\n // Convert the context menu position to flow coordinates\n const flowPosition = reactFlow.screenToFlowPosition({\n x: position.x,\n y: position.y,\n });\n\n const pasteData = getPasteData(flowPosition.x, flowPosition.y);\n if (!pasteData) return;\n\n // Add nodes and edges to the store\n addNodesAndEdges(pasteData.nodes, pasteData.edges);\n\n // Select the pasted nodes\n setSelectedNodeIds(pasteData.nodes.map((n) => n.id));\n }, [\n clipboard,\n position,\n reactFlow,\n getPasteData,\n addNodesAndEdges,\n setSelectedNodeIds,\n ]);\n\n const setNodeColor = useCallback(\n (nodeId: string, color: string | null) => {\n updateNodeData(nodeId, { color: color || undefined });\n },\n [updateNodeData],\n );\n\n const setAsThumbnail = useCallback(\n async (nodeId: string) => {\n if (!workflowId || !workflowsApi) return;\n\n const node = nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const data = node.data as WorkflowNodeData & {\n outputVideo?: string;\n outputImage?: string;\n };\n\n const thumbnailUrl = data.outputVideo || data.outputImage;\n if (!thumbnailUrl) return;\n\n try {\n await workflowsApi.setThumbnail(workflowId, thumbnailUrl, nodeId);\n } catch {\n // Silently fail — consuming app can handle errors via its own API layer\n }\n },\n [workflowId, workflowsApi, nodes],\n );\n\n const hasMediaOutput = useCallback(\n (nodeId: string): boolean => {\n const node = nodes.find((n) => n.id === nodeId);\n if (!node) return false;\n\n const data = node.data as WorkflowNodeData & {\n outputVideo?: string;\n outputImage?: string;\n };\n\n return Boolean(data.outputVideo || data.outputImage);\n },\n [nodes],\n );\n\n const getMenuItems = useCallback((): ContextMenuItemConfig[] => {\n if (!menuType) return [];\n\n const handlers = stableHandlersRef.current;\n\n switch (menuType) {\n case 'node': {\n if (!targetId) return [];\n const node = nodes.find((n) => n.id === targetId);\n const isLocked = Boolean(node?.data.locked);\n const nodeHasMediaOutput = hasMediaOutput(targetId);\n const currentColor = (node?.data as { color?: string })?.color;\n return getNodeMenuItems({\n currentColor,\n hasMediaOutput: nodeHasMediaOutput,\n isLocked,\n nodeId: targetId,\n onCopy: handlers.copyNode,\n onCut: handlers.cutNode,\n onDelete: handlers.deleteNode,\n onDuplicate: handlers.duplicate,\n onLock: lockNode,\n onSetAsThumbnail:\n workflowId && workflowsApi ? setAsThumbnail : undefined,\n onSetColor: setNodeColor,\n onUnlock: unlockNode,\n });\n }\n\n case 'edge':\n if (!targetId) return [];\n return getEdgeMenuItems({\n edgeId: targetId,\n onDelete: handlers.removeEdge,\n });\n\n case 'pane':\n return getPaneMenuItems({\n hasClipboard: !!clipboard,\n onAddNode: handlers.addNodeAtPosition,\n onAutoLayout: () => handlers.autoLayout('LR'),\n onFitView: handlers.fitView,\n onPaste: pasteNodes,\n onSelectAll: handlers.selectAll,\n screenX: position.x,\n screenY: position.y,\n });\n\n case 'selection':\n if (!targetIds || targetIds.length === 0) return [];\n return getSelectionMenuItems({\n nodeIds: targetIds,\n onAlignHorizontal: alignNodesHorizontally,\n onAlignVertical: alignNodesVertically,\n onDeleteAll: handlers.deleteMultipleNodes,\n onDuplicateAll: handlers.duplicateMultipleNodes,\n onGroup: groupNodes,\n onLockAll: lockAllNodes,\n onUnlockAll: unlockAllNodes,\n });\n\n default:\n return [];\n }\n }, [\n menuType,\n targetId,\n targetIds,\n nodes,\n position,\n clipboard,\n lockNode,\n unlockNode,\n pasteNodes,\n groupNodes,\n lockAllNodes,\n unlockAllNodes,\n alignNodesHorizontally,\n alignNodesVertically,\n hasMediaOutput,\n setAsThumbnail,\n setNodeColor,\n workflowId,\n workflowsApi,\n ]);\n\n const menuItems = useMemo(() => getMenuItems(), [getMenuItems]);\n\n return {\n close,\n isOpen,\n menuItems,\n menuType,\n openEdgeMenu,\n openNodeMenu,\n openPaneMenu,\n openSelectionMenu,\n position,\n };\n}\n"]}
@@ -15,7 +15,7 @@ function supportsImageInput(schema) {
15
15
  if (!schema) return true;
16
16
  const properties = schema.properties;
17
17
  if (!properties) return true;
18
- return !!(properties.image || properties.image_input || properties.start_image || properties.first_frame_image || properties.reference_images);
18
+ return !!(properties.image || properties.image_input || properties.image_url || properties.image_urls || properties.start_image || properties.first_frame_image || properties.reference_images);
19
19
  }
20
20
  function extractEnumValues(componentSchemas) {
21
21
  if (!componentSchemas) return void 0;
@@ -57,13 +57,14 @@ var CONNECTION_FIELDS = /* @__PURE__ */ new Set([
57
57
  "prompt",
58
58
  "image",
59
59
  "image_input",
60
+ "image_url",
61
+ "image_urls",
60
62
  "video",
61
63
  "audio",
62
64
  "start_image",
63
65
  "first_frame_image",
64
66
  "last_frame",
65
67
  "reference_images",
66
- "image_url",
67
68
  "video_url",
68
69
  "end_image",
69
70
  "start_video_id",
@@ -97,3 +98,5 @@ function getVideoMetadata(src) {
97
98
  }
98
99
 
99
100
  export { CONNECTION_FIELDS, extractEnumValues, getImageDimensions, getSchemaDefaults, getVideoMetadata, supportsImageInput, validateRequiredSchemaFields };
101
+ //# sourceMappingURL=chunk-X3XNTD4R.mjs.map
102
+ //# sourceMappingURL=chunk-X3XNTD4R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/schemaUtils.ts","../src/lib/schemaValidation.ts","../src/lib/media.ts"],"names":[],"mappings":"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","file":"chunk-X3XNTD4R.mjs","sourcesContent":["/**\n * Shared utilities for working with provider model schemas\n */\n\ntype SchemaProperty = {\n default?: unknown;\n enum?: unknown[];\n type?: string;\n $ref?: string;\n};\n\ntype SchemaProperties = Record<string, SchemaProperty>;\n\ninterface Schema {\n properties?: SchemaProperties;\n}\n\n/**\n * Extract default values from schema properties\n */\nexport function getSchemaDefaults(\n schema: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!schema) return {};\n\n const properties = (schema as Schema).properties;\n if (!properties) return {};\n\n const defaults: Record<string, unknown> = {};\n for (const [key, prop] of Object.entries(properties)) {\n if (prop.default !== undefined) {\n defaults[key] = prop.default;\n }\n }\n return defaults;\n}\n\n/**\n * Check if the model's schema supports image input\n * Used to determine whether to enable/disable image input handles\n */\nexport function 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 Schema).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\n/**\n * Extract enum values from component schemas for SchemaInputs dropdowns\n */\nexport function extractEnumValues(\n componentSchemas:\n | Record<string, { enum?: unknown[]; type?: string }>\n | undefined,\n): Record<string, string[]> | undefined {\n if (!componentSchemas) return undefined;\n\n const result: Record<string, string[]> = {};\n for (const [key, schema] of Object.entries(componentSchemas)) {\n if (schema.enum && Array.isArray(schema.enum)) {\n // Convert all enum values to strings for the dropdown\n result[key] = schema.enum.map((v) => String(v));\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Utility functions for validating required schema fields\n */\n\n/**\n * JSON Schema with required array\n */\ninterface JsonSchema {\n required?: string[];\n properties?: Record<string, unknown>;\n}\n\n/**\n * Validates that all required fields in a JSON Schema have values.\n *\n * @param inputSchema - The JSON Schema with required array\n * @param values - Current field values\n * @param skipFields - Fields to skip (e.g., fields populated via connections)\n * @returns Validation result with isValid flag and list of missing fields\n */\nexport function validateRequiredSchemaFields(\n inputSchema: Record<string, unknown> | undefined,\n values: Record<string, unknown>,\n skipFields: Set<string>,\n): { isValid: boolean; missingFields: string[] } {\n if (!inputSchema) {\n return { isValid: true, missingFields: [] };\n }\n\n const schema = inputSchema as JsonSchema;\n const requiredFields = schema.required ?? [];\n\n if (requiredFields.length === 0) {\n return { isValid: true, missingFields: [] };\n }\n\n const missingFields: string[] = [];\n\n for (const field of requiredFields) {\n // Skip fields that come from connections\n if (skipFields.has(field)) {\n continue;\n }\n\n const value = values[field];\n\n // Check if value is missing or empty\n if (value === undefined || value === null || value === '') {\n missingFields.push(field);\n }\n }\n\n return {\n isValid: missingFields.length === 0,\n missingFields,\n };\n}\n\n/**\n * Fields that are populated via node connections rather than schema inputs.\n * These should be skipped when validating schema required fields.\n */\nexport const CONNECTION_FIELDS = new Set([\n 'prompt',\n 'image',\n 'image_input',\n 'image_url',\n 'image_urls',\n 'video',\n 'audio',\n 'start_image',\n 'first_frame_image',\n 'last_frame',\n 'reference_images',\n 'video_url',\n 'end_image',\n 'start_video_id',\n 'end_video_id',\n 'subject_reference',\n 'image_prompt',\n 'mask',\n]);\n","/**\n * Get the dimensions of an image from its source URL or data URL.\n */\nexport function getImageDimensions(\n src: string,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n const img = new window.Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => resolve({ height: img.height, width: img.width });\n img.onerror = () => resolve({ height: 0, width: 0 });\n img.src = src;\n });\n}\n\n/**\n * Get duration and dimensions of a video from its source URL or data URL.\n */\nexport function getVideoMetadata(src: string): Promise<{\n duration: number;\n dimensions: { width: number; height: number };\n}> {\n return new Promise((resolve) => {\n const video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.onloadedmetadata = () =>\n resolve({\n dimensions: { height: video.videoHeight, width: video.videoWidth },\n duration: video.duration,\n });\n video.onerror = () =>\n resolve({ dimensions: { height: 0, width: 0 }, duration: 0 });\n video.src = src;\n });\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-YYFM6P4C.mjs.map
3
+ //# sourceMappingURL=chunk-YYFM6P4C.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-YYFM6P4C.mjs"}
package/dist/hooks.mjs CHANGED
@@ -1,11 +1,13 @@
1
- export { useCommentNavigation } from './chunk-ESVULCFY.mjs';
2
- export { useCanvasKeyboardShortcuts, useContextMenu, useNodeActions, usePaneActions } from './chunk-ORVDYXDP.mjs';
3
- export { useAIGenNode, useAIGenNodeHeader, useAutoLoadModelSchema, useCanGenerate, useMediaUpload, useModelSelection, useNodeExecution, usePromptAutocomplete, useRequiredInputs } from './chunk-FWJIAW2E.mjs';
4
- import './chunk-B4EAAKYF.mjs';
5
- import './chunk-VVQ4CH77.mjs';
6
- import './chunk-YUIK4AHM.mjs';
7
- import './chunk-7LV4UAUS.mjs';
8
- import './chunk-LDN7IX4Y.mjs';
9
- import './chunk-OJWVEEMM.mjs';
10
- import './chunk-GPYIIWD5.mjs';
11
- import './chunk-XRC3O5GK.mjs';
1
+ export { useCommentNavigation } from './chunk-TOFB4BTA.mjs';
2
+ export { useCanvasKeyboardShortcuts, useContextMenu, useNodeActions, usePaneActions } from './chunk-VKXTPLM7.mjs';
3
+ export { useAIGenNode, useAIGenNodeHeader, useAutoLoadModelSchema, useCanGenerate, useMediaUpload, useModelSelection, useNodeExecution, usePromptAutocomplete, useRequiredInputs } from './chunk-SHU7JPQY.mjs';
4
+ import './chunk-SBB2YW3Y.mjs';
5
+ import './chunk-X3XNTD4R.mjs';
6
+ import './chunk-JSF4FHBH.mjs';
7
+ import './chunk-IKR6GVZ4.mjs';
8
+ import './chunk-YYFM6P4C.mjs';
9
+ import './chunk-R5L7WB7F.mjs';
10
+ import './chunk-7DJHFOIW.mjs';
11
+ import './chunk-4JOFNZW6.mjs';
12
+ //# sourceMappingURL=hooks.mjs.map
13
+ //# sourceMappingURL=hooks.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"hooks.mjs"}
package/dist/index.d.ts CHANGED
@@ -45,4 +45,4 @@ interface WorkflowEditorShellProps {
45
45
  }
46
46
  declare function WorkflowEditorShell({ modalContent, nodePalette, nodeTypes, onDownloadAsZip, rightPanel, showBottomBar, showNodePalette, showSmallGraphViewportGuard, toolbar, }: WorkflowEditorShellProps): react_jsx_runtime.JSX.Element;
47
47
 
48
- export { DEFAULT_GROUP_COLORS, GROUP_COLORS, GlobalImageHistory, NotificationToast, SmallGraphViewportGuard, WorkflowEditorShell };
48
+ export { DEFAULT_GROUP_COLORS, GROUP_COLORS, GlobalImageHistory, NotificationToast, SmallGraphViewportGuard, WorkflowEditorShell, type WorkflowEditorShellProps };
package/dist/index.mjs CHANGED
@@ -1,28 +1,28 @@
1
- import { BottomBar } from './chunk-ZSITTZ4S.mjs';
2
- export { BottomBar, CostIndicator, OverflowMenu, SaveAsDialog, SaveIndicator, Toolbar, ToolbarDropdown } from './chunk-ZSITTZ4S.mjs';
3
- import { WorkflowCanvas } from './chunk-53XDE62A.mjs';
4
- export { ConnectionDropMenu, DEFAULT_GROUP_COLORS, EdgeToolbar, EditableEdge, GROUP_COLORS, GlobalImageHistory, GroupOverlay, HelperLines, NodeSearch, NotificationToast, PauseEdge, ReferenceEdge, ShortcutHelpModal, WorkflowCanvas } from './chunk-53XDE62A.mjs';
5
- export { useCommentNavigation } from './chunk-ESVULCFY.mjs';
6
- export { useCanvasKeyboardShortcuts } from './chunk-ORVDYXDP.mjs';
7
- import './chunk-MGLAKMDP.mjs';
8
- export { BaseNode, nodeTypes } from './chunk-2FUPL67V.mjs';
9
- import './chunk-C6MQBJFC.mjs';
10
- export { useAIGenNode, useAIGenNodeHeader, useAutoLoadModelSchema, useCanGenerate, useMediaUpload, useModelSelection, useNodeExecution, usePromptAutocomplete, useRequiredInputs } from './chunk-FWJIAW2E.mjs';
11
- import './chunk-B4EAAKYF.mjs';
12
- import './chunk-U4QPE4CY.mjs';
13
- import './chunk-VVQ4CH77.mjs';
14
- import { NodePalette } from './chunk-IYFWAJBB.mjs';
15
- export { DebugPanel, NodePalette, PanelContainer } from './chunk-IYFWAJBB.mjs';
16
- import './chunk-MLJJBBTB.mjs';
17
- export { WorkflowUIProvider, useWorkflowUIConfig } from './chunk-YUIK4AHM.mjs';
18
- import './chunk-7LV4UAUS.mjs';
19
- export { useAnnotationStore, usePromptEditorStore } from './chunk-QQVHGJ2G.mjs';
20
- import './chunk-LDN7IX4Y.mjs';
21
- import { useUIStore } from './chunk-OJWVEEMM.mjs';
22
- export { useExecutionStore, useSettingsStore, useUIStore } from './chunk-OJWVEEMM.mjs';
23
- import { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
24
- export { useWorkflowStore } from './chunk-GPYIIWD5.mjs';
25
- export { configurePromptLibrary, usePromptLibraryStore } from './chunk-XRC3O5GK.mjs';
1
+ import { BottomBar } from './chunk-3GWH2ZOH.mjs';
2
+ export { BottomBar, CostIndicator, OverflowMenu, SaveAsDialog, SaveIndicator, Toolbar, ToolbarDropdown } from './chunk-3GWH2ZOH.mjs';
3
+ import { WorkflowCanvas } from './chunk-NDDAL2OG.mjs';
4
+ export { ConnectionDropMenu, DEFAULT_GROUP_COLORS, EdgeToolbar, EditableEdge, GROUP_COLORS, GlobalImageHistory, GroupOverlay, HelperLines, NodeSearch, NotificationToast, PauseEdge, ReferenceEdge, ShortcutHelpModal, WorkflowCanvas } from './chunk-NDDAL2OG.mjs';
5
+ export { useCommentNavigation } from './chunk-TOFB4BTA.mjs';
6
+ export { useCanvasKeyboardShortcuts } from './chunk-VKXTPLM7.mjs';
7
+ import './chunk-2BHILUF7.mjs';
8
+ export { BaseNode, nodeTypes } from './chunk-72UIUFXH.mjs';
9
+ import './chunk-G3HCTMAZ.mjs';
10
+ export { useAIGenNode, useAIGenNodeHeader, useAutoLoadModelSchema, useCanGenerate, useMediaUpload, useModelSelection, useNodeExecution, usePromptAutocomplete, useRequiredInputs } from './chunk-SHU7JPQY.mjs';
11
+ import './chunk-SBB2YW3Y.mjs';
12
+ import './chunk-2C2AAXJP.mjs';
13
+ import './chunk-X3XNTD4R.mjs';
14
+ import { NodePalette } from './chunk-HMTYPFOT.mjs';
15
+ export { DebugPanel, NodePalette, PanelContainer } from './chunk-HMTYPFOT.mjs';
16
+ import './chunk-SRPSHHHV.mjs';
17
+ export { WorkflowUIProvider, useWorkflowUIConfig } from './chunk-JSF4FHBH.mjs';
18
+ import './chunk-IKR6GVZ4.mjs';
19
+ export { useAnnotationStore, usePromptEditorStore } from './chunk-AZJFDWBF.mjs';
20
+ import './chunk-YYFM6P4C.mjs';
21
+ import { useUIStore } from './chunk-R5L7WB7F.mjs';
22
+ export { useExecutionStore, useSettingsStore, useUIStore } from './chunk-R5L7WB7F.mjs';
23
+ import { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
24
+ export { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
25
+ export { configurePromptLibrary, usePromptLibraryStore } from './chunk-4JOFNZW6.mjs';
26
26
  import { useReactFlow } from '@xyflow/react';
27
27
  import { useRef, useEffect } from 'react';
28
28
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -78,7 +78,13 @@ function WorkflowEditorShell({
78
78
  /* @__PURE__ */ jsxs("main", { className: "flex min-h-0 flex-1 flex-col overflow-hidden bg-[var(--background)]", children: [
79
79
  toolbar,
80
80
  /* @__PURE__ */ jsxs("div", { className: "flex flex-1 overflow-hidden", children: [
81
- showNodePalette && showPalette && (nodePalette ?? /* @__PURE__ */ jsx(NodePalette, {})),
81
+ showNodePalette && /* @__PURE__ */ jsx(
82
+ "div",
83
+ {
84
+ className: `overflow-hidden transition-all duration-300 ease-in-out ${showPalette ? "w-64 opacity-100" : "w-0 opacity-0"}`,
85
+ children: nodePalette ?? /* @__PURE__ */ jsx(NodePalette, {})
86
+ }
87
+ ),
82
88
  /* @__PURE__ */ jsxs("div", { className: "relative flex-1", children: [
83
89
  showSmallGraphViewportGuard && /* @__PURE__ */ jsx(SmallGraphViewportGuard, {}),
84
90
  /* @__PURE__ */ jsx(
@@ -98,3 +104,5 @@ function WorkflowEditorShell({
98
104
  }
99
105
 
100
106
  export { SmallGraphViewportGuard, WorkflowEditorShell };
107
+ //# sourceMappingURL=index.mjs.map
108
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/SmallGraphViewportGuard.tsx","../src/components/WorkflowEditorShell.tsx"],"names":["nodeTypes"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useReactFlow } from '@xyflow/react';\nimport { useEffect, useRef } from 'react';\nimport { useWorkflowStore } from '../stores/workflowStore';\n\nconst SMALL_GRAPH_NODE_LIMIT = 2;\nconst SMALL_GRAPH_MAX_ZOOM = 0.9;\nconst SMALL_GRAPH_MIN_ZOOM = 0.35;\nconst SMALL_GRAPH_PADDING = 0.24;\n\nexport function SmallGraphViewportGuard() {\n const nodes = useWorkflowStore((state) => state.nodes);\n const reactFlow = useReactFlow();\n const previousNodeCountRef = useRef<number | null>(null);\n\n useEffect(() => {\n const previousNodeCount = previousNodeCountRef.current;\n previousNodeCountRef.current = nodes.length;\n\n if (previousNodeCount === null) {\n return;\n }\n\n const isSmallGraph =\n nodes.length > 0 && nodes.length <= SMALL_GRAPH_NODE_LIMIT;\n const addedNodeToSmallGraph = nodes.length > previousNodeCount;\n\n if (!isSmallGraph || !addedNodeToSmallGraph) {\n return;\n }\n\n const schedule =\n typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : (callback: FrameRequestCallback) =>\n window.setTimeout(() => callback(performance.now()), 0);\n const cancel =\n typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame.bind(window)\n : window.clearTimeout.bind(window);\n\n const handle = schedule(() => {\n reactFlow.fitView({\n duration: 180,\n maxZoom: SMALL_GRAPH_MAX_ZOOM,\n minZoom: SMALL_GRAPH_MIN_ZOOM,\n padding: SMALL_GRAPH_PADDING,\n });\n });\n\n return () => {\n cancel(handle);\n };\n }, [nodes.length, reactFlow]);\n\n return null;\n}\n","'use client';\n\nimport type { WorkflowNode } from '@genfeedai/types';\nimport type { NodeTypes } from '@xyflow/react';\nimport type { ReactNode } from 'react';\nimport { WorkflowCanvas } from '../canvas/WorkflowCanvas';\nimport { NodePalette } from '../panels/NodePalette';\nimport { useUIStore } from '../stores/uiStore';\nimport { BottomBar } from '../toolbar/BottomBar';\nimport { SmallGraphViewportGuard } from './SmallGraphViewportGuard';\n\nexport interface WorkflowEditorShellProps {\n modalContent?: ReactNode;\n nodePalette?: ReactNode;\n nodeTypes?: NodeTypes;\n onDownloadAsZip?: (nodes: WorkflowNode[]) => void;\n rightPanel?: ReactNode;\n showBottomBar?: boolean;\n showNodePalette?: boolean;\n showSmallGraphViewportGuard?: boolean;\n toolbar: ReactNode;\n}\n\nexport function WorkflowEditorShell({\n modalContent,\n nodePalette,\n nodeTypes,\n onDownloadAsZip,\n rightPanel,\n showBottomBar = true,\n showNodePalette = true,\n showSmallGraphViewportGuard = true,\n toolbar,\n}: WorkflowEditorShellProps) {\n const showPalette = useUIStore((state) => state.showPalette);\n\n return (\n <>\n <main className=\"flex min-h-0 flex-1 flex-col overflow-hidden bg-[var(--background)]\">\n {toolbar}\n\n <div className=\"flex flex-1 overflow-hidden\">\n {showNodePalette && (\n <div\n className={`overflow-hidden transition-all duration-300 ease-in-out ${\n showPalette ? 'w-64 opacity-100' : 'w-0 opacity-0'\n }`}\n >\n {nodePalette ?? <NodePalette />}\n </div>\n )}\n\n <div className=\"relative flex-1\">\n {showSmallGraphViewportGuard && <SmallGraphViewportGuard />}\n <WorkflowCanvas\n nodeTypes={nodeTypes}\n onDownloadAsZip={onDownloadAsZip}\n />\n {showBottomBar && <BottomBar />}\n </div>\n\n {rightPanel}\n </div>\n </main>\n\n {modalContent}\n </>\n );\n}\n"]}
package/dist/lib.mjs CHANGED
@@ -1,7 +1,7 @@
1
- export { calculateWorkflowCost, formatCost } from './chunk-MGLAKMDP.mjs';
2
- import { easing, getEasingFunction } from './chunk-U4QPE4CY.mjs';
3
- export { CubicBezierEditor, DEFAULT_CUSTOM_BEZIER, DEFAULT_IMAGE_MODEL, DEFAULT_LIPSYNC_MODEL, DEFAULT_LLM_MODEL, DEFAULT_VIDEO_MODEL, EASING_BEZIER_MAP, EASING_PRESETS, IMAGE_MODELS, IMAGE_MODEL_ID_MAP, IMAGE_MODEL_MAP, LIPSYNC_MODELS, LIPSYNC_SYNC_MODES, LLM_MODELS, LLM_MODEL_ID_MAP, LLM_MODEL_MAP, PRESET_BEZIERS, VIDEO_MODELS, VIDEO_MODEL_ID_MAP, VIDEO_MODEL_MAP, applySpeedCurve, createAsymmetricEase, createBezierEasing, easing, evaluateBezier, generateHandlesFromSchema, getAllEasingNames, getEasingBezier, getEasingDisplayName, getEasingFunction, getImageModelLabel, getLLMModelLabel, getLipSyncModelLabel, getMediaFromNode, getPresetBezier, getVideoModelLabel, isSchemaHandle, lipSyncModelSupportsImage } from './chunk-U4QPE4CY.mjs';
4
- export { CONNECTION_FIELDS, extractEnumValues, getImageDimensions, getSchemaDefaults, getVideoMetadata, supportsImageInput, validateRequiredSchemaFields } from './chunk-VVQ4CH77.mjs';
1
+ export { calculateWorkflowCost, formatCost } from './chunk-2BHILUF7.mjs';
2
+ import { easing, getEasingFunction } from './chunk-2C2AAXJP.mjs';
3
+ export { CubicBezierEditor, DEFAULT_CUSTOM_BEZIER, DEFAULT_IMAGE_MODEL, DEFAULT_LIPSYNC_MODEL, DEFAULT_LLM_MODEL, DEFAULT_VIDEO_MODEL, EASING_BEZIER_MAP, EASING_PRESETS, IMAGE_MODELS, IMAGE_MODEL_ID_MAP, IMAGE_MODEL_MAP, LIPSYNC_MODELS, LIPSYNC_SYNC_MODES, LLM_MODELS, LLM_MODEL_ID_MAP, LLM_MODEL_MAP, PRESET_BEZIERS, VIDEO_MODELS, VIDEO_MODEL_ID_MAP, VIDEO_MODEL_MAP, applySpeedCurve, createAsymmetricEase, createBezierEasing, easing, evaluateBezier, generateHandlesFromSchema, getAllEasingNames, getEasingBezier, getEasingDisplayName, getEasingFunction, getImageModelLabel, getLLMModelLabel, getLipSyncModelLabel, getMediaFromNode, getPresetBezier, getVideoModelLabel, isSchemaHandle, lipSyncModelSupportsImage } from './chunk-2C2AAXJP.mjs';
4
+ export { CONNECTION_FIELDS, extractEnumValues, getImageDimensions, getSchemaDefaults, getVideoMetadata, supportsImageInput, validateRequiredSchemaFields } from './chunk-X3XNTD4R.mjs';
5
5
 
6
6
  // src/lib/deduplicatedFetch.ts
7
7
  var inFlightRequests = /* @__PURE__ */ new Map();
@@ -590,3 +590,5 @@ function analyzeWarpCurve(easingFunction = easing.easeInOutCubic, inputDuration
590
590
  }
591
591
 
592
592
  export { analyzeWarpCurve, calculateNodeSize, calculateNodeSizePreservingHeight, calculateWarpedDuration, clearFetchCache, createGridForDimensions, deduplicatedFetch, detectAndSplitGrid, detectGrid, detectGridWithDimensions, getGridCandidates, getImageDimensions2 as getImageDimensionsFromDataUrl, getVideoDimensions as getVideoDimensionsFromUrl, splitImage, splitWithDimensions, validateWarpFunction, warpTime };
593
+ //# sourceMappingURL=lib.mjs.map
594
+ //# sourceMappingURL=lib.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/deduplicatedFetch.ts","../src/lib/gridSplitter.ts","../src/lib/nodeDimensions.ts","../src/lib/speedCurve.ts"],"names":["getImageDimensions"],"mappings":"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","file":"lib.mjs","sourcesContent":["/**\n * Deduplicated Fetch Utility\n *\n * When multiple callers request the same URL concurrently, only one\n * actual network request is made. All callers receive the same response\n * data once the request completes. Responses are cached for 5 seconds.\n */\n\nconst inFlightRequests = new Map<string, Promise<Response>>();\n\nconst responseCache = new Map<\n string,\n {\n status: number;\n headers: Record<string, string>;\n bodyText: string;\n timestamp: number;\n }\n>();\n\nconst CACHE_TTL = 5000;\n\nconst pendingTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nfunction getCacheKey(url: string, headers?: HeadersInit): string {\n if (!headers) return url;\n\n const headerObj =\n headers instanceof Headers\n ? Object.fromEntries(headers.entries())\n : Array.isArray(headers)\n ? Object.fromEntries(headers)\n : headers;\n\n const sortedHeaders = Object.keys(headerObj as Record<string, string>)\n .sort()\n .map((k) => `${k}:${(headerObj as Record<string, string>)[k]}`)\n .join('|');\n\n return `${url}|${sortedHeaders}`;\n}\n\n/**\n * Fetch with request deduplication.\n *\n * Multiple concurrent calls to the same URL (with same headers) will\n * share a single network request. The response is cloned for each caller.\n */\nexport async function deduplicatedFetch(\n url: string,\n options?: RequestInit,\n): Promise<Response> {\n const cacheKey = getCacheKey(url, options?.headers);\n\n const cached = responseCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return new Response(cached.bodyText, {\n headers: cached.headers,\n status: cached.status,\n });\n }\n\n const existingRequest = inFlightRequests.get(cacheKey);\n if (existingRequest) {\n await existingRequest;\n const cachedData = responseCache.get(cacheKey);\n if (cachedData) {\n return new Response(cachedData.bodyText, {\n headers: cachedData.headers,\n status: cachedData.status,\n });\n }\n return new Response(JSON.stringify({ error: 'Cache miss' }), {\n status: 500,\n });\n }\n\n const requestPromise = fetch(url, options)\n .then(async (response) => {\n try {\n const bodyText = await response.clone().text();\n responseCache.set(cacheKey, {\n bodyText,\n headers: Object.fromEntries(response.headers.entries()),\n status: response.status,\n timestamp: Date.now(),\n });\n } catch {\n // Failed to read response body for caching\n }\n return response;\n })\n .finally(() => {\n const timeoutId = setTimeout(() => {\n inFlightRequests.delete(cacheKey);\n pendingTimeouts.delete(cacheKey);\n }, 50);\n pendingTimeouts.set(cacheKey, timeoutId);\n });\n\n inFlightRequests.set(cacheKey, requestPromise);\n\n return requestPromise;\n}\n\n/**\n * Clear all cached responses.\n */\nexport function clearFetchCache(): void {\n responseCache.clear();\n inFlightRequests.clear();\n for (const timeoutId of pendingTimeouts.values()) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts.clear();\n}\n","/**\n * Grid Splitter Utility\n *\n * Detects and splits contact sheet grids into component images.\n * Uses a regularity-first approach that assumes grids are uniform,\n * scoring candidates based on how well the image dimensions divide\n * into cells with common photo aspect ratios.\n */\n\nexport interface GridCell {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface GridDetectionResult {\n rows: number;\n cols: number;\n cells: GridCell[];\n confidence: number;\n}\n\nexport interface GridCandidate {\n rows: number;\n cols: number;\n cellWidth: number;\n cellHeight: number;\n cellAspectRatio: number;\n score: number;\n}\n\n// Common photo/video aspect ratios (width:height), ordered by likelihood in contact sheets\nconst COMMON_ASPECT_RATIOS = [\n 16 / 9, // 1.778 - Widescreen video\n 4 / 3, // 1.333 - Standard photo/video\n 3 / 2, // 1.5 - DSLR photos\n 1.85, // 1.85:1 - Cinema flat\n 2.39, // 2.39:1 - Cinema scope\n 1, // 1:1 - Square\n 9 / 16, // 0.5625 - Portrait video\n 3 / 4, // 0.75 - Portrait photo\n 2 / 3, // 0.667 - Portrait DSLR\n];\n\n/**\n * Analyzes an image and detects grid boundaries.\n */\nexport async function detectGrid(\n imageDataUrl: string,\n): Promise<GridDetectionResult> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const result = analyzeGridFromImageData(imageData);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error('Failed to load image'));\n };\n\n img.src = imageDataUrl;\n });\n}\n\n/**\n * Creates a grid result for a specific rows x cols configuration.\n */\nexport function createGridForDimensions(\n width: number,\n height: number,\n rows: number,\n cols: number,\n): GridDetectionResult {\n const cellWidth = width / cols;\n const cellHeight = height / rows;\n\n const cells: GridCell[] = [];\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n cells.push({\n height: Math.round(cellHeight),\n width: Math.round(cellWidth),\n x: Math.round(col * cellWidth),\n y: Math.round(row * cellHeight),\n });\n }\n }\n\n return { cells, cols, confidence: 1, rows };\n}\n\n/**\n * Detects grid with user-specified dimensions (most reliable).\n */\nexport async function detectGridWithDimensions(\n imageDataUrl: string,\n rows: number,\n cols: number,\n): Promise<GridDetectionResult> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n img.onload = () => {\n const result = createGridForDimensions(img.width, img.height, rows, cols);\n resolve(result);\n };\n\n img.onerror = () => {\n reject(new Error('Failed to load image'));\n };\n\n img.src = imageDataUrl;\n });\n}\n\n/**\n * Calculate how well an aspect ratio matches common ratios.\n * Returns a score from 0 to 1 (1 = perfect match).\n */\nfunction aspectRatioScore(aspectRatio: number): number {\n let bestMatch = Infinity;\n\n for (const commonAR of COMMON_ASPECT_RATIOS) {\n const ratio =\n aspectRatio > commonAR ? aspectRatio / commonAR : commonAR / aspectRatio;\n const distance = ratio - 1;\n bestMatch = Math.min(bestMatch, distance);\n }\n\n return Math.exp(-bestMatch * 3);\n}\n\n/**\n * Gets ranked grid candidates based on geometric analysis.\n */\nexport function getGridCandidates(\n width: number,\n height: number,\n): GridCandidate[] {\n const candidates: GridCandidate[] = [];\n const imageAspectRatio = width / height;\n\n for (let rows = 1; rows <= 6; rows++) {\n for (let cols = 1; cols <= 6; cols++) {\n if (rows === 1 && cols === 1) continue;\n\n const cellWidth = width / cols;\n const cellHeight = height / rows;\n const cellAspectRatio = cellWidth / cellHeight;\n\n const cellARScore = aspectRatioScore(cellAspectRatio);\n\n const gridAspectRatio = cols / rows;\n const layoutRatio =\n imageAspectRatio > gridAspectRatio\n ? imageAspectRatio / gridAspectRatio\n : gridAspectRatio / imageAspectRatio;\n const layoutScore = Math.exp(-(layoutRatio - 1) * 2);\n\n const cellCount = rows * cols;\n const cellCountScore = Math.min(cellCount / 6, 1);\n\n const gridSymmetry = 1 - Math.abs(rows - cols) / Math.max(rows, cols);\n\n const score =\n cellARScore * 0.45 +\n layoutScore * 0.25 +\n cellCountScore * 0.15 +\n gridSymmetry * 0.15;\n\n candidates.push({\n cellAspectRatio,\n cellHeight,\n cellWidth,\n cols,\n rows,\n score,\n });\n }\n }\n\n return candidates.sort((a, b) => b.score - a.score);\n}\n\n/**\n * Core grid detection using regularity-first approach.\n */\nfunction analyzeGridFromImageData(imageData: ImageData): GridDetectionResult {\n const { width, height, data } = imageData;\n\n const candidates = getGridCandidates(width, height);\n const verticalEdgeStrength = calculateVerticalEdgeProfile(\n data,\n width,\n height,\n );\n const horizontalEdgeStrength = calculateHorizontalEdgeProfile(\n data,\n width,\n height,\n );\n\n let bestCandidate = candidates[0];\n let bestCombinedScore = -Infinity;\n\n for (const candidate of candidates.slice(0, 8)) {\n const edgeScore = scoreGridByEdges(\n candidate.rows,\n candidate.cols,\n width,\n height,\n verticalEdgeStrength,\n horizontalEdgeStrength,\n );\n\n const combinedScore = candidate.score * 0.7 + edgeScore * 0.3;\n\n if (combinedScore > bestCombinedScore) {\n bestCombinedScore = combinedScore;\n bestCandidate = candidate;\n }\n }\n\n const result = createGridForDimensions(\n width,\n height,\n bestCandidate.rows,\n bestCandidate.cols,\n );\n result.confidence = bestCombinedScore;\n return result;\n}\n\nfunction calculateVerticalEdgeProfile(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n): Float32Array {\n const profile = new Float32Array(width);\n\n for (let x = 1; x < width - 1; x++) {\n let totalGradient = 0;\n for (let y = 0; y < height; y++) {\n const idxLeft = (y * width + (x - 1)) * 4;\n const idxRight = (y * width + (x + 1)) * 4;\n\n const gradR = Math.abs(data[idxRight] - data[idxLeft]);\n const gradG = Math.abs(data[idxRight + 1] - data[idxLeft + 1]);\n const gradB = Math.abs(data[idxRight + 2] - data[idxLeft + 2]);\n\n totalGradient += (gradR + gradG + gradB) / 3;\n }\n profile[x] = totalGradient / height;\n }\n\n return profile;\n}\n\nfunction calculateHorizontalEdgeProfile(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n): Float32Array {\n const profile = new Float32Array(height);\n\n for (let y = 1; y < height - 1; y++) {\n let totalGradient = 0;\n for (let x = 0; x < width; x++) {\n const idxUp = ((y - 1) * width + x) * 4;\n const idxDown = ((y + 1) * width + x) * 4;\n\n const gradR = Math.abs(data[idxDown] - data[idxUp]);\n const gradG = Math.abs(data[idxDown + 1] - data[idxUp + 1]);\n const gradB = Math.abs(data[idxDown + 2] - data[idxUp + 2]);\n\n totalGradient += (gradR + gradG + gradB) / 3;\n }\n profile[y] = totalGradient / width;\n }\n\n return profile;\n}\n\nfunction scoreGridByEdges(\n rows: number,\n cols: number,\n width: number,\n height: number,\n verticalProfile: Float32Array,\n horizontalProfile: Float32Array,\n): number {\n let verticalSum = 0;\n for (let i = 0; i < verticalProfile.length; i++) {\n verticalSum += verticalProfile[i];\n }\n const verticalBaseline = verticalSum / verticalProfile.length;\n\n let horizontalSum = 0;\n for (let i = 0; i < horizontalProfile.length; i++) {\n horizontalSum += horizontalProfile[i];\n }\n const horizontalBaseline = horizontalSum / horizontalProfile.length;\n\n let totalRatio = 0;\n let divisions = 0;\n const searchWindow = Math.max(\n 3,\n Math.floor(Math.min(width / cols, height / rows) * 0.03),\n );\n\n if (cols > 1) {\n const cellWidth = width / cols;\n for (let i = 1; i < cols; i++) {\n const expectedPos = Math.round(cellWidth * i);\n let maxStrength = 0;\n\n for (let offset = -searchWindow; offset <= searchWindow; offset++) {\n const pos = expectedPos + offset;\n if (pos > 0 && pos < width - 1) {\n maxStrength = Math.max(maxStrength, verticalProfile[pos]);\n }\n }\n\n const ratio = verticalBaseline > 0 ? maxStrength / verticalBaseline : 1;\n totalRatio += Math.min(ratio, 3);\n divisions++;\n }\n }\n\n if (rows > 1) {\n const cellHeight = height / rows;\n for (let i = 1; i < rows; i++) {\n const expectedPos = Math.round(cellHeight * i);\n let maxStrength = 0;\n\n for (let offset = -searchWindow; offset <= searchWindow; offset++) {\n const pos = expectedPos + offset;\n if (pos > 0 && pos < height - 1) {\n maxStrength = Math.max(maxStrength, horizontalProfile[pos]);\n }\n }\n\n const ratio =\n horizontalBaseline > 0 ? maxStrength / horizontalBaseline : 1;\n totalRatio += Math.min(ratio, 3);\n divisions++;\n }\n }\n\n if (divisions === 0) return 0;\n\n const avgRatio = totalRatio / divisions;\n return Math.min((avgRatio - 1) / 2, 1);\n}\n\n/**\n * Splits an image into grid cells and returns them as separate data URLs.\n */\nexport async function splitImage(\n imageDataUrl: string,\n grid: GridDetectionResult,\n): Promise<string[]> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n img.onload = () => {\n try {\n const results: string[] = [];\n\n for (const cell of grid.cells) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n canvas.width = cell.width;\n canvas.height = cell.height;\n\n ctx.drawImage(\n img,\n cell.x,\n cell.y,\n cell.width,\n cell.height,\n 0,\n 0,\n cell.width,\n cell.height,\n );\n\n results.push(canvas.toDataURL('image/png'));\n }\n\n resolve(results);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error('Failed to load image'));\n };\n\n img.src = imageDataUrl;\n });\n}\n\n/**\n * Convenience function that detects and splits in one call.\n */\nexport async function detectAndSplitGrid(\n imageDataUrl: string,\n): Promise<{ grid: GridDetectionResult; images: string[] }> {\n const grid = await detectGrid(imageDataUrl);\n const images = await splitImage(imageDataUrl, grid);\n return { grid, images };\n}\n\n/**\n * Split with user-specified dimensions (most reliable method).\n */\nexport async function splitWithDimensions(\n imageDataUrl: string,\n rows: number,\n cols: number,\n): Promise<{ grid: GridDetectionResult; images: string[] }> {\n const grid = await detectGridWithDimensions(imageDataUrl, rows, cols);\n const images = await splitImage(imageDataUrl, grid);\n return { grid, images };\n}\n","/**\n * Node Dimensions Utility\n *\n * Calculate node dimensions based on output aspect ratio,\n * respecting min/max constraints.\n */\n\n/**\n * Extract dimensions from a base64 data URL image.\n */\nexport function getImageDimensions(\n base64DataUrl: string,\n): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n if (!base64DataUrl || !base64DataUrl.startsWith('data:image')) {\n resolve(null);\n return;\n }\n\n const img = new Image();\n img.onload = () => {\n resolve({ height: img.naturalHeight, width: img.naturalWidth });\n };\n img.onerror = () => {\n resolve(null);\n };\n img.src = base64DataUrl;\n });\n}\n\n/**\n * Extract dimensions from a video data URL or blob URL.\n */\nexport function getVideoDimensions(\n videoUrl: string,\n): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n if (!videoUrl) {\n resolve(null);\n return;\n }\n\n const video = document.createElement('video');\n video.onloadedmetadata = () => {\n resolve({ height: video.videoHeight, width: video.videoWidth });\n };\n video.onerror = () => {\n resolve(null);\n };\n video.src = videoUrl;\n });\n}\n\n// Node sizing constraints\nconst MIN_WIDTH = 200;\nconst MAX_WIDTH = 500;\nconst MIN_HEIGHT = 200;\nconst MAX_HEIGHT = 600;\n\n// Node chrome: header (~40px), controls/padding (~60px)\nconst NODE_CHROME_HEIGHT = 100;\n\n/**\n * Calculate node dimensions that maintain aspect ratio within constraints.\n *\n * @param aspectRatio - Width divided by height (e.g., 16/9 for landscape)\n * @param baseWidth - Starting width to calculate from (default 300px)\n */\nexport function calculateNodeSize(\n aspectRatio: number,\n baseWidth: number = 300,\n): { width: number; height: number } {\n if (!aspectRatio || aspectRatio <= 0 || !Number.isFinite(aspectRatio)) {\n return { height: 300, width: 300 };\n }\n\n let width = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, baseWidth));\n\n let contentHeight = width / aspectRatio;\n let totalHeight = contentHeight + NODE_CHROME_HEIGHT;\n\n if (totalHeight > MAX_HEIGHT) {\n contentHeight = MAX_HEIGHT - NODE_CHROME_HEIGHT;\n width = contentHeight * aspectRatio;\n totalHeight = MAX_HEIGHT;\n }\n\n if (totalHeight < MIN_HEIGHT) {\n contentHeight = MIN_HEIGHT - NODE_CHROME_HEIGHT;\n width = contentHeight * aspectRatio;\n totalHeight = MIN_HEIGHT;\n }\n\n if (width > MAX_WIDTH) {\n width = MAX_WIDTH;\n contentHeight = width / aspectRatio;\n totalHeight = contentHeight + NODE_CHROME_HEIGHT;\n totalHeight = Math.max(MIN_HEIGHT, Math.min(MAX_HEIGHT, totalHeight));\n }\n\n if (width < MIN_WIDTH) {\n width = MIN_WIDTH;\n contentHeight = width / aspectRatio;\n totalHeight = contentHeight + NODE_CHROME_HEIGHT;\n totalHeight = Math.max(MIN_HEIGHT, Math.min(MAX_HEIGHT, totalHeight));\n }\n\n return {\n height: Math.round(totalHeight),\n width: Math.round(width),\n };\n}\n\n/**\n * Calculate node dimensions preserving current height if provided.\n *\n * @param aspectRatio - Width divided by height\n * @param currentHeight - Optional current height to preserve (if within constraints)\n */\nexport function calculateNodeSizePreservingHeight(\n aspectRatio: number,\n currentHeight?: number,\n): { width: number; height: number } {\n if (!aspectRatio || aspectRatio <= 0 || !Number.isFinite(aspectRatio)) {\n return { height: currentHeight ?? 300, width: 300 };\n }\n\n if (\n currentHeight !== undefined &&\n currentHeight >= MIN_HEIGHT &&\n currentHeight <= MAX_HEIGHT\n ) {\n const contentHeight = currentHeight - NODE_CHROME_HEIGHT;\n let width = contentHeight * aspectRatio;\n width = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, width));\n\n return {\n height: Math.round(currentHeight),\n width: Math.round(width),\n };\n }\n\n return calculateNodeSize(aspectRatio);\n}\n","/**\n * Speed Curve Utility\n *\n * Advanced time-warping for video speed ramps using easing functions.\n * Maps original video timestamps to warped timestamps through easing curves.\n */\n\nimport { type EasingFunction, easing, getEasingFunction } from './easing';\n\nconst INVERSE_TOLERANCE = 1e-6;\nconst INVERSE_MAX_ITERATIONS = 32;\nconst MONOTONICITY_SAMPLES = 256;\nconst MONOTONICITY_TOLERANCE = 1e-6;\n\nconst inverseCache = new WeakMap<EasingFunction, EasingFunction | null>();\nconst monotonicityCache = new WeakMap<EasingFunction, boolean>();\n\nfunction isMonotonicIncreasing(func: EasingFunction): boolean {\n const cached = monotonicityCache.get(func);\n if (cached !== undefined) {\n return cached;\n }\n\n let prev = func(0);\n for (let i = 1; i <= MONOTONICITY_SAMPLES; i++) {\n const value = func(i / MONOTONICITY_SAMPLES);\n if (value + MONOTONICITY_TOLERANCE < prev) {\n monotonicityCache.set(func, false);\n return false;\n }\n prev = value;\n }\n\n monotonicityCache.set(func, true);\n return true;\n}\n\nfunction invertEasingValue(target: number, func: EasingFunction): number {\n if (target <= INVERSE_TOLERANCE) {\n return 0;\n }\n if (target >= 1 - INVERSE_TOLERANCE) {\n return 1;\n }\n\n let low = 0;\n let high = 1;\n let mid = 0.5;\n\n for (let i = 0; i < INVERSE_MAX_ITERATIONS; i++) {\n mid = (low + high) / 2;\n const value = func(mid);\n const diff = value - target;\n\n if (Math.abs(diff) <= INVERSE_TOLERANCE) {\n break;\n }\n\n if (diff < 0) {\n low = mid;\n } else {\n high = mid;\n }\n }\n\n return Math.min(1, Math.max(0, mid));\n}\n\nfunction getInverseEasing(func: EasingFunction): EasingFunction | null {\n if (inverseCache.has(func)) {\n return inverseCache.get(func)!;\n }\n\n if (!isMonotonicIncreasing(func)) {\n inverseCache.set(func, null);\n return null;\n }\n\n const inverse: EasingFunction = (value: number) => {\n const clamped = Math.max(0, Math.min(1, value));\n return invertEasingValue(clamped, func);\n };\n\n inverseCache.set(func, inverse);\n return inverse;\n}\n\nfunction mapTimeWithEasing(\n normalizedTime: number,\n func: EasingFunction,\n): number {\n const inverse = getInverseEasing(func);\n if (!inverse) {\n // Non-monotonic function — fall back to direct mapping\n return func(normalizedTime);\n }\n\n return inverse(normalizedTime);\n}\n\n/**\n * Maps original video timestamps to warped timestamps using any easing function.\n *\n * @param originalTime - Original timestamp in seconds (0 to inputDuration)\n * @param inputDuration - Input video duration in seconds (default: 5)\n * @param outputDuration - Output video duration in seconds (default: 1.5)\n * @param easingFunction - Easing function or function name string (default: easeInOutCubic)\n * @returns Warped timestamp for the output video\n */\nexport function warpTime(\n originalTime: number,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n): number {\n const easingFunc =\n typeof easingFunction === 'string'\n ? getEasingFunction(easingFunction)\n : easingFunction;\n\n const t = originalTime / inputDuration;\n const clamped = Math.max(0, Math.min(1, t));\n const eased = mapTimeWithEasing(clamped, easingFunc);\n\n return eased * outputDuration;\n}\n\n/**\n * Calculate the duration of a frame after warping.\n */\nexport function calculateWarpedDuration(\n originalStart: number,\n originalDuration: number,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n): number {\n const warpedStart = warpTime(\n originalStart,\n inputDuration,\n outputDuration,\n easingFunction,\n );\n const warpedEnd = warpTime(\n originalStart + originalDuration,\n inputDuration,\n outputDuration,\n easingFunction,\n );\n return warpedEnd - warpedStart;\n}\n\n/**\n * Validate that a warp time function produces valid output.\n */\nexport function validateWarpFunction(\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n tolerance: number = 0.001,\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n const startWarp = warpTime(0, inputDuration, outputDuration, easingFunction);\n if (Math.abs(startWarp - 0) > tolerance) {\n errors.push(`Start point should be 0, got ${startWarp}`);\n }\n\n const endWarp = warpTime(\n inputDuration,\n inputDuration,\n outputDuration,\n easingFunction,\n );\n if (Math.abs(endWarp - outputDuration) > tolerance) {\n errors.push(`End point should be ${outputDuration}, got ${endWarp}`);\n }\n\n let prevWarp = 0;\n for (let t = 0; t <= inputDuration; t += inputDuration / 100) {\n const warp = warpTime(t, inputDuration, outputDuration, easingFunction);\n if (warp < prevWarp) {\n errors.push(\n `Monotonicity violation at t=${t.toFixed(2)}: ${warp} < ${prevWarp}`,\n );\n break;\n }\n prevWarp = warp;\n }\n\n return { errors, valid: errors.length === 0 };\n}\n\n/**\n * Generate statistics about the warp curve.\n */\nexport function analyzeWarpCurve(\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n samples: number = 100,\n): {\n speedMultipliers: number[];\n minSpeed: number;\n maxSpeed: number;\n avgSpeed: number;\n} {\n const speedMultipliers: number[] = [];\n const averageSpeed = inputDuration / outputDuration;\n\n for (let i = 0; i < samples; i++) {\n const t1 = (i / samples) * inputDuration;\n const t2 = ((i + 1) / samples) * inputDuration;\n\n const warp1 = warpTime(t1, inputDuration, outputDuration, easingFunction);\n const warp2 = warpTime(t2, inputDuration, outputDuration, easingFunction);\n\n const inputSegmentDuration = t2 - t1;\n const outputSegmentDuration = warp2 - warp1;\n const absoluteSpeed =\n inputSegmentDuration / (outputSegmentDuration + 1e-10);\n const speedMultiplier = absoluteSpeed / averageSpeed;\n\n speedMultipliers.push(speedMultiplier);\n }\n\n const minSpeed = Math.min(...speedMultipliers);\n const maxSpeed = Math.max(...speedMultipliers);\n const avgSpeed =\n speedMultipliers.reduce((a, b) => a + b, 0) / speedMultipliers.length;\n\n return { avgSpeed, maxSpeed, minSpeed, speedMultipliers };\n}\n"]}
package/dist/nodes.mjs CHANGED
@@ -1,13 +1,15 @@
1
- export { AnimationNode, AnnotationNode, AudioInputNode, BaseNode, DownloadNode, ImageCompareNode, ImageGenNode, ImageGridSplitNode, ImageInputNode, LLMNode, LipSyncNode, MotionControlNode, NodeDetailModal, OutputGalleryNode, OutputNode, PromptConstructorNode, PromptNode, ReframeNode, ResizeNode, SubtitleNode, TextToSpeechNode, TranscribeNode, UpscaleNode, VideoFrameExtractNode, VideoGenNode, VideoInputNode, VideoStitchNode, VideoTrimNode, VoiceChangeNode, WorkflowInputNode, WorkflowOutputNode, WorkflowRefNode, nodeTypes, setWorkflowRefApi } from './chunk-2FUPL67V.mjs';
2
- import './chunk-C6MQBJFC.mjs';
3
- import './chunk-FWJIAW2E.mjs';
4
- import './chunk-B4EAAKYF.mjs';
5
- import './chunk-U4QPE4CY.mjs';
6
- import './chunk-VVQ4CH77.mjs';
7
- import './chunk-MLJJBBTB.mjs';
8
- import './chunk-YUIK4AHM.mjs';
9
- import './chunk-QQVHGJ2G.mjs';
10
- import './chunk-LDN7IX4Y.mjs';
11
- import './chunk-OJWVEEMM.mjs';
12
- import './chunk-GPYIIWD5.mjs';
13
- import './chunk-XRC3O5GK.mjs';
1
+ export { AnimationNode, AnnotationNode, AudioInputNode, BaseNode, DownloadNode, ImageCompareNode, ImageGenNode, ImageGridSplitNode, ImageInputNode, LLMNode, LipSyncNode, MotionControlNode, NodeDetailModal, OutputGalleryNode, OutputNode, PromptConstructorNode, PromptNode, ReframeNode, ResizeNode, SubtitleNode, TextToSpeechNode, TranscribeNode, UpscaleNode, VideoFrameExtractNode, VideoGenNode, VideoInputNode, VideoStitchNode, VideoTrimNode, VoiceChangeNode, WorkflowInputNode, WorkflowOutputNode, WorkflowRefNode, nodeTypes, setWorkflowRefApi } from './chunk-72UIUFXH.mjs';
2
+ import './chunk-G3HCTMAZ.mjs';
3
+ import './chunk-SHU7JPQY.mjs';
4
+ import './chunk-SBB2YW3Y.mjs';
5
+ import './chunk-2C2AAXJP.mjs';
6
+ import './chunk-X3XNTD4R.mjs';
7
+ import './chunk-SRPSHHHV.mjs';
8
+ import './chunk-JSF4FHBH.mjs';
9
+ import './chunk-AZJFDWBF.mjs';
10
+ import './chunk-YYFM6P4C.mjs';
11
+ import './chunk-R5L7WB7F.mjs';
12
+ import './chunk-7DJHFOIW.mjs';
13
+ import './chunk-4JOFNZW6.mjs';
14
+ //# sourceMappingURL=nodes.mjs.map
15
+ //# sourceMappingURL=nodes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"nodes.mjs"}