import { useRef, useState } from "react" import { ChevronDown, Play, RotateCcw, Upload, Loader2, Clapperboard } from "lucide-react" import { useDashboard } from "@/lib/dashboard" import { Button } from "@/components/ui/button" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Slider } from "@/components/ui/slider" import { Separator } from "@/components/ui/separator" import { cn } from "@/lib/utils" const DETECTOR_MODELS = [ { label: "Nano", value: "yoloe-26n-seg.pt" }, { label: "Small", value: "yoloe-26s-seg.pt" }, { label: "Medium", value: "yoloe-26m-seg.pt" }, { label: "Large", value: "yoloe-26l-seg.pt" }, { label: "XLarge", value: "yoloe-26x-seg.pt" }, ] const IMAGE_SIZES = [320, 640, 960, 1280] function SliderRow({ label, value, display, min, max, step, onChange, }: { label: string value: number display: string min: number max: number step: number onChange: (v: number) => void }) { return (
{display}
onChange(v)} />
) } export function DetectorPanel() { const { params, setParam, videoFile, setVideo, run, running } = useDashboard() const fileRef = useRef(null) const [dragging, setDragging] = useState(false) const [advanced, setAdvanced] = useState(false) const [loadingDemo, setLoadingDemo] = useState(false) async function loadDemo() { setLoadingDemo(true) try { const r = await fetch("/demo-video") const blob = await r.blob() setVideo(new File([blob], "tiny-trigger-demo.mp4", { type: "video/mp4" })) } catch { // silently ignore if demo not available } finally { setLoadingDemo(false) } } return (
{/* dropzone */}
fileRef.current?.click()} onDragOver={(e) => { e.preventDefault() setDragging(true) }} onDragLeave={() => setDragging(false)} onDrop={(e) => { e.preventDefault() setDragging(false) const f = e.dataTransfer.files?.[0] if (f) setVideo(f) }} className={cn( "group relative flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed px-4 py-6 text-center transition-colors", dragging ? "border-primary/60 bg-primary/5" : "border-border hover:border-white/20 hover:bg-white/[0.02]", )} > e.target.files?.[0] && setVideo(e.target.files[0])} />
{videoFile ? (

{videoFile.name}

{(videoFile.size / 1e6).toFixed(1)} MB · click to replace

) : (

Drop a clip or click to upload

mp4 · webm · mov

)}