diff --git a/src/components/WorkflowCanvas.tsx b/src/components/WorkflowCanvas.tsx index 7b20c61d..757b2e96 100644 --- a/src/components/WorkflowCanvas.tsx +++ b/src/components/WorkflowCanvas.tsx @@ -223,7 +223,7 @@ const getNodeHandles = (nodeType: string): { inputs: string[]; outputs: string[] case "splitGrid": return { inputs: ["image"], outputs: ["reference"] }; case "output": - return { inputs: ["image", "video", "audio", "3d"], outputs: [] }; + return { inputs: ["image", "video", "audio"], outputs: [] }; case "outputGallery": return { inputs: ["image", "video"], outputs: [] }; case "imageCompare": @@ -2756,6 +2756,8 @@ export function WorkflowCanvas() { if (node.type === "imageInput") return null; if (node.type === "audioInput") return null; if (node.type === "videoInput") return null; + if (node.type === "output") return null; + if (node.type === "outputGallery") return null; const defaultWidth = defaultNodeDimensions[node.type as NodeType]?.width ?? 250; const headerWidth = node.measured?.width || (node.style?.width as number) || defaultWidth; @@ -2840,6 +2842,11 @@ export function WorkflowCanvas() { const effectiveModel = getEffectiveGenerationModel(node); const nodeTitle = getNodeTitle(node); const mediaMeta = getNodeHeaderMediaMeta(node, nodeTitle); + const isCompactGenerationHeader = + node.type === "nanoBanana" || + node.type === "generateVideo" || + node.type === "generateAudio" || + node.type === "llmGenerate"; return ( diff --git a/src/components/nodes/FloatingNodeHeader.tsx b/src/components/nodes/FloatingNodeHeader.tsx index 450ccaf2..aa7b86ea 100644 --- a/src/components/nodes/FloatingNodeHeader.tsx +++ b/src/components/nodes/FloatingNodeHeader.tsx @@ -85,6 +85,8 @@ interface FloatingNodeHeaderProps { mediaMeta?: NodeHeaderMediaMeta | null; customTitle?: string; comment?: string; + showCommentButton?: boolean; + showRunButton?: boolean; onCustomTitleChange?: (nodeId: string, title: string) => void; onCommentChange?: (nodeId: string, comment: string) => void; commentNavigation?: CommentNavigationProps; @@ -109,11 +111,13 @@ export const FloatingNodeHeader = memo(function FloatingNodeHeader({ mediaMeta, customTitle, comment, + showCommentButton = true, + showRunButton = true, onCustomTitleChange, onCommentChange, commentNavigation, }: FloatingNodeHeaderProps) { - const canRun = RUNNABLE_TYPES.has(type); + const canRun = showRunButton && RUNNABLE_TYPES.has(type); const canExpand = EXPANDABLE_TYPES.has(type); const [isHeaderHovered, setIsHeaderHovered] = useState(false); const isBodyHovered = useWorkflowStore((state) => state.hoveredNodeId === id); @@ -252,7 +256,7 @@ export const FloatingNodeHeader = memo(function FloatingNodeHeader({ isInLockedGroup || canExpand || canRun || - Boolean(onCommentChange) + Boolean(showCommentButton && onCommentChange) ); // Drag-to-move: allow repositioning nodes by dragging the header @@ -456,110 +460,112 @@ export const FloatingNodeHeader = memo(function FloatingNodeHeader({ {headerButtons} {/* Comment Icon */} -
- - - {/* Comment Tooltip with Navigation */} - {(showCommentTooltip || isCommentFocused) && comment && !isEditingComment && tooltipPosition && createPortal( -
+ + + {/* Comment Tooltip with Navigation */} + {(showCommentTooltip || isCommentFocused) && comment && !isEditingComment && tooltipPosition && createPortal( +
+ {isCommentFocused && commentNavigation && ( +
+ + + {commentNavigation.currentIndex}/{commentNavigation.totalCount} + + +
+ )} +
+ {comment} +
+
, + document.body + )} + + {/* Comment Edit Popover */} + {isEditingComment && ( +
+