// — the slide-in drawer for the inbox/todos flyouts. // Deliberately a new Preact component, not the shared // `` shadow-DOM custom element (@hive/shared/ // side-panel.js) — same rationale as StatusChips' Badge/Dropdown: // mara's ask was real Preact components for this rewrite, not a port // of the old widget family. Drops that element's drag-to-resize + // localStorage width persistence for this first slice (fixed width via // CSS, see SidePanel.css) — a real simplification, not an oversight; // revisit if a fixed width proves cramped in practice. // // Content styling (`.agent-inbox`, `.inbox-*`, `.side-panel-empty`) // already ships globally via `agent.css` and is reused verbatim by // InboxPanel/TodosPanel — only the drawer chrome itself is new here. import { useEffect } from "preact/hooks"; import type { ComponentChildren } from "preact"; import "./SidePanel.css"; export interface SidePanelProps { open: boolean; title: string; onClose: () => void; children?: ComponentChildren; } export function SidePanel({ open, title, onClose, children }: SidePanelProps) { useEffect(() => { if (!open) return; function onKey(e: KeyboardEvent) { if (e.key === "Escape") onClose(); } document.addEventListener("keydown", onKey); return () => document.removeEventListener("keydown", onKey); }, [open, onClose]); return ( <>