@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/nodes/NodeErrorBoundary.tsx","../src/nodes/PreviewTooltip.tsx","../src/nodes/BaseNode.tsx","../src/nodes/ProcessingOverlay.tsx","../src/nodes/NegativePromptSelector.tsx","../src/nodes/SchemaInputs.tsx","../src/nodes/ai/ImageGenNode.tsx","../src/nodes/ai/LipSyncNode.tsx","../src/nodes/ai/LLMNode.tsx","../src/nodes/ai/MotionControlNode.tsx","../src/nodes/ai/TextToSpeechNode.tsx","../src/nodes/ai/TranscribeNode.tsx","../src/nodes/ai/VideoGenNode.tsx","../src/nodes/ai/VoiceChangeNode.tsx","../src/nodes/composition/WorkflowInputNode.tsx","../src/nodes/composition/WorkflowOutputNode.tsx","../src/nodes/composition/WorkflowRefNode.tsx","../src/nodes/input/AudioInputNode.tsx","../src/nodes/input/ImageInputNode.tsx","../src/nodes/input/PromptConstructorNode.tsx","../src/nodes/input/PromptNode.tsx","../src/nodes/input/VideoInputNode.tsx","../src/nodes/NodeDetailModal.tsx","../src/nodes/output/OutputNode.tsx","../src/nodes/processing/AnimationNode.tsx","../src/nodes/processing/AnnotationNode.tsx","../../node_modules/.bun/react-compare-slider@3.1.0+bf16f8eded5e12ee/node_modules/react-compare-slider/src/Container.tsx","../../node_modules/.bun/react-compare-slider@3.1.0+bf16f8eded5e12ee/node_modules/react-compare-slider/src/ReactCompareSliderHandle.tsx","../../node_modules/.bun/react-compare-slider@3.1.0+bf16f8eded5e12ee/node_modules/react-compare-slider/src/utils.ts","../../node_modules/.bun/react-compare-slider@3.1.0+bf16f8eded5e12ee/node_modules/react-compare-slider/src/ReactCompareSlider.tsx","../../node_modules/.bun/react-compare-slider@3.1.0+bf16f8eded5e12ee/node_modules/react-compare-slider/src/ReactCompareSliderImage.tsx","../src/nodes/processing/ImageCompareNode.tsx","../src/nodes/processing/ImageGridSplitNode.tsx","../src/nodes/processing/OutputGalleryNode.tsx","../src/nodes/processing/ReframeNode.tsx","../src/nodes/processing/ResizeNode.tsx","../src/nodes/processing/SubtitleNode.tsx","../src/nodes/processing/UpscaleNode.tsx","../src/nodes/processing/VideoFrameExtractNode.tsx","../src/nodes/processing/VideoStitchNode.tsx","../src/nodes/processing/VideoTrimNode.tsx","../src/nodes/index.ts"],"names":["jsx","jsxs","Image","RefreshCw","useRef","useState","useMemo","useEffect","Loader2","Square","memo","useCallback","Fragment","AlertCircle","Download","Video","Mic","Expand","AlertTriangle","Volume2","AudioLines","NodeStatusEnum","FileText","HANDLE_COLORS","clsx","Handle","Position","GitBranch","CheckCircle2","Upload","Link","X","ImageIcon","NODE_DEFINITIONS","ChevronRight","type","Wand2","Pencil","ContainerClip","forwardRef","transition","props","ref","style","ContainerHandle","children","disabled","portrait","position","ThisArrow","flip","ReactCompareSliderHandle","className","buttonStyle","linesStyle","_style","_linesStyle","_buttonStyle","KeyboardEventKeys","styleFitContainer","boxSizing","objectFit","objectPosition","usePrevious","value","useEventListener","eventName","handler","element","handlerOptions","savedHandler","eventListener","event","useIsomorphicLayoutEffect","useLayoutEffect","useResizeObserver","observer","observe","entry","EVENT_PASSIVE_PARAMS","EVENT_CAPTURE_PARAMS","handleContainerClick","ev","ReactCompareSlider","boundsPadding","browsingContext","changePositionOnHover","handle","itemOne","itemTwo","keyboardIncrement","onlyHandleDraggable","onPositionChange","rootContainerRef","clipContainerRef","handleContainerRef","internalPosition","isDragging","setIsDragging","canTransition","setCanTransition","hasBrowsingContextBinding","interactiveTarget","setInteractiveTarget","previousPosition","updateInternalPosition","x","y","isOffset","rootElement","handleElement","clipElement","width","height","left","top","pixelPosition","nextPosition","zoomScale","boundsPaddingPercentage","nextPositionWithBoundsPadding","handlePointerDown","handlePointerMove","handlePointerUp","handleResize","scaledWidth","scaledHeight","handleKeydown","incrementPercentage","isIncrement","containerRef","handlePointerLeave","useImperativeHandle","appliedTransition","rootStyle","ReactCompareSliderImage","Grid3X3","createPortal","Copy","ChevronLeft","ASPECT_RATIOS","MODELS","Subtitles","IMAGE_MODELS","VIDEO_MODELS","Film","Layers","formatTime","Scissors"],"mappings":"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","file":"chunk-72UIUFXH.mjs","sourcesContent":["'use client';\n\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { Component, type ReactNode } from 'react';\nimport { Button } from '../ui/button';\n\ninterface NodeErrorBoundaryProps {\n children: ReactNode;\n nodeId: string;\n nodeType: string;\n}\n\ninterface NodeErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error boundary specifically for workflow nodes.\n * Catches rendering errors and displays a fallback UI instead of crashing the entire canvas.\n */\nexport class NodeErrorBoundary extends Component<\n NodeErrorBoundaryProps,\n NodeErrorBoundaryState\n> {\n constructor(props: NodeErrorBoundaryProps) {\n super(props);\n this.state = { error: null, hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): NodeErrorBoundaryState {\n return { error, hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n // Log error for debugging - in production this would go to error tracking\n console.error(\n `Node ${this.props.nodeId} (${this.props.nodeType}) crashed:`,\n error,\n errorInfo,\n );\n }\n\n handleRetry = (): void => {\n this.setState({ error: null, hasError: false });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 p-4 text-center min-h-[100px]\">\n <AlertTriangle className=\"h-8 w-8 text-destructive\" />\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-destructive\">Node Error</p>\n <p className=\"text-xs text-muted-foreground max-w-[200px] truncate\">\n {this.state.error?.message ?? 'An unexpected error occurred'}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={this.handleRetry}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry\n </Button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","'use client';\n\nimport type { NodeType, WorkflowNodeData } from '@genfeedai/types';\nimport Image from 'next/image';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { getMediaFromNode } from '../lib/mediaExtraction';\n\ninterface PreviewTooltipProps {\n nodeType: NodeType;\n nodeData: WorkflowNodeData;\n anchorRect: DOMRect | null;\n isVisible: boolean;\n}\n\n// Calculate tooltip position based on anchor and viewport\nfunction calculatePosition(anchorRect: DOMRect): {\n top: number;\n left: number;\n placement: 'top' | 'bottom';\n} {\n const tooltipWidth = 280;\n const tooltipHeight = 200;\n const offset = 12;\n const padding = 16;\n\n const viewportWidth = window.innerWidth;\n\n // Determine vertical placement (prefer top)\n const spaceAbove = anchorRect.top - padding;\n const placement = spaceAbove >= tooltipHeight + offset ? 'top' : 'bottom';\n\n // Calculate vertical position\n const top =\n placement === 'top'\n ? anchorRect.top - tooltipHeight - offset\n : anchorRect.bottom + offset;\n\n // Calculate horizontal position (center align, constrained to viewport)\n let left = anchorRect.left + anchorRect.width / 2 - tooltipWidth / 2;\n left = Math.max(\n padding,\n Math.min(left, viewportWidth - tooltipWidth - padding),\n );\n\n return { left, placement, top };\n}\n\nexport function PreviewTooltip({\n nodeType,\n nodeData,\n anchorRect,\n isVisible,\n}: PreviewTooltipProps) {\n const [mounted, setMounted] = useState(false);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n // Get media info\n const mediaInfo = useMemo(() => {\n return getMediaFromNode(nodeType, nodeData);\n }, [nodeType, nodeData]);\n\n // Calculate position\n const position = useMemo(() => {\n if (!anchorRect) return null;\n return calculatePosition(anchorRect);\n }, [anchorRect]);\n\n // Handle mounting for portal\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n // Don't render if no media or not visible\n if (!mounted || !isVisible || !mediaInfo.url || !position) {\n return null;\n }\n\n const content = (\n <div\n ref={tooltipRef}\n className=\"fixed z-[100] pointer-events-none\"\n style={{\n left: position.left,\n opacity: isVisible ? 1 : 0,\n top: position.top,\n transform: `scale(${isVisible ? 1 : 0.95})`,\n transition: 'opacity 150ms ease-out, transform 150ms ease-out',\n }}\n >\n <div className=\"w-[280px] bg-card border border-border rounded-lg shadow-xl overflow-hidden\">\n {/* Preview content */}\n <div className=\"relative aspect-video bg-background\">\n {mediaInfo.type === 'image' && (\n <Image\n src={mediaInfo.url}\n alt=\"Preview\"\n fill\n className=\"object-contain\"\n unoptimized\n />\n )}\n {mediaInfo.type === 'video' && (\n <video\n src={mediaInfo.url}\n autoPlay\n muted\n loop\n playsInline\n className=\"w-full h-full object-contain\"\n />\n )}\n </div>\n\n {/* Label */}\n <div className=\"px-3 py-2 border-t border-border\">\n <p className=\"text-xs text-muted-foreground truncate\">\n {nodeData.label}\n </p>\n </div>\n\n {/* Arrow indicator */}\n <div\n className={`absolute left-1/2 -translate-x-1/2 w-0 h-0 border-l-8 border-r-8 border-transparent ${\n position.placement === 'top'\n ? 'bottom-[-8px] border-t-8 border-t-border'\n : 'top-[-8px] border-b-8 border-b-border'\n }`}\n />\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n}\n","'use client';\n\nimport type {\n HandleDefinition,\n NodeStatus,\n NodeType,\n SelectedModel,\n WorkflowNodeData,\n} from '@genfeedai/types';\nimport { NODE_DEFINITIONS, NodeStatusEnum } from '@genfeedai/types';\nimport {\n Handle,\n type NodeProps,\n NodeResizer,\n Position,\n useUpdateNodeInternals,\n} from '@xyflow/react';\nimport { clsx } from 'clsx';\nimport {\n AlertCircle,\n ArrowLeftFromLine,\n ArrowRightToLine,\n AtSign,\n AudioLines,\n Brain,\n CheckCircle,\n CheckCircle2,\n Columns2,\n Copy,\n Crop,\n Download,\n Eye,\n FileText,\n FileVideo,\n Film,\n GitBranch,\n Grid3X3,\n Image,\n Layers,\n LayoutGrid,\n Loader2,\n Lock,\n Maximize,\n Maximize2,\n MessageSquare,\n Mic,\n Navigation,\n Pencil,\n Puzzle,\n RefreshCw,\n RotateCcw,\n Scissors,\n Share2,\n Sparkles,\n Square,\n Subtitles,\n Unlock,\n Video,\n Volume2,\n Wand2,\n} from 'lucide-react';\nimport {\n Children,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { generateHandlesFromSchema } from '../lib/schemaHandles';\nimport { useExecutionStore } from '../stores/executionStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport { Button } from '../ui/button';\nimport { NodeErrorBoundary } from './NodeErrorBoundary';\nimport { PreviewTooltip } from './PreviewTooltip';\n\n// Icon mapping\nconst ICON_MAP: Record<string, typeof Image> = {\n ArrowLeftFromLine,\n // Composition icons\n ArrowRightToLine,\n AtSign,\n AudioLines,\n Brain,\n CheckCircle,\n Columns2,\n Crop,\n Download,\n Eye,\n FileText,\n FileVideo,\n Film,\n GitBranch,\n Grid3X3,\n Image,\n Layers,\n LayoutGrid,\n Maximize,\n Maximize2,\n MessageSquare,\n Mic,\n Navigation,\n Pencil,\n Puzzle,\n RefreshCw,\n Scissors,\n Share2,\n Sparkles,\n Subtitles,\n Video,\n Volume2,\n Wand2,\n};\n\n// Handle color CSS variables (used inline for guaranteed override)\nconst HANDLE_COLORS: Record<string, string> = {\n audio: 'var(--handle-audio)',\n image: 'var(--handle-image)',\n number: 'var(--handle-number)',\n text: 'var(--handle-text)',\n video: 'var(--handle-video)',\n};\n\n// Status indicator component\nfunction StatusIndicator({ status }: { status: NodeStatus }) {\n switch (status) {\n case 'processing':\n return <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />;\n case 'complete':\n return <CheckCircle2 className=\"h-4 w-4 text-chart-2\" />;\n case 'error':\n return <AlertCircle className=\"h-4 w-4 text-destructive\" />;\n default:\n return null;\n }\n}\n\ninterface BaseNodeProps extends NodeProps {\n children?: ReactNode;\n headerActions?: ReactNode;\n title?: string;\n titleElement?: ReactNode;\n /** When true, hides the status indicator / stop button in the header (AI gen nodes manage their own) */\n hideStatusIndicator?: boolean;\n /** Input handle IDs that should appear disabled (reduced opacity) when model doesn't support them */\n disabledInputs?: string[];\n}\n\n// Hover delay for showing preview tooltip (ms)\nconst HOVER_DELAY = 300;\n\n// Node dimension constraints\nconst NODE_MIN_WIDTH = 220;\nconst NODE_RESIZER_MAX_WIDTH = 500;\nconst DOWNLOAD_NODE_MIN_WIDTH = 200;\nconst DOWNLOAD_NODE_MIN_HEIGHT = 280;\nconst NODE_MIN_HEIGHT = 100;\n\nfunction BaseNodeComponent({\n id,\n type,\n data,\n selected,\n children,\n headerActions,\n title,\n titleElement,\n hideStatusIndicator,\n width,\n height,\n disabledInputs,\n}: BaseNodeProps) {\n // Check if node has been manually resized (has explicit dimensions)\n const isResized = width !== undefined || height !== undefined;\n const selectNode = useUIStore((state) => state.selectNode);\n const selectedNodeId = useUIStore((state) => state.selectedNodeId);\n const highlightedNodeIds = useUIStore((state) => state.highlightedNodeIds);\n const toggleNodeLock = useWorkflowStore((state) => state.toggleNodeLock);\n const isNodeLocked = useWorkflowStore((state) => state.isNodeLocked);\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const isRunning = useExecutionStore((state) => state.isRunning);\n const stopExecution = useExecutionStore((state) => state.stopExecution);\n const stopNodeExecution = useExecutionStore(\n (state) => state.stopNodeExecution,\n );\n const updateNodeInternals = useUpdateNodeInternals();\n const nodeDef = NODE_DEFINITIONS[type as NodeType];\n const nodeData = data as WorkflowNodeData;\n\n // Hover preview tooltip state\n const nodeRef = useRef<HTMLDivElement>(null);\n const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const [showTooltip, setShowTooltip] = useState(false);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n\n // Generate dynamic handles from model schema (for AI nodes like imageGen, videoGen)\n // Falls back to static handles from NODE_DEFINITIONS if no schema present\n const selectedModel = (nodeData as { selectedModel?: SelectedModel })\n .selectedModel;\n const sortedInputs = useMemo(() => {\n const staticInputs = nodeDef?.inputs ?? [];\n if (!selectedModel?.inputSchema) return staticInputs;\n return generateHandlesFromSchema(selectedModel.inputSchema, staticInputs);\n }, [nodeDef?.inputs, selectedModel?.inputSchema]);\n\n const _disabledInputsKey = disabledInputs?.join(',') ?? '';\n const handlesKey = useMemo(() => {\n const inputKey = sortedInputs\n .map((input) => `${input.id}:${input.type}`)\n .join('|');\n const outputKey =\n nodeDef?.outputs\n ?.map((output) => `${output.id}:${output.type}`)\n .join('|') ?? '';\n return `${inputKey}__${outputKey}__${_disabledInputsKey}`;\n }, [sortedInputs, nodeDef?.outputs, _disabledInputsKey]);\n\n const normalizedHeaderActions = useMemo(\n () => (headerActions ? Children.toArray(headerActions) : null),\n [headerActions],\n );\n\n const normalizedChildren = useMemo(\n () => Children.toArray(children),\n [children],\n );\n\n // Force React Flow to recalculate handle positions when handle configuration changes\n // Only re-run when actual handle-affecting properties change, not on every render\n useEffect(() => {\n void handlesKey;\n const rafId = requestAnimationFrame(() => {\n updateNodeInternals(id);\n });\n return () => cancelAnimationFrame(rafId);\n }, [id, updateNodeInternals, handlesKey]);\n\n // Determine if this node should be highlighted (no selection = all highlighted)\n const isHighlighted =\n highlightedNodeIds.length === 0 || highlightedNodeIds.includes(id);\n\n const nodeExecuting = useExecutionStore((state) =>\n state.activeNodeExecutions.has(id),\n );\n\n const handleRetry = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!nodeExecuting) {\n // Clear error and set to processing before retrying\n updateNodeData(id, {\n error: undefined,\n status: NodeStatusEnum.PROCESSING,\n });\n executeNode(id);\n }\n },\n [id, nodeExecuting, executeNode, updateNodeData],\n );\n\n const handleStopNode = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRunning) {\n // Global workflow execution — stop everything\n stopExecution();\n } else if (nodeExecuting) {\n // Independent node execution — stop only this node\n stopNodeExecution(id);\n } else {\n // No execution running — just reset UI status\n updateNodeData(id, { error: undefined, status: NodeStatusEnum.IDLE });\n }\n },\n [\n id,\n isRunning,\n nodeExecuting,\n stopExecution,\n stopNodeExecution,\n updateNodeData,\n ],\n );\n\n const handleCopyError = useCallback(\n async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (nodeData.error) {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(nodeData.error);\n } else {\n const textArea = document.createElement('textarea');\n textArea.value = nodeData.error;\n textArea.style.position = 'fixed';\n textArea.style.opacity = '0';\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n }\n }\n },\n [nodeData.error],\n );\n\n // Hover handlers for preview tooltip\n const handleMouseEnter = useCallback(() => {\n // Start delay timer\n hoverTimeoutRef.current = setTimeout(() => {\n if (nodeRef.current) {\n setAnchorRect(nodeRef.current.getBoundingClientRect());\n }\n setShowTooltip(true);\n }, HOVER_DELAY);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n // Clear timeout if not yet shown\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setShowTooltip(false);\n }, []);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n };\n }, []);\n\n if (!nodeDef) return null;\n\n const Icon = ICON_MAP[nodeDef.icon] ?? Sparkles;\n const isSelected = selected || selectedNodeId === id;\n const isLocked = isNodeLocked(id);\n\n const handleLockToggle = (e: React.MouseEvent) => {\n e.stopPropagation();\n toggleNodeLock(id);\n };\n\n // Category CSS variables (for processing glow, resizer handles)\n const categoryCssVars: Record<string, string> = {\n ai: 'var(--category-ai)',\n composition: 'var(--category-composition)',\n input: 'var(--category-input)',\n output: 'var(--category-output)',\n processing: 'var(--category-processing)',\n };\n\n const categoryColor =\n categoryCssVars[nodeDef.category] ?? categoryCssVars.input;\n // Use custom node color if set, otherwise fall back to category color\n const customColor = nodeData.color;\n const effectiveColor = customColor || categoryColor;\n\n const isProcessing = nodeData.status === 'processing';\n\n return (\n <>\n {/* Resizer - only shown when selected and not locked */}\n <NodeResizer\n isVisible={isSelected && !isLocked}\n minWidth={\n type === 'download' ? DOWNLOAD_NODE_MIN_WIDTH : NODE_MIN_WIDTH\n }\n minHeight={\n type === 'download' ? DOWNLOAD_NODE_MIN_HEIGHT : NODE_MIN_HEIGHT\n }\n maxWidth={NODE_RESIZER_MAX_WIDTH}\n lineClassName=\"!border-transparent\"\n handleClassName=\"!w-2.5 !h-2.5 !border-0 !rounded-sm\"\n handleStyle={{ backgroundColor: effectiveColor }}\n />\n <div\n ref={nodeRef}\n className={clsx(\n 'relative flex flex-col rounded-lg bg-[var(--card)] shadow-lg transition-all duration-200',\n // Only apply min/max width if node hasn't been manually resized\n // Output nodes get larger minimums for better preview visibility\n !isResized && type === 'download' && 'min-w-[200px] min-h-[280px]',\n !isResized && type !== 'download' && 'min-w-[220px] max-w-[320px]',\n isSelected && 'ring-1',\n isLocked && 'opacity-60',\n isProcessing && 'node-processing',\n !isHighlighted && !isSelected && 'opacity-40',\n // Use custom border color when set, otherwise default border\n customColor ? 'border-2' : 'border border-[var(--border)]',\n )}\n style={\n {\n // Category color used for processing glow animation\n '--node-color': effectiveColor,\n // Selection ring matches effective color\n ...(isSelected && { '--tw-ring-color': effectiveColor }),\n // Custom border color when set\n ...(customColor && { borderColor: customColor }),\n // When resized, use explicit dimensions\n ...(isResized && {\n height: height ? `${height}px` : undefined,\n width: width ? `${width}px` : undefined,\n }),\n } as React.CSSProperties\n }\n onClick={() => selectNode(id)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* Input Handles - positioned relative to outer wrapper (not flex) */}\n {sortedInputs.map((input: HandleDefinition, index: number) => {\n const isDisabled = disabledInputs?.includes(input.id);\n return (\n <Handle\n key={input.id}\n type=\"target\"\n position={Position.Left}\n id={input.id}\n isConnectableEnd={!isDisabled}\n className={clsx('!w-3 !h-3', isDisabled && 'opacity-30')}\n style={{\n background: HANDLE_COLORS[input.type],\n top: `${((index + 1) / (sortedInputs.length + 1)) * 100}%`,\n }}\n />\n );\n })}\n\n {/* Output Handles - positioned relative to outer wrapper (not flex) */}\n {nodeDef.outputs.map((output: HandleDefinition, index: number) => (\n <Handle\n key={output.id}\n type=\"source\"\n position={Position.Right}\n id={output.id}\n className=\"!w-3 !h-3 handle-output\"\n style={{\n top: `${((index + 1) / (nodeDef.outputs.length + 1)) * 100}%`,\n }}\n />\n ))}\n\n {/* Content wrapper - flex column, scrolls when resized */}\n <div\n className={clsx(\n 'flex flex-col',\n isResized && 'flex-1 min-h-0 overflow-auto',\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-2.5 border-b border-border\">\n <Icon className=\"h-4 w-4 text-foreground\" />\n {titleElement ?? (\n <span className=\"flex-1 truncate text-sm font-medium text-left text-foreground\">\n {title ?? nodeData.label}\n </span>\n )}\n {!hideStatusIndicator &&\n (isProcessing ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleStopNode}\n className=\"text-destructive hover:bg-destructive/20 hover:text-destructive\"\n title={\n isRunning\n ? 'Stop execution'\n : nodeExecuting\n ? 'Stop node'\n : 'Reset node'\n }\n >\n <Square className=\"h-3.5 w-3.5 fill-current\" />\n </Button>\n ) : (\n <StatusIndicator status={nodeData.status} />\n ))}\n {/* Lock Toggle Button - before headerActions so icon buttons are on the left */}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleLockToggle}\n className={isLocked ? 'text-chart-3' : 'text-muted-foreground'}\n title={isLocked ? 'Unlock node (L)' : 'Lock node (L)'}\n >\n {isLocked ? (\n <Lock className=\"h-4 w-4\" />\n ) : (\n <Unlock className=\"h-4 w-4\" />\n )}\n </Button>\n {normalizedHeaderActions}\n </div>\n\n {/* Content - wrapped with error boundary to prevent crashes from taking down canvas */}\n <div className=\"flex-1 flex flex-col p-3 min-h-0\">\n <NodeErrorBoundary nodeId={id} nodeType={type as string}>\n {/* Error message - rendered BEFORE children so it appears at top */}\n {nodeData.error && (\n <div className=\"mb-3 rounded-md border border-destructive/30 bg-destructive/10 p-2\">\n <div className=\"flex items-start gap-1.5\">\n <p className=\"flex-1 text-xs text-destructive break-all\">\n {nodeData.error}\n </p>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleCopyError}\n className=\"flex-shrink-0 h-5 w-5 text-destructive/70 hover:bg-destructive/20 hover:text-destructive\"\n title=\"Copy error\"\n >\n <Copy className=\"h-3 w-3\" />\n </Button>\n </div>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={handleRetry}\n disabled={nodeExecuting}\n className=\"mt-2 w-full\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Retry\n </Button>\n </div>\n )}\n\n {normalizedChildren}\n\n {/* Progress bar */}\n {nodeData.status === 'processing' &&\n nodeData.progress !== undefined && (\n <div className=\"mt-3\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-secondary\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${nodeData.progress}%` }}\n />\n </div>\n <span className=\"mt-1 text-xs text-muted-foreground\">\n {nodeData.progress}%\n </span>\n </div>\n )}\n </NodeErrorBoundary>\n </div>\n </div>\n\n {/* Lock Badge */}\n {isLocked && (\n <div className=\"absolute -right-2 -top-2 rounded bg-chart-3 px-1.5 py-0.5 text-[10px] font-bold text-background\">\n LOCKED\n </div>\n )}\n </div>\n\n {/* Preview Tooltip - shows on hover after delay */}\n <PreviewTooltip\n nodeType={type as NodeType}\n nodeData={nodeData}\n anchorRect={anchorRect}\n isVisible={showTooltip && !isSelected}\n />\n </>\n );\n}\n\n/**\n * Custom comparator for BaseNode to prevent unnecessary re-renders.\n * Only re-renders when meaningful properties change.\n */\nfunction arePropsEqual(prev: BaseNodeProps, next: BaseNodeProps): boolean {\n // Always re-render if selection changes\n if (prev.selected !== next.selected) return false;\n\n // Always re-render if id or type changes (shouldn't happen often)\n if (prev.id !== next.id) return false;\n if (prev.type !== next.type) return false;\n\n // Check dimension changes\n if (prev.width !== next.width || prev.height !== next.height) return false;\n\n // Check headerActions reference (parent should memoize this)\n if (prev.headerActions !== next.headerActions) return false;\n\n // Check title/titleElement\n if (prev.title !== next.title) return false;\n if (prev.titleElement !== next.titleElement) return false;\n\n // Check hideStatusIndicator\n if (prev.hideStatusIndicator !== next.hideStatusIndicator) return false;\n\n // Check disabledInputs array (shallow compare)\n const prevDisabled = prev.disabledInputs ?? [];\n const nextDisabled = next.disabledInputs ?? [];\n if (prevDisabled.length !== nextDisabled.length) return false;\n for (let i = 0; i < prevDisabled.length; i++) {\n if (prevDisabled[i] !== nextDisabled[i]) return false;\n }\n\n // Shallow compare data object - check key properties that affect rendering\n const prevData = prev.data as Record<string, unknown>;\n const nextData = next.data as Record<string, unknown>;\n\n // Status affects StatusIndicator and processing glow\n if (prevData.status !== nextData.status) return false;\n\n // Progress affects progress bar\n if (prevData.progress !== nextData.progress) return false;\n\n // Error affects error display\n if (prevData.error !== nextData.error) return false;\n\n // Label affects title display\n if (prevData.label !== nextData.label) return false;\n\n // Color affects border styling\n if (prevData.color !== nextData.color) return false;\n\n // Children reference\n if (prev.children !== next.children) return false;\n\n return true;\n}\n\nexport const BaseNode = memo(BaseNodeComponent, arePropsEqual);\n","'use client';\n\nimport { Loader2, Square } from 'lucide-react';\nimport { memo } from 'react';\nimport { Button } from '../ui/button';\n\ninterface ProcessingOverlayProps {\n /** Text to show below spinner, defaults to 'Generating...' */\n label?: string;\n /** If provided, shows a Stop button */\n onStop?: () => void;\n}\n\nfunction ProcessingOverlayComponent({\n label = 'Generating...',\n onStop,\n}: ProcessingOverlayProps) {\n return (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/60 backdrop-blur-sm rounded-md\">\n <div className=\"flex flex-col items-center gap-2\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n <span className=\"text-xs text-white/80\">{label}</span>\n {onStop && (\n <Button variant=\"destructive\" size=\"sm\" onClick={onStop}>\n <Square className=\"h-3 w-3 fill-current\" />\n Stop\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport const ProcessingOverlay = memo(ProcessingOverlayComponent);\n","'use client';\n\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport { Checkbox } from '../ui/checkbox';\n\n/**\n * Common negative prompt terms organized for quick selection\n * These are the most commonly used negative prompts for image/video generation\n */\nconst NEGATIVE_PROMPT_OPTIONS = [\n { label: 'Blurry', value: 'blurry' },\n { label: 'Distorted', value: 'distorted' },\n { label: 'Low Quality', value: 'low quality' },\n { label: 'Watermark', value: 'watermark' },\n { label: 'Text/Logos', value: 'text' },\n { label: 'Artifacts', value: 'artifacts' },\n { label: 'Grainy/Noisy', value: 'grainy' },\n { label: 'Oversaturated', value: 'oversaturated' },\n] as const;\n\ninterface NegativePromptSelectorProps {\n value: string;\n onChange: (value: string) => void;\n}\n\n/**\n * Parse a comma-separated negative prompt string into individual terms\n */\nfunction parseNegativePrompt(value: string): Set<string> {\n if (!value) return new Set();\n return new Set(\n value\n .split(',')\n .map((term) => term.trim().toLowerCase())\n .filter(Boolean),\n );\n}\n\n/**\n * Check if a term matches any of the known options\n */\nfunction isKnownTerm(term: string): boolean {\n const lowerTerm = term.toLowerCase();\n return NEGATIVE_PROMPT_OPTIONS.some(\n (opt) => opt.value.toLowerCase() === lowerTerm,\n );\n}\n\n/**\n * Extract custom terms (terms not in the predefined options)\n */\nfunction extractCustomTerms(value: string): string {\n if (!value) return '';\n const terms = value\n .split(',')\n .map((term) => term.trim())\n .filter(Boolean);\n const customTerms = terms.filter((term) => !isKnownTerm(term));\n return customTerms.join(', ');\n}\n\n/**\n * Combine checked options and custom terms into a single string\n */\nfunction combineTerms(checkedValues: Set<string>, customText: string): string {\n const parts: string[] = [];\n\n // Add checked predefined options in their original order\n for (const opt of NEGATIVE_PROMPT_OPTIONS) {\n if (checkedValues.has(opt.value.toLowerCase())) {\n parts.push(opt.value);\n }\n }\n\n // Add custom terms\n if (customText.trim()) {\n const customTerms = customText\n .split(',')\n .map((term) => term.trim())\n .filter(Boolean);\n parts.push(...customTerms);\n }\n\n return parts.join(', ');\n}\n\nfunction NegativePromptSelectorComponent({\n value,\n onChange,\n}: NegativePromptSelectorProps) {\n // Collapsed by default\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Parse the current value to determine which checkboxes should be checked\n const checkedTerms = useMemo(() => parseNegativePrompt(value), [value]);\n\n // Extract and track custom terms separately\n const [customText, setCustomText] = useState(() => extractCustomTerms(value));\n\n // Count selected items for collapsed summary\n const selectedCount = checkedTerms.size + (customText.trim() ? 1 : 0);\n\n // Handle checkbox toggle\n const handleCheckboxChange = useCallback(\n (optionValue: string, checked: boolean) => {\n const newChecked = new Set(checkedTerms);\n const lowerValue = optionValue.toLowerCase();\n\n if (checked) {\n newChecked.add(lowerValue);\n } else {\n newChecked.delete(lowerValue);\n }\n\n onChange(combineTerms(newChecked, customText));\n },\n [checkedTerms, customText, onChange],\n );\n\n // Handle custom text input\n const handleCustomChange = useCallback(\n (newCustomText: string) => {\n setCustomText(newCustomText);\n onChange(combineTerms(checkedTerms, newCustomText));\n },\n [checkedTerms, onChange],\n );\n\n return (\n <div className=\"flex flex-col gap-2\">\n {/* Collapsible header */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"flex items-center justify-between w-full text-left group\"\n >\n <span className=\"text-xs text-muted-foreground\">Negative Prompt</span>\n <div className=\"flex items-center gap-1.5\">\n {selectedCount > 0 && (\n <span className=\"text-[10px] text-muted-foreground/70\">\n {selectedCount} selected\n </span>\n )}\n {isExpanded ? (\n <ChevronDown className=\"w-3.5 h-3.5 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"w-3.5 h-3.5 text-muted-foreground\" />\n )}\n </div>\n </button>\n\n {/* Expandable content */}\n {isExpanded && (\n <>\n {/* Checkbox grid */}\n <div className=\"grid grid-cols-2 gap-x-3 gap-y-1.5\">\n {NEGATIVE_PROMPT_OPTIONS.map((option) => {\n const isChecked = checkedTerms.has(option.value.toLowerCase());\n const checkboxId = `negative-prompt-${option.value}`;\n return (\n <div\n key={option.value}\n className=\"flex items-center gap-1.5 nodrag\"\n >\n <Checkbox\n id={checkboxId}\n checked={isChecked}\n onCheckedChange={(checked) => {\n if (typeof checked === 'boolean') {\n handleCheckboxChange(option.value, checked);\n }\n }}\n className=\"w-3.5 h-3.5\"\n />\n <label\n htmlFor={checkboxId}\n className=\"text-sm text-foreground truncate cursor-pointer\"\n >\n {option.label}\n </label>\n </div>\n );\n })}\n </div>\n\n {/* Custom terms input */}\n <div className=\"flex flex-col gap-1 mt-1\">\n <label className=\"text-xs text-muted-foreground\">Custom</label>\n <input\n type=\"text\"\n value={customText}\n onChange={(e) => handleCustomChange(e.target.value)}\n placeholder=\"ugly, deformed, ...\"\n className=\"nodrag nopan w-full h-7 rounded-md border border-input bg-background px-2 text-xs shadow-sm placeholder:text-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport const NegativePromptSelector = memo(NegativePromptSelectorComponent);\n","'use client';\n\nimport { memo, useCallback, useMemo } from 'react';\nimport { Checkbox } from '../ui/checkbox';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select';\nimport { Slider } from '../ui/slider';\nimport { NegativePromptSelector } from './NegativePromptSelector';\n\n/**\n * JSON Schema property definition\n * These come from Replicate model schemas\n */\nexport interface SchemaProperty {\n type?: string;\n title?: string;\n description?: string;\n default?: unknown;\n minimum?: number;\n maximum?: number;\n 'x-order'?: number;\n allOf?: Array<{ $ref: string }>;\n enum?: string[];\n nullable?: boolean;\n}\n\ninterface ComponentSchema {\n enum?: unknown[];\n type?: string;\n}\n\ninterface SchemaInputsProps {\n schema: Record<string, SchemaProperty> | undefined;\n values: Record<string, unknown>;\n onChange: (key: string, value: unknown) => void;\n /** Custom enum values map - key is the $ref path, value is array of enum options */\n enumValues?: Record<string, string[]>;\n /** Component schemas with type info for proper type coercion */\n componentSchemas?: Record<string, ComponentSchema>;\n /** Disable all inputs (e.g. during processing) */\n disabled?: boolean;\n}\n\n// Fields that come from node connections and should be skipped\nconst CONNECTION_FIELDS = new Set([\n 'prompt',\n 'image',\n 'image_input',\n 'video',\n 'audio',\n 'start_image',\n 'first_frame_image',\n 'last_frame',\n 'reference_images',\n 'image_url',\n 'video_url',\n 'end_image',\n 'start_video_id',\n 'end_video_id',\n 'subject_reference', // minimax S2V mode character reference\n 'image_prompt', // flux-1.1-pro Redux image prompt\n 'mask', // sdxl inpainting mask\n]);\n\n// Common enum values from Replicate schemas\n// These map to the $ref values in allOf definitions\nconst DEFAULT_ENUM_VALUES: Record<string, string[]> = {\n // Aspect ratios\n aspect_ratio: [\n 'match_input_image',\n '1:1',\n '16:9',\n '9:16',\n '4:3',\n '3:4',\n '3:2',\n '2:3',\n '21:9',\n '9:21',\n '4:5',\n '5:4',\n ],\n // Character orientation\n character_orientation: ['image', 'video'],\n // Video duration\n duration: ['4', '5', '6', '8', '10'],\n // Megapixels\n megapixels: ['0.25', '1', '2'],\n // Video model mode\n mode: ['std', 'pro'],\n // Luma models\n model: ['photon-flash-1', 'photon-1'],\n // Output formats\n output_format: ['jpg', 'png', 'webp'],\n // Refine options\n refine: ['no_refiner', 'expert_ensemble_refiner', 'base_image_refiner'],\n // Resolution options\n resolution: ['1K', '2K', '4K', '720p', '1080p'],\n // Safety filter level\n safety_filter_level: [\n 'block_only_high',\n 'block_medium_and_above',\n 'block_low_and_above',\n ],\n // Scheduler options\n scheduler: ['K_EULER', 'K_EULER_ANCESTRAL', 'DDIM', 'DPM_SOLVER', 'PNDM'],\n // Sync mode\n sync_mode: ['loop', 'bounce', 'cut_off', 'silence', 'remap'],\n};\n\n/**\n * Extract enum key from $ref path\n * e.g., \"#/components/schemas/aspect_ratio\" -> \"aspect_ratio\"\n */\nfunction getEnumKey(refPath: string): string {\n const parts = refPath.split('/');\n return parts[parts.length - 1];\n}\n\n/**\n * Format property name for display\n * e.g., \"aspect_ratio\" -> \"Aspect Ratio\"\n */\nfunction formatLabel(key: string, title?: string): string {\n if (title) return title;\n return key.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Render a select dropdown for enum values\n */\nfunction EnumSelect({\n propertyKey,\n property,\n value,\n options,\n onChange,\n}: {\n propertyKey: string;\n property: SchemaProperty;\n value: unknown;\n options: string[];\n onChange: (value: string) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs text-muted-foreground\">\n {formatLabel(propertyKey, property.title)}\n </label>\n <Select\n value={String(value ?? property.default ?? options[0])}\n onValueChange={onChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n}\n\n/**\n * Render a slider with number input for numeric values with min/max\n */\nfunction SliderInput({\n propertyKey,\n property,\n value,\n onChange,\n}: {\n propertyKey: string;\n property: SchemaProperty;\n value: unknown;\n onChange: (value: number) => void;\n}) {\n const min = property.minimum ?? 0;\n const max = property.maximum ?? 100;\n const step = property.type === 'integer' ? 1 : 0.1;\n const currentValue =\n typeof value === 'number' ? value : ((property.default as number) ?? min);\n\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs text-muted-foreground\">\n {formatLabel(propertyKey, property.title)}\n </label>\n\n <div className=\"flex items-center gap-2 nodrag\">\n <Slider\n value={[currentValue]}\n min={min}\n max={max}\n step={step}\n onValueChange={([val]) => onChange(val)}\n className=\"flex-1\"\n />\n\n <input\n type=\"number\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={(e) => onChange(Number(e.target.value))}\n className=\"nodrag nopan w-16 h-7 rounded-md border border-input bg-background px-2 text-xs text-center shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n </div>\n );\n}\n\n/**\n * Render a checkbox for boolean values\n */\nfunction CheckboxInput({\n propertyKey,\n property,\n value,\n onChange,\n}: {\n propertyKey: string;\n property: SchemaProperty;\n value: unknown;\n onChange: (value: boolean) => void;\n}) {\n const checked =\n typeof value === 'boolean'\n ? value\n : ((property.default as boolean) ?? false);\n const inputId = `schema-checkbox-${propertyKey}`;\n\n return (\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={inputId}\n checked={checked}\n onCheckedChange={(checkedState) => {\n if (typeof checkedState === 'boolean') {\n onChange(checkedState);\n }\n }}\n />\n <label\n htmlFor={inputId}\n className=\"text-sm text-foreground cursor-pointer\"\n >\n {formatLabel(propertyKey, property.title)}\n </label>\n </div>\n );\n}\n\n/**\n * Render a simple number input for numeric values without range constraints\n */\nfunction NumberInput({\n propertyKey,\n property,\n value,\n onChange,\n}: {\n propertyKey: string;\n property: SchemaProperty;\n value: unknown;\n onChange: (value: number | null) => void;\n}) {\n const currentValue =\n typeof value === 'number'\n ? value\n : (property.default as number | undefined);\n\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs text-muted-foreground\">\n {formatLabel(propertyKey, property.title)}\n </label>\n <input\n type=\"number\"\n value={currentValue ?? ''}\n placeholder={property.nullable ? 'Random' : undefined}\n onChange={(e) => {\n const val = e.target.value;\n onChange(val === '' ? null : Number(val));\n }}\n className=\"nodrag nopan w-full h-8 rounded-md border border-input bg-background px-2 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n );\n}\n\nfunction SchemaInputsComponent({\n schema,\n values,\n onChange,\n enumValues,\n componentSchemas,\n disabled,\n}: SchemaInputsProps) {\n const handleChange = useCallback(\n (key: string, value: unknown) => {\n onChange(key, value);\n },\n [onChange],\n );\n\n // Sort properties by x-order and filter out connection fields\n const sortedProperties = useMemo(() => {\n if (!schema) return [];\n\n return Object.entries(schema)\n .filter(([key]) => !CONNECTION_FIELDS.has(key))\n .sort((a, b) => {\n const orderA = a[1]['x-order'] ?? 999;\n const orderB = b[1]['x-order'] ?? 999;\n return orderA - orderB;\n });\n }, [schema]);\n\n if (!schema || sortedProperties.length === 0) {\n return null;\n }\n\n return (\n <div\n className={`flex flex-col gap-2${disabled ? ' pointer-events-none opacity-50' : ''}`}\n >\n {sortedProperties.map(([key, property]) => {\n const value = values[key];\n\n // Negative prompt - render checkbox selector\n if (key === 'negative_prompt' && property.type === 'string') {\n return (\n <NegativePromptSelector\n key={key}\n value={(value as string) ?? ''}\n onChange={(v) => handleChange(key, v)}\n />\n );\n }\n\n // Enum type (allOf with $ref)\n if (property.allOf && property.allOf.length > 0) {\n const enumKey = getEnumKey(property.allOf[0].$ref);\n const options =\n enumValues?.[enumKey] ?? DEFAULT_ENUM_VALUES[enumKey] ?? [];\n\n if (options.length > 0) {\n // Get the component schema type for proper type coercion\n const componentSchema = componentSchemas?.[enumKey];\n const enumType = componentSchema?.type;\n\n return (\n <EnumSelect\n key={key}\n propertyKey={key}\n property={property}\n value={value}\n options={options}\n onChange={(v) => {\n // Convert string value to correct type based on component schema\n if (enumType === 'integer') {\n handleChange(key, Number.parseInt(v, 10));\n } else if (enumType === 'number') {\n handleChange(key, Number.parseFloat(v));\n } else {\n handleChange(key, v);\n }\n }}\n />\n );\n }\n }\n\n // Direct enum type\n if (property.enum) {\n return (\n <EnumSelect\n key={key}\n propertyKey={key}\n property={property}\n value={value}\n options={property.enum}\n onChange={(v) => handleChange(key, v)}\n />\n );\n }\n\n // Boolean type\n if (property.type === 'boolean') {\n return (\n <CheckboxInput\n key={key}\n propertyKey={key}\n property={property}\n value={value}\n onChange={(v) => handleChange(key, v)}\n />\n );\n }\n\n // Integer/Number with min/max -> slider\n if (\n (property.type === 'integer' || property.type === 'number') &&\n property.minimum !== undefined &&\n property.maximum !== undefined\n ) {\n return (\n <SliderInput\n key={key}\n propertyKey={key}\n property={property}\n value={value}\n onChange={(v) => handleChange(key, v)}\n />\n );\n }\n\n // Integer/Number without min/max (like seed) -> simple input\n if (property.type === 'integer' || property.type === 'number') {\n return (\n <NumberInput\n key={key}\n propertyKey={key}\n property={property}\n value={value}\n onChange={(v) => handleChange(key, v)}\n />\n );\n }\n\n // Skip other types (strings that aren't connection fields are rare)\n return null;\n })}\n </div>\n );\n}\n\nexport const SchemaInputs = memo(SchemaInputsComponent);\n","'use client';\n\nimport type { ImageGenNodeData, ImageModel } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { AlertCircle, Download, ImageIcon } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback, useMemo, useState } from 'react';\nimport { useAIGenNode } from '../../hooks/useAIGenNode';\nimport { useAIGenNodeHeader } from '../../hooks/useAIGenNodeHeader';\nimport { useAutoLoadModelSchema } from '../../hooks/useAutoLoadModelSchema';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useModelSelection } from '../../hooks/useModelSelection';\nimport { useNodeExecution } from '../../hooks/useNodeExecution';\nimport {\n DEFAULT_IMAGE_MODEL,\n IMAGE_MODEL_ID_MAP,\n IMAGE_MODEL_MAP,\n IMAGE_MODELS,\n} from '../../lib/models/registry';\nimport { useWorkflowUIConfig } from '../../provider';\nimport { useUIStore } from '../../stores/uiStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\nimport { ProcessingOverlay } from '../ProcessingOverlay';\nimport { SchemaInputs } from '../SchemaInputs';\n\nfunction ImageGenNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as ImageGenNodeData;\n const { ModelBrowserModal } = useWorkflowUIConfig();\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { handleGenerate, handleStop } = useNodeExecution(id);\n const { canGenerate } = useCanGenerate({\n inputSchema: nodeData.selectedModel?.inputSchema as\n | Record<string, unknown>\n | undefined,\n nodeId: id,\n nodeType: type as 'imageGen',\n schemaParams: nodeData.schemaParams,\n });\n\n const [isModelBrowserOpen, setIsModelBrowserOpen] = useState(false);\n const [selectedPreview, setSelectedPreview] = useState<number | null>(null);\n\n // Download handlers for multi-image gallery\n const handleDownload = useCallback(\n (index: number) => {\n const images = nodeData.outputImages ?? [];\n const image = images[index];\n if (!image) return;\n\n const link = document.createElement('a');\n link.href = image;\n link.download = `generated_${index + 1}.jpg`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n },\n [nodeData.outputImages],\n );\n\n const handleDownloadAll = useCallback(() => {\n const images = nodeData.outputImages ?? [];\n images.forEach((_, index) => {\n setTimeout(() => handleDownload(index), index * 100);\n });\n }, [nodeData.outputImages, handleDownload]);\n\n // Use shared hook for model selection\n const { handleModelSelect } = useModelSelection<ImageModel, ImageGenNodeData>(\n {\n fallbackModel: DEFAULT_IMAGE_MODEL,\n modelMap: IMAGE_MODEL_MAP,\n nodeId: id,\n },\n );\n\n // Auto-load schema for default model if selectedModel is not set\n useAutoLoadModelSchema({\n currentModel: nodeData.model,\n modelIdMap: IMAGE_MODEL_ID_MAP,\n onModelSelect: handleModelSelect,\n selectedModel: nodeData.selectedModel,\n });\n\n // Shared schema/enum/image-support logic\n const {\n schemaProperties,\n enumValues,\n modelSupportsImageInput,\n handleSchemaParamChange,\n componentSchemas,\n } = useAIGenNode<ImageGenNodeData>({\n nodeId: id,\n schemaParams: nodeData.schemaParams,\n selectedModel: nodeData.selectedModel,\n });\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview', selectedPreview ?? 0);\n }, [id, openNodeDetailModal, selectedPreview]);\n\n const modelDisplayName = useMemo(\n () =>\n nodeData.selectedModel?.displayName ||\n IMAGE_MODELS.find((m) => m.value === nodeData.model)?.label ||\n nodeData.model,\n [nodeData.selectedModel?.displayName, nodeData.model],\n );\n\n const isProcessing = nodeData.status === 'processing';\n\n const handleModelBrowse = useCallback(() => setIsModelBrowserOpen(true), []);\n\n const { titleElement, headerActions } = useAIGenNodeHeader({\n canGenerate,\n hasOutput: !!nodeData.outputImage,\n isProcessing,\n modelDisplayName,\n onExpand: handleExpand,\n onGenerate: handleGenerate,\n onModelBrowse: handleModelBrowse,\n onStop: handleStop,\n });\n\n return (\n <BaseNode\n {...props}\n titleElement={titleElement}\n headerActions={headerActions}\n hideStatusIndicator\n disabledInputs={modelSupportsImageInput ? undefined : ['images']}\n >\n <div className=\"flex-1 flex flex-col gap-3 min-h-0\">\n {/* Dynamic Schema Inputs */}\n {schemaProperties && (\n <SchemaInputs\n schema={schemaProperties}\n values={nodeData.schemaParams ?? {}}\n onChange={handleSchemaParamChange}\n enumValues={enumValues}\n componentSchemas={componentSchemas}\n disabled={nodeData.status === 'processing'}\n />\n )}\n\n {/* Hint when model doesn't support image input */}\n {!modelSupportsImageInput && nodeData.inputImages.length > 0 && (\n <div className=\"text-xs text-amber-500 flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n This model doesn&apos;t use image inputs\n </div>\n )}\n\n {/* Output Preview - Multi-image gallery or single image */}\n {(nodeData.outputImages?.length ?? 0) > 1 ? (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">\n Generated ({nodeData.outputImages.length} images)\n </span>\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={handleDownloadAll}\n className=\"h-auto p-0\"\n >\n <Download className=\"w-3 h-3\" />\n Download All\n </Button>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {nodeData.outputImages.map((img, i) => (\n <div\n key={i}\n className=\"relative group aspect-square rounded overflow-hidden border border-border cursor-pointer\"\n onClick={() =>\n setSelectedPreview(selectedPreview === i ? null : i)\n }\n >\n <Image\n src={img}\n alt={`Generated ${i + 1}`}\n fill\n sizes=\"150px\"\n className=\"object-cover\"\n unoptimized\n />\n\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition flex items-center justify-center\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"h-6 w-6 bg-white/20 hover:bg-white/30\"\n onClick={(e) => {\n e.stopPropagation();\n handleDownload(i);\n }}\n >\n <Download className=\"w-3 h-3 text-white\" />\n </Button>\n </div>\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-[8px] text-center py-0.5\">\n {i + 1}\n </div>\n </div>\n ))}\n </div>\n {/* Enlarged preview */}\n {selectedPreview !== null &&\n nodeData.outputImages[selectedPreview] && (\n <div className=\"relative aspect-[4/3] rounded overflow-hidden\">\n <Image\n src={nodeData.outputImages[selectedPreview]}\n alt={`Preview ${selectedPreview + 1}`}\n fill\n sizes=\"300px\"\n className=\"object-contain\"\n unoptimized\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setSelectedPreview(null)}\n className=\"absolute top-1 right-1 h-5 w-5 bg-black/50 hover:bg-black/70 text-white\"\n >\n x\n </Button>\n </div>\n )}\n {/* Processing overlay */}\n {nodeData.status === 'processing' && <ProcessingOverlay />}\n </div>\n ) : nodeData.outputImage ? (\n <div className=\"relative aspect-[4/3] w-full overflow-hidden rounded-md bg-black/20\">\n <Image\n src={nodeData.outputImage}\n alt=\"Generated image\"\n fill\n sizes=\"300px\"\n className=\"object-contain cursor-pointer\"\n unoptimized\n />\n {/* Processing overlay spinner */}\n {nodeData.status === 'processing' && <ProcessingOverlay />}\n </div>\n ) : (\n <div className=\"relative flex aspect-[4/3] w-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border/50 bg-secondary/20\">\n <ImageIcon className=\"h-6 w-6 text-muted-foreground/50\" />\n {nodeData.status === 'processing' && <ProcessingOverlay />}\n </div>\n )}\n\n {/* Help text for required inputs */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Connect a prompt to generate\n </div>\n )}\n </div>\n\n {/* Model Browser Modal */}\n {ModelBrowserModal && (\n <ModelBrowserModal\n isOpen={isModelBrowserOpen}\n onClose={() => setIsModelBrowserOpen(false)}\n onSelect={handleModelSelect}\n capabilities={['text-to-image', 'image-to-image']}\n title=\"Select Image Model\"\n />\n )}\n </BaseNode>\n );\n}\n\nexport const ImageGenNode = memo(ImageGenNodeComponent);\n","'use client';\n\nimport type {\n LipSyncMode,\n LipSyncModel,\n LipSyncNodeData,\n} from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand, Loader2, Mic, RefreshCw, Video } from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useNodeExecution } from '../../hooks/useNodeExecution';\nimport { LIPSYNC_MODELS, LIPSYNC_SYNC_MODES } from '../../lib/models/registry';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Checkbox } from '../../ui/checkbox';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nfunction LipSyncNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as LipSyncNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { handleGenerate } = useNodeExecution(id);\n const { canGenerate } = useCanGenerate({\n nodeId: id,\n nodeType: type as 'lipSync',\n });\n\n const handleModelChange = useCallback(\n (value: string) => {\n updateNodeData<LipSyncNodeData>(id, { model: value as LipSyncModel });\n },\n [id, updateNodeData],\n );\n\n const handleSyncModeChange = useCallback(\n (value: string) => {\n updateNodeData<LipSyncNodeData>(id, { syncMode: value as LipSyncMode });\n },\n [id, updateNodeData],\n );\n\n const handleTemperatureChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<LipSyncNodeData>(id, { temperature: value });\n },\n [id, updateNodeData],\n );\n\n const handleActiveSpeakerChange = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<LipSyncNodeData>(id, { activeSpeaker: checked });\n }\n },\n [id, updateNodeData],\n );\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const currentModel = LIPSYNC_MODELS.find((m) => m.value === nodeData.model);\n const isSyncModel = nodeData.model.startsWith('sync/');\n const supportsImage = currentModel?.supportsImage ?? false;\n\n const headerActions = useMemo(\n () =>\n nodeData.outputVideo ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [nodeData.outputVideo, handleExpand],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"space-y-3\">\n {/* Model Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Model\n </label>\n <Select value={nodeData.model} onValueChange={handleModelChange}>\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {LIPSYNC_MODELS.map((model) => (\n <SelectItem key={model.value} value={model.value}>\n {model.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Sync Mode (only for Sync Labs models) */}\n {isSyncModel && (\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Sync Mode\n </label>\n <Select\n value={nodeData.syncMode}\n onValueChange={handleSyncModeChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {LIPSYNC_SYNC_MODES.map((mode) => (\n <SelectItem key={mode.value} value={mode.value}>\n {mode.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Temperature Slider */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Temperature: {nodeData.temperature.toFixed(2)}\n </label>\n <Slider\n value={[nodeData.temperature]}\n min={0}\n max={1}\n step={0.05}\n onValueChange={handleTemperatureChange}\n className=\"nodrag w-full\"\n />\n </div>\n\n {/* Active Speaker Toggle (only for Sync Labs models) */}\n {isSyncModel && (\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`active-speaker-${id}`}\n checked={nodeData.activeSpeaker}\n onCheckedChange={handleActiveSpeakerChange}\n />\n <label\n htmlFor={`active-speaker-${id}`}\n className=\"text-xs text-[var(--muted-foreground)] cursor-pointer\"\n >\n Active speaker detection\n </label>\n </div>\n )}\n\n {/* Output Video Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n controls\n className=\"w-full rounded border border-[var(--border)]\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleGenerate}\n disabled={nodeData.status === 'processing' || !canGenerate}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Generate Button */}\n {!nodeData.outputVideo && (\n <Button\n variant={canGenerate ? 'default' : 'secondary'}\n size=\"sm\"\n onClick={handleGenerate}\n disabled={!canGenerate || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Video className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Generating...'\n : 'Generate Lip Sync'}\n </Button>\n )}\n\n {/* Help text for required inputs */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <Mic className=\"w-3 h-3\" />\n {supportsImage\n ? 'Connect audio + image to generate'\n : 'Connect audio + video to generate'}\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const LipSyncNode = memo(LipSyncNodeComponent);\n","'use client';\n\nimport type { LLMNodeData, TextModel } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { AlertCircle, Expand, RefreshCw } from 'lucide-react';\nimport { memo, useCallback, useMemo, useState } from 'react';\nimport { useAIGenNodeHeader } from '../../hooks/useAIGenNodeHeader';\nimport { useAutoLoadModelSchema } from '../../hooks/useAutoLoadModelSchema';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useModelSelection } from '../../hooks/useModelSelection';\nimport { useNodeExecution } from '../../hooks/useNodeExecution';\nimport {\n DEFAULT_LLM_MODEL,\n LLM_MODEL_ID_MAP,\n LLM_MODEL_MAP,\n LLM_MODELS,\n} from '../../lib/models/registry';\nimport { useWorkflowUIConfig } from '../../provider';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nfunction LLMNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as LLMNodeData;\n const { ModelBrowserModal } = useWorkflowUIConfig();\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { handleGenerate, handleStop } = useNodeExecution(id);\n const { canGenerate: hasRequiredConnections } = useCanGenerate({\n nodeId: id,\n nodeType: type as 'llm',\n });\n\n const hasSystemPrompt = !!nodeData.systemPrompt?.trim();\n const hasInputPrompt = !!nodeData.inputPrompt?.trim();\n const canGenerate =\n hasRequiredConnections && hasSystemPrompt && hasInputPrompt;\n\n const [isModelBrowserOpen, setIsModelBrowserOpen] = useState(false);\n\n const { handleModelSelect } = useModelSelection<TextModel, LLMNodeData>({\n fallbackModel: DEFAULT_LLM_MODEL,\n modelMap: LLM_MODEL_MAP,\n nodeId: id,\n });\n\n useAutoLoadModelSchema({\n currentModel: nodeData.model,\n modelIdMap: LLM_MODEL_ID_MAP,\n onModelSelect: handleModelSelect,\n selectedModel: nodeData.selectedModel,\n });\n\n const handleSystemPromptChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n updateNodeData<LLMNodeData>(id, { systemPrompt: e.target.value });\n },\n [id, updateNodeData],\n );\n\n const handleTemperatureChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<LLMNodeData>(id, { temperature: value });\n },\n [id, updateNodeData],\n );\n\n const handleMaxTokensChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<LLMNodeData>(id, {\n maxTokens: parseInt(e.target.value, 10),\n });\n },\n [id, updateNodeData],\n );\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const modelDisplayName = useMemo(\n () =>\n nodeData.selectedModel?.displayName ||\n LLM_MODELS.find((m) => m.value === nodeData.model)?.label ||\n nodeData.model ||\n 'Llama 3.1 405B',\n [nodeData.selectedModel?.displayName, nodeData.model],\n );\n\n const isProcessing = nodeData.status === 'processing';\n\n const handleModelBrowse = useCallback(() => setIsModelBrowserOpen(true), []);\n\n const { titleElement, headerActions } = useAIGenNodeHeader({\n canGenerate,\n hasOutput: !!nodeData.outputText,\n isProcessing,\n modelDisplayName,\n onExpand: handleExpand,\n onGenerate: handleGenerate,\n onModelBrowse: handleModelBrowse,\n onStop: handleStop,\n });\n\n return (\n <BaseNode\n {...props}\n titleElement={titleElement}\n headerActions={headerActions}\n hideStatusIndicator\n >\n <div className=\"space-y-3\">\n {nodeData.inputPrompt ? (\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Input Prompt\n </label>\n <div className=\"mt-1 p-2 bg-[var(--secondary)]/30 border border-[var(--border)] rounded text-xs text-[var(--muted-foreground)] max-h-16 overflow-hidden line-clamp-3\">\n {nodeData.inputPrompt}\n </div>\n </div>\n ) : (\n !isProcessing && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Connect a prompt to generate\n </div>\n )\n )}\n\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n System Prompt <span className=\"text-[var(--destructive)]\">*</span>\n </label>\n <textarea\n value={nodeData.systemPrompt}\n onChange={handleSystemPromptChange}\n placeholder=\"Define the AI's behavior...\"\n className={`w-full h-16 px-2 py-1.5 text-sm bg-[var(--background)] border rounded resize-none focus:outline-none focus:ring-1 focus:ring-[var(--primary)] ${!hasSystemPrompt ? 'border-[var(--destructive)]/50' : 'border-[var(--border)]'}`}\n disabled={isProcessing}\n />\n </div>\n\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Temperature: {nodeData.temperature.toFixed(2)}\n </label>\n <Slider\n value={[nodeData.temperature]}\n min={0}\n max={2}\n step={0.1}\n onValueChange={handleTemperatureChange}\n className=\"nodrag w-full\"\n disabled={isProcessing}\n />\n <div className=\"flex justify-between text-xs text-[var(--muted-foreground)]\">\n <span>Precise</span>\n <span>Creative</span>\n </div>\n </div>\n\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Max Tokens\n </label>\n <input\n type=\"number\"\n min=\"64\"\n max=\"4096\"\n value={nodeData.maxTokens}\n onChange={handleMaxTokensChange}\n className=\"w-full px-2 py-1.5 text-sm bg-[var(--background)] border border-[var(--border)] rounded focus:outline-none focus:ring-1 focus:ring-[var(--primary)]\"\n disabled={isProcessing}\n />\n </div>\n\n {nodeData.outputText && (\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Generated Output\n </label>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleGenerate}\n disabled={isProcessing}\n title=\"Regenerate\"\n className=\"h-5 w-5\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n className=\"h-5 w-5\"\n >\n <Expand className=\"w-3 h-3\" />\n </Button>\n </div>\n </div>\n <div className=\"p-2 bg-[var(--primary)]/5 border border-[var(--primary)]/20 rounded text-sm max-h-48 overflow-y-auto whitespace-pre-wrap nodrag nopan nowheel\">\n {nodeData.outputText}\n </div>\n </div>\n )}\n </div>\n\n {ModelBrowserModal && (\n <ModelBrowserModal\n isOpen={isModelBrowserOpen}\n onClose={() => setIsModelBrowserOpen(false)}\n onSelect={handleModelSelect}\n capabilities={['text-generation']}\n title=\"Select LLM Model\"\n />\n )}\n </BaseNode>\n );\n}\n\nexport const LLMNode = memo(LLMNodeComponent);\n","'use client';\n\nimport type {\n CharacterOrientation,\n KlingQualityMode,\n MotionControlMode,\n MotionControlNodeData,\n} from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport {\n AlertCircle,\n Expand,\n Play,\n RefreshCw,\n Square,\n Video,\n} from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useNodeExecution } from '../../hooks/useNodeExecution';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Checkbox } from '../../ui/checkbox';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nconst QUALITY_MODES: {\n value: KlingQualityMode;\n label: string;\n description: string;\n}[] = [\n { description: 'Faster processing', label: 'Standard', value: 'std' },\n { description: 'Higher quality', label: 'Pro', value: 'pro' },\n];\n\nconst CHARACTER_ORIENTATIONS: { value: CharacterOrientation; label: string }[] =\n [\n { label: 'From Image', value: 'image' },\n { label: 'From Video', value: 'video' },\n ];\n\nconst MOTION_MODES: {\n value: MotionControlMode;\n label: string;\n description: string;\n}[] = [\n {\n description: 'Apply motion from reference video',\n label: 'Video Transfer',\n value: 'video_transfer',\n },\n { description: 'Apply camera movements', label: 'Camera', value: 'camera' },\n {\n description: 'Define motion path',\n label: 'Trajectory',\n value: 'trajectory',\n },\n { description: 'Camera + Trajectory', label: 'Combined', value: 'combined' },\n];\n\nconst ASPECT_RATIOS: { value: '16:9' | '9:16' | '1:1'; label: string }[] = [\n { label: '16:9 (Landscape)', value: '16:9' },\n { label: '9:16 (Portrait)', value: '9:16' },\n { label: '1:1 (Square)', value: '1:1' },\n];\n\nconst DURATIONS: { value: 5 | 10; label: string }[] = [\n { label: '5 seconds', value: 5 },\n { label: '10 seconds', value: 10 },\n];\n\nfunction MotionControlNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as MotionControlNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { handleGenerate, handleStop } = useNodeExecution(id);\n const { canGenerate } = useCanGenerate({\n nodeId: id,\n nodeType: type as 'motionControl',\n });\n\n const handleModeChange = useCallback(\n (value: string) => {\n updateNodeData<MotionControlNodeData>(id, {\n mode: value as MotionControlMode,\n });\n },\n [id, updateNodeData],\n );\n\n const handleQualityModeChange = useCallback(\n (value: string) => {\n updateNodeData<MotionControlNodeData>(id, {\n qualityMode: value as KlingQualityMode,\n });\n },\n [id, updateNodeData],\n );\n\n const handleCharacterOrientationChange = useCallback(\n (value: string) => {\n updateNodeData<MotionControlNodeData>(id, {\n characterOrientation: value as CharacterOrientation,\n });\n },\n [id, updateNodeData],\n );\n\n const handleAspectRatioChange = useCallback(\n (value: string) => {\n updateNodeData<MotionControlNodeData>(id, {\n aspectRatio: value as '16:9' | '9:16' | '1:1',\n });\n },\n [id, updateNodeData],\n );\n\n const handleDurationChange = useCallback(\n (value: string) => {\n updateNodeData<MotionControlNodeData>(id, {\n duration: Number.parseInt(value, 10) as 5 | 10,\n });\n },\n [id, updateNodeData],\n );\n\n const handleKeepOriginalSoundToggle = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<MotionControlNodeData>(id, {\n keepOriginalSound: checked,\n });\n }\n },\n [id, updateNodeData],\n );\n\n const handleMotionStrengthChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<MotionControlNodeData>(id, { motionStrength: value });\n },\n [id, updateNodeData],\n );\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const isVideoTransferMode = nodeData.mode === 'video_transfer';\n\n const headerActions = useMemo(\n () => (\n <>\n {nodeData.outputVideo && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n )}\n {nodeData.status === 'processing' ? (\n <Button variant=\"destructive\" size=\"sm\" onClick={handleStop}>\n <Square className=\"h-4 w-4 fill-current\" />\n Generating\n </Button>\n ) : (\n <Button\n variant={canGenerate ? 'default' : 'secondary'}\n size=\"sm\"\n onClick={handleGenerate}\n disabled={!canGenerate}\n >\n <Play className=\"h-4 w-4 fill-current\" />\n Generate\n </Button>\n )}\n </>\n ),\n [\n nodeData.outputVideo,\n nodeData.status,\n handleGenerate,\n handleStop,\n handleExpand,\n canGenerate,\n ],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions} hideStatusIndicator>\n <div className=\"space-y-3\">\n {/* Mode Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">Mode</label>\n <Select value={nodeData.mode} onValueChange={handleModeChange}>\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {MOTION_MODES.map((mode) => (\n <SelectItem key={mode.value} value={mode.value}>\n {mode.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Video Transfer specific options */}\n {isVideoTransferMode && (\n <>\n {/* Quality Mode */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Quality\n </label>\n <Select\n value={nodeData.qualityMode}\n onValueChange={handleQualityModeChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {QUALITY_MODES.map((mode) => (\n <SelectItem key={mode.value} value={mode.value}>\n {mode.label} - {mode.description}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Character Orientation */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Character Orientation\n </label>\n <Select\n value={nodeData.characterOrientation}\n onValueChange={handleCharacterOrientationChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CHARACTER_ORIENTATIONS.map((orientation) => (\n <SelectItem\n key={orientation.value}\n value={orientation.value}\n >\n {orientation.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Keep Original Sound */}\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`keep-sound-${id}`}\n checked={nodeData.keepOriginalSound}\n onCheckedChange={handleKeepOriginalSoundToggle}\n />\n <label\n htmlFor={`keep-sound-${id}`}\n className=\"text-sm text-[var(--foreground)] cursor-pointer\"\n >\n Keep Original Sound\n </label>\n </div>\n </>\n )}\n\n {!isVideoTransferMode && (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n {/* Duration */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Duration\n </label>\n <Select\n value={String(nodeData.duration)}\n onValueChange={handleDurationChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DURATIONS.map((d) => (\n <SelectItem key={d.value} value={String(d.value)}>\n {d.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Aspect Ratio */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Aspect Ratio\n </label>\n <Select\n value={nodeData.aspectRatio}\n onValueChange={handleAspectRatioChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ASPECT_RATIOS.map((ratio) => (\n <SelectItem key={ratio.value} value={ratio.value}>\n {ratio.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {/* Motion Strength Slider */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Motion Strength: {nodeData.motionStrength}%\n </label>\n <Slider\n value={[nodeData.motionStrength]}\n min={0}\n max={100}\n step={5}\n onValueChange={handleMotionStrengthChange}\n className=\"nodrag w-full\"\n />\n <div className=\"flex justify-between text-[10px] text-[var(--muted-foreground)]\">\n <span>Subtle</span>\n <span>Strong</span>\n </div>\n </div>\n </>\n )}\n\n {/* Output Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n className=\"w-full h-20 object-cover rounded cursor-pointer\"\n controls\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleGenerate}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Help text for required inputs */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n {isVideoTransferMode\n ? 'Connect an image and motion video'\n : 'Connect an image to generate'}\n </div>\n )}\n\n {/* Info about video requirements */}\n {isVideoTransferMode && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <Video className=\"w-3 h-3\" />\n Motion video: 3-30 seconds\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const MotionControlNode = memo(MotionControlNodeComponent);\n","'use client';\n\nimport type {\n TextToSpeechNodeData,\n TTSProvider,\n TTSVoice,\n} from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport {\n AlertTriangle,\n AudioLines,\n Loader2,\n RefreshCw,\n Volume2,\n} from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useNodeExecution } from '../../hooks/useNodeExecution';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nconst TTS_ENABLED = process.env.NEXT_PUBLIC_TTS_ENABLED === 'true';\n\nconst PROVIDERS: { value: TTSProvider; label: string }[] = [\n { label: 'ElevenLabs', value: 'elevenlabs' },\n { label: 'OpenAI', value: 'openai' },\n];\n\nconst VOICES: { value: TTSVoice; label: string; description: string }[] = [\n { description: 'American female, calm', label: 'Rachel', value: 'rachel' },\n { description: 'American male, confident', label: 'Drew', value: 'drew' },\n { description: 'American male, war veteran', label: 'Clyde', value: 'clyde' },\n { description: 'American male, narrative', label: 'Paul', value: 'paul' },\n { description: 'American female, assertive', label: 'Domi', value: 'domi' },\n { description: 'British male, conversational', label: 'Dave', value: 'dave' },\n { description: 'Irish male, sailor', label: 'Fin', value: 'fin' },\n { description: 'American female, soft', label: 'Sarah', value: 'sarah' },\n { description: 'American male, friendly', label: 'Antoni', value: 'antoni' },\n { description: 'American male, calm', label: 'Thomas', value: 'thomas' },\n {\n description: 'Australian male, casual',\n label: 'Charlie',\n value: 'charlie',\n },\n { description: 'American female, calm', label: 'Emily', value: 'emily' },\n {\n description: 'British female, pleasant',\n label: 'Dorothy',\n value: 'dorothy',\n },\n { description: 'American male, deep', label: 'Josh', value: 'josh' },\n { description: 'American male, narrator', label: 'Arnold', value: 'arnold' },\n { description: 'American male, deep', label: 'Adam', value: 'adam' },\n { description: 'American male, raspy', label: 'Sam', value: 'sam' },\n];\n\nfunction TextToSpeechNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as TextToSpeechNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const { handleGenerate } = useNodeExecution(id);\n const { canGenerate } = useCanGenerate({\n nodeId: id,\n nodeType: type as 'textToSpeech',\n });\n\n const handleProviderChange = useCallback(\n (value: string) => {\n updateNodeData<TextToSpeechNodeData>(id, {\n provider: value as TTSProvider,\n });\n },\n [id, updateNodeData],\n );\n\n const handleVoiceChange = useCallback(\n (value: string) => {\n updateNodeData<TextToSpeechNodeData>(id, { voice: value as TTSVoice });\n },\n [id, updateNodeData],\n );\n\n const handleStabilityChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<TextToSpeechNodeData>(id, { stability: value });\n },\n [id, updateNodeData],\n );\n\n const handleSimilarityChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<TextToSpeechNodeData>(id, { similarityBoost: value });\n },\n [id, updateNodeData],\n );\n\n const handleSpeedChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<TextToSpeechNodeData>(id, { speed: value });\n },\n [id, updateNodeData],\n );\n\n const headerActions = useMemo(\n () =>\n nodeData.outputAudio ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleGenerate}\n disabled={nodeData.status === 'processing' || !canGenerate}\n title=\"Regenerate\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [nodeData.outputAudio, nodeData.status, canGenerate, handleGenerate],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"space-y-3\">\n {/* API Key Warning */}\n {!TTS_ENABLED && (\n <div className=\"flex items-start gap-2 p-2 bg-amber-500/10 border border-amber-500/30 rounded text-xs\">\n <AlertTriangle className=\"w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5\" />\n <div className=\"text-amber-500\">\n <p className=\"font-medium\">ElevenLabs not configured</p>\n <p className=\"text-amber-500/80 mt-0.5\">\n Set{' '}\n <code className=\"bg-amber-500/20 px-1 rounded\">\n ELEVENLABS_API_KEY\n </code>{' '}\n in API and{' '}\n <code className=\"bg-amber-500/20 px-1 rounded\">\n NEXT_PUBLIC_TTS_ENABLED=true\n </code>{' '}\n in web\n </p>\n </div>\n </div>\n )}\n\n {/* Provider Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Provider\n </label>\n <Select\n value={nodeData.provider}\n onValueChange={handleProviderChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PROVIDERS.map((provider) => (\n <SelectItem key={provider.value} value={provider.value}>\n {provider.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Voice Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Voice\n </label>\n <Select value={nodeData.voice} onValueChange={handleVoiceChange}>\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {VOICES.map((voice) => (\n <SelectItem key={voice.value} value={voice.value}>\n {voice.label} - {voice.description}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Stability Slider */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Stability: {Math.round(nodeData.stability * 100)}%\n </label>\n <Slider\n value={[nodeData.stability]}\n min={0}\n max={1}\n step={0.05}\n onValueChange={handleStabilityChange}\n className=\"nodrag w-full\"\n />\n <div className=\"flex justify-between text-[10px] text-[var(--muted-foreground)]\">\n <span>Variable</span>\n <span>Stable</span>\n </div>\n </div>\n\n {/* Similarity Boost Slider */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Clarity: {Math.round(nodeData.similarityBoost * 100)}%\n </label>\n <Slider\n value={[nodeData.similarityBoost]}\n min={0}\n max={1}\n step={0.05}\n onValueChange={handleSimilarityChange}\n className=\"nodrag w-full\"\n />\n <div className=\"flex justify-between text-[10px] text-[var(--muted-foreground)]\">\n <span>Low</span>\n <span>High</span>\n </div>\n </div>\n\n {/* Speed Slider */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Speed: {nodeData.speed.toFixed(1)}x\n </label>\n <Slider\n value={[nodeData.speed]}\n min={0.5}\n max={2}\n step={0.1}\n onValueChange={handleSpeedChange}\n className=\"nodrag w-full\"\n />\n </div>\n\n {/* Output Audio Player */}\n {nodeData.outputAudio && (\n <audio src={nodeData.outputAudio} controls className=\"w-full\" />\n )}\n\n {/* Generate Button */}\n {!nodeData.outputAudio && (\n <Button\n variant={canGenerate && TTS_ENABLED ? 'default' : 'secondary'}\n size=\"sm\"\n onClick={handleGenerate}\n disabled={\n !canGenerate || !TTS_ENABLED || nodeData.status === 'processing'\n }\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Volume2 className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Generating...'\n : 'Generate Speech'}\n </Button>\n )}\n\n {/* Help text for required input */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AudioLines className=\"w-3 h-3\" />\n Connect text input to generate speech\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const TextToSpeechNode = memo(TextToSpeechNodeComponent);\n","'use client';\n\nimport type { TranscribeLanguage, TranscribeNodeData } from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport {\n AlertCircle,\n Expand,\n FileText,\n Loader2,\n RefreshCw,\n} from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Checkbox } from '../../ui/checkbox';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { BaseNode } from '../BaseNode';\n\nconst LANGUAGES: { value: TranscribeLanguage; label: string }[] = [\n { label: 'Auto-detect', value: 'auto' },\n { label: 'English', value: 'en' },\n { label: 'Spanish', value: 'es' },\n { label: 'French', value: 'fr' },\n { label: 'German', value: 'de' },\n { label: 'Japanese', value: 'ja' },\n { label: 'Chinese', value: 'zh' },\n { label: 'Korean', value: 'ko' },\n { label: 'Portuguese', value: 'pt' },\n];\n\nfunction TranscribeNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as TranscribeNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n // Transcribe validates via useCanGenerate - needs video OR audio with data\n const { canGenerate } = useCanGenerate({\n nodeId: id,\n nodeType: type as 'transcribe',\n });\n\n const handleLanguageChange = useCallback(\n (value: string) => {\n updateNodeData<TranscribeNodeData>(id, {\n language: value as TranscribeLanguage,\n });\n },\n [id, updateNodeData],\n );\n\n const handleTimestampsChange = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<TranscribeNodeData>(id, { timestamps: checked });\n }\n },\n [id, updateNodeData],\n );\n\n const handleTranscribe = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const headerActions = useMemo(\n () =>\n nodeData.outputText ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [nodeData.outputText, handleExpand],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"space-y-3\">\n {/* Model Info */}\n <div className=\"text-xs text-[var(--muted-foreground)]\">\n Using: Whisper Large V3\n </div>\n\n {/* Language Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Language\n </label>\n <Select\n value={nodeData.language}\n onValueChange={handleLanguageChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {LANGUAGES.map((lang) => (\n <SelectItem key={lang.value} value={lang.value}>\n {lang.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Timestamps Toggle */}\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`timestamps-${id}`}\n checked={nodeData.timestamps}\n onCheckedChange={handleTimestampsChange}\n />\n <label\n htmlFor={`timestamps-${id}`}\n className=\"text-xs text-[var(--muted-foreground)] cursor-pointer\"\n >\n Include timestamps\n </label>\n </div>\n\n {/* Output Transcript */}\n {nodeData.outputText && (\n <div className=\"relative\">\n <div className=\"p-2 bg-[var(--background)] border border-[var(--border)] rounded text-sm max-h-32 overflow-y-auto whitespace-pre-wrap\">\n {nodeData.outputText}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleTranscribe}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Transcribe Button */}\n {!nodeData.outputText && (\n <Button\n variant={canGenerate ? 'default' : 'secondary'}\n size=\"sm\"\n onClick={handleTranscribe}\n disabled={!canGenerate || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <FileText className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Transcribing...'\n : 'Transcribe'}\n </Button>\n )}\n\n {/* Help text for required inputs */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Connect video or audio to transcribe\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const TranscribeNode = memo(TranscribeNodeComponent);\n","'use client';\n\nimport type { VideoGenNodeData, VideoModel } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { AlertCircle, Video } from 'lucide-react';\nimport { memo, useCallback, useMemo, useState } from 'react';\nimport { useAIGenNode } from '../../hooks/useAIGenNode';\nimport { useAIGenNodeHeader } from '../../hooks/useAIGenNodeHeader';\nimport { useAutoLoadModelSchema } from '../../hooks/useAutoLoadModelSchema';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useModelSelection } from '../../hooks/useModelSelection';\nimport { useNodeExecution } from '../../hooks/useNodeExecution';\nimport {\n DEFAULT_VIDEO_MODEL,\n VIDEO_MODEL_ID_MAP,\n VIDEO_MODEL_MAP,\n VIDEO_MODELS,\n} from '../../lib/models/registry';\nimport { useWorkflowUIConfig } from '../../provider';\nimport { useUIStore } from '../../stores/uiStore';\nimport { BaseNode } from '../BaseNode';\nimport { ProcessingOverlay } from '../ProcessingOverlay';\nimport { SchemaInputs } from '../SchemaInputs';\n\nfunction VideoGenNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as VideoGenNodeData;\n const { ModelBrowserModal } = useWorkflowUIConfig();\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { handleGenerate, handleStop } = useNodeExecution(id);\n const { canGenerate } = useCanGenerate({\n inputSchema: nodeData.selectedModel?.inputSchema as\n | Record<string, unknown>\n | undefined,\n nodeId: id,\n nodeType: type as 'videoGen',\n schemaParams: nodeData.schemaParams,\n });\n\n const [isModelBrowserOpen, setIsModelBrowserOpen] = useState(false);\n\n // Use shared hook for model selection\n const { handleModelSelect } = useModelSelection<VideoModel, VideoGenNodeData>(\n {\n fallbackModel: DEFAULT_VIDEO_MODEL,\n modelMap: VIDEO_MODEL_MAP,\n nodeId: id,\n },\n );\n\n // Auto-load schema for default model if selectedModel is not set\n useAutoLoadModelSchema({\n currentModel: nodeData.model,\n modelIdMap: VIDEO_MODEL_ID_MAP,\n onModelSelect: handleModelSelect,\n selectedModel: nodeData.selectedModel,\n });\n\n // Shared schema/enum/image-support logic\n const {\n schemaProperties,\n enumValues,\n modelSupportsImageInput,\n handleSchemaParamChange,\n componentSchemas,\n } = useAIGenNode<VideoGenNodeData>({\n nodeId: id,\n schemaParams: nodeData.schemaParams,\n selectedModel: nodeData.selectedModel,\n });\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const modelDisplayName = useMemo(\n () =>\n nodeData.selectedModel?.displayName ||\n VIDEO_MODELS.find((m) => m.value === nodeData.model)?.label ||\n nodeData.model,\n [nodeData.selectedModel?.displayName, nodeData.model],\n );\n\n const isProcessing = nodeData.status === 'processing';\n\n const handleModelBrowse = useCallback(() => setIsModelBrowserOpen(true), []);\n\n const { titleElement, headerActions } = useAIGenNodeHeader({\n canGenerate,\n hasOutput: !!nodeData.outputVideo,\n isProcessing,\n modelDisplayName,\n onExpand: handleExpand,\n onGenerate: handleGenerate,\n onModelBrowse: handleModelBrowse,\n onStop: handleStop,\n });\n\n // Determine which inputs to disable based on model support\n const disabledInputs = useMemo(() => {\n if (modelSupportsImageInput) return undefined;\n return ['image', 'lastFrame'];\n }, [modelSupportsImageInput]);\n\n return (\n <BaseNode\n {...props}\n titleElement={titleElement}\n headerActions={headerActions}\n hideStatusIndicator\n disabledInputs={disabledInputs}\n >\n <div className=\"flex-1 flex flex-col gap-3 min-h-0\">\n {/* Dynamic Schema Inputs */}\n {schemaProperties && (\n <SchemaInputs\n schema={schemaProperties}\n values={nodeData.schemaParams ?? {}}\n onChange={handleSchemaParamChange}\n enumValues={enumValues}\n componentSchemas={componentSchemas}\n disabled={nodeData.status === 'processing'}\n />\n )}\n\n {/* Hint when model doesn't support image input */}\n {!modelSupportsImageInput && nodeData.inputImage && (\n <div className=\"text-xs text-amber-500 flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n This model doesn&apos;t use image inputs\n </div>\n )}\n\n {/* Output Preview */}\n {nodeData.outputVideo ? (\n <div className=\"relative aspect-video w-full rounded-md overflow-hidden bg-black/20\">\n <video\n src={nodeData.outputVideo}\n className=\"absolute inset-0 w-full h-full object-contain cursor-pointer\"\n controls\n />\n {/* Processing overlay spinner */}\n {nodeData.status === 'processing' && (\n <ProcessingOverlay onStop={handleStop} />\n )}\n </div>\n ) : (\n <div className=\"relative flex aspect-video w-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border/50 bg-secondary/20\">\n <Video className=\"h-6 w-6 text-muted-foreground/50\" />\n {nodeData.status === 'processing' && (\n <ProcessingOverlay onStop={handleStop} />\n )}\n </div>\n )}\n\n {/* Help text for required inputs */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Connect a prompt to generate\n </div>\n )}\n </div>\n\n {/* Model Browser Modal */}\n {ModelBrowserModal && (\n <ModelBrowserModal\n isOpen={isModelBrowserOpen}\n onClose={() => setIsModelBrowserOpen(false)}\n onSelect={handleModelSelect}\n capabilities={['text-to-video', 'image-to-video']}\n title=\"Select Video Model\"\n />\n )}\n </BaseNode>\n );\n}\n\nexport const VideoGenNode = memo(VideoGenNodeComponent);\n","'use client';\n\nimport type { VoiceChangeNodeData } from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { AudioLines, Expand, Loader2, RefreshCw, Video } from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useCanGenerate } from '../../hooks/useCanGenerate';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Checkbox } from '../../ui/checkbox';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nfunction VoiceChangeNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as VoiceChangeNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { canGenerate } = useCanGenerate({\n nodeId: id,\n nodeType: type as 'voiceChange',\n });\n\n const handlePreserveOriginalChange = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<VoiceChangeNodeData>(id, {\n preserveOriginalAudio: checked,\n });\n }\n },\n [id, updateNodeData],\n );\n\n const handleMixLevelChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<VoiceChangeNodeData>(id, { audioMixLevel: value });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const headerActions = useMemo(\n () =>\n nodeData.outputVideo ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [nodeData.outputVideo, handleExpand],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"space-y-3\">\n {/* Preserve Original Audio Toggle */}\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`preserve-${id}`}\n checked={nodeData.preserveOriginalAudio}\n onCheckedChange={handlePreserveOriginalChange}\n />\n <label\n htmlFor={`preserve-${id}`}\n className=\"text-xs text-[var(--muted-foreground)] cursor-pointer\"\n >\n Mix with original audio\n </label>\n </div>\n\n {/* Audio Mix Level (only when preserving original) */}\n {nodeData.preserveOriginalAudio && (\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Mix Level: {Math.round(nodeData.audioMixLevel * 100)}%\n </label>\n <Slider\n value={[nodeData.audioMixLevel]}\n min={0}\n max={1}\n step={0.05}\n onValueChange={handleMixLevelChange}\n className=\"nodrag w-full\"\n />\n <div className=\"flex justify-between text-[10px] text-[var(--muted-foreground)]\">\n <span>Original</span>\n <span>New</span>\n </div>\n </div>\n )}\n\n {/* Output Video Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n controls\n className=\"w-full rounded border border-[var(--border)]\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing' || !canGenerate}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputVideo && (\n <Button\n variant={canGenerate ? 'default' : 'secondary'}\n size=\"sm\"\n onClick={handleProcess}\n disabled={!canGenerate || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Video className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Processing...'\n : nodeData.preserveOriginalAudio\n ? 'Mix Audio'\n : 'Replace Audio'}\n </Button>\n )}\n\n {/* Help text for required inputs */}\n {!canGenerate && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AudioLines className=\"w-3 h-3\" />\n Connect video + new audio\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const VoiceChangeNode = memo(VoiceChangeNodeComponent);\n","'use client';\n\nimport type { HandleType, WorkflowInputNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { memo, useCallback } from 'react';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Checkbox } from '../../ui/checkbox';\nimport { Label } from '../../ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { BaseNode } from '../BaseNode';\n\nconst INPUT_TYPES: { value: HandleType; label: string }[] = [\n { label: 'Image', value: 'image' },\n { label: 'Video', value: 'video' },\n { label: 'Text', value: 'text' },\n { label: 'Audio', value: 'audio' },\n { label: 'Number', value: 'number' },\n];\n\nfunction WorkflowInputNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as WorkflowInputNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n\n const handleNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<WorkflowInputNodeData>(id, {\n inputName: e.target.value,\n label: `Input: ${e.target.value}`,\n });\n },\n [id, updateNodeData],\n );\n\n const handleTypeChange = useCallback(\n (value: string) => {\n updateNodeData<WorkflowInputNodeData>(id, {\n inputType: value as HandleType,\n });\n },\n [id, updateNodeData],\n );\n\n const handleRequiredChange = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<WorkflowInputNodeData>(id, {\n required: checked,\n });\n }\n },\n [id, updateNodeData],\n );\n\n const handleDescriptionChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<WorkflowInputNodeData>(id, {\n description: e.target.value,\n });\n },\n [id, updateNodeData],\n );\n\n return (\n <BaseNode {...props}>\n <div className=\"flex flex-col gap-3\">\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1.5 text-center\">\n Defines an input port when this workflow is used as a subworkflow\n </div>\n\n {/* Input Name */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Input Name</Label>\n <input\n type=\"text\"\n value={nodeData.inputName || 'input'}\n onChange={handleNameChange}\n placeholder=\"Enter input name...\"\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n\n {/* Input Type */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Data Type</Label>\n <Select\n value={nodeData.inputType || 'image'}\n onValueChange={handleTypeChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {INPUT_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {type.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Required Checkbox */}\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`required-${id}`}\n checked={nodeData.required ?? true}\n onCheckedChange={handleRequiredChange}\n />\n <Label htmlFor={`required-${id}`} className=\"text-xs cursor-pointer\">\n Required input\n </Label>\n </div>\n\n {/* Description */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Description (optional)</Label>\n <input\n type=\"text\"\n value={nodeData.description || ''}\n onChange={handleDescriptionChange}\n placeholder=\"Describe this input...\"\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n\n {/* Current Type Indicator */}\n <div className=\"mt-1 text-[10px] text-muted-foreground text-center\">\n Output type:{' '}\n <span className=\"font-medium capitalize\">\n {nodeData.inputType || 'image'}\n </span>\n </div>\n </div>\n </BaseNode>\n );\n}\n\nexport const WorkflowInputNode = memo(WorkflowInputNodeComponent);\n","'use client';\n\nimport type { HandleType, WorkflowOutputNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport Image from 'next/image';\nimport { memo, useCallback, useRef, useState } from 'react';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Label } from '../../ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { BaseNode } from '../BaseNode';\n\nconst OUTPUT_TYPES: { value: HandleType; label: string }[] = [\n { label: 'Image', value: 'image' },\n { label: 'Video', value: 'video' },\n { label: 'Text', value: 'text' },\n { label: 'Audio', value: 'audio' },\n { label: 'Number', value: 'number' },\n];\n\nfunction WorkflowOutputNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as WorkflowOutputNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n\n const handleNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<WorkflowOutputNodeData>(id, {\n label: `Output: ${e.target.value}`,\n outputName: e.target.value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleTypeChange = useCallback(\n (value: string) => {\n updateNodeData<WorkflowOutputNodeData>(id, {\n outputType: value as HandleType,\n });\n },\n [id, updateNodeData],\n );\n\n const handleDescriptionChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<WorkflowOutputNodeData>(id, {\n description: e.target.value,\n });\n },\n [id, updateNodeData],\n );\n\n const togglePlayback = useCallback(() => {\n if (!videoRef.current) return;\n if (isPlaying) {\n videoRef.current.pause();\n } else {\n videoRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }, [isPlaying]);\n\n const outputType = nodeData.outputType || 'image';\n const hasValue = !!nodeData.inputValue;\n\n return (\n <BaseNode {...props}>\n <div className=\"flex flex-col gap-3\">\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1.5 text-center\">\n Defines an output port when this workflow is used as a subworkflow\n </div>\n\n {/* Output Name */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Output Name</Label>\n <input\n type=\"text\"\n value={nodeData.outputName || 'output'}\n onChange={handleNameChange}\n placeholder=\"Enter output name...\"\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n\n {/* Output Type */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Data Type</Label>\n <Select value={outputType} onValueChange={handleTypeChange}>\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {OUTPUT_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {type.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Description */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Description (optional)</Label>\n <input\n type=\"text\"\n value={nodeData.description || ''}\n onChange={handleDescriptionChange}\n placeholder=\"Describe this output...\"\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n\n {/* Preview of connected value */}\n {hasValue && (\n <div className=\"mt-1\">\n <Label className=\"text-xs text-muted-foreground\">\n Connected Value:\n </Label>\n {outputType === 'image' && (\n <Image\n src={nodeData.inputValue as string}\n alt=\"Output preview\"\n width={200}\n height={128}\n className=\"mt-1 h-24 w-full rounded-md object-cover\"\n unoptimized\n />\n )}\n {outputType === 'video' && (\n <video\n ref={videoRef}\n src={nodeData.inputValue as string}\n className=\"mt-1 h-24 w-full rounded-md object-cover cursor-pointer\"\n onClick={togglePlayback}\n onEnded={() => setIsPlaying(false)}\n loop\n muted\n />\n )}\n {outputType === 'text' && (\n <div className=\"mt-1 p-2 bg-secondary/50 rounded text-xs max-h-20 overflow-auto\">\n {String(nodeData.inputValue).substring(0, 200)}\n {String(nodeData.inputValue).length > 200 && '...'}\n </div>\n )}\n {outputType === 'audio' && (\n <audio\n src={nodeData.inputValue as string}\n controls\n className=\"mt-1 w-full h-8\"\n />\n )}\n {outputType === 'number' && (\n <div className=\"mt-1 p-2 bg-secondary/50 rounded text-sm font-mono\">\n {String(nodeData.inputValue)}\n </div>\n )}\n </div>\n )}\n\n {!hasValue && (\n <div className=\"mt-1 text-[10px] text-muted-foreground text-center\">\n Connect an input to define the workflow output\n </div>\n )}\n\n {/* Current Type Indicator */}\n <div className=\"text-[10px] text-muted-foreground text-center\">\n Input type:{' '}\n <span className=\"font-medium capitalize\">{outputType}</span>\n </div>\n </div>\n </BaseNode>\n );\n}\n\nexport const WorkflowOutputNode = memo(WorkflowOutputNodeComponent);\n","'use client';\n\nimport type {\n HandleDefinition,\n WorkflowInterface,\n WorkflowRefNodeData,\n} from '@genfeedai/types';\nimport { Handle, type NodeProps, Position } from '@xyflow/react';\nimport { clsx } from 'clsx';\nimport {\n AlertCircle,\n CheckCircle2,\n GitBranch,\n Loader2,\n RefreshCw,\n} from 'lucide-react';\nimport { memo, useCallback, useEffect, useState } from 'react';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Label } from '../../ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\n\n// Handle color CSS variables (used inline for guaranteed override)\nconst HANDLE_COLORS: Record<string, string> = {\n audio: 'var(--handle-audio)',\n image: 'var(--handle-image)',\n number: 'var(--handle-number)',\n text: 'var(--handle-text)',\n video: 'var(--handle-video)',\n};\n\nexport interface ReferencableWorkflow {\n _id: string;\n name: string;\n description?: string;\n interface: WorkflowInterface;\n}\n\n/**\n * API adapter for WorkflowRefNode.\n * Host apps must call `setWorkflowRefApi()` to provide implementations.\n */\nexport interface WorkflowRefApi {\n fetchReferencableWorkflows: (\n excludeId?: string | null,\n signal?: AbortSignal,\n ) => Promise<ReferencableWorkflow[]>;\n validateReference: (\n parentWorkflowId: string,\n childWorkflowId: string,\n ) => Promise<void>;\n fetchWorkflowInterface: (workflowId: string) => Promise<WorkflowInterface>;\n}\n\nconst noopApi: WorkflowRefApi = {\n fetchReferencableWorkflows: async () => {\n console.warn(\n '[workflow-ui] WorkflowRefApi not configured: fetchReferencableWorkflows',\n );\n return [];\n },\n fetchWorkflowInterface: async () => {\n console.warn(\n '[workflow-ui] WorkflowRefApi not configured: fetchWorkflowInterface',\n );\n return { inputs: [], outputs: [] } as WorkflowInterface;\n },\n validateReference: async () => {\n console.warn(\n '[workflow-ui] WorkflowRefApi not configured: validateReference',\n );\n },\n};\n\nlet workflowRefApi: WorkflowRefApi = noopApi;\n\n/** Host apps call this to wire up the API layer for WorkflowRefNode. */\nexport function setWorkflowRefApi(api: WorkflowRefApi): void {\n workflowRefApi = api;\n}\n\nfunction WorkflowRefNodeComponent(props: NodeProps) {\n const { id, data, selected } = props;\n const nodeData = data as WorkflowRefNodeData;\n const { updateNodeData, workflowId: currentWorkflowId } = useWorkflowStore();\n const [workflows, setWorkflows] = useState<ReferencableWorkflow[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Fetch referencable workflows on mount\n useEffect(() => {\n const controller = new AbortController();\n\n async function fetchWorkflows() {\n setIsLoading(true);\n setError(null);\n try {\n const response = await workflowRefApi.fetchReferencableWorkflows(\n currentWorkflowId,\n controller.signal,\n );\n setWorkflows(response);\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n setError('Failed to load workflows');\n }\n } finally {\n setIsLoading(false);\n }\n }\n\n fetchWorkflows();\n return () => controller.abort();\n }, [currentWorkflowId]);\n\n const handleWorkflowChange = useCallback(\n async (selectedId: string) => {\n if (!selectedId || selectedId === 'none') {\n updateNodeData<WorkflowRefNodeData>(id, {\n cachedInterface: null,\n inputMappings: {},\n outputMappings: {},\n referencedWorkflowId: null,\n referencedWorkflowName: null,\n });\n return;\n }\n\n const selectedWorkflow = workflows.find((w) => w._id === selectedId);\n if (!selectedWorkflow) return;\n\n // Validate reference (check for circular dependency)\n if (currentWorkflowId) {\n try {\n await workflowRefApi.validateReference(currentWorkflowId, selectedId);\n } catch (err) {\n setError((err as Error).message || 'Circular reference detected');\n return;\n }\n }\n\n // Initialize empty input mappings for each input\n const inputMappings: Record<string, string | null> = {};\n for (const input of selectedWorkflow.interface.inputs) {\n inputMappings[input.name] = null;\n }\n\n // Initialize empty output mappings for each output\n const outputMappings: Record<string, string | null> = {};\n for (const output of selectedWorkflow.interface.outputs) {\n outputMappings[output.name] = null;\n }\n\n updateNodeData<WorkflowRefNodeData>(id, {\n cachedInterface: selectedWorkflow.interface,\n inputMappings,\n label: `Subworkflow: ${selectedWorkflow.name}`,\n outputMappings,\n referencedWorkflowId: selectedId,\n referencedWorkflowName: selectedWorkflow.name,\n });\n setError(null);\n },\n [id, updateNodeData, workflows, currentWorkflowId],\n );\n\n const handleRefreshInterface = useCallback(async () => {\n if (!nodeData.referencedWorkflowId) return;\n\n setIsLoading(true);\n try {\n const response = await workflowRefApi.fetchWorkflowInterface(\n nodeData.referencedWorkflowId,\n );\n\n // Update input mappings to include any new inputs\n const inputMappings: Record<string, string | null> = {\n ...nodeData.inputMappings,\n };\n for (const input of response.inputs) {\n if (!(input.name in inputMappings)) {\n inputMappings[input.name] = null;\n }\n }\n\n // Update output mappings\n const outputMappings: Record<string, string | null> = {\n ...nodeData.outputMappings,\n };\n for (const output of response.outputs) {\n if (!(output.name in outputMappings)) {\n outputMappings[output.name] = null;\n }\n }\n\n updateNodeData<WorkflowRefNodeData>(id, {\n cachedInterface: response,\n inputMappings,\n outputMappings,\n });\n } catch (err) {\n setError((err as Error).message || 'Failed to refresh interface');\n } finally {\n setIsLoading(false);\n }\n }, [\n id,\n nodeData.referencedWorkflowId,\n nodeData.inputMappings,\n nodeData.outputMappings,\n updateNodeData,\n ]);\n\n // Build dynamic input handles from cached interface\n const inputHandles: HandleDefinition[] = (\n nodeData.cachedInterface?.inputs ?? []\n ).map((input) => ({\n id: input.name,\n label: input.name,\n required: input.required,\n type: input.type,\n }));\n\n // Build dynamic output handles from cached interface\n const outputHandles: HandleDefinition[] = (\n nodeData.cachedInterface?.outputs ?? []\n ).map((output) => ({\n id: output.name,\n label: output.name,\n type: output.type,\n }));\n\n const isSelected = selected;\n const hasWorkflow = !!nodeData.referencedWorkflowId;\n const isProcessing = nodeData.status === 'processing';\n\n return (\n <div\n className={clsx(\n 'relative min-w-[220px] rounded-lg border shadow-lg transition-all',\n 'border-[var(--category-composition)] bg-card',\n isSelected && 'ring-1',\n isProcessing && 'node-processing',\n )}\n style={\n {\n '--node-color': 'var(--category-composition)',\n ...(isSelected && {\n '--tw-ring-color': 'var(--category-composition)',\n }),\n } as React.CSSProperties\n }\n >\n {/* Dynamic Input Handles */}\n {inputHandles.map((input, index) => (\n <Handle\n key={input.id}\n type=\"target\"\n position={Position.Left}\n id={input.id}\n className=\"!w-3 !h-3\"\n style={{\n background: HANDLE_COLORS[input.type],\n top: `${((index + 1) / (inputHandles.length + 1)) * 100}%`,\n }}\n title={`${input.label} (${input.type})${input.required ? ' - required' : ''}`}\n />\n ))}\n\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-2.5 border-b border-border\">\n <GitBranch className=\"h-4 w-4 text-foreground\" />\n <span className=\"flex-1 truncate text-sm font-medium text-foreground\">\n {nodeData.label || 'Subworkflow'}\n </span>\n {isProcessing && (\n <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n )}\n {nodeData.status === 'complete' && (\n <CheckCircle2 className=\"h-4 w-4 text-chart-2\" />\n )}\n {nodeData.status === 'error' && (\n <AlertCircle className=\"h-4 w-4 text-destructive\" />\n )}\n </div>\n\n {/* Content */}\n <div className=\"p-3 space-y-3\">\n {/* Workflow Selector */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Referenced Workflow</Label>\n <Select\n value={nodeData.referencedWorkflowId || 'none'}\n onValueChange={handleWorkflowChange}\n disabled={isLoading}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue placeholder=\"Select a workflow...\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">Select a workflow...</SelectItem>\n {workflows.map((workflow) => (\n <SelectItem key={workflow._id} value={workflow._id}>\n {workflow.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Loading/Error State */}\n {isLoading && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n Loading...\n </div>\n )}\n\n {error && (\n <div className=\"text-xs text-destructive bg-destructive/10 rounded px-2 py-1\">\n {error}\n </div>\n )}\n\n {/* Interface Summary */}\n {hasWorkflow && nodeData.cachedInterface && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-muted-foreground font-medium\">\n Interface\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleRefreshInterface}\n disabled={isLoading}\n title=\"Refresh interface\"\n >\n <RefreshCw\n className={clsx('h-3 w-3', isLoading && 'animate-spin')}\n />\n </Button>\n </div>\n\n {/* Inputs */}\n {nodeData.cachedInterface.inputs.length > 0 && (\n <div className=\"text-[10px]\">\n <span className=\"text-muted-foreground\">Inputs: </span>\n {nodeData.cachedInterface.inputs.map((input, i) => (\n <span key={input.nodeId}>\n <span className=\"text-foreground\">\n {input.name}\n <span className=\"text-muted-foreground\">\n :{input.type}\n </span>\n {input.required && (\n <span className=\"text-destructive\">*</span>\n )}\n </span>\n {i < nodeData.cachedInterface!.inputs.length - 1 && ', '}\n </span>\n ))}\n </div>\n )}\n\n {/* Outputs */}\n {nodeData.cachedInterface.outputs.length > 0 && (\n <div className=\"text-[10px]\">\n <span className=\"text-muted-foreground\">Outputs: </span>\n {nodeData.cachedInterface.outputs.map((output, i) => (\n <span key={output.nodeId}>\n <span className=\"text-foreground\">\n {output.name}\n <span className=\"text-muted-foreground\">\n :{output.type}\n </span>\n </span>\n {i < nodeData.cachedInterface!.outputs.length - 1 && ', '}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* No workflows available message */}\n {!isLoading && workflows.length === 0 && (\n <div className=\"text-[10px] text-muted-foreground text-center py-2\">\n No reusable workflows found. Create a workflow with\n WorkflowInput/Output nodes first.\n </div>\n )}\n\n {/* Child execution info */}\n {nodeData.childExecutionId && (\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1\">\n Child execution: {nodeData.childExecutionId.substring(0, 8)}...\n </div>\n )}\n\n {/* Error message */}\n {nodeData.error && (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 p-2\">\n <p className=\"text-xs text-destructive\">{nodeData.error}</p>\n </div>\n )}\n </div>\n\n {/* Dynamic Output Handles */}\n {outputHandles.map((output, index) => (\n <Handle\n key={output.id}\n type=\"source\"\n position={Position.Right}\n id={output.id}\n className=\"!w-3 !h-3\"\n style={{\n background: HANDLE_COLORS[output.type],\n top: `${((index + 1) / (outputHandles.length + 1)) * 100}%`,\n }}\n title={`${output.label} (${output.type})`}\n />\n ))}\n </div>\n );\n}\n\nexport const WorkflowRefNode = memo(WorkflowRefNodeComponent);\n","'use client';\n\nimport type { AudioInputNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand, Link, Music, Upload, X } from 'lucide-react';\nimport { memo, useCallback, useMemo, useRef, useState } from 'react';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\n\nfunction AudioInputNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as AudioInputNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [showUrlInput, setShowUrlInput] = useState(false);\n const [urlValue, setUrlValue] = useState(nodeData.url || '');\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n const audio = document.createElement('audio');\n audio.onloadedmetadata = () => {\n updateNodeData<AudioInputNodeData>(id, {\n audio: event.target?.result as string,\n duration: audio.duration,\n filename: file.name,\n source: 'upload',\n });\n };\n audio.src = event.target?.result as string;\n };\n reader.readAsDataURL(file);\n },\n [id, updateNodeData],\n );\n\n const handleRemoveAudio = useCallback(() => {\n updateNodeData<AudioInputNodeData>(id, {\n audio: null,\n duration: null,\n filename: null,\n url: undefined,\n });\n setUrlValue('');\n }, [id, updateNodeData]);\n\n const handleUrlSubmit = useCallback(() => {\n if (!urlValue.trim()) return;\n\n // Create an audio element to validate and get duration\n const audio = document.createElement('audio');\n audio.crossOrigin = 'anonymous';\n audio.onloadedmetadata = () => {\n updateNodeData<AudioInputNodeData>(id, {\n audio: urlValue,\n duration: audio.duration,\n filename: urlValue.split('/').pop() || 'url-audio',\n source: 'url',\n url: urlValue,\n });\n setShowUrlInput(false);\n };\n audio.onerror = () => {\n // Still set the URL even if we can't load it (might be CORS)\n updateNodeData<AudioInputNodeData>(id, {\n audio: urlValue,\n duration: null,\n filename: urlValue.split('/').pop() || 'url-audio',\n source: 'url',\n url: urlValue,\n });\n setShowUrlInput(false);\n };\n audio.src = urlValue;\n }, [id, updateNodeData, urlValue]);\n\n const handleUrlKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleUrlSubmit();\n } else if (e.key === 'Escape') {\n setShowUrlInput(false);\n setUrlValue(nodeData.url || '');\n }\n },\n [handleUrlSubmit, nodeData.url],\n );\n\n const formatDuration = (seconds: number | null) => {\n if (!seconds) return '';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n // Header actions - Upload, Link, and Expand buttons\n const headerActions = useMemo(\n () => (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => fileInputRef.current?.click()}\n title=\"Upload audio\"\n >\n <Upload className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setShowUrlInput(!showUrlInput)}\n title=\"Paste URL\"\n >\n <Link className=\"h-3.5 w-3.5\" />\n </Button>\n {nodeData.audio && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n ),\n [showUrlInput, nodeData.audio, handleExpand],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"audio/*\"\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n\n {/* URL Input (shown when link button clicked) */}\n {showUrlInput && (\n <div className=\"mb-3 flex gap-2\">\n <input\n type=\"url\"\n value={urlValue}\n onChange={(e) => setUrlValue(e.target.value)}\n onKeyDown={handleUrlKeyDown}\n placeholder=\"https://...\"\n className=\"nodrag nopan flex-1 h-7 px-2 text-xs rounded-md border border-border bg-background focus:outline-none focus:ring-1 focus:ring-primary\"\n />\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleUrlSubmit}\n disabled={!urlValue.trim()}\n className=\"h-7 px-2 text-xs\"\n >\n Load\n </Button>\n </div>\n )}\n\n {/* Audio Preview or Empty State */}\n {nodeData.audio ? (\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <audio src={nodeData.audio} controls className=\"w-full h-8\" />\n <Button\n variant=\"secondary\"\n size=\"icon-sm\"\n onClick={handleRemoveAudio}\n className=\"absolute -right-1 -top-1 h-5 w-5\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"text-[10px] text-muted-foreground truncate\">\n {nodeData.filename}\n {nodeData.duration && ` • ${formatDuration(nodeData.duration)}`}\n </div>\n </div>\n ) : (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"flex flex-1 min-h-16 w-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border/50 bg-secondary/20 transition-colors hover:border-primary/50 hover:bg-secondary/40\"\n >\n <Music className=\"h-5 w-5 text-muted-foreground/50\" />\n <span className=\"text-[10px] text-muted-foreground/70\">\n Drop or click\n </span>\n </button>\n )}\n </BaseNode>\n );\n}\n\nexport const AudioInputNode = memo(AudioInputNodeComponent);\n","'use client';\n\nimport type { ImageInputNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand, ImageIcon, Link, Loader2, Upload, X } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useMediaUpload } from '../../hooks/useMediaUpload';\nimport { getImageDimensions } from '../../lib/media';\nimport { useUIStore } from '../../stores/uiStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\n\nfunction ImageInputNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as ImageInputNodeData;\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n\n const {\n fileInputRef,\n showUrlInput,\n setShowUrlInput,\n urlValue,\n setUrlValue,\n isUploading,\n handleFileSelect,\n handleRemove,\n handleUrlSubmit,\n handleUrlKeyDown,\n } = useMediaUpload<ImageInputNodeData>({\n buildRemoveUpdate: () => ({\n dimensions: null,\n filename: null,\n image: null,\n url: undefined,\n }),\n buildUploadUpdate: (url, filename, metadata) => ({\n dimensions: metadata as { width: number; height: number },\n filename,\n image: url,\n source: 'upload' as const,\n }),\n buildUrlUpdate: (url, metadata) => ({\n dimensions: metadata as { width: number; height: number } | null,\n filename: url.split('/').pop() || 'url-image',\n image: url,\n source: 'url' as const,\n url,\n }),\n getMetadata: async (src) => {\n const dims = await getImageDimensions(src);\n return dims;\n },\n initialUrl: nodeData.url || '',\n mediaType: 'image',\n nodeId: id,\n });\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n // Header actions - Upload, Link, and Expand buttons\n const headerActions = useMemo(\n () => (\n <div className=\"flex items-center gap-1\">\n {nodeData.image && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => fileInputRef.current?.click()}\n title=\"Upload image\"\n >\n <Upload className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setShowUrlInput(!showUrlInput)}\n title=\"Paste URL\"\n >\n <Link className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n ),\n [nodeData.image, handleExpand, fileInputRef, showUrlInput, setShowUrlInput],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n\n {/* URL Input (shown when link button clicked) */}\n {showUrlInput && (\n <div className=\"mb-3 flex gap-2\">\n <input\n type=\"url\"\n value={urlValue}\n onChange={(e) => setUrlValue(e.target.value)}\n onKeyDown={handleUrlKeyDown}\n placeholder=\"https://...\"\n className=\"nodrag nopan flex-1 h-7 px-2 text-xs rounded-md border border-border bg-background focus:outline-none focus:ring-1 focus:ring-primary\"\n />\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleUrlSubmit}\n disabled={!urlValue.trim()}\n className=\"h-7 px-2 text-xs\"\n >\n Load\n </Button>\n </div>\n )}\n\n {/* Image Preview or Empty State */}\n {nodeData.image ? (\n <div className=\"relative aspect-[4/3] w-full overflow-hidden rounded-md bg-black/20\">\n <Image\n src={nodeData.image}\n alt={nodeData.filename || 'Image'}\n fill\n sizes=\"300px\"\n className=\"object-contain cursor-pointer\"\n unoptimized\n />\n <Button\n variant=\"secondary\"\n size=\"icon-sm\"\n onClick={handleRemove}\n className=\"absolute right-1.5 top-1.5 h-5 w-5\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n {nodeData.dimensions && (\n <div className=\"absolute bottom-1 left-1 rounded bg-black/60 px-1.5 py-0.5 text-[10px]\">\n {nodeData.dimensions.width}x{nodeData.dimensions.height}\n </div>\n )}\n </div>\n ) : (\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={isUploading}\n className=\"flex aspect-[4/3] w-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border/50 bg-secondary/20 transition-colors hover:border-primary/50 hover:bg-secondary/40 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isUploading ? (\n <>\n <Loader2 className=\"h-5 w-5 text-muted-foreground/50 animate-spin\" />\n <span className=\"text-[10px] text-muted-foreground/70\">\n Uploading...\n </span>\n </>\n ) : (\n <>\n <ImageIcon className=\"h-5 w-5 text-muted-foreground/50\" />\n <span className=\"text-[10px] text-muted-foreground/70\">\n Drop or click\n </span>\n </>\n )}\n </button>\n )}\n </BaseNode>\n );\n}\n\nexport const ImageInputNode = memo(ImageInputNodeComponent);\n","'use client';\n\nimport type {\n AvailableVariable,\n PromptConstructorNodeData,\n PromptNodeData,\n} from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand } from 'lucide-react';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { usePromptAutocomplete } from '../../hooks/usePromptAutocomplete';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\n\nfunction PromptConstructorNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as PromptConstructorNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const edges = useWorkflowStore((state) => state.edges);\n const nodes = useWorkflowStore((state) => state.nodes);\n\n // Local state for template to prevent cursor jumping\n const [localTemplate, setLocalTemplate] = useState(nodeData.template);\n const [isEditing, setIsEditing] = useState(false);\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Sync from props when not actively editing\n useEffect(() => {\n if (!isEditing) {\n setLocalTemplate(nodeData.template);\n }\n }, [nodeData.template, isEditing]);\n\n // Get available variables from connected prompt nodes\n const availableVariables = useMemo((): AvailableVariable[] => {\n const connectedPromptNodes = edges\n .filter((e) => e.target === id && e.targetHandle === 'text')\n .map((e) => nodes.find((n) => n.id === e.source))\n .filter(\n (n): n is (typeof nodes)[0] => n !== undefined && n.type === 'prompt',\n );\n\n const vars: AvailableVariable[] = [];\n connectedPromptNodes.forEach((promptNode) => {\n const promptData = promptNode.data as PromptNodeData;\n const variableName = (promptData as Record<string, unknown>)\n .variableName as string | undefined;\n if (variableName) {\n vars.push({\n name: variableName,\n nodeId: promptNode.id,\n value: promptData.prompt || '',\n });\n }\n });\n\n return vars;\n }, [edges, nodes, id]);\n\n // Autocomplete via shared hook\n const {\n showAutocomplete,\n autocompletePosition,\n filteredAutocompleteVars,\n selectedAutocompleteIndex,\n handleChange,\n handleKeyDown,\n handleAutocompleteSelect,\n closeAutocomplete,\n } = usePromptAutocomplete({\n availableVariables,\n localTemplate,\n onTemplateCommit: (newTemplate) =>\n updateNodeData<PromptConstructorNodeData>(id, { template: newTemplate }),\n setLocalTemplate,\n textareaRef,\n });\n\n // Compute unresolved variables client-side\n const unresolvedVars = useMemo(() => {\n const varPattern = /@(\\w+)/g;\n const unresolved: string[] = [];\n const matches = localTemplate.matchAll(varPattern);\n const availableNames = new Set(availableVariables.map((v) => v.name));\n\n for (const match of matches) {\n const varName = match[1];\n if (!availableNames.has(varName) && !unresolved.includes(varName)) {\n unresolved.push(varName);\n }\n }\n\n return unresolved;\n }, [localTemplate, availableVariables]);\n\n // Compute resolved text client-side for preview\n const resolvedPreview = useMemo(() => {\n let resolved = localTemplate;\n availableVariables.forEach((v) => {\n resolved = resolved.replace(new RegExp(`@${v.name}`, 'g'), v.value);\n });\n return resolved;\n }, [localTemplate, availableVariables]);\n\n // Sync resolved text to outputText so downstream nodes can read it before execution\n useEffect(() => {\n let resolved = nodeData.template;\n availableVariables.forEach((v) => {\n resolved = resolved.replace(new RegExp(`@${v.name}`, 'g'), v.value);\n });\n const outputValue = resolved || null;\n if (outputValue !== nodeData.outputText) {\n updateNodeData<PromptConstructorNodeData>(id, {\n outputText: outputValue,\n });\n }\n }, [\n nodeData.template,\n availableVariables,\n id,\n updateNodeData,\n nodeData.outputText,\n ]);\n\n const handleFocus = useCallback(() => {\n setIsEditing(true);\n }, []);\n\n const handleBlur = useCallback(() => {\n setIsEditing(false);\n if (localTemplate !== nodeData.template) {\n updateNodeData<PromptConstructorNodeData>(id, {\n template: localTemplate,\n });\n }\n setTimeout(() => closeAutocomplete(), 200);\n }, [id, localTemplate, nodeData.template, updateNodeData, closeAutocomplete]);\n\n const headerActions = (\n <Button variant=\"ghost\" size=\"icon-sm\" title=\"Expand editor\">\n <Expand className=\"w-3.5 h-3.5\" />\n </Button>\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"relative flex flex-col gap-2 flex-1\">\n {/* Warning badge for unresolved variables */}\n {unresolvedVars.length > 0 && (\n <div className=\"px-2 py-1 bg-amber-900/30 border border-amber-700/50 rounded text-[10px] text-amber-400\">\n <span className=\"font-semibold\">Unresolved:</span>{' '}\n {unresolvedVars.map((v) => `@${v}`).join(', ')}\n </div>\n )}\n\n {/* Template textarea with autocomplete */}\n <div className=\"relative flex-1 flex flex-col\">\n <textarea\n ref={textareaRef}\n value={localTemplate}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder=\"Type @ to insert variables...\"\n className=\"nodrag nopan nowheel w-full flex-1 min-h-[70px] px-2 py-1.5 text-sm bg-background border border-border rounded resize-none focus:outline-none focus:ring-1 focus:ring-primary placeholder:text-muted-foreground\"\n title={resolvedPreview ? `Preview: ${resolvedPreview}` : undefined}\n />\n\n {/* Autocomplete dropdown */}\n {showAutocomplete && filteredAutocompleteVars.length > 0 && (\n <div\n className=\"absolute z-10 bg-popover border border-border rounded shadow-xl max-h-40 overflow-y-auto\"\n style={{\n left: autocompletePosition.left,\n top: autocompletePosition.top,\n }}\n >\n {filteredAutocompleteVars.map((variable, index) => (\n <button\n key={variable.nodeId}\n onMouseDown={(e) => {\n e.preventDefault();\n handleAutocompleteSelect(variable.name);\n }}\n className={`w-full px-3 py-2 text-left text-[11px] flex flex-col gap-0.5 transition-colors ${\n index === selectedAutocompleteIndex\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:bg-accent'\n }`}\n >\n <div className=\"font-medium text-primary\">\n @{variable.name}\n </div>\n <div className=\"text-muted-foreground truncate max-w-[200px]\">\n {variable.value || '(empty)'}\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Available variables info */}\n {availableVariables.length > 0 && (\n <div className=\"text-[10px] text-muted-foreground px-2\">\n Available: {availableVariables.map((v) => `@${v.name}`).join(', ')}\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const PromptConstructorNode = memo(PromptConstructorNodeComponent);\n","'use client';\n\nimport type { IPrompt, PromptNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand, Save } from 'lucide-react';\nimport { memo, useCallback } from 'react';\nimport { useWorkflowUIConfig } from '../../provider';\nimport { usePromptEditorStore } from '../../stores/promptEditorStore';\nimport { usePromptLibraryStore } from '../../stores/promptLibraryStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\n\nfunction PromptNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as PromptNodeData;\n const { PromptPicker } = useWorkflowUIConfig();\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const { openCreateModal } = usePromptLibraryStore();\n const { openEditor } = usePromptEditorStore();\n\n const handlePromptChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n updateNodeData<PromptNodeData>(id, { prompt: e.target.value });\n },\n [id, updateNodeData],\n );\n\n const handleSelectFromLibrary = useCallback(\n (item: IPrompt) => {\n updateNodeData<PromptNodeData>(id, { prompt: item.promptText });\n },\n [id, updateNodeData],\n );\n\n const handleSaveToLibrary = useCallback(() => {\n if (!nodeData.prompt) return;\n openCreateModal({\n _id: '',\n category: 'custom' as never,\n createdAt: '',\n description: '',\n isDeleted: false,\n isFeatured: false,\n isSystem: false,\n name: '',\n promptText: nodeData.prompt,\n styleSettings: {},\n tags: [],\n updatedAt: '',\n useCount: 0,\n });\n }, [nodeData.prompt, openCreateModal]);\n\n const handleExpand = useCallback(() => {\n openEditor(id, nodeData.prompt ?? '');\n }, [id, nodeData.prompt, openEditor]);\n\n const titleElement = PromptPicker ? (\n <PromptPicker onSelect={handleSelectFromLibrary} label=\"Prompt\" />\n ) : (\n <span className=\"text-xs font-medium\">Prompt</span>\n );\n\n const headerActions = (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand editor\"\n >\n <Expand className=\"w-3.5 h-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleSaveToLibrary}\n disabled={!nodeData.prompt}\n title=\"Save to library\"\n >\n <Save className=\"w-3.5 h-3.5\" />\n </Button>\n </>\n );\n\n return (\n <BaseNode\n {...props}\n titleElement={titleElement}\n headerActions={headerActions}\n >\n <textarea\n value={nodeData.prompt || ''}\n onChange={handlePromptChange}\n placeholder=\"Enter your prompt...\"\n className=\"nodrag nopan w-full flex-1 min-h-[80px] px-2 py-1.5 text-sm bg-background border border-border rounded resize-none focus:outline-none focus:ring-1 focus:ring-primary\"\n />\n </BaseNode>\n );\n}\n\nexport const PromptNode = memo(PromptNodeComponent);\n","'use client';\n\nimport type { VideoInputNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand, Link, Loader2, Upload, Video, X } from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useMediaUpload } from '../../hooks/useMediaUpload';\nimport { getVideoMetadata } from '../../lib/media';\nimport { useUIStore } from '../../stores/uiStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\n\nfunction VideoInputNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as VideoInputNodeData;\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n\n const {\n fileInputRef,\n showUrlInput,\n setShowUrlInput,\n urlValue,\n setUrlValue,\n isUploading,\n handleFileSelect,\n handleRemove,\n handleUrlSubmit,\n handleUrlKeyDown,\n } = useMediaUpload<VideoInputNodeData>({\n buildRemoveUpdate: () => ({\n dimensions: null,\n duration: null,\n filename: null,\n url: undefined,\n video: null,\n }),\n buildUploadUpdate: (url, filename, metadata) => {\n const meta = metadata as {\n duration: number;\n dimensions: { width: number; height: number };\n };\n return {\n dimensions: meta.dimensions,\n duration: meta.duration,\n filename,\n source: 'upload' as const,\n video: url,\n };\n },\n buildUrlUpdate: (url, metadata) => {\n if (metadata) {\n const meta = metadata as {\n duration: number;\n width: number;\n height: number;\n };\n return {\n dimensions: { height: meta.height, width: meta.width },\n duration: meta.duration,\n filename: url.split('/').pop() || 'url-video',\n source: 'url' as const,\n url,\n video: url,\n };\n }\n return {\n dimensions: null,\n duration: null,\n filename: url.split('/').pop() || 'url-video',\n source: 'url' as const,\n url,\n video: url,\n };\n },\n getMetadata: async (src) => {\n const meta = await getVideoMetadata(src);\n return meta;\n },\n initialUrl: nodeData.url || '',\n mediaType: 'video',\n nodeId: id,\n });\n\n const formatDuration = (seconds: number | null) => {\n if (!seconds) return '';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n // Header actions - Upload, Link, and Expand buttons\n const headerActions = useMemo(\n () => (\n <div className=\"flex items-center gap-1\">\n {nodeData.video && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => fileInputRef.current?.click()}\n title=\"Upload video\"\n >\n <Upload className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setShowUrlInput(!showUrlInput)}\n title=\"Paste URL\"\n >\n <Link className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n ),\n [nodeData.video, handleExpand, fileInputRef, showUrlInput, setShowUrlInput],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"video/*\"\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n\n {/* URL Input (shown when link button clicked) */}\n {showUrlInput && (\n <div className=\"mb-3 flex gap-2\">\n <input\n type=\"url\"\n value={urlValue}\n onChange={(e) => setUrlValue(e.target.value)}\n onKeyDown={handleUrlKeyDown}\n placeholder=\"https://...\"\n className=\"nodrag nopan flex-1 h-7 px-2 text-xs rounded-md border border-border bg-background focus:outline-none focus:ring-1 focus:ring-primary\"\n />\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleUrlSubmit}\n disabled={!urlValue.trim()}\n className=\"h-7 px-2 text-xs\"\n >\n Load\n </Button>\n </div>\n )}\n\n {/* Video Preview or Empty State */}\n {nodeData.video ? (\n <div className=\"relative max-h-32 overflow-hidden rounded-md bg-black/20\">\n <video\n src={nodeData.video}\n className=\"w-full h-auto max-h-32 object-contain cursor-pointer\"\n muted\n />\n <Button\n variant=\"secondary\"\n size=\"icon-sm\"\n onClick={handleRemove}\n className=\"absolute right-1.5 top-1.5 h-5 w-5\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n <div className=\"absolute bottom-1 left-1 rounded bg-black/60 px-1.5 py-0.5 text-[10px]\">\n {nodeData.dimensions &&\n `${nodeData.dimensions.width}x${nodeData.dimensions.height}`}\n {nodeData.duration && ` • ${formatDuration(nodeData.duration)}`}\n </div>\n </div>\n ) : (\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={isUploading}\n className=\"flex flex-1 min-h-16 w-full flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border/50 bg-secondary/20 transition-colors hover:border-primary/50 hover:bg-secondary/40 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isUploading ? (\n <>\n <Loader2 className=\"h-5 w-5 text-muted-foreground/50 animate-spin\" />\n <span className=\"text-[10px] text-muted-foreground/70\">\n Uploading...\n </span>\n </>\n ) : (\n <>\n <Video className=\"h-5 w-5 text-muted-foreground/50\" />\n <span className=\"text-[10px] text-muted-foreground/70\">\n Drop or click\n </span>\n </>\n )}\n </button>\n )}\n </BaseNode>\n );\n}\n\nexport const VideoInputNode = memo(VideoInputNodeComponent);\n","'use client';\n\nimport type {\n NodeType,\n PromptNodeData,\n WorkflowNodeData,\n} from '@genfeedai/types';\nimport { NODE_DEFINITIONS } from '@genfeedai/types';\nimport {\n ChevronLeft,\n ChevronRight,\n Download,\n X,\n ZoomIn,\n ZoomOut,\n} from 'lucide-react';\nimport Image from 'next/image';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { getMediaFromNode } from '../lib/mediaExtraction';\nimport { usePromptEditorStore } from '../stores/promptEditorStore';\nimport { useUIStore } from '../stores/uiStore';\nimport { useWorkflowStore } from '../stores/workflowStore';\nimport { Button } from '../ui/button';\n\n// Node types that should open the prompt editor instead of preview\nconst PROMPT_NODE_TYPES: NodeType[] = ['prompt'];\n\nexport function NodeDetailModal() {\n const {\n activeModal,\n nodeDetailNodeId,\n nodeDetailStartIndex,\n closeNodeDetailModal,\n } = useUIStore();\n const { getNodeById } = useWorkflowStore();\n const { openEditor } = usePromptEditorStore();\n\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });\n const [isPanning, setIsPanning] = useState(false);\n const [panStart, setPanStart] = useState({ x: 0, y: 0 });\n const [currentIndex, setCurrentIndex] = useState(0);\n\n // Get the node being displayed\n const node = useMemo(() => {\n if (!nodeDetailNodeId) return null;\n return getNodeById(nodeDetailNodeId);\n }, [nodeDetailNodeId, getNodeById]);\n\n // Redirect prompt-type nodes to the prompt editor\n useEffect(() => {\n if (activeModal !== 'nodeDetail' || !node) return;\n\n if (PROMPT_NODE_TYPES.includes(node.type as NodeType)) {\n const promptData = node.data as PromptNodeData;\n closeNodeDetailModal();\n openEditor(node.id, promptData.prompt ?? '');\n }\n }, [activeModal, node, closeNodeDetailModal, openEditor]);\n\n // Get media info\n const mediaInfo = useMemo(() => {\n if (!node) return { type: null, url: null };\n return getMediaFromNode(\n node.type as NodeType,\n node.data as WorkflowNodeData,\n );\n }, [node]);\n\n // Get node definition\n const nodeDef = useMemo(() => {\n if (!node) return null;\n return NODE_DEFINITIONS[node.type as NodeType];\n }, [node]);\n\n // Derive display URL and image count for pagination\n const imageUrls = mediaInfo.urls ?? [];\n const hasMultipleImages = imageUrls.length > 1;\n const displayUrl = hasMultipleImages\n ? (imageUrls[currentIndex] ?? mediaInfo.url)\n : mediaInfo.url;\n\n const goToPrevious = useCallback(() => {\n setCurrentIndex((prev) => Math.max(prev - 1, 0));\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, []);\n\n const goToNext = useCallback(() => {\n setCurrentIndex((prev) => Math.min(prev + 1, imageUrls.length - 1));\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, [imageUrls.length]);\n\n // Reset zoom, pan, and image index when node changes\n // biome-ignore lint/correctness/useExhaustiveDependencies: nodeDetailNodeId is an intentional trigger to reset state when a different node opens\n useEffect(() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n setCurrentIndex(nodeDetailStartIndex);\n }, [nodeDetailNodeId, nodeDetailStartIndex]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (activeModal !== 'nodeDetail') return;\n\n if (e.key === 'Escape') {\n closeNodeDetailModal();\n }\n if (e.key === '+' || e.key === '=') {\n setZoomLevel((prev) => Math.min(prev + 0.25, 4));\n }\n if (e.key === '-') {\n setZoomLevel((prev) => Math.max(prev - 0.25, 0.25));\n }\n if (e.key === '0') {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }\n if (e.key === 'ArrowLeft') {\n goToPrevious();\n }\n if (e.key === 'ArrowRight') {\n goToNext();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [activeModal, closeNodeDetailModal, goToPrevious, goToNext]);\n\n // Pan handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (zoomLevel > 1) {\n setIsPanning(true);\n setPanStart({ x: e.clientX - panOffset.x, y: e.clientY - panOffset.y });\n }\n },\n [zoomLevel, panOffset],\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (isPanning) {\n setPanOffset({\n x: e.clientX - panStart.x,\n y: e.clientY - panStart.y,\n });\n }\n },\n [isPanning, panStart],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsPanning(false);\n }, []);\n\n // Download handler\n const handleDownload = useCallback(() => {\n const url = displayUrl ?? mediaInfo.url;\n if (!url) return;\n\n const link = document.createElement('a');\n link.href = url;\n const suffix = hasMultipleImages ? `_${currentIndex + 1}` : '';\n link.download = `${node?.data.label || 'output'}${suffix}.${mediaInfo.type === 'video' ? 'mp4' : 'png'}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }, [displayUrl, mediaInfo, node, hasMultipleImages, currentIndex]);\n\n // Don't render for prompt nodes (they redirect to prompt editor)\n if (activeModal !== 'nodeDetail' || !node || !nodeDef) {\n return null;\n }\n\n // Prompt nodes are handled by the prompt editor\n if (PROMPT_NODE_TYPES.includes(node.type as NodeType)) {\n return null;\n }\n\n const nodeData = node.data as WorkflowNodeData;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-50 bg-black/80\"\n onClick={closeNodeDetailModal}\n />\n\n {/* Modal */}\n <div className=\"fixed inset-4 z-50 flex flex-col bg-card rounded-lg border border-border shadow-xl overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <div className=\"flex items-center gap-3\">\n <h2 className=\"text-lg font-medium text-foreground\">\n {nodeData.label}\n </h2>\n <span className=\"text-xs text-muted-foreground bg-secondary px-2 py-0.5 rounded\">\n {nodeDef.label}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {displayUrl && (\n <Button variant=\"outline\" size=\"sm\" onClick={handleDownload}>\n <Download className=\"h-4 w-4 mr-1\" />\n Download\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={closeNodeDetailModal}\n >\n <X className=\"w-5 h-5\" />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-hidden\">\n <div\n className=\"relative w-full h-full flex items-center justify-center bg-background overflow-hidden\"\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n style={{\n cursor:\n zoomLevel > 1 ? (isPanning ? 'grabbing' : 'grab') : 'default',\n }}\n >\n {displayUrl ? (\n <div\n className=\"transition-transform duration-100\"\n style={{\n transform: `scale(${zoomLevel}) translate(${panOffset.x / zoomLevel}px, ${panOffset.y / zoomLevel}px)`,\n }}\n >\n {mediaInfo.type === 'image' && (\n <Image\n src={displayUrl}\n alt={nodeData.label}\n width={800}\n height={600}\n className=\"max-h-[calc(100vh-200px)] max-w-[calc(100vw-100px)] object-contain rounded-lg\"\n unoptimized\n />\n )}\n {mediaInfo.type === 'video' && (\n <video\n src={displayUrl}\n controls\n autoPlay\n loop\n className=\"max-h-[calc(100vh-200px)] max-w-[calc(100vw-100px)] rounded-lg\"\n />\n )}\n </div>\n ) : (\n <div className=\"text-muted-foreground text-center\">\n <p className=\"text-lg\">No preview available</p>\n <p className=\"text-sm mt-2\">\n Generate content to see the preview\n </p>\n </div>\n )}\n\n {/* Previous/Next navigation arrows */}\n {hasMultipleImages && currentIndex > 0 && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={goToPrevious}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 bg-card/80 hover:bg-card border border-border shadow-md\"\n title=\"Previous image (←)\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </Button>\n )}\n {hasMultipleImages && currentIndex < imageUrls.length - 1 && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={goToNext}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 bg-card/80 hover:bg-card border border-border shadow-md\"\n title=\"Next image (→)\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </Button>\n )}\n\n {/* Image counter */}\n {hasMultipleImages && (\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 bg-card/80 border border-border rounded-full px-3 py-1 text-xs text-muted-foreground shadow-md\">\n {currentIndex + 1} / {imageUrls.length}\n </div>\n )}\n\n {/* Zoom controls */}\n {displayUrl && mediaInfo.type === 'image' && (\n <div className=\"absolute bottom-4 right-4 flex items-center gap-2 bg-card border border-border rounded-lg p-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() =>\n setZoomLevel((prev) => Math.max(prev - 0.25, 0.25))\n }\n title=\"Zoom out (-)\"\n >\n <ZoomOut className=\"w-4 h-4\" />\n </Button>\n <span className=\"text-xs text-muted-foreground w-12 text-center\">\n {Math.round(zoomLevel * 100)}%\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() =>\n setZoomLevel((prev) => Math.min(prev + 0.25, 4))\n }\n title=\"Zoom in (+)\"\n >\n <ZoomIn className=\"w-4 h-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }}\n title=\"Reset zoom (0)\"\n >\n Reset\n </Button>\n </div>\n )}\n </div>\n </div>\n </div>\n </>\n );\n}\n","'use client';\n\nimport type { DownloadNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Clock, Download, Loader2 } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback, useState } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Input } from '../../ui/input';\nimport { BaseNode } from '../BaseNode';\n\n/**\n * Extract file extension from URL or use fallback based on input type\n */\nfunction getExtensionFromUrl(url: string, inputType: string): string {\n try {\n const urlPath = new URL(url).pathname;\n const match = urlPath.match(/\\.(\\w+)(?:\\?.*)?$/);\n if (match) {\n const ext = match[1].toLowerCase();\n // Normalize common extensions\n if (ext === 'jpeg') return 'jpg';\n if (['jpg', 'png', 'webp', 'gif', 'mp4', 'webm', 'mov'].includes(ext)) {\n return ext;\n }\n }\n } catch {\n // Invalid URL, use fallback\n }\n // Fallback based on input type\n if (inputType === 'video') return 'mp4';\n if (inputType === 'image') return 'jpg';\n return 'txt';\n}\n\nfunction DownloadNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as DownloadNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const edges = useWorkflowStore((state) => state.edges);\n const isRunning = useExecutionStore((state) => state.isRunning);\n const [isDownloading, setIsDownloading] = useState(false);\n const isConnected = edges.some((edge) => edge.target === id);\n\n // Determine active input (image or video, whichever is connected)\n const activeMedia = nodeData.inputVideo || nodeData.inputImage;\n const activeType = nodeData.inputVideo\n ? 'video'\n : nodeData.inputImage\n ? 'image'\n : null;\n\n const fileExtension = activeMedia\n ? getExtensionFromUrl(activeMedia, activeType || 'image')\n : 'png';\n\n const handleFilenameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<DownloadNodeData>(id, { outputName: e.target.value });\n },\n [id, updateNodeData],\n );\n\n const handleDownload = useCallback(async () => {\n if (!activeMedia || isDownloading) return;\n\n setIsDownloading(true);\n try {\n // Fetch the file as a blob to bypass cross-origin restrictions\n const response = await fetch(activeMedia);\n const blob = await response.blob();\n\n // Create object URL and trigger download\n const blobUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = blobUrl;\n link.download = `${nodeData.outputName || 'output'}.${fileExtension}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up the blob URL\n URL.revokeObjectURL(blobUrl);\n } catch (_error) {\n // Fallback: open in new tab if fetch fails\n window.open(activeMedia, '_blank');\n } finally {\n setIsDownloading(false);\n }\n }, [activeMedia, nodeData.outputName, fileExtension, isDownloading]);\n\n return (\n <BaseNode {...props}>\n <div className=\"flex-1 flex flex-col gap-3 min-h-0\">\n {activeMedia ? (\n <>\n {/* Preview */}\n {activeType === 'video' ? (\n <div className=\"relative aspect-video min-h-[120px] w-full overflow-hidden rounded-md bg-black/20\">\n <video\n src={activeMedia}\n className=\"absolute inset-0 w-full h-full object-contain cursor-pointer\"\n autoPlay\n muted\n loop\n playsInline\n />\n {nodeData.status === 'processing' && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-2\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n <span className=\"text-xs text-white/80\">\n Processing...\n </span>\n </div>\n </div>\n )}\n </div>\n ) : activeType === 'image' ? (\n <div className=\"relative aspect-[4/3] min-h-[120px] w-full overflow-hidden rounded-md bg-black/20\">\n <Image\n src={activeMedia}\n alt=\"Output\"\n fill\n sizes=\"300px\"\n className=\"object-contain cursor-pointer\"\n unoptimized\n />\n {nodeData.status === 'processing' && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-2\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n <span className=\"text-xs text-white/80\">\n Processing...\n </span>\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"flex-1 min-h-[60px] overflow-y-auto rounded-md border border-border bg-background p-2 text-sm\">\n {String(activeMedia)}\n </div>\n )}\n\n {/* Editable filename */}\n <div className=\"flex items-center gap-1\">\n <Input\n value={nodeData.outputName || 'output'}\n onChange={handleFilenameChange}\n className=\"h-8 flex-1 text-sm\"\n placeholder=\"filename\"\n />\n <span className=\"text-xs text-muted-foreground\">\n .{fileExtension}\n </span>\n </div>\n\n {/* Download button */}\n <Button\n className=\"w-full\"\n onClick={handleDownload}\n disabled={isDownloading}\n >\n {isDownloading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Download className=\"h-4 w-4\" />\n )}\n {isDownloading ? 'Downloading...' : 'Download'}\n </Button>\n </>\n ) : isConnected && isRunning ? (\n <div className=\"relative flex h-20 flex-col items-center justify-center rounded-md bg-black/20\">\n <div className=\"flex flex-col items-center gap-2\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n <span className=\"text-xs text-white/80\">Generating...</span>\n </div>\n </div>\n ) : isConnected ? (\n <div className=\"flex h-20 flex-col items-center justify-center text-muted-foreground\">\n <Clock className=\"mb-2 h-6 w-6 opacity-30\" />\n <span className=\"text-xs\">Waiting for input...</span>\n <span className=\"mt-1 text-[10px] opacity-60\">\n Run workflow to generate\n </span>\n </div>\n ) : (\n <div className=\"flex h-20 flex-col items-center justify-center text-muted-foreground\">\n <Download className=\"mb-2 h-6 w-6 opacity-30\" />\n <span className=\"text-xs\">Connect image or video</span>\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const DownloadNode = memo(DownloadNodeComponent);\n\n/** @deprecated Use DownloadNode instead */\nexport const OutputNode = DownloadNode;\n","'use client';\n\nimport type { AnimationNodeData, EasingPreset } from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { AlertCircle, Expand, Loader2, RefreshCw, Wand2 } from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useRequiredInputs } from '../../hooks/useRequiredInputs';\nimport { CubicBezierEditor } from '../../lib/CubicBezierEditor';\nimport { EASING_PRESETS } from '../../lib/easing';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nconst PRESET_OPTIONS: { value: EasingPreset; label: string }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Ease In', value: 'easeIn' },\n { label: 'Ease Out', value: 'easeOut' },\n { label: 'Ease In Out', value: 'easeInOut' },\n { label: 'Ease In Quad', value: 'easeInQuad' },\n { label: 'Ease Out Quad', value: 'easeOutQuad' },\n { label: 'Ease In Out Quad', value: 'easeInOutQuad' },\n { label: 'Ease In Cubic', value: 'easeInCubic' },\n { label: 'Ease Out Cubic', value: 'easeOutCubic' },\n { label: 'Ease In Out Cubic', value: 'easeInOutCubic' },\n { label: 'Ease In Expo', value: 'easeInExpo' },\n { label: 'Ease Out Expo', value: 'easeOutExpo' },\n { label: 'Ease In Out Expo', value: 'easeInOutExpo' },\n];\n\nfunction AnimationNodeComponent(props: NodeProps) {\n const { id, type, data } = props;\n const nodeData = data as AnimationNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const { hasRequiredInputs } = useRequiredInputs(id, type as 'animation');\n\n const handleCurveTypeChange = useCallback(\n (type: 'preset' | 'custom') => {\n updateNodeData<AnimationNodeData>(id, { curveType: type });\n },\n [id, updateNodeData],\n );\n\n const handlePresetChange = useCallback(\n (value: string) => {\n const preset = value as EasingPreset;\n updateNodeData<AnimationNodeData>(id, {\n customCurve: EASING_PRESETS[preset],\n preset,\n });\n },\n [id, updateNodeData],\n );\n\n const handleSpeedChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<AnimationNodeData>(id, {\n speedMultiplier: value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const headerActions = useMemo(\n () =>\n nodeData.outputVideo ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [nodeData.outputVideo, handleExpand],\n );\n\n // SVG curve preview - fallback to easeInOutCubic if customCurve is undefined\n const curve = nodeData.customCurve ?? [0.645, 0.045, 0.355, 1];\n const pathD = `M 0 100 C ${curve[0] * 100} ${100 - curve[1] * 100}, ${curve[2] * 100} ${100 - curve[3] * 100}, 100 0`;\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"space-y-3\">\n {/* Curve Type Toggle */}\n <div className=\"flex gap-1 p-1 bg-[var(--background)] rounded\">\n <button\n onClick={() => handleCurveTypeChange('preset')}\n className={`flex-1 py-1 px-2 text-xs rounded transition ${\n nodeData.curveType === 'preset'\n ? 'bg-[var(--primary)] text-white'\n : 'text-[var(--muted-foreground)] hover:bg-[var(--border)]'\n }`}\n >\n Preset\n </button>\n <button\n onClick={() => handleCurveTypeChange('custom')}\n className={`flex-1 py-1 px-2 text-xs rounded transition ${\n nodeData.curveType === 'custom'\n ? 'bg-[var(--primary)] text-white'\n : 'text-[var(--muted-foreground)] hover:bg-[var(--border)]'\n }`}\n >\n Custom\n </button>\n </div>\n\n {/* Preset Selector */}\n {nodeData.curveType === 'preset' && (\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Easing Preset\n </label>\n <Select value={nodeData.preset} onValueChange={handlePresetChange}>\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRESET_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Custom Bezier Editor */}\n {nodeData.curveType === 'custom' && (\n <CubicBezierEditor\n value={curve}\n onChange={(v) =>\n updateNodeData<AnimationNodeData>(id, { customCurve: v })\n }\n disabled={nodeData.status === 'processing'}\n />\n )}\n\n {/* Curve Preview (preset only) */}\n {nodeData.curveType === 'preset' && (\n <div className=\"h-20 bg-[var(--background)] rounded border border-[var(--border)] p-2\">\n <svg viewBox=\"0 0 100 100\" className=\"w-full h-full\">\n <path\n d={pathD}\n fill=\"none\"\n stroke=\"var(--primary)\"\n strokeWidth=\"2\"\n />\n <circle cx=\"0\" cy=\"100\" r=\"3\" fill=\"var(--foreground)\" />\n <circle cx=\"100\" cy=\"0\" r=\"3\" fill=\"var(--foreground)\" />\n <circle\n cx={curve[0] * 100}\n cy={100 - curve[1] * 100}\n r=\"2\"\n fill=\"var(--accent)\"\n />\n <circle\n cx={curve[2] * 100}\n cy={100 - curve[3] * 100}\n r=\"2\"\n fill=\"var(--accent)\"\n />\n </svg>\n </div>\n )}\n\n {/* Speed Multiplier */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Speed: {nodeData.speedMultiplier.toFixed(1)}x\n </label>\n <Slider\n value={[nodeData.speedMultiplier]}\n min={0.25}\n max={4}\n step={0.25}\n onValueChange={handleSpeedChange}\n className=\"nodrag w-full\"\n />\n <div className=\"flex justify-between text-xs text-[var(--muted-foreground)]\">\n <span>0.25x</span>\n <span>4x</span>\n </div>\n </div>\n\n {/* Output Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n className=\"w-full h-20 object-cover rounded\"\n controls\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputVideo && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!hasRequiredInputs || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Wand2 className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Applying...'\n : 'Apply Animation'}\n </Button>\n )}\n\n {/* Help text for required inputs */}\n {!hasRequiredInputs && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Connect a video to animate\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const AnimationNode = memo(AnimationNodeComponent);\n","'use client';\n\nimport type { AnnotationNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Expand, Pencil, Shapes } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useAnnotationStore } from '../../stores/annotationStore';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { BaseNode } from '../BaseNode';\n\nfunction AnnotationNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as AnnotationNodeData;\n const openAnnotation = useAnnotationStore((state) => state.openAnnotation);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const getConnectedInputs = useWorkflowStore(\n (state) => state.getConnectedInputs,\n );\n\n // Get the input image from connections\n const connectedInputs = getConnectedInputs(id);\n const inputImage =\n (connectedInputs.get('image') as string) ?? nodeData.inputImage;\n\n const handleEditAnnotations = useCallback(() => {\n if (!inputImage) return;\n\n // Convert stored annotations to the format expected by the annotation store\n const shapes =\n nodeData.annotations?.map((ann) => ({\n fillColor: ann.fillColor,\n id: ann.id,\n strokeColor: ann.strokeColor,\n strokeWidth: ann.strokeWidth,\n type: ann.type,\n ...ann.props,\n })) ?? [];\n\n openAnnotation(\n id,\n inputImage,\n shapes as Parameters<typeof openAnnotation>[2],\n );\n }, [id, inputImage, nodeData.annotations, openAnnotation]);\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const headerActions = useMemo(\n () =>\n inputImage ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [inputImage, handleExpand],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"flex flex-col gap-3\">\n {/* Preview */}\n {inputImage ? (\n <div className=\"relative\">\n <Image\n src={inputImage}\n alt=\"Input image\"\n width={200}\n height={128}\n className=\"h-32 w-full rounded-md object-cover\"\n unoptimized\n />\n {nodeData.hasAnnotations && (\n <div className=\"absolute left-2 top-2 flex items-center gap-1 rounded bg-primary/90 px-2 py-0.5 text-xs font-medium text-primary-foreground\">\n <Shapes className=\"h-3 w-3\" />\n {nodeData.annotations?.length ?? 0}\n </div>\n )}\n </div>\n ) : (\n <div className=\"flex h-32 flex-col items-center justify-center rounded-md border-2 border-dashed border-border text-muted-foreground\">\n <Pencil className=\"mb-2 h-8 w-8 opacity-50\" />\n <p className=\"text-xs\">Connect an image</p>\n </div>\n )}\n\n {/* Edit Button */}\n <Button\n onClick={handleEditAnnotations}\n disabled={!inputImage}\n className=\"w-full\"\n variant={nodeData.hasAnnotations ? 'default' : 'outline'}\n >\n <Pencil className=\"mr-2 h-4 w-4\" />\n {nodeData.hasAnnotations ? 'Edit Annotations' : 'Add Annotations'}\n </Button>\n\n {/* Annotation Count */}\n {nodeData.hasAnnotations && (\n <p className=\"text-center text-xs text-muted-foreground\">\n {nodeData.annotations?.length ?? 0} annotation\n {(nodeData.annotations?.length ?? 0) !== 1 ? 's' : ''}\n </p>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const AnnotationNode = memo(AnnotationNodeComponent);\n","import React, { forwardRef } from 'react';\nimport type { CSSProperties, HTMLProps, ReactElement } from 'react';\n\nimport type { ReactCompareSliderCommonProps } from './types';\n\n/** Container for clipped item. */\nexport const ContainerClip = forwardRef<\n HTMLDivElement,\n HTMLProps<HTMLDivElement> & Pick<ReactCompareSliderCommonProps, 'transition'>\n>(({ transition, ...props }, ref): ReactElement => {\n const style: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n transition: transition ? `clip-path ${transition}` : undefined,\n userSelect: 'none',\n willChange: 'clip-path, transition',\n KhtmlUserSelect: 'none',\n MozUserSelect: 'none',\n WebkitUserSelect: 'none',\n };\n\n return <div {...props} style={style} data-rcs=\"clip-item\" ref={ref} />;\n});\n\nContainerClip.displayName = 'ContainerClip';\n\n/** Container to control the handle's position. */\nexport const ContainerHandle = forwardRef<\n HTMLButtonElement,\n HTMLProps<HTMLButtonElement> & ReactCompareSliderCommonProps\n>(({ children, disabled, portrait, position, transition }, ref): ReactElement => {\n const targetAxis = portrait ? 'top' : 'left';\n\n const style: CSSProperties = {\n position: 'absolute',\n top: 0,\n width: portrait ? '100%' : undefined,\n height: portrait ? undefined : '100%',\n background: 'none',\n border: 0,\n padding: 0,\n pointerEvents: 'all',\n appearance: 'none',\n WebkitAppearance: 'none',\n MozAppearance: 'none',\n outline: 0,\n transform: portrait ? `translate3d(0, -50% ,0)` : `translate3d(-50%, 0, 0)`,\n transition: transition ? `${targetAxis} ${transition}` : undefined,\n };\n\n return (\n <button\n ref={ref}\n aria-label=\"Drag to move or focus and use arrow keys\"\n aria-orientation={portrait ? 'vertical' : 'horizontal'}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={position}\n data-rcs=\"handle-container\"\n disabled={disabled}\n role=\"slider\"\n style={style}\n >\n {children}\n </button>\n );\n});\n\nContainerHandle.displayName = 'ThisHandleContainer';\n","import React from 'react';\nimport type { CSSProperties, FC, HtmlHTMLAttributes, ReactElement } from 'react';\n\nimport type { ReactCompareSliderCommonProps } from './types';\n\ninterface ThisArrowProps {\n /** Whether to flip the arrow direction. */\n flip?: boolean;\n}\n\nconst ThisArrow: FC<ThisArrowProps> = ({ flip }) => {\n const style: CSSProperties = {\n width: 0,\n height: 0,\n borderTop: '8px solid transparent',\n borderRight: '10px solid',\n borderBottom: '8px solid transparent',\n transform: flip ? 'rotate(180deg)' : undefined,\n };\n\n return <div className=\"__rcs-handle-arrow\" style={style} />;\n};\n\n/** Props for `ReactCompareSliderHandle`. */\nexport interface ReactCompareSliderHandleProps\n extends Pick<ReactCompareSliderCommonProps, 'disabled' | 'portrait'> {\n /** Optional styles for handle the button. */\n buttonStyle?: CSSProperties;\n /** Optional styles for lines either side of the handle button. */\n linesStyle?: CSSProperties;\n /** Optional styles for the handle root. */\n style?: CSSProperties;\n}\n\n/** Default `handle`. */\nexport const ReactCompareSliderHandle: FC<\n ReactCompareSliderHandleProps & HtmlHTMLAttributes<HTMLDivElement>\n> = ({\n className = '__rcs-handle-root',\n disabled,\n buttonStyle,\n linesStyle,\n portrait,\n style,\n ...props\n}): ReactElement => {\n const _style: CSSProperties = {\n display: 'flex',\n flexDirection: portrait ? 'row' : 'column',\n placeItems: 'center',\n height: '100%',\n cursor: disabled ? 'not-allowed' : portrait ? 'ns-resize' : 'ew-resize',\n pointerEvents: 'none',\n color: '#fff',\n ...style,\n };\n\n const _linesStyle: CSSProperties = {\n flexGrow: 1,\n height: portrait ? 2 : '100%',\n width: portrait ? '100%' : 2,\n backgroundColor: 'currentColor',\n pointerEvents: 'auto',\n boxShadow: '0 0 4px rgba(0,0,0,.5)',\n ...linesStyle,\n };\n\n const _buttonStyle: CSSProperties = {\n display: 'grid',\n gridAutoFlow: 'column',\n gap: 8,\n placeContent: 'center',\n flexShrink: 0,\n width: 56,\n height: 56,\n borderRadius: '50%',\n borderStyle: 'solid',\n borderWidth: 2,\n pointerEvents: 'auto',\n backdropFilter: 'blur(7px)',\n WebkitBackdropFilter: 'blur(7px)', // For Safari.\n backgroundColor: 'rgba(0, 0, 0, 0.125)',\n boxShadow: '0 0 4px rgba(0,0,0,.35)',\n transform: portrait ? 'rotate(90deg)' : undefined,\n ...buttonStyle,\n };\n\n return (\n <div {...props} className={className} style={_style}>\n <div className=\"__rcs-handle-line\" style={_linesStyle} />\n <div className=\"__rcs-handle-button\" style={_buttonStyle}>\n <ThisArrow />\n <ThisArrow flip />\n </div>\n <div className=\"__rcs-handle-line\" style={_linesStyle} />\n </div>\n );\n};\n","import type { CSSProperties, RefObject } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\n\n/** Keyboard `key` events to trigger slider movement. */\nexport enum KeyboardEventKeys {\n ARROW_LEFT = 'ArrowLeft',\n ARROW_RIGHT = 'ArrowRight',\n ARROW_UP = 'ArrowUp',\n ARROW_DOWN = 'ArrowDown',\n}\n\n/**\n * Stand-alone CSS utility to make replaced elements (`img`, `video`, etc.) fit their container.\n */\nexport const styleFitContainer = ({\n boxSizing = 'border-box',\n objectFit = 'cover',\n objectPosition = 'center center',\n ...props\n}: CSSProperties = {}): CSSProperties => ({\n display: 'block',\n width: '100%',\n height: '100%',\n maxWidth: '100%',\n boxSizing,\n objectFit,\n objectPosition,\n ...props,\n});\n\n/** Store the previous supplied value. */\nexport const usePrevious = <T>(value: T): T => {\n const ref = useRef<T>(value);\n\n useEffect(() => {\n ref.current = value;\n });\n\n return ref.current;\n};\n\n/**\n * Event listener binding hook.\n * @param eventName - Event to bind to.\n * @param handler - Callback handler.\n * @param element - Element to bind to.\n * @param handlerOptions - Event handler options.\n */\nexport const useEventListener = (\n eventName: EventListener['name'],\n handler: EventListener['caller'],\n element: EventTarget,\n handlerOptions: AddEventListenerOptions,\n): void => {\n const savedHandler = useRef<EventListener['caller']>();\n\n useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n // Make sure element supports addEventListener.\n if (!(element && element.addEventListener)) return;\n\n // Create event listener that calls handler function stored in ref.\n const eventListener: EventListener = (event) =>\n savedHandler.current && savedHandler.current(event);\n\n element.addEventListener(eventName, eventListener, handlerOptions);\n\n return (): void => {\n element.removeEventListener(eventName, eventListener, handlerOptions);\n };\n }, [eventName, element, handlerOptions]);\n};\n\n/**\n * Conditionally use `useLayoutEffect` for client *or* `useEffect` for SSR.\n * @see https://github.com/reduxjs/react-redux/blob/89a86805f2fcf9e8fbd2d1dae345ec791de4a71f/src/utils/useIsomorphicLayoutEffect.ts\n */\nconst useIsomorphicLayoutEffect =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined'\n ? useLayoutEffect\n : useEffect;\n\n/** Params passed to `useResizeObserver` `handler` function. */\nexport type UseResizeObserverHandlerProps = DOMRect;\n\n/**\n * Bind resize observer callback to element.\n * @param ref - Element to bind to.\n * @param handler - Callback for handling entry's bounding rect.\n */\nexport const useResizeObserver = (\n ref: RefObject<Element>,\n handler: (entry: UseResizeObserverHandlerProps) => void,\n): void => {\n const observer = useRef<ResizeObserver>();\n\n const observe = useCallback(() => {\n if (ref.current && observer.current) observer.current.observe(ref.current);\n }, [ref]);\n\n // Bind/rebind observer when `handler` changes.\n useIsomorphicLayoutEffect(() => {\n observer.current = new ResizeObserver(([entry]) => handler(entry!.contentRect));\n observe();\n\n return (): void => {\n if (observer.current) observer.current.disconnect();\n };\n }, [handler, observe]);\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport type { CSSProperties, ReactElement } from 'react';\n\nimport { ContainerClip, ContainerHandle } from './Container';\nimport { ReactCompareSliderHandle } from './ReactCompareSliderHandle';\nimport type { ReactCompareSliderDetailedProps, UseReactCompareSliderRefReturn } from './types';\nimport type { UseResizeObserverHandlerProps } from './utils';\nimport { usePrevious } from './utils';\nimport { KeyboardEventKeys, useEventListener, useResizeObserver } from './utils';\n\n/** Properties for internal `updateInternalPosition` callback. */\ninterface UpdateInternalPositionProps {\n /** X coordinate to update to (landscape). */\n x: number;\n /** Y coordinate to update to (portrait). */\n y: number;\n /** Whether to calculate using page X and Y offsets (required for pointer events). */\n isOffset?: boolean;\n}\n\nconst EVENT_PASSIVE_PARAMS = { capture: false, passive: true };\nconst EVENT_CAPTURE_PARAMS = { capture: true, passive: false };\n\n/**\n * Handler for the `handle` container element.\n */\nconst handleContainerClick = (ev: PointerEvent): void => {\n ev.preventDefault();\n (ev.currentTarget as HTMLButtonElement).focus();\n};\n\n/** Root Comparison slider. */\nexport const ReactCompareSlider = forwardRef<\n UseReactCompareSliderRefReturn,\n ReactCompareSliderDetailedProps\n>(\n (\n {\n boundsPadding = 0,\n browsingContext = globalThis,\n changePositionOnHover = false,\n disabled = false,\n handle,\n itemOne,\n itemTwo,\n keyboardIncrement = '5%',\n onlyHandleDraggable = false,\n onPositionChange,\n portrait = false,\n position = 50,\n style,\n transition,\n ...props\n },\n ref,\n ): ReactElement => {\n /** DOM node of the root element. */\n const rootContainerRef = useRef<HTMLDivElement>(null);\n /** DOM node of the item that is clipped. */\n const clipContainerRef = useRef<HTMLDivElement>(null);\n /** DOM node of the handle container. */\n const handleContainerRef = useRef<HTMLButtonElement>(null);\n /** Current position as a percentage value (initially negative to sync bounds on mount). */\n const internalPosition = useRef(position);\n /** Whether user is currently dragging. */\n const [isDragging, setIsDragging] = useState(false);\n /** Whether the `transition` property can be applied. */\n const [canTransition, setCanTransition] = useState(true);\n /** Whether component has a `window` event binding. */\n const hasBrowsingContextBinding = useRef(false);\n /** Target container for pointer events. */\n const [interactiveTarget, setInteractiveTarget] = useState<HTMLElement | null>();\n /** The `position` value at *previous* render. */\n const previousPosition = usePrevious(position);\n\n /** Sync the internal position and trigger position change callback if defined. */\n const updateInternalPosition = useCallback(\n function updateInternal({ x, y, isOffset }: UpdateInternalPositionProps) {\n const rootElement = rootContainerRef.current as HTMLDivElement;\n const handleElement = handleContainerRef.current as HTMLButtonElement;\n const clipElement = clipContainerRef.current as HTMLDivElement;\n const { width, height, left, top } = rootElement.getBoundingClientRect();\n\n // Early out when component has zero bounds.\n if (width === 0 || height === 0) {\n return;\n }\n\n const pixelPosition = portrait\n ? isOffset\n ? y - top - browsingContext.scrollY\n : y\n : isOffset\n ? x - left - browsingContext.scrollX\n : x;\n\n /** Next position as percentage. */\n const nextPosition = Math.min(\n Math.max((pixelPosition / (portrait ? height : width)) * 100, 0),\n 100,\n );\n\n const zoomScale = portrait\n ? height / (rootElement.offsetHeight || 1)\n : width / (rootElement.offsetWidth || 1);\n\n const boundsPaddingPercentage =\n ((boundsPadding * zoomScale) / (portrait ? height : width)) * 100;\n\n const nextPositionWithBoundsPadding = Math.min(\n Math.max(nextPosition, boundsPaddingPercentage * zoomScale),\n 100 - boundsPaddingPercentage * zoomScale,\n );\n\n internalPosition.current = nextPosition;\n handleElement.setAttribute('aria-valuenow', `${Math.round(internalPosition.current)}`);\n handleElement.style.top = portrait ? `${nextPositionWithBoundsPadding}%` : '0';\n handleElement.style.left = portrait ? '0' : `${nextPositionWithBoundsPadding}%`;\n clipElement.style.clipPath = portrait\n ? `inset(${nextPositionWithBoundsPadding}% 0 0 0)`\n : `inset(0 0 0 ${nextPositionWithBoundsPadding}%)`;\n\n if (onPositionChange) {\n onPositionChange(internalPosition.current);\n }\n },\n [boundsPadding, onPositionChange, portrait, browsingContext],\n );\n\n // Update internal position when other user controllable props change.\n useEffect(() => {\n const { width, height } = (\n rootContainerRef.current as HTMLDivElement\n ).getBoundingClientRect();\n\n // Use current internal position if `position` hasn't changed.\n const nextPosition = position === previousPosition ? internalPosition.current : position;\n\n updateInternalPosition({\n x: (width / 100) * nextPosition,\n y: (height / 100) * nextPosition,\n });\n }, [boundsPadding, position, portrait, previousPosition, updateInternalPosition]);\n\n /** Handle mouse/touch down. */\n const handlePointerDown = useCallback(\n (ev: PointerEvent) => {\n ev.preventDefault();\n\n // Only handle left mouse button (touch events also use 0).\n if (disabled || ev.button !== 0) return;\n\n updateInternalPosition({ isOffset: true, x: ev.pageX, y: ev.pageY });\n setIsDragging(true);\n setCanTransition(true);\n },\n [disabled, updateInternalPosition],\n );\n\n /** Handle mouse/touch move. */\n const handlePointerMove = useCallback(\n function moveCall(ev: PointerEvent) {\n updateInternalPosition({ isOffset: true, x: ev.pageX, y: ev.pageY });\n setCanTransition(false);\n },\n [updateInternalPosition],\n );\n\n /** Handle mouse/touch up. */\n const handlePointerUp = useCallback(() => {\n setIsDragging(false);\n setCanTransition(true);\n }, []);\n\n /** Resync internal position on resize. */\n const handleResize: (resizeProps: UseResizeObserverHandlerProps) => void = useCallback(\n ({ width, height }) => {\n const { width: scaledWidth, height: scaledHeight } = (\n rootContainerRef.current as HTMLDivElement\n ).getBoundingClientRect();\n\n updateInternalPosition({\n x: ((width / 100) * internalPosition.current * scaledWidth) / width,\n y: ((height / 100) * internalPosition.current * scaledHeight) / height,\n });\n },\n [updateInternalPosition],\n );\n\n /** Handle keyboard movment. */\n const handleKeydown = useCallback(\n (ev: KeyboardEvent) => {\n if (!Object.values(KeyboardEventKeys).includes(ev.key as KeyboardEventKeys)) {\n return;\n }\n\n ev.preventDefault();\n setCanTransition(true);\n\n const { top, left } = (\n handleContainerRef.current as HTMLButtonElement\n ).getBoundingClientRect();\n\n const { width, height } = (\n rootContainerRef.current as HTMLDivElement\n ).getBoundingClientRect();\n\n const isPercentage = typeof keyboardIncrement === 'string';\n const incrementPercentage = isPercentage\n ? parseFloat(keyboardIncrement)\n : (keyboardIncrement / width) * 100;\n\n const isIncrement = portrait\n ? ev.key === KeyboardEventKeys.ARROW_LEFT || ev.key === KeyboardEventKeys.ARROW_DOWN\n : ev.key === KeyboardEventKeys.ARROW_RIGHT || ev.key === KeyboardEventKeys.ARROW_UP;\n\n const nextPosition = Math.min(\n Math.max(\n isIncrement\n ? internalPosition.current + incrementPercentage\n : internalPosition.current - incrementPercentage,\n 0,\n ),\n 100,\n );\n\n updateInternalPosition({\n x: portrait ? left : (width * nextPosition) / 100,\n y: portrait ? (height * nextPosition) / 100 : top,\n });\n },\n [keyboardIncrement, portrait, updateInternalPosition],\n );\n\n // Set target container for pointer events.\n useEffect(() => {\n setInteractiveTarget(\n onlyHandleDraggable ? handleContainerRef.current : rootContainerRef.current,\n );\n }, [onlyHandleDraggable]);\n\n // Handle hover events on the container.\n useEffect(() => {\n const containerRef = rootContainerRef.current as HTMLDivElement;\n\n const handlePointerLeave = (): void => {\n if (isDragging) return;\n handlePointerUp();\n };\n\n if (changePositionOnHover) {\n containerRef.addEventListener('pointermove', handlePointerMove, EVENT_PASSIVE_PARAMS);\n containerRef.addEventListener('pointerleave', handlePointerLeave, EVENT_PASSIVE_PARAMS);\n }\n\n return () => {\n containerRef.removeEventListener('pointermove', handlePointerMove);\n containerRef.removeEventListener('pointerleave', handlePointerLeave);\n };\n }, [changePositionOnHover, handlePointerMove, handlePointerUp, isDragging]);\n\n // Allow drag outside of container while pointer is still down.\n useEffect(() => {\n if (isDragging && !hasBrowsingContextBinding.current) {\n browsingContext.addEventListener('pointermove', handlePointerMove, EVENT_PASSIVE_PARAMS);\n browsingContext.addEventListener('pointerup', handlePointerUp, EVENT_PASSIVE_PARAMS);\n hasBrowsingContextBinding.current = true;\n }\n\n return (): void => {\n if (hasBrowsingContextBinding.current) {\n browsingContext.removeEventListener('pointermove', handlePointerMove);\n browsingContext.removeEventListener('pointerup', handlePointerUp);\n hasBrowsingContextBinding.current = false;\n }\n };\n }, [handlePointerMove, handlePointerUp, isDragging, browsingContext]);\n\n useImperativeHandle(\n ref,\n () => {\n return {\n rootContainer: rootContainerRef.current,\n handleContainer: handleContainerRef.current,\n setPosition(nextPosition): void {\n const { width, height } = (\n rootContainerRef.current as HTMLDivElement\n ).getBoundingClientRect();\n\n updateInternalPosition({\n x: (width / 100) * nextPosition,\n y: (height / 100) * nextPosition,\n });\n },\n };\n },\n [updateInternalPosition],\n );\n\n // Bind resize observer to container.\n useResizeObserver(rootContainerRef, handleResize);\n\n useEventListener(\n 'keydown',\n handleKeydown,\n handleContainerRef.current as HTMLButtonElement,\n EVENT_CAPTURE_PARAMS,\n );\n\n useEventListener(\n 'click',\n handleContainerClick,\n handleContainerRef.current as HTMLButtonElement,\n EVENT_CAPTURE_PARAMS,\n );\n\n useEventListener(\n 'pointerdown',\n handlePointerDown,\n interactiveTarget as HTMLDivElement,\n EVENT_CAPTURE_PARAMS,\n );\n\n // Use custom handle if requested.\n const Handle = handle || <ReactCompareSliderHandle disabled={disabled} portrait={portrait} />;\n const appliedTransition = canTransition ? transition : undefined;\n\n const rootStyle: CSSProperties = {\n position: 'relative',\n display: 'flex',\n overflow: 'hidden',\n cursor: isDragging ? (portrait ? 'ns-resize' : 'ew-resize') : undefined,\n touchAction: 'none',\n userSelect: 'none',\n KhtmlUserSelect: 'none',\n msUserSelect: 'none',\n MozUserSelect: 'none',\n WebkitUserSelect: 'none',\n ...style,\n };\n\n return (\n <div {...props} ref={rootContainerRef} style={rootStyle} data-rcs=\"root\">\n {itemOne}\n <ContainerClip ref={clipContainerRef} transition={appliedTransition}>\n {itemTwo}\n </ContainerClip>\n\n <ContainerHandle\n disabled={disabled}\n portrait={portrait}\n position={Math.round(internalPosition.current)}\n ref={handleContainerRef}\n transition={appliedTransition}\n >\n {Handle}\n </ContainerHandle>\n </div>\n );\n },\n);\n\nReactCompareSlider.displayName = 'ReactCompareSlider';\n","import React from 'react';\nimport type { CSSProperties, ImgHTMLAttributes, ReactElement } from 'react';\nimport { forwardRef } from 'react';\n\nimport { styleFitContainer } from './utils';\n\n/** Props for `ReactCompareSliderImage`. */\nexport type ReactCompareSliderImageProps = ImgHTMLAttributes<HTMLImageElement>;\n\n/** `Img` element with defaults from `styleFitContainer` applied. */\nexport const ReactCompareSliderImage = forwardRef<HTMLImageElement, ReactCompareSliderImageProps>(\n ({ style, ...props }, ref): ReactElement => {\n const rootStyle: CSSProperties = styleFitContainer(style);\n\n return <img ref={ref} {...props} style={rootStyle} data-rcs=\"image\" />;\n },\n);\n\nReactCompareSliderImage.displayName = 'ReactCompareSliderImage';\n","'use client';\n\nimport type { ImageCompareNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { memo, useMemo } from 'react';\nimport {\n ReactCompareSlider,\n ReactCompareSliderImage,\n} from 'react-compare-slider';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { BaseNode } from '../BaseNode';\n\nfunction ImageCompareNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as ImageCompareNodeData;\n const edges = useWorkflowStore((state) => state.edges);\n const nodes = useWorkflowStore((state) => state.nodes);\n\n // Collect images in real-time from connected nodes\n const displayImages = useMemo(() => {\n const connectedImages: string[] = [];\n\n // Get edges connected to this node, sorted by creation time for stable ordering\n const sortedEdges = edges\n .filter((edge) => edge.target === id)\n .sort((a, b) => {\n const aTime = (a.data?.createdAt as number) || 0;\n const bTime = (b.data?.createdAt as number) || 0;\n return aTime - bTime;\n });\n\n sortedEdges.forEach((edge) => {\n const sourceNode = nodes.find((n) => n.id === edge.source);\n if (!sourceNode) return;\n\n const sourceData = sourceNode.data as Record<string, unknown>;\n let image: string | null = null;\n\n if (sourceNode.type === 'imageInput') {\n image = sourceData.image as string | null;\n } else if (sourceNode.type === 'annotation') {\n image = sourceData.outputImage as string | null;\n } else if (sourceNode.type === 'imageGen') {\n image = sourceData.outputImage as string | null;\n }\n\n if (image) {\n connectedImages.push(image);\n }\n });\n\n return connectedImages;\n }, [edges, nodes, id]);\n\n const imageA = displayImages[0] || nodeData.imageA || null;\n const imageB = displayImages[1] || nodeData.imageB || null;\n\n return (\n <BaseNode {...props}>\n {/* Comparison view or placeholder */}\n {imageA && imageB ? (\n <div className=\"flex-1 relative nodrag nopan nowheel min-h-[200px]\">\n <ReactCompareSlider\n itemOne={\n <ReactCompareSliderImage\n src={imageA}\n alt=\"Image A\"\n style={{ objectFit: 'contain' }}\n />\n }\n itemTwo={\n <ReactCompareSliderImage\n src={imageB}\n alt=\"Image B\"\n style={{ objectFit: 'contain' }}\n />\n }\n portrait={false}\n style={{ height: '100%', width: '100%' }}\n />\n {/* Corner labels */}\n <div className=\"absolute top-2 left-2 bg-black/50 text-white text-[10px] font-medium px-2 py-1 rounded pointer-events-none\">\n A\n </div>\n <div className=\"absolute top-2 right-2 bg-black/50 text-white text-[10px] font-medium px-2 py-1 rounded pointer-events-none\">\n B\n </div>\n </div>\n ) : (\n <div className=\"w-full flex-1 min-h-[200px] border border-dashed border-border rounded flex flex-col items-center justify-center gap-2\">\n <span className=\"text-muted-foreground text-[10px] text-center px-4\">\n {!imageA && !imageB\n ? 'Connect 2 images to compare'\n : 'Connect another image to compare'}\n </span>\n {imageA && !imageB && (\n <div className=\"text-[9px] text-muted-foreground\">\n Image A connected\n </div>\n )}\n {!imageA && imageB && (\n <div className=\"text-[9px] text-muted-foreground\">\n Image B connected\n </div>\n )}\n </div>\n )}\n </BaseNode>\n );\n}\n\nexport const ImageCompareNode = memo(ImageCompareNodeComponent);\n","'use client';\n\nimport type {\n GridOutputFormat,\n ImageGridSplitNodeData,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Download, Grid3X3, Loader2, RefreshCw } from 'lucide-react';\nimport { memo, useCallback, useState } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nconst OUTPUT_FORMATS: { value: GridOutputFormat; label: string }[] = [\n { label: 'JPEG', value: 'jpg' },\n { label: 'PNG', value: 'png' },\n { label: 'WebP', value: 'webp' },\n];\n\nfunction ImageGridSplitNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as ImageGridSplitNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const [selectedPreview, setSelectedPreview] = useState<number | null>(null);\n\n const handleRowsChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = Math.min(\n 10,\n Math.max(1, Number.parseInt(e.target.value, 10) || 1),\n );\n updateNodeData<ImageGridSplitNodeData>(id, { gridRows: value });\n },\n [id, updateNodeData],\n );\n\n const handleColsChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = Math.min(\n 10,\n Math.max(1, Number.parseInt(e.target.value, 10) || 1),\n );\n updateNodeData<ImageGridSplitNodeData>(id, { gridCols: value });\n },\n [id, updateNodeData],\n );\n\n const handleInsetChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<ImageGridSplitNodeData>(id, {\n borderInset: value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleFormatChange = useCallback(\n (value: string) => {\n updateNodeData<ImageGridSplitNodeData>(id, {\n outputFormat: value as GridOutputFormat,\n });\n },\n [id, updateNodeData],\n );\n\n const handleQualityChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<ImageGridSplitNodeData>(id, {\n quality: value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const handleDownload = useCallback(\n (index: number) => {\n const image = nodeData.outputImages[index];\n if (!image) return;\n\n const link = document.createElement('a');\n link.href = image;\n link.download = `grid_${index + 1}.${nodeData.outputFormat}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n },\n [nodeData.outputImages, nodeData.outputFormat],\n );\n\n const handleDownloadAll = useCallback(() => {\n nodeData.outputImages.forEach((_, index) => {\n setTimeout(() => handleDownload(index), index * 100);\n });\n }, [nodeData.outputImages, handleDownload]);\n\n const totalCells = nodeData.gridRows * nodeData.gridCols;\n\n return (\n <BaseNode {...props}>\n <div className=\"space-y-3\">\n {/* Grid Configuration */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Rows\n </label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"10\"\n value={nodeData.gridRows}\n onChange={handleRowsChange}\n className=\"w-full px-2 py-1.5 text-sm bg-[var(--background)] border border-[var(--border)] rounded focus:outline-none focus:ring-1 focus:ring-[var(--primary)]\"\n />\n </div>\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Columns\n </label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"10\"\n value={nodeData.gridCols}\n onChange={handleColsChange}\n className=\"w-full px-2 py-1.5 text-sm bg-[var(--background)] border border-[var(--border)] rounded focus:outline-none focus:ring-1 focus:ring-[var(--primary)]\"\n />\n </div>\n </div>\n\n {/* Grid Preview Info */}\n <div className=\"p-2 bg-[var(--background)] rounded border border-[var(--border)]\">\n <div className=\"text-xs text-[var(--muted-foreground)] text-center\">\n Output: {totalCells} images ({nodeData.gridRows}×{nodeData.gridCols}{' '}\n grid)\n </div>\n {/* Visual grid preview */}\n <div\n className=\"mt-2 grid gap-0.5 mx-auto w-20 aspect-square bg-[var(--border)] rounded overflow-hidden\"\n style={{\n gridTemplateColumns: `repeat(${nodeData.gridCols}, 1fr)`,\n gridTemplateRows: `repeat(${nodeData.gridRows}, 1fr)`,\n }}\n >\n {Array.from({ length: totalCells }).map((_, i) => (\n <div\n key={i}\n className=\"bg-[var(--primary)]/20 text-[8px] flex items-center justify-center text-[var(--primary)]\"\n >\n {i + 1}\n </div>\n ))}\n </div>\n </div>\n\n {/* Border Inset */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Border Inset: {nodeData.borderInset}px\n </label>\n <Slider\n value={[nodeData.borderInset]}\n min={0}\n max={50}\n onValueChange={handleInsetChange}\n className=\"nodrag w-full\"\n />\n </div>\n\n {/* Output Format */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Format\n </label>\n <Select\n value={nodeData.outputFormat}\n onValueChange={handleFormatChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {OUTPUT_FORMATS.map((f) => (\n <SelectItem key={f.value} value={f.value}>\n {f.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Quality: {nodeData.quality}%\n </label>\n <Slider\n value={[nodeData.quality]}\n min={1}\n max={100}\n onValueChange={handleQualityChange}\n className=\"nodrag w-full\"\n />\n </div>\n </div>\n\n {/* Output Preview Gallery */}\n {nodeData.outputImages.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-[var(--muted-foreground)]\">\n Output ({nodeData.outputImages.length} images)\n </span>\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={handleDownloadAll}\n className=\"h-auto p-0\"\n >\n <Download className=\"w-3 h-3\" />\n Download All\n </Button>\n </div>\n <div\n className=\"grid gap-1\"\n style={{\n gridTemplateColumns: `repeat(${Math.min(nodeData.gridCols, 4)}, 1fr)`,\n }}\n >\n {nodeData.outputImages.map((img, index) => (\n <div\n key={index}\n className=\"relative group aspect-square rounded overflow-hidden border border-[var(--border)] cursor-pointer\"\n onClick={() =>\n setSelectedPreview(selectedPreview === index ? null : index)\n }\n >\n <img\n src={img}\n alt={`Cell ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition flex items-center justify-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={(e) => {\n e.stopPropagation();\n handleDownload(index);\n }}\n className=\"h-6 w-6 bg-white/20 hover:bg-white/30\"\n >\n <Download className=\"w-3 h-3 text-white\" />\n </Button>\n </div>\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-[8px] text-center py-0.5\">\n {index + 1}\n </div>\n </div>\n ))}\n </div>\n {/* Enlarged preview */}\n {selectedPreview !== null &&\n nodeData.outputImages[selectedPreview] && (\n <div className=\"relative\">\n <img\n src={nodeData.outputImages[selectedPreview]}\n alt={`Preview ${selectedPreview + 1}`}\n className=\"w-full rounded border border-[var(--border)]\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setSelectedPreview(null)}\n className=\"absolute top-1 right-1 h-5 w-5 bg-black/50 hover:bg-black/70 text-white\"\n >\n ×\n </Button>\n </div>\n )}\n {/* Re-process button */}\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"w-full\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n Re-split\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {nodeData.outputImages.length === 0 && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!nodeData.inputImage || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Grid3X3 className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing' ? 'Splitting...' : 'Split Image'}\n </Button>\n )}\n\n {!nodeData.inputImage && nodeData.outputImages.length === 0 && (\n <div className=\"text-xs text-[var(--muted-foreground)] text-center\">\n Connect an image input to split\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const ImageGridSplitNode = memo(ImageGridSplitNodeComponent);\n","'use client';\n\nimport type { OutputGalleryNodeData } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { ChevronLeft, ChevronRight, Copy, Download, X } from 'lucide-react';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { BaseNode } from '../BaseNode';\n\nfunction OutputGalleryNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as OutputGalleryNodeData;\n const { edges, nodes } = useWorkflowStore(\n useShallow((state) => ({ edges: state.edges, nodes: state.nodes })),\n );\n const [lightboxIndex, setLightboxIndex] = useState<number | null>(null);\n const isLightboxOpen = lightboxIndex !== null;\n\n const displayImages = useMemo(() => {\n const executionImages = [...(nodeData.images || [])];\n\n const connectedImages: string[] = [];\n edges\n .filter((edge) => edge.target === id)\n .forEach((edge) => {\n const sourceNode = nodes.find((n) => n.id === edge.source);\n if (!sourceNode) return;\n\n const sourceData = sourceNode.data as Record<string, unknown>;\n\n const images = sourceData.outputImages as string[] | undefined;\n if (images?.length) {\n connectedImages.push(...images);\n return;\n }\n\n const outputImage = sourceData.outputImage as string | null;\n if (outputImage) {\n connectedImages.push(outputImage);\n return;\n }\n\n const image = sourceData.image as string | null;\n if (image) {\n connectedImages.push(image);\n }\n });\n\n return [...new Set([...executionImages, ...connectedImages])].reverse();\n }, [nodeData.images, edges, nodes, id]);\n\n const openLightbox = useCallback((index: number) => {\n setLightboxIndex(index);\n }, []);\n\n const closeLightbox = useCallback(() => {\n setLightboxIndex(null);\n }, []);\n\n const imageCountRef = useRef(displayImages.length);\n imageCountRef.current = displayImages.length;\n\n const navigateLightbox = useCallback((direction: 'prev' | 'next') => {\n setLightboxIndex((prev) => {\n if (prev === null) return null;\n if (direction === 'prev' && prev > 0) return prev - 1;\n if (direction === 'next' && prev < imageCountRef.current - 1)\n return prev + 1;\n return prev;\n });\n }, []);\n\n const displayImagesRef = useRef(displayImages);\n displayImagesRef.current = displayImages;\n\n const downloadImage = useCallback(() => {\n if (lightboxIndex === null) return;\n const image = displayImagesRef.current[lightboxIndex];\n if (!image) return;\n\n const link = document.createElement('a');\n link.href = image;\n link.download = `gallery-image-${lightboxIndex + 1}.png`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }, [lightboxIndex]);\n\n const copyImage = useCallback(async () => {\n if (lightboxIndex === null) return;\n const image = displayImagesRef.current[lightboxIndex];\n if (!image) return;\n\n try {\n const response = await fetch(image);\n const blob = await response.blob();\n const pngBlob =\n blob.type === 'image/png'\n ? blob\n : await new Promise<Blob>((resolve) => {\n const canvas = document.createElement('canvas');\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n canvas.toBlob((b) => resolve(b || blob), 'image/png');\n };\n img.onerror = () => resolve(blob);\n img.src = image;\n });\n await navigator.clipboard.write([\n new ClipboardItem({ 'image/png': pngBlob }),\n ]);\n } catch {\n // Silently fail if clipboard API is unavailable\n }\n }, [lightboxIndex]);\n\n useEffect(() => {\n if (!isLightboxOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n closeLightbox();\n break;\n case 'ArrowLeft':\n navigateLightbox('prev');\n break;\n case 'ArrowRight':\n navigateLightbox('next');\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isLightboxOpen, closeLightbox, navigateLightbox]);\n\n return (\n <>\n <BaseNode {...props}>\n {displayImages.length === 0 ? (\n <div className=\"w-full flex-1 min-h-[200px] border border-dashed border-border rounded flex items-center justify-center\">\n <span className=\"text-muted-foreground text-[10px] text-center px-4\">\n Connect image nodes to view gallery\n </span>\n </div>\n ) : (\n <div className=\"flex-1 overflow-y-auto nodrag nopan nowheel\">\n <div className=\"grid grid-cols-3 gap-1.5 p-1\">\n {displayImages.map((img, idx) => (\n <button\n key={img}\n onClick={() => openLightbox(idx)}\n className=\"aspect-square rounded border border-border hover:border-primary overflow-hidden transition-colors\"\n >\n <img\n src={img}\n alt={`Image ${idx + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n </div>\n )}\n </BaseNode>\n\n {isLightboxOpen &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n className=\"fixed inset-0 bg-black/90 z-[100] flex items-center justify-center p-8\"\n onClick={closeLightbox}\n onContextMenu={(e) => e.stopPropagation()}\n >\n <div\n className=\"relative max-w-full max-h-full\"\n onClick={(e) => e.stopPropagation()}\n >\n <img\n src={displayImages[lightboxIndex]}\n alt={`Gallery image ${lightboxIndex + 1}`}\n className=\"max-w-full max-h-[90vh] object-contain rounded\"\n />\n\n <button\n onClick={closeLightbox}\n className=\"absolute top-4 right-4 w-8 h-8 bg-white/10 hover:bg-white/20 rounded text-white text-sm transition-colors flex items-center justify-center\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n\n <div className=\"absolute top-4 left-4 flex items-center gap-2\">\n <button\n onClick={downloadImage}\n className=\"px-3 py-1.5 bg-white/10 hover:bg-white/20 rounded text-white text-xs font-medium transition-colors flex items-center gap-1.5\"\n >\n <Download className=\"w-3.5 h-3.5\" />\n Download\n </button>\n <button\n onClick={copyImage}\n className=\"px-3 py-1.5 bg-white/10 hover:bg-white/20 rounded text-white text-xs font-medium transition-colors flex items-center gap-1.5\"\n >\n <Copy className=\"w-3.5 h-3.5\" />\n Copy\n </button>\n </div>\n\n {lightboxIndex > 0 && (\n <button\n onClick={() => navigateLightbox('prev')}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 w-10 h-10 bg-white/10 hover:bg-white/20 rounded-full text-white transition-colors flex items-center justify-center\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n )}\n\n {lightboxIndex < displayImages.length - 1 && (\n <button\n onClick={() => navigateLightbox('next')}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 w-10 h-10 bg-white/10 hover:bg-white/20 rounded-full text-white transition-colors flex items-center justify-center\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </button>\n )}\n\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 px-3 py-1.5 bg-black/50 rounded text-white text-xs font-medium\">\n {lightboxIndex + 1} / {displayImages.length}\n </div>\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n}\n\nexport const OutputGalleryNode = memo(OutputGalleryNodeComponent);\n","'use client';\n\nimport type {\n GridPosition,\n LumaAspectRatio,\n LumaReframeModel,\n ReframeNodeData,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Loader2, RefreshCw } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback, useRef, useState } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { GridPositionSelector } from '../../ui/grid-position-selector';\nimport { Label } from '../../ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { BaseNode } from '../BaseNode';\n\nconst MODELS: { value: LumaReframeModel; label: string; price: string }[] = [\n { label: 'Photon Flash', price: '$0.01', value: 'photon-flash-1' },\n { label: 'Photon', price: '$0.03', value: 'photon-1' },\n];\n\nconst ASPECT_RATIOS: { value: LumaAspectRatio; label: string }[] = [\n { label: '9:16 (TikTok/Reels)', value: '9:16' },\n { label: '16:9 (YouTube)', value: '16:9' },\n { label: '1:1 (Square)', value: '1:1' },\n { label: '4:3', value: '4:3' },\n { label: '3:4', value: '3:4' },\n { label: '9:21', value: '9:21' },\n { label: '21:9 (Ultrawide)', value: '21:9' },\n];\n\nfunction ReframeNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as ReframeNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n\n // Determine input type based on what's connected\n const inputType =\n nodeData.inputType ??\n (nodeData.inputImage ? 'image' : nodeData.inputVideo ? 'video' : null);\n const hasInput = inputType !== null;\n const hasOutput =\n inputType === 'image' ? !!nodeData.outputImage : !!nodeData.outputVideo;\n\n const handleModelChange = useCallback(\n (value: string) => {\n updateNodeData<ReframeNodeData>(id, {\n model: value as LumaReframeModel,\n });\n },\n [id, updateNodeData],\n );\n\n const handleAspectRatioChange = useCallback(\n (value: string) => {\n updateNodeData<ReframeNodeData>(id, {\n aspectRatio: value as LumaAspectRatio,\n });\n },\n [id, updateNodeData],\n );\n\n const handlePromptChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<ReframeNodeData>(id, { prompt: e.target.value });\n },\n [id, updateNodeData],\n );\n\n const handlePositionChange = useCallback(\n (position: GridPosition) => {\n updateNodeData<ReframeNodeData>(id, { gridPosition: position });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const togglePlayback = useCallback(() => {\n if (!videoRef.current) return;\n if (isPlaying) {\n videoRef.current.pause();\n } else {\n videoRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }, [isPlaying]);\n\n return (\n <BaseNode {...props}>\n <div className=\"flex flex-col gap-3\">\n {/* Input Type Indicator */}\n {!hasInput && (\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1.5 text-center\">\n Connect an image or video input\n </div>\n )}\n\n {hasInput && (\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1\">\n Mode: <span className=\"font-medium capitalize\">{inputType}</span>\n </div>\n )}\n\n {/* Model Selection (only for images) */}\n {inputType === 'image' && (\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Model</Label>\n <Select value={nodeData.model} onValueChange={handleModelChange}>\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {MODELS.map((model) => (\n <SelectItem key={model.value} value={model.value}>\n {model.label} - {model.price}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Aspect Ratio */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Target Aspect Ratio</Label>\n <Select\n value={nodeData.aspectRatio}\n onValueChange={handleAspectRatioChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ASPECT_RATIOS.map((ratio) => (\n <SelectItem key={ratio.value} value={ratio.value}>\n {ratio.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Grid Position */}\n <GridPositionSelector\n position={nodeData.gridPosition}\n onPositionChange={handlePositionChange}\n />\n\n {/* Optional Prompt */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Prompt (optional)</Label>\n <input\n type=\"text\"\n value={nodeData.prompt}\n onChange={handlePromptChange}\n placeholder=\"Guide the AI outpainting...\"\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n\n {/* Video Limits Notice */}\n {inputType === 'video' && (\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1\">\n Max: 10 seconds, 100MB. Output: 720p @ $0.06/sec\n </div>\n )}\n\n {/* Output Preview - Image */}\n {inputType === 'image' && nodeData.outputImage && (\n <div className=\"relative mt-1\">\n <Image\n src={nodeData.outputImage}\n alt=\"Reframed image\"\n width={200}\n height={128}\n className=\"h-32 w-full rounded-md object-cover\"\n unoptimized\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute right-2 top-2 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"h-3.5 w-3.5 text-white\" />\n </Button>\n </div>\n )}\n\n {/* Output Preview - Video */}\n {inputType === 'video' && nodeData.outputVideo && (\n <div className=\"relative mt-1\">\n <video\n ref={videoRef}\n src={nodeData.outputVideo}\n className=\"h-32 w-full rounded-md object-cover cursor-pointer\"\n onClick={togglePlayback}\n onEnded={() => setIsPlaying(false)}\n loop\n muted\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute right-2 top-2 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"h-3.5 w-3.5 text-white\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!hasOutput && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!hasInput || nodeData.status === 'processing'}\n className=\"mt-1 w-full\"\n >\n {nodeData.status === 'processing' && (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n )}\n {nodeData.status === 'processing'\n ? 'Reframing...'\n : `Reframe ${inputType === 'video' ? 'Video' : inputType === 'image' ? 'Image' : 'Media'}`}\n </Button>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const ReframeNode = memo(ReframeNodeComponent);\n","'use client';\n\nimport { LUMA_ASPECT_RATIOS } from '@genfeedai/core';\nimport type {\n GridPosition,\n LumaAspectRatio,\n ResizeNodeData,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { ImageIcon, Loader2, RefreshCw, Video } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { GridPositionSelector } from '../../ui/grid-position-selector';\nimport { Label } from '../../ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { BaseNode } from '../BaseNode';\n\ntype MediaType = 'image' | 'video';\n\nconst MODELS: Record<MediaType, { id: string; label: string; price: string }> =\n {\n image: { id: 'photon-flash-1', label: 'Luma Photon Flash', price: '$0.01' },\n video: { id: 'luma-reframe', label: 'Luma Reframe', price: '$0.05' },\n };\n\nfunction ResizeNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as ResizeNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n\n const mediaType = nodeData.inputType ?? 'image';\n const currentModel = MODELS[mediaType];\n\n const handleTypeChange = useCallback(\n (value: string) => {\n updateNodeData<ResizeNodeData>(id, {\n inputType: value as MediaType,\n });\n },\n [id, updateNodeData],\n );\n\n const handleAspectRatioChange = useCallback(\n (value: string) => {\n updateNodeData<ResizeNodeData>(id, {\n targetAspectRatio: value as LumaAspectRatio,\n });\n },\n [id, updateNodeData],\n );\n\n const handlePromptChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<ResizeNodeData>(id, { prompt: e.target.value });\n },\n [id, updateNodeData],\n );\n\n const handlePositionChange = useCallback(\n (position: GridPosition) => {\n updateNodeData<ResizeNodeData>(id, { gridPosition: position });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n return (\n <BaseNode {...props}>\n <div className=\"flex flex-col gap-3\">\n {/* Media Type Selection */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Media Type</Label>\n <Select value={mediaType} onValueChange={handleTypeChange}>\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"image\">Image</SelectItem>\n <SelectItem value=\"video\">Video</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Model Display */}\n <div className=\"flex items-center gap-2 px-2 py-1.5 rounded-md bg-secondary/50 text-xs text-muted-foreground\">\n {mediaType === 'image' ? (\n <ImageIcon className=\"h-3.5 w-3.5\" />\n ) : (\n <Video className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"flex-1\">{currentModel.label}</span>\n <span>{currentModel.price}</span>\n </div>\n\n {/* Aspect Ratio */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Target Aspect Ratio</Label>\n <Select\n value={nodeData.targetAspectRatio}\n onValueChange={handleAspectRatioChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {LUMA_ASPECT_RATIOS.map((ratio) => (\n <SelectItem key={ratio} value={ratio}>\n {ratio}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Grid Position */}\n <GridPositionSelector\n position={nodeData.gridPosition}\n onPositionChange={handlePositionChange}\n />\n\n {/* Optional Prompt */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Prompt (optional)</Label>\n <input\n type=\"text\"\n value={nodeData.prompt}\n onChange={handlePromptChange}\n placeholder=\"Guide the AI outpainting...\"\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n\n {/* Output Preview */}\n {nodeData.outputMedia && (\n <div className=\"relative mt-1\">\n {mediaType === 'video' ? (\n <video\n src={nodeData.outputMedia}\n className=\"h-32 w-full rounded-md object-cover\"\n controls\n />\n ) : (\n <Image\n src={nodeData.outputMedia}\n alt=\"Resized media\"\n width={200}\n height={128}\n className=\"h-32 w-full rounded-md object-cover\"\n unoptimized\n />\n )}\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute right-2 top-2 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"h-3.5 w-3.5 text-white\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputMedia && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!nodeData.inputMedia || nodeData.status === 'processing'}\n className=\"mt-1 w-full\"\n >\n {nodeData.status === 'processing' && (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n )}\n {nodeData.status === 'processing'\n ? 'Resizing...'\n : `Resize ${mediaType === 'video' ? 'Video' : 'Image'}`}\n </Button>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const ResizeNode = memo(ResizeNodeComponent);\n","'use client';\n\nimport type {\n SubtitleNodeData,\n SubtitlePosition,\n SubtitleStyle,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Loader2, RefreshCw, Subtitles } from 'lucide-react';\nimport { memo, useCallback } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nconst STYLE_OPTIONS: { value: SubtitleStyle; label: string }[] = [\n { label: 'Modern', value: 'modern' },\n { label: 'Default', value: 'default' },\n { label: 'Minimal', value: 'minimal' },\n { label: 'Bold', value: 'bold' },\n];\n\nconst POSITION_OPTIONS: { value: SubtitlePosition; label: string }[] = [\n { label: 'Bottom', value: 'bottom' },\n { label: 'Center', value: 'center' },\n { label: 'Top', value: 'top' },\n];\n\nfunction SubtitleNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as SubtitleNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n\n const handleStyleChange = useCallback(\n (value: string) => {\n updateNodeData<SubtitleNodeData>(id, { style: value as SubtitleStyle });\n },\n [id, updateNodeData],\n );\n\n const handlePositionChange = useCallback(\n (value: string) => {\n updateNodeData<SubtitleNodeData>(id, {\n position: value as SubtitlePosition,\n });\n },\n [id, updateNodeData],\n );\n\n const handleFontSizeChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<SubtitleNodeData>(id, { fontSize: value });\n },\n [id, updateNodeData],\n );\n\n const handleFontColorChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n updateNodeData<SubtitleNodeData>(id, { fontColor: e.target.value });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const hasRequiredInputs = nodeData.inputVideo && nodeData.inputText;\n\n return (\n <BaseNode {...props}>\n <div className=\"space-y-3\">\n {/* Input Status */}\n <div className=\"text-xs text-[var(--muted-foreground)]\">\n {hasRequiredInputs\n ? 'Ready to burn subtitles'\n : 'Connect video and subtitle text'}\n </div>\n\n {/* Style Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)] block mb-1\">\n Style\n </label>\n <Select value={nodeData.style} onValueChange={handleStyleChange}>\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STYLE_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Position Selection */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)] block mb-1\">\n Position\n </label>\n <Select\n value={nodeData.position}\n onValueChange={handlePositionChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {POSITION_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Font Size */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)] block mb-1\">\n Font Size: {nodeData.fontSize}px\n </label>\n <Slider\n value={[nodeData.fontSize]}\n min={12}\n max={72}\n onValueChange={handleFontSizeChange}\n className=\"nodrag w-full\"\n />\n </div>\n\n {/* Font Color */}\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Color\n </label>\n <input\n type=\"color\"\n value={nodeData.fontColor}\n onChange={handleFontColorChange}\n className=\"w-8 h-8 rounded border border-[var(--border)] cursor-pointer\"\n />\n <span className=\"text-xs text-[var(--muted-foreground)]\">\n {nodeData.fontColor}\n </span>\n </div>\n\n {/* Output Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n className=\"w-full h-20 object-cover rounded\"\n muted\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputVideo && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!hasRequiredInputs || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Subtitles className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing' ? 'Burning...' : 'Burn Subtitles'}\n </Button>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const SubtitleNode = memo(SubtitleNodeComponent);\n","'use client';\n\nimport type {\n TopazUpscaleFactor,\n TopazVideoFPS,\n TopazVideoResolution,\n UpscaleModel,\n UpscaleNodeData,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport {\n Expand,\n Loader2,\n RefreshCw,\n SplitSquareHorizontal,\n} from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback, useMemo, useRef, useState } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Checkbox } from '../../ui/checkbox';\nimport { ComparisonSlider } from '../../ui/comparison-slider';\nimport { Label } from '../../ui/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\n// Image upscale models\nconst IMAGE_MODELS: { value: UpscaleModel; label: string }[] = [\n { label: 'Standard V2', value: 'topaz-standard-v2' },\n { label: 'Low Resolution V2', value: 'topaz-low-res-v2' },\n { label: 'CGI', value: 'topaz-cgi' },\n { label: 'High Fidelity V2', value: 'topaz-high-fidelity-v2' },\n { label: 'Text Refine', value: 'topaz-text-refine' },\n];\n\n// Video model (only one option currently)\nconst VIDEO_MODELS: { value: UpscaleModel; label: string }[] = [\n { label: 'Topaz Video Upscale', value: 'topaz-video' },\n];\n\nconst UPSCALE_FACTORS: { value: TopazUpscaleFactor; label: string }[] = [\n { label: 'None (enhance only)', value: 'None' },\n { label: '2x', value: '2x' },\n { label: '4x', value: '4x' },\n { label: '6x', value: '6x' },\n];\n\nconst RESOLUTIONS: { value: TopazVideoResolution; label: string }[] = [\n { label: '720p (HD)', value: '720p' },\n { label: '1080p (Full HD)', value: '1080p' },\n { label: '4K (Ultra HD)', value: '4k' },\n];\n\nconst FPS_OPTIONS: { value: TopazVideoFPS; label: string }[] = [\n { label: '15 fps', value: 15 },\n { label: '24 fps (Film)', value: 24 },\n { label: '30 fps', value: 30 },\n { label: '60 fps (Smooth)', value: 60 },\n];\n\nfunction UpscaleNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as UpscaleNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n\n // Determine input type based on what's connected\n const inputType =\n nodeData.inputType ??\n (nodeData.inputImage ? 'image' : nodeData.inputVideo ? 'video' : null);\n const hasInput = inputType !== null;\n const hasOutput =\n inputType === 'image' ? !!nodeData.outputImage : !!nodeData.outputVideo;\n\n const handleModelChange = useCallback(\n (value: string) => {\n updateNodeData<UpscaleNodeData>(id, { model: value as UpscaleModel });\n },\n [id, updateNodeData],\n );\n const handleFactorChange = useCallback(\n (value: string) => {\n updateNodeData<UpscaleNodeData>(id, {\n upscaleFactor: value as TopazUpscaleFactor,\n });\n },\n [id, updateNodeData],\n );\n const handleFormatChange = useCallback(\n (value: string) => {\n updateNodeData<UpscaleNodeData>(id, {\n outputFormat: value as 'jpg' | 'png',\n });\n },\n [id, updateNodeData],\n );\n const handleResolutionChange = useCallback(\n (value: string) => {\n updateNodeData<UpscaleNodeData>(id, {\n targetResolution: value as TopazVideoResolution,\n });\n },\n [id, updateNodeData],\n );\n const handleFpsChange = useCallback(\n (value: string) => {\n updateNodeData<UpscaleNodeData>(id, {\n targetFps: Number.parseInt(value, 10) as TopazVideoFPS,\n });\n },\n [id, updateNodeData],\n );\n\n const handleFaceEnhancementToggle = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<UpscaleNodeData>(id, {\n faceEnhancement: checked,\n });\n }\n },\n [id, updateNodeData],\n );\n\n const handleStrengthChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<UpscaleNodeData>(id, {\n faceEnhancementStrength: value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleCreativityChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<UpscaleNodeData>(id, {\n faceEnhancementCreativity: value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleComparisonToggle = useCallback(() => {\n updateNodeData<UpscaleNodeData>(id, {\n showComparison: !nodeData.showComparison,\n });\n }, [id, nodeData.showComparison, updateNodeData]);\n\n const handleComparisonPositionChange = useCallback(\n (position: number) => {\n updateNodeData<UpscaleNodeData>(id, { comparisonPosition: position });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const togglePlayback = useCallback(() => {\n if (!videoRef.current) return;\n if (isPlaying) {\n videoRef.current.pause();\n } else {\n videoRef.current.play();\n }\n setIsPlaying(!isPlaying);\n }, [isPlaying]);\n\n // Estimate pricing based on resolution and fps (video only)\n const getPriceEstimate = useCallback(() => {\n const priceMap: Record<string, number> = {\n '4k-15': 0.187,\n '4k-24': 0.299,\n '4k-30': 0.373,\n '4k-60': 0.747,\n '720p-15': 0.014,\n '720p-24': 0.022,\n '720p-30': 0.027,\n '720p-60': 0.054,\n '1080p-15': 0.051,\n '1080p-24': 0.081,\n '1080p-30': 0.101,\n '1080p-60': 0.203,\n };\n const key = `${nodeData.targetResolution}-${nodeData.targetFps}`;\n const perFiveSeconds = priceMap[key] ?? 0.101;\n return `~$${perFiveSeconds.toFixed(3)}/5s`;\n }, [nodeData.targetResolution, nodeData.targetFps]);\n\n const models = inputType === 'video' ? VIDEO_MODELS : IMAGE_MODELS;\n\n const headerActions = useMemo(\n () =>\n hasOutput ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [hasOutput, handleExpand],\n );\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"flex flex-col gap-3\">\n {/* Input Type Indicator */}\n {!hasInput && (\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1.5 text-center\">\n Connect an image or video input\n </div>\n )}\n\n {hasInput && (\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1\">\n Mode: <span className=\"font-medium capitalize\">{inputType}</span>\n </div>\n )}\n\n {/* Model Selection */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Model</Label>\n <Select value={nodeData.model} onValueChange={handleModelChange}>\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {models.map((model) => (\n <SelectItem key={model.value} value={model.value}>\n {model.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Image-specific controls */}\n {inputType === 'image' && (\n <>\n {/* Upscale Factor */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Upscale Factor</Label>\n <Select\n value={nodeData.upscaleFactor}\n onValueChange={handleFactorChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UPSCALE_FACTORS.map((factor) => (\n <SelectItem key={factor.value} value={factor.value}>\n {factor.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Output Format */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Output Format</Label>\n <Select\n value={nodeData.outputFormat}\n onValueChange={handleFormatChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"png\">PNG</SelectItem>\n <SelectItem value=\"jpg\">JPG</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Face Enhancement */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`${id}-face-enhance`}\n checked={nodeData.faceEnhancement}\n onCheckedChange={handleFaceEnhancementToggle}\n />\n <Label\n htmlFor={`${id}-face-enhance`}\n className=\"text-xs cursor-pointer\"\n >\n Face Enhancement\n </Label>\n </div>\n\n {nodeData.faceEnhancement && (\n <div className=\"space-y-2 pl-1\">\n <div className=\"space-y-1\">\n <div className=\"flex justify-between\">\n <Label className=\"text-[10px]\">Strength</Label>\n <span className=\"text-[10px] text-muted-foreground\">\n {nodeData.faceEnhancementStrength}%\n </span>\n </div>\n <Slider\n value={[nodeData.faceEnhancementStrength]}\n min={0}\n max={100}\n onValueChange={handleStrengthChange}\n className=\"nodrag w-full\"\n />\n </div>\n <div className=\"space-y-1\">\n <div className=\"flex justify-between\">\n <Label className=\"text-[10px]\">Creativity</Label>\n <span className=\"text-[10px] text-muted-foreground\">\n {nodeData.faceEnhancementCreativity}%\n </span>\n </div>\n <Slider\n value={[nodeData.faceEnhancementCreativity]}\n min={0}\n max={100}\n onValueChange={handleCreativityChange}\n className=\"nodrag w-full\"\n />\n </div>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* Video-specific controls */}\n {inputType === 'video' && (\n <>\n {/* Target Resolution */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Target Resolution</Label>\n <Select\n value={nodeData.targetResolution}\n onValueChange={handleResolutionChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RESOLUTIONS.map((res) => (\n <SelectItem key={res.value} value={res.value}>\n {res.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Target FPS */}\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs\">Target Frame Rate</Label>\n <Select\n value={String(nodeData.targetFps)}\n onValueChange={handleFpsChange}\n >\n <SelectTrigger className=\"nodrag h-9 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {FPS_OPTIONS.map((fps) => (\n <SelectItem key={fps.value} value={String(fps.value)}>\n {fps.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Pricing Notice */}\n <div className=\"text-[10px] text-muted-foreground bg-secondary/50 rounded px-2 py-1\">\n Estimated cost: {getPriceEstimate()}\n </div>\n </>\n )}\n\n {/* Output with Comparison - Image */}\n {inputType === 'image' && nodeData.outputImage && (\n <div className=\"mt-1\">\n <div className=\"flex items-center justify-between mb-1\">\n <Label className=\"text-xs\">Result</Label>\n {nodeData.originalPreview && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleComparisonToggle}\n title={\n nodeData.showComparison\n ? 'Show result only'\n : 'Compare before/after'\n }\n >\n <SplitSquareHorizontal className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n\n {nodeData.showComparison && nodeData.originalPreview ? (\n <ComparisonSlider\n beforeSrc={nodeData.originalPreview}\n afterSrc={nodeData.outputImage}\n beforeLabel=\"Original\"\n afterLabel=\"Upscaled\"\n position={nodeData.comparisonPosition}\n onPositionChange={handleComparisonPositionChange}\n height={128}\n />\n ) : (\n <div className=\"relative\">\n <Image\n src={nodeData.outputImage}\n alt=\"Upscaled image\"\n width={200}\n height={128}\n className=\"h-32 w-full rounded-md object-cover\"\n unoptimized\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute right-2 top-2 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"h-3.5 w-3.5 text-white\" />\n </Button>\n </div>\n )}\n </div>\n )}\n\n {/* Output with Comparison - Video */}\n {inputType === 'video' && nodeData.outputVideo && (\n <div className=\"mt-1\">\n <div className=\"flex items-center justify-between mb-1\">\n <Label className=\"text-xs\">Result</Label>\n {nodeData.originalPreview && nodeData.outputPreview && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleComparisonToggle}\n title={\n nodeData.showComparison ? 'Show video' : 'Compare frames'\n }\n >\n <SplitSquareHorizontal className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n\n {nodeData.showComparison &&\n nodeData.originalPreview &&\n nodeData.outputPreview ? (\n <ComparisonSlider\n beforeSrc={nodeData.originalPreview}\n afterSrc={nodeData.outputPreview}\n beforeLabel=\"Original\"\n afterLabel=\"Upscaled\"\n position={nodeData.comparisonPosition}\n onPositionChange={handleComparisonPositionChange}\n height={128}\n />\n ) : (\n <div className=\"relative\">\n <video\n ref={videoRef}\n src={nodeData.outputVideo}\n className=\"h-32 w-full rounded-md object-cover cursor-pointer\"\n onClick={togglePlayback}\n onEnded={() => setIsPlaying(false)}\n loop\n muted\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute right-2 top-2 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"h-3.5 w-3.5 text-white\" />\n </Button>\n </div>\n )}\n </div>\n )}\n\n {/* Process Button */}\n {!hasOutput && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!hasInput || nodeData.status === 'processing'}\n className=\"mt-1 w-full\"\n >\n {nodeData.status === 'processing' && (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n )}\n {nodeData.status === 'processing'\n ? 'Upscaling...'\n : `Upscale ${inputType === 'video' ? 'Video' : inputType === 'image' ? 'Image' : 'Media'}`}\n </Button>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const UpscaleNode = memo(UpscaleNodeComponent);\n","'use client';\n\nimport type {\n FrameSelectionMode,\n VideoFrameExtractNodeData,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Film, Loader2, RefreshCw } from 'lucide-react';\nimport Image from 'next/image';\nimport { memo, useCallback } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { BaseNode } from '../BaseNode';\n\nconst SELECTION_MODES: { value: FrameSelectionMode; label: string }[] = [\n { label: 'Last Frame', value: 'last' },\n { label: 'First Frame', value: 'first' },\n];\n\nfunction formatTime(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\nfunction VideoFrameExtractNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as VideoFrameExtractNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n\n const handleModeChange = useCallback(\n (value: string) => {\n updateNodeData<VideoFrameExtractNodeData>(id, {\n selectionMode: value as FrameSelectionMode,\n });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n return (\n <BaseNode {...props}>\n <div className=\"space-y-3\">\n {/* Duration Info */}\n <div className=\"text-xs text-[var(--muted-foreground)]\">\n {nodeData.videoDuration\n ? `Source: ${formatTime(nodeData.videoDuration)}`\n : 'Connect video to extract frame'}\n </div>\n\n {/* Selection Mode */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)] block mb-1\">\n Frame Selection\n </label>\n <Select\n value={nodeData.selectionMode}\n onValueChange={handleModeChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SELECTION_MODES.map((mode) => (\n <SelectItem key={mode.value} value={mode.value}>\n {mode.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Output Preview */}\n {nodeData.outputImage && (\n <div className=\"relative\">\n <Image\n src={nodeData.outputImage}\n alt=\"Extracted frame\"\n width={200}\n height={120}\n className=\"w-full h-20 object-cover rounded\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputImage && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!nodeData.inputVideo || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Film className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Extracting...'\n : 'Extract Frame'}\n </Button>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const VideoFrameExtractNode = memo(VideoFrameExtractNodeComponent);\n","'use client';\n\nimport type {\n AudioCodec,\n TransitionType,\n VideoStitchNodeData,\n} from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport { Layers, Loader2, RefreshCw, Zap } from 'lucide-react';\nimport { memo, useCallback } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Checkbox } from '../../ui/checkbox';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../ui/select';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nconst TRANSITIONS: { value: TransitionType; label: string }[] = [\n { label: 'Cut (No transition)', value: 'cut' },\n { label: 'Crossfade', value: 'crossfade' },\n { label: 'Fade to Black', value: 'fade' },\n { label: 'Wipe', value: 'wipe' },\n];\n\nconst AUDIO_CODECS: { value: AudioCodec; label: string; hint: string }[] = [\n { hint: 'Best compatibility', label: 'AAC', value: 'aac' },\n { hint: 'Legacy fallback', label: 'MP3', value: 'mp3' },\n];\n\nfunction VideoStitchNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as VideoStitchNodeData;\n const inputVideos = nodeData.inputVideos ?? [];\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n\n const handleTransitionChange = useCallback(\n (value: string) => {\n updateNodeData<VideoStitchNodeData>(id, {\n transitionType: value as TransitionType,\n });\n },\n [id, updateNodeData],\n );\n\n const handleDurationChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<VideoStitchNodeData>(id, {\n transitionDuration: value,\n });\n },\n [id, updateNodeData],\n );\n\n const handleLoopToggle = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<VideoStitchNodeData>(id, {\n seamlessLoop: checked,\n });\n }\n },\n [id, updateNodeData],\n );\n\n const handleAudioCodecChange = useCallback(\n (value: string) => {\n updateNodeData<VideoStitchNodeData>(id, {\n audioCodec: value as AudioCodec,\n });\n },\n [id, updateNodeData],\n );\n\n const handleQualityToggle = useCallback(\n (checked: boolean | 'indeterminate') => {\n if (typeof checked === 'boolean') {\n updateNodeData<VideoStitchNodeData>(id, {\n outputQuality: checked ? 'draft' : 'full',\n });\n }\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n return (\n <BaseNode {...props}>\n <div className=\"space-y-3\">\n {/* Input Videos Info */}\n <div className=\"p-2 bg-[var(--background)] rounded border border-[var(--border)]\">\n <div className=\"text-xs text-[var(--muted-foreground)]\">\n Input Videos: {inputVideos.length}\n </div>\n {inputVideos.length > 0 && (\n <div className=\"mt-1 flex gap-1 flex-wrap\">\n {inputVideos.map((_, index) => (\n <div\n key={index}\n className=\"w-6 h-6 bg-[var(--primary)]/20 rounded text-xs flex items-center justify-center text-[var(--primary)]\"\n >\n {index + 1}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Transition Type */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Transition\n </label>\n <Select\n value={nodeData.transitionType}\n onValueChange={handleTransitionChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSITIONS.map((t) => (\n <SelectItem key={t.value} value={t.value}>\n {t.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Transition Duration */}\n {nodeData.transitionType !== 'cut' && (\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Duration: {nodeData.transitionDuration.toFixed(1)}s\n </label>\n <Slider\n value={[nodeData.transitionDuration]}\n min={0.1}\n max={2}\n step={0.1}\n onValueChange={handleDurationChange}\n className=\"nodrag w-full\"\n />\n </div>\n )}\n\n {/* Seamless Loop Toggle */}\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`seamless-loop-${id}`}\n checked={nodeData.seamlessLoop}\n onCheckedChange={handleLoopToggle}\n />\n <label\n htmlFor={`seamless-loop-${id}`}\n className=\"text-sm text-[var(--foreground)] cursor-pointer\"\n >\n Seamless Loop\n </label>\n </div>\n\n {/* Audio Codec */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Audio Codec\n </label>\n <Select\n value={nodeData.audioCodec}\n onValueChange={handleAudioCodecChange}\n >\n <SelectTrigger className=\"nodrag h-8 w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {AUDIO_CODECS.map((codec) => (\n <SelectItem key={codec.value} value={codec.value}>\n {codec.label} - {codec.hint}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Draft Quality Toggle */}\n <div className=\"flex items-center gap-2 nodrag\">\n <Checkbox\n id={`draft-quality-${id}`}\n checked={nodeData.outputQuality === 'draft'}\n onCheckedChange={handleQualityToggle}\n />\n <label\n htmlFor={`draft-quality-${id}`}\n className=\"text-sm text-[var(--foreground)] cursor-pointer flex items-center gap-1\"\n >\n <Zap className=\"w-3 h-3\" />\n Draft Quality\n </label>\n {nodeData.outputQuality === 'draft' && (\n <span className=\"text-xs text-[var(--muted-foreground)]\">\n (720p, faster)\n </span>\n )}\n </div>\n\n {/* Output Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n className=\"w-full h-20 object-cover rounded\"\n controls\n loop={nodeData.seamlessLoop}\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputVideo && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={\n inputVideos.length < 2 || nodeData.status === 'processing'\n }\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Layers className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing'\n ? 'Stitching...'\n : 'Stitch Videos'}\n </Button>\n )}\n\n {inputVideos.length < 2 && !nodeData.outputVideo && (\n <div className=\"text-xs text-[var(--muted-foreground)] text-center\">\n Connect at least 2 videos to stitch\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const VideoStitchNode = memo(VideoStitchNodeComponent);\n","'use client';\n\nimport type { VideoTrimNodeData } from '@genfeedai/types';\nimport { NodeStatusEnum } from '@genfeedai/types';\nimport type { NodeProps } from '@xyflow/react';\nimport {\n AlertCircle,\n Expand,\n Loader2,\n RefreshCw,\n Scissors,\n} from 'lucide-react';\nimport { memo, useCallback, useMemo } from 'react';\nimport { useExecutionStore } from '../../stores/executionStore';\nimport { useUIStore } from '../../stores/uiStore';\nimport { useWorkflowStore } from '../../stores/workflowStore';\nimport { Button } from '../../ui/button';\nimport { Slider } from '../../ui/slider';\nimport { BaseNode } from '../BaseNode';\n\nfunction formatTime(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\nfunction parseTime(timeStr: string): number {\n const [mins, secs] = timeStr.split(':').map(Number);\n return (mins || 0) * 60 + (secs || 0);\n}\n\nfunction VideoTrimNodeComponent(props: NodeProps) {\n const { id, data } = props;\n const nodeData = data as VideoTrimNodeData;\n const updateNodeData = useWorkflowStore((state) => state.updateNodeData);\n const executeNode = useExecutionStore((state) => state.executeNode);\n const openNodeDetailModal = useUIStore((state) => state.openNodeDetailModal);\n\n const hasRequiredInputs = !!nodeData.inputVideo;\n\n const handleStartTimeChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseTime(e.target.value);\n updateNodeData<VideoTrimNodeData>(id, { startTime: value });\n },\n [id, updateNodeData],\n );\n\n const handleEndTimeChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseTime(e.target.value);\n updateNodeData<VideoTrimNodeData>(id, { endTime: value });\n },\n [id, updateNodeData],\n );\n\n const handleStartSliderChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<VideoTrimNodeData>(id, { startTime: value });\n },\n [id, updateNodeData],\n );\n\n const handleEndSliderChange = useCallback(\n ([value]: number[]) => {\n updateNodeData<VideoTrimNodeData>(id, { endTime: value });\n },\n [id, updateNodeData],\n );\n\n const handleProcess = useCallback(() => {\n updateNodeData(id, { status: NodeStatusEnum.PROCESSING });\n executeNode(id);\n }, [id, executeNode, updateNodeData]);\n\n const handleExpand = useCallback(() => {\n openNodeDetailModal(id, 'preview');\n }, [id, openNodeDetailModal]);\n\n const headerActions = useMemo(\n () =>\n nodeData.outputVideo ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleExpand}\n title=\"Expand preview\"\n >\n <Expand className=\"h-3 w-3\" />\n </Button>\n ) : null,\n [nodeData.outputVideo, handleExpand],\n );\n\n const trimDuration = nodeData.endTime - nodeData.startTime;\n const maxDuration = nodeData.duration || 3600;\n\n return (\n <BaseNode {...props} headerActions={headerActions}>\n <div className=\"space-y-3\">\n {/* Duration Info */}\n <div className=\"text-xs text-[var(--muted-foreground)]\">\n {nodeData.duration\n ? `Source: ${formatTime(nodeData.duration)}`\n : 'Connect video to get duration'}\n </div>\n\n {/* Start Time */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n Start: {formatTime(nodeData.startTime)}\n </label>\n <Slider\n value={[nodeData.startTime]}\n min={0}\n max={maxDuration}\n step={1}\n onValueChange={handleStartSliderChange}\n className=\"nodrag w-full\"\n />\n <input\n type=\"text\"\n value={formatTime(nodeData.startTime)}\n onChange={handleStartTimeChange}\n placeholder=\"0:00\"\n className=\"w-full mt-1 px-2 py-1 text-xs bg-[var(--background)] border border-[var(--border)] rounded focus:outline-none focus:ring-1 focus:ring-[var(--primary)]\"\n />\n </div>\n\n {/* End Time */}\n <div>\n <label className=\"text-xs text-[var(--muted-foreground)]\">\n End: {formatTime(nodeData.endTime)}\n </label>\n <Slider\n value={[nodeData.endTime]}\n min={0}\n max={maxDuration}\n step={1}\n onValueChange={handleEndSliderChange}\n className=\"nodrag w-full\"\n />\n <input\n type=\"text\"\n value={formatTime(nodeData.endTime)}\n onChange={handleEndTimeChange}\n placeholder=\"1:00\"\n className=\"w-full mt-1 px-2 py-1 text-xs bg-[var(--background)] border border-[var(--border)] rounded focus:outline-none focus:ring-1 focus:ring-[var(--primary)]\"\n />\n </div>\n\n {/* Trim Duration Display */}\n <div className=\"p-2 bg-[var(--background)] border border-[var(--border)] rounded text-center\">\n <span className=\"text-sm font-medium\">\n Clip Length: {formatTime(trimDuration)}\n </span>\n </div>\n\n {/* Output Preview */}\n {nodeData.outputVideo && (\n <div className=\"relative\">\n <video\n src={nodeData.outputVideo}\n className=\"w-full h-20 object-cover rounded\"\n controls\n />\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleProcess}\n disabled={nodeData.status === 'processing'}\n className=\"absolute top-1 right-1 h-6 w-6 bg-black/50 hover:bg-black/70\"\n >\n <RefreshCw className=\"w-3 h-3\" />\n </Button>\n </div>\n )}\n\n {/* Process Button */}\n {!nodeData.outputVideo && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleProcess}\n disabled={!hasRequiredInputs || nodeData.status === 'processing'}\n className=\"w-full\"\n >\n {nodeData.status === 'processing' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Scissors className=\"w-4 h-4\" />\n )}\n {nodeData.status === 'processing' ? 'Trimming...' : 'Trim Video'}\n </Button>\n )}\n\n {/* Help text for required inputs */}\n {!hasRequiredInputs && nodeData.status !== 'processing' && (\n <div className=\"text-xs text-[var(--muted-foreground)] flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Connect a video to trim\n </div>\n )}\n </div>\n </BaseNode>\n );\n}\n\nexport const VideoTrimNode = memo(VideoTrimNodeComponent);\n","export * from './ai';\nexport { BaseNode } from './BaseNode';\nexport * from './composition';\nexport * from './input';\nexport { NodeDetailModal } from './NodeDetailModal';\nexport * from './output';\nexport * from './processing';\n\n// Node type mapping for React Flow\nimport type { NodeTypes } from '@xyflow/react';\nimport {\n ImageGenNode,\n LipSyncNode,\n LLMNode,\n MotionControlNode,\n TextToSpeechNode,\n TranscribeNode,\n VideoGenNode,\n VoiceChangeNode,\n} from './ai';\nimport {\n WorkflowInputNode,\n WorkflowOutputNode,\n WorkflowRefNode,\n} from './composition';\nimport {\n AudioInputNode,\n ImageInputNode,\n PromptConstructorNode,\n PromptNode,\n VideoInputNode,\n} from './input';\nimport { DownloadNode } from './output';\nimport {\n AnimationNode,\n AnnotationNode,\n ImageCompareNode,\n ImageGridSplitNode,\n OutputGalleryNode,\n ReframeNode,\n ResizeNode,\n SubtitleNode,\n UpscaleNode,\n VideoFrameExtractNode,\n VideoStitchNode,\n VideoTrimNode,\n} from './processing';\n\nexport const nodeTypes: NodeTypes = {\n animation: AnimationNode,\n annotation: AnnotationNode,\n // Input nodes\n audioInput: AudioInputNode,\n // Output nodes\n download: DownloadNode,\n imageCompare: ImageCompareNode,\n // AI nodes\n imageGen: ImageGenNode,\n imageGridSplit: ImageGridSplitNode,\n imageInput: ImageInputNode,\n lipSync: LipSyncNode,\n llm: LLMNode,\n motionControl: MotionControlNode,\n outputGallery: OutputGalleryNode,\n prompt: PromptNode,\n promptConstructor: PromptConstructorNode,\n reframe: ReframeNode,\n // Processing nodes\n resize: ResizeNode,\n subtitle: SubtitleNode,\n textToSpeech: TextToSpeechNode,\n transcribe: TranscribeNode,\n upscale: UpscaleNode,\n videoFrameExtract: VideoFrameExtractNode,\n videoGen: VideoGenNode,\n videoInput: VideoInputNode,\n videoStitch: VideoStitchNode,\n videoTrim: VideoTrimNode,\n voiceChange: VoiceChangeNode,\n // Composition nodes (workflow-as-node)\n workflowInput: WorkflowInputNode,\n workflowOutput: WorkflowOutputNode,\n workflowRef: WorkflowRefNode,\n};\n"]}