import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faMusic, faSync } from "@fortawesome/free-solid-svg-icons"; import type { SongAssets } from "../lib/types"; import { SkeletonCard } from "./SkeletonCard"; import { TitlesCard } from "./cards/TitlesCard"; import { LyricsCard } from "./cards/LyricsCard"; import { StyleCard } from "./cards/StyleCard"; import { VideoPromptsCard } from "./cards/VideoPromptsCard"; import { YouTubeCard } from "./cards/YouTubeCard"; export type SectionKey = | "titles" | "lyrics" | "style" | "video_prompts" | "youtube_description"; export type RegeneratingMap = Partial>; interface ResultsPanelProps { assets: SongAssets | null; originalAssets: SongAssets | null; loading: boolean; selectedTitleIndex: number; onSelectTitle: (i: number) => void; onTitleEdit?: (customTitle: string) => void; onChange: (key: K, value: SongAssets[K]) => void; onChangeVideoPrompt: (index: number, value: string) => void; onRegenerateAll: () => void; onRegenerateSection: (section: SectionKey) => void; onCancel?: () => void; anyRegenerating: boolean; regenerating: RegeneratingMap; } export function ResultsPanel({ assets, originalAssets, loading, selectedTitleIndex, onSelectTitle, onTitleEdit, onChange, onChangeVideoPrompt, onRegenerateAll, onRegenerateSection, onCancel, anyRegenerating, regenerating, }: ResultsPanelProps) { const showSkeletons = loading && !assets; return (

Results

{anyRegenerating && onCancel && ( )} {assets && ( )}
{showSkeletons ? (
) : assets && originalAssets ? (
onRegenerateSection("titles")} regenerating={Boolean(regenerating.titles)} /> onChange("lyrics", v)} onRegenerate={() => onRegenerateSection("lyrics")} regenerating={Boolean(regenerating.lyrics)} /> onChange("style", v)} onNegativeChange={(v) => onChange("negative_style", v)} onRegenerate={() => onRegenerateSection("style")} regenerating={Boolean(regenerating.style)} /> onRegenerateSection("video_prompts")} regenerating={Boolean(regenerating.video_prompts)} /> onChange("youtube_description", v)} onRegenerate={() => onRegenerateSection("youtube_description")} regenerating={Boolean(regenerating.youtube_description)} />
) : ( )}
); } function EmptyState() { return (

Your song will appear here

Describe a music idea on the left and press{" "} Generate {" "} to create titles, lyrics, style, video prompts, and a YouTube description.

); }