"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
|
{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
|