@nbt-dev/devtools 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/config.tsx", "../src/components/devtools/devtools-context.tsx", "../src/components/devtools/dev-tools.tsx", "../src/lib/utils.ts", "../src/components/devtools/console-tab.tsx", "../src/components/devtools/network-tab.tsx", "../src/components/devtools/data-tab.tsx", "../src/hooks/use-cartridge-info.ts", "../src/hooks/use-bulk-stream.ts", "../src/generated/bulk-protocol.ts", "../src/components/devtools/data-browser/data-store.ts", "../src/components/devtools/data-browser/bulk-decoder.ts", "../src/components/devtools/data-browser/data-table.tsx", "../src/components/devtools/entity-graph/diagram-tab.tsx", "../src/components/devtools/entity-graph/entity-node.tsx", "../src/components/devtools/entity-graph/entity-graph-utils.ts", "../src/components/ui/sheet.tsx", "../src/components/ui/button.tsx", "../src/components/devtools/settings-tab.tsx", "../src/index.tsx"],
4
+ "sourcesContent": ["import React from \"react\";\n\n// Runtime config for the devtools, replacing the inspector's compile-time\n// `NIMBIT_API_ENDPOINT` define. Hosts pass the console's base URL once via\n// <NimbitDevTools apiBaseUrl=\"\u2026\" /> and every fetch/WebSocket derives from it.\n// Empty string => same-origin (the inspector default when served by the console).\nexport type DevToolsConfig = {\n apiBaseUrl: string;\n};\n\nconst DevToolsConfigContext = React.createContext<DevToolsConfig>({\n apiBaseUrl: \"\",\n});\n\nexport const DevToolsConfigProvider: React.FC<{\n apiBaseUrl?: string;\n children: React.ReactNode;\n}> = ({ apiBaseUrl = \"\", children }) => {\n const value = React.useMemo(() => ({ apiBaseUrl }), [apiBaseUrl]);\n return (\n <DevToolsConfigContext.Provider value={value}>\n {children}\n </DevToolsConfigContext.Provider>\n );\n};\n\nexport function useDevToolsConfig(): DevToolsConfig {\n return React.useContext(DevToolsConfigContext);\n}\n\n// Turn an http(s) base into a ws(s) base. Empty => derive from window.location.\nexport function wsBaseFrom(apiBaseUrl: string): string {\n if (!apiBaseUrl) {\n const loc = window.location;\n const proto = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return `${proto}//${loc.host}`;\n }\n return apiBaseUrl.replace(/^http(s?):/, \"ws$1:\");\n}\n", "import React, { useEffect } from \"react\";\n\nexport type DevToolsDock = \"bottom\" | \"right\";\n\nexport type DevToolsTab = {\n id: string;\n title: string;\n icon?: React.ReactNode;\n render: () => React.ReactNode;\n};\n\nexport type DevToolsSize = { h: number; w: number };\n\ntype DevToolsCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n toggle: () => void;\n dock: DevToolsDock;\n setDock: (d: DevToolsDock) => void;\n activeTab: string | null;\n setActiveTab: (id: string) => void;\n size: DevToolsSize;\n setSize: (s: DevToolsSize | ((prev: DevToolsSize) => DevToolsSize)) => void;\n maximized: boolean;\n setMaximized: (v: boolean) => void;\n dataCart: string | null;\n setDataCart: (v: string | null) => void;\n dataEntity: string | null;\n setDataEntity: (v: string | null) => void;\n};\n\nconst Ctx = React.createContext<DevToolsCtx | null>(null);\n\nexport const DevToolsProvider: React.FC<{\n children: React.ReactNode;\n defaultActiveTab?: string;\n}> = ({ children, defaultActiveTab }) => {\n const [open, setOpen] = React.useState(false);\n const [dock, setDock] = React.useState<DevToolsDock>(\"bottom\");\n const [activeTab, setActiveTab] = React.useState<string | null>(\n defaultActiveTab ?? null,\n );\n const [size, setSize] = React.useState<DevToolsSize>({ h: 320, w: 480 });\n const [maximized, setMaximized] = React.useState(false);\n const [dataCart, setDataCart] = React.useState<string | null>(null);\n const [dataEntity, setDataEntity] = React.useState<string | null>(null);\n\n const toggle = React.useCallback(() => setOpen((o) => !o), []);\n\n const value = React.useMemo(\n () => ({\n open,\n setOpen,\n toggle,\n dock,\n setDock,\n activeTab,\n setActiveTab,\n size,\n setSize,\n maximized,\n setMaximized,\n dataCart,\n setDataCart,\n dataEntity,\n setDataEntity,\n }),\n [open, toggle, dock, activeTab, size, maximized, dataCart, dataEntity],\n );\n\n // Toggle from anywhere via `window.dispatchEvent(new Event(\"devtools-toggle\"))`.\n useEffect(() => {\n const listen = () => toggle();\n window.addEventListener(\"devtools-toggle\", listen);\n return () => window.removeEventListener(\"devtools-toggle\", listen);\n }, [open, toggle]);\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n};\n\nexport function useDevTools(): DevToolsCtx {\n const v = React.useContext(Ctx);\n if (!v) throw new Error(\"useDevTools must be used inside <DevToolsProvider>\");\n return v;\n}\n", "import React from \"react\";\nimport { Maximize2, Minimize2, PanelBottom, PanelRight, X } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { useDevTools, type DevToolsTab } from \"./devtools-context\";\nimport ConsoleTab from \"./console-tab\";\nimport NetworkTab from \"./network-tab\";\nimport DataTab from \"./data-tab\";\nimport SettingsTab from \"./settings-tab\";\n\nconst MIN_H = 120;\nconst MIN_W = 240;\n\nconst DEV_TOOLS_TABS: DevToolsTab[] = [\n { id: \"console\", title: \"Console\", render: () => <ConsoleTab /> },\n { id: \"network\", title: \"Network\", render: () => <NetworkTab /> },\n { id: \"data\", title: \"Data\", render: () => <DataTab /> },\n { id: \"settings\", title: \"Settings\", render: () => <SettingsTab /> },\n];\n\nconst DevTools: React.FC = () => {\n const {\n open,\n setOpen,\n dock,\n setDock,\n activeTab,\n setActiveTab,\n size,\n setSize,\n maximized,\n setMaximized,\n } = useDevTools();\n\n const panelRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (activeTab) return;\n if (DEV_TOOLS_TABS.length > 0) setActiveTab(DEV_TOOLS_TABS[0].id);\n }, [activeTab, setActiveTab]);\n\n const startResize = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n const panel = panelRef.current;\n if (!panel) return;\n const parent = panel.parentElement;\n if (!parent) return;\n\n const handle = e.currentTarget as HTMLElement;\n handle.setPointerCapture(e.pointerId);\n\n const parentRect = parent.getBoundingClientRect();\n const startX = e.clientX;\n const startY = e.clientY;\n const startH = panel.offsetHeight;\n const startW = panel.offsetWidth;\n const isBottom = dock === \"bottom\";\n\n // Resize by mutating the panel's DOM size directly each frame \u2014 no React\n // state churn, so the active tab (e.g. the ReactFlow Diagram) doesn't\n // re-render on every pointermove. State is committed once on pointerup.\n let pendingNext: number | null = null;\n let lastApplied = isBottom ? startH : startW;\n let rafId = 0;\n const flush = () => {\n rafId = 0;\n if (pendingNext == null) return;\n const v = pendingNext;\n pendingNext = null;\n lastApplied = v;\n if (isBottom) panel.style.height = `${v}px`;\n else panel.style.width = `${v}px`;\n };\n\n const onMove = (ev: PointerEvent) => {\n ev.preventDefault();\n if (isBottom) {\n const dy = startY - ev.clientY;\n pendingNext = Math.max(\n MIN_H,\n Math.min(parentRect.height - 24, startH + dy),\n );\n } else {\n const dx = startX - ev.clientX;\n pendingNext = Math.max(\n MIN_W,\n Math.min(parentRect.width - 24, startW + dx),\n );\n }\n if (!rafId) rafId = requestAnimationFrame(flush);\n };\n\n const onUp = () => {\n if (rafId) cancelAnimationFrame(rafId);\n flush();\n setSize((prev) =>\n isBottom\n ? prev.h === lastApplied\n ? prev\n : { ...prev, h: lastApplied }\n : prev.w === lastApplied\n ? prev\n : { ...prev, w: lastApplied },\n );\n handle.removeEventListener(\"pointermove\", onMove);\n handle.removeEventListener(\"pointerup\", onUp);\n handle.removeEventListener(\"pointercancel\", onUp);\n try {\n handle.releasePointerCapture(e.pointerId);\n } catch {\n /* already released */\n }\n document.body.style.userSelect = \"\";\n document.body.style.cursor = \"\";\n };\n\n document.body.style.userSelect = \"none\";\n document.body.style.cursor =\n dock === \"bottom\" ? \"ns-resize\" : \"ew-resize\";\n handle.addEventListener(\"pointermove\", onMove);\n handle.addEventListener(\"pointerup\", onUp);\n handle.addEventListener(\"pointercancel\", onUp);\n },\n [dock, setSize],\n );\n\n if (!open) return null;\n\n const active =\n DEV_TOOLS_TABS.find((t) => t.id === activeTab) ?? DEV_TOOLS_TABS[0];\n\n const positionClass = maximized\n ? \"inset-0\"\n : dock === \"bottom\"\n ? \"inset-x-0 bottom-0\"\n : \"inset-y-0 right-0\";\n\n const sizeStyle: React.CSSProperties = maximized\n ? {}\n : dock === \"bottom\"\n ? { height: size.h }\n : { width: size.w };\n\n return (\n <div\n ref={panelRef}\n style={sizeStyle}\n className={cn(\n \"nimbit-devtools dark absolute z-40 flex flex-col border-border bg-background text-foreground text-[12px] shadow-lg\",\n positionClass,\n dock === \"bottom\" ? \"border-t\" : \"border-l\",\n )}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {!maximized && (\n <div\n onPointerDown={startResize}\n style={{ touchAction: \"none\" }}\n className={cn(\n \"absolute z-10 bg-transparent hover:bg-accent/40\",\n dock === \"bottom\"\n ? \"left-0 right-0 -top-px h-1.5 cursor-ns-resize\"\n : \"top-0 bottom-0 -left-px w-1.5 cursor-ew-resize\",\n )}\n />\n )}\n\n <div className=\"flex h-7 shrink-0 items-center border-b border-border bg-background pl-1 pr-1 select-none\">\n <div className=\"flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto\">\n {DEV_TOOLS_TABS.map((tab) => {\n const isActive = tab.id === active?.id;\n return (\n <button\n key={tab.id}\n type=\"button\"\n data-active={isActive}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"h-5 shrink-0 rounded-md px-2 text-[12px] leading-none outline-none transition-colors\",\n \"text-foreground hover:bg-accent hover:text-accent-foreground\",\n \"data-[active=true]:bg-accent data-[active=true]:text-accent-foreground\",\n )}\n >\n <span className=\"inline-flex items-center gap-1\">\n {tab.icon}\n {tab.title}\n </span>\n </button>\n );\n })}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-0.5 pl-2\">\n <IconBtn\n label={dock === \"bottom\" ? \"Dock right\" : \"Dock bottom\"}\n onClick={() => setDock(dock === \"bottom\" ? \"right\" : \"bottom\")}\n >\n {dock === \"bottom\" ? (\n <PanelRight className=\"size-3.5\" />\n ) : (\n <PanelBottom className=\"size-3.5\" />\n )}\n </IconBtn>\n <IconBtn\n label={maximized ? \"Restore\" : \"Maximize\"}\n onClick={() => setMaximized(!maximized)}\n >\n {maximized ? (\n <Minimize2 className=\"size-3.5\" />\n ) : (\n <Maximize2 className=\"size-3.5\" />\n )}\n </IconBtn>\n <IconBtn label=\"Close\" onClick={() => setOpen(false)}>\n <X className=\"size-3.5\" />\n </IconBtn>\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {active ? active.render() : null}\n </div>\n </div>\n );\n};\n\nconst IconBtn: React.FC<\n React.ButtonHTMLAttributes<HTMLButtonElement> & { label: string }\n> = ({ label, className, children, ...rest }) => (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className={cn(\n \"grid size-5 place-items-center rounded-md text-foreground outline-none hover:bg-accent hover:text-accent-foreground\",\n className,\n )}\n {...rest}\n >\n {children}\n </button>\n);\n\nexport default DevTools;\n", "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n", "import React from \"react\";\nimport {\n ChevronRight,\n Pause,\n Play,\n Trash2,\n} from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { useDevToolsConfig, wsBaseFrom } from \"../../config\";\n\nconst MAX_ENTRIES = 5000;\nconst RECONNECT_MIN_MS = 500;\nconst RECONNECT_MAX_MS = 5000;\n\ntype StackFrame = { proc: string; file: string; line: number };\ntype Parsed = {\n ts?: string;\n level?: \"info\" | \"warn\" | \"error\" | string;\n msg?: string;\n stack?: StackFrame[];\n};\n\ntype WireLine = { raw: string; parsed?: boolean };\ntype WireFrame = { cursor: number; lines: WireLine[] };\n\ntype LogEntry = {\n id: number;\n raw: string;\n level: \"info\" | \"warn\" | \"error\" | \"plain\";\n parsed: Parsed | null;\n};\n\ntype LevelKey = \"info\" | \"warn\" | \"error\" | \"plain\";\n\nfunction resolveWsUrl(apiBaseUrl: string, path: string): string {\n return `${wsBaseFrom(apiBaseUrl)}${path}`;\n}\n\nfunction classifyLine(line: WireLine): LogEntry {\n if (line.parsed) {\n try {\n const p = JSON.parse(line.raw) as Parsed;\n const lvl =\n p.level === \"info\" || p.level === \"warn\" || p.level === \"error\"\n ? p.level\n : \"plain\";\n return {\n id: _nextId(),\n raw: line.raw,\n level: lvl,\n parsed: p,\n };\n } catch {\n // Fall through to plain.\n }\n }\n return { id: _nextId(), raw: line.raw, level: \"plain\", parsed: null };\n}\n\nlet _idCounter = 0;\nfunction _nextId(): number {\n _idCounter += 1;\n return _idCounter;\n}\n\nconst LEVEL_BADGE: Record<LevelKey, string> = {\n info: \"bg-blue-500/20 text-blue-300 border-blue-400/30\",\n warn: \"bg-yellow-500/20 text-yellow-300 border-yellow-400/30\",\n error: \"bg-red-500/20 text-red-300 border-red-400/30\",\n plain: \"bg-zinc-700/40 text-zinc-300 border-zinc-500/30\",\n};\n\nconst ConsoleTab: React.FC = () => {\n const { apiBaseUrl } = useDevToolsConfig();\n const [entries, setEntries] = React.useState<LogEntry[]>([]);\n const [paused, setPaused] = React.useState(false);\n const [filter, setFilter] = React.useState<Record<LevelKey, boolean>>({\n info: true,\n warn: true,\n error: true,\n plain: true,\n });\n const [expanded, setExpanded] = React.useState<Record<number, boolean>>({});\n\n const scrollerRef = React.useRef<HTMLDivElement | null>(null);\n const stickToBottomRef = React.useRef(true);\n const pausedRef = React.useRef(paused);\n pausedRef.current = paused;\n\n React.useEffect(() => {\n let alive = true;\n let socket: WebSocket | null = null;\n let backoff = RECONNECT_MIN_MS;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n const connect = () => {\n if (!alive) return;\n try {\n socket = new WebSocket(resolveWsUrl(apiBaseUrl, \"/_console/logs/ws\"));\n } catch {\n scheduleReconnect();\n return;\n }\n\n socket.onopen = () => {\n backoff = RECONNECT_MIN_MS;\n };\n socket.onmessage = (ev) => {\n if (pausedRef.current) return;\n if (typeof ev.data !== \"string\") return;\n let frame: WireFrame;\n try {\n frame = JSON.parse(ev.data) as WireFrame;\n } catch {\n return;\n }\n if (!frame.lines || frame.lines.length === 0) return;\n const batch = frame.lines.map(classifyLine);\n setEntries((prev) => {\n const next = prev.concat(batch);\n if (next.length > MAX_ENTRIES) {\n return next.slice(next.length - MAX_ENTRIES);\n }\n return next;\n });\n };\n socket.onerror = () => {\n // Let onclose handle reconnect.\n };\n socket.onclose = () => {\n socket = null;\n scheduleReconnect();\n };\n };\n\n const scheduleReconnect = () => {\n if (!alive) return;\n reconnectTimer = setTimeout(() => {\n backoff = Math.min(backoff * 2, RECONNECT_MAX_MS);\n connect();\n }, backoff);\n };\n\n connect();\n\n return () => {\n alive = false;\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (socket) socket.close();\n };\n }, []);\n\n // Auto-scroll: stick to bottom unless user scrolled up. We track intent\n // via a ref and apply a single trailing scrollTop per frame so a burst of\n // batches doesn't cause repeated DOM thrash.\n const handleScroll = React.useCallback(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const atBottom =\n el.scrollHeight - (el.scrollTop + el.clientHeight) < 8;\n stickToBottomRef.current = atBottom;\n }, []);\n\n const scrollRafRef = React.useRef(0);\n React.useEffect(() => {\n if (!stickToBottomRef.current) return;\n if (scrollRafRef.current) return;\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = 0;\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n });\n }, [entries]);\n React.useEffect(\n () => () => {\n if (scrollRafRef.current) cancelAnimationFrame(scrollRafRef.current);\n },\n [],\n );\n\n const visible = React.useMemo(\n () => entries.filter((e) => filter[e.level]),\n [entries, filter],\n );\n\n const toggleFilter = React.useCallback(\n (k: LevelKey) => setFilter((f) => ({ ...f, [k]: !f[k] })),\n [],\n );\n\n // One stable handler shared by every row. Each row tags itself via\n // `data-row-id`; click events bubble up to the <ul> where we read the id.\n // Avoids per-row closures that would break React.memo on LogRow.\n const onRowClick = React.useCallback((e: React.MouseEvent) => {\n let el: HTMLElement | null = e.target as HTMLElement;\n while (el && el !== e.currentTarget) {\n const id = el.dataset.rowId;\n if (id) {\n const n = Number(id);\n if (Number.isFinite(n)) {\n setExpanded((prev) => ({ ...prev, [n]: !prev[n] }));\n }\n return;\n }\n el = el.parentElement;\n }\n }, []);\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex h-7 shrink-0 items-center gap-1 border-b border-border bg-background px-1.5 select-none\">\n <ToolbarButton\n aria-label={paused ? \"Resume\" : \"Pause\"}\n onClick={() => setPaused((p) => !p)}\n >\n {paused ? (\n <Play className=\"size-3.5\" />\n ) : (\n <Pause className=\"size-3.5\" />\n )}\n </ToolbarButton>\n <ToolbarButton\n aria-label=\"Clear\"\n onClick={() => {\n setEntries([]);\n setExpanded({});\n }}\n >\n <Trash2 className=\"size-3.5\" />\n </ToolbarButton>\n <div className=\"mx-1 h-3 w-px bg-border/60\" />\n {([\"info\", \"warn\", \"error\", \"plain\"] as LevelKey[]).map((k) => (\n <FilterChip\n key={k}\n label={k}\n active={filter[k]}\n level={k}\n onClick={() => toggleFilter(k)}\n />\n ))}\n <div className=\"flex-1\" />\n <span className=\"text-[11px] text-muted-foreground tabular-nums\">\n {visible.length} / {entries.length}\n </span>\n </div>\n\n <div\n ref={scrollerRef}\n onScroll={handleScroll}\n style={{ overflowAnchor: \"none\" }}\n className=\"min-h-0 flex-1 overflow-auto font-mono text-[11px] leading-[1.45]\"\n >\n {visible.length === 0 ? (\n <div className=\"p-3 text-muted-foreground\">\n Waiting for console output\u2026\n </div>\n ) : (\n <ul onClick={onRowClick}>\n {visible.map((e) => (\n <LogRow\n key={e.id}\n entry={e}\n expanded={!!expanded[e.id]}\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n};\n\nconst ToolbarButton: React.FC<\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = ({ className, children, ...rest }) => (\n <button\n type=\"button\"\n className={cn(\n \"grid size-5 place-items-center rounded-md text-foreground outline-none hover:bg-accent hover:text-accent-foreground\",\n className,\n )}\n {...rest}\n >\n {children}\n </button>\n);\n\nconst FilterChip: React.FC<{\n label: string;\n level: LevelKey;\n active: boolean;\n onClick: () => void;\n}> = ({ label, level, active, onClick }) => (\n <button\n type=\"button\"\n onClick={onClick}\n data-active={active}\n className={cn(\n \"h-5 rounded-md border px-1.5 text-[11px] leading-none transition-colors\",\n \"data-[active=false]:opacity-40 data-[active=false]:hover:opacity-70\",\n LEVEL_BADGE[level],\n )}\n >\n {label}\n </button>\n);\n\ntype LogRowProps = {\n entry: LogEntry;\n expanded: boolean;\n};\n\nconst _LogRow: React.FC<LogRowProps> = ({ entry, expanded }) => {\n if (entry.level === \"plain\" || !entry.parsed) {\n return (\n <li\n className=\"border-b border-border/30 px-2 py-0.5 text-zinc-400 whitespace-pre-wrap break-words\"\n style={{ contain: \"content\" }}\n >\n {entry.raw}\n </li>\n );\n }\n\n const p = entry.parsed;\n const hasStack = Array.isArray(p.stack) && p.stack.length > 0;\n\n return (\n <li\n className=\"border-b border-border/30\"\n style={{ contain: \"content\" }}\n data-row-id={hasStack ? entry.id : undefined}\n >\n <div\n className={cn(\n \"flex items-start gap-1.5 px-2 py-0.5\",\n hasStack && \"cursor-pointer hover:bg-accent/30\",\n )}\n >\n {hasStack ? (\n <ChevronRight\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n expanded && \"rotate-90\",\n )}\n />\n ) : (\n <span className=\"inline-block size-3 shrink-0\" />\n )}\n <span\n className={cn(\n \"shrink-0 rounded border px-1 text-[10px] font-medium uppercase tracking-wide\",\n LEVEL_BADGE[entry.level],\n )}\n >\n {entry.level}\n </span>\n {p.ts && (\n <span className=\"shrink-0 text-zinc-500 tabular-nums\">\n {p.ts}\n </span>\n )}\n <span className=\"break-words text-zinc-200\">{p.msg ?? entry.raw}</span>\n </div>\n {hasStack && expanded && (\n <ul className=\"border-t border-border/20 bg-accent/10 px-7 py-1\">\n {p.stack!.map((f, i) => (\n <li\n key={i}\n className=\"text-zinc-400 whitespace-pre-wrap break-words\"\n >\n <span className=\"text-zinc-300\">{f.proc || \"<anon>\"}</span>\n <span className=\"text-zinc-500\"> @ </span>\n <span>{f.file}</span>\n <span className=\"text-zinc-500\">:</span>\n <span className=\"tabular-nums text-zinc-300\">{f.line}</span>\n </li>\n ))}\n </ul>\n )}\n </li>\n );\n};\n\n// Memoize per-row so a streaming batch (which replaces `entries` with a new\n// array reference) doesn't force every visible row to reconcile. Entry\n// objects are stable across batches once added, so reference-equality on\n// `entry` plus a primitive `expanded` is sufficient.\nconst LogRow = React.memo(\n _LogRow,\n (prev, next) =>\n prev.entry === next.entry && prev.expanded === next.expanded,\n);\n\nexport default ConsoleTab;\n", "import React from \"react\";\n\n// explicit goals:\n// * Detailed tracking of all requests coming in and out of the console.\n// * We need some sort of event listening on the api client / server side routes?\n\nconst NetworkTab: React.FC = () => {\n return (\n <div className=\"p-3 text-muted-foreground\">Network placeholder</div>\n );\n};\n\nexport default NetworkTab;\n", "import React from \"react\";\nimport { Network, Table2 } from \"lucide-react\";\nimport { useLiveBulkRegistry, type BulkEntity } from \"../../hooks/use-cartridge-info\";\nimport { BulkStreamProvider } from \"../../hooks/use-bulk-stream\";\nimport { useDevTools } from \"./devtools-context\";\nimport DataTable from \"./data-browser/data-table\";\nimport { DiagramView } from \"./entity-graph/diagram-tab\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from \"../ui/sheet\";\nimport { cn } from \"../../lib/utils\";\n\nconst DataTab: React.FC = () => {\n const { dataCart, setDataCart, dataEntity, setDataEntity } = useDevTools();\n const [detail, setDetail] = React.useState<Record<string, string> | null>(null);\n const [view, setView] = React.useState<\"table\" | \"diagram\">(\"table\");\n const { registry, carts, loading, error } = useLiveBulkRegistry();\n\n const activeCart = dataCart && registry[dataCart] ? dataCart : carts[0] ?? null;\n const entities: readonly BulkEntity[] = activeCart ? registry[activeCart] ?? [] : [];\n const activeEntity =\n entities.find((e) => e.name === dataEntity) ?? entities[0] ?? null;\n\n // First-time defaults / fixup when the persisted cart vanished.\n React.useEffect(() => {\n if (activeCart && activeCart !== dataCart) setDataCart(activeCart);\n if (activeEntity && activeEntity.name !== dataEntity) setDataEntity(activeEntity.name);\n }, [activeCart, activeEntity, dataCart, dataEntity, setDataCart, setDataEntity]);\n\n if (carts.length === 0) {\n let msg = \"No installed cartridges with entities.\";\n if (loading) msg = \"Loading cartridges\u2026\";\n else if (error) msg = `Failed to load cartridges: ${error}`;\n return <div className=\"p-3 text-[12px] text-muted-foreground\">{msg}</div>;\n }\n\n return (\n <BulkStreamProvider registry={registry}>\n <div className=\"flex h-full flex-col\">\n <div className=\"flex h-7 shrink-0 items-center gap-1 overflow-x-auto border-b border-border bg-background px-1 select-none\">\n <div className=\"flex shrink-0 items-center gap-0.5 pr-1\">\n <ViewBtn active={view === \"table\"} onClick={() => setView(\"table\")} label=\"Table\">\n <Table2 className=\"size-3\" />\n </ViewBtn>\n <ViewBtn active={view === \"diagram\"} onClick={() => setView(\"diagram\")} label=\"Graph\">\n <Network className=\"size-3\" />\n </ViewBtn>\n </div>\n {view === \"table\" ? (\n <>\n <div className=\"h-4 w-px shrink-0 bg-border\" />\n {carts.map((cart) => {\n const isActive = cart === activeCart;\n return (\n <button\n key={cart}\n type=\"button\"\n data-active={isActive}\n onClick={() => {\n setDataCart(cart);\n const first = registry[cart]?.[0];\n setDataEntity(first ? first.name : null);\n }}\n className={cn(\n \"h-5 shrink-0 rounded-full px-2.5 text-[11px] leading-none outline-none transition-colors\",\n \"border border-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n \"data-[active=true]:border-border data-[active=true]:bg-accent data-[active=true]:text-accent-foreground\",\n )}\n >\n {cart}\n </button>\n );\n })}\n </>\n ) : null}\n </div>\n\n {view === \"diagram\" ? (\n <div className=\"min-h-0 flex-1\">\n <DiagramView />\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex w-44 shrink-0 flex-col overflow-y-auto border-r border-border bg-muted/10 py-1\">\n {entities.length === 0 ? (\n <div className=\"px-2 py-1 text-[11px] text-muted-foreground\">\n No entities\n </div>\n ) : (\n entities.map((e) => {\n const isActive = e.name === activeEntity?.name;\n return (\n <button\n key={e.name}\n type=\"button\"\n data-active={isActive}\n onClick={() => setDataEntity(e.name)}\n className={cn(\n \"h-6 shrink-0 text-left px-2 text-[12px] leading-none outline-none transition-colors\",\n \"text-foreground hover:bg-accent hover:text-accent-foreground\",\n \"data-[active=true]:bg-accent data-[active=true]:text-accent-foreground\",\n )}\n >\n {e.name}\n </button>\n );\n })\n )}\n </div>\n\n <div className=\"min-h-0 flex-1\">\n {activeEntity ? (\n <DataTable\n key={`${activeCart}:${activeEntity.name}`}\n cart={activeCart!}\n entity={activeEntity.name}\n searchFields={activeEntity.searchFields}\n onSelectRow={(row) => setDetail(row)}\n />\n ) : (\n <div className=\"p-3 text-[12px] text-muted-foreground\">\n Pick an entity.\n </div>\n )}\n </div>\n </div>\n )}\n\n <Sheet open={!!detail} onOpenChange={(o) => !o && setDetail(null)}>\n <SheetContent side=\"right\" className=\"w-[480px] sm:max-w-[480px]\">\n <SheetHeader>\n <SheetTitle className=\"text-[13px]\">\n {activeCart}.{activeEntity?.name}\n {detail?.id ? (\n <span className=\"ml-2 font-mono text-[11px] text-muted-foreground\">\n {detail.id}\n </span>\n ) : null}\n </SheetTitle>\n <SheetDescription className=\"text-[11px]\">\n Row detail\n </SheetDescription>\n </SheetHeader>\n <div className=\"min-h-0 flex-1 overflow-auto px-4 pb-4\">\n {detail ? (\n <table className=\"w-full text-[12px]\">\n <tbody>\n {Object.entries(detail).map(([k, v]) => (\n <tr key={k} className=\"border-b border-border/40 align-top\">\n <td className=\"w-32 py-1 pr-2 font-mono text-[11px] text-muted-foreground\">\n {k}\n </td>\n <td className=\"break-all py-1 font-mono\">{v || <span className=\"text-muted-foreground/60\">\u2205</span>}</td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : null}\n </div>\n </SheetContent>\n </Sheet>\n </div>\n </BulkStreamProvider>\n );\n};\n\nconst ViewBtn: React.FC<{\n active: boolean;\n onClick: () => void;\n label: string;\n children: React.ReactNode;\n}> = ({ active, onClick, label, children }) => (\n <button\n type=\"button\"\n data-active={active}\n onClick={onClick}\n title={label}\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-md px-1.5 text-[11px] leading-none outline-none transition-colors\",\n \"text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n \"data-[active=true]:bg-accent data-[active=true]:text-accent-foreground\",\n )}\n >\n {children}\n {label}\n </button>\n);\n\nexport default DataTab;\n", "import { useEffect, useState } from \"react\";\nimport { useDevToolsConfig } from \"../config\";\n\n// Live cartridge/entity registry for the Data tab. Instead of the build-time\n// `BULK_REGISTRY` (every cart in the repo, generated by `nbt generate`), we\n// read the daemon's `/_console/contracts` \u2014 which only lists *running*\n// cartridges and carries each entity's `searchFields`. Bulk WS routes are\n// derived live (`/_ws/bulk/<cart>/<entity-lower>`) and fed straight into\n// useBulkStream. So the tab reflects what is actually installed right now.\n\nexport type BulkEntity = {\n name: string;\n route: string;\n searchFields: readonly string[];\n};\nexport type BulkRegistry = Record<string, BulkEntity[]>;\n\ntype Contract = {\n cartridge?: string;\n owns?: Record<string, { searchFields?: string[] }>;\n};\n\nfunction buildRegistry(contracts: Contract[]): BulkRegistry {\n const reg: BulkRegistry = {};\n for (const c of contracts) {\n const cart = c.cartridge;\n if (!cart || !c.owns) continue;\n const entities: BulkEntity[] = [];\n for (const [name, ent] of Object.entries(c.owns)) {\n const sf = Array.isArray(ent?.searchFields) ? ent.searchFields : [];\n entities.push({\n name,\n route: `/_ws/bulk/${cart}/${name.toLowerCase()}`,\n searchFields: sf,\n });\n }\n if (entities.length > 0) reg[cart] = entities;\n }\n return reg;\n}\n\nexport type LiveRegistryState = {\n registry: BulkRegistry;\n carts: string[];\n loading: boolean;\n error: string | null;\n};\n\nexport function useLiveBulkRegistry(): LiveRegistryState {\n const { apiBaseUrl } = useDevToolsConfig();\n const [registry, setRegistry] = useState<BulkRegistry>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const ac = new AbortController();\n let cancelled = false;\n (async () => {\n try {\n const r = await fetch(`${apiBaseUrl}/_console/contracts`, {\n signal: ac.signal,\n credentials: \"include\",\n });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n const data = (await r.json()) as Contract[];\n if (!Array.isArray(data)) throw new Error(\"malformed contracts response\");\n if (cancelled) return;\n setRegistry(buildRegistry(data));\n } catch (e) {\n if (cancelled || (e as { name?: string }).name === \"AbortError\") return;\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n ac.abort();\n };\n }, []);\n\n const carts = Object.keys(registry).sort();\n return { registry, carts, loading, error };\n}\n", "import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { BulkDataStore } from \"../components/devtools/data-browser/data-store\";\nimport {\n getFrameType,\n getFrameSid,\n parseSchema,\n parseDataChunk,\n parseDelta,\n parseError,\n encodeSchemaCmd,\n encodeStreamCmd,\n encodeSearchCmd,\n encodeClearSearchCmd,\n} from \"../components/devtools/data-browser/bulk-decoder\";\nimport {\n FRAME_SCHEMA,\n FRAME_DATA,\n FRAME_DATA_END,\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n FRAME_DELTA_DEL,\n FRAME_SEARCH_RESULT,\n FRAME_SEARCH_END,\n FRAME_ERROR,\n type ColumnDef,\n} from \"../generated/bulk-protocol\";\nimport type { BulkRegistry } from \"./use-cartridge-info\";\nimport { useDevToolsConfig, wsBaseFrom } from \"../config\";\n\n// One per-entity table view, demultiplexed off the shared socket by sid. The\n// object is stable across renders and mutated in place; consumers re-render via\n// the listener set (and the cheap per-chunk onRender for virtualization).\ntype View = {\n sid: number;\n cart: string;\n entity: string;\n store: BulkDataStore;\n columns: ColumnDef[];\n totalRows: number;\n loadedRows: number;\n streaming: boolean;\n error: string | null;\n streamRequested: boolean; // sent a `sub` (full stream) at least once\n searchStreaming: boolean;\n onRender: (() => void) | null;\n listeners: Set<() => void>;\n};\n\nexport type BulkSubscription = {\n store: BulkDataStore;\n connected: boolean;\n streaming: boolean;\n error: string | null;\n columns: ColumnDef[];\n totalRows: number;\n loadedRows: number;\n search: (q: string) => void;\n clearSearch: () => void;\n setOnRender: (fn: (() => void) | null) => void;\n};\n\ntype Ctx = {\n getView: (cart: string, entity: string) => View;\n ensureStreamed: (view: View) => void;\n search: (view: View, query: string) => void;\n clearSearch: (view: View) => void;\n subscribe: (view: View, cb: () => void) => () => void;\n connected: boolean;\n error: string | null;\n};\n\nconst BulkStreamContext = createContext<Ctx | null>(null);\n\nfunction base64UrlEncode(value: string): string {\n if (typeof btoa === \"function\") {\n return btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n }\n throw new Error(\"No base64 encoder available for bulk WS auth\");\n}\n\nfunction bulkAuthProtocols(token: string): string[] {\n return [\"nimbit-bulk\", `auth-${base64UrlEncode(token)}`];\n}\n\nlet _wsTokenCache: { token: string; at: number } | null = null;\nconst WS_TOKEN_TTL_MS = 60_000;\n\n// The console doesn't mint /auth/ws-token (that's the portal BFF); the inspector\n// talks to the daemon directly, so we read the session bearer from\n// auth.Session.current and forward it in the WS subprotocol.\nasync function fetchWsToken(\n signal: AbortSignal,\n apiBaseUrl: string,\n): Promise<string | null> {\n const now = Date.now();\n if (_wsTokenCache && now - _wsTokenCache.at < WS_TOKEN_TTL_MS) {\n return _wsTokenCache.token;\n }\n const r = await fetch(`${apiBaseUrl}/api/auth/session/current`, {\n method: \"POST\",\n signal,\n credentials: \"include\",\n headers: { \"content-type\": \"application/json\" },\n });\n if (!r.ok) return null;\n const j = (await r.json()) as { session?: { token?: string } };\n const token = j.session?.token;\n if (!token) return null;\n _wsTokenCache = { token, at: now };\n return token;\n}\n\nfunction invalidateWsToken() {\n _wsTokenCache = null;\n}\n\nfunction notify(view: View) {\n view.listeners.forEach((cb) => cb());\n}\n\ntype Props = { registry: BulkRegistry; children: React.ReactNode };\n\nexport function BulkStreamProvider({ registry, children }: Props): React.ReactElement {\n const { apiBaseUrl } = useDevToolsConfig();\n const wsRef = useRef<WebSocket | null>(null);\n const sendQueueRef = useRef<string[]>([]);\n const sidCounterRef = useRef(1);\n const viewsBySidRef = useRef<Map<number, View>>(new Map());\n const viewsByKeyRef = useRef<Map<string, View>>(new Map());\n const preloadedRef = useRef(false);\n\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendCmd = (cmd: string) => {\n const ws = wsRef.current;\n if (ws && ws.readyState === WebSocket.OPEN) ws.send(cmd);\n else sendQueueRef.current.push(cmd);\n };\n\n const flushQueue = () => {\n const ws = wsRef.current;\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n const q = sendQueueRef.current;\n sendQueueRef.current = [];\n for (const cmd of q) ws.send(cmd);\n };\n\n const getView = (cart: string, entity: string): View => {\n // The server registers entity ops under \"<cart>/<entity-lower>\" (route\n // path casing), so normalize here \u2014 preload and subscription then share one\n // view per entity regardless of the caller's casing.\n const entLower = entity.toLowerCase();\n const key = `${cart}/${entLower}`;\n const existing = viewsByKeyRef.current.get(key);\n if (existing) return existing;\n const sid = sidCounterRef.current++;\n const view: View = {\n sid,\n cart,\n entity: entLower,\n store: new BulkDataStore(),\n columns: [],\n totalRows: 0,\n loadedRows: 0,\n streaming: false,\n error: null,\n streamRequested: false,\n searchStreaming: false,\n onRender: null,\n listeners: new Set(),\n };\n viewsByKeyRef.current.set(key, view);\n viewsBySidRef.current.set(sid, view);\n return view;\n };\n\n const ensureStreamed = (view: View) => {\n if (view.streamRequested) return;\n view.streamRequested = true;\n sendCmd(encodeStreamCmd(view.sid, view.cart, view.entity));\n };\n\n const handleMessage = (ev: MessageEvent) => {\n const buf = ev.data as ArrayBuffer;\n const sid = getFrameSid(buf);\n const view = viewsBySidRef.current.get(sid);\n if (!view) return;\n const ft = getFrameType(buf);\n const store = view.store;\n switch (ft) {\n case FRAME_SCHEMA: {\n const schema = parseSchema(buf);\n if (view.searchStreaming) store.enterSearch(schema);\n else store.applySchema(schema);\n view.columns = schema.columns;\n view.totalRows = schema.totalRows;\n view.loadedRows = 0;\n view.streaming = true;\n notify(view);\n break;\n }\n case FRAME_DATA:\n case FRAME_SEARCH_RESULT: {\n const rows = parseDataChunk(buf, store.columns);\n store.appendChunk(rows);\n view.loadedRows = store.getRowCount();\n view.onRender?.();\n break;\n }\n case FRAME_DATA_END:\n view.streaming = false;\n notify(view);\n break;\n case FRAME_SEARCH_END:\n view.searchStreaming = false;\n view.streaming = false;\n notify(view);\n break;\n case FRAME_DELTA_INS:\n case FRAME_DELTA_UPD:\n case FRAME_DELTA_DEL: {\n const delta = parseDelta(buf, store.columns);\n store.applyDelta(delta);\n view.totalRows = store.totalRows;\n view.loadedRows = store.getRowCount();\n view.onRender?.();\n notify(view);\n break;\n }\n case FRAME_ERROR:\n view.error = parseError(buf);\n view.streaming = false;\n notify(view);\n break;\n }\n };\n\n // Open one shared socket for the provider's lifetime.\n useEffect(() => {\n const ac = new AbortController();\n let cancelled = false;\n let opened = false;\n let ws: WebSocket | null = null;\n setError(null);\n\n (async () => {\n let token: string | null = null;\n try {\n token = await fetchWsToken(ac.signal, apiBaseUrl);\n } catch {\n if (!cancelled) setError(\"Failed to obtain WS session token\");\n return;\n }\n if (cancelled) return;\n if (!token) {\n setError(\"No session \u2014 sign in to view data\");\n return;\n }\n ws = new WebSocket(`${wsBaseFrom(apiBaseUrl)}/_ws/bulk`, bulkAuthProtocols(token));\n ws.binaryType = \"arraybuffer\";\n wsRef.current = ws;\n ws.onopen = () => {\n if (cancelled || wsRef.current !== ws) return;\n opened = true;\n setConnected(true);\n setError(null);\n flushQueue();\n };\n ws.onmessage = handleMessage;\n ws.onerror = () => {};\n ws.onclose = () => {\n if (cancelled || wsRef.current !== ws) return;\n setConnected(false);\n wsRef.current = null;\n if (!opened) {\n invalidateWsToken();\n setError(\"WebSocket connection closed\");\n }\n };\n })();\n\n return () => {\n cancelled = true;\n ac.abort();\n if (ws) {\n ws.onopen = ws.onmessage = ws.onerror = ws.onclose = null;\n try {\n ws.close();\n } catch {}\n if (wsRef.current === ws) wsRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Preload every entity's SCHEMA once connected + registry known, so columns\n // are ready before a tab is opened (no \"Waiting for schema\u2026\" flicker). Rows\n // stream lazily on first open via ensureStreamed.\n useEffect(() => {\n if (!connected) return;\n if (preloadedRef.current) return;\n const keys = Object.keys(registry);\n if (keys.length === 0) return;\n preloadedRef.current = true;\n for (const cart of keys) {\n for (const ent of registry[cart] ?? []) {\n const view = getView(cart, ent.name);\n sendCmd(encodeSchemaCmd(view.sid, view.cart, view.entity));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connected, registry]);\n\n const search = (view: View, query: string) => {\n if (!query) {\n view.store.exitSearch();\n view.totalRows = view.store.totalRows;\n view.loadedRows = view.store.getRowCount();\n sendCmd(encodeClearSearchCmd(view.sid));\n notify(view);\n view.onRender?.();\n return;\n }\n view.searchStreaming = true;\n sendCmd(encodeSearchCmd(view.sid, query));\n };\n\n const clearSearch = (view: View) => {\n view.store.exitSearch();\n view.totalRows = view.store.totalRows;\n view.loadedRows = view.store.getRowCount();\n sendCmd(encodeClearSearchCmd(view.sid));\n notify(view);\n view.onRender?.();\n };\n\n const subscribe = (view: View, cb: () => void) => {\n view.listeners.add(cb);\n return () => {\n view.listeners.delete(cb);\n };\n };\n\n const ctx: Ctx = {\n getView,\n ensureStreamed,\n search,\n clearSearch,\n subscribe,\n connected,\n error,\n };\n\n return React.createElement(BulkStreamContext.Provider, { value: ctx }, children);\n}\n\n// Row counts for every entity in the registry, sourced from the SCHEMA preload\n// the provider already runs on connect (FRAME_SCHEMA carries totalRows). No row\n// streaming is triggered \u2014 we subscribe to each view but never ensureStreamed.\n// Keyed by the graph id `cart:Entity` (original casing) for the Diagram tab.\nexport function useBulkRowCounts(registry: BulkRegistry): Record<string, number> {\n const ctx = useContext(BulkStreamContext);\n if (!ctx) throw new Error(\"useBulkRowCounts must be used within BulkStreamProvider\");\n const [, force] = useState(0);\n\n const pairs: Array<{ id: string; view: View }> = [];\n for (const cart of Object.keys(registry)) {\n for (const ent of registry[cart] ?? []) {\n pairs.push({ id: `${cart}:${ent.name}`, view: ctx.getView(cart, ent.name) });\n }\n }\n\n const key = pairs.map((p) => p.id).join(\"|\");\n useEffect(() => {\n const unsubs = pairs.map((p) => ctx.subscribe(p.view, () => force((n) => n + 1)));\n return () => unsubs.forEach((u) => u());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n\n const counts: Record<string, number> = {};\n for (const p of pairs) counts[p.id] = p.view.totalRows;\n return counts;\n}\n\n// Keyed to a single entity. The view (schema + rows + deltas) is shared and\n// cached in the provider, so switching tabs is instant once visited.\nexport function useBulkSubscription(cart: string, entity: string): BulkSubscription {\n const ctx = useContext(BulkStreamContext);\n if (!ctx) throw new Error(\"useBulkSubscription must be used within BulkStreamProvider\");\n\n const view = ctx.getView(cart, entity);\n const [, force] = useState(0);\n\n useEffect(() => {\n const unsub = ctx.subscribe(view, () => force((n) => n + 1));\n ctx.ensureStreamed(view);\n return unsub;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view]);\n\n return {\n store: view.store,\n connected: ctx.connected,\n streaming: view.streaming,\n error: view.error ?? ctx.error,\n columns: view.columns,\n totalRows: view.totalRows,\n loadedRows: view.loadedRows,\n search: (q: string) => ctx.search(view, q),\n clearSearch: () => ctx.clearSearch(view),\n setOnRender: (fn) => {\n view.onRender = fn;\n },\n };\n}\n", "// AUTO-GENERATED by inspector/scripts/gen-contracts.mjs \u2014 do not edit by hand.\n// Source: modules/nbt/codegen_ws_bulk.jai (WS_FRAME_* + ws_type_byte_for).\n\n// Frame types (first byte of each WS binary message).\nexport const FRAME_SCHEMA = 0x01;\nexport const FRAME_DATA = 0x02;\nexport const FRAME_DATA_END = 0x03;\nexport const FRAME_DELTA_INS = 0x04;\nexport const FRAME_DELTA_UPD = 0x05;\nexport const FRAME_DELTA_DEL = 0x06;\nexport const FRAME_SEARCH_RESULT = 0x07;\nexport const FRAME_SEARCH_END = 0x08;\nexport const FRAME_ERROR = 0xff;\n\n// Column type bytes (schema frame, per column).\nexport const TYPE_U8 = 0x01;\nexport const TYPE_U16 = 0x02;\nexport const TYPE_U32 = 0x03;\nexport const TYPE_U64 = 0x04;\nexport const TYPE_S8 = 0x05;\nexport const TYPE_S16 = 0x06;\nexport const TYPE_S32 = 0x07;\nexport const TYPE_S64 = 0x08;\nexport const TYPE_BOOL = 0x09;\nexport const TYPE_FLOAT32 = 0x0a;\nexport const TYPE_FLOAT64 = 0x0b;\nexport const TYPE_STRING = 0x0c;\nexport const TYPE_DATETIME = 0x0d;\nexport const TYPE_DOCUMENT = 0x0e;\n\nexport type ColumnDef = {\n name: string;\n type: number;\n fixedSize: number; // 0 for variable-width (string, document)\n};\n\nexport type SchemaFrame = {\n totalRows: number;\n columns: ColumnDef[];\n};\n\nexport type DeltaFrame = {\n op: number;\n rowData?: string[];\n id?: string; // DELETE carries the row id as a len-prefixed string\n};\n\nexport function fixedSizeForType(type: number): number {\n switch (type) {\n case TYPE_U8: return 1;\n case TYPE_U16: return 2;\n case TYPE_U32: return 4;\n case TYPE_U64: return 8;\n case TYPE_S8: return 1;\n case TYPE_S16: return 2;\n case TYPE_S32: return 4;\n case TYPE_S64: return 8;\n case TYPE_BOOL: return 1;\n case TYPE_FLOAT32: return 4;\n case TYPE_FLOAT64: return 8;\n case TYPE_STRING: return 0;\n case TYPE_DATETIME: return 8;\n case TYPE_DOCUMENT: return 0;\n default: return 0;\n }\n}\n", "import {\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n FRAME_DELTA_DEL,\n type ColumnDef,\n type SchemaFrame,\n type DeltaFrame,\n} from \"../../../generated/bulk-protocol\";\n\nexport class BulkDataStore {\n columns: ColumnDef[] = [];\n rows: string[][] = [];\n totalRows = 0;\n searchActive = false;\n\n private _fullRows: string[][] = [];\n private _fullTotalRows = 0;\n private _idColIndex = -1;\n\n applySchema(schema: SchemaFrame): void {\n this.columns = schema.columns;\n this.totalRows = schema.totalRows;\n this.rows = [];\n this._idColIndex = schema.columns.findIndex((c) => c.name === \"id\");\n }\n\n appendChunk(chunk: string[][]): void {\n for (let i = 0; i < chunk.length; i++) this.rows.push(chunk[i]!);\n }\n\n applyDelta(delta: DeltaFrame): void {\n const target = this.searchActive ? this._fullRows : this.rows;\n if (delta.op === FRAME_DELTA_INS && delta.rowData) {\n target.push(delta.rowData);\n if (this.searchActive) this._fullTotalRows++;\n else this.totalRows++;\n return;\n }\n if (delta.op === FRAME_DELTA_UPD && delta.rowData) {\n const idx = this._findRowById(target, delta.rowData);\n if (idx >= 0) target[idx] = delta.rowData;\n return;\n }\n if (delta.op === FRAME_DELTA_DEL && delta.id !== undefined) {\n const idStr = String(delta.id);\n const idx = this._findRowByIdStr(target, idStr);\n if (idx >= 0) {\n target.splice(idx, 1);\n if (this.searchActive) this._fullTotalRows--;\n else this.totalRows--;\n }\n return;\n }\n }\n\n enterSearch(schema: SchemaFrame): void {\n if (!this.searchActive) {\n this._fullRows = this.rows;\n this._fullTotalRows = this.totalRows;\n }\n this.searchActive = true;\n this.columns = schema.columns;\n this.totalRows = schema.totalRows;\n this.rows = [];\n }\n\n exitSearch(): void {\n if (!this.searchActive) return;\n this.rows = this._fullRows;\n this.totalRows = this._fullTotalRows;\n this._fullRows = [];\n this._fullTotalRows = 0;\n this.searchActive = false;\n }\n\n getRowCount(): number {\n return this.rows.length;\n }\n\n private _findRowById(rows: string[][], rowData: string[]): number {\n if (this._idColIndex < 0) return -1;\n const id = rowData[this._idColIndex];\n for (let i = 0; i < rows.length; i++) {\n if (rows[i]![this._idColIndex] === id) return i;\n }\n return -1;\n }\n\n private _findRowByIdStr(rows: string[][], idStr: string): number {\n if (this._idColIndex < 0) return -1;\n for (let i = 0; i < rows.length; i++) {\n if (rows[i]![this._idColIndex] === idStr) return i;\n }\n return -1;\n }\n}\n", "// Wire-format decoders + client\u2192server command encoders for the multiplexed\n// bulk WS protocol. Frame opcodes and column-type bytes live in\n// @/generated/bulk-protocol (autogen'd from modules/nbt/codegen_ws_bulk.jai).\n//\n// Every server\u2192client binary frame is [op:u8][sid:u16 LE][payload]. The sid is\n// the client-chosen subscription id; one socket multiplexes many entities, and\n// the provider routes each frame to the matching view by sid (getFrameSid).\n// Only the parse/encode bodies are hand-maintained here.\n\nimport {\n FRAME_SCHEMA,\n FRAME_DATA,\n FRAME_SEARCH_RESULT,\n FRAME_DELTA_DEL,\n FRAME_DELTA_INS,\n FRAME_DELTA_UPD,\n TYPE_U8,\n TYPE_S8,\n TYPE_BOOL,\n TYPE_U16,\n TYPE_S16,\n TYPE_U32,\n TYPE_S32,\n TYPE_FLOAT32,\n TYPE_U64,\n TYPE_S64,\n TYPE_FLOAT64,\n TYPE_DATETIME,\n TYPE_STRING,\n TYPE_DOCUMENT,\n fixedSizeForType,\n type ColumnDef,\n type SchemaFrame,\n type DeltaFrame,\n} from \"../../../generated/bulk-protocol\";\n\nconst textDecoder = new TextDecoder();\n\n// Bytes between the op byte and the frame payload: the u16 LE subscription id.\nconst SID_BYTES = 2;\n// Offset of the payload in every server\u2192client frame (op + sid).\nconst HEAD = 1 + SID_BYTES;\n\nfunction epochToDate(epoch: number): Date {\n const abs = Math.abs(epoch);\n if (abs < 10_000_000_000) return new Date(epoch * 1000);\n if (abs < 10_000_000_000_000) return new Date(epoch);\n if (abs < 10_000_000_000_000_000) return new Date(epoch / 1000);\n return new Date(epoch / 1_000_000);\n}\n\nfunction formatCellValue(view: DataView, offset: number, col: ColumnDef): [string, number] {\n switch (col.type) {\n case TYPE_U8: return [String(view.getUint8(offset)), 1];\n case TYPE_S8: return [String(view.getInt8(offset)), 1];\n case TYPE_BOOL: return [view.getUint8(offset) ? \"true\" : \"false\", 1];\n case TYPE_U16: return [String(view.getUint16(offset, true)), 2];\n case TYPE_S16: return [String(view.getInt16(offset, true)), 2];\n case TYPE_U32: return [String(view.getUint32(offset, true)), 4];\n case TYPE_S32: return [String(view.getInt32(offset, true)), 4];\n case TYPE_FLOAT32: return [String(view.getFloat32(offset, true)), 4];\n case TYPE_U64: return [String(view.getBigUint64(offset, true)), 8];\n case TYPE_S64: return [String(view.getBigInt64(offset, true)), 8];\n case TYPE_FLOAT64: return [String(view.getFloat64(offset, true)), 8];\n case TYPE_DATETIME: {\n const epoch = Number(view.getBigInt64(offset, true));\n if (epoch === 0) return [\"\", 8];\n return [epochToDate(epoch).toISOString(), 8];\n }\n case TYPE_STRING:\n case TYPE_DOCUMENT: {\n const len = view.getUint32(offset, true);\n const bytes = new Uint8Array(view.buffer, view.byteOffset + offset + 4, len);\n return [textDecoder.decode(bytes), 4 + len];\n }\n default:\n return [\"\", 0];\n }\n}\n\nexport function getFrameType(buf: ArrayBuffer): number {\n return new DataView(buf).getUint8(0);\n}\n\n// The subscription id this frame belongs to (u16 LE right after the op byte).\nexport function getFrameSid(buf: ArrayBuffer): number {\n return new DataView(buf).getUint16(1, true);\n}\n\nexport function parseSchema(buf: ArrayBuffer): SchemaFrame {\n const view = new DataView(buf);\n let offset = 0;\n const frameType = view.getUint8(offset); offset += 1;\n if (frameType !== FRAME_SCHEMA) {\n throw new Error(`Expected SCHEMA frame (0x01), got 0x${frameType.toString(16)}`);\n }\n offset += SID_BYTES;\n const totalRows = view.getUint32(offset, true); offset += 4;\n const columnCount = view.getUint16(offset, true); offset += 2;\n const columns: ColumnDef[] = [];\n for (let i = 0; i < columnCount; i++) {\n const type = view.getUint8(offset); offset += 1;\n const nameLen = view.getUint16(offset, true); offset += 2;\n const nameBytes = new Uint8Array(buf, offset, nameLen);\n const name = textDecoder.decode(nameBytes);\n offset += nameLen;\n columns.push({ name, type, fixedSize: fixedSizeForType(type) });\n }\n return { totalRows, columns };\n}\n\nexport function parseDataChunk(buf: ArrayBuffer, columns: ColumnDef[]): string[][] {\n const view = new DataView(buf);\n let offset = 0;\n const frameType = view.getUint8(offset); offset += 1;\n if (frameType !== FRAME_DATA && frameType !== FRAME_SEARCH_RESULT) {\n throw new Error(`Expected DATA/SEARCH_RESULT frame, got 0x${frameType.toString(16)}`);\n }\n offset += SID_BYTES;\n const rowCount = view.getUint16(offset, true); offset += 2;\n const rows: string[][] = [];\n for (let r = 0; r < rowCount; r++) {\n const row: string[] = [];\n for (let c = 0; c < columns.length; c++) {\n const [value, bytesRead] = formatCellValue(view, offset, columns[c]!);\n row.push(value);\n offset += bytesRead;\n }\n rows.push(row);\n }\n return rows;\n}\n\nexport function parseDelta(buf: ArrayBuffer, columns: ColumnDef[]): DeltaFrame {\n const view = new DataView(buf);\n let offset = 0;\n const op = view.getUint8(offset); offset += 1;\n offset += SID_BYTES;\n if (op === FRAME_DELTA_DEL) {\n // [id_len:u16 LE][id_bytes] \u2014 the row id is a string (ULID), not an int.\n const len = view.getUint16(offset, true); offset += 2;\n const bytes = new Uint8Array(buf, offset, len);\n return { op, id: textDecoder.decode(bytes) };\n }\n if (op === FRAME_DELTA_INS || op === FRAME_DELTA_UPD) {\n const rowData: string[] = [];\n for (let c = 0; c < columns.length; c++) {\n const [value, bytesRead] = formatCellValue(view, offset, columns[c]!);\n rowData.push(value);\n offset += bytesRead;\n }\n return { op, rowData };\n }\n throw new Error(`Unknown delta op 0x${op.toString(16)}`);\n}\n\nexport function parseError(buf: ArrayBuffer): string {\n const view = new DataView(buf);\n // [0xFF][sid:u16][msg_len:u16 LE][msg_bytes]\n const len = view.getUint16(HEAD, true);\n const bytes = new Uint8Array(buf, HEAD + 2, len);\n return textDecoder.decode(bytes);\n}\n\n// --- client \u2192 server command encoders ---\n// Each command carries the subscription id; sub/schema also name the target.\n\nexport function encodeSchemaCmd(sid: number, cart: string, entity: string): string {\n return JSON.stringify({ cmd: \"schema\", sid, cart, entity });\n}\n\nexport function encodeStreamCmd(\n sid: number,\n cart: string,\n entity: string,\n opts?: { sort?: string; sort_desc?: boolean; filters?: Record<string, string> },\n): string {\n return JSON.stringify({ cmd: \"sub\", sid, cart, entity, ...opts });\n}\n\nexport function encodeSearchCmd(sid: number, query: string): string {\n return JSON.stringify({ cmd: \"search\", sid, q: query });\n}\n\nexport function encodeUnsubCmd(sid: number): string {\n return JSON.stringify({ cmd: \"unsub\", sid });\n}\n\nexport function encodeClearSearchCmd(sid: number): string {\n // Server-side no-op (the client restores the cached full set); sent for symmetry.\n return JSON.stringify({ cmd: \"clear_search\", sid });\n}\n", "import React from \"react\";\nimport { useBulkSubscription } from \"../../../hooks/use-bulk-stream\";\nimport { cn } from \"../../../lib/utils\";\n\nconst ROW_H = 22;\nconst OVERSCAN = 6;\nconst MIN_COL_W = 80;\n\ntype DataTableProps = {\n cart: string;\n entity: string;\n searchFields: readonly string[];\n onSelectRow: (rowJson: Record<string, string>) => void;\n};\n\nfunction colWidth(name: string): number {\n if (name === \"id\") return 220;\n if (name === \"createdAt\" || name === \"updatedAt\") return 180;\n if (name === \"email\" || name === \"phone\") return 180;\n if (name.endsWith(\"At\")) return 180;\n return Math.max(MIN_COL_W, Math.min(240, name.length * 9 + 24));\n}\n\nconst DataTable: React.FC<DataTableProps> = ({ cart, entity, searchFields, onSelectRow }) => {\n const stream = useBulkSubscription(cart, entity);\n const scrollerRef = React.useRef<HTMLDivElement | null>(null);\n const [scrollTop, setScrollTop] = React.useState(0);\n const [viewportH, setViewportH] = React.useState(0);\n const [query, setQuery] = React.useState(\"\");\n // Bump on every chunk arrival without re-rendering each FRAME_DATA.\n const [tick, setTick] = React.useState(0);\n\n React.useEffect(() => {\n stream.setOnRender(() => setTick((n) => n + 1));\n return () => stream.setOnRender(null);\n }, [stream]);\n\n React.useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const ro = new ResizeObserver(() => setViewportH(el.clientHeight));\n ro.observe(el);\n setViewportH(el.clientHeight);\n return () => ro.disconnect();\n }, []);\n\n const rows = stream.store.rows;\n const columns = stream.columns;\n\n const totalH = rows.length * ROW_H;\n const start = Math.max(0, Math.floor(scrollTop / ROW_H) - OVERSCAN);\n const visibleCount = Math.max(0, Math.ceil(viewportH / ROW_H) + OVERSCAN * 2);\n const end = Math.min(rows.length, start + visibleCount);\n\n const onSearchKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n stream.search(query.trim());\n } else if (e.key === \"Escape\") {\n setQuery(\"\");\n stream.clearSearch();\n }\n };\n\n const handleRowClick = (rowIdx: number) => {\n const r = rows[rowIdx];\n if (!r) return;\n const out: Record<string, string> = {};\n for (let i = 0; i < columns.length; i++) out[columns[i]!.name] = r[i] ?? \"\";\n onSelectRow(out);\n };\n\n const searchDisabled = searchFields.length === 0;\n const totalColW = columns.reduce((s, c) => s + colWidth(c.name), 0);\n\n return (\n <div className=\"flex h-full flex-col bg-background\">\n <div className=\"flex h-7 shrink-0 items-center gap-2 border-b border-border px-2\">\n <input\n type=\"text\"\n value={query}\n disabled={searchDisabled}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKey}\n placeholder={\n searchDisabled\n ? \"Search disabled (no @@search declared)\"\n : `Search ${searchFields.join(\", \")} \u23CE`\n }\n className={cn(\n \"h-5 flex-1 rounded-sm border border-border bg-background px-2 text-[12px] outline-none\",\n \"placeholder:text-muted-foreground/70 focus:border-accent-foreground/30\",\n searchDisabled && \"opacity-50 cursor-not-allowed\",\n )}\n />\n <div className=\"shrink-0 text-[11px] text-muted-foreground tabular-nums\">\n {stream.error ? (\n <span className=\"text-red-400\">{stream.error}</span>\n ) : !stream.connected ? (\n <span>connecting\u2026</span>\n ) : (\n <span>\n {stream.loadedRows.toLocaleString()} / {stream.totalRows.toLocaleString()} rows\n {stream.streaming ? \" \u00B7 streaming\" : \"\"}\n </span>\n )}\n </div>\n </div>\n\n {columns.length === 0 ? (\n <div className=\"flex flex-1 items-center justify-center text-[12px] text-muted-foreground\">\n {stream.error ? stream.error : \"Waiting for schema\u2026\"}\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"overflow-hidden border-b border-border bg-muted/30\">\n <div\n className=\"flex h-6 select-none text-[11px] uppercase tracking-wider text-muted-foreground\"\n style={{\n width: totalColW,\n transform: `translateX(${-(scrollerRef.current?.scrollLeft ?? 0)}px)`,\n }}\n >\n {columns.map((c) => (\n <div\n key={c.name}\n style={{ width: colWidth(c.name) }}\n className=\"flex items-center overflow-hidden border-r border-border px-2\"\n >\n <span className=\"truncate\">{c.name}</span>\n </div>\n ))}\n </div>\n </div>\n\n <div\n ref={scrollerRef}\n onScroll={(e) => {\n setScrollTop((e.target as HTMLDivElement).scrollTop);\n // header translate uses scrollLeft \u2192 re-render\n setTick((n) => n + 1);\n }}\n className=\"relative min-h-0 flex-1 overflow-auto font-mono\"\n >\n <div style={{ height: totalH, width: totalColW, position: \"relative\" }}>\n {rows.slice(start, end).map((row, i) => {\n const rowIdx = start + i;\n return (\n <div\n key={rowIdx}\n onClick={() => handleRowClick(rowIdx)}\n style={{\n top: rowIdx * ROW_H,\n height: ROW_H,\n width: totalColW,\n }}\n className={cn(\n \"absolute left-0 flex cursor-pointer text-[12px] leading-none\",\n rowIdx % 2 === 0 ? \"bg-background\" : \"bg-muted/20\",\n \"hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n {columns.map((c, ci) => (\n <div\n key={c.name}\n style={{ width: colWidth(c.name) }}\n className=\"flex items-center overflow-hidden border-r border-border/60 px-2\"\n title={row[ci]}\n >\n <span className=\"truncate\">{row[ci]}</span>\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n )}\n {/* Force re-read of refs on tick; tick is intentional dep of layout reads above. */}\n {tick < 0 && <span />}\n </div>\n );\n};\n\nexport default DataTable;\n", "import React from \"react\";\nimport {\n Background,\n BackgroundVariant,\n Controls,\n MarkerType,\n ReactFlow,\n ReactFlowProvider,\n useNodesInitialized,\n useReactFlow,\n type Edge,\n type Node,\n} from \"@xyflow/react\";\n// ReactFlow's stylesheet ships inlined in @nbt-dev/devtools/styles.css.\nimport { Database, Eye, EyeOff, GitBranch, Rows3 } from \"lucide-react\";\nimport { cn } from \"../../../lib/utils\";\nimport { useBulkRowCounts } from \"../../../hooks/use-bulk-stream\";\nimport type { BulkRegistry } from \"../../../hooks/use-cartridge-info\";\nimport { EntityNode } from \"./entity-node\";\nimport {\n buildEntityGraphModel,\n cartsFromContracts,\n entityGraphId,\n filterEntityGraphModel,\n type Contract,\n type EntityGraphModel,\n type EntityGraphNodeData,\n} from \"./entity-graph-utils\";\n\ndeclare const NIMBIT_API_ENDPOINT: string | undefined;\nconst API_BASE: string =\n (typeof NIMBIT_API_ENDPOINT !== \"undefined\" && NIMBIT_API_ENDPOINT) || \"\";\n\nconst STORAGE_KEY = \"nimbit:inspector:entity-graph:hidden-carts\";\n\nconst nodeTypes = { entity: EntityNode };\n\n// Custom nodes are measured asynchronously after mount, so the `fitView` prop\n// fits to zero-size bounds on first paint (boxes end up off-screen). Refit once\n// nodes report measured dimensions, and again whenever the visible set changes.\nconst FitOnReady: React.FC<{ fitKey: string }> = ({ fitKey }) => {\n const initialized = useNodesInitialized();\n const { fitView } = useReactFlow();\n React.useEffect(() => {\n if (initialized) fitView({ padding: 0.25, duration: 200 });\n }, [initialized, fitKey, fitView]);\n return null;\n};\n\ntype EntityFlowEdge = Edge<Record<string, unknown>, \"smoothstep\"> & {\n pathOptions: { borderRadius: number; offset: number };\n};\n\nfunction useContracts() {\n const [contracts, setContracts] = React.useState<Contract[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n const ac = new AbortController();\n let cancelled = false;\n (async () => {\n try {\n const r = await fetch(`${API_BASE}/_console/contracts`, {\n signal: ac.signal,\n credentials: \"include\",\n });\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n const data = (await r.json()) as Contract[];\n if (!Array.isArray(data)) throw new Error(\"malformed contracts response\");\n if (!cancelled) setContracts(data);\n } catch (e) {\n if (cancelled || (e as { name?: string }).name === \"AbortError\") return;\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n ac.abort();\n };\n }, []);\n\n return { contracts, loading, error };\n}\n\n// Derive the bulk WS registry off the same contracts so live row counts work\n// through the shared socket (the provider preloads each entity's SCHEMA, which\n// carries totalRows). Mirrors buildRegistry in use-cartridge-info.\nfunction registryFromContracts(contracts: Contract[]): BulkRegistry {\n const reg: BulkRegistry = {};\n for (const c of contracts) {\n if (!c.cartridge || !c.owns) continue;\n const entities = Object.keys(c.owns).map((name) => ({\n name,\n route: `/_ws/bulk/${c.cartridge}/${name.toLowerCase()}`,\n searchFields: [] as string[],\n }));\n if (entities.length > 0) reg[c.cartridge] = entities;\n }\n return reg;\n}\n\n// Renders the entity graph. Must be mounted inside a <BulkStreamProvider> \u2014 it\n// reads live row counts off that shared socket's SCHEMA preload rather than\n// opening its own connection (the Data tab already provides one).\nexport const DiagramView: React.FC = () => {\n const { contracts, loading, error } = useContracts();\n\n const graph = React.useMemo(\n () => buildEntityGraphModel(cartsFromContracts(contracts)),\n [contracts],\n );\n const registry = React.useMemo(() => registryFromContracts(contracts), [contracts]);\n\n if (graph.nodes.length === 0) {\n let msg = \"No installed cartridges with entities.\";\n if (loading) msg = \"Loading entity graph\u2026\";\n else if (error) msg = `Failed to load contracts: ${error}`;\n return <div className=\"p-3 text-[12px] text-muted-foreground\">{msg}</div>;\n }\n\n return <DiagramInner graph={graph} registry={registry} />;\n};\n\nconst DiagramInner: React.FC<{ graph: EntityGraphModel; registry: BulkRegistry }> = ({\n graph,\n registry,\n}) => {\n const rowCounts = useBulkRowCounts(registry);\n const [hiddenCarts, setHiddenCarts] = React.useState<Set<string>>(() => {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n const saved = raw ? JSON.parse(raw) : [];\n return new Set<string>(Array.isArray(saved) ? saved.filter((n) => typeof n === \"string\") : []);\n } catch {\n return new Set();\n }\n });\n const [focusedNodeId, setFocusedNodeId] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify([...hiddenCarts]));\n }, [hiddenCarts]);\n\n const cartGroups = React.useMemo(() => {\n const counts = new Map<string, number>();\n for (const node of graph.nodes) counts.set(node.cartridge, (counts.get(node.cartridge) ?? 0) + 1);\n return [...counts.entries()]\n .map(([name, total]) => ({ name, total }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }, [graph.nodes]);\n\n const visibleIds = React.useMemo(\n () => new Set(graph.nodes.filter((n) => !hiddenCarts.has(n.cartridge)).map((n) => n.id)),\n [graph.nodes, hiddenCarts],\n );\n\n const visibleGraph = React.useMemo(\n () => filterEntityGraphModel(graph, visibleIds),\n [graph, visibleIds],\n );\n\n React.useEffect(() => {\n if (focusedNodeId && !visibleIds.has(focusedNodeId)) setFocusedNodeId(null);\n }, [focusedNodeId, visibleIds]);\n\n const focusedConnections = React.useMemo(() => {\n if (!focusedNodeId) {\n return {\n connectedIds: new Set<string>(),\n edgeIds: new Set<string>(),\n fieldsByNode: new Map<string, Set<string>>(),\n };\n }\n const connectedIds = new Set<string>([focusedNodeId]);\n const edgeIds = new Set<string>();\n const fieldsByNode = new Map<string, Set<string>>();\n const addField = (nodeId: string, fieldName: string) => {\n const fields = fieldsByNode.get(nodeId) ?? new Set<string>();\n fields.add(fieldName);\n fieldsByNode.set(nodeId, fields);\n };\n for (const edge of visibleGraph.edges) {\n if (edge.source !== focusedNodeId && edge.target !== focusedNodeId) continue;\n edgeIds.add(edge.id);\n connectedIds.add(edge.source);\n connectedIds.add(edge.target);\n addField(edge.source, edge.sourceField);\n addField(edge.target, edge.targetField);\n }\n return { connectedIds, edgeIds, fieldsByNode };\n }, [focusedNodeId, visibleGraph.edges]);\n\n const liveRows = React.useMemo(\n () => visibleGraph.nodes.reduce((sum, n) => sum + (rowCounts[n.id] ?? 0), 0),\n [visibleGraph.nodes, rowCounts],\n );\n\n const nodes: Node[] = React.useMemo(\n () =>\n visibleGraph.nodes.map((node) => ({\n id: node.id,\n type: \"entity\",\n position: node.position,\n data: {\n ...node,\n rowCount: rowCounts[node.id] ?? node.rowCount,\n highlight: focusedNodeId\n ? {\n focused: node.id === focusedNodeId,\n connected: focusedConnections.connectedIds.has(node.id) && node.id !== focusedNodeId,\n dimmed: !focusedConnections.connectedIds.has(node.id),\n fields: [...(focusedConnections.fieldsByNode.get(node.id) ?? [])],\n }\n : undefined,\n },\n })),\n [focusedConnections, focusedNodeId, visibleGraph.nodes, rowCounts],\n );\n\n const edges: EntityFlowEdge[] = React.useMemo(() => {\n const nodeById = new Map(visibleGraph.nodes.map((node) => [node.id, node]));\n const laneCounts = new Map<string, number>();\n return visibleGraph.edges.map((edge) => {\n const source = nodeById.get(edge.source);\n const target = nodeById.get(edge.target);\n const sourceSide = source && target && source.position.x > target.position.x ? \"left\" : \"right\";\n const targetSide = sourceSide === \"left\" ? \"right\" : \"left\";\n const laneKey = `${edge.target}:${edge.targetField}:${targetSide}`;\n const lane = laneCounts.get(laneKey) ?? 0;\n laneCounts.set(laneKey, lane + 1);\n const highlighted = !focusedNodeId || focusedConnections.edgeIds.has(edge.id);\n return {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n sourceHandle: `source-${edge.sourceField}-${sourceSide}`,\n targetHandle: `target-${edge.targetField}-${targetSide}`,\n type: \"smoothstep\",\n pathOptions: { borderRadius: 8, offset: 22 + (lane % 5) * 12 },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n color: highlighted ? \"#2563eb\" : \"#64748b\",\n },\n style: {\n strokeWidth: focusedNodeId && highlighted ? 2.5 : 1.5,\n stroke: highlighted ? \"#2563eb\" : \"#64748b\",\n opacity: highlighted ? 1 : 0.16,\n },\n };\n });\n }, [focusedConnections.edgeIds, focusedNodeId, visibleGraph.edges, visibleGraph.nodes]);\n\n const toggleCart = React.useCallback((name: string) => {\n setHiddenCarts((prev) => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n }, []);\n\n const onNodeClick = React.useCallback((_: unknown, node: Node) => {\n const data = node.data as EntityGraphNodeData;\n const nodeId = entityGraphId(data.cartridge, data.entity);\n setFocusedNodeId((prev) => (prev === nodeId ? null : nodeId));\n }, []);\n\n const clearFocusedNode = React.useCallback(() => setFocusedNodeId(null), []);\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col\">\n <div className=\"flex h-7 shrink-0 items-center gap-3 border-b border-border bg-background px-2 text-[11px] text-muted-foreground select-none\">\n <span className=\"inline-flex items-center gap-1 text-foreground\">\n <GitBranch className=\"h-3.5 w-3.5\" />\n Entity Graph\n </span>\n <span className=\"ml-auto inline-flex items-center gap-1\">\n <Database className=\"h-3 w-3\" />\n {visibleGraph.totals.entities} entities\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <GitBranch className=\"h-3 w-3\" />\n {visibleGraph.totals.relationships} relationships\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <Rows3 className=\"h-3 w-3\" />\n {liveRows.toLocaleString()} rows\n </span>\n </div>\n\n <div className=\"relative min-h-0 flex-1 bg-zinc-950\">\n {cartGroups.length > 0 ? (\n <div className=\"pointer-events-none absolute left-2 top-2 z-10 max-h-[calc(100%-1rem)]\">\n <div className=\"pointer-events-auto flex max-h-full flex-col gap-0.5 overflow-y-auto rounded-md border border-zinc-700 bg-zinc-900/95 p-1 shadow-sm backdrop-blur\">\n {cartGroups.map((g) => {\n const hidden = hiddenCarts.has(g.name);\n return (\n <button\n key={g.name}\n type=\"button\"\n onClick={() => toggleCart(g.name)}\n className={cn(\n \"flex items-center gap-2 rounded px-2 py-1 text-left font-mono text-[11px] hover:bg-zinc-800\",\n hidden ? \"text-zinc-500\" : \"text-zinc-100\",\n )}\n title={hidden ? `Show ${g.name}` : `Hide ${g.name}`}\n >\n {hidden ? (\n <EyeOff className=\"h-3.5 w-3.5 shrink-0\" />\n ) : (\n <Eye className=\"h-3.5 w-3.5 shrink-0 text-orange-400\" />\n )}\n <span className=\"min-w-0 flex-1 truncate\">{g.name}</span>\n <span className=\"shrink-0 text-[10px] tabular-nums text-zinc-500\">{g.total}</span>\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n\n {nodes.length === 0 ? (\n <div className=\"flex h-full items-center justify-center text-[12px] text-zinc-500\">\n No entities are visible.\n </div>\n ) : (\n <ReactFlowProvider>\n <ReactFlow\n colorMode=\"dark\"\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n fitView\n fitViewOptions={{ padding: 0.2 }}\n minZoom={0.1}\n maxZoom={1.6}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable\n panOnDrag\n panOnScroll\n zoomOnScroll={false}\n zoomOnPinch\n selectionOnDrag={false}\n onNodeClick={onNodeClick}\n onPaneClick={clearFocusedNode}\n proOptions={{ hideAttribution: true }}\n >\n <FitOnReady fitKey={[...visibleIds].sort().join(\"|\")} />\n <Background variant={BackgroundVariant.Dots} gap={16} size={1} color=\"#3f3f46\" />\n <Controls showInteractive={false} />\n </ReactFlow>\n </ReactFlowProvider>\n )}\n </div>\n </div>\n );\n};\n", "import React from \"react\";\nimport { Handle, Position, type NodeProps } from \"@xyflow/react\";\nimport { Database, FileText, KeyRound, Link2 } from \"lucide-react\";\nimport type { EntityGraphNodeData } from \"./entity-graph-utils\";\n\nexport type EntityNodeHighlight = {\n focused: boolean;\n connected: boolean;\n dimmed: boolean;\n fields: string[];\n};\n\ntype EntityNodeViewData = EntityGraphNodeData & {\n highlight?: EntityNodeHighlight;\n};\n\n// Dark entity card. Colors are pinned (not theme tokens) so the card looks the\n// same regardless of where it mounts; it sits inside the dark devtools panel.\nexport function EntityNode({ data, selected }: NodeProps) {\n const node = data as EntityNodeViewData;\n const highlight = node.highlight;\n const highlightedFields = new Set(highlight?.fields ?? []);\n const hiddenHandleClass = \"!h-1 !w-1 !border-0 !bg-transparent !opacity-0\";\n return (\n <div\n className={[\n \"relative w-[260px] overflow-visible rounded-xl border bg-zinc-900 font-mono text-[11px] text-zinc-100 shadow-lg shadow-black/40 transition-opacity\",\n highlight?.focused\n ? \"border-blue-500 ring-2 ring-blue-500/30\"\n : highlight?.connected\n ? \"border-blue-400/60 ring-2 ring-blue-500/10\"\n : \"border-zinc-700\",\n highlight?.dimmed ? \"opacity-35\" : \"\",\n selected && !highlight?.focused ? \"ring-2 ring-zinc-100/10\" : \"\",\n ].join(\" \")}\n >\n <div className=\"rounded-t-xl border-b border-zinc-700 bg-zinc-800 px-3 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Database className=\"h-3.5 w-3.5 shrink-0 text-zinc-400\" />\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-semibold leading-none text-zinc-50\">\n {node.entity}\n </span>\n <span className=\"shrink-0 rounded bg-zinc-700 px-1.5 py-0.5 text-[10px] font-medium tabular-nums text-zinc-200\">\n {node.fieldCount}\n </span>\n </div>\n <div className=\"mt-1 truncate text-[10px] text-zinc-500\">{node.cartridge}</div>\n </div>\n <div className=\"bg-zinc-900 py-1\">\n {node.fields.length === 0 ? (\n <div className=\"px-3 py-2 text-[10px] text-zinc-500\">No fields</div>\n ) : (\n node.fields.map((field) => {\n const type = `${field.type}${field.array ? \"[]\" : \"\"}${field.optional ? \"?\" : \"\"}`;\n const isId = field.displayName.toLowerCase() === \"id\";\n const isRelation = field.kind === \"relation\";\n const isDocument = field.kind === \"document\";\n const fieldHighlighted = highlightedFields.has(field.displayName);\n return (\n <div\n key={`${field.name}:${field.displayName}`}\n className={[\n \"relative grid min-h-[26px] grid-cols-[minmax(0,1fr)_auto] items-center gap-3 px-3 py-1 text-zinc-300\",\n fieldHighlighted ? \"bg-blue-500/15 text-blue-200\" : \"\",\n ].join(\" \")}\n >\n {isId ? (\n <>\n <Handle\n id={`target-${field.displayName}-left`}\n type=\"target\"\n position={Position.Left}\n className={`!left-0 ${hiddenHandleClass}`}\n style={{ top: \"50%\" }}\n />\n <Handle\n id={`target-${field.displayName}-right`}\n type=\"target\"\n position={Position.Right}\n className={`!right-0 ${hiddenHandleClass}`}\n style={{ top: \"50%\" }}\n />\n </>\n ) : null}\n {isRelation ? (\n <>\n <Handle\n id={`source-${field.displayName}-left`}\n type=\"source\"\n position={Position.Left}\n className={`!left-0 ${hiddenHandleClass}`}\n style={{ top: \"50%\" }}\n />\n <Handle\n id={`source-${field.displayName}-right`}\n type=\"source\"\n position={Position.Right}\n className={`!right-0 ${hiddenHandleClass}`}\n style={{ top: \"50%\" }}\n />\n </>\n ) : null}\n <span className=\"flex min-w-0 items-center gap-1.5\">\n {isId ? <KeyRound className=\"h-3 w-3 shrink-0 text-zinc-500\" /> : null}\n {isRelation ? (\n <Link2 className={[\"h-3 w-3 shrink-0\", fieldHighlighted ? \"text-blue-300\" : \"text-blue-400\"].join(\" \")} />\n ) : null}\n {isDocument ? <FileText className=\"h-3 w-3 shrink-0 text-zinc-500\" /> : null}\n <span className=\"truncate\">{field.displayName}</span>\n </span>\n <span className=\"max-w-[96px] truncate text-right text-zinc-500\">{type}</span>\n </div>\n );\n })\n )}\n </div>\n <div className=\"flex items-center justify-between gap-2 rounded-b-xl border-t border-zinc-700 bg-zinc-800 px-3 py-1.5 text-[10px] text-zinc-500\">\n <span className=\"tabular-nums\">{node.rowCount.toLocaleString()} rows</span>\n <span className=\"tabular-nums\">\n {node.relationCount} rel \u00B7 {node.scalarCount} scalar\n </span>\n </div>\n </div>\n );\n}\n", "// Entity-relationship graph model for the devtools Diagram tab. Ported from the\n// portal-ui entity-graph (apps/portal/.../systems/entity-graph) but fed off the\n// daemon's `/_console/contracts` directly instead of the portal BFF's\n// cartridges-in-use + resources endpoints. Contract fields use snake_case\n// relation keys (`target_cart`, `fk_field`, `relation_kind`); we normalize to\n// the camelCase model below in `cartsFromContracts`. Row counts are overlaid\n// live from the bulk-stream schema preload, not baked into the model here.\n//\n// Placement uses dagre (layered LR) \u2014 the portal's hand-rolled column stacker\n// sprawled here because the devtools shows every installed cart at once rather\n// than a project-scoped subset.\n\nimport dagre from \"@dagrejs/dagre\";\n\nexport type GraphInputField = {\n name: string;\n type: string;\n optional?: boolean;\n array?: boolean;\n kind?: string;\n target?: string;\n targetCart?: string;\n relationKind?: string;\n fkField?: string;\n};\n\nexport type GraphInputEntity = {\n name: string;\n fields: GraphInputField[];\n};\n\nexport type GraphInputCart = {\n name: string;\n entities: GraphInputEntity[];\n};\n\nexport type EntityGraphField = {\n name: string;\n displayName: string;\n type: string;\n kind: string;\n optional: boolean;\n array: boolean;\n target?: string;\n targetCart?: string;\n relationKind?: string;\n fkField?: string;\n implicit?: boolean;\n};\n\nexport type EntityGraphNodeData = {\n id: string;\n cartridge: string;\n entity: string;\n fields: EntityGraphField[];\n fieldCount: number;\n scalarCount: number;\n relationCount: number;\n documentCount: number;\n rowCount: number;\n};\n\nexport type EntityGraphNode = EntityGraphNodeData & {\n position: { x: number; y: number };\n};\n\nexport type EntityGraphEdge = {\n id: string;\n source: string;\n target: string;\n sourceField: string;\n targetField: string;\n label: string;\n relationKind?: string;\n fkField?: string;\n};\n\nexport type EntityGraphTotals = {\n entities: number;\n relationships: number;\n rows: number;\n};\n\nexport type EntityGraphModel = {\n nodes: EntityGraphNode[];\n edges: EntityGraphEdge[];\n totals: EntityGraphTotals;\n};\n\nconst NODE_WIDTH = 260;\nconst MIN_NODE_HEIGHT = 150;\nconst FIELD_ROW_HEIGHT = 26;\nconst COLUMN_WIDTH = 390; // initial pre-layout spread; dagre overrides positions\n\n// Raw contract shapes (subset). `/_console/contracts` returns one object per\n// running cart with an `owns` map of entity -> { fields, ... }.\ntype ContractField = {\n name: string;\n type: string;\n optional?: boolean;\n array?: boolean;\n kind?: string;\n target?: string;\n target_cart?: string;\n relation_kind?: string;\n fk_field?: string;\n};\ntype ContractEntity = { fields?: ContractField[] };\nexport type Contract = {\n cartridge?: string;\n owns?: Record<string, ContractEntity>;\n};\n\nexport function cartsFromContracts(contracts: Contract[]): GraphInputCart[] {\n const carts: GraphInputCart[] = [];\n for (const c of contracts) {\n if (!c.cartridge || !c.owns) continue;\n const entities: GraphInputEntity[] = [];\n for (const [name, ent] of Object.entries(c.owns)) {\n const fields: GraphInputField[] = (ent.fields ?? []).map((f) => ({\n name: f.name,\n type: f.type,\n optional: f.optional,\n array: f.array,\n kind: f.kind,\n target: f.target,\n targetCart: f.target_cart,\n relationKind: f.relation_kind,\n fkField: f.fk_field,\n }));\n entities.push({ name, fields });\n }\n if (entities.length > 0) carts.push({ name: c.cartridge, entities });\n }\n return carts;\n}\n\nexport function entityGraphId(cartridge: string, entity: string): string {\n return `${cartridge}:${entity}`;\n}\n\nfunction fieldKind(field: GraphInputField): string {\n return field.kind ?? (field.target ? \"relation\" : \"scalar\");\n}\n\nfunction graphField(field: GraphInputField): EntityGraphField {\n const kind = fieldKind(field);\n return {\n name: field.name,\n displayName: kind === \"relation\" ? (field.fkField ?? field.name) : field.name,\n type: kind === \"relation\" && field.target ? field.target : field.type,\n kind,\n optional: field.optional === true,\n array: field.array === true,\n target: field.target,\n targetCart: field.targetCart,\n relationKind: field.relationKind,\n fkField: field.fkField,\n };\n}\n\nfunction makeGraphFields(fields: GraphInputField[]): EntityGraphField[] {\n const out = fields.map(graphField);\n if (!out.some((field) => field.displayName.toLowerCase() === \"id\")) {\n out.unshift({\n name: \"id\",\n displayName: \"id\",\n type: \"id\",\n kind: \"scalar\",\n optional: false,\n array: false,\n implicit: true,\n });\n }\n return out;\n}\n\nfunction normalizeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9]/g, \"\").toLowerCase();\n}\n\nfunction words(value: string): string[] {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[^a-zA-Z0-9]+/)\n .map((part) => part.toLowerCase())\n .filter(Boolean);\n}\n\nfunction entityAliases(entity: string): string[] {\n const parts = words(entity);\n const aliases = new Set<string>([normalizeName(entity)]);\n const last = parts.length > 0 ? parts[parts.length - 1] : undefined;\n if (last) aliases.add(last);\n if (parts.length > 1 && last) {\n aliases.add(`${parts.slice(0, -1).map((part) => part[0]).join(\"\")}${last}`);\n aliases.add(parts.map((part) => part[0]).join(\"\"));\n }\n return [...aliases].filter((alias) => alias.length >= 2);\n}\n\nfunction inferTargetNode(fieldName: string, nodes: EntityGraphNode[]): EntityGraphNode | null {\n if (!/id$/i.test(fieldName) || /^id$/i.test(fieldName)) return null;\n const base = normalizeName(fieldName.replace(/id$/i, \"\"));\n if (base.length < 3) return null;\n\n const candidates = nodes\n .flatMap((node) =>\n entityAliases(node.entity).map((alias) => {\n const exact = base === alias;\n const suffix = !exact && alias.length >= 4 && base.endsWith(alias);\n if (!exact && !suffix) return null;\n return {\n node,\n score: (exact ? 1000 : 500) + alias.length,\n };\n }),\n )\n .filter((candidate): candidate is { node: EntityGraphNode; score: number } => candidate !== null)\n .sort((a, b) => b.score - a.score || a.node.entity.localeCompare(b.node.entity));\n\n const first = candidates[0];\n if (!first) return null;\n const second = candidates[1];\n if (second && first.score === second.score) return null;\n return first.node;\n}\n\nfunction markRelationField(node: EntityGraphNode | undefined, fieldName: string, target: EntityGraphNode) {\n const field = node?.fields.find(\n (candidate) => candidate.displayName === fieldName || candidate.name === fieldName,\n );\n if (!field || field.displayName.toLowerCase() === \"id\") return;\n field.kind = \"relation\";\n field.target = target.entity;\n field.targetCart = target.cartridge;\n field.relationKind ??= \"inferred\";\n field.fkField ??= fieldName;\n}\n\nfunction recomputeNodeCounts(nodes: EntityGraphNode[]) {\n for (const node of nodes) {\n node.scalarCount = node.fields.filter((field) => field.kind === \"scalar\").length;\n node.relationCount = node.fields.filter((field) => field.kind === \"relation\").length;\n node.documentCount = node.fields.filter((field) => field.kind === \"document\").length;\n }\n}\n\nfunction nodeHeight(node: EntityGraphNode): number {\n return Math.max(MIN_NODE_HEIGHT, 74 + node.fields.length * FIELD_ROW_HEIGHT);\n}\n\n// Layered left-to-right placement via dagre. Connected components get clean\n// ranks with minimized crossings; isolated nodes (no edges) are gathered into a\n// trailing grid so they don't inflate dagre's ranks.\nfunction layoutNodes(nodes: EntityGraphNode[], edges: EntityGraphEdge[]) {\n const degree = new Map(nodes.map((n) => [n.id, 0]));\n for (const edge of edges) {\n degree.set(edge.source, (degree.get(edge.source) ?? 0) + 1);\n degree.set(edge.target, (degree.get(edge.target) ?? 0) + 1);\n }\n\n const connected = nodes.filter((n) => (degree.get(n.id) ?? 0) > 0);\n const isolated = nodes.filter((n) => (degree.get(n.id) ?? 0) === 0);\n const connectedIds = new Set(connected.map((n) => n.id));\n\n let maxX = 0;\n let maxY = 0;\n\n if (connected.length > 0) {\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: \"LR\", ranksep: 130, nodesep: 36, marginx: 40, marginy: 40 });\n g.setDefaultEdgeLabel(() => ({}));\n for (const node of connected) {\n g.setNode(node.id, { width: NODE_WIDTH, height: nodeHeight(node) });\n }\n for (const edge of edges) {\n // dagre can't rank self-loops; the edge still renders (handle picks the\n // same node's left+right). Cross-component edges are all kept.\n if (edge.source === edge.target) continue;\n if (!connectedIds.has(edge.source) || !connectedIds.has(edge.target)) continue;\n g.setEdge(edge.source, edge.target);\n }\n dagre.layout(g);\n for (const node of connected) {\n const p = g.node(node.id);\n const h = nodeHeight(node);\n node.position = { x: p.x - NODE_WIDTH / 2, y: p.y - h / 2 };\n maxX = Math.max(maxX, node.position.x + NODE_WIDTH);\n maxY = Math.max(maxY, node.position.y + h);\n }\n }\n\n // Isolated nodes: a tidy grid to the right of the laid-out graph.\n if (isolated.length > 0) {\n isolated.sort((a, b) => a.entity.localeCompare(b.entity));\n const startX = connected.length > 0 ? maxX + COLUMN_WIDTH : 0;\n const perColumn = Math.max(1, Math.ceil(isolated.length / Math.ceil(isolated.length / 6)));\n let x = startX;\n let y = 0;\n let inColumn = 0;\n for (const node of isolated) {\n node.position = { x, y };\n y += nodeHeight(node) + 48;\n inColumn += 1;\n if (inColumn >= perColumn) {\n inColumn = 0;\n y = 0;\n x += COLUMN_WIDTH;\n }\n }\n }\n}\n\nfunction makeTotals(nodes: EntityGraphNode[], edges: EntityGraphEdge[]): EntityGraphTotals {\n return {\n entities: nodes.length,\n relationships: edges.length,\n rows: nodes.reduce((sum, node) => sum + node.rowCount, 0),\n };\n}\n\nexport function buildEntityGraphModel(cartridges: GraphInputCart[]): EntityGraphModel {\n const sortedCarts = [...cartridges].sort((a, b) => a.name.localeCompare(b.name));\n const nodes: EntityGraphNode[] = [];\n\n sortedCarts.forEach((cart, cartIndex) => {\n const entities = [...cart.entities].sort((a, b) => a.name.localeCompare(b.name));\n let y = 0;\n entities.forEach((entity) => {\n const id = entityGraphId(cart.name, entity.name);\n const fields = entity.fields ?? [];\n const graphFields = makeGraphFields(fields);\n nodes.push({\n id,\n cartridge: cart.name,\n entity: entity.name,\n fields: graphFields,\n fieldCount: graphFields.length,\n scalarCount: graphFields.filter((field) => field.kind === \"scalar\").length,\n relationCount: graphFields.filter((field) => field.kind === \"relation\").length,\n documentCount: graphFields.filter((field) => field.kind === \"document\").length,\n rowCount: 0,\n position: { x: cartIndex * COLUMN_WIDTH, y },\n });\n y += Math.max(MIN_NODE_HEIGHT, 74 + graphFields.length * FIELD_ROW_HEIGHT) + 56;\n });\n });\n\n const nodeIds = new Set(nodes.map((node) => node.id));\n const nodeById = new Map(nodes.map((node) => [node.id, node]));\n const edges: EntityGraphEdge[] = [];\n const edgeKeys = new Set<string>();\n for (const cart of sortedCarts) {\n for (const entity of cart.entities) {\n const source = entityGraphId(cart.name, entity.name);\n const sourceNode = nodeById.get(source);\n for (const field of entity.fields ?? []) {\n const explicitRelation = fieldKind(field) === \"relation\" && !!field.target;\n const inferredTargetNode = explicitRelation ? null : inferTargetNode(field.name, nodes);\n if (!explicitRelation && !inferredTargetNode) continue;\n\n const targetCart = explicitRelation\n ? field.targetCart ?? cart.name\n : inferredTargetNode?.cartridge;\n const targetEntity = explicitRelation ? field.target : inferredTargetNode?.entity;\n if (!targetCart || !targetEntity) continue;\n const target = entityGraphId(targetCart, targetEntity);\n if (!nodeIds.has(source) || !nodeIds.has(target)) continue;\n const targetNode = nodeById.get(target);\n const idField = targetNode?.fields.find((candidate) => candidate.displayName.toLowerCase() === \"id\");\n const targetField = idField?.displayName ?? \"__entity\";\n const sourceGraphField = sourceNode?.fields.find(\n (candidate) => candidate.name === field.name || candidate.displayName === field.name,\n );\n const sourceField = sourceGraphField?.displayName ?? field.fkField ?? field.name;\n const edgeKey = `${source}:${sourceField}->${target}:${targetField}`;\n if (edgeKeys.has(edgeKey)) continue;\n edgeKeys.add(edgeKey);\n if (!explicitRelation && targetNode) markRelationField(sourceNode, sourceField, targetNode);\n edges.push({\n id: `${source}:${field.name}->${target}`,\n source,\n target,\n sourceField,\n targetField,\n label: field.name,\n relationKind: field.relationKind ?? (!explicitRelation ? \"inferred\" : undefined),\n fkField: field.fkField ?? (!explicitRelation ? field.name : undefined),\n });\n }\n }\n }\n\n recomputeNodeCounts(nodes);\n layoutNodes(nodes, edges);\n\n return {\n nodes,\n edges,\n totals: makeTotals(nodes, edges),\n };\n}\n\nexport function filterEntityGraphModel(\n model: EntityGraphModel,\n visibleIds: Set<string>,\n): EntityGraphModel {\n const nodes = model.nodes.filter((node) => visibleIds.has(node.id));\n const ids = new Set(nodes.map((node) => node.id));\n const edges = model.edges.filter((edge) => ids.has(edge.source) && ids.has(edge.target));\n return {\n nodes,\n edges,\n totals: makeTotals(nodes, edges),\n };\n}\n", "import * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"nimbit-devtools dark fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"nimbit-devtools dark fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 right-3\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n", "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n", "import React from \"react\";\n\nconst SettingsTab: React.FC = () => {\n return <></>;\n};\n\nexport default SettingsTab;\n", "import React from \"react\";\nimport { DevToolsConfigProvider } from \"./config\";\nimport { DevToolsProvider } from \"./components/devtools/devtools-context\";\nimport DevTools from \"./components/devtools/dev-tools\";\n\nexport type NimbitDevToolsProps = {\n // Base URL of the nimbit console (e.g. \"https://console.example.com\").\n // Omit / empty string => same-origin (the panel is served by the console).\n apiBaseUrl?: string;\n defaultActiveTab?: string;\n};\n\n// Drop-in devtools panel. Mount once near your app root; it renders nothing\n// until toggled open via `toggleDevTools()` (or a `devtools-toggle` window event).\nexport const NimbitDevTools: React.FC<NimbitDevToolsProps> = ({\n apiBaseUrl = \"\",\n defaultActiveTab,\n}) => (\n <DevToolsConfigProvider apiBaseUrl={apiBaseUrl}>\n <DevToolsProvider defaultActiveTab={defaultActiveTab}>\n <DevTools />\n </DevToolsProvider>\n </DevToolsConfigProvider>\n);\n\nexport default NimbitDevTools;\n\n// Open/close the panel from anywhere (keybinding, button, command palette).\nexport function toggleDevTools(): void {\n window.dispatchEvent(new CustomEvent(\"devtools-toggle\"));\n}\n\nexport {\n DevToolsProvider,\n useDevTools,\n} from \"./components/devtools/devtools-context\";\nexport { DevToolsConfigProvider, useDevToolsConfig } from \"./config\";\nexport type { DevToolsConfig } from \"./config\";\nexport { default as DevTools } from \"./components/devtools/dev-tools\";\nexport type {\n DevToolsDock,\n DevToolsTab,\n DevToolsSize,\n} from \"./components/devtools/devtools-context\";\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "jsx", "React", "React", "jsx", "React", "jsx", "React", "useEffect", "useEffect", "React", "useEffect", "useState", "useState", "useEffect", "React", "React", "jsx", "jsxs", "React", "React", "Database", "jsx", "jsxs", "jsx", "jsxs", "React", "Database", "jsx", "jsx", "jsxs", "jsx", "jsxs", "jsx", "Fragment", "jsx", "jsxs", "React", "Fragment", "jsx", "jsx", "jsxs", "React", "jsx"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}.react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#777;--xy-background-pattern-lines-color-default:#777;--xy-background-pattern-cross-color-default:#777;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-orange-400:oklch(75% .183 55.934);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--tracking-wider:.05em;--radius-md:calc(var(--radius) * .8);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.-top-px{top:-1px}.top-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.\!right-0{right:calc(var(--spacing) * 0)!important}.right-0{right:calc(var(--spacing) * 0)}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:calc(var(--spacing) * 0)}.\!left-0{left:calc(var(--spacing) * 0)!important}.-left-px{left:-1px}.left-0{left:calc(var(--spacing) * 0)}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-auto{margin-top:auto}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.\!h-1{height:calc(var(--spacing) * 1)!important}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-full{height:100%}.max-h-\[calc\(100\%-1rem\)\]{max-height:calc(100% - 1rem)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[26px\]{min-height:26px}.\!w-1{width:calc(var(--spacing) * 1)!important}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-32{width:calc(var(--spacing) * 32)}.w-44{width:calc(var(--spacing) * 44)}.w-\[260px\]{width:260px}.w-\[480px\]{width:480px}.w-full{width:100%}.w-px{width:1px}.max-w-\[96px\]{max-width:96px}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-ew-resize{cursor:ew-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-pointer{cursor:pointer}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md), 10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md), 12px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) * .8)}.rounded-sm{border-radius:calc(var(--radius) * .6)}.rounded-xl{border-radius:calc(var(--radius) * 1.4)}.rounded-t-xl{border-top-left-radius:calc(var(--radius) * 1.4);border-top-right-radius:calc(var(--radius) * 1.4)}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-blue-400\/30{border-color:#54a2ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-400\/30{border-color:color-mix(in oklab, var(--color-blue-400) 30%, transparent)}}.border-blue-400\/60{border-color:#54a2ff99}@supports (color:color-mix(in lab, red, red)){.border-blue-400\/60{border-color:color-mix(in oklab, var(--color-blue-400) 60%, transparent)}}.border-blue-500{border-color:var(--color-blue-500)}.border-border,.border-border\/20{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/20{border-color:color-mix(in oklab, var(--border) 20%, transparent)}}.border-border\/30{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/30{border-color:color-mix(in oklab, var(--border) 30%, transparent)}}.border-border\/40{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/40{border-color:color-mix(in oklab, var(--border) 40%, transparent)}}.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-red-400\/30{border-color:#ff65684d}@supports (color:color-mix(in lab, red, red)){.border-red-400\/30{border-color:color-mix(in oklab, var(--color-red-400) 30%, transparent)}}.border-transparent{border-color:#0000}.border-yellow-400\/30{border-color:#fac8004d}@supports (color:color-mix(in lab, red, red)){.border-yellow-400\/30{border-color:color-mix(in oklab, var(--color-yellow-400) 30%, transparent)}}.border-zinc-500\/30{border-color:#71717b4d}@supports (color:color-mix(in lab, red, red)){.border-zinc-500\/30{border-color:color-mix(in oklab, var(--color-zinc-500) 30%, transparent)}}.border-zinc-700{border-color:var(--color-zinc-700)}.\!bg-transparent{background-color:#0000!important}.bg-accent\/10{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab, var(--accent) 10%, transparent)}}.bg-background{background-color:var(--background)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-blue-500\/15{background-color:#3080ff26}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/15{background-color:color-mix(in oklab, var(--color-blue-500) 15%, transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/20{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.bg-border,.bg-border\/60{background-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.bg-border\/60{background-color:color-mix(in oklab, var(--border) 60%, transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-muted\/10{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/10{background-color:color-mix(in oklab, var(--muted) 10%, transparent)}}.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/20{background-color:color-mix(in oklab, var(--muted) 20%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/20{background-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/20{background-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.bg-zinc-700{background-color:var(--color-zinc-700)}.bg-zinc-700\/40{background-color:#3f3f4666}@supports (color:color-mix(in lab, red, red)){.bg-zinc-700\/40{background-color:color-mix(in oklab, var(--color-zinc-700) 40%, transparent)}}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/95{background-color:#18181bf2}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/95{background-color:color-mix(in oklab, var(--color-zinc-900) 95%, transparent)}}.bg-zinc-950{background-color:var(--color-zinc-950)}.bg-clip-padding{background-clip:padding-box}.p-1{padding:calc(var(--spacing) * 1)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-left{text-align:left}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.text-orange-400{color:var(--color-orange-400)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-yellow-300{color:var(--color-yellow-300)}.text-zinc-50{color:var(--color-zinc-50)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.\!opacity-0{opacity:0!important}.opacity-35{opacity:.35}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-blue-500\/10{--tw-ring-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\/10{--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.ring-blue-500\/30{--tw-ring-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\/30{--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 30%, transparent)}}.ring-zinc-100\/10{--tw-ring-color:#f4f4f51a}@supports (color:color-mix(in lab, red, red)){.ring-zinc-100\/10{--tw-ring-color:color-mix(in oklab, var(--color-zinc-100) 10%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}.placeholder\:text-muted-foreground\/70::placeholder{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-muted-foreground\/70::placeholder{color:color-mix(in oklab, var(--muted-foreground) 70%, transparent)}}@media (hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.hover\:bg-accent\/40:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/40:hover{background-color:color-mix(in oklab, var(--accent) 40%, transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-accent-foreground\/30:focus{border-color:var(--accent-foreground)}@supports (color:color-mix(in lab, red, red)){.focus\:border-accent-foreground\/30:focus{border-color:color-mix(in oklab, var(--accent-foreground) 30%, transparent)}}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-3:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-lg{border-radius:var(--radius)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-closed\:animate-out[data-closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-open\:animate-in[data-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0[data-open]{--tw-enter-opacity:0}.data-\[active\=false\]\:opacity-40[data-active=false]{opacity:.4}@media (hover:hover){.data-\[active\=false\]\:hover\:opacity-70[data-active=false]:hover{opacity:.7}}.data-\[active\=true\]\:border-border[data-active=true]{border-color:var(--border)}.data-\[active\=true\]\:bg-accent[data-active=true]{background-color:var(--accent)}.data-\[active\=true\]\:text-accent-foreground[data-active=true]{color:var(--accent-foreground)}.data-\[side\=bottom\]\:inset-x-0[data-side=bottom]{inset-inline:calc(var(--spacing) * 0)}.data-\[side\=bottom\]\:bottom-0[data-side=bottom]{bottom:calc(var(--spacing) * 0)}.data-\[side\=bottom\]\:h-auto[data-side=bottom]{height:auto}.data-\[side\=bottom\]\:border-t[data-side=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\[side\=bottom\]\:data-closed\:slide-out-to-bottom-10[data-side=bottom][data-closed]{--tw-exit-translate-y:calc(.1*100%)}.data-\[side\=bottom\]\:data-open\:slide-in-from-bottom-10[data-side=bottom][data-open]{--tw-enter-translate-y:calc(.1*100%)}.data-\[side\=left\]\:inset-y-0[data-side=left]{inset-block:calc(var(--spacing) * 0)}.data-\[side\=left\]\:left-0[data-side=left]{left:calc(var(--spacing) * 0)}.data-\[side\=left\]\:h-full[data-side=left]{height:100%}.data-\[side\=left\]\:w-3\/4[data-side=left]{width:75%}.data-\[side\=left\]\:border-r[data-side=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.data-\[side\=left\]\:data-closed\:slide-out-to-left-10[data-side=left][data-closed]{--tw-exit-translate-x:calc(.1*-100%)}.data-\[side\=left\]\:data-open\:slide-in-from-left-10[data-side=left][data-open]{--tw-enter-translate-x:calc(.1*-100%)}.data-\[side\=right\]\:inset-y-0[data-side=right]{inset-block:calc(var(--spacing) * 0)}.data-\[side\=right\]\:right-0[data-side=right]{right:calc(var(--spacing) * 0)}.data-\[side\=right\]\:h-full[data-side=right]{height:100%}.data-\[side\=right\]\:w-3\/4[data-side=right]{width:75%}.data-\[side\=right\]\:border-l[data-side=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.data-\[side\=right\]\:data-closed\:slide-out-to-right-10[data-side=right][data-closed]{--tw-exit-translate-x:calc(.1*100%)}.data-\[side\=right\]\:data-open\:slide-in-from-right-10[data-side=right][data-open]{--tw-enter-translate-x:calc(.1*100%)}.data-\[side\=top\]\:inset-x-0[data-side=top]{inset-inline:calc(var(--spacing) * 0)}.data-\[side\=top\]\:top-0[data-side=top]{top:calc(var(--spacing) * 0)}.data-\[side\=top\]\:h-auto[data-side=top]{height:auto}.data-\[side\=top\]\:border-b[data-side=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.data-\[side\=top\]\:data-closed\:slide-out-to-top-10[data-side=top][data-closed]{--tw-exit-translate-y:calc(.1*-100%)}.data-\[side\=top\]\:data-open\:slide-in-from-top-10[data-side=top][data-open]{--tw-enter-translate-y:calc(.1*-100%)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.sm\:max-w-\[480px\]{max-width:480px}.data-\[side\=left\]\:sm\:max-w-sm[data-side=left],.data-\[side\=right\]\:sm\:max-w-sm[data-side=right]{max-width:var(--container-sm)}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}@media (hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}@media (hover:hover){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.nimbit-devtools{--radius:.625rem;--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}