import { Plus, Sparkles, UserCircle, Clapperboard, Trash2 } from "lucide-react"; import type { ProjectModeData } from "../../types"; interface ProjectSidebarProps { data: ProjectModeData; onDeleteScene: (sceneId: string) => void; } export function ProjectSidebar({ data, onDeleteScene }: ProjectSidebarProps) { const { project, scenes, shots, selectedSceneId, phase, onSelectScene, onAddScene } = data; if (scenes.length === 0) { return ; } return (

Description

{project.description || No description yet.}

Scenes
{scenes.map((scene) => { const sceneShots = shots.filter((s) => s.scene_id === scene.id); const generated = sceneShots.filter((s) => s.image_file).length; const active = scene.id === selectedSceneId; return (
onSelectScene(scene.id)} className={`w-full text-left rounded-xl px-3 py-2.5 transition cursor-pointer group ${active ? "bg-rose-600/10 ring-1 ring-rose-500/30" : "hover:bg-gray-900/50"}`} >
S{scene.scene_number} {scene.title || "Untitled scene"}
{scene.summary && (

{scene.summary}

)}
{sceneShots.length} shot{sceneShots.length === 1 ? "" : "s"} {generated > 0 && ( · {generated} rendered )}
); })}
); } function OutlineSidebar({ data }: ProjectSidebarProps) { const { project, onAddScene } = data; return (
Start the outline

Pitch your project to your agent and it'll draft scenes and shots here. No scenes yet — once they appear, this sidebar becomes a scene switcher.

Try saying

"Make me a 30s cyberpunk teaser, my character walking through neon rain."

"Put me in an Iron Man movie. Workshop, suit assembly, rooftop in the rain."

Project

Title

{project.title}

{project.description && (

Description

{project.description}

)}

Aspect

{project.aspect_ratio}

Duration

{project.duration_seconds ?? "—"}s

{project.characters.length > 0 && (

Cast

{project.characters.map((id) => ( {id} ))}
)}

Scenes hold the story beats. Shots inside scenes get rendered into images, then animated. Outline first; only generate after the structure is approved.

); }