import { useMemo, useState } from 'react'; import { PanelRightOpen, Sparkles } from 'lucide-react'; import { useGenerationActions } from '../hooks/use-generation-actions'; import { getModelSelectionUpdates } from '../lib/settings'; import { useStore } from '../store/useStore'; import { Button } from './ui/button'; import { Label } from './ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from './ui/select'; import { Textarea } from './ui/textarea'; import { useShallow } from 'zustand/react/shallow'; interface GenerationComposerProps { onOpenAdvanced: () => void; } export function GenerationComposer({ onOpenAdvanced }: GenerationComposerProps) { const { handleGenerate } = useGenerationActions(); const { availableModels, serverStatus, setSettings, settings, status } = useStore( useShallow((state) => ({ availableModels: state.availableModels, serverStatus: state.serverStatus, setSettings: state.setSettings, settings: state.settings, status: state.status, })), ); const [negativePromptOpen, setNegativePromptOpen] = useState(false); const modelOptions = useMemo( () => availableModels.map((model) => ({ label: model.name, value: model.path })), [availableModels], ); const activeModel = availableModels.find((model) => model.path === settings.model_path); const handleModelChange = (value: string) => { const selectedModel = availableModels.find((model) => model.path === value); if (!selectedModel) { setSettings({ model_path: value }); return; } setSettings(getModelSelectionUpdates(selectedModel, availableModels)); }; return (
Generate

Generate the next frame.

Choose a model, write the prompt, and run. Advanced controls stay out of the way until you need them.

{!serverStatus ? ( Engine offline ) : null}

{activeModel ? `${activeModel.type} ready` : 'Models load automatically when the backend is available.'}