import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { cn, formatDateTime } from "../lib/utils";
import { Identity } from "../components/Identity";
import { StatusBadge } from "../components/StatusBadge";
import { RunTranscriptView, type TranscriptDensity, type TranscriptMode } from "../components/transcript/RunTranscriptView";
import { runTranscriptFixtureEntries, runTranscriptFixtureMeta } from "../fixtures/runTranscriptFixtures";
import { ExternalLink, FlaskConical, LayoutPanelLeft, MonitorCog, PanelsTopLeft, RadioTower } from "lucide-react";
type SurfaceId = "detail" | "live" | "dashboard";
const surfaceOptions: Array<{
id: SurfaceId;
label: string;
eyebrow: string;
description: string;
icon: typeof LayoutPanelLeft;
}> = [
{
id: "detail",
label: "Run Detail",
eyebrow: "Full transcript",
description: "The long-form run page with the `Nice | Raw` toggle and the most inspectable transcript view.",
icon: MonitorCog,
},
{
id: "live",
label: "Issue Widget",
eyebrow: "Live stream",
description: "The issue-detail live run widget, optimized for following an active run without leaving the task page.",
icon: RadioTower,
},
{
id: "dashboard",
label: "Dashboard Card",
eyebrow: "Dense card",
description: "The active-agents dashboard card, tuned for compact scanning while keeping the same transcript language.",
icon: PanelsTopLeft,
},
];
function previewEntries(surface: SurfaceId) {
if (surface === "dashboard") {
return runTranscriptFixtureEntries.slice(-9);
}
if (surface === "live") {
return runTranscriptFixtureEntries.slice(-14);
}
return runTranscriptFixtureEntries;
}
function RunDetailPreview({
mode,
streaming,
density,
}: {
mode: TranscriptMode;
streaming: boolean;
density: TranscriptDensity;
}) {
return (
Run Detail
{formatDateTime(runTranscriptFixtureMeta.startedAt)}
Transcript ({runTranscriptFixtureEntries.length})
);
}
function LiveWidgetPreview({
streaming,
mode,
density,
}: {
streaming: boolean;
mode: TranscriptMode;
density: TranscriptDensity;
}) {
return (
Live Runs
Compact live transcript stream for the issue detail page.
{runTranscriptFixtureMeta.sourceRunId.slice(0, 8)}
{formatDateTime(runTranscriptFixtureMeta.startedAt)}
Open run
);
}
function DashboardPreview({
streaming,
mode,
density,
}: {
streaming: boolean;
mode: TranscriptMode;
density: TranscriptDensity;
}) {
return (
{streaming ? "Live now" : "Finished 2m ago"}
{runTranscriptFixtureMeta.issueIdentifier} - {runTranscriptFixtureMeta.issueTitle}
);
}
export function RunTranscriptUxLab() {
const [selectedSurface, setSelectedSurface] = useState("detail");
const [detailMode, setDetailMode] = useState("nice");
const [streaming, setStreaming] = useState(true);
const [density, setDensity] = useState("comfortable");
const selected = surfaceOptions.find((option) => option.id === selectedSurface) ?? surfaceOptions[0];
return (
{selected.eyebrow}
{selected.label}
{selected.description}
Source run {runTranscriptFixtureMeta.sourceRunId.slice(0, 8)}
{runTranscriptFixtureMeta.issueIdentifier}
Controls
{(["nice", "raw"] as const).map((mode) => (
))}
{(["comfortable", "compact"] as const).map((nextDensity) => (
))}
{selectedSurface === "detail" ? (
) : selectedSurface === "live" ? (
) : (
)}
);
}