"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 ? ( { e.stopPropagation(); onEdit?.(preset); }} className="flex h-6 w-6 items-center justify-center rounded-full bg-black/65 text-white/80 backdrop-blur-md transition-all hover:bg-white/20 hover:text-white" > ) : null} {showDelete ? ( { e.stopPropagation(); onDelete?.(preset); }} className="flex h-6 w-6 items-center justify-center rounded-full bg-black/65 text-white/80 backdrop-blur-md transition-all hover:bg-red-500/80 hover:text-white" > ) : null} {showFork ? ( { e.stopPropagation(); onFork?.(preset); }} className="flex h-6 w-6 items-center justify-center rounded-full bg-black/65 text-white/80 backdrop-blur-md transition-all hover:bg-white/20 hover:text-white" > ) : null} {previewUrl ? ( ) : ( )} {preset.name} {imageModeLabel || typeInfo.label} {selected ? ( ) : null} ); } return ( onSelect(preset.id)} > {/* 背景图片 */} {previewUrl ? ( <> {/* 渐变遮罩 */} > ) : ( )} {/* 顶部信息栏 */} {/* 类型标签 */} {imageModeLabel || typeInfo.label} {/* 可见性标签 */} {preset.visibility === "public" ? "公共" : "私有"} {/* 中央播放/使用按钮 */} {/* 悬浮操作按钮 */} {showEdit && ( { e.stopPropagation(); onEdit?.(preset); }} className="flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white/80 backdrop-blur-md transition-all hover:bg-white/20 hover:text-white" > )} {showDelete && ( { e.stopPropagation(); onDelete?.(preset); }} className="flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white/80 backdrop-blur-md transition-all hover:bg-red-500/80 hover:text-white" > )} {showFork && ( { e.stopPropagation(); onFork?.(preset); }} className="flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white/80 backdrop-blur-md transition-all hover:bg-white/20 hover:text-white" > )} {/* 底部信息 */} {/* 标题 */} {preset.name} {/* 元信息 */} {ownerName} {preset.slotCount > 0 && ( {preset.slotCount}槽 )} {publishedAt && ( {publishedAt} )} {/* 选中指示器 */} {selected && ( )} ); }