@yyc3/music-ai 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/AIAssistant.tsx","../src/components/AILyricsGenerator.tsx","../src/components/CreationStudio.tsx","../src/components/MVCreator.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { clsx } from 'clsx';\nimport {\n Mic, MicOff, X, ChevronDown, Sparkles,\n BrainCircuit, Clock, MessageSquare,\n} from 'lucide-react';\nimport type { AITip, VoiceCommand } from '@yyc3/music-hooks';\nimport { useI18n } from '@yyc3/music-hooks';\n\n// ==========================================\n// Types\n// ==========================================\ninterface AIAssistantProps {\n activeTips: AITip[];\n onDismissTip: (id: string) => void;\n onExecuteAction: (actionKey: string) => void;\n isListening: boolean;\n onToggleListening: () => void;\n voiceSupported: boolean;\n voiceFeedback: string;\n voiceHistory: VoiceCommand[];\n sessionInsight: string;\n isPlaying: boolean;\n audioEnergy: number;\n externalExpanded?: boolean;\n onExternalExpandedChange?: (expanded: boolean) => void;\n}\n\n// ==========================================\n// Voice Command Help\n// ==========================================\nconst VOICE_COMMANDS_ZH = [\n { cmd: '\"播放\"', desc: '播放音乐' },\n { cmd: '\"暂停\"', desc: '暂停音乐' },\n { cmd: '\"下一首\"', desc: '下一首歌' },\n { cmd: '\"上一首\"', desc: '上一首歌' },\n { cmd: '\"喜欢\"', desc: '点赞' },\n { cmd: '\"随机播放\"', desc: '切换随机' },\n { cmd: '\"音量大\"', desc: '增大音量' },\n { cmd: '\"音量小\"', desc: '减小音量' },\n { cmd: '\"静音\"', desc: '静音切换' },\n { cmd: '\"播放列表\"', desc: '打开列表' },\n { cmd: '\"创作\"', desc: 'AI歌词' },\n { cmd: '\"排行\"', desc: '排行榜' },\n { cmd: '\"评论\"', desc: '打开评论' },\n { cmd: '\"社区\"', desc: '社区动态' },\n { cmd: '\"分析\"', desc: '数据分析' },\n];\n\nconst VOICE_COMMANDS_EN = [\n { cmd: '\"play\"', desc: 'Play music' },\n { cmd: '\"pause\"', desc: 'Pause music' },\n { cmd: '\"next\"', desc: 'Next track' },\n { cmd: '\"previous\"', desc: 'Previous track' },\n { cmd: '\"like\"', desc: 'Like song' },\n { cmd: '\"shuffle\"', desc: 'Toggle shuffle' },\n { cmd: '\"volume up\"', desc: 'Increase volume' },\n { cmd: '\"volume down\"', desc: 'Decrease volume' },\n { cmd: '\"mute\"', desc: 'Mute toggle' },\n { cmd: '\"playlist\"', desc: 'Open playlist' },\n { cmd: '\"create\"', desc: 'AI Lyrics' },\n { cmd: '\"leaderboard\"', desc: 'Rankings' },\n { cmd: '\"comment\"', desc: 'Comments' },\n { cmd: '\"community\"', desc: 'Community' },\n { cmd: '\"analytics\"', desc: 'Analytics' },\n];\n\n// ==========================================\n// Component\n// ==========================================\nexport const AIAssistant: React.FC<AIAssistantProps> = ({\n activeTips,\n onDismissTip,\n onExecuteAction,\n isListening,\n onToggleListening,\n voiceSupported,\n voiceFeedback,\n voiceHistory,\n sessionInsight,\n isPlaying,\n audioEnergy,\n externalExpanded,\n onExternalExpandedChange,\n}) => {\n const { t, lang } = useI18n();\n const [isExpanded, setIsExpanded] = useState(false);\n const [showCommands, setShowCommands] = useState(false);\n const tipContainerRef = useRef<HTMLDivElement>(null);\n\n const voiceCommands = lang === 'zh' ? VOICE_COMMANDS_ZH : VOICE_COMMANDS_EN;\n\n // Sync with external expanded state (logo click)\n useEffect(() => {\n if (externalExpanded !== undefined) {\n setIsExpanded(externalExpanded);\n }\n }, [externalExpanded]);\n\n const handleSetExpanded = (val: boolean) => {\n setIsExpanded(val);\n onExternalExpandedChange?.(val);\n };\n\n // Auto-expand when tips arrive — no auto\n useEffect(() => {}, [activeTips.length]);\n\n const CATEGORY_COLORS: Record<string, string> = {\n emotion: 'from-pink-500/20 to-purple-500/20 border-pink-500/30',\n achievement: 'from-yellow-500/20 to-amber-500/20 border-yellow-500/30',\n streak: 'from-orange-500/20 to-red-500/20 border-orange-500/30',\n discovery: 'from-blue-500/20 to-cyan-500/20 border-blue-500/30',\n interaction: 'from-green-500/20 to-teal-500/20 border-green-500/30',\n voice: 'from-indigo-500/20 to-violet-500/20 border-indigo-500/30',\n system: 'from-gray-500/20 to-slate-500/20 border-white/10',\n };\n\n return (\n <>\n {/* ===== Floating Tips (Non-intrusive, top-left) ===== */}\n <div\n ref={tipContainerRef}\n className=\"fixed top-20 left-4 z-[45] flex flex-col gap-2 max-w-[340px] pointer-events-none\"\n >\n <AnimatePresence mode=\"popLayout\">\n {activeTips.map((tip) => (\n <motion.div\n key={tip.id}\n initial={{ opacity: 0, x: -50, scale: 0.9 }}\n animate={{ opacity: 1, x: 0, scale: 1 }}\n exit={{ opacity: 0, x: -50, scale: 0.9 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n className={clsx(\n 'pointer-events-auto bg-gradient-to-r backdrop-blur-2xl rounded-xl border p-3 shadow-2xl',\n CATEGORY_COLORS[tip.category] || CATEGORY_COLORS.system\n )}\n >\n <div className=\"flex items-start gap-2.5\">\n <span className=\"text-lg flex-shrink-0 mt-0.5\">{tip.icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-white/80 leading-relaxed\">{tip.message}</p>\n {tip.actionLabel && tip.actionKey && (\n <button\n onClick={() => {\n onExecuteAction(tip.actionKey!);\n onDismissTip(tip.id);\n }}\n className=\"mt-2 text-[11px] font-medium px-3 py-1 rounded-full bg-white/10 hover:bg-white/20 text-white/90 transition-colors border border-white/10\"\n >\n {tip.actionLabel}\n </button>\n )}\n </div>\n <button\n onClick={() => onDismissTip(tip.id)}\n className=\"text-white/30 hover:text-white/60 transition-colors flex-shrink-0 p-0.5\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n {/* Progress bar for tip expiry */}\n <motion.div\n className=\"absolute bottom-0 left-0 h-[2px] bg-white/20 rounded-b-xl\"\n initial={{ width: '100%' }}\n animate={{ width: '0%' }}\n transition={{ duration: 30, ease: 'linear' }}\n />\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n\n {/* ===== Voice Feedback Overlay ===== */}\n <AnimatePresence>\n {voiceFeedback && (\n <motion.div\n key=\"voice-fb\"\n initial={{ opacity: 0, y: 20, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.9 }}\n className=\"fixed bottom-32 left-1/2 -translate-x-1/2 z-[70] bg-black/70 backdrop-blur-2xl rounded-2xl px-5 py-3 border border-white/10 shadow-2xl\"\n >\n <p className=\"text-sm text-white/90 font-medium whitespace-nowrap\">{voiceFeedback}</p>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* ===== Listening Overlay ===== */}\n <AnimatePresence>\n {isListening && (\n <motion.div\n key=\"listening-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[65] pointer-events-none flex items-center justify-center\"\n >\n {/* Concentric pulse rings */}\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"absolute rounded-full border border-purple-400/20\"\n animate={{\n width: [80, 200 + i * 60],\n height: [80, 200 + i * 60],\n opacity: [0.4, 0],\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n delay: i * 0.5,\n ease: 'easeOut',\n }}\n />\n ))}\n\n {/* Center mic icon */}\n <motion.div\n className=\"w-20 h-20 rounded-full bg-purple-600/30 backdrop-blur-xl border border-purple-400/40 flex items-center justify-center shadow-2xl shadow-purple-500/30\"\n animate={{ scale: [1, 1.1, 1] }}\n transition={{ duration: 1, repeat: Infinity, ease: 'easeInOut' }}\n >\n <Mic className=\"w-8 h-8 text-purple-300\" />\n </motion.div>\n\n {/* Label */}\n <motion.p\n className=\"absolute mt-32 text-sm text-purple-300/80 font-medium\"\n animate={{ opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 2, repeat: Infinity }}\n >\n {lang === 'zh' ? '正在聆听...' : 'Listening...'}\n </motion.p>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* ===== AI Assistant FAB (Bottom-left, desktop only — mobile uses logo) ===== */}\n <div className=\"fixed bottom-[120px] md:bottom-28 left-4 z-[55] hidden md:flex flex-col items-start gap-2\">\n {/* Expanded Panel */}\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.9 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n className=\"w-72 md:w-80 bg-[#0D1235]/95 backdrop-blur-2xl rounded-2xl border border-white/10 shadow-2xl overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-white/[0.06]\">\n <div className=\"flex items-center gap-2\">\n <BrainCircuit className=\"w-4 h-4 text-purple-400\" />\n <span className=\"text-sm font-semibold text-white/90\">\n {lang === 'zh' ? 'AI 助手' : 'AI Assistant'}\n </span>\n </div>\n <button\n onClick={() => handleSetExpanded(false)}\n className=\"p-1 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 space-y-4 max-h-[50vh] overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n {/* Session Insight */}\n <div className=\"flex items-center gap-2 px-3 py-2 bg-white/[0.03] rounded-lg border border-white/[0.06]\">\n <Clock className=\"w-3.5 h-3.5 text-white/30 flex-shrink-0\" />\n <p className=\"text-[11px] text-white/50\">{sessionInsight}</p>\n </div>\n\n {/* Voice Section */}\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider\">\n {lang === 'zh' ? '语音指令' : 'Voice Commands'}\n </p>\n <button\n onClick={() => setShowCommands(!showCommands)}\n className=\"text-[10px] text-purple-400/60 hover:text-purple-400 transition-colors\"\n >\n {showCommands\n ? (lang === 'zh' ? '收起' : 'Hide')\n : (lang === 'zh' ? '查看指令表' : 'Show commands')\n }\n </button>\n </div>\n\n {/* Mic Button */}\n {voiceSupported ? (\n <button\n onClick={onToggleListening}\n className={clsx(\n 'w-full flex items-center justify-center gap-2 py-2.5 rounded-xl border transition-all',\n isListening\n ? 'bg-purple-600/20 border-purple-500/40 text-purple-300'\n : 'bg-white/[0.03] border-white/[0.08] text-white/50 hover:text-white/80 hover:bg-white/[0.06]'\n )}\n >\n {isListening ? (\n <>\n <motion.div\n animate={{ scale: [1, 1.2, 1] }}\n transition={{ duration: 1, repeat: Infinity }}\n >\n <Mic className=\"w-4 h-4\" />\n </motion.div>\n <span className=\"text-sm\">{lang === 'zh' ? '正在聆听...' : 'Listening...'}</span>\n </>\n ) : (\n <>\n <Mic className=\"w-4 h-4\" />\n <span className=\"text-sm\">{lang === 'zh' ? '点击说出指令' : 'Tap to speak'}</span>\n </>\n )}\n </button>\n ) : (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-white/[0.02] rounded-lg text-white/30 text-xs\">\n <MicOff className=\"w-3.5 h-3.5\" />\n {lang === 'zh' ? '当前浏览器不支持语音识别' : 'Voice not supported in this browser'}\n </div>\n )}\n\n {/* Command List */}\n <AnimatePresence>\n {showCommands && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"mt-2 grid grid-cols-2 gap-1\">\n {voiceCommands.map((vc, i) => (\n <div key={i} className=\"flex items-center gap-1.5 px-2 py-1 rounded-lg bg-white/[0.02]\">\n <span className=\"text-[10px] text-purple-400 font-mono\">{vc.cmd}</span>\n <span className=\"text-[10px] text-white/30\">{vc.desc}</span>\n </div>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Voice History */}\n {voiceHistory.length > 0 && (\n <div className=\"mt-2 space-y-1\">\n <p className=\"text-[10px] text-white/25 uppercase tracking-wider\">\n {lang === 'zh' ? '最近指令' : 'Recent'}\n </p>\n {voiceHistory.slice(-3).reverse().map((vh, i) => (\n <div key={i} className=\"flex items-center gap-2 px-2 py-1 rounded-lg bg-white/[0.02]\">\n <MessageSquare className=\"w-3 h-3 text-white/20 flex-shrink-0\" />\n <span className=\"text-[10px] text-white/40 truncate\">\"{vh.transcript}\"</span>\n <span className=\"text-[10px] text-green-400/60 ml-auto flex-shrink-0\">✓</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* AI Tips Section */}\n {activeTips.length > 0 && (\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '智能提示' : 'AI Insights'}\n </p>\n <div className=\"space-y-2\">\n {activeTips.map((tip) => (\n <div\n key={tip.id}\n className={clsx(\n 'flex items-start gap-2 px-3 py-2 rounded-lg bg-gradient-to-r border',\n CATEGORY_COLORS[tip.category] || CATEGORY_COLORS.system\n )}\n >\n <span className=\"text-sm flex-shrink-0\">{tip.icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[11px] text-white/70 leading-relaxed\">{tip.message}</p>\n {tip.actionLabel && tip.actionKey && (\n <button\n onClick={() => {\n onExecuteAction(tip.actionKey!);\n onDismissTip(tip.id);\n }}\n className=\"mt-1 text-[10px] font-medium px-2 py-0.5 rounded-full bg-white/10 hover:bg-white/20 text-white/80 transition-colors\"\n >\n {tip.actionLabel}\n </button>\n )}\n </div>\n <button\n onClick={() => onDismissTip(tip.id)}\n className=\"text-white/20 hover:text-white/50 flex-shrink-0\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* FAB Button */}\n <motion.button\n onClick={() => handleSetExpanded(!isExpanded)}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className={clsx(\n 'relative w-12 h-12 rounded-full flex items-center justify-center shadow-2xl transition-all border',\n isListening\n ? 'bg-purple-600 border-purple-400/50 shadow-purple-500/40'\n : isExpanded\n ? 'bg-[#0D1235] border-purple-500/30'\n : 'bg-[#0D1235]/90 backdrop-blur-xl border-white/10 hover:border-purple-500/30'\n )}\n style={{\n boxShadow: isListening\n ? `0 0 ${15 + audioEnergy * 20}px rgba(139,92,246,0.4)`\n : isPlaying\n ? `0 0 ${8 + audioEnergy * 12}px rgba(139,92,246,0.15)`\n : undefined,\n }}\n >\n {isListening ? (\n <motion.div\n animate={{ scale: [1, 1.2, 1] }}\n transition={{ duration: 0.8, repeat: Infinity }}\n >\n <Mic className=\"w-5 h-5 text-white\" />\n </motion.div>\n ) : (\n <BrainCircuit className=\"w-5 h-5 text-purple-400\" />\n )}\n\n {/* Notification badge */}\n {activeTips.length > 0 && !isExpanded && (\n <motion.div\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n className=\"absolute -top-1 -right-1 w-4 h-4 rounded-full bg-pink-500 text-white text-[9px] font-bold flex items-center justify-center\"\n >\n {activeTips.length}\n </motion.div>\n )}\n\n {/* Ambient pulse when playing */}\n {isPlaying && !isListening && (\n <motion.div\n className=\"absolute inset-0 rounded-full border border-purple-500/20\"\n animate={{ scale: [1, 1.4, 1], opacity: [0.3, 0, 0.3] }}\n transition={{ duration: 3, repeat: Infinity, ease: 'easeInOut' }}\n />\n )}\n </motion.button>\n\n {/* Quick mic button (separate from FAB when collapsed) */}\n {voiceSupported && !isExpanded && (\n <motion.button\n onClick={onToggleListening}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n className={clsx(\n 'w-9 h-9 rounded-full flex items-center justify-center border transition-all',\n isListening\n ? 'bg-purple-600 border-purple-400/50 text-white'\n : 'bg-[#0D1235]/80 backdrop-blur-xl border-white/10 text-white/40 hover:text-purple-400 hover:border-purple-500/30'\n )}\n >\n {isListening ? (\n <MicOff className=\"w-3.5 h-3.5\" />\n ) : (\n <Mic className=\"w-3.5 h-3.5\" />\n )}\n </motion.button>\n )}\n </div>\n\n {/* ===== Mobile AI Panel (triggered from logo) ===== */}\n <AnimatePresence>\n {isExpanded && (\n <>\n {/* Mobile backdrop */}\n <motion.div\n key=\"mobile-ai-backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"md:hidden fixed inset-0 z-[55] bg-black/40\"\n onClick={() => handleSetExpanded(false)}\n />\n <motion.div\n key=\"mobile-ai-overlay\"\n initial={{ opacity: 0, y: 30 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 30 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n className=\"md:hidden fixed left-3 right-3 top-14 z-[56] max-h-[70vh] bg-[#0D1235]/98 backdrop-blur-2xl rounded-2xl border border-white/10 shadow-2xl overflow-hidden\"\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-white/[0.06]\">\n <div className=\"flex items-center gap-2\">\n <BrainCircuit className=\"w-4 h-4 text-purple-400\" />\n <span className=\"text-sm font-semibold text-white/90\">\n {lang === 'zh' ? 'AI 助手' : 'AI Assistant'}\n </span>\n </div>\n <button\n onClick={() => handleSetExpanded(false)}\n className=\"p-1.5 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"p-4 space-y-3 max-h-[60vh] overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n <div className=\"flex items-center gap-2 px-3 py-2 bg-white/[0.03] rounded-lg border border-white/[0.06]\">\n <Clock className=\"w-3.5 h-3.5 text-white/30 flex-shrink-0\" />\n <p className=\"text-[11px] text-white/50\">{sessionInsight}</p>\n </div>\n {voiceSupported && (\n <button\n onClick={onToggleListening}\n className={clsx(\n 'w-full flex items-center justify-center gap-2 py-3 rounded-xl border transition-all',\n isListening\n ? 'bg-purple-600/20 border-purple-500/40 text-purple-300'\n : 'bg-white/[0.03] border-white/[0.08] text-white/50'\n )}\n >\n <Mic className=\"w-5 h-5\" />\n <span className=\"text-sm\">{isListening ? (lang === 'zh' ? '正在聆听...' : 'Listening...') : (lang === 'zh' ? '点击说出指令' : 'Tap to speak')}</span>\n </button>\n )}\n {activeTips.length > 0 && (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider\">{lang === 'zh' ? '智能提示' : 'AI Tips'}</p>\n {activeTips.map(tip => (\n <div key={tip.id} className={clsx('flex items-start gap-2 px-3 py-2 rounded-lg bg-gradient-to-r border', CATEGORY_COLORS[tip.category] || CATEGORY_COLORS.system)}>\n <span className=\"text-sm flex-shrink-0\">{tip.icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[11px] text-white/70 leading-relaxed\">{tip.message}</p>\n {tip.actionLabel && tip.actionKey && (\n <button onClick={() => { onExecuteAction(tip.actionKey!); onDismissTip(tip.id); }} className=\"mt-1 text-[10px] font-medium px-2 py-0.5 rounded-full bg-white/10 text-white/80\">{tip.actionLabel}</button>\n )}\n </div>\n <button onClick={() => onDismissTip(tip.id)} className=\"text-white/20\"><X className=\"w-3 h-3\" /></button>\n </div>\n ))}\n </div>\n )}\n {voiceHistory.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"text-[10px] text-white/25 uppercase tracking-wider\">{lang === 'zh' ? '最近指令' : 'Recent'}</p>\n {voiceHistory.slice(-3).reverse().map((vh, i) => (\n <div key={i} className=\"flex items-center gap-2 px-2 py-1 rounded-lg bg-white/[0.02]\">\n <MessageSquare className=\"w-3 h-3 text-white/20 flex-shrink-0\" />\n <span className=\"text-[10px] text-white/40 truncate\">\"{vh.transcript}\"</span>\n <span className=\"text-[10px] text-green-400/60 ml-auto\">✓</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n};","import React, { useState, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport {\n X,\n Wand2,\n Copy,\n Check,\n Loader2,\n Sparkles,\n Smile,\n Frown,\n Zap,\n Cloud,\n Heart,\n RefreshCw,\n Plus,\n Minus,\n Music,\n Volume2,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { apiFetch } from '@yyc3/music-utils';\nimport { useI18n } from '@yyc3/music-hooks';\nimport { useAudioComposer, type CompositionParams } from '@yyc3/music-hooks';\n\ninterface AILyricsGeneratorProps {\n isOpen: boolean;\n onClose: () => void;\n onCreateTrack?: (lyrics: string[], theme: AILyricsTheme, audioBlobUrl?: string, compositionParams?: CompositionParams) => void;\n}\n\nexport type AILyricsTheme = 'happy' | 'sad' | 'energetic' | 'calm' | 'love';\n\nconst THEMES: Array<{\n id: AILyricsTheme;\n label: string;\n labelZh: string;\n icon: React.ElementType;\n color: string;\n bg: string;\n}> = [\n { id: 'happy', label: 'Happy', labelZh: '快乐', icon: Smile, color: 'text-yellow-400', bg: 'from-yellow-500/20 to-orange-500/20' },\n { id: 'sad', label: 'Sad', labelZh: '忧伤', icon: Frown, color: 'text-blue-400', bg: 'from-blue-500/20 to-indigo-500/20' },\n { id: 'energetic', label: 'Energetic', labelZh: '活力', icon: Zap, color: 'text-red-400', bg: 'from-red-500/20 to-orange-500/20' },\n { id: 'calm', label: 'Calm', labelZh: '宁静', icon: Cloud, color: 'text-cyan-400', bg: 'from-cyan-500/20 to-teal-500/20' },\n { id: 'love', label: 'Love', labelZh: '爱情', icon: Heart, color: 'text-pink-400', bg: 'from-pink-500/20 to-red-500/20' },\n];\n\nexport const AILyricsGenerator: React.FC<AILyricsGeneratorProps> = ({\n isOpen,\n onClose,\n onCreateTrack,\n}) => {\n const [selectedTheme, setSelectedTheme] = useState<AILyricsTheme>('happy');\n const [keywords, setKeywords] = useState<string[]>([]);\n const [keywordInput, setKeywordInput] = useState('');\n const [lineCount, setLineCount] = useState(8);\n const [generating, setGenerating] = useState(false);\n const [generatedLyrics, setGeneratedLyrics] = useState<string[] | null>(null);\n const [copied, setCopied] = useState(false);\n const [generationCount, setGenerationCount] = useState(0);\n const [trackCreated, setTrackCreated] = useState(false);\n const [compositionStage, setCompositionStage] = useState<'idle' | 'composing-params' | 'synthesizing' | 'done'>('idle');\n const composer = useAudioComposer();\n const { t, lang } = useI18n();\n\n const addKeyword = useCallback(() => {\n const trimmed = keywordInput.trim();\n if (trimmed && keywords.length < 5 && !keywords.includes(trimmed)) {\n setKeywords((prev) => [...prev, trimmed]);\n setKeywordInput('');\n }\n }, [keywordInput, keywords]);\n\n const removeKeyword = useCallback((kw: string) => {\n setKeywords((prev) => prev.filter((k) => k !== kw));\n }, []);\n\n const handleGenerate = useCallback(async () => {\n setGenerating(true);\n try {\n const result = await apiFetch<{\n success: boolean;\n lyrics: string[];\n theme: string;\n themeLabel: string;\n }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: selectedTheme,\n keywords,\n lines: lineCount,\n }),\n });\n\n if (result?.lyrics) {\n setGeneratedLyrics(result.lyrics);\n setGenerationCount((prev) => prev + 1);\n }\n } catch (err) {\n console.error('AI lyrics generation failed:', err);\n } finally {\n setGenerating(false);\n }\n }, [selectedTheme, keywords, lineCount]);\n\n const handleCopy = useCallback(() => {\n if (generatedLyrics) {\n navigator.clipboard.writeText(generatedLyrics.join('\\n'));\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [generatedLyrics]);\n\n const handleCreateTrack = useCallback(async () => {\n if (!generatedLyrics || !onCreateTrack) return;\n\n setCompositionStage('composing-params');\n // Haptic feedback\n try { navigator.vibrate?.(25); } catch {}\n\n try {\n // Step 1: Get composition parameters from backend\n const compResult = await apiFetch<{\n success: boolean;\n composition: CompositionParams;\n }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: selectedTheme,\n lyrics: generatedLyrics,\n lineCount,\n }),\n });\n\n if (!compResult?.composition) {\n // Fallback: create track without synthesized audio\n onCreateTrack(generatedLyrics, selectedTheme);\n setTrackCreated(true);\n setCompositionStage('done');\n setTimeout(() => { setTrackCreated(false); setCompositionStage('idle'); }, 2500);\n return;\n }\n\n setCompositionStage('synthesizing');\n\n // Step 2: Synthesize audio using Web Audio API\n const audioBlobUrl = await composer.compose(compResult.composition);\n\n // Step 3: Create the track with real audio\n onCreateTrack(generatedLyrics, selectedTheme, audioBlobUrl, compResult.composition);\n setTrackCreated(true);\n setCompositionStage('done');\n try { navigator.vibrate?.([10, 30, 10, 30, 40]); } catch {} // success haptic\n setTimeout(() => { setTrackCreated(false); setCompositionStage('idle'); }, 2500);\n } catch (err) {\n console.error('Composition pipeline failed:', err);\n // Fallback: create track with demo oscillators\n onCreateTrack(generatedLyrics, selectedTheme);\n setTrackCreated(true);\n setCompositionStage('done');\n setTimeout(() => { setTrackCreated(false); setCompositionStage('idle'); }, 2500);\n }\n }, [generatedLyrics, onCreateTrack, selectedTheme, lineCount, composer]);\n\n const currentTheme = THEMES.find((t) => t.id === selectedTheme)!;\n\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[60] bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n <motion.div\n initial={{ y: '100%', opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: '100%', opacity: 0 }}\n transition={{ type: 'spring', damping: 28, stiffness: 300 }}\n className=\"fixed inset-x-0 bottom-0 z-[61] max-h-[90vh] bg-[#0D1235]/95 backdrop-blur-2xl border-t border-white/10 rounded-t-3xl flex flex-col shadow-2xl md:inset-x-auto md:left-1/2 md:-translate-x-1/2 md:w-full md:max-w-lg md:bottom-auto md:top-1/2 md:-translate-y-1/2 md:rounded-2xl md:border md:max-h-[85vh]\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-5 pb-3 border-b border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-9 h-9 rounded-xl bg-gradient-to-tr from-purple-500/20 to-pink-500/20 border border-white/10 flex items-center justify-center\">\n <Wand2 className=\"w-4.5 h-4.5 text-purple-400\" />\n </div>\n <div>\n <h3 className=\"text-white font-semibold text-sm leading-tight\">{t('aiLyrics.title')}</h3>\n <p className=\"text-white/30 text-xs\">\n {t('aiLyrics.subtitle')}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-5 space-y-5\" style={{ scrollbarWidth: 'none' }}>\n {/* Theme Selection */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {t('aiLyrics.theme')}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map((theme) => {\n const Icon = theme.icon;\n const isActive = selectedTheme === theme.id;\n return (\n <button\n key={theme.id}\n onClick={() => setSelectedTheme(theme.id)}\n className={clsx(\n 'p-3 rounded-xl border transition-all text-center',\n isActive\n ? `bg-gradient-to-br ${theme.bg} border-white/15 shadow-lg`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n <Icon\n className={clsx(\n 'w-5 h-5 mx-auto mb-1',\n isActive ? theme.color : 'text-white/30'\n )}\n />\n <p className={clsx('text-[10px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Keywords */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {t('aiLyrics.keywords')} <span className=\"text-white/20\">({keywords.length}/5)</span>\n </p>\n <div className=\"flex gap-2 mb-2\">\n <input\n type=\"text\"\n value={keywordInput}\n onChange={(e) => setKeywordInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && addKeyword()}\n placeholder={t('aiLyrics.enterKeyword')}\n className=\"flex-1 bg-white/5 border border-white/10 rounded-lg py-2 px-3 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-purple-500/50\"\n />\n <button\n onClick={addKeyword}\n disabled={!keywordInput.trim() || keywords.length >= 5}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white hover:bg-white/10 transition-colors disabled:opacity-30\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n {keywords.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {keywords.map((kw) => (\n <motion.span\n key={kw}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n className=\"inline-flex items-center gap-1 px-2.5 py-1 bg-purple-500/10 border border-purple-500/20 rounded-full text-xs text-purple-300\"\n >\n {kw}\n <button onClick={() => removeKeyword(kw)} className=\"text-purple-400/60 hover:text-purple-300\">\n <X className=\"w-3 h-3\" />\n </button>\n </motion.span>\n ))}\n </div>\n )}\n </div>\n\n {/* Line Count */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {t('aiLyrics.lines')}\n </p>\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => setLineCount(Math.max(4, lineCount - 2))}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\"\n >\n <Minus className=\"w-4 h-4\" />\n </button>\n <div className=\"flex-1 text-center\">\n <span className=\"text-2xl font-bold text-white font-mono\">{lineCount}</span>\n <span className=\"text-xs text-white/30 ml-1\">{t('aiLyrics.linesUnit')}</span>\n </div>\n <button\n onClick={() => setLineCount(Math.min(16, lineCount + 2))}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Generate Button */}\n <motion.button\n onClick={handleGenerate}\n disabled={generating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-3 rounded-xl bg-gradient-to-r from-purple-600 via-pink-600 to-blue-600 text-white font-medium flex items-center justify-center gap-2 shadow-lg shadow-purple-500/20 disabled:opacity-50 transition-opacity\"\n >\n {generating ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n {t('aiLyrics.generating')}\n </>\n ) : (\n <>\n <Sparkles className=\"w-4 h-4\" />\n {generationCount > 0 ? t('aiLyrics.regenerate') : t('aiLyrics.generate')}\n </>\n )}\n </motion.button>\n\n {/* Generated Lyrics */}\n <AnimatePresence>\n {generatedLyrics && (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 20 }}\n className=\"space-y-3\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <currentTheme.icon className={clsx('w-4 h-4', currentTheme.color)} />\n <p className=\"text-xs text-white/50\">\n {t('aiLyrics.generated')} · {lang === 'zh' ? currentTheme.labelZh : currentTheme.label} {t('aiLyrics.themeSuffix')}\n </p>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={handleGenerate}\n disabled={generating}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n title=\"Regenerate\"\n >\n <RefreshCw className={clsx('w-3.5 h-3.5', generating && 'animate-spin')} />\n </button>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1 px-2.5 py-1 rounded-lg bg-white/5 border border-white/[0.08] text-xs text-white/50 hover:text-white/80 transition-colors\"\n >\n {copied ? (\n <>\n <Check className=\"w-3 h-3 text-green-400\" />\n <span className=\"text-green-400\">{t('aiLyrics.copied')}</span>\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3\" />\n {t('aiLyrics.copy')}\n </>\n )}\n </button>\n {onCreateTrack && (\n <button\n onClick={handleCreateTrack}\n disabled={compositionStage !== 'idle' && compositionStage !== 'done'}\n className={clsx(\n 'flex items-center gap-1 px-2.5 py-1 rounded-lg border text-xs transition-colors',\n compositionStage === 'idle' || compositionStage === 'done'\n ? 'bg-white/5 border-white/[0.08] text-white/50 hover:text-white/80'\n : 'bg-purple-500/10 border-purple-500/20 text-purple-300'\n )}\n >\n {trackCreated ? (\n <>\n <Check className=\"w-3 h-3 text-green-400\" />\n <span className=\"text-green-400\">{t('aiLyrics.trackCreated')}</span>\n </>\n ) : compositionStage === 'composing-params' ? (\n <>\n <Loader2 className=\"w-3 h-3 animate-spin text-purple-400\" />\n <span>{lang === 'zh' ? '编曲中...' : 'Composing...'}</span>\n </>\n ) : compositionStage === 'synthesizing' ? (\n <>\n <Volume2 className=\"w-3 h-3 animate-pulse text-purple-400\" />\n <span>{lang === 'zh' ? `合成 ${Math.round(composer.progress * 100)}%` : `Synth ${Math.round(composer.progress * 100)}%`}</span>\n </>\n ) : (\n <>\n <Music className=\"w-3 h-3\" />\n {lang === 'zh' ? '创建歌曲' : 'Create Track'}\n </>\n )}\n </button>\n )}\n </div>\n </div>\n\n <div className={clsx('rounded-xl border p-4 bg-gradient-to-br', currentTheme.bg, 'border-white/[0.08]')}>\n <div className=\"space-y-2\">\n {generatedLyrics.map((line, i) => (\n <motion.p\n key={`${generationCount}-${i}`}\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.08 }}\n className=\"text-sm text-white/80 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n};","import React, { useState, useCallback, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport {\n X, Wand2, Copy, Check, Loader2, Sparkles,\n Smile, Frown, Zap, Cloud, Heart,\n Plus, Minus, Music, ChevronRight,\n Layers, FolderOpen,\n Trash2, Clock,\n ArrowLeft, Settings2,\n Share2, Film, ExternalLink,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { apiFetch } from '@yyc3/music-utils';\nimport { useI18n } from '@yyc3/music-hooks';\nimport { useAudioComposer, type CompositionParams } from '@yyc3/music-hooks';\nimport type { Track } from '@yyc3/music-data';\n\n// ==========================================\n// AI Creation Studio\n// ==========================================\n// A comprehensive music creation hub with multiple modes:\n// 1. Quick Song (极简写歌) — fast AI lyrics + compose\n// 2. Master Mode (大师写歌) — advanced controls for theme, structure, instruments\n// 3. Remix Mode (热歌改编/AI翻唱) — transform existing tracks\n// 4. My Works (作品管理) — manage created tracks\n\ntype CreationMode = 'quick' | 'master' | 'remix' | 'works' | 'mv';\ntype AILyricsTheme = 'happy' | 'sad' | 'energetic' | 'calm' | 'love';\n\ninterface CreationStudioProps {\n isOpen: boolean;\n onClose: () => void;\n onCreateTrack?: (\n lyrics: string[],\n theme: string,\n audioBlobUrl?: string,\n compositionParams?: CompositionParams\n ) => void;\n playlist: Track[];\n currentTrackIndex: number;\n onHaptic?: (pattern: string) => void;\n onShareWork?: (work: CreatedWork) => void;\n onOpenMV?: (workLyrics?: string[]) => void;\n user?: any;\n starPower?: number;\n onStarPowerUpdate?: (sp: number) => void;\n}\n\nconst THEMES: Array<{\n id: AILyricsTheme;\n label: string;\n labelZh: string;\n icon: React.ElementType;\n color: string;\n bg: string;\n premium?: boolean;\n spCost?: number;\n}> = [\n { id: 'happy', label: 'Happy', labelZh: '快乐', icon: Smile, color: 'text-yellow-400', bg: 'from-yellow-500/20 to-orange-500/20' },\n { id: 'sad', label: 'Sad', labelZh: '忧伤', icon: Frown, color: 'text-blue-400', bg: 'from-blue-500/20 to-indigo-500/20' },\n { id: 'energetic', label: 'Energetic', labelZh: '活力', icon: Zap, color: 'text-red-400', bg: 'from-red-500/20 to-orange-500/20', premium: true, spCost: 200 },\n { id: 'calm', label: 'Calm', labelZh: '宁静', icon: Cloud, color: 'text-cyan-400', bg: 'from-cyan-500/20 to-teal-500/20' },\n { id: 'love', label: 'Love', labelZh: '爱情', icon: Heart, color: 'text-pink-400', bg: 'from-pink-500/20 to-red-500/20', premium: true, spCost: 200 },\n];\n\nconst MODES: Array<{\n id: CreationMode;\n label: string;\n labelZh: string;\n icon: React.ElementType;\n desc: string;\n descZh: string;\n gradient: string;\n}> = [\n {\n id: 'quick',\n label: 'Quick Song',\n labelZh: '极简写歌',\n icon: Sparkles,\n desc: 'AI lyrics + auto compose in seconds',\n descZh: '一键AI写词作曲,秒出成品',\n gradient: 'from-purple-500 to-pink-500',\n },\n {\n id: 'master',\n label: 'Master Mode',\n labelZh: '大师写歌',\n icon: Settings2,\n desc: 'Full control over theme, structure & style',\n descZh: '精细控制主题、结构与风格',\n gradient: 'from-indigo-500 to-blue-500',\n },\n {\n id: 'remix',\n label: 'Remix & Cover',\n labelZh: '热歌改编',\n icon: Layers,\n desc: 'Transform existing tracks with AI',\n descZh: 'AI改编翻唱热门曲目',\n gradient: 'from-orange-500 to-red-500',\n },\n {\n id: 'works',\n label: 'My Works',\n labelZh: '作品管理',\n icon: FolderOpen,\n desc: 'View & manage your creations',\n descZh: '查看管理你的创作',\n gradient: 'from-emerald-500 to-teal-500',\n },\n {\n id: 'mv',\n label: 'MV Creator',\n labelZh: 'MV 创作',\n icon: Film,\n desc: 'Visualize music with AI effects',\n descZh: 'AI驱动音乐可视化MV',\n gradient: 'from-cyan-500 to-blue-500',\n },\n];\n\n// Song structures for Master Mode\nconst STRUCTURES = [\n { id: 'verse-chorus', label: 'Verse-Chorus', labelZh: '主副歌' },\n { id: 'verse-bridge', label: 'Verse-Bridge', labelZh: '主歌-桥段' },\n { id: 'aaba', label: 'AABA', labelZh: 'AABA经典' },\n { id: 'through', label: 'Through-composed', labelZh: '通谱体' },\n];\n\nconst INSTRUMENTS = [\n { id: 'piano', label: 'Piano', labelZh: '钢琴', emoji: '🎹' },\n { id: 'guitar', label: 'Guitar', labelZh: '吉他', emoji: '🎸' },\n { id: 'synth', label: 'Synth', labelZh: '合成器', emoji: '🎛️' },\n { id: 'strings', label: 'Strings', labelZh: '弦乐', emoji: '🎻' },\n { id: 'drums', label: 'Drums', labelZh: '鼓', emoji: '🥁' },\n { id: 'bass', label: 'Bass', labelZh: '贝斯', emoji: '🎸' },\n];\n\n// Stored works type\ninterface CreatedWork {\n id: string;\n title: string;\n theme: string;\n lyrics: string[];\n createdAt: number;\n mode: string;\n}\n\nexport const CreationStudio: React.FC<CreationStudioProps> = ({\n isOpen,\n onClose,\n onCreateTrack,\n playlist,\n currentTrackIndex,\n onHaptic,\n onShareWork,\n onOpenMV,\n user,\n starPower = 0,\n onStarPowerUpdate,\n}) => {\n const { t, lang } = useI18n();\n const [activeMode, setActiveMode] = useState<CreationMode | null>(null);\n const [unlockedPremium, setUnlockedPremium] = useState<Set<string>>(new Set());\n\n // Load unlocked themes from KV (with localStorage migration fallback)\n useEffect(() => {\n if (!user) {\n try {\n const saved = localStorage.getItem('dmusic-unlocked-themes');\n if (saved) setUnlockedPremium(new Set(JSON.parse(saved)));\n } catch {}\n return;\n }\n (async () => {\n try {\n const data = await apiFetch<{ themes: string[] }>(`/user/${user.id}/unlocked-themes`);\n if (data?.themes && data.themes.length > 0) {\n setUnlockedPremium(new Set(data.themes));\n } else {\n // Migrate from localStorage if exists\n try {\n const saved = localStorage.getItem('dmusic-unlocked-themes');\n if (saved) {\n const parsed = JSON.parse(saved) as string[];\n if (parsed.length > 0) {\n setUnlockedPremium(new Set(parsed));\n for (const tid of parsed) {\n await apiFetch(`/user/${user.id}/unlocked-themes`, {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themeId: tid }),\n });\n }\n localStorage.removeItem('dmusic-unlocked-themes');\n }\n }\n } catch {}\n }\n } catch {\n try { const s = localStorage.getItem('dmusic-unlocked-themes'); if (s) setUnlockedPremium(new Set(JSON.parse(s))); } catch {}\n }\n })();\n }, [user]);\n\n const handleUnlockTheme = async (themeId: string, cost: number) => {\n if (!user || starPower < cost) return;\n try {\n const result = await apiFetch<any>(`/starpower/${user.id}/consume`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ amount: cost, purpose: 'template_unlock', targetId: themeId }),\n });\n if (result?.success) {\n onStarPowerUpdate?.(result.starPower);\n const updated = new Set(unlockedPremium);\n updated.add(themeId);\n setUnlockedPremium(updated);\n // Persist to KV\n await apiFetch(`/user/${user.id}/unlocked-themes`, {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themeId }),\n });\n }\n } catch (err) { console.error('Theme unlock error:', err); }\n };\n\n // Quick Song state\n const [quickTheme, setQuickTheme] = useState<AILyricsTheme>('happy');\n const [quickPrompt, setQuickPrompt] = useState('');\n const [quickGenerating, setQuickGenerating] = useState(false);\n const [quickLyrics, setQuickLyrics] = useState<string[] | null>(null);\n const [quickComposing, setQuickComposing] = useState<'idle' | 'lyrics' | 'composing' | 'synth' | 'done'>('idle');\n const composer = useAudioComposer();\n\n // Master Mode state\n const [masterTheme, setMasterTheme] = useState<AILyricsTheme>('calm');\n const [masterKeywords, setMasterKeywords] = useState<string[]>([]);\n const [masterKwInput, setMasterKwInput] = useState('');\n const [masterLineCount, setMasterLineCount] = useState(10);\n const [masterStructure, setMasterStructure] = useState('verse-chorus');\n const [masterInstruments, setMasterInstruments] = useState<string[]>(['piano', 'strings']);\n const [masterTempo, setMasterTempo] = useState(100);\n const [masterGenerating, setMasterGenerating] = useState(false);\n const [masterLyrics, setMasterLyrics] = useState<string[] | null>(null);\n const [masterComposing, setMasterComposing] = useState<'idle' | 'lyrics' | 'composing' | 'synth' | 'done'>('idle');\n\n // Remix state\n const [remixSourceTrack, setRemixSourceTrack] = useState<number | null>(null);\n const [remixTargetTheme, setRemixTargetTheme] = useState<AILyricsTheme>('energetic');\n const [remixGenerating, setRemixGenerating] = useState(false);\n const [remixResult, setRemixResult] = useState<string[] | null>(null);\n const [remixComposing, setRemixComposing] = useState<'idle' | 'lyrics' | 'composing' | 'synth' | 'done'>('idle');\n\n // My Works state\n const [works, setWorks] = useState<CreatedWork[]>([]);\n const [copied, setCopied] = useState<string | null>(null);\n\n // Load works from localStorage\n useEffect(() => {\n if (isOpen) {\n try {\n const stored = localStorage.getItem('d-music-works');\n if (stored) setWorks(JSON.parse(stored));\n } catch {}\n }\n }, [isOpen]);\n\n const saveWork = useCallback((work: CreatedWork) => {\n setWorks(prev => {\n const updated = [work, ...prev].slice(0, 50);\n try { localStorage.setItem('d-music-works', JSON.stringify(updated)); } catch {}\n return updated;\n });\n }, []);\n\n const deleteWork = useCallback((id: string) => {\n setWorks(prev => {\n const updated = prev.filter(w => w.id !== id);\n try { localStorage.setItem('d-music-works', JSON.stringify(updated)); } catch {}\n return updated;\n });\n }, []);\n\n // ========== Quick Song Pipeline ==========\n const handleQuickCreate = useCallback(async () => {\n setQuickGenerating(true);\n setQuickComposing('lyrics');\n onHaptic?.('medium');\n\n try {\n // Step 1: Generate lyrics\n const lyricsResult = await apiFetch<{ success: boolean; lyrics: string[] }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: quickTheme,\n keywords: quickPrompt ? quickPrompt.split(/[,,\\s]+/).filter(Boolean) : [],\n lines: 8,\n }),\n });\n\n if (!lyricsResult?.lyrics) throw new Error('Lyrics generation failed');\n setQuickLyrics(lyricsResult.lyrics);\n setQuickComposing('composing');\n\n // Step 2: Get composition parameters\n const compResult = await apiFetch<{ success: boolean; composition: CompositionParams }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: quickTheme,\n lyrics: lyricsResult.lyrics,\n lineCount: 8,\n }),\n });\n\n if (!compResult?.composition) {\n // Fallback without audio\n onCreateTrack?.(lyricsResult.lyrics, quickTheme);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${quickTheme} · Quick Song`,\n theme: quickTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'quick',\n });\n setQuickComposing('done');\n onHaptic?.('success');\n setTimeout(() => setQuickComposing('idle'), 2000);\n return;\n }\n\n setQuickComposing('synth');\n\n // Step 3: Synthesize audio\n const audioBlobUrl = await composer.compose(compResult.composition);\n\n // Step 4: Create track\n onCreateTrack?.(lyricsResult.lyrics, quickTheme, audioBlobUrl, compResult.composition);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${quickTheme} · Quick Song`,\n theme: quickTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'quick',\n });\n setQuickComposing('done');\n onHaptic?.('success');\n setTimeout(() => setQuickComposing('idle'), 2500);\n } catch (err) {\n console.error('Quick create failed:', err);\n if (quickLyrics) {\n onCreateTrack?.(quickLyrics, quickTheme);\n }\n setQuickComposing('idle');\n } finally {\n setQuickGenerating(false);\n }\n }, [quickTheme, quickPrompt, onCreateTrack, composer, onHaptic, quickLyrics, saveWork]);\n\n // ========== Master Mode Pipeline ==========\n const handleMasterCreate = useCallback(async () => {\n setMasterGenerating(true);\n setMasterComposing('lyrics');\n onHaptic?.('medium');\n\n try {\n const lyricsResult = await apiFetch<{ success: boolean; lyrics: string[] }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: masterTheme,\n keywords: masterKeywords,\n lines: masterLineCount,\n }),\n });\n\n if (!lyricsResult?.lyrics) throw new Error('Lyrics generation failed');\n setMasterLyrics(lyricsResult.lyrics);\n setMasterComposing('composing');\n\n const compResult = await apiFetch<{ success: boolean; composition: CompositionParams }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: masterTheme,\n lyrics: lyricsResult.lyrics,\n lineCount: masterLineCount,\n }),\n });\n\n if (!compResult?.composition) {\n onCreateTrack?.(lyricsResult.lyrics, masterTheme);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${masterTheme} · Master Work`,\n theme: masterTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'master',\n });\n setMasterComposing('done');\n onHaptic?.('success');\n setTimeout(() => setMasterComposing('idle'), 2000);\n return;\n }\n\n setMasterComposing('synth');\n const audioBlobUrl = await composer.compose(compResult.composition);\n onCreateTrack?.(lyricsResult.lyrics, masterTheme, audioBlobUrl, compResult.composition);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${masterTheme} · Master Work`,\n theme: masterTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'master',\n });\n setMasterComposing('done');\n onHaptic?.('success');\n setTimeout(() => setMasterComposing('idle'), 2500);\n } catch (err) {\n console.error('Master create failed:', err);\n setMasterComposing('idle');\n } finally {\n setMasterGenerating(false);\n }\n }, [masterTheme, masterKeywords, masterLineCount, onCreateTrack, composer, onHaptic, saveWork]);\n\n // ========== Remix Pipeline (with AI audio re-synthesis) ==========\n const handleRemix = useCallback(async () => {\n if (remixSourceTrack === null) return;\n setRemixGenerating(true);\n setRemixComposing('lyrics');\n onHaptic?.('medium');\n\n try {\n const sourceTrack = playlist[remixSourceTrack];\n const sourceWords = sourceTrack.lyrics\n .slice(1, 5)\n .map(l => l.text)\n .join(' ')\n .split(' ')\n .filter(w => w.length > 3)\n .slice(0, 5);\n\n // Step 1: Generate remixed lyrics in target style\n const lyricsResult = await apiFetch<{ success: boolean; lyrics: string[] }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: remixTargetTheme,\n keywords: sourceWords,\n lines: 8,\n }),\n });\n\n if (!lyricsResult?.lyrics) throw new Error('Remix lyrics failed');\n setRemixResult(lyricsResult.lyrics);\n setRemixComposing('composing');\n\n // Step 2: AI composition in the new style\n const compResult = await apiFetch<{ success: boolean; composition: CompositionParams }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: remixTargetTheme,\n lyrics: lyricsResult.lyrics,\n lineCount: 8,\n }),\n });\n\n const workTitle = `Remix · ${sourceTrack.title}`;\n\n if (!compResult?.composition) {\n // Fallback without audio\n onCreateTrack?.(lyricsResult.lyrics, remixTargetTheme);\n saveWork({ id: `work-${Date.now()}`, title: workTitle, theme: remixTargetTheme, lyrics: lyricsResult.lyrics, createdAt: Date.now(), mode: 'remix' });\n setRemixComposing('done');\n onHaptic?.('success');\n setTimeout(() => setRemixComposing('idle'), 2000);\n return;\n }\n\n setRemixComposing('synth');\n\n // Step 3: Synthesize audio via OfflineAudioContext\n const audioBlobUrl = await composer.compose(compResult.composition);\n\n // Step 4: Create playable track with synthesized audio\n onCreateTrack?.(lyricsResult.lyrics, remixTargetTheme, audioBlobUrl, compResult.composition);\n saveWork({ id: `work-${Date.now()}`, title: workTitle, theme: remixTargetTheme, lyrics: lyricsResult.lyrics, createdAt: Date.now(), mode: 'remix' });\n setRemixComposing('done');\n onHaptic?.('success');\n setTimeout(() => setRemixComposing('idle'), 2500);\n } catch (err) {\n console.error('Remix failed:', err);\n setRemixComposing('idle');\n } finally {\n setRemixGenerating(false);\n }\n }, [remixSourceTrack, remixTargetTheme, playlist, onCreateTrack, onHaptic, saveWork, composer]);\n\n const handleCopyLyrics = useCallback((lyrics: string[], id: string) => {\n navigator.clipboard.writeText(lyrics.join('\\n'));\n setCopied(id);\n setTimeout(() => setCopied(null), 2000);\n }, []);\n\n const addMasterKeyword = useCallback(() => {\n const trimmed = masterKwInput.trim();\n if (trimmed && masterKeywords.length < 8 && !masterKeywords.includes(trimmed)) {\n setMasterKeywords(prev => [...prev, trimmed]);\n setMasterKwInput('');\n }\n }, [masterKwInput, masterKeywords]);\n\n const toggleInstrument = useCallback((id: string) => {\n setMasterInstruments(prev =>\n prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id]\n );\n }, []);\n\n const formatDate = useCallback((ts: number) => {\n const d = new Date(ts);\n return `${d.getMonth() + 1}/${d.getDate()} ${d.getHours()}:${d.getMinutes().toString().padStart(2, '0')}`;\n }, []);\n\n // ========== Composition Progress Label ==========\n const getProgressLabel = (stage: string) => {\n if (stage === 'lyrics') return lang === 'zh' ? 'AI 写词中...' : 'Generating lyrics...';\n if (stage === 'composing') return lang === 'zh' ? '编曲设计中...' : 'Composing...';\n if (stage === 'synth') return lang === 'zh' ? `音频合成 ${Math.round(composer.progress * 100)}%` : `Synthesizing ${Math.round(composer.progress * 100)}%`;\n if (stage === 'done') return lang === 'zh' ? '创作完成!' : 'Complete!';\n return '';\n };\n\n // ========== Render ==========\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[60] bg-black/60 backdrop-blur-md\"\n onClick={onClose}\n />\n\n {/* Studio Panel */}\n <motion.div\n initial={{ y: '100%', opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: '100%', opacity: 0 }}\n transition={{ type: 'spring', damping: 28, stiffness: 300 }}\n className=\"fixed inset-x-0 bottom-0 z-[61] max-h-[92vh] bg-[#0B1030]/98 backdrop-blur-2xl border-t border-white/10 rounded-t-3xl flex flex-col shadow-2xl md:inset-x-auto md:left-1/2 md:-translate-x-1/2 md:w-full md:max-w-xl md:bottom-auto md:top-1/2 md:-translate-y-1/2 md:rounded-2xl md:border md:max-h-[88vh]\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-5 pb-3 border-b border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n {activeMode && (\n <button\n onClick={() => { setActiveMode(null); onHaptic?.('light'); }}\n className=\"p-1.5 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors mr-1\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n )}\n <div className=\"w-9 h-9 rounded-xl bg-gradient-to-tr from-purple-500/20 to-pink-500/20 border border-white/10 flex items-center justify-center\">\n <Wand2 className=\"w-4 h-4 text-purple-400\" />\n </div>\n <div>\n <h3 className=\"text-white font-semibold text-sm leading-tight\">\n {activeMode\n ? MODES.find(m => m.id === activeMode)?.[lang === 'zh' ? 'labelZh' : 'label']\n : (lang === 'zh' ? 'AI 创作工坊' : 'AI Creation Studio')}\n </h3>\n <p className=\"text-white/30 text-xs\">\n {activeMode\n ? MODES.find(m => m.id === activeMode)?.[lang === 'zh' ? 'descZh' : 'desc']\n : (lang === 'zh' ? '选择创作模式开始' : 'Choose a creation mode')}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n <AnimatePresence mode=\"wait\">\n {/* ========== Mode Selection Hub ========== */}\n {!activeMode && (\n <motion.div\n key=\"hub\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className=\"p-5 space-y-3\"\n >\n {MODES.map((mode, idx) => {\n const Icon = mode.icon;\n return (\n <motion.button\n key={mode.id}\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: idx * 0.08 }}\n onClick={() => {\n if (mode.id === 'mv') {\n onOpenMV?.();\n onHaptic?.('selection');\n return;\n }\n setActiveMode(mode.id);\n onHaptic?.('selection');\n }}\n className=\"w-full flex items-center gap-4 p-4 rounded-xl bg-white/[0.03] border border-white/[0.06] hover:bg-white/[0.06] hover:border-white/[0.12] transition-all group text-left\"\n >\n <div className={clsx(\n 'w-12 h-12 rounded-xl bg-gradient-to-br flex items-center justify-center flex-shrink-0',\n mode.gradient\n )}>\n <Icon className=\"w-5 h-5 text-white\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-white/90 group-hover:text-white transition-colors\">\n {lang === 'zh' ? mode.labelZh : mode.label}\n </p>\n <p className=\"text-xs text-white/30 mt-0.5\">\n {lang === 'zh' ? mode.descZh : mode.desc}\n </p>\n </div>\n {mode.id === 'mv' ? (\n <ExternalLink className=\"w-4 h-4 text-cyan-400/40 group-hover:text-cyan-400/70 transition-colors flex-shrink-0\" />\n ) : (\n <ChevronRight className=\"w-4 h-4 text-white/20 group-hover:text-white/40 transition-colors flex-shrink-0\" />\n )}\n </motion.button>\n );\n })}\n\n {/* Stats row */}\n <div className=\"flex items-center justify-between mt-4 pt-4 border-t border-white/[0.04]\">\n <div className=\"flex items-center gap-1.5 text-white/20 text-xs\">\n <Music className=\"w-3.5 h-3.5\" />\n <span>{lang === 'zh' ? `${works.length} 首作品` : `${works.length} works`}</span>\n </div>\n <div className=\"flex items-center gap-1.5 text-white/20 text-xs\">\n <Sparkles className=\"w-3.5 h-3.5\" />\n <span>{lang === 'zh' ? 'AI驱动创作' : 'AI-powered creation'}</span>\n </div>\n </div>\n </motion.div>\n )}\n\n {/* ========== Quick Song Mode ========== */}\n {activeMode === 'quick' && (\n <motion.div\n key=\"quick\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5 space-y-5\"\n >\n {/* Theme picker */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '选择情绪主题' : 'Choose Mood'}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map(theme => {\n const Icon = theme.icon;\n const isActive = quickTheme === theme.id;\n const isLocked = theme.premium && !unlockedPremium.has(theme.id);\n return (\n <button\n key={theme.id}\n onClick={() => {\n if (isLocked) {\n if (user && starPower >= (theme.spCost || 200)) {\n handleUnlockTheme(theme.id, theme.spCost || 200);\n }\n return;\n }\n setQuickTheme(theme.id); onHaptic?.('selection');\n }}\n className={clsx(\n 'p-3 rounded-xl border transition-all text-center relative',\n isLocked\n ? 'bg-white/[0.01] border-white/[0.04] opacity-60'\n : isActive\n ? `bg-gradient-to-br ${theme.bg} border-white/15 shadow-lg`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n {isLocked && (\n <span className=\"absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded-full bg-yellow-500/20 text-yellow-300 border border-yellow-500/20 font-medium\">\n {theme.spCost}SP\n </span>\n )}\n <Icon className={clsx('w-5 h-5 mx-auto mb-1', isActive ? theme.color : isLocked ? 'text-white/15' : 'text-white/30')} />\n <p className={clsx('text-[10px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Quick prompt */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '灵感关键词(可选)' : 'Inspiration Keywords (optional)'}\n </p>\n <input\n type=\"text\"\n value={quickPrompt}\n onChange={e => setQuickPrompt(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleQuickCreate()}\n placeholder={lang === 'zh' ? '输入关键词,用逗号分隔...' : 'Enter keywords, comma separated...'}\n className=\"w-full bg-white/5 border border-white/10 rounded-lg py-2.5 px-3 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-purple-500/50\"\n />\n </div>\n\n {/* One-click create */}\n <motion.button\n onClick={handleQuickCreate}\n disabled={quickGenerating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-4 rounded-xl bg-gradient-to-r from-purple-600 via-pink-600 to-blue-600 text-white font-semibold flex items-center justify-center gap-3 shadow-lg shadow-purple-500/20 disabled:opacity-50 transition-opacity text-base\"\n >\n {quickComposing !== 'idle' && quickComposing !== 'done' ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {getProgressLabel(quickComposing)}\n </>\n ) : quickComposing === 'done' ? (\n <>\n <Check className=\"w-5 h-5 text-green-300\" />\n {lang === 'zh' ? '创作完成!' : 'Complete!'}\n </>\n ) : (\n <>\n <Sparkles className=\"w-5 h-5\" />\n {lang === 'zh' ? '一键创作' : 'Create Now'}\n </>\n )}\n </motion.button>\n\n {/* Generated lyrics preview */}\n <AnimatePresence>\n {quickLyrics && (\n <motion.div\n initial={{ opacity: 0, y: 15 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"rounded-xl border border-white/[0.08] bg-gradient-to-br from-purple-500/10 to-pink-500/10 p-4\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-white/40 font-medium\">{lang === 'zh' ? '生成的歌词' : 'Generated Lyrics'}</p>\n <button\n onClick={() => handleCopyLyrics(quickLyrics, 'quick')}\n className=\"flex items-center gap-1 px-2 py-1 rounded-lg bg-white/5 text-xs text-white/40 hover:text-white/70 transition-colors\"\n >\n {copied === 'quick' ? <Check className=\"w-3 h-3 text-green-400\" /> : <Copy className=\"w-3 h-3\" />}\n {copied === 'quick' ? (lang === 'zh' ? '已复制' : 'Copied') : (lang === 'zh' ? '复制' : 'Copy')}\n </button>\n </div>\n <div className=\"space-y-1.5\">\n {quickLyrics.map((line, i) => (\n <motion.p\n key={i}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.06 }}\n className=\"text-sm text-white/70 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n\n {/* ========== Master Mode ========== */}\n {activeMode === 'master' && (\n <motion.div\n key=\"master\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5 space-y-5\"\n >\n {/* Theme */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '情绪基调' : 'Emotional Base'}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map(theme => {\n const Icon = theme.icon;\n const isActive = masterTheme === theme.id;\n const isLocked = theme.premium && !unlockedPremium.has(theme.id);\n return (\n <button\n key={theme.id}\n onClick={() => {\n if (isLocked) {\n if (user && starPower >= (theme.spCost || 200)) handleUnlockTheme(theme.id, theme.spCost || 200);\n return;\n }\n setMasterTheme(theme.id); onHaptic?.('selection');\n }}\n className={clsx(\n 'p-2.5 rounded-xl border transition-all text-center relative',\n isLocked ? 'bg-white/[0.01] border-white/[0.04] opacity-60'\n : isActive ? `bg-gradient-to-br ${theme.bg} border-white/15`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n {isLocked && <span className=\"absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded-full bg-yellow-500/20 text-yellow-300 border border-yellow-500/20 font-medium\">{theme.spCost}SP</span>}\n <Icon className={clsx('w-4 h-4 mx-auto mb-0.5', isActive ? theme.color : isLocked ? 'text-white/15' : 'text-white/30')} />\n <p className={clsx('text-[9px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Keywords */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '创作关键词' : 'Keywords'} <span className=\"text-white/20\">({masterKeywords.length}/8)</span>\n </p>\n <div className=\"flex gap-2 mb-2\">\n <input\n type=\"text\"\n value={masterKwInput}\n onChange={e => setMasterKwInput(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && addMasterKeyword()}\n placeholder={lang === 'zh' ? '添加关键词...' : 'Add keyword...'}\n className=\"flex-1 bg-white/5 border border-white/10 rounded-lg py-2 px-3 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-purple-500/50\"\n />\n <button\n onClick={addMasterKeyword}\n disabled={!masterKwInput.trim() || masterKeywords.length >= 8}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors disabled:opacity-30\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n {masterKeywords.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {masterKeywords.map(kw => (\n <span key={kw} className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-indigo-500/10 border border-indigo-500/20 rounded-full text-xs text-indigo-300\">\n {kw}\n <button onClick={() => setMasterKeywords(p => p.filter(k => k !== kw))} className=\"text-indigo-400/60 hover:text-indigo-300\">\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Structure */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '歌曲结构' : 'Song Structure'}\n </p>\n <div className=\"grid grid-cols-2 gap-2\">\n {STRUCTURES.map(s => (\n <button\n key={s.id}\n onClick={() => setMasterStructure(s.id)}\n className={clsx(\n 'py-2 px-3 rounded-lg border text-xs transition-all',\n masterStructure === s.id\n ? 'bg-indigo-500/15 border-indigo-500/30 text-indigo-300'\n : 'bg-white/[0.02] border-white/[0.06] text-white/40 hover:bg-white/[0.05]'\n )}\n >\n {lang === 'zh' ? s.labelZh : s.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Instruments */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '乐器编排' : 'Instruments'}\n </p>\n <div className=\"grid grid-cols-3 gap-2\">\n {INSTRUMENTS.map(inst => (\n <button\n key={inst.id}\n onClick={() => toggleInstrument(inst.id)}\n className={clsx(\n 'py-2 px-3 rounded-lg border text-xs transition-all flex items-center gap-1.5',\n masterInstruments.includes(inst.id)\n ? 'bg-indigo-500/15 border-indigo-500/30 text-indigo-300'\n : 'bg-white/[0.02] border-white/[0.06] text-white/40 hover:bg-white/[0.05]'\n )}\n >\n <span>{inst.emoji}</span>\n <span>{lang === 'zh' ? inst.labelZh : inst.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Line Count + Tempo */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '歌词行数' : 'Lines'}\n </p>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => setMasterLineCount(Math.max(4, masterLineCount - 2))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n <span className=\"text-lg font-bold text-white font-mono flex-1 text-center\">{masterLineCount}</span>\n <button onClick={() => setMasterLineCount(Math.min(20, masterLineCount + 2))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '速度 BPM' : 'Tempo BPM'}\n </p>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => setMasterTempo(Math.max(60, masterTempo - 10))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n <span className=\"text-lg font-bold text-white font-mono flex-1 text-center\">{masterTempo}</span>\n <button onClick={() => setMasterTempo(Math.min(200, masterTempo + 10))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Create Button */}\n <motion.button\n onClick={handleMasterCreate}\n disabled={masterGenerating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-3.5 rounded-xl bg-gradient-to-r from-indigo-600 via-blue-600 to-purple-600 text-white font-semibold flex items-center justify-center gap-2 shadow-lg shadow-indigo-500/20 disabled:opacity-50\"\n >\n {masterComposing !== 'idle' && masterComposing !== 'done' ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {getProgressLabel(masterComposing)}\n </>\n ) : masterComposing === 'done' ? (\n <>\n <Check className=\"w-5 h-5 text-green-300\" />\n {lang === 'zh' ? '大师之作完成!' : 'Masterpiece Complete!'}\n </>\n ) : (\n <>\n <Wand2 className=\"w-5 h-5\" />\n {lang === 'zh' ? '开始创作' : 'Start Creating'}\n </>\n )}\n </motion.button>\n\n {/* Master lyrics preview */}\n <AnimatePresence>\n {masterLyrics && (\n <motion.div\n initial={{ opacity: 0, y: 15 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"rounded-xl border border-white/[0.08] bg-gradient-to-br from-indigo-500/10 to-blue-500/10 p-4\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-white/40\">{lang === 'zh' ? '大师之作' : 'Master Work'}</p>\n <button\n onClick={() => handleCopyLyrics(masterLyrics, 'master')}\n className=\"flex items-center gap-1 px-2 py-1 rounded-lg bg-white/5 text-xs text-white/40 hover:text-white/70 transition-colors\"\n >\n {copied === 'master' ? <Check className=\"w-3 h-3 text-green-400\" /> : <Copy className=\"w-3 h-3\" />}\n {copied === 'master' ? (lang === 'zh' ? '已复制' : 'Copied') : (lang === 'zh' ? '复制' : 'Copy')}\n </button>\n </div>\n <div className=\"space-y-1.5\">\n {masterLyrics.map((line, i) => (\n <motion.p\n key={i}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.05 }}\n className=\"text-sm text-white/70 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n\n {/* ========== Remix Mode ========== */}\n {activeMode === 'remix' && (\n <motion.div\n key=\"remix\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5 space-y-5\"\n >\n {/* Source track selector */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '选择原曲' : 'Select Source Track'}\n </p>\n <div className=\"space-y-2 max-h-48 overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n {playlist.map((track, idx) => (\n <button\n key={track.id}\n onClick={() => { setRemixSourceTrack(idx); onHaptic?.('selection'); }}\n className={clsx(\n 'w-full flex items-center gap-3 p-3 rounded-xl border transition-all text-left',\n remixSourceTrack === idx\n ? 'bg-orange-500/10 border-orange-500/20'\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n <div className=\"w-10 h-10 rounded-lg overflow-hidden flex-shrink-0\">\n <img src={track.albumArt} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className={clsx('text-sm font-medium truncate', remixSourceTrack === idx ? 'text-orange-300' : 'text-white/70')}>\n {track.title}\n </p>\n <p className=\"text-xs text-white/30\">{track.artist}</p>\n </div>\n {remixSourceTrack === idx && (\n <div className=\"w-5 h-5 rounded-full bg-orange-500/30 border border-orange-500/50 flex items-center justify-center flex-shrink-0\">\n <Check className=\"w-3 h-3 text-orange-300\" />\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n\n {/* Target theme */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '改编风格' : 'Target Style'}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map(theme => {\n const Icon = theme.icon;\n const isActive = remixTargetTheme === theme.id;\n const isLocked = theme.premium && !unlockedPremium.has(theme.id);\n return (\n <button\n key={theme.id}\n onClick={() => {\n if (isLocked) {\n if (user && starPower >= (theme.spCost || 200)) handleUnlockTheme(theme.id, theme.spCost || 200);\n return;\n }\n setRemixTargetTheme(theme.id); onHaptic?.('selection');\n }}\n className={clsx(\n 'p-2.5 rounded-xl border transition-all text-center relative',\n isLocked ? 'bg-white/[0.01] border-white/[0.04] opacity-60'\n : isActive ? `bg-gradient-to-br ${theme.bg} border-white/15`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n {isLocked && <span className=\"absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded-full bg-yellow-500/20 text-yellow-300 border border-yellow-500/20 font-medium\">{theme.spCost}SP</span>}\n <Icon className={clsx('w-4 h-4 mx-auto mb-0.5', isActive ? theme.color : isLocked ? 'text-white/15' : 'text-white/30')} />\n <p className={clsx('text-[9px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Remix Button */}\n <motion.button\n onClick={handleRemix}\n disabled={remixSourceTrack === null || remixGenerating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-3.5 rounded-xl bg-gradient-to-r from-orange-600 via-red-600 to-pink-600 text-white font-semibold flex items-center justify-center gap-2 shadow-lg shadow-orange-500/20 disabled:opacity-40\"\n >\n {remixComposing !== 'idle' && remixComposing !== 'done' ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {getProgressLabel(remixComposing)}\n </>\n ) : remixComposing === 'done' ? (\n <>\n <Check className=\"w-5 h-5 text-green-300\" />\n {lang === 'zh' ? '改编完成!' : 'Remix Complete!'}\n </>\n ) : (\n <>\n <Layers className=\"w-5 h-5\" />\n {lang === 'zh' ? '开始改编 (含音频重合成)' : 'Remix (with audio synthesis)'}\n </>\n )}\n </motion.button>\n\n {/* Remix result */}\n <AnimatePresence>\n {remixResult && (\n <motion.div\n initial={{ opacity: 0, y: 15 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"rounded-xl border border-white/[0.08] bg-gradient-to-br from-orange-500/10 to-red-500/10 p-4\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-white/40\">{lang === 'zh' ? '改编歌词' : 'Remixed Lyrics'}</p>\n <button\n onClick={() => handleCopyLyrics(remixResult, 'remix')}\n className=\"flex items-center gap-1 px-2 py-1 rounded-lg bg-white/5 text-xs text-white/40 hover:text-white/70 transition-colors\"\n >\n {copied === 'remix' ? <Check className=\"w-3 h-3 text-green-400\" /> : <Copy className=\"w-3 h-3\" />}\n {copied === 'remix' ? (lang === 'zh' ? '已复制' : 'Copied') : (lang === 'zh' ? '复制' : 'Copy')}\n </button>\n </div>\n <div className=\"space-y-1.5\">\n {remixResult.map((line, i) => (\n <motion.p\n key={i}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.06 }}\n className=\"text-sm text-white/70 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n\n {/* ========== My Works ========== */}\n {activeMode === 'works' && (\n <motion.div\n key=\"works\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5\"\n >\n {works.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 gap-4\">\n <div className=\"w-16 h-16 rounded-full bg-white/5 border border-white/10 flex items-center justify-center\">\n <Music className=\"w-7 h-7 text-white/20\" />\n </div>\n <p className=\"text-white/30 text-sm text-center\">\n {lang === 'zh' ? '还没有创作作品\\n去创作你的第一首歌吧!' : 'No works yet\\nCreate your first song!'}\n </p>\n <button\n onClick={() => setActiveMode('quick')}\n className=\"px-4 py-2 rounded-lg bg-purple-500/10 border border-purple-500/20 text-purple-300 text-sm hover:bg-purple-500/20 transition-colors\"\n >\n {lang === 'zh' ? '开始创作' : 'Start Creating'}\n </button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? `${works.length} 首作品` : `${works.length} Works`}\n </p>\n {works.map((work, idx) => {\n const theme = THEMES.find(t => t.id === work.theme);\n const ThemeIcon = theme?.icon || Music;\n const modeInfo = MODES.find(m => m.id === work.mode);\n return (\n <motion.div\n key={work.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: idx * 0.05 }}\n className=\"rounded-xl border border-white/[0.06] bg-white/[0.02] p-4 group\"\n >\n <div className=\"flex items-start gap-3\">\n <div className={clsx(\n 'w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0 bg-gradient-to-br',\n theme?.bg || 'from-white/5 to-white/5'\n )}>\n <ThemeIcon className={clsx('w-5 h-5', theme?.color || 'text-white/30')} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <p className=\"text-sm font-medium text-white/80 truncate\">{work.title}</p>\n <span className=\"text-[9px] text-white/20 bg-white/5 px-1.5 py-0.5 rounded-full flex-shrink-0\">\n {modeInfo ? (lang === 'zh' ? modeInfo.labelZh : modeInfo.label) : work.mode}\n </span>\n </div>\n <p className=\"text-xs text-white/25 flex items-center gap-1\">\n <Clock className=\"w-3 h-3\" />\n {formatDate(work.createdAt)}\n </p>\n {/* Lyrics preview */}\n <p className=\"text-xs text-white/30 mt-2 line-clamp-2 italic\">\n \"{work.lyrics.slice(0, 2).join(' / ')}\"\n </p>\n </div>\n <div className=\"flex flex-col gap-1 md:opacity-0 md:group-hover:opacity-100 transition-opacity flex-shrink-0\">\n <button\n onClick={() => handleCopyLyrics(work.lyrics, work.id)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n title={lang === 'zh' ? '复制歌词' : 'Copy lyrics'}\n >\n {copied === work.id ? <Check className=\"w-3.5 h-3.5 text-green-400\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n onClick={() => deleteWork(work.id)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-red-400/60 hover:bg-red-500/5 transition-colors\"\n title={lang === 'zh' ? '删除' : 'Delete'}\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n {onShareWork && (\n <button\n onClick={() => onShareWork(work)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n title={lang === 'zh' ? '分享作品' : 'Share work'}\n >\n <Share2 className=\"w-3.5 h-3.5\" />\n </button>\n )}\n {onOpenMV && (\n <button\n onClick={() => onOpenMV(work.lyrics)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-cyan-400/60 hover:bg-cyan-500/5 transition-colors\"\n title={lang === 'zh' ? '从此作品创建MV' : 'Create MV from this work'}\n >\n <Film className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n </div>\n </motion.div>\n );\n })}\n </div>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n};","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport {\n X, Camera, Maximize2, Play, Pause,\n Layers, Minus, Plus,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useI18n } from '@yyc3/music-hooks';\nimport type { Track } from '@yyc3/music-data';\n\n// ==========================================\n// MV Creator — Canvas-based Music Visualization\n// ==========================================\n// Renders animated visual themes synchronized to audio\n// energy and emotion, with lyrics overlay.\n\ntype MVTheme = 'starfield' | 'neonPulse' | 'aurora' | 'inkWash' | 'cyberCity';\n\ninterface MVCreatorProps {\n isOpen: boolean;\n onClose: () => void;\n track: Track;\n isPlaying: boolean;\n audioEnergy: number;\n frequencyData: Uint8Array;\n currentTime: number;\n emotion: string;\n customLyrics?: string[] | null;\n onHaptic?: (pattern: string) => void;\n}\n\nconst MV_THEMES: Array<{\n id: MVTheme;\n labelZh: string;\n labelEn: string;\n emoji: string;\n colors: [string, string, string];\n}> = [\n { id: 'starfield', labelZh: '星空漫游', labelEn: 'Starfield', emoji: '🌌', colors: ['#667eea', '#764ba2', '#fff'] },\n { id: 'neonPulse', labelZh: '霓虹脉冲', labelEn: 'Neon Pulse', emoji: '💜', colors: ['#ff006e', '#8338ec', '#3a86ff'] },\n { id: 'aurora', labelZh: '极光幻境', labelEn: 'Aurora', emoji: '🌈', colors: ['#00f5d4', '#7209b7', '#f72585'] },\n { id: 'inkWash', labelZh: '水墨流韵', labelEn: 'Ink Wash', emoji: '🏔️', colors: ['#1a1a2e', '#e0e0e0', '#555'] },\n { id: 'cyberCity', labelZh: '赛博都市', labelEn: 'Cyber City', emoji: '🌃', colors: ['#0ff', '#f0f', '#ff0'] },\n];\n\n// Particle system for various themes\ninterface Particle {\n x: number;\n y: number;\n z: number;\n vx: number;\n vy: number;\n size: number;\n alpha: number;\n color: string;\n life: number;\n maxLife: number;\n}\n\nfunction createParticle(w: number, h: number, theme: MVTheme): Particle {\n const colors = MV_THEMES.find(t => t.id === theme)?.colors || ['#fff', '#aaa', '#666'];\n const color = colors[Math.floor(Math.random() * colors.length)];\n\n switch (theme) {\n case 'starfield':\n return {\n x: Math.random() * w, y: Math.random() * h, z: Math.random() * 3 + 0.5,\n vx: 0, vy: Math.random() * 0.3 + 0.1,\n size: Math.random() * 2.5 + 0.5,\n alpha: Math.random() * 0.8 + 0.2, color,\n life: 0, maxLife: 300 + Math.random() * 200,\n };\n case 'neonPulse':\n return {\n x: w / 2 + (Math.random() - 0.5) * w * 0.8,\n y: h / 2 + (Math.random() - 0.5) * h * 0.8,\n z: 1,\n vx: (Math.random() - 0.5) * 2, vy: (Math.random() - 0.5) * 2,\n size: Math.random() * 4 + 1,\n alpha: Math.random() * 0.6 + 0.2, color,\n life: 0, maxLife: 150 + Math.random() * 100,\n };\n case 'aurora':\n return {\n x: Math.random() * w, y: h * 0.2 + Math.random() * h * 0.3,\n z: 1, vx: Math.random() * 0.5 + 0.2, vy: (Math.random() - 0.5) * 0.3,\n size: Math.random() * 40 + 20,\n alpha: Math.random() * 0.15 + 0.05, color,\n life: 0, maxLife: 400 + Math.random() * 200,\n };\n case 'inkWash':\n return {\n x: Math.random() * w, y: Math.random() * h,\n z: 1, vx: (Math.random() - 0.5) * 0.5, vy: -Math.random() * 0.8 - 0.2,\n size: Math.random() * 30 + 5,\n alpha: Math.random() * 0.08 + 0.02, color,\n life: 0, maxLife: 300 + Math.random() * 200,\n };\n case 'cyberCity':\n default:\n return {\n x: Math.random() * w, y: Math.random() * h,\n z: 1, vx: 0, vy: Math.random() * 2 + 1,\n size: Math.random() * 2 + 0.5,\n alpha: Math.random() * 0.7 + 0.3, color,\n life: 0, maxLife: 200 + Math.random() * 100,\n };\n }\n}\n\nexport const MVCreator: React.FC<MVCreatorProps> = ({\n isOpen,\n onClose,\n track,\n isPlaying,\n audioEnergy,\n frequencyData,\n currentTime,\n emotion,\n customLyrics,\n onHaptic,\n}) => {\n const { lang } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animFrameRef = useRef<number>(0);\n const particlesRef = useRef<Particle[]>([]);\n const timeRef = useRef(0);\n\n const [mvTheme, setMvTheme] = useState<MVTheme>('starfield');\n const [showLyrics, setShowLyrics] = useState(true);\n const [intensity, setIntensity] = useState(0.7);\n\n // Build effective lyrics: use customLyrics (from \"Create MV from this work\") or track lyrics\n const effectiveLyrics = customLyrics && customLyrics.length > 0\n ? customLyrics.map((text, i) => ({\n time: i * (track.duration > 0 ? track.duration / customLyrics.length : 10),\n text,\n translation: undefined as string | undefined,\n }))\n : track.lyrics;\n\n // Current lyric line\n const currentLyric = [...effectiveLyrics].reverse().find(l => l.time <= currentTime);\n const nextLyric = effectiveLyrics.find(l => l.time > currentTime);\n\n // ========== Canvas Rendering Loop ==========\n const render = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const w = canvas.width;\n const h = canvas.height;\n timeRef.current += 1;\n const t = timeRef.current;\n const energy = audioEnergy * intensity;\n const themeColors = MV_THEMES.find(th => th.id === mvTheme)?.colors || ['#fff', '#aaa', '#666'];\n\n // ---- Background ----\n switch (mvTheme) {\n case 'starfield': {\n ctx.fillStyle = '#050816';\n ctx.fillRect(0, 0, w, h);\n // Deep space glow\n const g = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, w * 0.5);\n g.addColorStop(0, `rgba(102, 126, 234, ${0.03 + energy * 0.05})`);\n g.addColorStop(1, 'transparent');\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, w, h);\n break;\n }\n case 'neonPulse': {\n ctx.fillStyle = `rgba(10, 5, 30, ${0.15 + (1 - energy) * 0.1})`;\n ctx.fillRect(0, 0, w, h);\n // Pulsating center\n const ng = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, 150 + energy * 200);\n ng.addColorStop(0, `rgba(131, 56, 236, ${0.1 + energy * 0.15})`);\n ng.addColorStop(0.5, `rgba(255, 0, 110, ${0.05 + energy * 0.08})`);\n ng.addColorStop(1, 'transparent');\n ctx.fillStyle = ng;\n ctx.fillRect(0, 0, w, h);\n break;\n }\n case 'aurora': {\n ctx.fillStyle = 'rgba(5, 5, 20, 0.08)';\n ctx.fillRect(0, 0, w, h);\n break;\n }\n case 'inkWash': {\n ctx.fillStyle = `rgba(15, 15, 25, ${0.05 + (1 - energy) * 0.03})`;\n ctx.fillRect(0, 0, w, h);\n // Mountain silhouette\n ctx.beginPath();\n ctx.moveTo(0, h);\n for (let x = 0; x <= w; x += 3) {\n const y = h - 80 - Math.sin(x * 0.008 + 1) * 60 - Math.sin(x * 0.015) * 30 - Math.cos(x * 0.003 + 2) * 40;\n ctx.lineTo(x, y);\n }\n ctx.lineTo(w, h);\n ctx.fillStyle = 'rgba(30, 30, 50, 0.06)';\n ctx.fill();\n break;\n }\n case 'cyberCity': {\n ctx.fillStyle = 'rgba(5, 0, 15, 0.12)';\n ctx.fillRect(0, 0, w, h);\n // Grid floor\n ctx.strokeStyle = `rgba(0, 255, 255, ${0.04 + energy * 0.06})`;\n ctx.lineWidth = 0.5;\n const gridY = h * 0.7;\n for (let i = 0; i < 20; i++) {\n const y = gridY + i * 12;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(w, y);\n ctx.stroke();\n }\n for (let i = 0; i < 15; i++) {\n const x = w / 2 + (i - 7) * (40 + i * 5);\n ctx.beginPath();\n ctx.moveTo(w / 2, gridY);\n ctx.lineTo(x, h);\n ctx.stroke();\n }\n break;\n }\n }\n\n // ---- Particles ----\n // Add new particles\n const targetCount = Math.floor(50 + energy * 80 * intensity);\n while (particlesRef.current.length < targetCount) {\n particlesRef.current.push(createParticle(w, h, mvTheme));\n }\n\n // Update and draw particles\n const alive: Particle[] = [];\n for (const p of particlesRef.current) {\n p.life += 1;\n if (p.life > p.maxLife) continue;\n\n p.x += p.vx + (mvTheme === 'starfield' ? Math.sin(t * 0.01 + p.y * 0.01) * 0.2 : 0);\n p.y += p.vy * (1 + energy * 0.5);\n\n // Wrap around\n if (p.x < -10) p.x = w + 10;\n if (p.x > w + 10) p.x = -10;\n if (p.y < -10) p.y = h + 10;\n if (p.y > h + 10) p.y = -10;\n\n const fadeIn = Math.min(p.life / 20, 1);\n const fadeOut = Math.max(1 - (p.life - p.maxLife + 30) / 30, 0);\n const alpha = p.alpha * fadeIn * fadeOut * (0.5 + energy * 0.5);\n\n ctx.beginPath();\n if (mvTheme === 'aurora') {\n // Soft ellipses for aurora\n ctx.ellipse(p.x, p.y, p.size * (1 + energy), p.size * 0.3, 0, 0, Math.PI * 2);\n ctx.fillStyle = `${p.color}${Math.floor(alpha * 255).toString(16).padStart(2, '0')}`;\n ctx.fill();\n } else if (mvTheme === 'inkWash') {\n // Soft circles for ink\n const ig = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.size);\n ig.addColorStop(0, `rgba(200, 200, 210, ${alpha})`);\n ig.addColorStop(1, 'transparent');\n ctx.fillStyle = ig;\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n } else if (mvTheme === 'cyberCity') {\n // Vertical rain lines\n ctx.strokeStyle = `${p.color}${Math.floor(alpha * 200).toString(16).padStart(2, '0')}`;\n ctx.lineWidth = p.size * 0.5;\n ctx.moveTo(p.x, p.y);\n ctx.lineTo(p.x, p.y - 8 - energy * 12);\n ctx.stroke();\n } else {\n ctx.arc(p.x, p.y, p.size * (mvTheme === 'neonPulse' ? (1 + energy * 0.5) : 1), 0, Math.PI * 2);\n ctx.fillStyle = `${p.color}${Math.floor(alpha * 255).toString(16).padStart(2, '0')}`;\n ctx.fill();\n\n // Glow for neon\n if (mvTheme === 'neonPulse' && p.size > 2) {\n const glow = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.size * 4);\n glow.addColorStop(0, `${p.color}${Math.floor(alpha * 80).toString(16).padStart(2, '0')}`);\n glow.addColorStop(1, 'transparent');\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(p.x, p.y, p.size * 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n alive.push(p);\n }\n particlesRef.current = alive;\n\n // ---- Frequency Spectrum ----\n if (frequencyData.length > 0 && isPlaying) {\n const barCount = Math.min(64, frequencyData.length);\n const barWidth = w / barCount;\n const maxBarH = h * 0.25;\n\n ctx.save();\n if (mvTheme === 'inkWash') {\n ctx.globalAlpha = 0.15;\n }\n\n for (let i = 0; i < barCount; i++) {\n const value = frequencyData[Math.floor(i * frequencyData.length / barCount)] / 255;\n const barH = value * maxBarH * intensity;\n const x = i * barWidth;\n\n const barGrad = ctx.createLinearGradient(x, h, x, h - barH);\n\n if (mvTheme === 'neonPulse') {\n barGrad.addColorStop(0, `rgba(255, 0, 110, ${0.3 + value * 0.4})`);\n barGrad.addColorStop(1, `rgba(131, 56, 236, ${0.1 + value * 0.2})`);\n } else if (mvTheme === 'aurora') {\n barGrad.addColorStop(0, `rgba(0, 245, 212, ${0.2 + value * 0.3})`);\n barGrad.addColorStop(1, `rgba(114, 9, 183, ${0.1 + value * 0.15})`);\n } else if (mvTheme === 'cyberCity') {\n barGrad.addColorStop(0, `rgba(0, 255, 255, ${0.3 + value * 0.5})`);\n barGrad.addColorStop(1, `rgba(255, 0, 255, ${0.1 + value * 0.2})`);\n } else if (mvTheme === 'inkWash') {\n barGrad.addColorStop(0, `rgba(180, 180, 190, ${0.3 + value * 0.4})`);\n barGrad.addColorStop(1, 'transparent');\n } else {\n barGrad.addColorStop(0, `rgba(102, 126, 234, ${0.2 + value * 0.4})`);\n barGrad.addColorStop(1, `rgba(118, 75, 162, ${0.05 + value * 0.1})`);\n }\n\n ctx.fillStyle = barGrad;\n ctx.fillRect(x, h - barH, barWidth - 1, barH);\n }\n ctx.restore();\n }\n\n // ---- Center Ring (energy reactive) ----\n if (mvTheme !== 'inkWash') {\n const ringRadius = 60 + energy * 40;\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, ringRadius, 0, Math.PI * 2);\n ctx.strokeStyle = `${themeColors[0]}${Math.floor((0.1 + energy * 0.2) * 255).toString(16).padStart(2, '0')}`;\n ctx.lineWidth = 1.5 + energy * 2;\n ctx.stroke();\n\n // Second ring\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, ringRadius * 1.3 + Math.sin(t * 0.03) * 10, 0, Math.PI * 2);\n ctx.strokeStyle = `${themeColors[1]}${Math.floor((0.05 + energy * 0.1) * 255).toString(16).padStart(2, '0')}`;\n ctx.lineWidth = 0.8;\n ctx.stroke();\n }\n\n // ---- Lyrics Overlay ----\n if (showLyrics && currentLyric) {\n ctx.save();\n ctx.textAlign = 'center';\n\n // Main lyric\n ctx.font = `700 ${mvTheme === 'inkWash' ? '20' : '22'}px system-ui, -apple-system, sans-serif`;\n const lyricY = h * 0.78;\n\n // Text shadow/glow\n if (mvTheme !== 'inkWash') {\n ctx.shadowColor = themeColors[0];\n ctx.shadowBlur = 15 + energy * 20;\n }\n ctx.fillStyle = `rgba(255, 255, 255, ${0.8 + energy * 0.2})`;\n\n // Word wrap for long lyrics\n const maxWidth = w * 0.85;\n const text = currentLyric.text;\n if (ctx.measureText(text).width > maxWidth) {\n const words = text.split(' ');\n let line = '';\n let lineY = lyricY;\n for (const word of words) {\n const test = line ? `${line} ${word}` : word;\n if (ctx.measureText(test).width > maxWidth) {\n ctx.fillText(line, w / 2, lineY);\n line = word;\n lineY += 30;\n } else {\n line = test;\n }\n }\n ctx.fillText(line, w / 2, lineY);\n } else {\n ctx.fillText(text, w / 2, lyricY);\n }\n\n // Translation\n ctx.shadowBlur = 0;\n if (currentLyric.translation) {\n ctx.font = '400 13px system-ui, -apple-system, sans-serif';\n ctx.fillStyle = 'rgba(255, 255, 255, 0.4)';\n ctx.fillText(currentLyric.translation, w / 2, lyricY + 28);\n }\n\n ctx.restore();\n }\n\n // ---- Track Info Overlay ----\n ctx.save();\n ctx.textAlign = 'left';\n ctx.fillStyle = 'rgba(255, 255, 255, 0.3)';\n ctx.font = '500 11px system-ui, -apple-system, sans-serif';\n ctx.fillText(track.title, 20, 28);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.15)';\n ctx.font = '400 10px system-ui, -apple-system, sans-serif';\n ctx.fillText(track.artist, 20, 44);\n\n // Time\n ctx.textAlign = 'right';\n const mins = Math.floor(currentTime / 60);\n const secs = Math.floor(currentTime % 60);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.2)';\n ctx.font = '400 10px monospace';\n ctx.fillText(`${mins}:${secs.toString().padStart(2, '0')}`, w - 20, 28);\n ctx.restore();\n\n // ---- Progress bar ----\n const progress = track.duration > 0 ? currentTime / track.duration : 0;\n ctx.fillStyle = 'rgba(255, 255, 255, 0.06)';\n ctx.fillRect(0, h - 3, w, 3);\n const pGrad = ctx.createLinearGradient(0, 0, w * progress, 0);\n pGrad.addColorStop(0, themeColors[0]);\n pGrad.addColorStop(1, themeColors[1]);\n ctx.fillStyle = pGrad;\n ctx.fillRect(0, h - 3, w * progress, 3);\n\n animFrameRef.current = requestAnimationFrame(render);\n }, [mvTheme, audioEnergy, frequencyData, isPlaying, currentTime, showLyrics, intensity, track, currentLyric, emotion, effectiveLyrics]);\n\n // Start/stop animation loop\n useEffect(() => {\n if (isOpen) {\n // Reset particles when theme changes\n particlesRef.current = [];\n timeRef.current = 0;\n\n // Set canvas size\n const canvas = canvasRef.current;\n if (canvas) {\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width * (window.devicePixelRatio > 1 ? 2 : 1);\n canvas.height = rect.height * (window.devicePixelRatio > 1 ? 2 : 1);\n }\n\n animFrameRef.current = requestAnimationFrame(render);\n }\n\n return () => {\n if (animFrameRef.current) {\n cancelAnimationFrame(animFrameRef.current);\n }\n };\n }, [isOpen, render]);\n\n // ========== Screenshot ==========\n const handleScreenshot = useCallback(() => {\n if (!canvasRef.current) return;\n const link = document.createElement('a');\n link.download = `d-music-mv-${track.title.replace(/\\s+/g, '-').toLowerCase()}.png`;\n link.href = canvasRef.current.toDataURL('image/png');\n link.click();\n onHaptic?.('success');\n }, [track.title, onHaptic]);\n\n // ========== Fullscreen ==========\n const handleFullscreen = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n canvas.requestFullscreen?.().catch(() => {});\n }\n onHaptic?.('medium');\n }, [onHaptic]);\n\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[62] bg-black/80 backdrop-blur-xl\"\n onClick={onClose}\n />\n\n <motion.div\n initial={{ opacity: 0, scale: 0.92 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.92 }}\n transition={{ type: 'spring', damping: 25, stiffness: 280 }}\n className=\"fixed z-[63] inset-4 md:inset-auto md:left-1/2 md:top-1/2 md:-translate-x-1/2 md:-translate-y-1/2 md:w-[90vw] md:max-w-3xl md:max-h-[88vh] bg-[#080C28]/98 backdrop-blur-2xl border border-white/10 rounded-2xl flex flex-col shadow-2xl overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-tr from-cyan-500/20 to-purple-500/20 border border-white/10 flex items-center justify-center\">\n <Layers className=\"w-4 h-4 text-cyan-400\" />\n </div>\n <div>\n <h3 className=\"text-white font-semibold text-sm leading-tight flex items-center gap-1.5\">\n {lang === 'zh' ? 'MV 创作' : 'MV Creator'}\n {customLyrics && customLyrics.length > 0 && (\n <span className=\"text-[9px] font-normal px-1.5 py-0.5 rounded-full bg-cyan-500/15 border border-cyan-500/25 text-cyan-300\">\n {lang === 'zh' ? '作品歌词' : 'Work Lyrics'}\n </span>\n )}\n </h3>\n <p className=\"text-white/30 text-[10px]\">\n {track.title} — {track.artist}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Status */}\n <div className={clsx(\n 'flex items-center gap-1.5 px-2 py-1 rounded-full text-[10px]',\n isPlaying ? 'bg-green-500/10 text-green-400' : 'bg-white/5 text-white/30'\n )}>\n {isPlaying ? <Play className=\"w-3 h-3\" /> : <Pause className=\"w-3 h-3\" />}\n {isPlaying ? (lang === 'zh' ? '播放中' : 'Playing') : (lang === 'zh' ? '已暂停' : 'Paused')}\n </div>\n\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Canvas */}\n <div className=\"flex-1 relative min-h-0 bg-black\">\n <canvas\n ref={canvasRef}\n className=\"w-full h-full\"\n style={{ display: 'block' }}\n />\n\n {/* Overlay controls */}\n <div className=\"absolute bottom-3 right-3 flex gap-1.5\">\n <button\n onClick={handleScreenshot}\n className=\"p-2 rounded-lg bg-black/50 backdrop-blur-sm border border-white/10 text-white/50 hover:text-white hover:bg-black/70 transition-colors\"\n title={lang === 'zh' ? '截图' : 'Screenshot'}\n >\n <Camera className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleFullscreen}\n className=\"p-2 rounded-lg bg-black/50 backdrop-blur-sm border border-white/10 text-white/50 hover:text-white hover:bg-black/70 transition-colors\"\n title={lang === 'zh' ? '全屏' : 'Fullscreen'}\n >\n <Maximize2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Controls Bar */}\n <div className=\"px-5 py-3 border-t border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-4 flex-wrap\">\n {/* Theme selector */}\n <div className=\"flex items-center gap-1.5\">\n {MV_THEMES.map(theme => (\n <button\n key={theme.id}\n onClick={() => {\n setMvTheme(theme.id);\n particlesRef.current = [];\n onHaptic?.('selection');\n }}\n className={clsx(\n 'px-2.5 py-1.5 rounded-lg border text-[10px] transition-all flex items-center gap-1',\n mvTheme === theme.id\n ? 'bg-white/10 border-white/20 text-white'\n : 'bg-white/[0.02] border-white/[0.06] text-white/30 hover:bg-white/[0.05] hover:text-white/50'\n )}\n >\n <span>{theme.emoji}</span>\n <span className=\"hidden sm:inline\">{lang === 'zh' ? theme.labelZh : theme.labelEn}</span>\n </button>\n ))}\n </div>\n\n <div className=\"flex-1\" />\n\n {/* Lyrics toggle */}\n <button\n onClick={() => setShowLyrics(p => !p)}\n className={clsx(\n 'px-2.5 py-1.5 rounded-lg border text-[10px] transition-all',\n showLyrics\n ? 'bg-purple-500/15 border-purple-500/30 text-purple-300'\n : 'bg-white/[0.02] border-white/[0.06] text-white/30'\n )}\n >\n {lang === 'zh' ? '歌词' : 'Lyrics'}\n </button>\n\n {/* Intensity */}\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => setIntensity(v => Math.max(0.2, v - 0.2))}\n className=\"p-1 rounded text-white/30 hover:text-white/60 transition-colors\"\n >\n <Minus className=\"w-3 h-3\" />\n </button>\n <div className=\"w-16 h-1.5 rounded-full bg-white/10 overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-gradient-to-r from-cyan-500 to-purple-500 transition-all\"\n style={{ width: `${intensity * 100}%` }}\n />\n </div>\n <button\n onClick={() => setIntensity(v => Math.min(1, v + 0.2))}\n className=\"p-1 rounded text-white/30 hover:text-white/60 transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n};\n"],"names":["VOICE_COMMANDS_ZH","VOICE_COMMANDS_EN","AIAssistant","activeTips","onDismissTip","onExecuteAction","isListening","onToggleListening","voiceSupported","voiceFeedback","voiceHistory","sessionInsight","isPlaying","audioEnergy","externalExpanded","onExternalExpandedChange","t","lang","useI18n","isExpanded","setIsExpanded","useState","showCommands","setShowCommands","tipContainerRef","useRef","voiceCommands","useEffect","handleSetExpanded","val","CATEGORY_COLORS","jsxs","Fragment","jsx","AnimatePresence","tip","motion","clsx","X","i","Mic","BrainCircuit","ChevronDown","Clock","MicOff","vc","vh","MessageSquare","THEMES","Smile","Frown","Zap","Cloud","Heart","AILyricsGenerator","isOpen","onClose","onCreateTrack","selectedTheme","setSelectedTheme","keywords","setKeywords","keywordInput","setKeywordInput","lineCount","setLineCount","generating","setGenerating","generatedLyrics","setGeneratedLyrics","copied","setCopied","generationCount","setGenerationCount","trackCreated","setTrackCreated","compositionStage","setCompositionStage","composer","useAudioComposer","addKeyword","useCallback","trimmed","prev","removeKeyword","kw","k","handleGenerate","result","apiFetch","err","handleCopy","handleCreateTrack","_a","compResult","audioBlobUrl","_b","currentTheme","Wand2","theme","Icon","isActive","e","Plus","Minus","Loader2","Sparkles","RefreshCw","Check","Copy","Volume2","Music","line","MODES","Settings2","Layers","FolderOpen","Film","STRUCTURES","INSTRUMENTS","CreationStudio","playlist","currentTrackIndex","onHaptic","onShareWork","onOpenMV","user","starPower","onStarPowerUpdate","activeMode","setActiveMode","unlockedPremium","setUnlockedPremium","saved","data","parsed","tid","s","handleUnlockTheme","themeId","cost","updated","quickTheme","setQuickTheme","quickPrompt","setQuickPrompt","quickGenerating","setQuickGenerating","quickLyrics","setQuickLyrics","quickComposing","setQuickComposing","masterTheme","setMasterTheme","masterKeywords","setMasterKeywords","masterKwInput","setMasterKwInput","masterLineCount","setMasterLineCount","masterStructure","setMasterStructure","masterInstruments","setMasterInstruments","masterTempo","setMasterTempo","masterGenerating","setMasterGenerating","masterLyrics","setMasterLyrics","masterComposing","setMasterComposing","remixSourceTrack","setRemixSourceTrack","remixTargetTheme","setRemixTargetTheme","remixGenerating","setRemixGenerating","remixResult","setRemixResult","remixComposing","setRemixComposing","works","setWorks","stored","saveWork","work","deleteWork","id","w","handleQuickCreate","lyricsResult","handleMasterCreate","handleRemix","sourceTrack","sourceWords","l","workTitle","handleCopyLyrics","lyrics","addMasterKeyword","toggleInstrument","formatDate","ts","d","getProgressLabel","stage","ArrowLeft","m","mode","idx","ExternalLink","ChevronRight","isLocked","p","inst","track","ThemeIcon","modeInfo","Trash2","Share2","MV_THEMES","createParticle","h","colors","color","MVCreator","frequencyData","currentTime","emotion","customLyrics","canvasRef","animFrameRef","particlesRef","timeRef","mvTheme","setMvTheme","showLyrics","setShowLyrics","intensity","setIntensity","effectiveLyrics","text","currentLyric","render","canvas","ctx","energy","themeColors","th","g","ng","x","y","gridY","targetCount","alive","fadeIn","fadeOut","alpha","ig","glow","barCount","barWidth","maxBarH","value","barH","barGrad","ringRadius","lyricY","maxWidth","words","lineY","word","test","mins","secs","progress","pGrad","rect","handleScreenshot","link","handleFullscreen","Play","Pause","Camera","Maximize2","v"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/AIAssistant.tsx","../src/components/AILyricsGenerator.tsx","../src/components/CreationStudio.tsx","../src/components/MVCreator.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { clsx } from 'clsx';\nimport {\n Mic, MicOff, X, ChevronDown, Sparkles,\n BrainCircuit, Clock, MessageSquare,\n} from 'lucide-react';\nimport type { AITip, VoiceCommand } from '@yyc3/music-hooks';\nimport { useI18n } from '@yyc3/music-hooks';\n\n// ==========================================\n// Types\n// ==========================================\ninterface AIAssistantProps {\n activeTips: AITip[];\n onDismissTip: (id: string) => void;\n onExecuteAction: (actionKey: string) => void;\n isListening: boolean;\n onToggleListening: () => void;\n voiceSupported: boolean;\n voiceFeedback: string;\n voiceHistory: VoiceCommand[];\n sessionInsight: string;\n isPlaying: boolean;\n audioEnergy: number;\n externalExpanded?: boolean;\n onExternalExpandedChange?: (expanded: boolean) => void;\n}\n\n// ==========================================\n// Voice Command Help\n// ==========================================\nconst VOICE_COMMANDS_ZH = [\n { cmd: '\"播放\"', desc: '播放音乐' },\n { cmd: '\"暂停\"', desc: '暂停音乐' },\n { cmd: '\"下一首\"', desc: '下一首歌' },\n { cmd: '\"上一首\"', desc: '上一首歌' },\n { cmd: '\"喜欢\"', desc: '点赞' },\n { cmd: '\"随机播放\"', desc: '切换随机' },\n { cmd: '\"音量大\"', desc: '增大音量' },\n { cmd: '\"音量小\"', desc: '减小音量' },\n { cmd: '\"静音\"', desc: '静音切换' },\n { cmd: '\"播放列表\"', desc: '打开列表' },\n { cmd: '\"创作\"', desc: 'AI歌词' },\n { cmd: '\"排行\"', desc: '排行榜' },\n { cmd: '\"评论\"', desc: '打开评论' },\n { cmd: '\"社区\"', desc: '社区动态' },\n { cmd: '\"分析\"', desc: '数据分析' },\n];\n\nconst VOICE_COMMANDS_EN = [\n { cmd: '\"play\"', desc: 'Play music' },\n { cmd: '\"pause\"', desc: 'Pause music' },\n { cmd: '\"next\"', desc: 'Next track' },\n { cmd: '\"previous\"', desc: 'Previous track' },\n { cmd: '\"like\"', desc: 'Like song' },\n { cmd: '\"shuffle\"', desc: 'Toggle shuffle' },\n { cmd: '\"volume up\"', desc: 'Increase volume' },\n { cmd: '\"volume down\"', desc: 'Decrease volume' },\n { cmd: '\"mute\"', desc: 'Mute toggle' },\n { cmd: '\"playlist\"', desc: 'Open playlist' },\n { cmd: '\"create\"', desc: 'AI Lyrics' },\n { cmd: '\"leaderboard\"', desc: 'Rankings' },\n { cmd: '\"comment\"', desc: 'Comments' },\n { cmd: '\"community\"', desc: 'Community' },\n { cmd: '\"analytics\"', desc: 'Analytics' },\n];\n\n// ==========================================\n// Component\n// ==========================================\nexport const AIAssistant: React.FC<AIAssistantProps> = ({\n activeTips,\n onDismissTip,\n onExecuteAction,\n isListening,\n onToggleListening,\n voiceSupported,\n voiceFeedback,\n voiceHistory,\n sessionInsight,\n isPlaying,\n audioEnergy,\n externalExpanded,\n onExternalExpandedChange,\n}) => {\n const { t, lang } = useI18n();\n const [isExpanded, setIsExpanded] = useState(false);\n const [showCommands, setShowCommands] = useState(false);\n const tipContainerRef = useRef<HTMLDivElement>(null);\n\n const voiceCommands = lang === 'zh' ? VOICE_COMMANDS_ZH : VOICE_COMMANDS_EN;\n\n // Sync with external expanded state (logo click)\n useEffect(() => {\n if (externalExpanded !== undefined) {\n setIsExpanded(externalExpanded);\n }\n }, [externalExpanded]);\n\n const handleSetExpanded = (val: boolean) => {\n setIsExpanded(val);\n onExternalExpandedChange?.(val);\n };\n\n // Auto-expand when tips arrive — no auto\n useEffect(() => {}, [activeTips.length]);\n\n const CATEGORY_COLORS: Record<string, string> = {\n emotion: 'from-pink-500/20 to-purple-500/20 border-pink-500/30',\n achievement: 'from-yellow-500/20 to-amber-500/20 border-yellow-500/30',\n streak: 'from-orange-500/20 to-red-500/20 border-orange-500/30',\n discovery: 'from-blue-500/20 to-cyan-500/20 border-blue-500/30',\n interaction: 'from-green-500/20 to-teal-500/20 border-green-500/30',\n voice: 'from-indigo-500/20 to-violet-500/20 border-indigo-500/30',\n system: 'from-gray-500/20 to-slate-500/20 border-white/10',\n };\n\n return (\n <>\n {/* ===== Floating Tips (Non-intrusive, top-left) ===== */}\n <div\n ref={tipContainerRef}\n className=\"fixed top-20 left-4 z-[45] flex flex-col gap-2 max-w-[340px] pointer-events-none\"\n >\n <AnimatePresence mode=\"popLayout\">\n {activeTips.map((tip) => (\n <motion.div\n key={tip.id}\n initial={{ opacity: 0, x: -50, scale: 0.9 }}\n animate={{ opacity: 1, x: 0, scale: 1 }}\n exit={{ opacity: 0, x: -50, scale: 0.9 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n className={clsx(\n 'pointer-events-auto bg-gradient-to-r backdrop-blur-2xl rounded-xl border p-3 shadow-2xl',\n CATEGORY_COLORS[tip.category] || CATEGORY_COLORS.system\n )}\n >\n <div className=\"flex items-start gap-2.5\">\n <span className=\"text-lg flex-shrink-0 mt-0.5\">{tip.icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-white/80 leading-relaxed\">{tip.message}</p>\n {tip.actionLabel && tip.actionKey && (\n <button\n onClick={() => {\n onExecuteAction(tip.actionKey!);\n onDismissTip(tip.id);\n }}\n className=\"mt-2 text-[11px] font-medium px-3 py-1 rounded-full bg-white/10 hover:bg-white/20 text-white/90 transition-colors border border-white/10\"\n >\n {tip.actionLabel}\n </button>\n )}\n </div>\n <button\n onClick={() => onDismissTip(tip.id)}\n className=\"text-white/30 hover:text-white/60 transition-colors flex-shrink-0 p-0.5\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n {/* Progress bar for tip expiry */}\n <motion.div\n className=\"absolute bottom-0 left-0 h-[2px] bg-white/20 rounded-b-xl\"\n initial={{ width: '100%' }}\n animate={{ width: '0%' }}\n transition={{ duration: 30, ease: 'linear' }}\n />\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n\n {/* ===== Voice Feedback Overlay ===== */}\n <AnimatePresence>\n {voiceFeedback && (\n <motion.div\n key=\"voice-fb\"\n initial={{ opacity: 0, y: 20, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.9 }}\n className=\"fixed bottom-32 left-1/2 -translate-x-1/2 z-[70] bg-black/70 backdrop-blur-2xl rounded-2xl px-5 py-3 border border-white/10 shadow-2xl\"\n >\n <p className=\"text-sm text-white/90 font-medium whitespace-nowrap\">{voiceFeedback}</p>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* ===== Listening Overlay ===== */}\n <AnimatePresence>\n {isListening && (\n <motion.div\n key=\"listening-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[65] pointer-events-none flex items-center justify-center\"\n >\n {/* Concentric pulse rings */}\n {[0, 1, 2].map((i) => (\n <motion.div\n key={i}\n className=\"absolute rounded-full border border-purple-400/20\"\n animate={{\n width: [80, 200 + i * 60],\n height: [80, 200 + i * 60],\n opacity: [0.4, 0],\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n delay: i * 0.5,\n ease: 'easeOut',\n }}\n />\n ))}\n\n {/* Center mic icon */}\n <motion.div\n className=\"w-20 h-20 rounded-full bg-purple-600/30 backdrop-blur-xl border border-purple-400/40 flex items-center justify-center shadow-2xl shadow-purple-500/30\"\n animate={{ scale: [1, 1.1, 1] }}\n transition={{ duration: 1, repeat: Infinity, ease: 'easeInOut' }}\n >\n <Mic className=\"w-8 h-8 text-purple-300\" />\n </motion.div>\n\n {/* Label */}\n <motion.p\n className=\"absolute mt-32 text-sm text-purple-300/80 font-medium\"\n animate={{ opacity: [0.5, 1, 0.5] }}\n transition={{ duration: 2, repeat: Infinity }}\n >\n {lang === 'zh' ? '正在聆听...' : 'Listening...'}\n </motion.p>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* ===== AI Assistant FAB (Bottom-left, desktop only — mobile uses logo) ===== */}\n <div className=\"fixed bottom-[120px] md:bottom-28 left-4 z-[55] hidden md:flex flex-col items-start gap-2\">\n {/* Expanded Panel */}\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ opacity: 0, y: 20, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 20, scale: 0.9 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n className=\"w-72 md:w-80 bg-[#0D1235]/95 backdrop-blur-2xl rounded-2xl border border-white/10 shadow-2xl overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-white/[0.06]\">\n <div className=\"flex items-center gap-2\">\n <BrainCircuit className=\"w-4 h-4 text-purple-400\" />\n <span className=\"text-sm font-semibold text-white/90\">\n {lang === 'zh' ? 'AI 助手' : 'AI Assistant'}\n </span>\n </div>\n <button\n onClick={() => handleSetExpanded(false)}\n className=\"p-1 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 space-y-4 max-h-[50vh] overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n {/* Session Insight */}\n <div className=\"flex items-center gap-2 px-3 py-2 bg-white/[0.03] rounded-lg border border-white/[0.06]\">\n <Clock className=\"w-3.5 h-3.5 text-white/30 flex-shrink-0\" />\n <p className=\"text-[11px] text-white/50\">{sessionInsight}</p>\n </div>\n\n {/* Voice Section */}\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider\">\n {lang === 'zh' ? '语音指令' : 'Voice Commands'}\n </p>\n <button\n onClick={() => setShowCommands(!showCommands)}\n className=\"text-[10px] text-purple-400/60 hover:text-purple-400 transition-colors\"\n >\n {showCommands\n ? (lang === 'zh' ? '收起' : 'Hide')\n : (lang === 'zh' ? '查看指令表' : 'Show commands')\n }\n </button>\n </div>\n\n {/* Mic Button */}\n {voiceSupported ? (\n <button\n onClick={onToggleListening}\n className={clsx(\n 'w-full flex items-center justify-center gap-2 py-2.5 rounded-xl border transition-all',\n isListening\n ? 'bg-purple-600/20 border-purple-500/40 text-purple-300'\n : 'bg-white/[0.03] border-white/[0.08] text-white/50 hover:text-white/80 hover:bg-white/[0.06]'\n )}\n >\n {isListening ? (\n <>\n <motion.div\n animate={{ scale: [1, 1.2, 1] }}\n transition={{ duration: 1, repeat: Infinity }}\n >\n <Mic className=\"w-4 h-4\" />\n </motion.div>\n <span className=\"text-sm\">{lang === 'zh' ? '正在聆听...' : 'Listening...'}</span>\n </>\n ) : (\n <>\n <Mic className=\"w-4 h-4\" />\n <span className=\"text-sm\">{lang === 'zh' ? '点击说出指令' : 'Tap to speak'}</span>\n </>\n )}\n </button>\n ) : (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-white/[0.02] rounded-lg text-white/30 text-xs\">\n <MicOff className=\"w-3.5 h-3.5\" />\n {lang === 'zh' ? '当前浏览器不支持语音识别' : 'Voice not supported in this browser'}\n </div>\n )}\n\n {/* Command List */}\n <AnimatePresence>\n {showCommands && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"mt-2 grid grid-cols-2 gap-1\">\n {voiceCommands.map((vc, i) => (\n <div key={i} className=\"flex items-center gap-1.5 px-2 py-1 rounded-lg bg-white/[0.02]\">\n <span className=\"text-[10px] text-purple-400 font-mono\">{vc.cmd}</span>\n <span className=\"text-[10px] text-white/30\">{vc.desc}</span>\n </div>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Voice History */}\n {voiceHistory.length > 0 && (\n <div className=\"mt-2 space-y-1\">\n <p className=\"text-[10px] text-white/25 uppercase tracking-wider\">\n {lang === 'zh' ? '最近指令' : 'Recent'}\n </p>\n {voiceHistory.slice(-3).reverse().map((vh, i) => (\n <div key={i} className=\"flex items-center gap-2 px-2 py-1 rounded-lg bg-white/[0.02]\">\n <MessageSquare className=\"w-3 h-3 text-white/20 flex-shrink-0\" />\n <span className=\"text-[10px] text-white/40 truncate\">\"{vh.transcript}\"</span>\n <span className=\"text-[10px] text-green-400/60 ml-auto flex-shrink-0\">✓</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* AI Tips Section */}\n {activeTips.length > 0 && (\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '智能提示' : 'AI Insights'}\n </p>\n <div className=\"space-y-2\">\n {activeTips.map((tip) => (\n <div\n key={tip.id}\n className={clsx(\n 'flex items-start gap-2 px-3 py-2 rounded-lg bg-gradient-to-r border',\n CATEGORY_COLORS[tip.category] || CATEGORY_COLORS.system\n )}\n >\n <span className=\"text-sm flex-shrink-0\">{tip.icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[11px] text-white/70 leading-relaxed\">{tip.message}</p>\n {tip.actionLabel && tip.actionKey && (\n <button\n onClick={() => {\n onExecuteAction(tip.actionKey!);\n onDismissTip(tip.id);\n }}\n className=\"mt-1 text-[10px] font-medium px-2 py-0.5 rounded-full bg-white/10 hover:bg-white/20 text-white/80 transition-colors\"\n >\n {tip.actionLabel}\n </button>\n )}\n </div>\n <button\n onClick={() => onDismissTip(tip.id)}\n className=\"text-white/20 hover:text-white/50 flex-shrink-0\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* FAB Button */}\n <motion.button\n onClick={() => handleSetExpanded(!isExpanded)}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className={clsx(\n 'relative w-12 h-12 rounded-full flex items-center justify-center shadow-2xl transition-all border',\n isListening\n ? 'bg-purple-600 border-purple-400/50 shadow-purple-500/40'\n : isExpanded\n ? 'bg-[#0D1235] border-purple-500/30'\n : 'bg-[#0D1235]/90 backdrop-blur-xl border-white/10 hover:border-purple-500/30'\n )}\n style={{\n boxShadow: isListening\n ? `0 0 ${15 + audioEnergy * 20}px rgba(139,92,246,0.4)`\n : isPlaying\n ? `0 0 ${8 + audioEnergy * 12}px rgba(139,92,246,0.15)`\n : undefined,\n }}\n >\n {isListening ? (\n <motion.div\n animate={{ scale: [1, 1.2, 1] }}\n transition={{ duration: 0.8, repeat: Infinity }}\n >\n <Mic className=\"w-5 h-5 text-white\" />\n </motion.div>\n ) : (\n <BrainCircuit className=\"w-5 h-5 text-purple-400\" />\n )}\n\n {/* Notification badge */}\n {activeTips.length > 0 && !isExpanded && (\n <motion.div\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n className=\"absolute -top-1 -right-1 w-4 h-4 rounded-full bg-pink-500 text-white text-[9px] font-bold flex items-center justify-center\"\n >\n {activeTips.length}\n </motion.div>\n )}\n\n {/* Ambient pulse when playing */}\n {isPlaying && !isListening && (\n <motion.div\n className=\"absolute inset-0 rounded-full border border-purple-500/20\"\n animate={{ scale: [1, 1.4, 1], opacity: [0.3, 0, 0.3] }}\n transition={{ duration: 3, repeat: Infinity, ease: 'easeInOut' }}\n />\n )}\n </motion.button>\n\n {/* Quick mic button (separate from FAB when collapsed) */}\n {voiceSupported && !isExpanded && (\n <motion.button\n onClick={onToggleListening}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n className={clsx(\n 'w-9 h-9 rounded-full flex items-center justify-center border transition-all',\n isListening\n ? 'bg-purple-600 border-purple-400/50 text-white'\n : 'bg-[#0D1235]/80 backdrop-blur-xl border-white/10 text-white/40 hover:text-purple-400 hover:border-purple-500/30'\n )}\n >\n {isListening ? (\n <MicOff className=\"w-3.5 h-3.5\" />\n ) : (\n <Mic className=\"w-3.5 h-3.5\" />\n )}\n </motion.button>\n )}\n </div>\n\n {/* ===== Mobile AI Panel (triggered from logo) ===== */}\n <AnimatePresence>\n {isExpanded && (\n <>\n {/* Mobile backdrop */}\n <motion.div\n key=\"mobile-ai-backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"md:hidden fixed inset-0 z-[55] bg-black/40\"\n onClick={() => handleSetExpanded(false)}\n />\n <motion.div\n key=\"mobile-ai-overlay\"\n initial={{ opacity: 0, y: 30 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 30 }}\n transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n className=\"md:hidden fixed left-3 right-3 top-14 z-[56] max-h-[70vh] bg-[#0D1235]/98 backdrop-blur-2xl rounded-2xl border border-white/10 shadow-2xl overflow-hidden\"\n >\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-white/[0.06]\">\n <div className=\"flex items-center gap-2\">\n <BrainCircuit className=\"w-4 h-4 text-purple-400\" />\n <span className=\"text-sm font-semibold text-white/90\">\n {lang === 'zh' ? 'AI 助手' : 'AI Assistant'}\n </span>\n </div>\n <button\n onClick={() => handleSetExpanded(false)}\n className=\"p-1.5 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"p-4 space-y-3 max-h-[60vh] overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n <div className=\"flex items-center gap-2 px-3 py-2 bg-white/[0.03] rounded-lg border border-white/[0.06]\">\n <Clock className=\"w-3.5 h-3.5 text-white/30 flex-shrink-0\" />\n <p className=\"text-[11px] text-white/50\">{sessionInsight}</p>\n </div>\n {voiceSupported && (\n <button\n onClick={onToggleListening}\n className={clsx(\n 'w-full flex items-center justify-center gap-2 py-3 rounded-xl border transition-all',\n isListening\n ? 'bg-purple-600/20 border-purple-500/40 text-purple-300'\n : 'bg-white/[0.03] border-white/[0.08] text-white/50'\n )}\n >\n <Mic className=\"w-5 h-5\" />\n <span className=\"text-sm\">{isListening ? (lang === 'zh' ? '正在聆听...' : 'Listening...') : (lang === 'zh' ? '点击说出指令' : 'Tap to speak')}</span>\n </button>\n )}\n {activeTips.length > 0 && (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider\">{lang === 'zh' ? '智能提示' : 'AI Tips'}</p>\n {activeTips.map(tip => (\n <div key={tip.id} className={clsx('flex items-start gap-2 px-3 py-2 rounded-lg bg-gradient-to-r border', CATEGORY_COLORS[tip.category] || CATEGORY_COLORS.system)}>\n <span className=\"text-sm flex-shrink-0\">{tip.icon}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[11px] text-white/70 leading-relaxed\">{tip.message}</p>\n {tip.actionLabel && tip.actionKey && (\n <button onClick={() => { onExecuteAction(tip.actionKey!); onDismissTip(tip.id); }} className=\"mt-1 text-[10px] font-medium px-2 py-0.5 rounded-full bg-white/10 text-white/80\">{tip.actionLabel}</button>\n )}\n </div>\n <button onClick={() => onDismissTip(tip.id)} className=\"text-white/20\"><X className=\"w-3 h-3\" /></button>\n </div>\n ))}\n </div>\n )}\n {voiceHistory.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"text-[10px] text-white/25 uppercase tracking-wider\">{lang === 'zh' ? '最近指令' : 'Recent'}</p>\n {voiceHistory.slice(-3).reverse().map((vh, i) => (\n <div key={i} className=\"flex items-center gap-2 px-2 py-1 rounded-lg bg-white/[0.02]\">\n <MessageSquare className=\"w-3 h-3 text-white/20 flex-shrink-0\" />\n <span className=\"text-[10px] text-white/40 truncate\">\"{vh.transcript}\"</span>\n <span className=\"text-[10px] text-green-400/60 ml-auto\">✓</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n );\n};","import React, { useState, useCallback } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport {\n X,\n Wand2,\n Copy,\n Check,\n Loader2,\n Sparkles,\n Smile,\n Frown,\n Zap,\n Cloud,\n Heart,\n RefreshCw,\n Plus,\n Minus,\n Music,\n Volume2,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { apiFetch } from '@yyc3/music-utils';\nimport { useI18n } from '@yyc3/music-hooks';\nimport { useAudioComposer, type CompositionParams } from '@yyc3/music-hooks';\n\ninterface AILyricsGeneratorProps {\n isOpen: boolean;\n onClose: () => void;\n onCreateTrack?: (lyrics: string[], theme: AILyricsTheme, audioBlobUrl?: string, compositionParams?: CompositionParams) => void;\n}\n\nexport type AILyricsTheme = 'happy' | 'sad' | 'energetic' | 'calm' | 'love';\n\nconst THEMES: Array<{\n id: AILyricsTheme;\n label: string;\n labelZh: string;\n icon: React.ElementType;\n color: string;\n bg: string;\n}> = [\n { id: 'happy', label: 'Happy', labelZh: '快乐', icon: Smile, color: 'text-yellow-400', bg: 'from-yellow-500/20 to-orange-500/20' },\n { id: 'sad', label: 'Sad', labelZh: '忧伤', icon: Frown, color: 'text-blue-400', bg: 'from-blue-500/20 to-indigo-500/20' },\n { id: 'energetic', label: 'Energetic', labelZh: '活力', icon: Zap, color: 'text-red-400', bg: 'from-red-500/20 to-orange-500/20' },\n { id: 'calm', label: 'Calm', labelZh: '宁静', icon: Cloud, color: 'text-cyan-400', bg: 'from-cyan-500/20 to-teal-500/20' },\n { id: 'love', label: 'Love', labelZh: '爱情', icon: Heart, color: 'text-pink-400', bg: 'from-pink-500/20 to-red-500/20' },\n];\n\nexport const AILyricsGenerator: React.FC<AILyricsGeneratorProps> = ({\n isOpen,\n onClose,\n onCreateTrack,\n}) => {\n const [selectedTheme, setSelectedTheme] = useState<AILyricsTheme>('happy');\n const [keywords, setKeywords] = useState<string[]>([]);\n const [keywordInput, setKeywordInput] = useState('');\n const [lineCount, setLineCount] = useState(8);\n const [generating, setGenerating] = useState(false);\n const [generatedLyrics, setGeneratedLyrics] = useState<string[] | null>(null);\n const [copied, setCopied] = useState(false);\n const [generationCount, setGenerationCount] = useState(0);\n const [trackCreated, setTrackCreated] = useState(false);\n const [compositionStage, setCompositionStage] = useState<'idle' | 'composing-params' | 'synthesizing' | 'done'>('idle');\n const composer = useAudioComposer();\n const { t, lang } = useI18n();\n\n const addKeyword = useCallback(() => {\n const trimmed = keywordInput.trim();\n if (trimmed && keywords.length < 5 && !keywords.includes(trimmed)) {\n setKeywords((prev) => [...prev, trimmed]);\n setKeywordInput('');\n }\n }, [keywordInput, keywords]);\n\n const removeKeyword = useCallback((kw: string) => {\n setKeywords((prev) => prev.filter((k) => k !== kw));\n }, []);\n\n const handleGenerate = useCallback(async () => {\n setGenerating(true);\n try {\n const result = await apiFetch<{\n success: boolean;\n lyrics: string[];\n theme: string;\n themeLabel: string;\n }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: selectedTheme,\n keywords,\n lines: lineCount,\n }),\n });\n\n if (result?.lyrics) {\n setGeneratedLyrics(result.lyrics);\n setGenerationCount((prev) => prev + 1);\n }\n } catch (err) {\n console.error('AI lyrics generation failed:', err);\n } finally {\n setGenerating(false);\n }\n }, [selectedTheme, keywords, lineCount]);\n\n const handleCopy = useCallback(() => {\n if (generatedLyrics) {\n navigator.clipboard.writeText(generatedLyrics.join('\\n'));\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [generatedLyrics]);\n\n const handleCreateTrack = useCallback(async () => {\n if (!generatedLyrics || !onCreateTrack) return;\n\n setCompositionStage('composing-params');\n // Haptic feedback\n try { navigator.vibrate?.(25); } catch {}\n\n try {\n // Step 1: Get composition parameters from backend\n const compResult = await apiFetch<{\n success: boolean;\n composition: CompositionParams;\n }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: selectedTheme,\n lyrics: generatedLyrics,\n lineCount,\n }),\n });\n\n if (!compResult?.composition) {\n // Fallback: create track without synthesized audio\n onCreateTrack(generatedLyrics, selectedTheme);\n setTrackCreated(true);\n setCompositionStage('done');\n setTimeout(() => { setTrackCreated(false); setCompositionStage('idle'); }, 2500);\n return;\n }\n\n setCompositionStage('synthesizing');\n\n // Step 2: Synthesize audio using Web Audio API\n const audioBlobUrl = await composer.compose(compResult.composition);\n\n // Step 3: Create the track with real audio\n onCreateTrack(generatedLyrics, selectedTheme, audioBlobUrl, compResult.composition);\n setTrackCreated(true);\n setCompositionStage('done');\n try { navigator.vibrate?.([10, 30, 10, 30, 40]); } catch {} // success haptic\n setTimeout(() => { setTrackCreated(false); setCompositionStage('idle'); }, 2500);\n } catch (err) {\n console.error('Composition pipeline failed:', err);\n // Fallback: create track with demo oscillators\n onCreateTrack(generatedLyrics, selectedTheme);\n setTrackCreated(true);\n setCompositionStage('done');\n setTimeout(() => { setTrackCreated(false); setCompositionStage('idle'); }, 2500);\n }\n }, [generatedLyrics, onCreateTrack, selectedTheme, lineCount, composer]);\n\n const currentTheme = THEMES.find((t) => t.id === selectedTheme)!;\n\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[60] bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n <motion.div\n initial={{ y: '100%', opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: '100%', opacity: 0 }}\n transition={{ type: 'spring', damping: 28, stiffness: 300 }}\n className=\"fixed inset-x-0 bottom-0 z-[61] max-h-[90vh] bg-[#0D1235]/95 backdrop-blur-2xl border-t border-white/10 rounded-t-3xl flex flex-col shadow-2xl md:inset-x-auto md:left-1/2 md:-translate-x-1/2 md:w-full md:max-w-lg md:bottom-auto md:top-1/2 md:-translate-y-1/2 md:rounded-2xl md:border md:max-h-[85vh]\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-5 pb-3 border-b border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-9 h-9 rounded-xl bg-gradient-to-tr from-purple-500/20 to-pink-500/20 border border-white/10 flex items-center justify-center\">\n <Wand2 className=\"w-4.5 h-4.5 text-purple-400\" />\n </div>\n <div>\n <h3 className=\"text-white font-semibold text-sm leading-tight\">{t('aiLyrics.title')}</h3>\n <p className=\"text-white/30 text-xs\">\n {t('aiLyrics.subtitle')}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-5 space-y-5\" style={{ scrollbarWidth: 'none' }}>\n {/* Theme Selection */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {t('aiLyrics.theme')}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map((theme) => {\n const Icon = theme.icon;\n const isActive = selectedTheme === theme.id;\n return (\n <button\n key={theme.id}\n onClick={() => setSelectedTheme(theme.id)}\n className={clsx(\n 'p-3 rounded-xl border transition-all text-center',\n isActive\n ? `bg-gradient-to-br ${theme.bg} border-white/15 shadow-lg`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n <Icon\n className={clsx(\n 'w-5 h-5 mx-auto mb-1',\n isActive ? theme.color : 'text-white/30'\n )}\n />\n <p className={clsx('text-[10px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Keywords */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {t('aiLyrics.keywords')} <span className=\"text-white/20\">({keywords.length}/5)</span>\n </p>\n <div className=\"flex gap-2 mb-2\">\n <input\n type=\"text\"\n value={keywordInput}\n onChange={(e) => setKeywordInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && addKeyword()}\n placeholder={t('aiLyrics.enterKeyword')}\n className=\"flex-1 bg-white/5 border border-white/10 rounded-lg py-2 px-3 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-purple-500/50\"\n />\n <button\n onClick={addKeyword}\n disabled={!keywordInput.trim() || keywords.length >= 5}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white hover:bg-white/10 transition-colors disabled:opacity-30\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n {keywords.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {keywords.map((kw) => (\n <motion.span\n key={kw}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n className=\"inline-flex items-center gap-1 px-2.5 py-1 bg-purple-500/10 border border-purple-500/20 rounded-full text-xs text-purple-300\"\n >\n {kw}\n <button onClick={() => removeKeyword(kw)} className=\"text-purple-400/60 hover:text-purple-300\">\n <X className=\"w-3 h-3\" />\n </button>\n </motion.span>\n ))}\n </div>\n )}\n </div>\n\n {/* Line Count */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {t('aiLyrics.lines')}\n </p>\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => setLineCount(Math.max(4, lineCount - 2))}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\"\n >\n <Minus className=\"w-4 h-4\" />\n </button>\n <div className=\"flex-1 text-center\">\n <span className=\"text-2xl font-bold text-white font-mono\">{lineCount}</span>\n <span className=\"text-xs text-white/30 ml-1\">{t('aiLyrics.linesUnit')}</span>\n </div>\n <button\n onClick={() => setLineCount(Math.min(16, lineCount + 2))}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Generate Button */}\n <motion.button\n onClick={handleGenerate}\n disabled={generating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-3 rounded-xl bg-gradient-to-r from-purple-600 via-pink-600 to-blue-600 text-white font-medium flex items-center justify-center gap-2 shadow-lg shadow-purple-500/20 disabled:opacity-50 transition-opacity\"\n >\n {generating ? (\n <>\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n {t('aiLyrics.generating')}\n </>\n ) : (\n <>\n <Sparkles className=\"w-4 h-4\" />\n {generationCount > 0 ? t('aiLyrics.regenerate') : t('aiLyrics.generate')}\n </>\n )}\n </motion.button>\n\n {/* Generated Lyrics */}\n <AnimatePresence>\n {generatedLyrics && (\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 20 }}\n className=\"space-y-3\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <currentTheme.icon className={clsx('w-4 h-4', currentTheme.color)} />\n <p className=\"text-xs text-white/50\">\n {t('aiLyrics.generated')} · {lang === 'zh' ? currentTheme.labelZh : currentTheme.label} {t('aiLyrics.themeSuffix')}\n </p>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={handleGenerate}\n disabled={generating}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n title=\"Regenerate\"\n >\n <RefreshCw className={clsx('w-3.5 h-3.5', generating && 'animate-spin')} />\n </button>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1 px-2.5 py-1 rounded-lg bg-white/5 border border-white/[0.08] text-xs text-white/50 hover:text-white/80 transition-colors\"\n >\n {copied ? (\n <>\n <Check className=\"w-3 h-3 text-green-400\" />\n <span className=\"text-green-400\">{t('aiLyrics.copied')}</span>\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3\" />\n {t('aiLyrics.copy')}\n </>\n )}\n </button>\n {onCreateTrack && (\n <button\n onClick={handleCreateTrack}\n disabled={compositionStage !== 'idle' && compositionStage !== 'done'}\n className={clsx(\n 'flex items-center gap-1 px-2.5 py-1 rounded-lg border text-xs transition-colors',\n compositionStage === 'idle' || compositionStage === 'done'\n ? 'bg-white/5 border-white/[0.08] text-white/50 hover:text-white/80'\n : 'bg-purple-500/10 border-purple-500/20 text-purple-300'\n )}\n >\n {trackCreated ? (\n <>\n <Check className=\"w-3 h-3 text-green-400\" />\n <span className=\"text-green-400\">{t('aiLyrics.trackCreated')}</span>\n </>\n ) : compositionStage === 'composing-params' ? (\n <>\n <Loader2 className=\"w-3 h-3 animate-spin text-purple-400\" />\n <span>{lang === 'zh' ? '编曲中...' : 'Composing...'}</span>\n </>\n ) : compositionStage === 'synthesizing' ? (\n <>\n <Volume2 className=\"w-3 h-3 animate-pulse text-purple-400\" />\n <span>{lang === 'zh' ? `合成 ${Math.round(composer.progress * 100)}%` : `Synth ${Math.round(composer.progress * 100)}%`}</span>\n </>\n ) : (\n <>\n <Music className=\"w-3 h-3\" />\n {lang === 'zh' ? '创建歌曲' : 'Create Track'}\n </>\n )}\n </button>\n )}\n </div>\n </div>\n\n <div className={clsx('rounded-xl border p-4 bg-gradient-to-br', currentTheme.bg, 'border-white/[0.08]')}>\n <div className=\"space-y-2\">\n {generatedLyrics.map((line, i) => (\n <motion.p\n key={`${generationCount}-${i}`}\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.08 }}\n className=\"text-sm text-white/80 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n};","import React, { useState, useCallback, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport {\n X, Wand2, Copy, Check, Loader2, Sparkles,\n Smile, Frown, Zap, Cloud, Heart,\n Plus, Minus, Music, ChevronRight,\n Layers, FolderOpen,\n Trash2, Clock,\n ArrowLeft, Settings2,\n Share2, Film, ExternalLink,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { apiFetch } from '@yyc3/music-utils';\nimport { useI18n } from '@yyc3/music-hooks';\nimport { useAudioComposer, type CompositionParams } from '@yyc3/music-hooks';\nimport type { Track } from '@yyc3/music-data';\n\n// ==========================================\n// AI Creation Studio\n// ==========================================\n// A comprehensive music creation hub with multiple modes:\n// 1. Quick Song (极简写歌) — fast AI lyrics + compose\n// 2. Master Mode (大师写歌) — advanced controls for theme, structure, instruments\n// 3. Remix Mode (热歌改编/AI翻唱) — transform existing tracks\n// 4. My Works (作品管理) — manage created tracks\n\ntype CreationMode = 'quick' | 'master' | 'remix' | 'works' | 'mv';\ntype AILyricsTheme = 'happy' | 'sad' | 'energetic' | 'calm' | 'love';\n\ninterface CreationStudioProps {\n isOpen: boolean;\n onClose: () => void;\n onCreateTrack?: (\n lyrics: string[],\n theme: string,\n audioBlobUrl?: string,\n compositionParams?: CompositionParams\n ) => void;\n playlist: Track[];\n currentTrackIndex: number;\n onHaptic?: (pattern: string) => void;\n onShareWork?: (work: CreatedWork) => void;\n onOpenMV?: (workLyrics?: string[]) => void;\n user?: any;\n starPower?: number;\n onStarPowerUpdate?: (sp: number) => void;\n}\n\nconst THEMES: Array<{\n id: AILyricsTheme;\n label: string;\n labelZh: string;\n icon: React.ElementType;\n color: string;\n bg: string;\n premium?: boolean;\n spCost?: number;\n}> = [\n { id: 'happy', label: 'Happy', labelZh: '快乐', icon: Smile, color: 'text-yellow-400', bg: 'from-yellow-500/20 to-orange-500/20' },\n { id: 'sad', label: 'Sad', labelZh: '忧伤', icon: Frown, color: 'text-blue-400', bg: 'from-blue-500/20 to-indigo-500/20' },\n { id: 'energetic', label: 'Energetic', labelZh: '活力', icon: Zap, color: 'text-red-400', bg: 'from-red-500/20 to-orange-500/20', premium: true, spCost: 200 },\n { id: 'calm', label: 'Calm', labelZh: '宁静', icon: Cloud, color: 'text-cyan-400', bg: 'from-cyan-500/20 to-teal-500/20' },\n { id: 'love', label: 'Love', labelZh: '爱情', icon: Heart, color: 'text-pink-400', bg: 'from-pink-500/20 to-red-500/20', premium: true, spCost: 200 },\n];\n\nconst MODES: Array<{\n id: CreationMode;\n label: string;\n labelZh: string;\n icon: React.ElementType;\n desc: string;\n descZh: string;\n gradient: string;\n}> = [\n {\n id: 'quick',\n label: 'Quick Song',\n labelZh: '极简写歌',\n icon: Sparkles,\n desc: 'AI lyrics + auto compose in seconds',\n descZh: '一键AI写词作曲,秒出成品',\n gradient: 'from-purple-500 to-pink-500',\n },\n {\n id: 'master',\n label: 'Master Mode',\n labelZh: '大师写歌',\n icon: Settings2,\n desc: 'Full control over theme, structure & style',\n descZh: '精细控制主题、结构与风格',\n gradient: 'from-indigo-500 to-blue-500',\n },\n {\n id: 'remix',\n label: 'Remix & Cover',\n labelZh: '热歌改编',\n icon: Layers,\n desc: 'Transform existing tracks with AI',\n descZh: 'AI改编翻唱热门曲目',\n gradient: 'from-orange-500 to-red-500',\n },\n {\n id: 'works',\n label: 'My Works',\n labelZh: '作品管理',\n icon: FolderOpen,\n desc: 'View & manage your creations',\n descZh: '查看管理你的创作',\n gradient: 'from-emerald-500 to-teal-500',\n },\n {\n id: 'mv',\n label: 'MV Creator',\n labelZh: 'MV 创作',\n icon: Film,\n desc: 'Visualize music with AI effects',\n descZh: 'AI驱动音乐可视化MV',\n gradient: 'from-cyan-500 to-blue-500',\n },\n];\n\n// Song structures for Master Mode\nconst STRUCTURES = [\n { id: 'verse-chorus', label: 'Verse-Chorus', labelZh: '主副歌' },\n { id: 'verse-bridge', label: 'Verse-Bridge', labelZh: '主歌-桥段' },\n { id: 'aaba', label: 'AABA', labelZh: 'AABA经典' },\n { id: 'through', label: 'Through-composed', labelZh: '通谱体' },\n];\n\nconst INSTRUMENTS = [\n { id: 'piano', label: 'Piano', labelZh: '钢琴', emoji: '🎹' },\n { id: 'guitar', label: 'Guitar', labelZh: '吉他', emoji: '🎸' },\n { id: 'synth', label: 'Synth', labelZh: '合成器', emoji: '🎛️' },\n { id: 'strings', label: 'Strings', labelZh: '弦乐', emoji: '🎻' },\n { id: 'drums', label: 'Drums', labelZh: '鼓', emoji: '🥁' },\n { id: 'bass', label: 'Bass', labelZh: '贝斯', emoji: '🎸' },\n];\n\n// Stored works type\ninterface CreatedWork {\n id: string;\n title: string;\n theme: string;\n lyrics: string[];\n createdAt: number;\n mode: string;\n}\n\nexport const CreationStudio: React.FC<CreationStudioProps> = ({\n isOpen,\n onClose,\n onCreateTrack,\n playlist,\n currentTrackIndex,\n onHaptic,\n onShareWork,\n onOpenMV,\n user,\n starPower = 0,\n onStarPowerUpdate,\n}) => {\n const { t, lang } = useI18n();\n const [activeMode, setActiveMode] = useState<CreationMode | null>(null);\n const [unlockedPremium, setUnlockedPremium] = useState<Set<string>>(new Set());\n\n // Load unlocked themes from KV (with localStorage migration fallback)\n useEffect(() => {\n if (!user) {\n try {\n const saved = localStorage.getItem('dmusic-unlocked-themes');\n if (saved) setUnlockedPremium(new Set(JSON.parse(saved)));\n } catch {}\n return;\n }\n (async () => {\n try {\n const data = await apiFetch<{ themes: string[] }>(`/user/${user.id}/unlocked-themes`);\n if (data?.themes && data.themes.length > 0) {\n setUnlockedPremium(new Set(data.themes));\n } else {\n // Migrate from localStorage if exists\n try {\n const saved = localStorage.getItem('dmusic-unlocked-themes');\n if (saved) {\n const parsed = JSON.parse(saved) as string[];\n if (parsed.length > 0) {\n setUnlockedPremium(new Set(parsed));\n for (const tid of parsed) {\n await apiFetch(`/user/${user.id}/unlocked-themes`, {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themeId: tid }),\n });\n }\n localStorage.removeItem('dmusic-unlocked-themes');\n }\n }\n } catch {}\n }\n } catch {\n try { const s = localStorage.getItem('dmusic-unlocked-themes'); if (s) setUnlockedPremium(new Set(JSON.parse(s))); } catch {}\n }\n })();\n }, [user]);\n\n const handleUnlockTheme = async (themeId: string, cost: number) => {\n if (!user || starPower < cost) return;\n try {\n const result = await apiFetch<any>(`/starpower/${user.id}/consume`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ amount: cost, purpose: 'template_unlock', targetId: themeId }),\n });\n if (result?.success) {\n onStarPowerUpdate?.(result.starPower);\n const updated = new Set(unlockedPremium);\n updated.add(themeId);\n setUnlockedPremium(updated);\n // Persist to KV\n await apiFetch(`/user/${user.id}/unlocked-themes`, {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themeId }),\n });\n }\n } catch (err) { console.error('Theme unlock error:', err); }\n };\n\n // Quick Song state\n const [quickTheme, setQuickTheme] = useState<AILyricsTheme>('happy');\n const [quickPrompt, setQuickPrompt] = useState('');\n const [quickGenerating, setQuickGenerating] = useState(false);\n const [quickLyrics, setQuickLyrics] = useState<string[] | null>(null);\n const [quickComposing, setQuickComposing] = useState<'idle' | 'lyrics' | 'composing' | 'synth' | 'done'>('idle');\n const composer = useAudioComposer();\n\n // Master Mode state\n const [masterTheme, setMasterTheme] = useState<AILyricsTheme>('calm');\n const [masterKeywords, setMasterKeywords] = useState<string[]>([]);\n const [masterKwInput, setMasterKwInput] = useState('');\n const [masterLineCount, setMasterLineCount] = useState(10);\n const [masterStructure, setMasterStructure] = useState('verse-chorus');\n const [masterInstruments, setMasterInstruments] = useState<string[]>(['piano', 'strings']);\n const [masterTempo, setMasterTempo] = useState(100);\n const [masterGenerating, setMasterGenerating] = useState(false);\n const [masterLyrics, setMasterLyrics] = useState<string[] | null>(null);\n const [masterComposing, setMasterComposing] = useState<'idle' | 'lyrics' | 'composing' | 'synth' | 'done'>('idle');\n\n // Remix state\n const [remixSourceTrack, setRemixSourceTrack] = useState<number | null>(null);\n const [remixTargetTheme, setRemixTargetTheme] = useState<AILyricsTheme>('energetic');\n const [remixGenerating, setRemixGenerating] = useState(false);\n const [remixResult, setRemixResult] = useState<string[] | null>(null);\n const [remixComposing, setRemixComposing] = useState<'idle' | 'lyrics' | 'composing' | 'synth' | 'done'>('idle');\n\n // My Works state\n const [works, setWorks] = useState<CreatedWork[]>([]);\n const [copied, setCopied] = useState<string | null>(null);\n\n // Load works from localStorage\n useEffect(() => {\n if (isOpen) {\n try {\n const stored = localStorage.getItem('d-music-works');\n if (stored) setWorks(JSON.parse(stored));\n } catch {}\n }\n }, [isOpen]);\n\n const saveWork = useCallback((work: CreatedWork) => {\n setWorks(prev => {\n const updated = [work, ...prev].slice(0, 50);\n try { localStorage.setItem('d-music-works', JSON.stringify(updated)); } catch {}\n return updated;\n });\n }, []);\n\n const deleteWork = useCallback((id: string) => {\n setWorks(prev => {\n const updated = prev.filter(w => w.id !== id);\n try { localStorage.setItem('d-music-works', JSON.stringify(updated)); } catch {}\n return updated;\n });\n }, []);\n\n // ========== Quick Song Pipeline ==========\n const handleQuickCreate = useCallback(async () => {\n setQuickGenerating(true);\n setQuickComposing('lyrics');\n onHaptic?.('medium');\n\n try {\n // Step 1: Generate lyrics\n const lyricsResult = await apiFetch<{ success: boolean; lyrics: string[] }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: quickTheme,\n keywords: quickPrompt ? quickPrompt.split(/[,,\\s]+/).filter(Boolean) : [],\n lines: 8,\n }),\n });\n\n if (!lyricsResult?.lyrics) throw new Error('Lyrics generation failed');\n setQuickLyrics(lyricsResult.lyrics);\n setQuickComposing('composing');\n\n // Step 2: Get composition parameters\n const compResult = await apiFetch<{ success: boolean; composition: CompositionParams }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: quickTheme,\n lyrics: lyricsResult.lyrics,\n lineCount: 8,\n }),\n });\n\n if (!compResult?.composition) {\n // Fallback without audio\n onCreateTrack?.(lyricsResult.lyrics, quickTheme);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${quickTheme} · Quick Song`,\n theme: quickTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'quick',\n });\n setQuickComposing('done');\n onHaptic?.('success');\n setTimeout(() => setQuickComposing('idle'), 2000);\n return;\n }\n\n setQuickComposing('synth');\n\n // Step 3: Synthesize audio\n const audioBlobUrl = await composer.compose(compResult.composition);\n\n // Step 4: Create track\n onCreateTrack?.(lyricsResult.lyrics, quickTheme, audioBlobUrl, compResult.composition);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${quickTheme} · Quick Song`,\n theme: quickTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'quick',\n });\n setQuickComposing('done');\n onHaptic?.('success');\n setTimeout(() => setQuickComposing('idle'), 2500);\n } catch (err) {\n console.error('Quick create failed:', err);\n if (quickLyrics) {\n onCreateTrack?.(quickLyrics, quickTheme);\n }\n setQuickComposing('idle');\n } finally {\n setQuickGenerating(false);\n }\n }, [quickTheme, quickPrompt, onCreateTrack, composer, onHaptic, quickLyrics, saveWork]);\n\n // ========== Master Mode Pipeline ==========\n const handleMasterCreate = useCallback(async () => {\n setMasterGenerating(true);\n setMasterComposing('lyrics');\n onHaptic?.('medium');\n\n try {\n const lyricsResult = await apiFetch<{ success: boolean; lyrics: string[] }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: masterTheme,\n keywords: masterKeywords,\n lines: masterLineCount,\n }),\n });\n\n if (!lyricsResult?.lyrics) throw new Error('Lyrics generation failed');\n setMasterLyrics(lyricsResult.lyrics);\n setMasterComposing('composing');\n\n const compResult = await apiFetch<{ success: boolean; composition: CompositionParams }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: masterTheme,\n lyrics: lyricsResult.lyrics,\n lineCount: masterLineCount,\n }),\n });\n\n if (!compResult?.composition) {\n onCreateTrack?.(lyricsResult.lyrics, masterTheme);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${masterTheme} · Master Work`,\n theme: masterTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'master',\n });\n setMasterComposing('done');\n onHaptic?.('success');\n setTimeout(() => setMasterComposing('idle'), 2000);\n return;\n }\n\n setMasterComposing('synth');\n const audioBlobUrl = await composer.compose(compResult.composition);\n onCreateTrack?.(lyricsResult.lyrics, masterTheme, audioBlobUrl, compResult.composition);\n saveWork({\n id: `work-${Date.now()}`,\n title: `${masterTheme} · Master Work`,\n theme: masterTheme,\n lyrics: lyricsResult.lyrics,\n createdAt: Date.now(),\n mode: 'master',\n });\n setMasterComposing('done');\n onHaptic?.('success');\n setTimeout(() => setMasterComposing('idle'), 2500);\n } catch (err) {\n console.error('Master create failed:', err);\n setMasterComposing('idle');\n } finally {\n setMasterGenerating(false);\n }\n }, [masterTheme, masterKeywords, masterLineCount, onCreateTrack, composer, onHaptic, saveWork]);\n\n // ========== Remix Pipeline (with AI audio re-synthesis) ==========\n const handleRemix = useCallback(async () => {\n if (remixSourceTrack === null) return;\n setRemixGenerating(true);\n setRemixComposing('lyrics');\n onHaptic?.('medium');\n\n try {\n const sourceTrack = playlist[remixSourceTrack];\n const sourceWords = sourceTrack.lyrics\n .slice(1, 5)\n .map(l => l.text)\n .join(' ')\n .split(' ')\n .filter(w => w.length > 3)\n .slice(0, 5);\n\n // Step 1: Generate remixed lyrics in target style\n const lyricsResult = await apiFetch<{ success: boolean; lyrics: string[] }>('/ai/lyrics', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: remixTargetTheme,\n keywords: sourceWords,\n lines: 8,\n }),\n });\n\n if (!lyricsResult?.lyrics) throw new Error('Remix lyrics failed');\n setRemixResult(lyricsResult.lyrics);\n setRemixComposing('composing');\n\n // Step 2: AI composition in the new style\n const compResult = await apiFetch<{ success: boolean; composition: CompositionParams }>('/ai/compose', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n theme: remixTargetTheme,\n lyrics: lyricsResult.lyrics,\n lineCount: 8,\n }),\n });\n\n const workTitle = `Remix · ${sourceTrack.title}`;\n\n if (!compResult?.composition) {\n // Fallback without audio\n onCreateTrack?.(lyricsResult.lyrics, remixTargetTheme);\n saveWork({ id: `work-${Date.now()}`, title: workTitle, theme: remixTargetTheme, lyrics: lyricsResult.lyrics, createdAt: Date.now(), mode: 'remix' });\n setRemixComposing('done');\n onHaptic?.('success');\n setTimeout(() => setRemixComposing('idle'), 2000);\n return;\n }\n\n setRemixComposing('synth');\n\n // Step 3: Synthesize audio via OfflineAudioContext\n const audioBlobUrl = await composer.compose(compResult.composition);\n\n // Step 4: Create playable track with synthesized audio\n onCreateTrack?.(lyricsResult.lyrics, remixTargetTheme, audioBlobUrl, compResult.composition);\n saveWork({ id: `work-${Date.now()}`, title: workTitle, theme: remixTargetTheme, lyrics: lyricsResult.lyrics, createdAt: Date.now(), mode: 'remix' });\n setRemixComposing('done');\n onHaptic?.('success');\n setTimeout(() => setRemixComposing('idle'), 2500);\n } catch (err) {\n console.error('Remix failed:', err);\n setRemixComposing('idle');\n } finally {\n setRemixGenerating(false);\n }\n }, [remixSourceTrack, remixTargetTheme, playlist, onCreateTrack, onHaptic, saveWork, composer]);\n\n const handleCopyLyrics = useCallback((lyrics: string[], id: string) => {\n navigator.clipboard.writeText(lyrics.join('\\n'));\n setCopied(id);\n setTimeout(() => setCopied(null), 2000);\n }, []);\n\n const addMasterKeyword = useCallback(() => {\n const trimmed = masterKwInput.trim();\n if (trimmed && masterKeywords.length < 8 && !masterKeywords.includes(trimmed)) {\n setMasterKeywords(prev => [...prev, trimmed]);\n setMasterKwInput('');\n }\n }, [masterKwInput, masterKeywords]);\n\n const toggleInstrument = useCallback((id: string) => {\n setMasterInstruments(prev =>\n prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id]\n );\n }, []);\n\n const formatDate = useCallback((ts: number) => {\n const d = new Date(ts);\n return `${d.getMonth() + 1}/${d.getDate()} ${d.getHours()}:${d.getMinutes().toString().padStart(2, '0')}`;\n }, []);\n\n // ========== Composition Progress Label ==========\n const getProgressLabel = (stage: string) => {\n if (stage === 'lyrics') return lang === 'zh' ? 'AI 写词中...' : 'Generating lyrics...';\n if (stage === 'composing') return lang === 'zh' ? '编曲设计中...' : 'Composing...';\n if (stage === 'synth') return lang === 'zh' ? `音频合成 ${Math.round(composer.progress * 100)}%` : `Synthesizing ${Math.round(composer.progress * 100)}%`;\n if (stage === 'done') return lang === 'zh' ? '创作完成!' : 'Complete!';\n return '';\n };\n\n // ========== Render ==========\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[60] bg-black/60 backdrop-blur-md\"\n onClick={onClose}\n />\n\n {/* Studio Panel */}\n <motion.div\n initial={{ y: '100%', opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: '100%', opacity: 0 }}\n transition={{ type: 'spring', damping: 28, stiffness: 300 }}\n className=\"fixed inset-x-0 bottom-0 z-[61] max-h-[92vh] bg-[#0B1030]/98 backdrop-blur-2xl border-t border-white/10 rounded-t-3xl flex flex-col shadow-2xl md:inset-x-auto md:left-1/2 md:-translate-x-1/2 md:w-full md:max-w-xl md:bottom-auto md:top-1/2 md:-translate-y-1/2 md:rounded-2xl md:border md:max-h-[88vh]\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-5 pb-3 border-b border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n {activeMode && (\n <button\n onClick={() => { setActiveMode(null); onHaptic?.('light'); }}\n className=\"p-1.5 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors mr-1\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </button>\n )}\n <div className=\"w-9 h-9 rounded-xl bg-gradient-to-tr from-purple-500/20 to-pink-500/20 border border-white/10 flex items-center justify-center\">\n <Wand2 className=\"w-4 h-4 text-purple-400\" />\n </div>\n <div>\n <h3 className=\"text-white font-semibold text-sm leading-tight\">\n {activeMode\n ? MODES.find(m => m.id === activeMode)?.[lang === 'zh' ? 'labelZh' : 'label']\n : (lang === 'zh' ? 'AI 创作工坊' : 'AI Creation Studio')}\n </h3>\n <p className=\"text-white/30 text-xs\">\n {activeMode\n ? MODES.find(m => m.id === activeMode)?.[lang === 'zh' ? 'descZh' : 'desc']\n : (lang === 'zh' ? '选择创作模式开始' : 'Choose a creation mode')}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n <AnimatePresence mode=\"wait\">\n {/* ========== Mode Selection Hub ========== */}\n {!activeMode && (\n <motion.div\n key=\"hub\"\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className=\"p-5 space-y-3\"\n >\n {MODES.map((mode, idx) => {\n const Icon = mode.icon;\n return (\n <motion.button\n key={mode.id}\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: idx * 0.08 }}\n onClick={() => {\n if (mode.id === 'mv') {\n onOpenMV?.();\n onHaptic?.('selection');\n return;\n }\n setActiveMode(mode.id);\n onHaptic?.('selection');\n }}\n className=\"w-full flex items-center gap-4 p-4 rounded-xl bg-white/[0.03] border border-white/[0.06] hover:bg-white/[0.06] hover:border-white/[0.12] transition-all group text-left\"\n >\n <div className={clsx(\n 'w-12 h-12 rounded-xl bg-gradient-to-br flex items-center justify-center flex-shrink-0',\n mode.gradient\n )}>\n <Icon className=\"w-5 h-5 text-white\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-white/90 group-hover:text-white transition-colors\">\n {lang === 'zh' ? mode.labelZh : mode.label}\n </p>\n <p className=\"text-xs text-white/30 mt-0.5\">\n {lang === 'zh' ? mode.descZh : mode.desc}\n </p>\n </div>\n {mode.id === 'mv' ? (\n <ExternalLink className=\"w-4 h-4 text-cyan-400/40 group-hover:text-cyan-400/70 transition-colors flex-shrink-0\" />\n ) : (\n <ChevronRight className=\"w-4 h-4 text-white/20 group-hover:text-white/40 transition-colors flex-shrink-0\" />\n )}\n </motion.button>\n );\n })}\n\n {/* Stats row */}\n <div className=\"flex items-center justify-between mt-4 pt-4 border-t border-white/[0.04]\">\n <div className=\"flex items-center gap-1.5 text-white/20 text-xs\">\n <Music className=\"w-3.5 h-3.5\" />\n <span>{lang === 'zh' ? `${works.length} 首作品` : `${works.length} works`}</span>\n </div>\n <div className=\"flex items-center gap-1.5 text-white/20 text-xs\">\n <Sparkles className=\"w-3.5 h-3.5\" />\n <span>{lang === 'zh' ? 'AI驱动创作' : 'AI-powered creation'}</span>\n </div>\n </div>\n </motion.div>\n )}\n\n {/* ========== Quick Song Mode ========== */}\n {activeMode === 'quick' && (\n <motion.div\n key=\"quick\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5 space-y-5\"\n >\n {/* Theme picker */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '选择情绪主题' : 'Choose Mood'}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map(theme => {\n const Icon = theme.icon;\n const isActive = quickTheme === theme.id;\n const isLocked = theme.premium && !unlockedPremium.has(theme.id);\n return (\n <button\n key={theme.id}\n onClick={() => {\n if (isLocked) {\n if (user && starPower >= (theme.spCost || 200)) {\n handleUnlockTheme(theme.id, theme.spCost || 200);\n }\n return;\n }\n setQuickTheme(theme.id); onHaptic?.('selection');\n }}\n className={clsx(\n 'p-3 rounded-xl border transition-all text-center relative',\n isLocked\n ? 'bg-white/[0.01] border-white/[0.04] opacity-60'\n : isActive\n ? `bg-gradient-to-br ${theme.bg} border-white/15 shadow-lg`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n {isLocked && (\n <span className=\"absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded-full bg-yellow-500/20 text-yellow-300 border border-yellow-500/20 font-medium\">\n {theme.spCost}SP\n </span>\n )}\n <Icon className={clsx('w-5 h-5 mx-auto mb-1', isActive ? theme.color : isLocked ? 'text-white/15' : 'text-white/30')} />\n <p className={clsx('text-[10px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Quick prompt */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '灵感关键词(可选)' : 'Inspiration Keywords (optional)'}\n </p>\n <input\n type=\"text\"\n value={quickPrompt}\n onChange={e => setQuickPrompt(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleQuickCreate()}\n placeholder={lang === 'zh' ? '输入关键词,用逗号分隔...' : 'Enter keywords, comma separated...'}\n className=\"w-full bg-white/5 border border-white/10 rounded-lg py-2.5 px-3 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-purple-500/50\"\n />\n </div>\n\n {/* One-click create */}\n <motion.button\n onClick={handleQuickCreate}\n disabled={quickGenerating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-4 rounded-xl bg-gradient-to-r from-purple-600 via-pink-600 to-blue-600 text-white font-semibold flex items-center justify-center gap-3 shadow-lg shadow-purple-500/20 disabled:opacity-50 transition-opacity text-base\"\n >\n {quickComposing !== 'idle' && quickComposing !== 'done' ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {getProgressLabel(quickComposing)}\n </>\n ) : quickComposing === 'done' ? (\n <>\n <Check className=\"w-5 h-5 text-green-300\" />\n {lang === 'zh' ? '创作完成!' : 'Complete!'}\n </>\n ) : (\n <>\n <Sparkles className=\"w-5 h-5\" />\n {lang === 'zh' ? '一键创作' : 'Create Now'}\n </>\n )}\n </motion.button>\n\n {/* Generated lyrics preview */}\n <AnimatePresence>\n {quickLyrics && (\n <motion.div\n initial={{ opacity: 0, y: 15 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"rounded-xl border border-white/[0.08] bg-gradient-to-br from-purple-500/10 to-pink-500/10 p-4\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-white/40 font-medium\">{lang === 'zh' ? '生成的歌词' : 'Generated Lyrics'}</p>\n <button\n onClick={() => handleCopyLyrics(quickLyrics, 'quick')}\n className=\"flex items-center gap-1 px-2 py-1 rounded-lg bg-white/5 text-xs text-white/40 hover:text-white/70 transition-colors\"\n >\n {copied === 'quick' ? <Check className=\"w-3 h-3 text-green-400\" /> : <Copy className=\"w-3 h-3\" />}\n {copied === 'quick' ? (lang === 'zh' ? '已复制' : 'Copied') : (lang === 'zh' ? '复制' : 'Copy')}\n </button>\n </div>\n <div className=\"space-y-1.5\">\n {quickLyrics.map((line, i) => (\n <motion.p\n key={i}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.06 }}\n className=\"text-sm text-white/70 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n\n {/* ========== Master Mode ========== */}\n {activeMode === 'master' && (\n <motion.div\n key=\"master\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5 space-y-5\"\n >\n {/* Theme */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '情绪基调' : 'Emotional Base'}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map(theme => {\n const Icon = theme.icon;\n const isActive = masterTheme === theme.id;\n const isLocked = theme.premium && !unlockedPremium.has(theme.id);\n return (\n <button\n key={theme.id}\n onClick={() => {\n if (isLocked) {\n if (user && starPower >= (theme.spCost || 200)) handleUnlockTheme(theme.id, theme.spCost || 200);\n return;\n }\n setMasterTheme(theme.id); onHaptic?.('selection');\n }}\n className={clsx(\n 'p-2.5 rounded-xl border transition-all text-center relative',\n isLocked ? 'bg-white/[0.01] border-white/[0.04] opacity-60'\n : isActive ? `bg-gradient-to-br ${theme.bg} border-white/15`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n {isLocked && <span className=\"absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded-full bg-yellow-500/20 text-yellow-300 border border-yellow-500/20 font-medium\">{theme.spCost}SP</span>}\n <Icon className={clsx('w-4 h-4 mx-auto mb-0.5', isActive ? theme.color : isLocked ? 'text-white/15' : 'text-white/30')} />\n <p className={clsx('text-[9px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Keywords */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '创作关键词' : 'Keywords'} <span className=\"text-white/20\">({masterKeywords.length}/8)</span>\n </p>\n <div className=\"flex gap-2 mb-2\">\n <input\n type=\"text\"\n value={masterKwInput}\n onChange={e => setMasterKwInput(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && addMasterKeyword()}\n placeholder={lang === 'zh' ? '添加关键词...' : 'Add keyword...'}\n className=\"flex-1 bg-white/5 border border-white/10 rounded-lg py-2 px-3 text-sm text-white placeholder:text-white/20 focus:outline-none focus:border-purple-500/50\"\n />\n <button\n onClick={addMasterKeyword}\n disabled={!masterKwInput.trim() || masterKeywords.length >= 8}\n className=\"p-2 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors disabled:opacity-30\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n {masterKeywords.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {masterKeywords.map(kw => (\n <span key={kw} className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-indigo-500/10 border border-indigo-500/20 rounded-full text-xs text-indigo-300\">\n {kw}\n <button onClick={() => setMasterKeywords(p => p.filter(k => k !== kw))} className=\"text-indigo-400/60 hover:text-indigo-300\">\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Structure */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '歌曲结构' : 'Song Structure'}\n </p>\n <div className=\"grid grid-cols-2 gap-2\">\n {STRUCTURES.map(s => (\n <button\n key={s.id}\n onClick={() => setMasterStructure(s.id)}\n className={clsx(\n 'py-2 px-3 rounded-lg border text-xs transition-all',\n masterStructure === s.id\n ? 'bg-indigo-500/15 border-indigo-500/30 text-indigo-300'\n : 'bg-white/[0.02] border-white/[0.06] text-white/40 hover:bg-white/[0.05]'\n )}\n >\n {lang === 'zh' ? s.labelZh : s.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Instruments */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '乐器编排' : 'Instruments'}\n </p>\n <div className=\"grid grid-cols-3 gap-2\">\n {INSTRUMENTS.map(inst => (\n <button\n key={inst.id}\n onClick={() => toggleInstrument(inst.id)}\n className={clsx(\n 'py-2 px-3 rounded-lg border text-xs transition-all flex items-center gap-1.5',\n masterInstruments.includes(inst.id)\n ? 'bg-indigo-500/15 border-indigo-500/30 text-indigo-300'\n : 'bg-white/[0.02] border-white/[0.06] text-white/40 hover:bg-white/[0.05]'\n )}\n >\n <span>{inst.emoji}</span>\n <span>{lang === 'zh' ? inst.labelZh : inst.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Line Count + Tempo */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '歌词行数' : 'Lines'}\n </p>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => setMasterLineCount(Math.max(4, masterLineCount - 2))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n <span className=\"text-lg font-bold text-white font-mono flex-1 text-center\">{masterLineCount}</span>\n <button onClick={() => setMasterLineCount(Math.min(20, masterLineCount + 2))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-2\">\n {lang === 'zh' ? '速度 BPM' : 'Tempo BPM'}\n </p>\n <div className=\"flex items-center gap-2\">\n <button onClick={() => setMasterTempo(Math.max(60, masterTempo - 10))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n <span className=\"text-lg font-bold text-white font-mono flex-1 text-center\">{masterTempo}</span>\n <button onClick={() => setMasterTempo(Math.min(200, masterTempo + 10))}\n className=\"p-1.5 rounded-lg bg-white/5 border border-white/[0.08] text-white/60 hover:text-white transition-colors\">\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Create Button */}\n <motion.button\n onClick={handleMasterCreate}\n disabled={masterGenerating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-3.5 rounded-xl bg-gradient-to-r from-indigo-600 via-blue-600 to-purple-600 text-white font-semibold flex items-center justify-center gap-2 shadow-lg shadow-indigo-500/20 disabled:opacity-50\"\n >\n {masterComposing !== 'idle' && masterComposing !== 'done' ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {getProgressLabel(masterComposing)}\n </>\n ) : masterComposing === 'done' ? (\n <>\n <Check className=\"w-5 h-5 text-green-300\" />\n {lang === 'zh' ? '大师之作完成!' : 'Masterpiece Complete!'}\n </>\n ) : (\n <>\n <Wand2 className=\"w-5 h-5\" />\n {lang === 'zh' ? '开始创作' : 'Start Creating'}\n </>\n )}\n </motion.button>\n\n {/* Master lyrics preview */}\n <AnimatePresence>\n {masterLyrics && (\n <motion.div\n initial={{ opacity: 0, y: 15 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"rounded-xl border border-white/[0.08] bg-gradient-to-br from-indigo-500/10 to-blue-500/10 p-4\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-white/40\">{lang === 'zh' ? '大师之作' : 'Master Work'}</p>\n <button\n onClick={() => handleCopyLyrics(masterLyrics, 'master')}\n className=\"flex items-center gap-1 px-2 py-1 rounded-lg bg-white/5 text-xs text-white/40 hover:text-white/70 transition-colors\"\n >\n {copied === 'master' ? <Check className=\"w-3 h-3 text-green-400\" /> : <Copy className=\"w-3 h-3\" />}\n {copied === 'master' ? (lang === 'zh' ? '已复制' : 'Copied') : (lang === 'zh' ? '复制' : 'Copy')}\n </button>\n </div>\n <div className=\"space-y-1.5\">\n {masterLyrics.map((line, i) => (\n <motion.p\n key={i}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.05 }}\n className=\"text-sm text-white/70 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n\n {/* ========== Remix Mode ========== */}\n {activeMode === 'remix' && (\n <motion.div\n key=\"remix\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5 space-y-5\"\n >\n {/* Source track selector */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '选择原曲' : 'Select Source Track'}\n </p>\n <div className=\"space-y-2 max-h-48 overflow-y-auto\" style={{ scrollbarWidth: 'none' }}>\n {playlist.map((track, idx) => (\n <button\n key={track.id}\n onClick={() => { setRemixSourceTrack(idx); onHaptic?.('selection'); }}\n className={clsx(\n 'w-full flex items-center gap-3 p-3 rounded-xl border transition-all text-left',\n remixSourceTrack === idx\n ? 'bg-orange-500/10 border-orange-500/20'\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n <div className=\"w-10 h-10 rounded-lg overflow-hidden flex-shrink-0\">\n <img src={track.albumArt} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className={clsx('text-sm font-medium truncate', remixSourceTrack === idx ? 'text-orange-300' : 'text-white/70')}>\n {track.title}\n </p>\n <p className=\"text-xs text-white/30\">{track.artist}</p>\n </div>\n {remixSourceTrack === idx && (\n <div className=\"w-5 h-5 rounded-full bg-orange-500/30 border border-orange-500/50 flex items-center justify-center flex-shrink-0\">\n <Check className=\"w-3 h-3 text-orange-300\" />\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n\n {/* Target theme */}\n <div>\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? '改编风格' : 'Target Style'}\n </p>\n <div className=\"grid grid-cols-5 gap-2\">\n {THEMES.map(theme => {\n const Icon = theme.icon;\n const isActive = remixTargetTheme === theme.id;\n const isLocked = theme.premium && !unlockedPremium.has(theme.id);\n return (\n <button\n key={theme.id}\n onClick={() => {\n if (isLocked) {\n if (user && starPower >= (theme.spCost || 200)) handleUnlockTheme(theme.id, theme.spCost || 200);\n return;\n }\n setRemixTargetTheme(theme.id); onHaptic?.('selection');\n }}\n className={clsx(\n 'p-2.5 rounded-xl border transition-all text-center relative',\n isLocked ? 'bg-white/[0.01] border-white/[0.04] opacity-60'\n : isActive ? `bg-gradient-to-br ${theme.bg} border-white/15`\n : 'bg-white/[0.02] border-white/[0.06] hover:bg-white/[0.05]'\n )}\n >\n {isLocked && <span className=\"absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded-full bg-yellow-500/20 text-yellow-300 border border-yellow-500/20 font-medium\">{theme.spCost}SP</span>}\n <Icon className={clsx('w-4 h-4 mx-auto mb-0.5', isActive ? theme.color : isLocked ? 'text-white/15' : 'text-white/30')} />\n <p className={clsx('text-[9px]', isActive ? 'text-white/80' : 'text-white/30')}>\n {lang === 'zh' ? theme.labelZh : theme.label}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Remix Button */}\n <motion.button\n onClick={handleRemix}\n disabled={remixSourceTrack === null || remixGenerating}\n whileHover={{ scale: 1.01 }}\n whileTap={{ scale: 0.98 }}\n className=\"w-full py-3.5 rounded-xl bg-gradient-to-r from-orange-600 via-red-600 to-pink-600 text-white font-semibold flex items-center justify-center gap-2 shadow-lg shadow-orange-500/20 disabled:opacity-40\"\n >\n {remixComposing !== 'idle' && remixComposing !== 'done' ? (\n <>\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n {getProgressLabel(remixComposing)}\n </>\n ) : remixComposing === 'done' ? (\n <>\n <Check className=\"w-5 h-5 text-green-300\" />\n {lang === 'zh' ? '改编完成!' : 'Remix Complete!'}\n </>\n ) : (\n <>\n <Layers className=\"w-5 h-5\" />\n {lang === 'zh' ? '开始改编 (含音频重合成)' : 'Remix (with audio synthesis)'}\n </>\n )}\n </motion.button>\n\n {/* Remix result */}\n <AnimatePresence>\n {remixResult && (\n <motion.div\n initial={{ opacity: 0, y: 15 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"rounded-xl border border-white/[0.08] bg-gradient-to-br from-orange-500/10 to-red-500/10 p-4\"\n >\n <div className=\"flex items-center justify-between mb-3\">\n <p className=\"text-xs text-white/40\">{lang === 'zh' ? '改编歌词' : 'Remixed Lyrics'}</p>\n <button\n onClick={() => handleCopyLyrics(remixResult, 'remix')}\n className=\"flex items-center gap-1 px-2 py-1 rounded-lg bg-white/5 text-xs text-white/40 hover:text-white/70 transition-colors\"\n >\n {copied === 'remix' ? <Check className=\"w-3 h-3 text-green-400\" /> : <Copy className=\"w-3 h-3\" />}\n {copied === 'remix' ? (lang === 'zh' ? '已复制' : 'Copied') : (lang === 'zh' ? '复制' : 'Copy')}\n </button>\n </div>\n <div className=\"space-y-1.5\">\n {remixResult.map((line, i) => (\n <motion.p\n key={i}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ delay: i * 0.06 }}\n className=\"text-sm text-white/70 leading-relaxed\"\n >\n {line}\n </motion.p>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n\n {/* ========== My Works ========== */}\n {activeMode === 'works' && (\n <motion.div\n key=\"works\"\n initial={{ opacity: 0, x: 20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -20 }}\n className=\"p-5\"\n >\n {works.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 gap-4\">\n <div className=\"w-16 h-16 rounded-full bg-white/5 border border-white/10 flex items-center justify-center\">\n <Music className=\"w-7 h-7 text-white/20\" />\n </div>\n <p className=\"text-white/30 text-sm text-center\">\n {lang === 'zh' ? '还没有创作作品\\n去创作你的第一首歌吧!' : 'No works yet\\nCreate your first song!'}\n </p>\n <button\n onClick={() => setActiveMode('quick')}\n className=\"px-4 py-2 rounded-lg bg-purple-500/10 border border-purple-500/20 text-purple-300 text-sm hover:bg-purple-500/20 transition-colors\"\n >\n {lang === 'zh' ? '开始创作' : 'Start Creating'}\n </button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-white/40 font-medium uppercase tracking-wider mb-3\">\n {lang === 'zh' ? `${works.length} 首作品` : `${works.length} Works`}\n </p>\n {works.map((work, idx) => {\n const theme = THEMES.find(t => t.id === work.theme);\n const ThemeIcon = theme?.icon || Music;\n const modeInfo = MODES.find(m => m.id === work.mode);\n return (\n <motion.div\n key={work.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: idx * 0.05 }}\n className=\"rounded-xl border border-white/[0.06] bg-white/[0.02] p-4 group\"\n >\n <div className=\"flex items-start gap-3\">\n <div className={clsx(\n 'w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0 bg-gradient-to-br',\n theme?.bg || 'from-white/5 to-white/5'\n )}>\n <ThemeIcon className={clsx('w-5 h-5', theme?.color || 'text-white/30')} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <p className=\"text-sm font-medium text-white/80 truncate\">{work.title}</p>\n <span className=\"text-[9px] text-white/20 bg-white/5 px-1.5 py-0.5 rounded-full flex-shrink-0\">\n {modeInfo ? (lang === 'zh' ? modeInfo.labelZh : modeInfo.label) : work.mode}\n </span>\n </div>\n <p className=\"text-xs text-white/25 flex items-center gap-1\">\n <Clock className=\"w-3 h-3\" />\n {formatDate(work.createdAt)}\n </p>\n {/* Lyrics preview */}\n <p className=\"text-xs text-white/30 mt-2 line-clamp-2 italic\">\n \"{work.lyrics.slice(0, 2).join(' / ')}\"\n </p>\n </div>\n <div className=\"flex flex-col gap-1 md:opacity-0 md:group-hover:opacity-100 transition-opacity flex-shrink-0\">\n <button\n onClick={() => handleCopyLyrics(work.lyrics, work.id)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n title={lang === 'zh' ? '复制歌词' : 'Copy lyrics'}\n >\n {copied === work.id ? <Check className=\"w-3.5 h-3.5 text-green-400\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n onClick={() => deleteWork(work.id)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-red-400/60 hover:bg-red-500/5 transition-colors\"\n title={lang === 'zh' ? '删除' : 'Delete'}\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n {onShareWork && (\n <button\n onClick={() => onShareWork(work)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors\"\n title={lang === 'zh' ? '分享作品' : 'Share work'}\n >\n <Share2 className=\"w-3.5 h-3.5\" />\n </button>\n )}\n {onOpenMV && (\n <button\n onClick={() => onOpenMV(work.lyrics)}\n className=\"p-1.5 rounded-lg text-white/30 hover:text-cyan-400/60 hover:bg-cyan-500/5 transition-colors\"\n title={lang === 'zh' ? '从此作品创建MV' : 'Create MV from this work'}\n >\n <Film className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n </div>\n </motion.div>\n );\n })}\n </div>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n};","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport {\n X, Camera, Maximize2, Play, Pause,\n Layers, Minus, Plus,\n} from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { useI18n } from '@yyc3/music-hooks';\nimport type { Track } from '@yyc3/music-data';\n\n// ==========================================\n// MV Creator — Canvas-based Music Visualization\n// ==========================================\n// Renders animated visual themes synchronized to audio\n// energy and emotion, with lyrics overlay.\n\ntype MVTheme = 'starfield' | 'neonPulse' | 'aurora' | 'inkWash' | 'cyberCity';\n\ninterface MVCreatorProps {\n isOpen: boolean;\n onClose: () => void;\n track: Track;\n isPlaying: boolean;\n audioEnergy: number;\n frequencyData: Uint8Array;\n currentTime: number;\n emotion: string;\n customLyrics?: string[] | null;\n onHaptic?: (pattern: string) => void;\n}\n\nconst MV_THEMES: Array<{\n id: MVTheme;\n labelZh: string;\n labelEn: string;\n emoji: string;\n colors: [string, string, string];\n}> = [\n { id: 'starfield', labelZh: '星空漫游', labelEn: 'Starfield', emoji: '🌌', colors: ['#667eea', '#764ba2', '#fff'] },\n { id: 'neonPulse', labelZh: '霓虹脉冲', labelEn: 'Neon Pulse', emoji: '💜', colors: ['#ff006e', '#8338ec', '#3a86ff'] },\n { id: 'aurora', labelZh: '极光幻境', labelEn: 'Aurora', emoji: '🌈', colors: ['#00f5d4', '#7209b7', '#f72585'] },\n { id: 'inkWash', labelZh: '水墨流韵', labelEn: 'Ink Wash', emoji: '🏔️', colors: ['#1a1a2e', '#e0e0e0', '#555'] },\n { id: 'cyberCity', labelZh: '赛博都市', labelEn: 'Cyber City', emoji: '🌃', colors: ['#0ff', '#f0f', '#ff0'] },\n];\n\n// Particle system for various themes\ninterface Particle {\n x: number;\n y: number;\n z: number;\n vx: number;\n vy: number;\n size: number;\n alpha: number;\n color: string;\n life: number;\n maxLife: number;\n}\n\nfunction createParticle(w: number, h: number, theme: MVTheme): Particle {\n const colors = MV_THEMES.find(t => t.id === theme)?.colors || ['#fff', '#aaa', '#666'];\n const color = colors[Math.floor(Math.random() * colors.length)];\n\n switch (theme) {\n case 'starfield':\n return {\n x: Math.random() * w, y: Math.random() * h, z: Math.random() * 3 + 0.5,\n vx: 0, vy: Math.random() * 0.3 + 0.1,\n size: Math.random() * 2.5 + 0.5,\n alpha: Math.random() * 0.8 + 0.2, color,\n life: 0, maxLife: 300 + Math.random() * 200,\n };\n case 'neonPulse':\n return {\n x: w / 2 + (Math.random() - 0.5) * w * 0.8,\n y: h / 2 + (Math.random() - 0.5) * h * 0.8,\n z: 1,\n vx: (Math.random() - 0.5) * 2, vy: (Math.random() - 0.5) * 2,\n size: Math.random() * 4 + 1,\n alpha: Math.random() * 0.6 + 0.2, color,\n life: 0, maxLife: 150 + Math.random() * 100,\n };\n case 'aurora':\n return {\n x: Math.random() * w, y: h * 0.2 + Math.random() * h * 0.3,\n z: 1, vx: Math.random() * 0.5 + 0.2, vy: (Math.random() - 0.5) * 0.3,\n size: Math.random() * 40 + 20,\n alpha: Math.random() * 0.15 + 0.05, color,\n life: 0, maxLife: 400 + Math.random() * 200,\n };\n case 'inkWash':\n return {\n x: Math.random() * w, y: Math.random() * h,\n z: 1, vx: (Math.random() - 0.5) * 0.5, vy: -Math.random() * 0.8 - 0.2,\n size: Math.random() * 30 + 5,\n alpha: Math.random() * 0.08 + 0.02, color,\n life: 0, maxLife: 300 + Math.random() * 200,\n };\n case 'cyberCity':\n default:\n return {\n x: Math.random() * w, y: Math.random() * h,\n z: 1, vx: 0, vy: Math.random() * 2 + 1,\n size: Math.random() * 2 + 0.5,\n alpha: Math.random() * 0.7 + 0.3, color,\n life: 0, maxLife: 200 + Math.random() * 100,\n };\n }\n}\n\nexport const MVCreator: React.FC<MVCreatorProps> = ({\n isOpen,\n onClose,\n track,\n isPlaying,\n audioEnergy,\n frequencyData,\n currentTime,\n emotion,\n customLyrics,\n onHaptic,\n}) => {\n const { lang } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animFrameRef = useRef<number>(0);\n const particlesRef = useRef<Particle[]>([]);\n const timeRef = useRef(0);\n\n const [mvTheme, setMvTheme] = useState<MVTheme>('starfield');\n const [showLyrics, setShowLyrics] = useState(true);\n const [intensity, setIntensity] = useState(0.7);\n\n // Build effective lyrics: use customLyrics (from \"Create MV from this work\") or track lyrics\n const effectiveLyrics = customLyrics && customLyrics.length > 0\n ? customLyrics.map((text, i) => ({\n time: i * (track.duration > 0 ? track.duration / customLyrics.length : 10),\n text,\n translation: undefined as string | undefined,\n }))\n : track.lyrics;\n\n // Current lyric line\n const currentLyric = [...effectiveLyrics].reverse().find(l => l.time <= currentTime);\n const nextLyric = effectiveLyrics.find(l => l.time > currentTime);\n\n // ========== Canvas Rendering Loop ==========\n const render = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const w = canvas.width;\n const h = canvas.height;\n timeRef.current += 1;\n const t = timeRef.current;\n const energy = audioEnergy * intensity;\n const themeColors = MV_THEMES.find(th => th.id === mvTheme)?.colors || ['#fff', '#aaa', '#666'];\n\n // ---- Background ----\n switch (mvTheme) {\n case 'starfield': {\n ctx.fillStyle = '#050816';\n ctx.fillRect(0, 0, w, h);\n // Deep space glow\n const g = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, w * 0.5);\n g.addColorStop(0, `rgba(102, 126, 234, ${0.03 + energy * 0.05})`);\n g.addColorStop(1, 'transparent');\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, w, h);\n break;\n }\n case 'neonPulse': {\n ctx.fillStyle = `rgba(10, 5, 30, ${0.15 + (1 - energy) * 0.1})`;\n ctx.fillRect(0, 0, w, h);\n // Pulsating center\n const ng = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, 150 + energy * 200);\n ng.addColorStop(0, `rgba(131, 56, 236, ${0.1 + energy * 0.15})`);\n ng.addColorStop(0.5, `rgba(255, 0, 110, ${0.05 + energy * 0.08})`);\n ng.addColorStop(1, 'transparent');\n ctx.fillStyle = ng;\n ctx.fillRect(0, 0, w, h);\n break;\n }\n case 'aurora': {\n ctx.fillStyle = 'rgba(5, 5, 20, 0.08)';\n ctx.fillRect(0, 0, w, h);\n break;\n }\n case 'inkWash': {\n ctx.fillStyle = `rgba(15, 15, 25, ${0.05 + (1 - energy) * 0.03})`;\n ctx.fillRect(0, 0, w, h);\n // Mountain silhouette\n ctx.beginPath();\n ctx.moveTo(0, h);\n for (let x = 0; x <= w; x += 3) {\n const y = h - 80 - Math.sin(x * 0.008 + 1) * 60 - Math.sin(x * 0.015) * 30 - Math.cos(x * 0.003 + 2) * 40;\n ctx.lineTo(x, y);\n }\n ctx.lineTo(w, h);\n ctx.fillStyle = 'rgba(30, 30, 50, 0.06)';\n ctx.fill();\n break;\n }\n case 'cyberCity': {\n ctx.fillStyle = 'rgba(5, 0, 15, 0.12)';\n ctx.fillRect(0, 0, w, h);\n // Grid floor\n ctx.strokeStyle = `rgba(0, 255, 255, ${0.04 + energy * 0.06})`;\n ctx.lineWidth = 0.5;\n const gridY = h * 0.7;\n for (let i = 0; i < 20; i++) {\n const y = gridY + i * 12;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(w, y);\n ctx.stroke();\n }\n for (let i = 0; i < 15; i++) {\n const x = w / 2 + (i - 7) * (40 + i * 5);\n ctx.beginPath();\n ctx.moveTo(w / 2, gridY);\n ctx.lineTo(x, h);\n ctx.stroke();\n }\n break;\n }\n }\n\n // ---- Particles ----\n // Add new particles\n const targetCount = Math.floor(50 + energy * 80 * intensity);\n while (particlesRef.current.length < targetCount) {\n particlesRef.current.push(createParticle(w, h, mvTheme));\n }\n\n // Update and draw particles\n const alive: Particle[] = [];\n for (const p of particlesRef.current) {\n p.life += 1;\n if (p.life > p.maxLife) continue;\n\n p.x += p.vx + (mvTheme === 'starfield' ? Math.sin(t * 0.01 + p.y * 0.01) * 0.2 : 0);\n p.y += p.vy * (1 + energy * 0.5);\n\n // Wrap around\n if (p.x < -10) p.x = w + 10;\n if (p.x > w + 10) p.x = -10;\n if (p.y < -10) p.y = h + 10;\n if (p.y > h + 10) p.y = -10;\n\n const fadeIn = Math.min(p.life / 20, 1);\n const fadeOut = Math.max(1 - (p.life - p.maxLife + 30) / 30, 0);\n const alpha = p.alpha * fadeIn * fadeOut * (0.5 + energy * 0.5);\n\n ctx.beginPath();\n if (mvTheme === 'aurora') {\n // Soft ellipses for aurora\n ctx.ellipse(p.x, p.y, p.size * (1 + energy), p.size * 0.3, 0, 0, Math.PI * 2);\n ctx.fillStyle = `${p.color}${Math.floor(alpha * 255).toString(16).padStart(2, '0')}`;\n ctx.fill();\n } else if (mvTheme === 'inkWash') {\n // Soft circles for ink\n const ig = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.size);\n ig.addColorStop(0, `rgba(200, 200, 210, ${alpha})`);\n ig.addColorStop(1, 'transparent');\n ctx.fillStyle = ig;\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n } else if (mvTheme === 'cyberCity') {\n // Vertical rain lines\n ctx.strokeStyle = `${p.color}${Math.floor(alpha * 200).toString(16).padStart(2, '0')}`;\n ctx.lineWidth = p.size * 0.5;\n ctx.moveTo(p.x, p.y);\n ctx.lineTo(p.x, p.y - 8 - energy * 12);\n ctx.stroke();\n } else {\n ctx.arc(p.x, p.y, p.size * (mvTheme === 'neonPulse' ? (1 + energy * 0.5) : 1), 0, Math.PI * 2);\n ctx.fillStyle = `${p.color}${Math.floor(alpha * 255).toString(16).padStart(2, '0')}`;\n ctx.fill();\n\n // Glow for neon\n if (mvTheme === 'neonPulse' && p.size > 2) {\n const glow = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.size * 4);\n glow.addColorStop(0, `${p.color}${Math.floor(alpha * 80).toString(16).padStart(2, '0')}`);\n glow.addColorStop(1, 'transparent');\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(p.x, p.y, p.size * 4, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n alive.push(p);\n }\n particlesRef.current = alive;\n\n // ---- Frequency Spectrum ----\n if (frequencyData.length > 0 && isPlaying) {\n const barCount = Math.min(64, frequencyData.length);\n const barWidth = w / barCount;\n const maxBarH = h * 0.25;\n\n ctx.save();\n if (mvTheme === 'inkWash') {\n ctx.globalAlpha = 0.15;\n }\n\n for (let i = 0; i < barCount; i++) {\n const value = frequencyData[Math.floor(i * frequencyData.length / barCount)] / 255;\n const barH = value * maxBarH * intensity;\n const x = i * barWidth;\n\n const barGrad = ctx.createLinearGradient(x, h, x, h - barH);\n\n if (mvTheme === 'neonPulse') {\n barGrad.addColorStop(0, `rgba(255, 0, 110, ${0.3 + value * 0.4})`);\n barGrad.addColorStop(1, `rgba(131, 56, 236, ${0.1 + value * 0.2})`);\n } else if (mvTheme === 'aurora') {\n barGrad.addColorStop(0, `rgba(0, 245, 212, ${0.2 + value * 0.3})`);\n barGrad.addColorStop(1, `rgba(114, 9, 183, ${0.1 + value * 0.15})`);\n } else if (mvTheme === 'cyberCity') {\n barGrad.addColorStop(0, `rgba(0, 255, 255, ${0.3 + value * 0.5})`);\n barGrad.addColorStop(1, `rgba(255, 0, 255, ${0.1 + value * 0.2})`);\n } else if (mvTheme === 'inkWash') {\n barGrad.addColorStop(0, `rgba(180, 180, 190, ${0.3 + value * 0.4})`);\n barGrad.addColorStop(1, 'transparent');\n } else {\n barGrad.addColorStop(0, `rgba(102, 126, 234, ${0.2 + value * 0.4})`);\n barGrad.addColorStop(1, `rgba(118, 75, 162, ${0.05 + value * 0.1})`);\n }\n\n ctx.fillStyle = barGrad;\n ctx.fillRect(x, h - barH, barWidth - 1, barH);\n }\n ctx.restore();\n }\n\n // ---- Center Ring (energy reactive) ----\n if (mvTheme !== 'inkWash') {\n const ringRadius = 60 + energy * 40;\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, ringRadius, 0, Math.PI * 2);\n ctx.strokeStyle = `${themeColors[0]}${Math.floor((0.1 + energy * 0.2) * 255).toString(16).padStart(2, '0')}`;\n ctx.lineWidth = 1.5 + energy * 2;\n ctx.stroke();\n\n // Second ring\n ctx.beginPath();\n ctx.arc(w / 2, h / 2, ringRadius * 1.3 + Math.sin(t * 0.03) * 10, 0, Math.PI * 2);\n ctx.strokeStyle = `${themeColors[1]}${Math.floor((0.05 + energy * 0.1) * 255).toString(16).padStart(2, '0')}`;\n ctx.lineWidth = 0.8;\n ctx.stroke();\n }\n\n // ---- Lyrics Overlay ----\n if (showLyrics && currentLyric) {\n ctx.save();\n ctx.textAlign = 'center';\n\n // Main lyric\n ctx.font = `700 ${mvTheme === 'inkWash' ? '20' : '22'}px system-ui, -apple-system, sans-serif`;\n const lyricY = h * 0.78;\n\n // Text shadow/glow\n if (mvTheme !== 'inkWash') {\n ctx.shadowColor = themeColors[0];\n ctx.shadowBlur = 15 + energy * 20;\n }\n ctx.fillStyle = `rgba(255, 255, 255, ${0.8 + energy * 0.2})`;\n\n // Word wrap for long lyrics\n const maxWidth = w * 0.85;\n const text = currentLyric.text;\n if (ctx.measureText(text).width > maxWidth) {\n const words = text.split(' ');\n let line = '';\n let lineY = lyricY;\n for (const word of words) {\n const test = line ? `${line} ${word}` : word;\n if (ctx.measureText(test).width > maxWidth) {\n ctx.fillText(line, w / 2, lineY);\n line = word;\n lineY += 30;\n } else {\n line = test;\n }\n }\n ctx.fillText(line, w / 2, lineY);\n } else {\n ctx.fillText(text, w / 2, lyricY);\n }\n\n // Translation\n ctx.shadowBlur = 0;\n if (currentLyric.translation) {\n ctx.font = '400 13px system-ui, -apple-system, sans-serif';\n ctx.fillStyle = 'rgba(255, 255, 255, 0.4)';\n ctx.fillText(currentLyric.translation, w / 2, lyricY + 28);\n }\n\n ctx.restore();\n }\n\n // ---- Track Info Overlay ----\n ctx.save();\n ctx.textAlign = 'left';\n ctx.fillStyle = 'rgba(255, 255, 255, 0.3)';\n ctx.font = '500 11px system-ui, -apple-system, sans-serif';\n ctx.fillText(track.title, 20, 28);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.15)';\n ctx.font = '400 10px system-ui, -apple-system, sans-serif';\n ctx.fillText(track.artist, 20, 44);\n\n // Time\n ctx.textAlign = 'right';\n const mins = Math.floor(currentTime / 60);\n const secs = Math.floor(currentTime % 60);\n ctx.fillStyle = 'rgba(255, 255, 255, 0.2)';\n ctx.font = '400 10px monospace';\n ctx.fillText(`${mins}:${secs.toString().padStart(2, '0')}`, w - 20, 28);\n ctx.restore();\n\n // ---- Progress bar ----\n const progress = track.duration > 0 ? currentTime / track.duration : 0;\n ctx.fillStyle = 'rgba(255, 255, 255, 0.06)';\n ctx.fillRect(0, h - 3, w, 3);\n const pGrad = ctx.createLinearGradient(0, 0, w * progress, 0);\n pGrad.addColorStop(0, themeColors[0]);\n pGrad.addColorStop(1, themeColors[1]);\n ctx.fillStyle = pGrad;\n ctx.fillRect(0, h - 3, w * progress, 3);\n\n animFrameRef.current = requestAnimationFrame(render);\n }, [mvTheme, audioEnergy, frequencyData, isPlaying, currentTime, showLyrics, intensity, track, currentLyric, emotion, effectiveLyrics]);\n\n // Start/stop animation loop\n useEffect(() => {\n if (isOpen) {\n // Reset particles when theme changes\n particlesRef.current = [];\n timeRef.current = 0;\n\n // Set canvas size\n const canvas = canvasRef.current;\n if (canvas) {\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width * (window.devicePixelRatio > 1 ? 2 : 1);\n canvas.height = rect.height * (window.devicePixelRatio > 1 ? 2 : 1);\n }\n\n animFrameRef.current = requestAnimationFrame(render);\n }\n\n return () => {\n if (animFrameRef.current) {\n cancelAnimationFrame(animFrameRef.current);\n }\n };\n }, [isOpen, render]);\n\n // ========== Screenshot ==========\n const handleScreenshot = useCallback(() => {\n if (!canvasRef.current) return;\n const link = document.createElement('a');\n link.download = `d-music-mv-${track.title.replace(/\\s+/g, '-').toLowerCase()}.png`;\n link.href = canvasRef.current.toDataURL('image/png');\n link.click();\n onHaptic?.('success');\n }, [track.title, onHaptic]);\n\n // ========== Fullscreen ==========\n const handleFullscreen = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n canvas.requestFullscreen?.().catch(() => {});\n }\n onHaptic?.('medium');\n }, [onHaptic]);\n\n return (\n <AnimatePresence>\n {isOpen && (\n <>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-[62] bg-black/80 backdrop-blur-xl\"\n onClick={onClose}\n />\n\n <motion.div\n initial={{ opacity: 0, scale: 0.92 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.92 }}\n transition={{ type: 'spring', damping: 25, stiffness: 280 }}\n className=\"fixed z-[63] inset-4 md:inset-auto md:left-1/2 md:top-1/2 md:-translate-x-1/2 md:-translate-y-1/2 md:w-[90vw] md:max-w-3xl md:max-h-[88vh] bg-[#080C28]/98 backdrop-blur-2xl border border-white/10 rounded-2xl flex flex-col shadow-2xl overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-3 border-b border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-tr from-cyan-500/20 to-purple-500/20 border border-white/10 flex items-center justify-center\">\n <Layers className=\"w-4 h-4 text-cyan-400\" />\n </div>\n <div>\n <h3 className=\"text-white font-semibold text-sm leading-tight flex items-center gap-1.5\">\n {lang === 'zh' ? 'MV 创作' : 'MV Creator'}\n {customLyrics && customLyrics.length > 0 && (\n <span className=\"text-[9px] font-normal px-1.5 py-0.5 rounded-full bg-cyan-500/15 border border-cyan-500/25 text-cyan-300\">\n {lang === 'zh' ? '作品歌词' : 'Work Lyrics'}\n </span>\n )}\n </h3>\n <p className=\"text-white/30 text-[10px]\">\n {track.title} — {track.artist}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Status */}\n <div className={clsx(\n 'flex items-center gap-1.5 px-2 py-1 rounded-full text-[10px]',\n isPlaying ? 'bg-green-500/10 text-green-400' : 'bg-white/5 text-white/30'\n )}>\n {isPlaying ? <Play className=\"w-3 h-3\" /> : <Pause className=\"w-3 h-3\" />}\n {isPlaying ? (lang === 'zh' ? '播放中' : 'Playing') : (lang === 'zh' ? '已暂停' : 'Paused')}\n </div>\n\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg text-white/40 hover:text-white/70 hover:bg-white/5 transition-colors\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Canvas */}\n <div className=\"flex-1 relative min-h-0 bg-black\">\n <canvas\n ref={canvasRef}\n className=\"w-full h-full\"\n style={{ display: 'block' }}\n />\n\n {/* Overlay controls */}\n <div className=\"absolute bottom-3 right-3 flex gap-1.5\">\n <button\n onClick={handleScreenshot}\n className=\"p-2 rounded-lg bg-black/50 backdrop-blur-sm border border-white/10 text-white/50 hover:text-white hover:bg-black/70 transition-colors\"\n title={lang === 'zh' ? '截图' : 'Screenshot'}\n >\n <Camera className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleFullscreen}\n className=\"p-2 rounded-lg bg-black/50 backdrop-blur-sm border border-white/10 text-white/50 hover:text-white hover:bg-black/70 transition-colors\"\n title={lang === 'zh' ? '全屏' : 'Fullscreen'}\n >\n <Maximize2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Controls Bar */}\n <div className=\"px-5 py-3 border-t border-white/[0.06] flex-shrink-0\">\n <div className=\"flex items-center gap-4 flex-wrap\">\n {/* Theme selector */}\n <div className=\"flex items-center gap-1.5\">\n {MV_THEMES.map(theme => (\n <button\n key={theme.id}\n onClick={() => {\n setMvTheme(theme.id);\n particlesRef.current = [];\n onHaptic?.('selection');\n }}\n className={clsx(\n 'px-2.5 py-1.5 rounded-lg border text-[10px] transition-all flex items-center gap-1',\n mvTheme === theme.id\n ? 'bg-white/10 border-white/20 text-white'\n : 'bg-white/[0.02] border-white/[0.06] text-white/30 hover:bg-white/[0.05] hover:text-white/50'\n )}\n >\n <span>{theme.emoji}</span>\n <span className=\"hidden sm:inline\">{lang === 'zh' ? theme.labelZh : theme.labelEn}</span>\n </button>\n ))}\n </div>\n\n <div className=\"flex-1\" />\n\n {/* Lyrics toggle */}\n <button\n onClick={() => setShowLyrics(p => !p)}\n className={clsx(\n 'px-2.5 py-1.5 rounded-lg border text-[10px] transition-all',\n showLyrics\n ? 'bg-purple-500/15 border-purple-500/30 text-purple-300'\n : 'bg-white/[0.02] border-white/[0.06] text-white/30'\n )}\n >\n {lang === 'zh' ? '歌词' : 'Lyrics'}\n </button>\n\n {/* Intensity */}\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => setIntensity(v => Math.max(0.2, v - 0.2))}\n className=\"p-1 rounded text-white/30 hover:text-white/60 transition-colors\"\n >\n <Minus className=\"w-3 h-3\" />\n </button>\n <div className=\"w-16 h-1.5 rounded-full bg-white/10 overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-gradient-to-r from-cyan-500 to-purple-500 transition-all\"\n style={{ width: `${intensity * 100}%` }}\n />\n </div>\n <button\n onClick={() => setIntensity(v => Math.min(1, v + 0.2))}\n className=\"p-1 rounded text-white/30 hover:text-white/60 transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n );\n};\n"],"names":["VOICE_COMMANDS_ZH","VOICE_COMMANDS_EN","AIAssistant","activeTips","onDismissTip","onExecuteAction","isListening","onToggleListening","voiceSupported","voiceFeedback","voiceHistory","sessionInsight","isPlaying","audioEnergy","externalExpanded","onExternalExpandedChange","t","lang","useI18n","isExpanded","setIsExpanded","useState","showCommands","setShowCommands","tipContainerRef","useRef","voiceCommands","useEffect","handleSetExpanded","val","CATEGORY_COLORS","jsxs","Fragment","jsx","AnimatePresence","tip","motion","clsx","X","i","Mic","BrainCircuit","ChevronDown","Clock","MicOff","vc","vh","MessageSquare","THEMES","Smile","Frown","Zap","Cloud","Heart","AILyricsGenerator","isOpen","onClose","onCreateTrack","selectedTheme","setSelectedTheme","keywords","setKeywords","keywordInput","setKeywordInput","lineCount","setLineCount","generating","setGenerating","generatedLyrics","setGeneratedLyrics","copied","setCopied","generationCount","setGenerationCount","trackCreated","setTrackCreated","compositionStage","setCompositionStage","composer","useAudioComposer","addKeyword","useCallback","trimmed","prev","removeKeyword","kw","k","handleGenerate","result","apiFetch","err","handleCopy","handleCreateTrack","compResult","audioBlobUrl","currentTheme","Wand2","theme","Icon","isActive","e","Plus","Minus","Loader2","Sparkles","RefreshCw","Check","Copy","Volume2","Music","line","MODES","Settings2","Layers","FolderOpen","Film","STRUCTURES","INSTRUMENTS","CreationStudio","playlist","currentTrackIndex","onHaptic","onShareWork","onOpenMV","user","starPower","onStarPowerUpdate","activeMode","setActiveMode","unlockedPremium","setUnlockedPremium","saved","data","parsed","tid","s","handleUnlockTheme","themeId","cost","updated","quickTheme","setQuickTheme","quickPrompt","setQuickPrompt","quickGenerating","setQuickGenerating","quickLyrics","setQuickLyrics","quickComposing","setQuickComposing","masterTheme","setMasterTheme","masterKeywords","setMasterKeywords","masterKwInput","setMasterKwInput","masterLineCount","setMasterLineCount","masterStructure","setMasterStructure","masterInstruments","setMasterInstruments","masterTempo","setMasterTempo","masterGenerating","setMasterGenerating","masterLyrics","setMasterLyrics","masterComposing","setMasterComposing","remixSourceTrack","setRemixSourceTrack","remixTargetTheme","setRemixTargetTheme","remixGenerating","setRemixGenerating","remixResult","setRemixResult","remixComposing","setRemixComposing","works","setWorks","stored","saveWork","work","deleteWork","id","w","handleQuickCreate","lyricsResult","handleMasterCreate","handleRemix","sourceTrack","sourceWords","l","workTitle","handleCopyLyrics","lyrics","addMasterKeyword","toggleInstrument","formatDate","ts","d","getProgressLabel","stage","ArrowLeft","m","mode","idx","ExternalLink","ChevronRight","isLocked","p","inst","track","ThemeIcon","modeInfo","Trash2","Share2","MV_THEMES","createParticle","h","colors","color","MVCreator","frequencyData","currentTime","emotion","customLyrics","canvasRef","animFrameRef","particlesRef","timeRef","mvTheme","setMvTheme","showLyrics","setShowLyrics","intensity","setIntensity","effectiveLyrics","text","currentLyric","render","canvas","ctx","energy","themeColors","th","g","ng","x","y","gridY","targetCount","alive","fadeIn","fadeOut","alpha","ig","glow","barCount","barWidth","maxBarH","value","barH","barGrad","ringRadius","lyricY","maxWidth","words","lineY","word","test","mins","secs","progress","pGrad","rect","handleScreenshot","link","handleFullscreen","Play","Pause","Camera","Maximize2","v"],"mappings":"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"}