+ {/* conversation thread: max-w-[760px] centered */}
+
+
+ {!activeConversation &&
}
+ {activeConversation &&
}
+
+
+
+ {/* input bar + action strip anchored at bottom */}
+
+
+
+
{/* Phase 12 wires the transition */}}
+ onAttach={...}
+ onOpenMemory={() => setMemoryOpen(true)}
+ onOpenHistory={() => setHistoryOpen(true)}
+ />
+
+
+
+ {/* slide-overs */}
+
setHistoryOpen(false)} />
+ setMemoryOpen(false)} />
+
+ );
+}
+```
+
+### Design tokens to use (from Phase 1–3 migration and DESIGN.md)
+
+- `bg-background` for canvas (pure black)
+- `bg-card` for input-bar fill (`#141414` near-black)
+- `border-border` for charcoal borders
+- `text-primary` / `bg-primary` for volt accents
+- `text-muted-foreground` for silver
+- `rounded-[8px]` for input bar
+- `rounded-[4px]` for small buttons/badges
+- Inter weights via Tailwind defaults; no custom font classes needed
+- Uppercase labels with `tracking-[0.1em]` for small section titles (matches ModeBreadcrumb)
+- Focus-visible: `focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background` on all interactive elements
+
+### Slide-over pattern (reusable mental model for HistorySheet and MemorySheet)
+
+Use a simple portal-free pattern:
+
+```tsx
+export function Sheet({
+ open,
+ onClose,
+ side, // "left" | "right"
+ width, // e.g. 320 or 340
+ children,
+ "aria-label": ariaLabel,
+}: SheetProps) {
+ // Close on ESC
+ useEffect(() => {
+ if (!open) return;
+ const onKey = (e: KeyboardEvent) => e.key === "Escape" && onClose();
+ document.addEventListener("keydown", onKey);
+ return () => document.removeEventListener("keydown", onKey);
+ }, [open, onClose]);
+
+ if (!open) return null;
+ return (
+ <>
+ {/* backdrop */}
+