"use client" import Link from "next/link" import { ArrowUpRight, ChevronDown, ChevronUp, ChevronsUpDown } from "lucide-react" import type { BenchmarkEvaluationCardData } from "@/components/benchmark-evaluation-card" import { cn, routeIdToPath } from "@/lib/utils" export type ModelTableSortCol = | "name" | "developer" | "released" | "params" | "results" interface ModelTableProps { rows: BenchmarkEvaluationCardData[] selectedIds: string[] onToggleSelect: (id: string) => void maxCompare: number sortCol: ModelTableSortCol sortDir: "asc" | "desc" onSort: (col: ModelTableSortCol) => void } function formatDateShort(value: string | undefined) { if (!value) return "—" const numeric = Number(value) const date = !Number.isNaN(numeric) && !value.includes("-") ? new Date(numeric * 1000) : new Date(value) if (Number.isNaN(date.getTime())) return value return date.toLocaleDateString("en-US", { year: "numeric", month: "short" }) } function formatParams(row: BenchmarkEvaluationCardData) { if (row.params_billions != null && Number.isFinite(row.params_billions)) { if (row.params_billions >= 100) return `${Math.round(row.params_billions)}B` if (row.params_billions >= 10) return `${row.params_billions.toFixed(0)}B` if (row.params_billions >= 1) return `${row.params_billions.toFixed(1)}B` return `${(row.params_billions * 1000).toFixed(0)}M` } if (row.params && row.params !== "Not specified") return row.params return "—" } function clampPct(value: number) { if (!Number.isFinite(value)) return 0 if (value < 0) return 0 if (value > 100) return 100 return value } export function ModelTable({ rows, selectedIds, onToggleSelect, maxCompare, sortCol, sortDir, onSort, }: ModelTableProps) { function SortIcon({ col }: { col: ModelTableSortCol }) { if (sortCol !== col) return return sortDir === "asc" ? : } function SortTh({ col, children, className, style, title, }: { col: ModelTableSortCol children: React.ReactNode className?: string style?: React.CSSProperties title?: string }) { const active = sortCol === col return ( onSort(col)} title={title} > {children} ) } return (
ModelDeveloperReleasedParamsResults {rows.map((row) => { const isSelected = selectedIds.includes(row.id) const cantSelect = !isSelected && selectedIds.length >= maxCompare return ( ) })}
{row.model_name}
{row.canonical_model_name && row.canonical_model_name !== row.model_name && (
{row.canonical_model_name}
)}
{row.developer} {formatDateShort(row.release_date)} {formatParams(row)} {row.evaluations_count.toLocaleString()} Open
) }