fix: onboarding timeout cleanup, prop safety, and placeholder text
- TutorialOverlay: track all nested setTimeout IDs and clear on cleanup
to prevent ghost animations when tutorial is skipped mid-demonstration
- FTUXReadyStep: use strict local interface requiring both callbacks
instead of optional FTUXStepProps
- FTUXModelDefaultsStep: replace hardcoded "Gemini nano-banana-pro" with
"None set" for the no-model-selected state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@ -298,7 +306,7 @@ export function TutorialOverlay() {
targetHandle:"text",
});
setTimeout(()=>{
schedule(()=>{
// Connect Image → LLM (image for analysis)
onConnect({
source: generateNode.id,
@ -307,21 +315,21 @@ export function TutorialOverlay() {
targetHandle:"image",
});
setTimeout(()=>{
schedule(()=>{
// Populate LLM prompt
updateNodeData(llmPromptId,{
prompt:
"Give me an image generation prompt that shows this bird in a nightclub filled with other birds, also in costume. Only output the prompt and nothing else.",
});
setTimeout(()=>{
schedule(()=>{
// Add second Generate Image node
constgenerateNode2Id=addNode("nanoBanana",{
x: baseX+1100,
y: baseY+350,
});
setTimeout(()=>{
schedule(()=>{
// Connect LLM → Generate Image #2 (text prompt)
onConnect({
source: llmNodeId,
@ -330,7 +338,7 @@ export function TutorialOverlay() {
targetHandle:"text",
});
setTimeout(()=>{
schedule(()=>{
// Also connect original bird image as reference
onConnect({
source: generateNode.id,
@ -339,14 +347,14 @@ export function TutorialOverlay() {
targetHandle:"image",
});
setTimeout(()=>{
schedule(()=>{
// Add final Output
constfinalOutputId=addNode("output",{
x: baseX+1450,
y: baseY+350,
});
setTimeout(()=>{
schedule(()=>{
// Connect Generate Image #2 → Output
onConnect({
source: generateNode2Id,
@ -356,7 +364,7 @@ export function TutorialOverlay() {
});
// Final delay before advancing
setTimeout(()=>{
schedule(()=>{
completeCurrentStep();
nextTutorialStep();
},1000);
@ -377,6 +385,11 @@ export function TutorialOverlay() {