From 730ec3447a603bb3c55bf9bc2a8c6d50201b3002 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Tue, 29 Sep 2026 22:55:26 -0700 Subject: [PATCH] fix(web): bench thread, pill, and composer match the mockup (CL-9592) --- apps/web/src/app.css | 10 +++++-- apps/web/src/bench/bench-pill.tsx | 20 ++++++++++++-- apps/web/src/chat/composer.tsx | 4 +-- apps/web/src/lib/icons/index.tsx | 1 + apps/web/src/pages/workbench-page.tsx | 39 +++++++++++++++++++-------- 5 files changed, 57 insertions(+), 17 deletions(-) diff --git a/apps/web/src/app.css b/apps/web/src/app.css index adc1fc2d5..71c878488 100644 --- a/apps/web/src/app.css +++ b/apps/web/src/app.css @@ -4228,11 +4228,11 @@ a.drawer-li:hover, flex: 1; min-height: 0; overflow-y: auto; + padding-top: 72px; } .workbench-main-composer { flex-shrink: 0; - border-top: 1px solid var(--border); - padding: 0.75rem 0; + padding: 0.75rem 1rem; } .workbench-participants { display: flex; @@ -4258,6 +4258,12 @@ a.drawer-li:hover, font-size: 0.78rem; color: var(--muted-foreground); cursor: pointer; + opacity: 0; + transition: opacity 120ms ease-out; +} +.chat-thread-message:hover .workbench-replies-link, +.workbench-replies-link:focus-visible { + opacity: 1; } .workbench-replies-link:hover { color: var(--foreground); diff --git a/apps/web/src/bench/bench-pill.tsx b/apps/web/src/bench/bench-pill.tsx index cf3b70d58..aae462f2d 100644 --- a/apps/web/src/bench/bench-pill.tsx +++ b/apps/web/src/bench/bench-pill.tsx @@ -1,19 +1,31 @@ import { CaretDown } from "@/lib/icons"; import { IdentityAvatar } from "@/chat/avatar"; +import { Skeleton } from "@corbits/react-ui"; import type { WorkerStatus } from "../worker-status"; +function statusLine(status: WorkerStatus, workerName: string | undefined): string { + if (status.text === "Working…") { + return workerName === undefined ? "Working…" : `${workerName} is working…`; + } + if (status.text === "Live") return "Idle"; + return status.text; +} + /** Frosted pill centered over the thread: the bench's worker, its name and * live status. Toggles the bench drawer. */ export function BenchPill({ benchName, worker, status, + rosterReady, open, onToggle, }: { readonly benchName: string; readonly worker: { readonly id: string; readonly name: string } | undefined; readonly status: WorkerStatus; + /** False until the roster resolves; the avatar holds a skeleton. */ + readonly rosterReady: boolean; readonly open: boolean; readonly onToggle: () => void; }) { @@ -25,7 +37,11 @@ export function BenchPill({ aria-controls="bench-drawer" onClick={onToggle} > - {worker === undefined ? null : ( + {worker === undefined ? ( + rosterReady ? null : ( + + ) + ) : ( )} {benchName} - {status.text} + {statusLine(status, worker?.name)}