diff --git a/src/components/nodes/BaseNode.tsx b/src/components/nodes/BaseNode.tsx index 8f395ff5..6958818c 100644 --- a/src/components/nodes/BaseNode.tsx +++ b/src/components/nodes/BaseNode.tsx @@ -14,6 +14,8 @@ interface BaseNodeProps { contentClassName?: string; minWidth?: number; minHeight?: number; + /** When true, node has no background/border — content fills the entire node area */ + fullBleed?: boolean; } export function BaseNode({ @@ -26,6 +28,7 @@ export function BaseNode({ contentClassName, minWidth = 180, minHeight = 100, + fullBleed = false, }: BaseNodeProps) { const currentNodeIds = useWorkflowStore((state) => state.currentNodeIds); const nodes = useWorkflowStore((state) => state.nodes); @@ -71,14 +74,16 @@ export function BaseNode({ />
-
{children}
+
{children}
); diff --git a/src/components/nodes/ControlPanel.tsx b/src/components/nodes/ControlPanel.tsx index bb432512..4a8afc08 100644 --- a/src/components/nodes/ControlPanel.tsx +++ b/src/components/nodes/ControlPanel.tsx @@ -353,61 +353,26 @@ function GenerateImageControls({ node }: { node: Node }) { return ( <>
- {/* Provider Selector */} + {/* Model display + Browse */}
- - -
- - {/* Model Selector */} - {isGeminiProvider ? ( -
- - -
- ) : ( -
- -
- - + +
+
+
+ {nodeData.selectedModel?.displayName || GEMINI_IMAGE_MODELS.find(m => m.value === nodeData.model)?.label || "Select model..."} +
+
+ {enabledProviders.find(p => p.id === currentProvider)?.name || currentProvider} +
- {modelsFetchError && ( -

{modelsFetchError}

- )} +
- )} +
{/* Gemini-specific controls */} {isGeminiProvider && ( diff --git a/src/components/nodes/GenerateImageNode.tsx b/src/components/nodes/GenerateImageNode.tsx index 878a6d92..0e432bd4 100644 --- a/src/components/nodes/GenerateImageNode.tsx +++ b/src/components/nodes/GenerateImageNode.tsx @@ -486,6 +486,7 @@ export function GenerateImageNode({ id, data, selected }: NodeProps {/* Input handles - ALWAYS use same IDs and positions for connection stability */} {/* Image input at 35%, Text input at 65% - never changes regardless of model */} @@ -547,113 +548,112 @@ export function GenerateImageNode({ id, data, selected }: NodeProps -
+
{/* Preview area */} {nodeData.outputImage ? ( <> -
- Generated - {/* Loading overlay for generation */} - {nodeData.status === "loading" && ( -
- - - - -
- )} - {/* Error overlay when generation failed */} - {nodeData.status === "error" && ( -
- + {/* Loading overlay for generation */} + {nodeData.status === "loading" && ( +
+ + - - - Generation failed - See toast for details -
- )} - {/* Loading overlay for carousel navigation */} - {isLoadingCarouselImage && ( -
- - - - -
- )} -
-
+ )} + {/* Error overlay when generation failed */} + {nodeData.status === "error" && ( +
+ - - - - + + + Generation failed + See toast for details +
+ )} + {/* Loading overlay for carousel navigation */} + {isLoadingCarouselImage && ( +
+ + + +
+ )} + {/* Clear button */} +
+
- {/* Carousel controls - only show if there are multiple images */} + {/* Carousel controls - overlaid on image bottom */} {hasCarouselImages && ( -
+
- + {(nodeData.selectedHistoryIndex || 0) + 1} / {(nodeData.imageHistory || []).length}