{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "operator-dashboard",
  "title": "Operator Dashboard",
  "description": "A full-page operations dashboard with boot status, volume health, rebuild progress and a shell.",
  "registryDependencies": [
    "@afterglow/alarm-button",
    "@afterglow/badge",
    "@afterglow/boot-log",
    "@afterglow/button",
    "@afterglow/card",
    "@afterglow/connector",
    "@afterglow/eyebrow",
    "@afterglow/kbd",
    "@afterglow/led",
    "@afterglow/progress",
    "@afterglow/shell",
    "@afterglow/scanlines",
    "@afterglow/table"
  ],
  "files": [
    {
      "path": "registry/terminal/blocks/operator-dashboard/dashboard.tsx",
      "content": "\"use client\";\n\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AlarmButton } from \"@/registry/terminal/components/alarm-button\";\nimport { BootLog } from \"@/registry/terminal/components/boot-log\";\nimport { Connector } from \"@/registry/terminal/components/connector\";\nimport { Eyebrow } from \"@/registry/terminal/components/eyebrow\";\nimport { Led, Status } from \"@/registry/terminal/components/led\";\nimport { Scanlines } from \"@/registry/terminal/components/scanlines\";\nimport {\n  Shell,\n  ShellCommand,\n  ShellLine,\n  ShellOutput,\n  ShellPrompt,\n} from \"@/registry/terminal/components/shell\";\nimport { Badge } from \"@/registry/terminal/ui/badge\";\nimport { Button } from \"@/registry/terminal/ui/button\";\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from \"@/registry/terminal/ui/card\";\nimport { Kbd, KbdGroup } from \"@/registry/terminal/ui/kbd\";\nimport { Progress } from \"@/registry/terminal/ui/progress\";\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableHeader,\n  TableRow,\n} from \"@/registry/terminal/ui/table\";\n\nconst BOOT = [\n  { text: \"power on self test\", tone: \"dim\" as const },\n  { text: \"phosphor at 100%\", tone: \"ok\" as const },\n  { text: \"3 volumes mounted, 1 read-only\", tone: \"default\" as const },\n  { text: \"beacon unreachable, running local\", tone: \"warn\" as const },\n  { text: \"ready\", tone: \"ok\" as const },\n];\n\nconst VOLUMES = [\n  { blocks: \"18 442\", name: \"core\", state: \"mounted\" },\n  { blocks: \"4 011\", name: \"archive\", state: \"mounted\" },\n  { blocks: \"92 780\", name: \"capture\", state: \"read-only\" },\n  { blocks: \"0\", name: \"spool\", state: \"offline\" },\n];\n\nexport function OperatorDashboard({\n  className,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  const [commands, setCommands] = useState<{ id: number; text: string }[]>([]);\n\n  const record = useCallback((value: string) => {\n    setCommands((entries) => [...entries, { id: entries.length, text: value }]);\n  }, []);\n\n  return (\n    <div className={cn(\"relative isolate bg-void\", className)} {...props}>\n      <Scanlines density=\"soft\" />\n\n      <header className=\"flex items-center justify-between gap-6 border-line border-b px-6 py-4\">\n        <div className=\"flex items-baseline gap-3\">\n          <strong className=\"font-bold font-mono text-base tracking-terminal-2xl\">\n            NODE-04\n          </strong>\n          <span className=\"font-mono text-4xs text-muted-foreground uppercase tracking-terminal\">\n            local operator\n          </span>\n        </div>\n        <KbdGroup>\n          <Kbd glyph>⌘</Kbd>\n          <Kbd>K</Kbd>\n        </KbdGroup>\n      </header>\n\n      <main className=\"mx-auto grid max-w-5xl gap-10 px-6 py-12\">\n        <section className=\"grid gap-3\">\n          <Eyebrow caret>Session</Eyebrow>\n          <h1 className=\"max-w-2xl text-balance font-mono font-medium text-2xl text-phosphor-bright leading-tight\">\n            Four volumes, one of them not answering.\n          </h1>\n          <Connector />\n          <p className=\"max-w-prose text-muted-foreground text-sm\">\n            The spool has been down since the last power cycle. Everything else\n            mounted clean.\n          </p>\n          <div className=\"flex flex-wrap items-center gap-3 pt-2\">\n            <AlarmButton>Restart spool</AlarmButton>\n            <Button variant=\"outline\">Run diagnostics</Button>\n          </div>\n        </section>\n\n        <section className=\"grid gap-4 md:grid-cols-2\">\n          <Card>\n            <CardHeader>\n              <CardTitle>Self test</CardTitle>\n              <CardDescription>Last run, 40 seconds ago.</CardDescription>\n            </CardHeader>\n            <CardContent>\n              <BootLog lines={BOOT} />\n            </CardContent>\n          </Card>\n\n          <Card accent=\"var(--signal)\">\n            <CardHeader>\n              <CardTitle>Rebuild</CardTitle>\n              <CardDescription>Indexing capture volume.</CardDescription>\n            </CardHeader>\n            <CardContent className=\"grid gap-4\">\n              <div className=\"grid gap-2\">\n                <div className=\"flex items-baseline justify-between font-mono text-2xs uppercase tracking-terminal\">\n                  <span className=\"text-muted-foreground\">Pass 1</span>\n                  <span className=\"text-metric tabular-nums\">68%</span>\n                </div>\n                <Progress value={68} />\n              </div>\n              <div className=\"grid gap-2\">\n                <div className=\"flex items-baseline justify-between font-mono text-2xs uppercase tracking-terminal\">\n                  <span className=\"text-muted-foreground\">Pass 2</span>\n                  <span className=\"text-phosphor-dim\">waiting</span>\n                </div>\n                <Progress indeterminate />\n              </div>\n            </CardContent>\n          </Card>\n        </section>\n\n        <section className=\"grid gap-4\">\n          <Eyebrow>Volumes</Eyebrow>\n          <div className=\"border border-line bg-card/90\">\n            <Table containerClassName=\"max-h-56\" stickyHeader>\n              <TableHeader>\n                <TableRow>\n                  <TableHead>Volume</TableHead>\n                  <TableHead>State</TableHead>\n                  <TableHead className=\"text-right\">Blocks</TableHead>\n                </TableRow>\n              </TableHeader>\n              <TableBody>\n                {VOLUMES.map((volume) => (\n                  <TableRow key={volume.name}>\n                    <TableCell className=\"text-phosphor-bright\">\n                      /{volume.name}\n                    </TableCell>\n                    <TableCell>\n                      {volume.state === \"offline\" ? (\n                        <Badge variant=\"signal\">offline</Badge>\n                      ) : (\n                        <Badge\n                          variant={\n                            volume.state === \"read-only\" ? \"warning\" : \"default\"\n                          }\n                        >\n                          {volume.state}\n                        </Badge>\n                      )}\n                    </TableCell>\n                    <TableCell className=\"is-numeric\">\n                      {volume.blocks}\n                    </TableCell>\n                  </TableRow>\n                ))}\n              </TableBody>\n            </Table>\n          </div>\n        </section>\n\n        <section className=\"grid gap-3\">\n          <Eyebrow>Shell</Eyebrow>\n          <Shell aria-label=\"Node command shell\">\n            <ShellOutput>\n              <ShellLine tone=\"muted\">session ready</ShellLine>\n              {commands.map((command) => (\n                <ShellCommand key={command.id} prompt=\"node-04:~$\">\n                  {command.text}\n                </ShellCommand>\n              ))}\n            </ShellOutput>\n            <ShellPrompt\n              onSubmit={record}\n              placeholder=\"mount /spool --force\"\n              prompt=\"node-04:~$\"\n            />\n          </Shell>\n        </section>\n      </main>\n\n      <footer className=\"flex flex-wrap items-center gap-6 border-line border-t px-6 py-4\">\n        <Status>uplink nominal</Status>\n        <Status tone=\"busy\">indexing</Status>\n        <Status tone=\"error\">spool offline</Status>\n        <span className=\"ml-auto flex items-center gap-2 font-mono text-4xs text-phosphor-dim uppercase tracking-terminal\">\n          <Led tone=\"idle\" /> node-04\n        </span>\n      </footer>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/operator-dashboard.tsx"
    },
    {
      "path": "registry/terminal/blocks/operator-dashboard/page.tsx",
      "content": "import { OperatorDashboard } from \"@/components/operator-dashboard\";\n\nexport default function OperatorDashboardPage() {\n  return <OperatorDashboard className=\"min-h-svh\" />;\n}\n",
      "type": "registry:page",
      "target": "app/operator-dashboard/page.tsx"
    }
  ],
  "categories": [
    "dashboard",
    "application"
  ],
  "type": "registry:block"
}