"use client"; import { motion } from "framer-motion"; import { Play, Copy, Pencil, Sparkles, Trash2, Video, Wand2, FileText, Clock, User } from "lucide-react"; import { cn } from "@/lib/utils"; import { getAgentPresetModeTypeFromDefaultParams } from "@/lib/agents/preset-mode-config"; import type { AgentPreset } from "@/types/agent"; interface AgentPresetCardDarkProps { preset: AgentPreset; selected?: boolean; onSelect: (presetId: string) => void; onFork?: (preset: AgentPreset) => void; onEdit?: (preset: AgentPreset) => void; onDelete?: (preset: AgentPreset) => void; index?: number; compact?: boolean; } export function AgentPresetCardDark({ preset, selected = false, onSelect, onFork, onEdit, onDelete, index = 0, compact = false, }: AgentPresetCardDarkProps) { const previewUrl = preset.avatarUrl || preset.referenceAssets?.[0]?.thumbnailUrl || preset.referenceAssets?.[0]?.originalUrl || ""; const ownerName = String(preset.owner?.name || "").trim() || String(preset.owner?.email || "").trim() || "未知"; const publishedAt = (() => { const raw = preset.createdAt ? new Date(preset.createdAt) : null; if (!raw || Number.isNaN(raw.getTime())) return ""; return raw.toLocaleDateString("zh-CN", { month: "short", day: "numeric", }); })(); const typeConfig = { image: { icon: Wand2, label: "生图", gradient: "from-violet-500 to-purple-600", bg: "bg-violet-500/20", text: "text-violet-300" }, video: { icon: Video, label: "视频", gradient: "from-amber-500 to-orange-600", bg: "bg-amber-500/20", text: "text-amber-300" }, text: { icon: FileText, label: "生文", gradient: "from-emerald-500 to-teal-600", bg: "bg-emerald-500/20", text: "text-emerald-300" }, }; const typeInfo = typeConfig[preset.type] || typeConfig.image; const TypeIcon = typeInfo.icon; const imageModeType = getAgentPresetModeTypeFromDefaultParams(preset.defaultParams); const imageModeLabel = imageModeType === "detail_replacement" ? "详情替换" : imageModeType === "sku_replacement" ? "SKU替换" : imageModeType === "scene_generation" ? "场景图" : null; const showEdit = Boolean(onEdit); const showDelete = Boolean(onDelete); const showFork = Boolean(onFork) && !showEdit && !showDelete; if (compact) { return ( onSelect(preset.id)} >
{showEdit ? ( ) : null} {showDelete ? ( ) : null} {showFork ? ( ) : null}
{previewUrl ? ( {preset.name} ) : (
)}
{preset.name}
{imageModeLabel || typeInfo.label}
{selected ? (
) : null} ); } return ( onSelect(preset.id)} > {/* 背景图片 */}
{previewUrl ? ( <> {preset.name} {/* 渐变遮罩 */}
) : (
)}
{/* 顶部信息栏 */}
{/* 类型标签 */}
{imageModeLabel || typeInfo.label}
{/* 可见性标签 */}
{preset.visibility === "public" ? "公共" : "私有"}
{/* 中央播放/使用按钮 */}
{/* 悬浮操作按钮 */}
{showEdit && ( )} {showDelete && ( )} {showFork && ( )}
{/* 底部信息 */}
{/* 标题 */}

{preset.name}

{/* 元信息 */}
{ownerName} {preset.slotCount > 0 && ( {preset.slotCount}槽 )}
{publishedAt && ( {publishedAt} )}
{/* 选中指示器 */} {selected && ( )} ); }