@ -13,6 +13,7 @@ import { ProviderBadge } from "./ProviderBadge";
import { getModelPageUrl , getProviderDisplayName } from "@/utils/providerUrls" ;
import { getModelPageUrl , getProviderDisplayName } from "@/utils/providerUrls" ;
import { useInlineParameters } from "@/hooks/useInlineParameters" ;
import { useInlineParameters } from "@/hooks/useInlineParameters" ;
import { InlineParameterPanel } from "./InlineParameterPanel" ;
import { InlineParameterPanel } from "./InlineParameterPanel" ;
import { SettingsTabBar } from "./SettingsTabBar" ;
import { browseRegistry } from "@/utils/browseRegistry" ;
import { browseRegistry } from "@/utils/browseRegistry" ;
// 3D generation capabilities
// 3D generation capabilities
@ -25,6 +26,7 @@ export function Generate3DNode({ id, data, selected }: NodeProps<Generate3DNodeT
const updateNodeData = useWorkflowStore ( ( state ) = > state . updateNodeData ) ;
const updateNodeData = useWorkflowStore ( ( state ) = > state . updateNodeData ) ;
const { replicateApiKey , falApiKey , kieApiKey } = useProviderApiKeys ( ) ;
const { replicateApiKey , falApiKey , kieApiKey } = useProviderApiKeys ( ) ;
const [ isBrowseDialogOpen , setIsBrowseDialogOpen ] = useState ( false ) ;
const [ isBrowseDialogOpen , setIsBrowseDialogOpen ] = useState ( false ) ;
const [ settingsTab , setSettingsTab ] = useState < "primary" | "fallback" > ( "primary" ) ;
// Inline parameters infrastructure
// Inline parameters infrastructure
const { inlineParametersEnabled } = useInlineParameters ( ) ;
const { inlineParametersEnabled } = useInlineParameters ( ) ;
@ -134,6 +136,19 @@ export function Generate3DNode({ id, data, selected }: NodeProps<Generate3DNodeT
onToggle = { handleToggleParams }
onToggle = { handleToggleParams }
nodeId = { id }
nodeId = { id }
>
>
{ /* Tab bar for primary/fallback settings */ }
{ nodeData . fallbackModel && (
< SettingsTabBar
activeTab = { settingsTab }
onTabChange = { setSettingsTab }
primaryLabel = { nodeData . selectedModel ? . displayName || "Primary" }
fallbackLabel = { nodeData . fallbackModel . displayName }
/ >
) }
{ /* Primary tab content */ }
{ settingsTab === "primary" && (
< >
{ /* Model selector: Browse button + current model display */ }
{ /* Model selector: Browse button + current model display */ }
< div className = "flex items-center justify-between gap-2" >
< div className = "flex items-center justify-between gap-2" >
< div className = "flex-1 min-w-0" >
< div className = "flex-1 min-w-0" >
@ -152,7 +167,7 @@ export function Generate3DNode({ id, data, selected }: NodeProps<Generate3DNodeT
< / button >
< / button >
< / div >
< / div >
{ /* External provider parameters - reuse ModelParameters component */ }
{ /* External provider parameters */ }
{ nodeData . selectedModel ? . modelId && (
{ nodeData . selectedModel ? . modelId && (
< ModelParameters
< ModelParameters
modelId = { nodeData . selectedModel . modelId }
modelId = { nodeData . selectedModel . modelId }
@ -162,6 +177,18 @@ export function Generate3DNode({ id, data, selected }: NodeProps<Generate3DNodeT
onInputsLoaded = { handleInputsLoaded }
onInputsLoaded = { handleInputsLoaded }
/ >
/ >
) }
) }
< / >
) }
{ /* Fallback tab content */ }
{ settingsTab === "fallback" && nodeData . fallbackModel && (
< ModelParameters
modelId = { nodeData . fallbackModel . modelId }
provider = { nodeData . fallbackModel . provider }
parameters = { nodeData . fallbackParameters || { } }
onParametersChange = { ( p ) = > updateNodeData ( id , { fallbackParameters : p } ) }
/ >
) }
< / InlineParameterPanel >
< / InlineParameterPanel >
) : undefined }
) : undefined }
>
>