feat: P0e 模型选择器升级 — 卡片式下拉

- ModelSelector 组件:标签/提供商/描述/选中状态
- 替换 sandbox page + workshop page 原生 select
- 模型数据增加 provider/desc 字段
This commit is contained in:
yuzhiran-dev
2026-05-18 10:39:32 +08:00
parent 0fdad71c57
commit f2a6bb93f9
4 changed files with 58 additions and 13 deletions
+2 -7
View File
@@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation';
import { useAuth } from '@/lib/auth-context';
import { apiFetch, getToken } from '@/lib/auth';
import { AVAILABLE_MODELS, DEFAULT_MODEL } from '@/lib/models';
import { ModelSelector } from '@/components/ui/model-selector';
const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000/api/v1';
@@ -119,13 +120,7 @@ export default function PromptWorkshopPage() {
<div className="bg-card rounded-2xl border border-border p-6">
<div className="flex items-center justify-between mb-4">
<h3 className="font-semibold text-foreground"></h3>
<select
value={model}
onChange={e => setModel(e.target.value)}
className="px-3 py-1.5 border border-border rounded-lg text-sm bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring"
>
{AVAILABLE_MODELS.map(m => <option key={m.id} value={m.id}>{m.label}</option>)}
</select>
<ModelSelector value={model} onChange={setModel} className="w-48" />
</div>
<textarea
+2 -4
View File
@@ -5,6 +5,7 @@ import Link from 'next/link';
import { useAuth } from '@/lib/auth-context';
import { getToken, apiFetch } from '@/lib/auth';
import { AVAILABLE_MODELS, DEFAULT_MODEL } from '@/lib/models';
import { ModelSelector } from '@/components/ui/model-selector';
import { useT } from '@/i18n';
const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000/api/v1';
@@ -254,10 +255,7 @@ export default function SandboxPage() {
</div>
</div>
<div className="flex items-center gap-3">
<select value={model} onChange={e => setModel(e.target.value)}
className="px-3 py-1.5 border border-border rounded-lg text-sm bg-background focus:outline-none focus:border-brand-400">
{AVAILABLE_MODELS.map(m => <option key={m.id} value={m.id}>{m.label}</option>)}
</select>
<ModelSelector value={model} onChange={setModel} className="w-48" />
{!isLoggedIn && (
<Link href="/auth"
className="px-4 py-1.5 text-sm font-medium text-brand-600 border border-brand-200 rounded-lg hover:bg-brand-50">