"use client" import { useState } from "react" import { motion, AnimatePresence } from "framer-motion" import { Check, Plus } from "lucide-react" import { type KeyFrame } from "@/lib/api" interface Props { frames: KeyFrame[] selected: Set onToggle: (frameIndex: number) => void maxSelect?: number } function formatTimestamp(t: number) { const m = Math.floor(t / 60) const s = Math.floor(t % 60) return `${m}:${s.toString().padStart(2, "0")}` } export function KeyframeGallery({ frames, selected, onToggle, maxSelect = 10 }: Props) { const [hoverIdx, setHoverIdx] = useState(null) if (frames.length === 0) { return (
关键帧将在下载完成后出现
) } return (
已选 {selected.size} / {maxSelect}
{frames.map((f) => { const isSelected = selected.has(f.index) const isHover = hoverIdx === f.index const disabled = !isSelected && selected.size >= maxSelect return ( !disabled && onToggle(f.index)} onMouseEnter={() => setHoverIdx(f.index)} onMouseLeave={() => setHoverIdx(null)} disabled={disabled} animate={{ scale: isSelected ? 1 : isHover ? 0.98 : 0.92, opacity: isSelected ? 1 : disabled ? 0.3 : isHover ? 0.95 : 0.7, }} transition={{ duration: 0.3, ease: [0.32, 0.72, 0, 1] }} className="relative shrink-0 snap-start rounded-lg overflow-hidden border border-white/10 disabled:cursor-not-allowed" style={{ width: 200, height: 120 }} > {`frame {/* 选中态:ambient glow */} {isSelected && ( )} {/* 时间戳 */}
{formatTimestamp(f.timestamp)}
{/* 选中标记 */}
{isSelected ? : }
) })}
) }