feat(shell): 30/55/15 layout, formatted activity log, instant resume, stop confirmation

Left panels 30vw / central 55% / right rail 15vw, minimal padding. Model-activity
log and documents render via .thot-prose; decisions become hairline rows with
semantic type chips. Resume switches the view optimistically (instant feedback).
The Stop button now asks for confirmation before interrupting.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 18:15:48 +02:00
co-authored by Claude Opus 4.8
parent a719ad5990
commit f1b071d165
5 changed files with 102 additions and 33 deletions
+4 -4
View File
@@ -30,8 +30,8 @@ export function ModelActivityPanel({ onClose }: { onClose: () => void }) {
const source = shown.join("\n\n");
return (
<aside className="flex w-[380px] shrink-0 flex-col border-r border-border bg-sidebar">
<div className="flex items-center justify-between border-b border-border/70 px-4 py-3">
<aside className="flex w-[30vw] max-w-[30vw] shrink-0 flex-col border-r border-border bg-sidebar">
<div className="flex items-center justify-between border-b border-border/70 px-3 py-3">
<h2 className="font-heading text-sm font-semibold text-foreground">Model activity</h2>
<div className="flex items-center gap-1">
{canExpand && (
@@ -50,11 +50,11 @@ export function ModelActivityPanel({ onClose }: { onClose: () => void }) {
</Button>
</div>
</div>
<div className="flex-1 overflow-y-auto px-4 py-4">
<div className="flex-1 overflow-y-auto px-3 py-5">
{shown.length === 0 ? (
<p className="text-sm text-muted-foreground">No activity yet.</p>
) : (
<div className="prose prose-sm dark:prose-invert max-w-none text-foreground/90">
<div className="thot-prose max-w-[74ch]">
<ReactMarkdown remarkPlugins={[remarkGfm]}>{source}</ReactMarkdown>
</div>
)}