@ai-matrx/canvas 0.0.0-bootstrap.0 → 0.1.0

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 @@
1
+ {"version":3,"sources":["../src/react/provider.tsx","../src/core/types.ts","../src/core/ids.ts","../src/core/layout.ts","../src/core/reducer.ts","../src/core/store.ts","../src/core/persistence.ts","../src/core/controller.ts","../src/core/selectors.ts","../src/react/registry.ts","../src/react/CanvasColumn.tsx","../src/react/CanvasPane.tsx","../src/react/icons.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * CanvasProvider — binds a store, starts persistence, wires the hotkey, and\n * hands every descendant the ONE controller. A host adds it once at its root.\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport {\n createCanvasController,\n createCanvasStore,\n createLocalStorageCanvasPersistence,\n type CanvasController,\n type CanvasErrorSink,\n type CanvasItem,\n type CanvasPersistencePort,\n type CanvasState,\n type CanvasStoreBinding,\n} from \"../index\";\nimport {\n getCanvasKind,\n getCanvasKindsVersion,\n listCanvasKinds,\n subscribeCanvasKinds,\n type AnyCanvasKind,\n type CanvasMenuItem,\n} from \"./registry\";\n\n/**\n * Host capabilities that apply to EVERY kind — this is how saving, sharing and\n * history are \"handled globally\": the host answers them once, here, and every\n * item that qualifies gets the entries in its \"…\" menu.\n */\nexport interface CanvasHostPorts {\n /** Extra \"…\" menu entries for an item (share, save to cloud, version history…). */\n readonly itemActions?: (item: CanvasItem, kind: AnyCanvasKind | undefined) => readonly CanvasMenuItem[];\n /** Pops an item out into a floating window. Absent ⇒ no \"Pop out\" entry. */\n readonly popOut?: (item: CanvasItem) => void;\n}\n\ninterface CanvasContextValue {\n readonly controller: CanvasController;\n readonly ports: CanvasHostPorts;\n}\n\n/** Phones show an open canvas full screen; a remembered \"open\" never takes over a phone on load. */\nconst PHONE_MAX_WIDTH = 767;\nconst isPhoneViewport = () => typeof window !== \"undefined\" && window.innerWidth <= PHONE_MAX_WIDTH;\n\n/** Escape belongs to a menu, dialog or listbox when one has focus. */\nfunction escapeBelongsElsewhere(event: KeyboardEvent): boolean {\n if (event.defaultPrevented) return true;\n const active = typeof document === \"undefined\" ? null : document.activeElement;\n return !!active?.closest?.('[role=\"menu\"], [role=\"dialog\"], [role=\"alertdialog\"], [role=\"listbox\"]');\n}\n\nconst CanvasContext = createContext<CanvasContextValue | null>(null);\n\nexport interface CanvasProviderProps extends CanvasHostPorts {\n readonly children: ReactNode;\n /** A Redux-bound store (bindCanvasToReduxStore). Omit for a standalone store. */\n readonly store?: CanvasStoreBinding;\n /** `null` turns memory off. Default: localStorage. */\n readonly persistence?: CanvasPersistencePort | null;\n readonly onError?: CanvasErrorSink;\n /** ⌘\\ / Ctrl+\\ toggles the canvas; Escape leaves full screen. Default true. */\n readonly hotkeys?: boolean;\n}\n\nexport function CanvasProvider({\n children,\n store,\n persistence,\n onError,\n hotkeys = true,\n itemActions,\n popOut,\n}: CanvasProviderProps) {\n const [controller] = useState(() =>\n createCanvasController({\n store: store ?? createCanvasStore(),\n persistence: persistence === undefined ? createLocalStorageCanvasPersistence() : persistence,\n isRestorable: (kind) => getCanvasKind(kind)?.restore !== false,\n mayRestoreOpen: () => !isPhoneViewport(),\n onError,\n }),\n );\n\n useEffect(() => controller.start(), [controller]);\n\n useEffect(() => {\n if (!hotkeys) return;\n const onKey = (event: KeyboardEvent) => {\n if (!controller.isPresented()) return; // no column here — the shortcut has nothing to show\n if (event.key === \"\\\\\" && (event.metaKey || event.ctrlKey) && !event.altKey && !event.shiftKey) {\n event.preventDefault();\n controller.toggle();\n } else if (event.key === \"Escape\" && controller.getState().isFullscreen && !escapeBelongsElsewhere(event)) {\n controller.setFullscreen(false);\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [controller, hotkeys]);\n\n const ports: CanvasHostPorts = {\n ...(itemActions ? { itemActions } : {}),\n ...(popOut ? { popOut } : {}),\n };\n\n return <CanvasContext.Provider value={{ controller, ports }}>{children}</CanvasContext.Provider>;\n}\n\nfunction useCanvasContext(): CanvasContextValue {\n const value = useContext(CanvasContext);\n if (!value) throw new Error(\"[@ai-matrx/canvas] useCanvas* must be used inside <CanvasProvider>.\");\n return value;\n}\n\n/** The controller: open, close, toggle, split… */\nexport function useCanvas(): CanvasController {\n return useCanvasContext().controller;\n}\n\n/** Same as useCanvas, but null outside a provider (for components that may render anywhere). */\nexport function useOptionalCanvas(): CanvasController | null {\n return useContext(CanvasContext)?.controller ?? null;\n}\n\nexport function useCanvasHostPorts(): CanvasHostPorts {\n return useCanvasContext().ports;\n}\n\n/** Registers a mounted canvas column with the controller for its lifetime. */\nexport function useRegisterCanvasPresence(): void {\n const controller = useContext(CanvasContext)?.controller;\n useEffect(() => controller?.registerPresentation(), [controller]);\n}\n\nconst noPresence = () => () => undefined;\n\n/** True when a canvas column is on screen in this tree — the ONE availability answer. */\nexport function useCanvasIsPresented(): boolean {\n const controller = useContext(CanvasContext)?.controller;\n return useSyncExternalStore(\n controller ? controller.subscribePresentation : noPresence,\n () => controller?.isPresented() ?? false,\n () => false,\n );\n}\n\n/** Subscribes to a slice of canvas state. The selector must return stable values. */\nexport function useCanvasState<T>(selector: (state: CanvasState) => T): T {\n const { store } = useCanvasContext().controller;\n return useSyncExternalStore(\n store.subscribe,\n () => selector(store.getState()),\n () => selector(store.getState()),\n );\n}\n\nconst NO_SUBSCRIPTION = () => () => undefined;\n\n/**\n * Like useCanvasState, but safe outside a provider: returns `fallback` there.\n * For components that may render in a tree with no canvas (a bare test, an\n * embed). `fallback` must be referentially stable (a primitive or null).\n */\nexport function useOptionalCanvasState<T>(selector: (state: CanvasState) => T, fallback: T): T {\n const store = useContext(CanvasContext)?.controller.store;\n const read = () => (store ? selector(store.getState()) : fallback);\n return useSyncExternalStore(store ? store.subscribe : NO_SUBSCRIPTION, read, read);\n}\n\n/** Re-renders when kinds register, so late-registered kinds appear. */\nexport function useCanvasKinds(): readonly AnyCanvasKind[] {\n useSyncExternalStore(subscribeCanvasKinds, getCanvasKindsVersion, getCanvasKindsVersion);\n return listCanvasKinds();\n}\n\nexport function useCanvasKind(id: string): AnyCanvasKind | undefined {\n useSyncExternalStore(subscribeCanvasKinds, getCanvasKindsVersion, getCanvasKindsVersion);\n return getCanvasKind(id);\n}\n","/**\n * @ai-matrx/canvas — core types.\n *\n * The canvas is ONE docked column on the right edge of an application. It holds\n * panes; panes hold tabs; every tab is one CanvasItem. A CanvasItem is\n * identified by `kind` + `key`, so opening the same thing twice always lands on\n * the existing tab instead of creating a duplicate.\n *\n * Everything in CanvasState is plain JSON: it lives in the host's Redux store\n * (or the package's own standalone store), it is persisted between sessions,\n * and it can be inspected. No functions, no class instances, no React nodes.\n */\n\n/** Any value that survives JSON.stringify → JSON.parse unchanged. */\nexport type CanvasJson =\n | string\n | number\n | boolean\n | null\n | readonly CanvasJson[]\n | { readonly [key: string]: CanvasJson | undefined };\n\ndeclare const itemIdBrand: unique symbol;\ndeclare const paneIdBrand: unique symbol;\ndeclare const splitIdBrand: unique symbol;\n\n/** `${kind}::${key}` — the identity of one thing on the canvas. */\nexport type CanvasItemId = string & { readonly [itemIdBrand]: true };\nexport type CanvasPaneId = string & { readonly [paneIdBrand]: true };\nexport type CanvasSplitId = string & { readonly [splitIdBrand]: true };\n\nexport interface CanvasItem {\n readonly id: CanvasItemId;\n /** Registered kind id (see `registerCanvasKind`). */\n readonly kind: string;\n /** Stable key inside the kind — an artifact id, a conversation id, \"default\". */\n readonly key: string;\n /** Explicit tab title. `null` ⇒ the kind's `title(data)` or its label. */\n readonly title: string | null;\n readonly data: CanvasJson;\n readonly openedAt: number;\n readonly updatedAt: number;\n}\n\nexport interface CanvasPane {\n readonly id: CanvasPaneId;\n readonly itemIds: readonly CanvasItemId[];\n readonly activeItemId: CanvasItemId | null;\n}\n\n/** \"horizontal\" = children side by side; \"vertical\" = children stacked. */\nexport type CanvasOrientation = \"horizontal\" | \"vertical\";\n\nexport type CanvasLayoutNode =\n | { readonly type: \"pane\"; readonly paneId: CanvasPaneId }\n | {\n readonly type: \"split\";\n readonly id: CanvasSplitId;\n readonly orientation: CanvasOrientation;\n readonly children: readonly CanvasLayoutNode[];\n /** Fractions, one per child, summing to 1. */\n readonly sizes: readonly number[];\n };\n\nexport interface CanvasState {\n readonly version: 1;\n readonly isOpen: boolean;\n readonly isFullscreen: boolean;\n /** Column width in CSS pixels (desktop). */\n readonly width: number;\n readonly layout: CanvasLayoutNode;\n readonly panes: { readonly [paneId: string]: CanvasPane };\n readonly items: { readonly [itemId: string]: CanvasItem };\n readonly focusedPaneId: CanvasPaneId;\n /** Monotonic counter for minting pane/split ids — keeps the reducer pure. */\n readonly seq: number;\n /** True once a persisted snapshot was applied (or there was none). */\n readonly hydrated: boolean;\n}\n\n/** Where a newly opened item goes. Existing items never move on open. */\nexport type CanvasOpenTarget =\n | \"focused\"\n | \"split-right\"\n | \"split-down\"\n | { readonly paneId: CanvasPaneId };\n\nexport interface CanvasOpenInput {\n readonly kind: string;\n readonly key: string;\n readonly title?: string | null | undefined;\n readonly data?: CanvasJson | undefined;\n readonly target?: CanvasOpenTarget | undefined;\n /** Reveal the canvas when it is put away. Default true. */\n readonly reveal?: boolean | undefined;\n /** Make the item the pane's active tab. Default true. */\n readonly activate?: boolean | undefined;\n}\n\nexport const CANVAS_MIN_WIDTH = 360;\nexport const CANVAS_DEFAULT_WIDTH = 640;\nexport const CANVAS_MIN_SPLIT_FRACTION = 0.12;\n","import type { CanvasItemId, CanvasJson, CanvasPaneId, CanvasSplitId } from \"./types\";\n\nconst SEP = \"::\";\n\nexport function canvasItemId(kind: string, key: string): CanvasItemId {\n return `${kind}${SEP}${key}` as CanvasItemId;\n}\n\nexport function parseCanvasItemId(id: CanvasItemId): { kind: string; key: string } {\n const at = id.indexOf(SEP);\n return at < 0 ? { kind: id, key: \"\" } : { kind: id.slice(0, at), key: id.slice(at + SEP.length) };\n}\n\nexport function paneIdFromSeq(seq: number): CanvasPaneId {\n return `pane-${seq}` as CanvasPaneId;\n}\n\nexport function splitIdFromSeq(seq: number): CanvasSplitId {\n return `split-${seq}` as CanvasSplitId;\n}\n\n/**\n * Returns the path of the first value that is NOT plain JSON, or null when the\n * whole value is JSON. Functions, class instances, Dates, Maps, NaN and\n * Infinity all fail — they would silently vanish or change on persist.\n */\nexport function findNonJson(value: unknown, path = \"data\"): string | null {\n if (value === null) return null;\n switch (typeof value) {\n case \"string\":\n case \"boolean\":\n return null;\n case \"number\":\n return Number.isFinite(value) ? null : path;\n case \"object\": {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const bad = findNonJson(value[i], `${path}[${i}]`);\n if (bad) return bad;\n }\n return null;\n }\n const proto = Object.getPrototypeOf(value) as unknown;\n if (proto !== Object.prototype && proto !== null) return path;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v === undefined) continue;\n const bad = findNonJson(v, `${path}.${k}`);\n if (bad) return bad;\n }\n return null;\n }\n default:\n return path;\n }\n}\n\nexport function isCanvasJson(value: unknown): value is CanvasJson {\n return findNonJson(value) === null;\n}\n","/**\n * Pure helpers over the canvas layout tree. Every function returns a new tree\n * and never mutates its input.\n */\n\nimport {\n CANVAS_MIN_SPLIT_FRACTION,\n type CanvasLayoutNode,\n type CanvasOrientation,\n type CanvasPaneId,\n type CanvasSplitId,\n} from \"./types\";\n\nexport function listPaneIds(node: CanvasLayoutNode): CanvasPaneId[] {\n if (node.type === \"pane\") return [node.paneId];\n return node.children.flatMap(listPaneIds);\n}\n\nexport function containsPane(node: CanvasLayoutNode, paneId: CanvasPaneId): boolean {\n if (node.type === \"pane\") return node.paneId === paneId;\n return node.children.some((child) => containsPane(child, paneId));\n}\n\nfunction evenSizes(count: number): number[] {\n return Array.from({ length: count }, () => 1 / count);\n}\n\n/** Renormalizes to sum 1; falls back to even sizes for garbage input. */\nexport function normalizeSizes(sizes: readonly number[], count: number): number[] {\n if (sizes.length !== count || sizes.some((s) => !Number.isFinite(s) || s <= 0)) {\n return evenSizes(count);\n }\n const total = sizes.reduce((sum, s) => sum + s, 0);\n return sizes.map((s) => s / total);\n}\n\n/**\n * Places `newPaneId` beside `paneId`. When the pane's parent already splits in\n * the same orientation the new pane becomes a sibling (sharing the pane's\n * space); otherwise the pane is replaced by a new two-way split.\n */\nexport function splitPane(\n node: CanvasLayoutNode,\n paneId: CanvasPaneId,\n newPaneId: CanvasPaneId,\n orientation: CanvasOrientation,\n newSplitId: CanvasSplitId,\n): CanvasLayoutNode {\n if (node.type === \"pane\") {\n if (node.paneId !== paneId) return node;\n return {\n type: \"split\",\n id: newSplitId,\n orientation,\n children: [node, { type: \"pane\", paneId: newPaneId }],\n sizes: [0.5, 0.5],\n };\n }\n const index = node.children.findIndex(\n (child) => child.type === \"pane\" && child.paneId === paneId,\n );\n if (index >= 0 && node.orientation === orientation) {\n const share = node.sizes[index] ?? 1 / node.children.length;\n const children = [...node.children];\n children.splice(index + 1, 0, { type: \"pane\", paneId: newPaneId });\n const sizes = [...node.sizes];\n sizes.splice(index, 1, share / 2, share / 2);\n return { ...node, children, sizes: normalizeSizes(sizes, children.length) };\n }\n return {\n ...node,\n children: node.children.map((child) =>\n splitPane(child, paneId, newPaneId, orientation, newSplitId),\n ),\n };\n}\n\n/**\n * Removes a pane. A split left with one child collapses into that child, and\n * the removed pane's space goes to its siblings proportionally. Returns null\n * when the tree held only that pane.\n */\nexport function removePane(\n node: CanvasLayoutNode,\n paneId: CanvasPaneId,\n): CanvasLayoutNode | null {\n if (node.type === \"pane\") return node.paneId === paneId ? null : node;\n const children: CanvasLayoutNode[] = [];\n const sizes: number[] = [];\n node.children.forEach((child, i) => {\n const next = removePane(child, paneId);\n if (next) {\n children.push(next);\n sizes.push(node.sizes[i] ?? 1 / node.children.length);\n }\n });\n if (children.length === 0) return null;\n if (children.length === 1) return children[0] ?? null;\n return { ...node, children, sizes: normalizeSizes(sizes, children.length) };\n}\n\nexport function resizeSplit(\n node: CanvasLayoutNode,\n splitId: CanvasSplitId,\n sizes: readonly number[],\n): CanvasLayoutNode {\n if (node.type === \"pane\") return node;\n if (node.id === splitId) {\n const clamped = sizes.map((s) => Math.max(CANVAS_MIN_SPLIT_FRACTION, s));\n return { ...node, sizes: normalizeSizes(clamped, node.children.length) };\n }\n return {\n ...node,\n children: node.children.map((child) => resizeSplit(child, splitId, sizes)),\n };\n}\n\n/** True when the tree is well formed against the set of known panes. */\nexport function isValidLayout(\n node: unknown,\n knownPanes: ReadonlySet<string>,\n seen: Set<string> = new Set(),\n): node is CanvasLayoutNode {\n if (!node || typeof node !== \"object\") return false;\n const n = node as Record<string, unknown>;\n if (n.type === \"pane\") {\n const id = n.paneId;\n if (typeof id !== \"string\" || !knownPanes.has(id) || seen.has(id)) return false;\n seen.add(id);\n return true;\n }\n if (n.type !== \"split\") return false;\n if (typeof n.id !== \"string\") return false;\n if (n.orientation !== \"horizontal\" && n.orientation !== \"vertical\") return false;\n if (!Array.isArray(n.children) || n.children.length < 2) return false;\n if (!Array.isArray(n.sizes) || n.sizes.length !== n.children.length) return false;\n return n.children.every((child) => isValidLayout(child, knownPanes, seen));\n}\n","/**\n * THE canvas reducer. Plain Redux-compatible reducer + action creators with no\n * Redux Toolkit dependency, so it mounts in a host's RTK store\n * (`canvasHost: canvasReducer`) or runs inside the package's own standalone\n * store with identical behaviour.\n *\n * Identity law: an item is `kind::key`. Opening an item that is already on the\n * canvas never duplicates it — it refreshes its data/title, activates its tab\n * and focuses its pane, wherever that pane is.\n */\n\nimport { canvasItemId, paneIdFromSeq, splitIdFromSeq } from \"./ids\";\nimport { isValidLayout, listPaneIds, normalizeSizes, removePane, resizeSplit, splitPane } from \"./layout\";\nimport {\n CANVAS_DEFAULT_WIDTH,\n CANVAS_MIN_WIDTH,\n type CanvasItem,\n type CanvasItemId,\n type CanvasJson,\n type CanvasLayoutNode,\n type CanvasOpenInput,\n type CanvasOrientation,\n type CanvasPane,\n type CanvasPaneId,\n type CanvasSplitId,\n type CanvasState,\n} from \"./types\";\n\nconst P = \"matrxCanvas/\";\n\nexport type CanvasAction =\n | { type: `${typeof P}open`; payload: CanvasOpenInput & { now: number } }\n | { type: `${typeof P}update`; payload: { itemId: CanvasItemId; data?: CanvasJson | undefined; title?: string | null | undefined; now: number } }\n | { type: `${typeof P}rekey`; payload: { itemId: CanvasItemId; key: string } }\n | { type: `${typeof P}closeItem`; payload: { itemId: CanvasItemId } }\n | { type: `${typeof P}closeOthers`; payload: { itemId: CanvasItemId } }\n | { type: `${typeof P}activate`; payload: { itemId: CanvasItemId } }\n | { type: `${typeof P}focusPane`; payload: { paneId: CanvasPaneId } }\n | { type: `${typeof P}moveItem`; payload: { itemId: CanvasItemId; toPaneId: CanvasPaneId; index?: number | undefined } }\n | { type: `${typeof P}splitPane`; payload: { paneId: CanvasPaneId; orientation: CanvasOrientation; moveItemId?: CanvasItemId | undefined } }\n | { type: `${typeof P}closePane`; payload: { paneId: CanvasPaneId } }\n | { type: `${typeof P}resizeSplit`; payload: { splitId: CanvasSplitId; sizes: readonly number[] } }\n | { type: `${typeof P}setOpen`; payload: { open: boolean } }\n | { type: `${typeof P}toggle` }\n | { type: `${typeof P}setFullscreen`; payload: { fullscreen: boolean } }\n | { type: `${typeof P}setWidth`; payload: { width: number } }\n | { type: `${typeof P}hydrate`; payload: { snapshot: CanvasState | null } }\n | { type: `${typeof P}reset` };\n\nexport const canvasActions = {\n open: (input: CanvasOpenInput): CanvasAction => ({ type: `${P}open`, payload: { ...input, now: Date.now() } }),\n update: (itemId: CanvasItemId, patch: { data?: CanvasJson | undefined; title?: string | null | undefined }): CanvasAction => ({\n type: `${P}update`,\n payload: { itemId, ...patch, now: Date.now() },\n }),\n /** Gives an item a new identity in place (e.g. a draft that was just saved and now has an id). */\n rekey: (itemId: CanvasItemId, key: string): CanvasAction => ({ type: `${P}rekey`, payload: { itemId, key } }),\n closeItem: (itemId: CanvasItemId): CanvasAction => ({ type: `${P}closeItem`, payload: { itemId } }),\n closeOthers: (itemId: CanvasItemId): CanvasAction => ({ type: `${P}closeOthers`, payload: { itemId } }),\n activate: (itemId: CanvasItemId): CanvasAction => ({ type: `${P}activate`, payload: { itemId } }),\n focusPane: (paneId: CanvasPaneId): CanvasAction => ({ type: `${P}focusPane`, payload: { paneId } }),\n moveItem: (itemId: CanvasItemId, toPaneId: CanvasPaneId, index?: number): CanvasAction => ({\n type: `${P}moveItem`,\n payload: { itemId, toPaneId, index },\n }),\n splitPane: (paneId: CanvasPaneId, orientation: CanvasOrientation, moveItemId?: CanvasItemId): CanvasAction => ({\n type: `${P}splitPane`,\n payload: { paneId, orientation, moveItemId },\n }),\n closePane: (paneId: CanvasPaneId): CanvasAction => ({ type: `${P}closePane`, payload: { paneId } }),\n resizeSplit: (splitId: CanvasSplitId, sizes: readonly number[]): CanvasAction => ({\n type: `${P}resizeSplit`,\n payload: { splitId, sizes },\n }),\n setOpen: (open: boolean): CanvasAction => ({ type: `${P}setOpen`, payload: { open } }),\n toggle: (): CanvasAction => ({ type: `${P}toggle` }),\n setFullscreen: (fullscreen: boolean): CanvasAction => ({ type: `${P}setFullscreen`, payload: { fullscreen } }),\n setWidth: (width: number): CanvasAction => ({ type: `${P}setWidth`, payload: { width } }),\n hydrate: (snapshot: CanvasState | null): CanvasAction => ({ type: `${P}hydrate`, payload: { snapshot } }),\n reset: (): CanvasAction => ({ type: `${P}reset` }),\n} as const;\n\nexport function isCanvasAction(action: unknown): action is CanvasAction {\n return (\n !!action &&\n typeof action === \"object\" &&\n typeof (action as { type?: unknown }).type === \"string\" &&\n (action as { type: string }).type.startsWith(P)\n );\n}\n\nexport function createInitialCanvasState(): CanvasState {\n const paneId = paneIdFromSeq(1);\n return {\n version: 1,\n isOpen: false,\n isFullscreen: false,\n width: CANVAS_DEFAULT_WIDTH,\n layout: { type: \"pane\", paneId },\n panes: { [paneId]: { id: paneId, itemIds: [], activeItemId: null } },\n items: {},\n focusedPaneId: paneId,\n seq: 1,\n hydrated: false,\n };\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nfunction paneOf(state: CanvasState, itemId: CanvasItemId): CanvasPane | null {\n for (const pane of Object.values(state.panes)) {\n if (pane.itemIds.includes(itemId)) return pane;\n }\n return null;\n}\n\nfunction withPane(state: CanvasState, pane: CanvasPane): CanvasState {\n return { ...state, panes: { ...state.panes, [pane.id]: pane } };\n}\n\n/** After removing `itemId` from a tab list, the neighbour that takes focus. */\nfunction nextActive(itemIds: readonly CanvasItemId[], removed: CanvasItemId, current: CanvasItemId | null): CanvasItemId | null {\n if (current !== removed) return current;\n const index = itemIds.indexOf(removed);\n const rest = itemIds.filter((id) => id !== removed);\n return rest[Math.min(index, rest.length - 1)] ?? null;\n}\n\nfunction detachItem(state: CanvasState, itemId: CanvasItemId): CanvasState {\n const pane = paneOf(state, itemId);\n if (!pane) return state;\n return withPane(state, {\n ...pane,\n itemIds: pane.itemIds.filter((id) => id !== itemId),\n activeItemId: nextActive(pane.itemIds, itemId, pane.activeItemId),\n });\n}\n\nfunction dropPane(state: CanvasState, paneId: CanvasPaneId): CanvasState {\n const layout = removePane(state.layout, paneId);\n if (!layout) return state; // never remove the last pane\n const panes = { ...state.panes };\n delete panes[paneId];\n const focusedPaneId = state.focusedPaneId === paneId ? (listPaneIds(layout)[0] ?? state.focusedPaneId) : state.focusedPaneId;\n return { ...state, layout, panes, focusedPaneId };\n}\n\nfunction addSplit(state: CanvasState, paneId: CanvasPaneId, orientation: CanvasOrientation): { state: CanvasState; newPaneId: CanvasPaneId } {\n const seq = state.seq + 1;\n const newPaneId = paneIdFromSeq(seq);\n const layout = splitPane(state.layout, paneId, newPaneId, orientation, splitIdFromSeq(seq));\n return {\n newPaneId,\n state: {\n ...state,\n seq,\n layout,\n panes: { ...state.panes, [newPaneId]: { id: newPaneId, itemIds: [], activeItemId: null } },\n focusedPaneId: newPaneId,\n },\n };\n}\n\nfunction insertInto(state: CanvasState, paneId: CanvasPaneId, itemId: CanvasItemId, activate: boolean, index?: number): CanvasState {\n const pane = state.panes[paneId];\n if (!pane) return state;\n const itemIds = [...pane.itemIds.filter((id) => id !== itemId)];\n const at = index === undefined ? afterActive(itemIds, pane.activeItemId) : Math.max(0, Math.min(index, itemIds.length));\n itemIds.splice(at, 0, itemId);\n return withPane(state, {\n ...pane,\n itemIds,\n activeItemId: activate || pane.activeItemId === null ? itemId : pane.activeItemId,\n });\n}\n\n/** New tabs open right after the active tab, the way browsers do it. */\nfunction afterActive(itemIds: readonly CanvasItemId[], active: CanvasItemId | null): number {\n const index = active ? itemIds.indexOf(active) : -1;\n return index < 0 ? itemIds.length : index + 1;\n}\n\nfunction clampWidth(width: number): number {\n return Number.isFinite(width) ? Math.max(CANVAS_MIN_WIDTH, Math.round(width)) : CANVAS_DEFAULT_WIDTH;\n}\n\n/**\n * Validates a persisted snapshot. Anything malformed is dropped back to the\n * initial state rather than half-applied — a corrupt layout must never crash\n * the shell.\n */\nexport function sanitizeCanvasSnapshot(raw: unknown): CanvasState | null {\n if (!raw || typeof raw !== \"object\") return null;\n const s = raw as Partial<CanvasState>;\n if (s.version !== 1 || !s.panes || !s.items || !s.layout) return null;\n const paneIds = new Set(Object.keys(s.panes));\n if (!isValidLayout(s.layout, paneIds)) return null;\n const layoutPanes = new Set<string>(listPaneIds(s.layout));\n if (layoutPanes.size !== paneIds.size) return null;\n const items: Record<string, CanvasItem> = {};\n for (const [id, item] of Object.entries(s.items)) {\n if (item && typeof item.kind === \"string\" && typeof item.key === \"string\" && canvasItemId(item.kind, item.key) === id) {\n items[id] = item;\n }\n }\n const panes: Record<string, CanvasPane> = {};\n for (const [id, pane] of Object.entries(s.panes)) {\n const itemIds = (Array.isArray(pane.itemIds) ? pane.itemIds : []).filter((itemId) => itemId in items);\n const activeItemId = pane.activeItemId && itemIds.includes(pane.activeItemId) ? pane.activeItemId : (itemIds[0] ?? null);\n panes[id] = { id: id as CanvasPaneId, itemIds, activeItemId };\n }\n const focused = s.focusedPaneId && paneIds.has(s.focusedPaneId) ? s.focusedPaneId : listPaneIds(s.layout)[0];\n if (!focused) return null;\n const layout = normalizeLayout(s.layout);\n // seq must stay ahead of every id already minted, or the next split collides.\n const seq = Math.max(typeof s.seq === \"number\" && Number.isFinite(s.seq) ? s.seq : 0, highestIdNumber(layout));\n return {\n version: 1,\n isOpen: s.isOpen === true,\n // Full screen is a moment, not a preference: a reload never starts there.\n isFullscreen: false,\n width: clampWidth(typeof s.width === \"number\" ? s.width : CANVAS_DEFAULT_WIDTH),\n layout,\n panes,\n items,\n focusedPaneId: focused,\n seq,\n hydrated: true,\n };\n}\n\nfunction normalizeLayout(node: CanvasLayoutNode): CanvasLayoutNode {\n if (node.type === \"pane\") return node;\n return { ...node, sizes: normalizeSizes(node.sizes, node.children.length), children: node.children.map(normalizeLayout) };\n}\n\nfunction highestIdNumber(node: CanvasLayoutNode): number {\n const own = Number((node.type === \"pane\" ? node.paneId : node.id).split(\"-\").pop());\n const mine = Number.isFinite(own) ? own : 0;\n return node.type === \"pane\" ? mine : Math.max(mine, ...node.children.map(highestIdNumber));\n}\n\n// ── reducer ────────────────────────────────────────────────────────────────\n\nexport function canvasReducer(state: CanvasState = createInitialCanvasState(), action: { type: string }): CanvasState {\n if (!isCanvasAction(action)) return state;\n switch (action.type) {\n case `${P}open`: {\n const { kind, key, title, data, target = \"focused\", reveal = true, activate = true, now } = action.payload;\n const itemId = canvasItemId(kind, key);\n const existing = state.items[itemId];\n let next = state;\n if (existing) {\n const item: CanvasItem = {\n ...existing,\n ...(data !== undefined ? { data } : {}),\n ...(title !== undefined ? { title } : {}),\n updatedAt: now,\n };\n next = { ...next, items: { ...next.items, [itemId]: item } };\n const pane = paneOf(next, itemId);\n if (pane && activate) next = { ...withPane(next, { ...pane, activeItemId: itemId }), focusedPaneId: pane.id };\n if (!pane) next = insertInto(next, next.focusedPaneId, itemId, true);\n } else {\n const item: CanvasItem = { id: itemId, kind, key, title: title ?? null, data: data ?? null, openedAt: now, updatedAt: now };\n next = { ...next, items: { ...next.items, [itemId]: item } };\n let paneId: CanvasPaneId = next.focusedPaneId;\n if (typeof target === \"object\" && next.panes[target.paneId]) {\n paneId = target.paneId;\n } else if (target === \"split-right\" || target === \"split-down\") {\n const split = addSplit(next, next.focusedPaneId, target === \"split-right\" ? \"horizontal\" : \"vertical\");\n next = split.state;\n paneId = split.newPaneId;\n }\n next = insertInto(next, paneId, itemId, activate);\n if (activate) next = { ...next, focusedPaneId: paneId };\n }\n return reveal ? { ...next, isOpen: true } : next;\n }\n case `${P}update`: {\n const { itemId, data, title, now } = action.payload;\n const item = state.items[itemId];\n if (!item) return state;\n return {\n ...state,\n items: {\n ...state.items,\n [itemId]: { ...item, ...(data !== undefined ? { data } : {}), ...(title !== undefined ? { title } : {}), updatedAt: now },\n },\n };\n }\n case `${P}rekey`: {\n const { itemId, key } = action.payload;\n const item = state.items[itemId];\n if (!item || item.key === key) return state;\n const nextId = canvasItemId(item.kind, key);\n // The new identity is already open elsewhere: keep that one, drop this.\n if (state.items[nextId]) return canvasReducer(canvasReducer(state, canvasActions.closeItem(itemId)), canvasActions.activate(nextId));\n const items = { ...state.items, [nextId]: { ...item, id: nextId, key } };\n delete items[itemId];\n const panes: Record<string, CanvasPane> = {};\n for (const pane of Object.values(state.panes)) {\n panes[pane.id] = pane.itemIds.includes(itemId)\n ? {\n ...pane,\n itemIds: pane.itemIds.map((id) => (id === itemId ? nextId : id)),\n activeItemId: pane.activeItemId === itemId ? nextId : pane.activeItemId,\n }\n : pane;\n }\n return { ...state, items, panes };\n }\n case `${P}closeItem`: {\n const { itemId } = action.payload;\n if (!state.items[itemId]) return state;\n const pane = paneOf(state, itemId);\n let next = detachItem(state, itemId);\n const items = { ...next.items };\n delete items[itemId];\n next = { ...next, items };\n // A pane emptied by closing its last tab goes away, unless it is the only one.\n if (pane && next.panes[pane.id]?.itemIds.length === 0) next = dropPane(next, pane.id);\n return next;\n }\n case `${P}closeOthers`: {\n const { itemId } = action.payload;\n const pane = paneOf(state, itemId);\n if (!pane) return state;\n const items = { ...state.items };\n for (const id of pane.itemIds) if (id !== itemId) delete items[id];\n return { ...withPane(state, { ...pane, itemIds: [itemId], activeItemId: itemId }), items };\n }\n case `${P}activate`: {\n const pane = paneOf(state, action.payload.itemId);\n if (!pane) return state;\n return { ...withPane(state, { ...pane, activeItemId: action.payload.itemId }), focusedPaneId: pane.id };\n }\n case `${P}focusPane`:\n return state.panes[action.payload.paneId] ? { ...state, focusedPaneId: action.payload.paneId } : state;\n case `${P}moveItem`: {\n const { itemId, toPaneId, index } = action.payload;\n const from = paneOf(state, itemId);\n if (!from || !state.panes[toPaneId]) return state;\n // Dropped back onto its own pane with no position: nothing moved.\n if (from.id === toPaneId && index === undefined) return state.focusedPaneId === toPaneId ? state : { ...state, focusedPaneId: toPaneId };\n let next = from.id === toPaneId ? state : detachItem(state, itemId);\n next = insertInto(next, toPaneId, itemId, true, index);\n next = { ...next, focusedPaneId: toPaneId };\n if (from.id !== toPaneId && next.panes[from.id]?.itemIds.length === 0) next = dropPane(next, from.id);\n return next;\n }\n case `${P}splitPane`: {\n const { paneId, orientation, moveItemId } = action.payload;\n const pane = state.panes[paneId];\n if (!pane) return state;\n const split = addSplit(state, paneId, orientation);\n let next = split.state;\n // The new pane takes the requested tab when its old pane keeps something;\n // otherwise it starts empty and shows the launcher.\n if (moveItemId && pane.itemIds.includes(moveItemId) && pane.itemIds.length > 1) {\n next = detachItem(next, moveItemId);\n next = insertInto(next, split.newPaneId, moveItemId, true);\n }\n return next;\n }\n case `${P}closePane`: {\n const pane = state.panes[action.payload.paneId];\n if (!pane) return state;\n const onlyPane = listPaneIds(state.layout).length === 1;\n // Closing the last pane puts the canvas away and KEEPS its tabs — the\n // toggle brings everything back exactly as it was.\n if (onlyPane) return { ...state, isOpen: false, isFullscreen: false };\n const items = { ...state.items };\n for (const id of pane.itemIds) delete items[id];\n return dropPane({ ...state, items }, pane.id);\n }\n case `${P}resizeSplit`:\n return { ...state, layout: resizeSplit(state.layout, action.payload.splitId, action.payload.sizes) };\n case `${P}setOpen`:\n return action.payload.open === state.isOpen\n ? state\n : { ...state, isOpen: action.payload.open, isFullscreen: action.payload.open ? state.isFullscreen : false };\n case `${P}toggle`:\n return { ...state, isOpen: !state.isOpen, isFullscreen: state.isOpen ? false : state.isFullscreen };\n case `${P}setFullscreen`:\n return { ...state, isFullscreen: action.payload.fullscreen, isOpen: action.payload.fullscreen ? true : state.isOpen };\n case `${P}setWidth`:\n return { ...state, width: clampWidth(action.payload.width) };\n case `${P}hydrate`: {\n const snapshot = action.payload.snapshot ? sanitizeCanvasSnapshot(action.payload.snapshot) : null;\n if (!snapshot) return { ...state, hydrated: true };\n // Anything opened before hydration finished wins over the snapshot.\n let next: CanvasState = snapshot;\n for (const item of Object.values(state.items)) {\n const pane = paneOf(state, item.id);\n next = { ...next, items: { ...next.items, [item.id]: item } };\n if (!paneOf(next, item.id)) next = insertInto(next, next.focusedPaneId, item.id, pane?.activeItemId === item.id);\n }\n return { ...next, isOpen: next.isOpen || state.isOpen, hydrated: true };\n }\n case `${P}reset`:\n return { ...createInitialCanvasState(), hydrated: true };\n default:\n return state;\n }\n}\n","/**\n * The store seam. The canvas never owns a second copy of its state: it reads\n * and writes through a CanvasStoreBinding.\n *\n * - A host WITH Redux mounts `canvasReducer` in its root reducer and binds it:\n * bindCanvasToReduxStore(store, (root) => root.canvasHost)\n * - A host WITHOUT Redux (a Vite tool, an Electron window) calls\n * createCanvasStore()\n * which runs the very same reducer in a tiny standalone store.\n */\n\nimport { canvasReducer, createInitialCanvasState, type CanvasAction } from \"./reducer\";\nimport type { CanvasState } from \"./types\";\n\nexport interface CanvasStoreBinding {\n getState(): CanvasState;\n dispatch(action: CanvasAction): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createCanvasStore(initial?: CanvasState): CanvasStoreBinding {\n let state = initial ?? createInitialCanvasState();\n const listeners = new Set<() => void>();\n return {\n getState: () => state,\n dispatch(action) {\n const next = canvasReducer(state, action);\n if (next === state) return;\n state = next;\n for (const listener of [...listeners]) listener();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\n/** The minimum of a Redux store the canvas needs. */\nexport interface ReduxStoreLike<TRoot> {\n getState(): TRoot;\n dispatch(action: CanvasAction): unknown;\n subscribe(listener: () => void): () => void;\n}\n\nexport function bindCanvasToReduxStore<TRoot>(\n store: ReduxStoreLike<TRoot>,\n select: (root: TRoot) => CanvasState,\n): CanvasStoreBinding {\n return {\n getState: () => select(store.getState()),\n dispatch: (action) => {\n store.dispatch(action);\n },\n subscribe: (listener) => store.subscribe(listener),\n };\n}\n","/**\n * Remembering the canvas between sessions — a table stake, never optional.\n *\n * The default port writes to localStorage under a versioned key. Items whose\n * kind opts out (`restore: false`, e.g. a live session that cannot come back)\n * are dropped from the snapshot, and panes they leave empty are dropped too.\n */\n\nimport { removePane } from \"./layout\";\nimport type { CanvasItemId, CanvasState } from \"./types\";\n\nexport interface CanvasPersistencePort {\n load(): CanvasState | null | Promise<CanvasState | null>;\n save(snapshot: CanvasState): void | Promise<void>;\n}\n\nexport const CANVAS_STORAGE_KEY = \"ai-matrx.canvas.v1\";\n\nexport function createLocalStorageCanvasPersistence(\n key: string = CANVAS_STORAGE_KEY,\n storage: Pick<Storage, \"getItem\" | \"setItem\"> | null = typeof window === \"undefined\" ? null : safeLocalStorage(),\n): CanvasPersistencePort {\n return {\n load() {\n if (!storage) throw new Error(\"Canvas storage is unavailable; allow browser storage or provide a persistence port.\");\n const raw = storage.getItem(key);\n if (!raw) return null;\n return JSON.parse(raw) as CanvasState;\n },\n save(snapshot) {\n if (!storage) throw new Error(\"Canvas storage is unavailable; allow browser storage or provide a persistence port.\");\n storage.setItem(key, JSON.stringify(snapshot));\n },\n };\n}\n\nfunction safeLocalStorage(): Storage | null {\n try {\n const probe = \"__mxc_probe__\";\n window.localStorage.setItem(probe, \"1\");\n window.localStorage.removeItem(probe);\n return window.localStorage;\n } catch {\n return null; // load/save report through the controller's existing error sink.\n }\n}\n\n/** Builds the snapshot that is actually written: only restorable items. */\nexport function toPersistableSnapshot(\n state: CanvasState,\n isRestorable: (kind: string) => boolean,\n): CanvasState {\n const keep = new Set<CanvasItemId>(\n Object.values(state.items).filter((item) => isRestorable(item.kind)).map((item) => item.id),\n );\n if (keep.size === Object.keys(state.items).length) return state;\n const items = Object.fromEntries(Object.entries(state.items).filter(([id]) => keep.has(id as CanvasItemId)));\n let layout = state.layout;\n const panes: Record<string, CanvasState[\"panes\"][string]> = {};\n for (const pane of Object.values(state.panes)) {\n const itemIds = pane.itemIds.filter((id) => keep.has(id));\n if (itemIds.length === 0 && pane.itemIds.length > 0) {\n const pruned = removePane(layout, pane.id);\n if (pruned) {\n layout = pruned;\n continue;\n }\n }\n panes[pane.id] = {\n ...pane,\n itemIds,\n activeItemId: pane.activeItemId && keep.has(pane.activeItemId) ? pane.activeItemId : (itemIds[0] ?? null),\n };\n }\n const focusedPaneId = panes[state.focusedPaneId] ? state.focusedPaneId : (Object.values(panes)[0]?.id ?? state.focusedPaneId);\n return { ...state, items, panes, layout, focusedPaneId };\n}\n","/**\n * The canvas controller: the ONE imperative API every caller uses. It wraps a\n * store binding, validates what callers hand it (so the reducer stays pure and\n * trusting), and owns hydration + autosave.\n *\n * Nothing fails silently: a refused open (non-JSON data, unknown kind) is\n * reported through the error sink and returns false.\n */\n\nimport { canvasActions, sanitizeCanvasSnapshot, type CanvasAction } from \"./reducer\";\nimport { canvasItemId, findNonJson } from \"./ids\";\nimport { toPersistableSnapshot, type CanvasPersistencePort } from \"./persistence\";\nimport type { CanvasStoreBinding } from \"./store\";\nimport type {\n CanvasItemId,\n CanvasJson,\n CanvasOpenInput,\n CanvasOrientation,\n CanvasPaneId,\n CanvasSplitId,\n CanvasState,\n} from \"./types\";\n\nexport interface CanvasErrorReport {\n readonly code: \"non-json-data\" | \"unknown-kind\" | \"persistence-load\" | \"persistence-save\";\n readonly message: string;\n readonly detail?: unknown;\n}\n\nexport type CanvasErrorSink = (report: CanvasErrorReport) => void;\n\nexport const consoleCanvasErrorSink: CanvasErrorSink = (report) => {\n console.error(`[@ai-matrx/canvas] ${report.code}: ${report.message}`, report.detail ?? \"\");\n};\n\nexport interface CanvasControllerOptions {\n readonly store: CanvasStoreBinding;\n readonly persistence?: CanvasPersistencePort | null | undefined;\n /** Kinds that may not come back after a reload. Default: every kind restores. */\n readonly isRestorable?: ((kind: string) => boolean) | undefined;\n /** When given, opens of an unregistered kind are refused and reported. */\n readonly isKnownKind?: ((kind: string) => boolean) | undefined;\n readonly onError?: CanvasErrorSink | undefined;\n readonly saveDelayMs?: number | undefined;\n /**\n * Whether a remembered \"open\" may be restored right now. A host returns\n * false where an open canvas would take the whole screen (a phone).\n */\n readonly mayRestoreOpen?: (() => boolean) | undefined;\n}\n\nexport interface CanvasController {\n readonly store: CanvasStoreBinding;\n getState(): CanvasState;\n open(input: CanvasOpenInput): CanvasItemId | null;\n update(itemId: CanvasItemId, patch: { data?: CanvasJson | undefined; title?: string | null | undefined }): boolean;\n /** Gives an item a new identity in place (a draft that was saved and now has a durable id). */\n rekey(itemId: CanvasItemId, key: string): CanvasItemId | null;\n close(itemId: CanvasItemId): void;\n closeOthers(itemId: CanvasItemId): void;\n activate(itemId: CanvasItemId): void;\n focusPane(paneId: CanvasPaneId): void;\n moveItem(itemId: CanvasItemId, toPaneId: CanvasPaneId, index?: number): void;\n splitPane(paneId: CanvasPaneId, orientation: CanvasOrientation, moveItemId?: CanvasItemId): void;\n closePane(paneId: CanvasPaneId): void;\n resizeSplit(splitId: CanvasSplitId, sizes: readonly number[]): void;\n show(): void;\n hide(): void;\n toggle(): void;\n setFullscreen(fullscreen: boolean): void;\n setWidth(width: number): void;\n /** Is this exact thing on the canvas right now? */\n has(kind: string, key: string): boolean;\n /**\n * Is a canvas column on screen? A store can exist in a layout that shows no\n * column (a kiosk, a meeting stage); opening there must be refused aloud.\n */\n isPresented(): boolean;\n /** Called by a column on mount; returns the unmount callback. */\n registerPresentation(): () => void;\n subscribePresentation(listener: () => void): () => void;\n /** Loads the persisted snapshot and starts autosave. Returns a disposer. */\n start(): () => void;\n}\n\nexport function createCanvasController(options: CanvasControllerOptions): CanvasController {\n const { store, persistence = null } = options;\n const onError = options.onError ?? consoleCanvasErrorSink;\n const isRestorable = options.isRestorable ?? (() => true);\n const dispatch = (action: CanvasAction) => store.dispatch(action);\n\n let presentations = 0;\n const presentationListeners = new Set<() => void>();\n const notifyPresentation = () => {\n for (const listener of [...presentationListeners]) listener();\n };\n\n const controller: CanvasController = {\n store,\n getState: () => store.getState(),\n open(input) {\n if (options.isKnownKind && !options.isKnownKind(input.kind)) {\n onError({ code: \"unknown-kind\", message: `No canvas kind \"${input.kind}\" is registered.`, detail: input });\n return null;\n }\n if (input.data !== undefined) {\n const bad = findNonJson(input.data);\n if (bad) {\n onError({\n code: \"non-json-data\",\n message: `Canvas data for \"${input.kind}\" must be plain JSON; ${bad} is not.`,\n detail: { kind: input.kind, key: input.key },\n });\n return null;\n }\n }\n dispatch(canvasActions.open(input));\n return canvasItemId(input.kind, input.key);\n },\n update(itemId, patch) {\n if (patch.data !== undefined) {\n const bad = findNonJson(patch.data);\n if (bad) {\n onError({ code: \"non-json-data\", message: `Canvas update for ${itemId} must be plain JSON; ${bad} is not.` });\n return false;\n }\n }\n if (!store.getState().items[itemId]) return false;\n dispatch(canvasActions.update(itemId, patch));\n return true;\n },\n rekey(itemId, key) {\n const item = store.getState().items[itemId];\n if (!item) return null;\n dispatch(canvasActions.rekey(itemId, key));\n return canvasItemId(item.kind, key);\n },\n close: (itemId) => dispatch(canvasActions.closeItem(itemId)),\n closeOthers: (itemId) => dispatch(canvasActions.closeOthers(itemId)),\n activate: (itemId) => dispatch(canvasActions.activate(itemId)),\n focusPane: (paneId) => dispatch(canvasActions.focusPane(paneId)),\n moveItem: (itemId, toPaneId, index) => dispatch(canvasActions.moveItem(itemId, toPaneId, index)),\n splitPane: (paneId, orientation, moveItemId) => dispatch(canvasActions.splitPane(paneId, orientation, moveItemId)),\n closePane: (paneId) => dispatch(canvasActions.closePane(paneId)),\n resizeSplit: (splitId, sizes) => dispatch(canvasActions.resizeSplit(splitId, sizes)),\n show: () => dispatch(canvasActions.setOpen(true)),\n hide: () => dispatch(canvasActions.setOpen(false)),\n toggle: () => dispatch(canvasActions.toggle()),\n setFullscreen: (fullscreen) => dispatch(canvasActions.setFullscreen(fullscreen)),\n setWidth: (width) => dispatch(canvasActions.setWidth(width)),\n has: (kind, key) => canvasItemId(kind, key) in store.getState().items,\n isPresented: () => presentations > 0,\n registerPresentation() {\n presentations += 1;\n notifyPresentation();\n let done = false;\n return () => {\n if (done) return;\n done = true;\n presentations -= 1;\n notifyPresentation();\n };\n },\n subscribePresentation(listener) {\n presentationListeners.add(listener);\n return () => presentationListeners.delete(listener);\n },\n start() {\n let disposed = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastSaved: CanvasState | null = null;\n\n const save = () => {\n timer = null;\n const state = store.getState();\n if (!persistence || !state.hydrated || state === lastSaved) return;\n lastSaved = state;\n try {\n void Promise.resolve(persistence.save(toPersistableSnapshot(state, isRestorable))).catch((error: unknown) =>\n onError({ code: \"persistence-save\", message: \"Saving the canvas layout failed.\", detail: error }),\n );\n } catch (error) {\n onError({ code: \"persistence-save\", message: \"Saving the canvas layout failed.\", detail: error });\n }\n };\n\n // A host store dispatches constantly (streaming, typing). Only a change\n // to the CANVAS state reschedules the save, or a busy app starves it.\n let seen = store.getState();\n const unsubscribe = store.subscribe(() => {\n if (!persistence || disposed) return;\n const current = store.getState();\n if (current === seen) return;\n seen = current;\n if (timer) clearTimeout(timer);\n timer = setTimeout(save, options.saveDelayMs ?? 250);\n });\n\n if (store.getState().hydrated) {\n // Already hydrated (e.g. a second provider over the same store).\n } else if (!persistence) {\n dispatch(canvasActions.hydrate(null));\n } else {\n Promise.resolve()\n .then(() => persistence.load())\n .then(\n (snapshot) => {\n if (disposed) return;\n const openedThisSession = store.getState().isOpen;\n const validSnapshot = snapshot === null ? null : sanitizeCanvasSnapshot(snapshot);\n if (snapshot !== null && validSnapshot === null) {\n onError({ code: \"persistence-load\", message: \"The saved canvas layout is invalid. Clear the saved layout or repair the persistence port.\" });\n }\n dispatch(canvasActions.hydrate(validSnapshot));\n if (!openedThisSession && options.mayRestoreOpen && !options.mayRestoreOpen() && store.getState().isOpen) {\n dispatch(canvasActions.setOpen(false));\n }\n },\n (error: unknown) => {\n onError({ code: \"persistence-load\", message: \"The saved canvas layout could not be read.\", detail: error });\n if (!disposed) dispatch(canvasActions.hydrate(null));\n },\n );\n }\n\n return () => {\n disposed = true;\n unsubscribe();\n if (timer) {\n clearTimeout(timer);\n save();\n }\n };\n },\n };\n return controller;\n}\n","/**\n * Selectors over CanvasState. Each returns a value that is referentially\n * stable for an unchanged state, so they are safe in useSyncExternalStore and\n * in a host's useSelector.\n */\n\nimport { listPaneIds } from \"./layout\";\nimport type { CanvasItem, CanvasItemId, CanvasPane, CanvasPaneId, CanvasState } from \"./types\";\n\nexport const selectCanvasIsOpen = (s: CanvasState): boolean => s.isOpen;\nexport const selectCanvasIsFullscreen = (s: CanvasState): boolean => s.isFullscreen;\nexport const selectCanvasWidth = (s: CanvasState): number => s.width;\nexport const selectCanvasLayout = (s: CanvasState) => s.layout;\nexport const selectCanvasFocusedPaneId = (s: CanvasState): CanvasPaneId => s.focusedPaneId;\nexport const selectCanvasIsHydrated = (s: CanvasState): boolean => s.hydrated;\nexport const selectCanvasItemCount = (s: CanvasState): number => Object.keys(s.items).length;\n\nexport const selectCanvasPane = (s: CanvasState, paneId: CanvasPaneId): CanvasPane | undefined => s.panes[paneId];\nexport const selectCanvasItem = (s: CanvasState, itemId: CanvasItemId): CanvasItem | undefined => s.items[itemId];\n\nexport function selectCanvasPaneCount(s: CanvasState): number {\n return listPaneIds(s.layout).length;\n}\n\n/** The item the person is looking at in the focused pane. */\nexport function selectCanvasActiveItem(s: CanvasState): CanvasItem | null {\n const pane = s.panes[s.focusedPaneId];\n return pane?.activeItemId ? (s.items[pane.activeItemId] ?? null) : null;\n}\n","/**\n * THE canvas kind registry. A kind is one sort of thing the canvas can show —\n * an artifact, a document, a chat, a notification feed. Any feature adds a\n * kind with ONE call and never touches canvas code:\n *\n * registerCanvasKind(defineCanvasKind<{ noteId: string }>({\n * id: \"note\",\n * label: \"Note\",\n * icon: NoteIcon,\n * load: () => import(\"./NoteCanvasView\"),\n * title: (data) => data.noteId,\n * }));\n *\n * The registry lives on globalThis under a Symbol.for key so duplicated\n * bundles (ESM + CJS, two chunks) share ONE registry.\n */\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport type { CanvasController, CanvasItem, CanvasJson, CanvasPaneId } from \"../index\";\n\nexport interface CanvasKindProps<TData extends CanvasJson = CanvasJson> {\n readonly item: CanvasItem;\n readonly data: TData;\n readonly paneId: CanvasPaneId;\n readonly isFocused: boolean;\n readonly canvas: CanvasController;\n}\n\nexport interface CanvasMenuItem {\n readonly id: string;\n readonly label: string;\n readonly icon?: ReactNode;\n readonly onSelect: () => void;\n readonly destructive?: boolean;\n}\n\nexport interface CanvasKind<TData extends CanvasJson = CanvasJson> {\n readonly id: string;\n /** Singular noun shown in menus and the empty-pane launcher. */\n readonly label: string;\n readonly icon: ComponentType<{ className?: string }>;\n /** Eager component. Provide this OR `load`. */\n readonly component?: ComponentType<CanvasKindProps<TData>>;\n /** Lazy component — the kind's code loads only when a tab of it renders. */\n readonly load?: () => Promise<{ default: ComponentType<CanvasKindProps<TData>> }>;\n /** Tab title from the item's data. Falls back to the item's title, then `label`. */\n readonly title?: (data: TData, item: CanvasItem) => string;\n /** Comes back after a reload. Default true; false for live sessions that cannot resume. */\n readonly restore?: boolean;\n /** Stays mounted while its tab is in the background (live chat, a running tool). */\n readonly keepAlive?: boolean;\n /** When set, the kind is offered in an empty pane's launcher. */\n readonly launcher?: { readonly key: string; readonly data: TData; readonly title?: string };\n /** The kind's own button, rendered left of the pane's \"…\" menu. */\n readonly HeaderAction?: ComponentType<CanvasKindProps<TData>>;\n /** Kind-specific entries for the pane's \"…\" menu. */\n readonly menuItems?: (props: CanvasKindProps<TData>) => readonly CanvasMenuItem[];\n}\n\n/** Erased form stored in the registry. */\nexport type AnyCanvasKind = CanvasKind<CanvasJson>;\n\n/**\n * Typed authoring helper. The data type is a promise the kind's opener keeps;\n * the registry stores the erased form (the cast is the one registration seam).\n */\nexport function defineCanvasKind<TData extends CanvasJson>(kind: CanvasKind<TData>): AnyCanvasKind {\n if (!kind.component && !kind.load) {\n throw new Error(`[@ai-matrx/canvas] kind \"${kind.id}\" needs a component or a load().`);\n }\n return kind as unknown as AnyCanvasKind;\n}\n\ninterface RegistryState {\n kinds: Map<string, AnyCanvasKind>;\n listeners: Set<() => void>;\n version: number;\n}\n\nconst REGISTRY = Symbol.for(\"ai-matrx.canvas.kinds\");\n\nfunction registry(): RegistryState {\n const g = globalThis as unknown as { [REGISTRY]?: RegistryState };\n g[REGISTRY] ??= { kinds: new Map(), listeners: new Set(), version: 0 };\n return g[REGISTRY];\n}\n\nfunction notify(state: RegistryState) {\n state.version += 1;\n for (const listener of [...state.listeners]) listener();\n}\n\n/** Registers (or replaces) a kind. Returns an unregister function. */\nexport function registerCanvasKind(kind: AnyCanvasKind): () => void {\n const state = registry();\n state.kinds.set(kind.id, kind);\n notify(state);\n return () => {\n if (state.kinds.get(kind.id) === kind) {\n state.kinds.delete(kind.id);\n notify(state);\n }\n };\n}\n\nexport function registerCanvasKinds(kinds: readonly AnyCanvasKind[]): () => void {\n const undo = kinds.map(registerCanvasKind);\n return () => undo.forEach((fn) => fn());\n}\n\nexport function getCanvasKind(id: string): AnyCanvasKind | undefined {\n return registry().kinds.get(id);\n}\n\nexport function listCanvasKinds(): AnyCanvasKind[] {\n return [...registry().kinds.values()];\n}\n\nexport function subscribeCanvasKinds(listener: () => void): () => void {\n const state = registry();\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n}\n\nexport function getCanvasKindsVersion(): number {\n return registry().version;\n}\n","\"use client\";\n\n/**\n * The canvas column: full height, right edge, its own strip of the top of the\n * window. Width drags from the left edge; panes split in either direction; full\n * screen takes the whole frame. On a phone it becomes a full-screen layer.\n *\n * Hosts with their own shell place <CanvasColumn/> in a grid track and read\n * `useCanvasColumnWidth()` for the track size. Hosts without one wrap their app\n * in <CanvasFrame>.\n */\n\nimport { useRef, useState, useSyncExternalStore, type CSSProperties, type PointerEvent as ReactPointerEvent, type ReactNode } from \"react\";\nimport { TapTargetButtonTransparent } from \"@ai-matrx/tap-target\";\nimport {\n CANVAS_MIN_WIDTH,\n selectCanvasIsFullscreen,\n selectCanvasIsOpen,\n selectCanvasItemCount,\n selectCanvasLayout,\n selectCanvasWidth,\n type CanvasLayoutNode,\n} from \"../index\";\nimport { CanvasPaneView } from \"./CanvasPane\";\nimport { PanelRightIcon } from \"./icons\";\nimport { useCanvas, useCanvasState, useRegisterCanvasPresence } from \"./provider\";\n\n/** Room always left for the app beside the canvas (desktop). */\nconst MIN_MAIN_WIDTH = 420;\n\nfunction subscribeViewport(listener: () => void) {\n window.addEventListener(\"resize\", listener);\n return () => window.removeEventListener(\"resize\", listener);\n}\n\n/** The window's width, live; 0 during server render. */\nfunction useViewportWidth(): number {\n return useSyncExternalStore(subscribeViewport, () => window.innerWidth, () => 0);\n}\n\n/**\n * The stored width, fitted to the window right now: the app beside the canvas\n * always keeps MIN_MAIN_WIDTH. A width remembered on a wide monitor never\n * crushes the app on a laptop.\n */\nfunction fitWidth(width: number, viewport: number): number {\n if (viewport <= 0) return width;\n return Math.max(CANVAS_MIN_WIDTH, Math.min(width, viewport - MIN_MAIN_WIDTH));\n}\n\n/** The column's rendered width in px: 0 when put away, null when full screen. */\nexport function useCanvasColumnWidth(): number | null {\n const isOpen = useCanvasState(selectCanvasIsOpen);\n const isFullscreen = useCanvasState(selectCanvasIsFullscreen);\n const width = useCanvasState(selectCanvasWidth);\n const viewport = useViewportWidth();\n if (!isOpen) return 0;\n if (isFullscreen) return null;\n return fitWidth(width, viewport);\n}\n\nexport interface CanvasColumnProps {\n readonly className?: string;\n readonly style?: CSSProperties;\n /** Called with the live width while the edge is dragged, then null — lets a host shell reflow in step. */\n readonly onLiveWidth?: (width: number | null) => void;\n}\n\nexport function CanvasColumn({ className, style, onLiveWidth }: CanvasColumnProps) {\n const isOpen = useCanvasState(selectCanvasIsOpen);\n const isFullscreen = useCanvasState(selectCanvasIsFullscreen);\n const width = useCanvasState(selectCanvasWidth);\n const layout = useCanvasState(selectCanvasLayout);\n const viewport = useViewportWidth();\n const [dragWidth, setDragWidth] = useState<number | null>(null);\n useRegisterCanvasPresence();\n\n if (!isOpen) return null;\n const fitted = fitWidth(width, viewport);\n const shown = dragWidth ?? fitted;\n\n return (\n <aside\n className={[\"mxc-column\", className].filter(Boolean).join(\" \")}\n data-fullscreen={isFullscreen ? \"\" : undefined}\n aria-label=\"Canvas\"\n style={{ ...style, [\"--mxc-width\" as string]: `${shown}px` }}\n >\n {!isFullscreen ? (\n <WidthHandle\n width={fitted}\n onDrag={(next) => {\n setDragWidth(next);\n onLiveWidth?.(next);\n }}\n />\n ) : null}\n <div className=\"mxc-layout\">\n <LayoutNodeView node={layout} />\n </div>\n </aside>\n );\n}\n\nfunction WidthHandle({ width, onDrag }: { width: number; onDrag: (width: number | null) => void }) {\n const canvas = useCanvas();\n const start = useRef<{ x: number; width: number } | null>(null);\n\n const clamp = (next: number) => {\n const max = Math.max(CANVAS_MIN_WIDTH, window.innerWidth - MIN_MAIN_WIDTH);\n return Math.min(max, Math.max(CANVAS_MIN_WIDTH, next));\n };\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n start.current = { x: event.clientX, width };\n document.documentElement.dataset.mxcResizing = \"\";\n };\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!start.current) return;\n onDrag(clamp(start.current.width + (start.current.x - event.clientX)));\n };\n const finish = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!start.current) return;\n const next = clamp(start.current.width + (start.current.x - event.clientX));\n start.current = null;\n delete document.documentElement.dataset.mxcResizing;\n onDrag(null);\n canvas.setWidth(next);\n };\n\n return (\n <div\n className=\"mxc-width-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize canvas\"\n aria-valuenow={width}\n tabIndex={0}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={finish}\n onPointerCancel={finish}\n onDoubleClick={() => canvas.setWidth(Math.round(window.innerWidth / 2))}\n onKeyDown={(event) => {\n if (event.key === \"ArrowLeft\") canvas.setWidth(clamp(width + 32));\n if (event.key === \"ArrowRight\") canvas.setWidth(clamp(width - 32));\n }}\n />\n );\n}\n\nfunction LayoutNodeView({ node }: { node: CanvasLayoutNode }) {\n if (node.type === \"pane\") return <CanvasPaneView paneId={node.paneId} />;\n return <SplitView node={node} />;\n}\n\nfunction SplitView({ node }: { node: Extract<CanvasLayoutNode, { type: \"split\" }> }) {\n const canvas = useCanvas();\n const ref = useRef<HTMLDivElement>(null);\n const [liveSizes, setLiveSizes] = useState<readonly number[] | null>(null);\n const sizes = liveSizes ?? node.sizes;\n const horizontal = node.orientation === \"horizontal\";\n\n const beginDrag = (index: number) => (event: ReactPointerEvent<HTMLDivElement>) => {\n const el = ref.current;\n if (!el) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n const rect = el.getBoundingClientRect();\n const total = horizontal ? rect.width : rect.height;\n const origin = horizontal ? event.clientX : event.clientY;\n const base = [...node.sizes];\n const pair = (base[index] ?? 0) + (base[index + 1] ?? 0);\n const target = event.currentTarget;\n document.documentElement.dataset.mxcResizing = \"\";\n\n const compute = (pos: number) => {\n const delta = (pos - origin) / total;\n const min = 0.12;\n const first = Math.min(pair - min, Math.max(min, (base[index] ?? 0) + delta));\n const next = [...base];\n next[index] = first;\n next[index + 1] = pair - first;\n return next;\n };\n const move = (e: PointerEvent) => setLiveSizes(compute(horizontal ? e.clientX : e.clientY));\n const up = (e: PointerEvent) => {\n target.removeEventListener(\"pointermove\", move);\n target.removeEventListener(\"pointerup\", up);\n target.removeEventListener(\"pointercancel\", up);\n delete document.documentElement.dataset.mxcResizing;\n setLiveSizes(null);\n canvas.resizeSplit(node.id, compute(horizontal ? e.clientX : e.clientY));\n };\n target.addEventListener(\"pointermove\", move);\n target.addEventListener(\"pointerup\", up);\n target.addEventListener(\"pointercancel\", up);\n };\n\n return (\n <div ref={ref} className=\"mxc-split\" data-orientation={node.orientation}>\n {node.children.map((child, i) => (\n <SplitChild\n key={child.type === \"pane\" ? child.paneId : child.id}\n size={sizes[i] ?? 1 / node.children.length}\n handle={\n i < node.children.length - 1 ? (\n <div\n className=\"mxc-split-handle\"\n role=\"separator\"\n aria-orientation={horizontal ? \"vertical\" : \"horizontal\"}\n onPointerDown={beginDrag(i)}\n onDoubleClick={() => canvas.resizeSplit(node.id, node.children.map(() => 1 / node.children.length))}\n />\n ) : null\n }\n >\n <LayoutNodeView node={child} />\n </SplitChild>\n ))}\n </div>\n );\n}\n\nfunction SplitChild({ size, handle, children }: { size: number; handle: ReactNode; children: ReactNode }) {\n return (\n <>\n <div className=\"mxc-split-child\" style={{ flexGrow: size, flexBasis: 0 }}>\n {children}\n </div>\n {handle}\n </>\n );\n}\n\n/** THE one button that opens and puts away the canvas. */\nexport function CanvasToggle({ className }: { className?: string }) {\n const canvas = useCanvas();\n const isOpen = useCanvasState(selectCanvasIsOpen);\n const count = useCanvasState(selectCanvasItemCount);\n return (\n <span className={[\"mxc-toggle\", className].filter(Boolean).join(\" \")} data-open={isOpen ? \"\" : undefined}>\n <TapTargetButtonTransparent\n ariaLabel={isOpen ? \"Hide canvas\" : \"Show canvas\"}\n tooltip={isOpen ? \"Hide canvas (⌘\\\\)\" : \"Show canvas (⌘\\\\)\"}\n icon={<PanelRightIcon />}\n onClick={() => canvas.toggle()}\n />\n {count > 0 && !isOpen ? <span className=\"mxc-toggle-badge\">{count}</span> : null}\n </span>\n );\n}\n\n/**\n * For hosts without their own shell (a Vite app, an Electron window): the app\n * on the left, the canvas column on the right, full screen handled.\n */\nexport function CanvasFrame({ children, className }: { children: ReactNode; className?: string }) {\n const isFullscreen = useCanvasState(selectCanvasIsFullscreen);\n const isOpen = useCanvasState(selectCanvasIsOpen);\n return (\n <div className={[\"mxc-frame\", className].filter(Boolean).join(\" \")} data-canvas-open={isOpen ? \"\" : undefined}>\n <div className=\"mxc-frame-main\" hidden={isOpen && isFullscreen}>\n {children}\n </div>\n <CanvasColumn />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * One pane: a header (tabs · kind action · \"…\" · full screen · close) over the\n * active item's body. Tabs drag between panes. An empty pane shows the\n * launcher of every kind that offers one.\n */\n\nimport {\n Component,\n Suspense,\n lazy,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type DragEvent,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport { TapTargetButtonTransparent } from \"@ai-matrx/tap-target\";\nimport * as Menu from \"@radix-ui/react-dropdown-menu\";\nimport type { CanvasItem, CanvasItemId, CanvasPaneId } from \"../index\";\nimport { selectCanvasPaneCount } from \"../index\";\nimport {\n AlertIcon,\n CloseIcon,\n MaximizeIcon,\n MinimizeIcon,\n MoreIcon,\n PanelRightIcon,\n PopOutIcon,\n SplitDownIcon,\n SplitRightIcon,\n} from \"./icons\";\nimport { useCanvas, useCanvasHostPorts, useCanvasKind, useCanvasKinds, useCanvasState } from \"./provider\";\nimport type { AnyCanvasKind, CanvasKindProps, CanvasMenuItem } from \"./registry\";\n\nconst DRAG_MIME = \"application/x-matrx-canvas-item\";\n\n// One lazy component per kind, shared across panes and re-renders.\nconst LAZY = Symbol.for(\"ai-matrx.canvas.lazy\");\nfunction kindComponent(kind: AnyCanvasKind): ComponentType<CanvasKindProps> {\n if (kind.component) return kind.component;\n const holder = kind as AnyCanvasKind & { [LAZY]?: ComponentType<CanvasKindProps> };\n if (!holder[LAZY] && kind.load) holder[LAZY] = lazy(kind.load);\n const resolved = holder[LAZY];\n if (!resolved) throw new Error(`[@ai-matrx/canvas] kind \"${kind.id}\" has nothing to render.`);\n return resolved;\n}\n\n/** Forgets a kind's cached lazy component so \"Try again\" re-runs a failed chunk load. */\nfunction resetKindComponent(kind: AnyCanvasKind | undefined) {\n if (kind) delete (kind as AnyCanvasKind & { [LAZY]?: unknown })[LAZY];\n}\n\nexport function itemTitle(item: CanvasItem, kind: AnyCanvasKind | undefined): string {\n if (item.title) return item.title;\n if (kind?.title) {\n try {\n const title = kind.title(item.data, item);\n if (title) return title;\n } catch {\n // fall through to the label — a title function must never break the tab strip\n }\n }\n return kind?.label ?? item.kind;\n}\n\nexport function CanvasPaneView({ paneId }: { paneId: CanvasPaneId }) {\n const canvas = useCanvas();\n const pane = useCanvasState((s) => s.panes[paneId]);\n const items = useCanvasState((s) => s.items);\n const focused = useCanvasState((s) => s.focusedPaneId === paneId);\n const [dropActive, setDropActive] = useState(false);\n\n if (!pane) return null;\n const active = pane.activeItemId ? items[pane.activeItemId] : undefined;\n\n const onDragOver = (event: DragEvent) => {\n if (!event.dataTransfer.types.includes(DRAG_MIME)) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDropActive(true);\n };\n const onDrop = (event: DragEvent) => {\n setDropActive(false);\n const itemId = event.dataTransfer.getData(DRAG_MIME) as CanvasItemId;\n if (!itemId) return;\n event.preventDefault();\n canvas.moveItem(itemId, paneId);\n };\n\n return (\n <section\n className=\"mxc-pane\"\n data-focused={focused ? \"\" : undefined}\n data-drop={dropActive ? \"\" : undefined}\n onPointerDownCapture={() => {\n if (!focused) canvas.focusPane(paneId);\n }}\n onDragOver={onDragOver}\n onDragLeave={() => setDropActive(false)}\n onDrop={onDrop}\n >\n <PaneHeader paneId={paneId} itemIds={pane.itemIds} activeItemId={pane.activeItemId} activeItem={active} />\n <div className=\"mxc-pane-body\">\n {pane.itemIds.length === 0 ? (\n <Launcher paneId={paneId} />\n ) : (\n pane.itemIds.map((itemId) => {\n const item = items[itemId];\n if (!item) return null;\n const isActive = itemId === pane.activeItemId;\n return <ItemBody key={itemId} item={item} paneId={paneId} isActive={isActive} isFocused={focused && isActive} />;\n })\n )}\n </div>\n </section>\n );\n}\n\nfunction PaneHeader({\n paneId,\n itemIds,\n activeItemId,\n activeItem,\n}: {\n paneId: CanvasPaneId;\n itemIds: readonly CanvasItemId[];\n activeItemId: CanvasItemId | null;\n activeItem: CanvasItem | undefined;\n}) {\n const canvas = useCanvas();\n const isFullscreen = useCanvasState((s) => s.isFullscreen);\n const paneCount = useCanvasState(selectCanvasPaneCount);\n const kind = useCanvasKind(activeItem?.kind ?? \"\");\n const kindProps: CanvasKindProps | null =\n activeItem && kind\n ? { item: activeItem, data: activeItem.data, paneId, isFocused: true, canvas }\n : null;\n const HeaderAction = kind?.HeaderAction;\n\n return (\n <header className=\"mxc-pane-header\">\n <div className=\"mxc-tabs\" role=\"tablist\" aria-label=\"Canvas tabs\">\n {itemIds.map((itemId, index) => (\n <Tab key={itemId} itemId={itemId} paneId={paneId} index={index} active={itemId === activeItemId} />\n ))}\n </div>\n <div className=\"mxc-pane-actions\">\n {HeaderAction && kindProps ? <HeaderAction {...kindProps} /> : null}\n <PaneMenu paneId={paneId} activeItem={activeItem} kind={kind} kindProps={kindProps} canSplitMove={itemIds.length > 1} />\n <TapTargetButtonTransparent\n className=\"mxc-desktop-only\"\n ariaLabel={isFullscreen ? \"Exit full screen\" : \"Full screen\"}\n icon={isFullscreen ? <MinimizeIcon /> : <MaximizeIcon />}\n onClick={() => canvas.setFullscreen(!isFullscreen)}\n />\n <TapTargetButtonTransparent\n className=\"mxc-phone-only\"\n ariaLabel=\"Hide canvas\"\n icon={<PanelRightIcon />}\n onClick={() => canvas.hide()}\n />\n <TapTargetButtonTransparent\n ariaLabel={paneCount > 1 ? \"Close pane\" : \"Close canvas\"}\n icon={<CloseIcon />}\n onClick={() => canvas.closePane(paneId)}\n />\n </div>\n </header>\n );\n}\n\nfunction Tab({\n itemId,\n paneId,\n index,\n active,\n}: {\n itemId: CanvasItemId;\n paneId: CanvasPaneId;\n index: number;\n active: boolean;\n}) {\n const canvas = useCanvas();\n const item = useCanvasState((s) => s.items[itemId]);\n const kind = useCanvasKind(item?.kind ?? \"\");\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (active) ref.current?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }, [active]);\n if (!item) return null;\n const Icon = kind?.icon;\n const title = itemTitle(item, kind);\n return (\n <div\n ref={ref}\n className=\"mxc-tab\"\n role=\"tab\"\n aria-selected={active}\n data-active={active ? \"\" : undefined}\n tabIndex={active ? 0 : -1}\n title={title}\n draggable\n onDragStart={(event) => {\n event.dataTransfer.setData(DRAG_MIME, itemId);\n event.dataTransfer.effectAllowed = \"move\";\n }}\n onDragOver={(event) => {\n if (event.dataTransfer.types.includes(DRAG_MIME)) event.preventDefault();\n }}\n onDrop={(event) => {\n const dragged = event.dataTransfer.getData(DRAG_MIME) as CanvasItemId;\n if (!dragged) return;\n // Dropped ON a tab: take that tab's place (the pane-level drop is skipped).\n event.preventDefault();\n event.stopPropagation();\n if (dragged !== itemId) canvas.moveItem(dragged, paneId, index);\n }}\n onClick={() => canvas.activate(itemId)}\n onAuxClick={(event) => {\n if (event.button === 1) canvas.close(itemId);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") canvas.activate(itemId);\n }}\n >\n {Icon ? <Icon className=\"mxc-tab-icon\" /> : <AlertIcon className=\"mxc-tab-icon\" />}\n <span className=\"mxc-tab-title\">{title}</span>\n <button\n type=\"button\"\n className=\"mxc-tab-close\"\n aria-label={`Close ${title}`}\n onClick={(event) => {\n event.stopPropagation();\n canvas.close(itemId);\n }}\n >\n <CloseIcon width={12} height={12} />\n </button>\n </div>\n );\n}\n\nfunction PaneMenu({\n paneId,\n activeItem,\n kind,\n kindProps,\n canSplitMove,\n}: {\n paneId: CanvasPaneId;\n activeItem: CanvasItem | undefined;\n kind: AnyCanvasKind | undefined;\n kindProps: CanvasKindProps | null;\n canSplitMove: boolean;\n}) {\n const canvas = useCanvas();\n const ports = useCanvasHostPorts();\n const moveId = canSplitMove ? activeItem?.id : undefined;\n\n const kindItems: readonly CanvasMenuItem[] = kind?.menuItems && kindProps ? safeMenu(() => kind.menuItems?.(kindProps)) : [];\n const hostItems: readonly CanvasMenuItem[] = activeItem && ports.itemActions ? safeMenu(() => ports.itemActions?.(activeItem, kind)) : [];\n const itemEntries = [...kindItems, ...hostItems];\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <TapTargetButtonTransparent ariaLabel=\"More\" icon={<MoreIcon />} />\n </Menu.Trigger>\n <Menu.Portal>\n <Menu.Content align=\"end\" sideOffset={4} className=\"mxc-menu\">\n {itemEntries.map((entry) => (\n <Menu.Item\n key={entry.id}\n onSelect={entry.onSelect}\n className=\"mxc-menu-item\"\n data-destructive={entry.destructive ? \"\" : undefined}\n >\n {entry.icon}\n {entry.label}\n </Menu.Item>\n ))}\n {itemEntries.length > 0 ? <Menu.Separator className=\"mxc-menu-separator\" /> : null}\n <Menu.Item className=\"mxc-menu-item\" onSelect={() => canvas.splitPane(paneId, \"horizontal\", moveId)}>\n <SplitRightIcon />\n Split right\n </Menu.Item>\n <Menu.Item className=\"mxc-menu-item\" onSelect={() => canvas.splitPane(paneId, \"vertical\", moveId)}>\n <SplitDownIcon />\n Split down\n </Menu.Item>\n {activeItem && ports.popOut ? (\n <Menu.Item className=\"mxc-menu-item\" onSelect={() => ports.popOut?.(activeItem)}>\n <PopOutIcon />\n Pop out\n </Menu.Item>\n ) : null}\n {activeItem && canSplitMove ? (\n <>\n <Menu.Separator className=\"mxc-menu-separator\" />\n <Menu.Item className=\"mxc-menu-item\" onSelect={() => canvas.closeOthers(activeItem.id)}>\n Close other tabs\n </Menu.Item>\n </>\n ) : null}\n </Menu.Content>\n </Menu.Portal>\n </Menu.Root>\n );\n}\n\nfunction safeMenu(build: () => readonly CanvasMenuItem[] | undefined): readonly CanvasMenuItem[] {\n try {\n return build() ?? [];\n } catch (error) {\n console.error(\"[@ai-matrx/canvas] a menu builder threw\", error);\n return [];\n }\n}\n\nfunction ItemBody({\n item,\n paneId,\n isActive,\n isFocused,\n}: {\n item: CanvasItem;\n paneId: CanvasPaneId;\n isActive: boolean;\n isFocused: boolean;\n}) {\n const canvas = useCanvas();\n const kind = useCanvasKind(item.kind);\n if (!isActive && !kind?.keepAlive) return null;\n return (\n <div className=\"mxc-item\" hidden={!isActive} data-kind={item.kind}>\n {kind ? (\n <ItemBoundary item={item} onClose={() => canvas.close(item.id)} onRetry={() => resetKindComponent(kind)}>\n <Suspense fallback={<div className=\"mxc-loading\" aria-busy=\"true\" />}>\n <KindRender kind={kind} props={{ item, data: item.data, paneId, isFocused, canvas }} />\n </Suspense>\n </ItemBoundary>\n ) : (\n <ItemProblem message=\"This item can no longer be shown.\" onClose={() => canvas.close(item.id)} />\n )}\n </div>\n );\n}\n\nfunction KindRender({ kind, props }: { kind: AnyCanvasKind; props: CanvasKindProps }) {\n const Render = kindComponent(kind);\n return <Render {...props} />;\n}\n\nfunction ItemProblem({ message, onClose, onRetry }: { message: string; onClose: () => void; onRetry?: () => void }) {\n return (\n <div className=\"mxc-problem\" role=\"alert\">\n <AlertIcon />\n <p>{message}</p>\n <div className=\"mxc-problem-actions\">\n {onRetry ? (\n <button type=\"button\" className=\"mxc-text-button\" onClick={onRetry}>\n Try again\n </button>\n ) : null}\n <button type=\"button\" className=\"mxc-text-button\" onClick={onClose}>\n Close tab\n </button>\n </div>\n </div>\n );\n}\n\ninterface BoundaryProps {\n item: CanvasItem;\n onClose: () => void;\n onRetry: () => void;\n children: ReactNode;\n}\n\nclass ItemBoundary extends Component<BoundaryProps, { error: Error | null }> {\n override state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(`[@ai-matrx/canvas] \"${this.props.item.kind}\" failed to render`, error, info.componentStack);\n }\n\n override render() {\n if (this.state.error) {\n return (\n <ItemProblem\n message=\"This item failed to load.\"\n onClose={this.props.onClose}\n onRetry={() => {\n this.props.onRetry();\n this.setState({ error: null });\n }}\n />\n );\n }\n return this.props.children;\n }\n}\n\nfunction Launcher({ paneId }: { paneId: CanvasPaneId }) {\n const canvas = useCanvas();\n const kinds = useCanvasKinds().filter((kind) => kind.launcher);\n if (kinds.length === 0) return <div className=\"mxc-empty\">Nothing open</div>;\n return (\n <div className=\"mxc-launcher\">\n {kinds.map((kind) => {\n const Icon = kind.icon;\n const launcher = kind.launcher;\n if (!launcher) return null;\n return (\n <button\n key={kind.id}\n type=\"button\"\n className=\"mxc-launcher-item\"\n onClick={() =>\n canvas.open({\n kind: kind.id,\n key: launcher.key,\n data: launcher.data,\n title: launcher.title ?? null,\n target: { paneId },\n })\n }\n >\n <Icon className=\"mxc-launcher-icon\" />\n <span>{launcher.title ?? kind.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * Inlined glyphs (C19): the package carries its own icons and depends on no\n * icon library. Paths follow the Lucide 24×24 grid so they sit beside Lucide\n * icons in a host without looking foreign.\n */\n\nimport type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement> & { className?: string };\n\nfunction Glyph({ children, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n {children}\n </svg>\n );\n}\n\nexport const CloseIcon = (p: IconProps) => (\n <Glyph {...p}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Glyph>\n);\n\nexport const MaximizeIcon = (p: IconProps) => (\n <Glyph {...p}>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M9 21H3v-6\" />\n </Glyph>\n);\n\nexport const MinimizeIcon = (p: IconProps) => (\n <Glyph {...p}>\n <path d=\"m14 10 7-7\" />\n <path d=\"M20 10h-6V4\" />\n <path d=\"m3 21 7-7\" />\n <path d=\"M4 14h6v6\" />\n </Glyph>\n);\n\nexport const MoreIcon = (p: IconProps) => (\n <Glyph {...p}>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n </Glyph>\n);\n\nexport const SplitRightIcon = (p: IconProps) => (\n <Glyph {...p}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M12 3v18\" />\n </Glyph>\n);\n\nexport const SplitDownIcon = (p: IconProps) => (\n <Glyph {...p}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 12h18\" />\n </Glyph>\n);\n\nexport const PanelRightIcon = (p: IconProps) => (\n <Glyph {...p}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M15 3v18\" />\n </Glyph>\n);\n\nexport const PopOutIcon = (p: IconProps) => (\n <Glyph {...p}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </Glyph>\n);\n\nexport const AlertIcon = (p: IconProps) => (\n <Glyph {...p}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </Glyph>\n);\n"],"mappings":"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","names":["useRef","useState","useSyncExternalStore","TapTargetButtonTransparent","useEffect","useState","jsx","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useSyncExternalStore","useState","useRef","TapTargetButtonTransparent"]}