\n {mode === \"video\" ? (\n /* Video URL Input */\n
\n setUrl(e.target.value)}\n placeholder=\"粘贴视频链接... (B站、YouTube、抖音、小红书等)\"\n className=\"flex-1 px-4 py-3 rounded-xl bg-[var(--bg-primary)] border border-[var(--border)] focus:outline-none focus:ring-2 focus:ring-[var(--accent)]\"\n onKeyDown={(e) => e.key === \"Enter\" && handleVideoSubmit()} />\n {loading ? (\n 取消 \n ) : (\n \n 生成笔记\n \n )}\n
\n ) : (\n /* Recording Upload */\n <>\n
{ e.preventDefault(); setDragOver(true); }}\n onDragLeave={() => setDragOver(false)}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}>\n
e.target.files?.[0] && setUploadFile(e.target.files[0])} />\n {uploadFile ? (\n
\n
📎 {uploadFile.name}
\n
\n {(uploadFile.size / 1024 / 1024).toFixed(1)} MB | 点击更换文件\n
\n
\n ) : (\n
\n
🎙️ 拖放录音/视频文件到这里
\n
\n 支持 MP4, MP3, WAV, M4A, FLAC, MKV, AVI, MOV, OGG, AAC\n
\n
\n )}\n
\n\n {/* Scene Selection */}\n
\n
场景类型: \n
\n {SCENES.map((s) => (\n setScene(s.name)}\n className={`px-3 py-2 rounded-lg text-sm transition ${scene === s.name ? \"bg-[var(--accent)] text-white\" : \"bg-[var(--bg-primary)] border border-[var(--border)] hover:border-[var(--accent)]\"}`}>\n {s.icon} {s.label}\n ({s.desc}) \n \n ))}\n
\n
\n\n {/* Context */}\n
\n 内容描述 (可选): \n setContext(e.target.value)}\n placeholder=\"例如: AI开源项目圆桌讨论, 数学课第3讲, 产品周会...\"\n className=\"w-full px-4 py-2.5 rounded-xl bg-[var(--bg-primary)] border border-[var(--border)] focus:outline-none focus:ring-2 focus:ring-[var(--accent)] text-sm\" />\n
\n\n {/* Advanced Options */}\n
\n
\n 说话人数量: \n setNumSpeakers(e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder=\"自动检测\"\n className=\"w-full px-3 py-2 rounded-lg bg-[var(--bg-primary)] border border-[var(--border)] text-sm\" />\n
\n
\n 降噪强度: \n setDenoiseLevel(parseInt(e.target.value))}\n className=\"w-full px-3 py-2 rounded-lg bg-[var(--bg-primary)] border border-[var(--border)] text-sm\">\n 无降噪 \n 轻度 (推荐) \n 中度 \n 重度 (嘈杂环境) \n \n
\n
\n
输出格式: \n
\n {[\"markdown\", \"srt\", \"vtt\", \"json\"].map(fmt => (\n {\n setOutputFormats(prev => prev.includes(fmt) ? prev.filter(f => f !== fmt) : [...prev, fmt]);\n }}\n className={`px-2 py-1 rounded text-xs ${outputFormats.includes(fmt) ? \"bg-[var(--accent)] text-white\" : \"bg-[var(--bg-primary)] border border-[var(--border)]\"}`}>\n {fmt}\n \n ))}\n
\n
\n
\n\n
\n {loading ? \"处理中...\" : \"开始处理\"}\n \n >\n )}\n\n {/* Template Selection */}\n
\n
\n {currentTemplates.map((t) => (\n setTemplate(t.name)}\n className={`px-3 py-1.5 rounded-lg text-sm transition ${template === t.name ? \"bg-[var(--accent)] text-white\" : \"bg-[var(--bg-primary)] border border-[var(--border)] hover:border-[var(--accent)]\"}`}>\n {t.icon} {t.label}\n \n ))}\n
\n
\n\n {template === \"custom\" && (\n
\n\n {/* Error */}\n {error && (\n \n
\n
历史记录 ({history.length}) \n {history.length > 0 && (\n { localStorage.removeItem(HISTORY_KEY); setHistory([]); }}\n className=\"text-xs text-red-500 hover:underline\">清空 \n )}\n \n {history.length === 0 ? (\n
暂无记录
\n ) : (\n
\n {history.map((item) => (\n
{ setResult(item); setTemplate(item.template); setShowHistory(false); }}\n className=\"w-full text-left px-6 py-4 hover:bg-[var(--bg-primary)] transition\">\n \n {item.title} \n \n {new Date(item.timestamp).toLocaleDateString(\"zh-CN\", { month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" })}\n \n
\n {item.contentPreview}
\n \n ))}\n
\n )}\n
\n )}\n\n {/* Features */}\n {!result && !loading && !showHistory && (\n