polyglot-alpha / ui /components /shared /PhaseHeader.tsx
licaomeng
deploy: main@8970ffb β†’ HF Spaces (2026-05-27T05:19Z)
88d2f2a
import { Badge } from "@/components/ui/badge";
import type { PhaseStatus } from "@/lib/api";
import { cn } from "@/lib/utils";
const STATUS_LABEL: Record<PhaseStatus, string> = {
pending: "Pending",
running: "Running",
completed: "Done",
failed: "Failed",
};
// Failed (system error: timeout, crash, infra) renders grey/muted β€” distinct
// from "destructive" red which is reserved for quality verdicts (Rejected).
const STATUS_VARIANT: Record<
PhaseStatus,
"secondary" | "info" | "success" | "muted"
> = {
pending: "secondary",
running: "info",
completed: "success",
failed: "muted",
};
export function PhaseHeader({
index,
title,
status,
description,
className,
}: {
index?: number;
title: string;
status: PhaseStatus;
description?: string;
className?: string;
}) {
return (
<div className={cn("flex items-start justify-between gap-3", className)}>
<div className="flex items-start gap-3">
{typeof index === "number" && (
<span className="grid h-7 w-7 flex-shrink-0 place-items-center rounded-md border border-border bg-secondary/40 font-mono text-xs">
{index.toString().padStart(2, "0")}
</span>
)}
<div className="min-w-0">
<h3 className="text-sm font-semibold leading-tight">{title}</h3>
{description && (
<p className="mt-0.5 text-xs text-muted-foreground">{description}</p>
)}
</div>
</div>
<Badge variant={STATUS_VARIANT[status]} className="flex-shrink-0">
{STATUS_LABEL[status]}
</Badge>
</div>
);
}