import { cn } from "cn"; import * as React from "react"; import { Badge } from "@/registry/edmi/ui/badge"; import { Card } from "@/registry/edmi/ui/card"; import type { Elevation } from "@/registry/edmi/ui/elevation"; import { Separator } from "@/registry/edmi/ui/separator"; type TaskStatus = "review" | "running" | "completed"; type Task = { id?: string; title: React.ReactNode; /** Owner label, rendered uppercase mono (e.g. "Research agent"). */ agent?: React.ReactNode; status: TaskStatus; }; const STATUS: Record< TaskStatus, { label: string; variant: "warning" | "info" | "success" } > = { review: { label: "Ready to review", variant: "warning" }, running: { label: "Running", variant: "info" }, completed: { label: "Completed", variant: "success" }, }; type TaskListProps = React.ComponentProps & { tasks: Task[]; /** Override the status badge labels. */ labels?: Partial>; /** ✦ depth of the card: sunken -1, flat 0, raised +1, floating +2. */ elevation?: Elevation; }; /** Tasks grouped by status (first-appearance order), one badge per group. */ function TaskList({ className, tasks, labels, elevation, ...props }: TaskListProps) { const groups: { status: TaskStatus; items: Task[] }[] = []; for (const t of tasks) { const g = groups.find((x) => x.status === t.status); if (g) g.items.push(t); else groups.push({ status: t.status, items: [t] }); } return ( {groups.map((g, gi) => ( {gi > 0 ? : null}
{labels?.[g.status] ?? STATUS[g.status].label} {g.items.map((t, i) => (
{t.title} {t.agent ? ( {t.agent} ) : null}
))}
))}
); } export type { Task, TaskStatus }; export { TaskList };