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
)}
setParam("confidence", Number(v.toFixed(2)))}
/>
setParam("sampleIntervalSec", Number(v.toFixed(2)))}
/>
setParam("maxFrames", v)}
/>
{advanced && (
)}
)
}