import type { Group, WorkspaceView, SurfaceState } from "./layoutTypes"; const RING: Record = { error: "#F4544E", wait: "#F2B84B", work: "#4C8DFF", done: "#3FB950", idle: "#5A6573", stopped: "#5A6573", }; function aggregate(w: WorkspaceView): SurfaceState | "stopped" { const order: SurfaceState[] = ["error", "wait", "work", "done", "idle"]; const running = Object.values(w.surfaces).filter((s) => s.running); if (running.length === 0) return "stopped"; for (const st of order) { if (running.some((s) => s.state === st)) return st; } return "idle"; } export function Sidebar({ groups, workspaces, activeId, onSelect, onNew, }: { groups: Group[]; workspaces: WorkspaceView[]; activeId: string | null; onSelect: (id: string) => void; onNew: () => void; }) { const byGroup = (gid: string | null) => workspaces.filter((w) => (w.group_id ?? null) === gid).sort((a, b) => a.order - b.order); const ungrouped = byGroup(null); const row = (w: WorkspaceView) => (
onSelect(w.id)} style={{ display: "flex", alignItems: "center", gap: 9, padding: "6px 8px", borderRadius: 6, cursor: "pointer", background: w.id === activeId ? "#1A2029" : "transparent", fontFamily: "Inter", fontSize: 13, color: w.id === activeId ? "#E6EDF3" : "#8B97A6", }}> {w.name} {w.unread && } {Object.keys(w.surfaces).length}
); return (
{groups.sort((a, b) => a.order - b.order).map((g) => (
{g.name.toUpperCase()}
{byGroup(g.id).map(row)}
))} {ungrouped.length > 0 &&
{ungrouped.map(row)}
}
); }