From 57d36896bdc520bec1453cabce57b3ddb2293489 Mon Sep 17 00:00:00 2001 From: shrimbly Date: Tue, 3 Mar 2026 19:48:55 +1300 Subject: [PATCH] feat: make GenerateVideoNode full-bleed Video fills the entire node with no padding or chrome. Carousel controls overlay at the bottom with backdrop blur (matching GenerateImageNode pattern). Removed inline parameters since they are displayed in the floating panel. Hidden ModelParameters kept for schema-loading side effect (dynamic handles). All handles use z-index to stay visible over content. Co-Authored-By: Claude Opus 4.6 --- src/components/nodes/GenerateVideoNode.tsx | 174 +++++++-------------- 1 file changed, 59 insertions(+), 115 deletions(-) diff --git a/src/components/nodes/GenerateVideoNode.tsx b/src/components/nodes/GenerateVideoNode.tsx index 1702e9d3..c8800163 100644 --- a/src/components/nodes/GenerateVideoNode.tsx +++ b/src/components/nodes/GenerateVideoNode.tsx @@ -18,11 +18,6 @@ import { getModelPageUrl, getProviderDisplayName } from "@/utils/providerUrls"; // Video generation capabilities const VIDEO_CAPABILITIES: ModelCapability[] = ["text-to-video", "image-to-video"]; -// Hardcoded Veo parameter options (matches getGeminiVideoSchema in models/[modelId]/route.ts) -const VEO_ASPECT_RATIOS = ["16:9", "9:16"] as const; -const VEO_DURATIONS = ["4", "6", "8"] as const; -const VEO_RESOLUTIONS = ["720p", "1080p", "4k"] as const; - /** Returns true for Gemini-native Veo video models */ function isVeoModel(modelId: string | undefined): boolean { if (!modelId) return false; @@ -177,22 +172,6 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps { - const current = nodeData.parameters || {}; - // Remove the key if value is empty string (clear optional fields) - if (value === "") { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { [key]: _, ...rest } = current; - updateNodeData(id, { parameters: rest }); - } else { - updateNodeData(id, { parameters: { ...current, [key]: value } }); - } - }, - [id, nodeData.parameters, updateNodeData] - ); - // Handle inputs loaded from schema const handleInputsLoaded = useCallback( (inputs: ModelInputDef[]) => { @@ -415,6 +394,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps {/* Dynamic input handles based on model schema */} {nodeData.inputSchema && nodeData.inputSchema.length > 0 ? ( @@ -513,6 +493,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps {handle.label} @@ -569,7 +551,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps @@ -580,6 +562,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps Image @@ -588,7 +571,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps {/* Default text label */} @@ -598,6 +581,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps Prompt @@ -610,6 +594,7 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps {/* Output label */}
Video
-
+
{/* Preview area */} {nodeData.outputVideo ? ( <> -