@pixerate/editor-react 0.42.0 → 0.43.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/canvas/AgentPresenceLayer.tsx","../../src/canvas/useStreamingCanvas.ts","../../src/canvas/useCanvasGraph.ts","../../src/canvas/useCanvasLayout.ts","../../src/canvas/useCanvasClipboard.ts","../../src/canvas/useCanvasShortcuts.ts","../../src/canvas/useCanvasDocking.ts","../../src/canvas/useCanvasExplosion.ts","../../src/canvas/useCanvasArrange.ts","../../src/canvas/useCanvasScenes.ts","../../src/canvas/CanvasGuidesLayer.tsx","../../src/canvas/useCanvasDraw.ts","../../src/canvas/CanvasDrawLayer.tsx","../../src/canvas/useCanvasMeasure.ts","../../src/canvas/index.ts","../../src/canvas/ShapeNode.tsx","../../src/canvas/useCanvasAutoLayout.ts","../../src/canvas/useCanvasTokens.ts","../../src/canvas/TokenBindingPicker.tsx","../../src/canvas/useCanvasAnimation.ts","../../src/canvas/AnimationTimeline.tsx","../../src/canvas/useCanvasComponents.ts","../../src/canvas/CanvasComponentsPanel.tsx","../../src/canvas/useMermaidDiagram.ts","../../src/canvas/MermaidDiagramNode.tsx","../../src/canvas/MermaidThumbnail.tsx","../../src/canvas/useDiagramDirector.ts","../../src/canvas/DiagramPresenceLayer.tsx"],"sourcesContent":["import React from 'react';\nimport type { AgentPresence } from '@pixerate/editor/agent';\n\nexport interface AgentPresenceLayerProps {\n\tpresences: AgentPresence[];\n\tclassName?: string;\n}\n\n/**\n * Visual multiplayer and agent choreography presence layer for React Canvas.\n * Renders floating cursor indicators, agent name tags, and active status tooltips.\n */\nexport function AgentPresenceLayer({ presences, className = '' }: AgentPresenceLayerProps) {\n\tif (!presences || presences.length === 0) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-presence agent-presence pixerate-agent-presence-layer pointer-events-none absolute inset-0 z-50 overflow-hidden ${className}`}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t{presences.map((agent) => {\n\t\t\t\tif (!agent.cursorPosition) return null;\n\t\t\t\tconst { x, y } = agent.cursorPosition;\n\t\t\t\tconst color = agent.color || '#3b82f6';\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={agent.agentId}\n\t\t\t\t\t\tclassName=\"absolute transition-transform duration-75 ease-out\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: `translate3d(${x}px, ${y}px, 0)`\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Cursor SVG */}\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclassName=\"h-5 w-5 drop-shadow-md\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td=\"M5.65376 12.3673H5.46026L5.31717 12.4976L0.500002 16.8829L0.500002 1.19841L11.7841 12.3673H5.65376Z\"\n\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\n\t\t\t\t\t\t{/* Agent Label Pill */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"mt-1 flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium text-white shadow-md whitespace-nowrap\"\n\t\t\t\t\t\t\tstyle={{ backgroundColor: color }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span>{agent.name}</span>\n\t\t\t\t\t\t\t{agent.statusMessage && (\n\t\t\t\t\t\t\t\t<span className=\"opacity-80 text-[10px]\">({agent.statusMessage})</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Narration Bubble (say / note) */}\n\t\t\t\t\t\t{agent.note && (\n\t\t\t\t\t\t\t<div className=\"mt-1 max-w-xs rounded-lg bg-white/95 backdrop-blur-sm border border-slate-200 px-2.5 py-1.5 text-xs text-slate-800 shadow-lg dark:bg-slate-900/95 dark:border-slate-700 dark:text-slate-100\">\n\t\t\t\t\t\t\t\t{agent.note}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport {\n\tStreamingLayoutManager,\n\ttype CanvasEdge,\n\ttype CanvasNode,\n\ttype IncrementalLayoutOptions,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseStreamingCanvasOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tthrottleMs?: number;\n\tglideDurationMs?: number;\n\tconnectedOnly?: boolean;\n\tclock?: any;\n\tlayoutOptions?: IncrementalLayoutOptions;\n\tonPositionsChange: (positions: Map<string, XYPosition>) => void;\n}\n\n/**\n * React hook that throttles rapid node/edge streaming additions (e.g. from LLM streams)\n * and glides nodes into position smoothly using physics/tweened trajectories without jarring jumps.\n */\nexport function useStreamingCanvas<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseStreamingCanvasOptions<TNode, TEdge>) {\n\tconst managerRef = useRef<StreamingLayoutManager<TNode, TEdge> | null>(null);\n\n\tuseEffect(() => {\n\t\tconst manager = new StreamingLayoutManager<TNode, TEdge>({\n\t\t\tthrottleMs: options.throttleMs,\n\t\t\tglideDurationMs: options.glideDurationMs,\n\t\t\tconnectedOnly: options.connectedOnly,\n\t\t\tclock: options.clock,\n\t\t\tlayoutOptions: options.layoutOptions,\n\t\t\tonLayoutUpdated: options.onPositionsChange\n\t\t});\n\t\tmanagerRef.current = manager;\n\n\t\treturn () => {\n\t\t\tmanager.destroy();\n\t\t\tmanagerRef.current = null;\n\t\t};\n\t}, [\n\t\toptions.throttleMs,\n\t\toptions.glideDurationMs,\n\t\toptions.connectedOnly,\n\t\toptions.clock,\n\t\toptions.onPositionsChange\n\t]);\n\n\tconst pushStreamUpdate = useCallback(\n\t\t(nodes: TNode[], edges: TEdge[], currentPositions: Map<string, XYPosition>) => {\n\t\t\tmanagerRef.current?.pushStreamUpdate(nodes, edges, currentPositions);\n\t\t},\n\t\t[]\n\t);\n\n\tconst flush = useCallback(\n\t\t(nodes: TNode[], edges: TEdge[], currentPositions: Map<string, XYPosition>) => {\n\t\t\tmanagerRef.current?.flush(nodes, edges, currentPositions);\n\t\t},\n\t\t[]\n\t);\n\n\treturn {\n\t\tpushStreamUpdate,\n\t\tflush\n\t};\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { CanvasNode, CanvasEdge, GraphDifferences } from '@pixerate/editor/canvas';\n\nexport interface UseCanvasGraphOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tinitialNodes?: TNode[];\n\tinitialEdges?: TEdge[];\n\tonNodesChange?: (nodes: TNode[]) => void;\n\tonEdgesChange?: (edges: TEdge[]) => void;\n}\n\n/**\n * React hook managing canvas graph state (nodes, edges, selection, and structural differences).\n */\nexport function useCanvasGraph<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseCanvasGraphOptions<TNode, TEdge> = {}) {\n\tconst [nodes, setNodesState] = useState<TNode[]>(options.initialNodes ?? []);\n\tconst [edges, setEdgesState] = useState<TEdge[]>(options.initialEdges ?? []);\n\n\tconst baselineNodesRef = useRef<TNode[]>(options.initialNodes ?? []);\n\tconst baselineEdgesRef = useRef<TEdge[]>(options.initialEdges ?? []);\n\n\tconst setNodes = useCallback(\n\t\t(updater: TNode[] | ((prev: TNode[]) => TNode[])) => {\n\t\t\tsetNodesState((prev) => {\n\t\t\t\tconst next = typeof updater === 'function' ? updater(prev) : updater;\n\t\t\t\toptions.onNodesChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[options.onNodesChange]\n\t);\n\n\tconst setEdges = useCallback(\n\t\t(updater: TEdge[] | ((prev: TEdge[]) => TEdge[])) => {\n\t\t\tsetEdgesState((prev) => {\n\t\t\t\tconst next = typeof updater === 'function' ? updater(prev) : updater;\n\t\t\t\toptions.onEdgesChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[options.onEdgesChange]\n\t);\n\n\tconst addNode = useCallback(\n\t\t(node: TNode) => {\n\t\t\tsetNodes((prev) => [...prev, node]);\n\t\t},\n\t\t[setNodes]\n\t);\n\n\tconst removeNodes = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst idSet = new Set(ids);\n\t\t\tsetNodes((prev) => prev.filter((n) => !idSet.has(n.id)));\n\t\t\tsetEdges((prev) => prev.filter((e) => !idSet.has(e.source) && !idSet.has(e.target)));\n\t\t},\n\t\t[setNodes, setEdges]\n\t);\n\n\tconst updateNodeData = useCallback(\n\t\t(id: string, patch: Partial<TNode['data']>) => {\n\t\t\tsetNodes((prev) =>\n\t\t\t\tprev.map((node) => {\n\t\t\t\t\tif (node.id !== id) return node;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...node,\n\t\t\t\t\t\tdata: { ...node.data, ...patch }\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[setNodes]\n\t);\n\n\tconst updateNodePosition = useCallback(\n\t\t(id: string, position: { x: number; y: number }) => {\n\t\t\tsetNodes((prev) =>\n\t\t\t\tprev.map((node) => {\n\t\t\t\t\tif (node.id !== id) return node;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...node,\n\t\t\t\t\t\tposition: { ...position }\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[setNodes]\n\t);\n\n\tconst addEdge = useCallback(\n\t\t(edge: TEdge) => {\n\t\t\tsetEdges((prev) => [...prev, edge]);\n\t\t},\n\t\t[setEdges]\n\t);\n\n\tconst removeEdges = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst idSet = new Set(ids);\n\t\t\tsetEdges((prev) => prev.filter((e) => !idSet.has(e.id)));\n\t\t},\n\t\t[setEdges]\n\t);\n\n\tconst resetBaseline = useCallback(() => {\n\t\tbaselineNodesRef.current = nodes;\n\t\tbaselineEdgesRef.current = edges;\n\t}, [nodes, edges]);\n\n\tconst getDifferences = useCallback((): GraphDifferences<TNode, TEdge> => {\n\t\tconst currentNodesMap = new Map(nodes.map((n) => [n.id, n]));\n\t\tconst currentEdgesMap = new Map(edges.map((e) => [e.id, e]));\n\t\tconst baselineNodesMap = new Map(baselineNodesRef.current.map((n) => [n.id, n]));\n\t\tconst baselineEdgesMap = new Map(baselineEdgesRef.current.map((e) => [e.id, e]));\n\n\t\tconst changedNodes: TNode[] = [];\n\t\tconst removedNodes: TNode[] = [];\n\t\tconst changedEdges: TEdge[] = [];\n\t\tconst removedEdges: TEdge[] = [];\n\n\t\tfor (const [id, node] of currentNodesMap) {\n\t\t\tconst base = baselineNodesMap.get(id);\n\t\t\tif (!base || base.position.x !== node.position.x || base.position.y !== node.position.y) {\n\t\t\t\tchangedNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, node] of baselineNodesMap) {\n\t\t\tif (!currentNodesMap.has(id)) {\n\t\t\t\tremovedNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, edge] of currentEdgesMap) {\n\t\t\tconst base = baselineEdgesMap.get(id);\n\t\t\tif (!base || base.source !== edge.source || base.target !== edge.target) {\n\t\t\t\tchangedEdges.push(edge);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, edge] of baselineEdgesMap) {\n\t\t\tif (!currentEdgesMap.has(id)) {\n\t\t\t\tremovedEdges.push(edge);\n\t\t\t}\n\t\t}\n\n\t\treturn { changedNodes, changedEdges, removedNodes, removedEdges };\n\t}, [nodes, edges]);\n\n\treturn {\n\t\tnodes,\n\t\tedges,\n\t\tsetNodes,\n\t\tsetEdges,\n\t\taddNode,\n\t\tremoveNodes,\n\t\tupdateNodeData,\n\t\tupdateNodePosition,\n\t\taddEdge,\n\t\tremoveEdges,\n\t\tresetBaseline,\n\t\tgetDifferences\n\t};\n}\n","import { useCallback } from 'react';\nimport {\n\tcenterNodes,\n\tensureLayout,\n\tgetCenteredNodePosition,\n\tgetLayoutedNodes,\n\tplaceBeside,\n\ttype CanvasEdge,\n\ttype CanvasLayoutOptions,\n\ttype CanvasNode,\n\ttype IncrementalLayoutOptions,\n\ttype PlaceBesideOptions,\n\ttype Rect,\n\ttype Side,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasLayoutOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tnodes: TNode[];\n\tedges: TEdge[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\tgetNodesBounds?: (nodes: TNode[]) => Rect;\n\tscreenToFlowPosition?: (position: XYPosition) => XYPosition;\n}\n\n/**\n * React hook providing layout automation: Dagre hierarchy, incremental layout blending,\n * collision-aware directional placement, and viewport centering.\n */\nexport function useCanvasLayout<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseCanvasLayoutOptions<TNode, TEdge>) {\n\tconst { nodes, edges, setNodes, getNodesBounds, screenToFlowPosition } = options;\n\n\t/**\n\t * Runs standard hierarchical Dagre layout across all nodes and edges.\n\t */\n\tconst applyLayout = useCallback(\n\t\t(layoutOptions: CanvasLayoutOptions = {}) => {\n\t\t\tconst layouted = getLayoutedNodes(nodes, edges, getNodesBounds, layoutOptions);\n\t\t\tsetNodes(layouted);\n\t\t\treturn layouted;\n\t\t},\n\t\t[nodes, edges, getNodesBounds, setNodes]\n\t);\n\n\t/**\n\t * Incremental layout blending:\n\t * Preserves manual positions of established nodes and positions new/unplaced nodes\n\t * relative to the Dagre layout using mean centroid translation.\n\t */\n\tconst applyIncrementalLayout = useCallback(\n\t\t(incrementalOptions: IncrementalLayoutOptions = {}) => {\n\t\t\tconst storedPositions =\n\t\t\t\tincrementalOptions.storedPositions ??\n\t\t\t\tObject.fromEntries(nodes.map((n) => [n.id, n.position]));\n\n\t\t\tconst blended = ensureLayout(nodes, edges, {\n\t\t\t\t...incrementalOptions,\n\t\t\t\tstoredPositions\n\t\t\t});\n\t\t\tsetNodes(blended);\n\t\t\treturn blended;\n\t\t},\n\t\t[nodes, edges, setNodes]\n\t);\n\n\t/**\n\t * Centers the collective bounding box of nodes within the viewport.\n\t */\n\tconst center = useCallback(\n\t\t(screenDimensions?: { width: number; height: number }) => {\n\t\t\tif (!screenToFlowPosition || !getNodesBounds) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'[useCanvasLayout] Centering requires screenToFlowPosition and getNodesBounds options.'\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst centered = centerNodes(nodes, screenToFlowPosition, getNodesBounds, screenDimensions);\n\t\t\tsetNodes(centered);\n\t\t},\n\t\t[nodes, screenToFlowPosition, getNodesBounds, setNodes]\n\t);\n\n\t/**\n\t * Finds a collision-free position for a new node adjacent to an existing anchor node.\n\t */\n\tconst getPlacementPosition = useCallback(\n\t\t(\n\t\t\tsize: { width: number; height: number },\n\t\t\tside: Side = 'right',\n\t\t\tnearNodeId?: string,\n\t\t\tplacementOptions: PlaceBesideOptions = {}\n\t\t): XYPosition => {\n\t\t\tconst rects: Record<string, Rect> = {};\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst width = node.measured?.width ?? (node as any).width ?? 200;\n\t\t\t\tconst height = node.measured?.height ?? (node as any).height ?? 60;\n\t\t\t\trects[node.id] = {\n\t\t\t\t\tx: node.position.x,\n\t\t\t\t\ty: node.position.y,\n\t\t\t\t\twidth,\n\t\t\t\t\theight\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn placeBeside(rects, size, side, nearNodeId, placementOptions);\n\t\t},\n\t\t[nodes]\n\t);\n\n\treturn {\n\t\tapplyLayout,\n\t\tapplyIncrementalLayout,\n\t\tcenter,\n\t\tgetPlacementPosition,\n\t\tgetCenteredNodePosition\n\t};\n}\n","import { useCallback } from 'react';\nimport {\n\tisEventFromTextInput,\n\tisValidUrl,\n\tparseCanvasClipboardData,\n\tremapPastedNodes,\n\tserializeCanvasNodes,\n\ttype CanvasEdge,\n\ttype CanvasNode,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasClipboardOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tonPasteNodes?: (nodes: TNode[], edges?: TEdge[]) => void | Promise<void>;\n\tonPasteUrl?: (url: string, position?: XYPosition) => void;\n\tonPasteText?: (text: string, position?: XYPosition) => void;\n\tscreenToFlowPosition?: (position: XYPosition) => XYPosition;\n}\n\n/**\n * React hook managing canvas clipboard copy and paste operations.\n */\nexport function useCanvasClipboard<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseCanvasClipboardOptions<TNode, TEdge> = {}) {\n\tconst copySelectedNodes = useCallback(\n\t\t(\n\t\t\tselectedNodes: TNode[],\n\t\t\tconnectedEdges?: TEdge[],\n\t\t\tevent?: ClipboardEvent | React.ClipboardEvent\n\t\t): boolean => {\n\t\t\tconst native = (event && 'nativeEvent' in event) ? (event as any).nativeEvent : event;\n\t\t\tif (native && isEventFromTextInput(native)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (selectedNodes.length === 0) return false;\n\n\t\t\tconst serialized = serializeCanvasNodes(selectedNodes, connectedEdges);\n\n\t\t\tconst clipboardData = (event as any)?.clipboardData || (native as any)?.clipboardData;\n\t\t\tif (clipboardData) {\n\t\t\t\tclipboardData.setData('application/json', serialized);\n\t\t\t\tclipboardData.setData('text/plain', serialized);\n\t\t\t\t(event as any)?.preventDefault?.();\n\t\t\t} else if (typeof navigator !== 'undefined' && navigator.clipboard) {\n\t\t\t\tnavigator.clipboard.writeText(serialized).catch(() => {});\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\t[]\n\t);\n\n\tconst handlePasteEvent = useCallback(\n\t\tasync (event: ClipboardEvent | React.ClipboardEvent): Promise<boolean> => {\n\t\t\tconst native = ('nativeEvent' in event) ? (event as any).nativeEvent : event;\n\t\t\tif (isEventFromTextInput(native)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst clipboardData = (native as any)?.clipboardData || (event as any)?.clipboardData;\n\t\t\tif (!clipboardData) return false;\n\n\t\t\tconst prevent = () => {\n\t\t\t\t(event as any)?.preventDefault?.();\n\t\t\t\t(native as any)?.preventDefault?.();\n\t\t\t};\n\n\t\t\t// Priority 1: application/json canvas payload\n\t\t\tconst jsonText = clipboardData.getData('application/json');\n\t\t\tif (jsonText) {\n\t\t\t\tconst parsed = parseCanvasClipboardData<TNode, TEdge>(jsonText);\n\t\t\t\tif (parsed && parsed.nodes.length > 0) {\n\t\t\t\t\tprevent();\n\t\t\t\t\tconst remapped = remapPastedNodes(parsed.nodes, parsed.edges);\n\t\t\t\t\tawait options.onPasteNodes?.(remapped.nodes, remapped.edges);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Priority 2: text/plain\n\t\t\tconst text = clipboardData.getData('text/plain')?.trim();\n\t\t\tif (text) {\n\t\t\t\tconst parsed = parseCanvasClipboardData<TNode, TEdge>(text);\n\t\t\t\tif (parsed && parsed.nodes.length > 0) {\n\t\t\t\t\tprevent();\n\t\t\t\t\tconst remapped = remapPastedNodes(parsed.nodes, parsed.edges);\n\t\t\t\t\tawait options.onPasteNodes?.(remapped.nodes, remapped.edges);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif (isValidUrl(text)) {\n\t\t\t\t\tprevent();\n\t\t\t\t\toptions.onPasteUrl?.(text);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif (options.onPasteText) {\n\t\t\t\t\tprevent();\n\t\t\t\t\toptions.onPasteText(text);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\t[options]\n\t);\n\n\treturn {\n\t\tcopySelectedNodes,\n\t\thandlePasteEvent\n\t};\n}\n","import { useEffect } from 'react';\nimport { isEventFromTextInput, type CanvasNode } from '@pixerate/editor/canvas';\n\nexport interface UseCanvasShortcutsOptions<TNode extends CanvasNode = CanvasNode> {\n\ttargetElement?: HTMLElement | Window | null;\n\tenabled?: boolean;\n\tonCopy?: (selectedNodes: TNode[]) => void;\n\tonCut?: (selectedNodes: TNode[]) => void;\n\tonPaste?: (event: ClipboardEvent) => void;\n\tonDelete?: (selectedNodes: TNode[]) => void;\n\tonDuplicate?: (selectedNodes: TNode[]) => void;\n\tonSelectAll?: () => void;\n\tonGroup?: (selectedNodes: TNode[]) => void;\n\tonUngroup?: (selectedNodes: TNode[]) => void;\n\tonZoomIn?: () => void;\n\tonZoomOut?: () => void;\n\tonFitView?: () => void;\n\tgetSelectedNodes?: () => TNode[];\n}\n\n/**\n * React hook registering canvas keyboard shortcuts while rigorously guarding against\n * hijacking typing inside text inputs, textareas, and rich-text ProseMirror elements.\n */\nexport function useCanvasShortcuts<TNode extends CanvasNode = CanvasNode>(\n\toptions: UseCanvasShortcutsOptions<TNode> = {}\n) {\n\tconst {\n\t\ttargetElement,\n\t\tenabled = true,\n\t\tonCopy,\n\t\tonCut,\n\t\tonPaste,\n\t\tonDelete,\n\t\tonDuplicate,\n\t\tonSelectAll,\n\t\tonGroup,\n\t\tonUngroup,\n\t\tonZoomIn,\n\t\tonZoomOut,\n\t\tonFitView,\n\t\tgetSelectedNodes\n\t} = options;\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst target = targetElement ?? (typeof window !== 'undefined' ? window : null);\n\t\tif (!target) return;\n\n\t\tfunction handleKeyDown(event: Event) {\n\t\t\tconst keyboardEvent = event as KeyboardEvent;\n\t\t\tif (isEventFromTextInput(keyboardEvent)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n\t\t\tconst isMod = isMac ? keyboardEvent.metaKey : keyboardEvent.ctrlKey;\n\t\t\tconst key = keyboardEvent.key.toLowerCase();\n\t\t\tconst selectedNodes = getSelectedNodes ? getSelectedNodes() : [];\n\n\t\t\t// Delete / Backspace\n\t\t\tif ((keyboardEvent.key === 'Backspace' || keyboardEvent.key === 'Delete') && !isMod) {\n\t\t\t\tif (selectedNodes.length > 0 && onDelete) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonDelete(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Duplicate: Mod+D\n\t\t\tif (isMod && key === 'd') {\n\t\t\t\tif (selectedNodes.length > 0 && onDuplicate) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonDuplicate(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Select All: Mod+A\n\t\t\tif (isMod && key === 'a' && onSelectAll) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonSelectAll();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Group: Mod+G\n\t\t\tif (isMod && key === 'g' && !keyboardEvent.shiftKey && onGroup) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonGroup(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Ungroup: Mod+Shift+G\n\t\t\tif (isMod && key === 'g' && keyboardEvent.shiftKey && onUngroup) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonUngroup(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Zoom In: Mod + Plus/Equal\n\t\t\tif (isMod && (key === '+' || key === '=') && onZoomIn) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonZoomIn();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Zoom Out: Mod + Minus\n\t\t\tif (isMod && key === '-' && onZoomOut) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonZoomOut();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Fit View: Mod + 0 or Shift + 1\n\t\t\tif (isMod && key === '0' && onFitView) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonFitView();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttarget.addEventListener('keydown', handleKeyDown as EventListener);\n\t\treturn () => {\n\t\t\ttarget.removeEventListener('keydown', handleKeyDown as EventListener);\n\t\t};\n\t}, [\n\t\ttargetElement,\n\t\tenabled,\n\t\tonCopy,\n\t\tonCut,\n\t\tonPaste,\n\t\tonDelete,\n\t\tonDuplicate,\n\t\tonSelectAll,\n\t\tonGroup,\n\t\tonUngroup,\n\t\tonZoomIn,\n\t\tonZoomOut,\n\t\tonFitView,\n\t\tgetSelectedNodes\n\t]);\n}\n","import { useCallback, useRef } from 'react';\nimport type {\n\tCanvasDockingCallbacks,\n\tCanvasNode,\n\tDockStrategy,\n\tRect,\n\tXYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasDockingOptions<TNode extends CanvasNode = CanvasNode>\n\textends CanvasDockingCallbacks<TNode> {\n\tstrategy?: DockStrategy;\n\tdockableTypes?: string[];\n\ttargetTypes?: string[];\n}\n\n/**\n * React hook resolving docking targets and intersections when dragging nodes across the canvas.\n */\nexport function useCanvasDocking<TNode extends CanvasNode = CanvasNode>(\n\toptions: UseCanvasDockingOptions<TNode> = {}\n) {\n\tconst {\n\t\tstrategy = 'center-point',\n\t\tdockableTypes,\n\t\ttargetTypes,\n\t\tonDockHover,\n\t\tonDockLeave,\n\t\tonDockDrop\n\t} = options;\n\n\tconst activeDockTargetRef = useRef<TNode | null>(null);\n\n\tconst isDockable = useCallback(\n\t\t(node: TNode): boolean => {\n\t\t\tif (!dockableTypes || dockableTypes.length === 0) return true;\n\t\t\treturn !!node.type && dockableTypes.includes(node.type);\n\t\t},\n\t\t[dockableTypes]\n\t);\n\n\tconst isTarget = useCallback(\n\t\t(node: TNode): boolean => {\n\t\t\tif (!targetTypes || targetTypes.length === 0) return true;\n\t\t\treturn !!node.type && targetTypes.includes(node.type);\n\t\t},\n\t\t[targetTypes]\n\t);\n\n\tconst findDockTarget = useCallback(\n\t\t(\n\t\t\tdraggedNode: TNode,\n\t\t\tcandidates: TNode[],\n\t\t\tcursorPos?: XYPosition\n\t\t): TNode | null => {\n\t\t\tif (!isDockable(draggedNode)) return null;\n\n\t\t\tconst draggedWidth = draggedNode.measured?.width ?? (draggedNode as any).width ?? 200;\n\t\t\tconst draggedHeight = draggedNode.measured?.height ?? (draggedNode as any).height ?? 60;\n\t\t\tconst draggedCenter: XYPosition = {\n\t\t\t\tx: draggedNode.position.x + draggedWidth / 2,\n\t\t\t\ty: draggedNode.position.y + draggedHeight / 2\n\t\t\t};\n\n\t\t\tconst validCandidates = candidates.filter(\n\t\t\t\t(c) => c.id !== draggedNode.id && isTarget(c)\n\t\t\t);\n\n\t\t\tlet bestTarget: TNode | null = null;\n\t\t\tlet maxIntersectionArea = 0;\n\t\t\tlet minDistance = Infinity;\n\n\t\t\tfor (const candidate of validCandidates) {\n\t\t\t\tconst candWidth = candidate.measured?.width ?? (candidate as any).width ?? 200;\n\t\t\t\tconst candHeight = candidate.measured?.height ?? (candidate as any).height ?? 60;\n\n\t\t\t\tconst candRect: Rect = {\n\t\t\t\t\tx: candidate.position.x,\n\t\t\t\t\ty: candidate.position.y,\n\t\t\t\t\twidth: candWidth,\n\t\t\t\t\theight: candHeight\n\t\t\t\t};\n\n\t\t\t\t// Overlap bounds\n\t\t\t\tconst overlapX = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(draggedNode.position.x + draggedWidth, candRect.x + candRect.width) -\n\t\t\t\t\t\tMath.max(draggedNode.position.x, candRect.x)\n\t\t\t\t);\n\t\t\t\tconst overlapY = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(draggedNode.position.y + draggedHeight, candRect.y + candRect.height) -\n\t\t\t\t\t\tMath.max(draggedNode.position.y, candRect.y)\n\t\t\t\t);\n\t\t\t\tconst overlapArea = overlapX * overlapY;\n\n\t\t\t\tif (strategy === 'max-overlap') {\n\t\t\t\t\tif (overlapArea > maxIntersectionArea) {\n\t\t\t\t\t\tmaxIntersectionArea = overlapArea;\n\t\t\t\t\t\tbestTarget = candidate;\n\t\t\t\t\t}\n\t\t\t\t} else if (strategy === 'center-point') {\n\t\t\t\t\tconst candCenter: XYPosition = {\n\t\t\t\t\t\tx: candRect.x + candRect.width / 2,\n\t\t\t\t\t\ty: candRect.y + candRect.height / 2\n\t\t\t\t\t};\n\t\t\t\t\tconst dist = Math.hypot(\n\t\t\t\t\t\tdraggedCenter.x - candCenter.x,\n\t\t\t\t\t\tdraggedCenter.y - candCenter.y\n\t\t\t\t\t);\n\t\t\t\t\tif (overlapArea > 0 && dist < minDistance) {\n\t\t\t\t\t\tminDistance = dist;\n\t\t\t\t\t\tbestTarget = candidate;\n\t\t\t\t\t}\n\t\t\t\t} else if (strategy === 'first') {\n\t\t\t\t\tif (overlapArea > 0) return candidate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn bestTarget;\n\t\t},\n\t\t[isDockable, isTarget, strategy]\n\t);\n\n\tconst updateDragOver = useCallback(\n\t\t(draggedNode: TNode, candidates: TNode[], cursorPos?: XYPosition) => {\n\t\t\tconst target = findDockTarget(draggedNode, candidates, cursorPos);\n\n\t\t\tif (target?.id !== activeDockTargetRef.current?.id) {\n\t\t\t\tif (activeDockTargetRef.current) {\n\t\t\t\t\tonDockLeave?.(activeDockTargetRef.current, draggedNode);\n\t\t\t\t}\n\t\t\t\tactiveDockTargetRef.current = target;\n\t\t\t\tif (target) {\n\t\t\t\t\tonDockHover?.(target, draggedNode);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[findDockTarget, onDockHover, onDockLeave]\n\t);\n\n\tconst finalizeDock = useCallback(\n\t\t(draggedNode: TNode) => {\n\t\t\tif (activeDockTargetRef.current) {\n\t\t\t\tonDockDrop?.(activeDockTargetRef.current, draggedNode);\n\t\t\t\tactiveDockTargetRef.current = null;\n\t\t\t}\n\t\t},\n\t\t[onDockDrop]\n\t);\n\n\treturn {\n\t\tfindDockTarget,\n\t\tupdateDragOver,\n\t\tfinalizeDock,\n\t\tgetActiveDockTarget: () => activeDockTargetRef.current\n\t};\n}\n","import { useCallback, useRef } from 'react';\nimport {\n\tcalculateDirectionalDisplacement,\n\tcreateFanOutTrajectory,\n\tlinearPositionTrajectory,\n\trunMultiNodeTransition,\n\ttype CanvasEdge,\n\ttype CanvasNode,\n\ttype CollapseNodeOptions,\n\ttype ExplodeNodeOptions,\n\ttype ExplosionSnapshot,\n\ttype NodeTransition,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface CanvasGraphTarget<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tnodes: TNode[];\n\tedges: TEdge[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\tsetEdges: (updater: TEdge[] | ((prev: TEdge[]) => TEdge[])) => void;\n}\n\n/**\n * Replaces nodes in `base` with the same-id node from `updated` (transition frame copies).\n */\nfunction mergeById<TNode extends CanvasNode>(base: TNode[], updated: TNode[]): TNode[] {\n\tif (updated.length === 0) return [...base];\n\tconst byId = new Map(updated.map((n) => [n.id, n]));\n\treturn base.map((n) => byId.get(n.id) ?? n);\n}\n\n/**\n * React hook managing node explosion and collapse transitions with exact reversibility.\n */\nexport function useCanvasExplosion<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(target: CanvasGraphTarget<TNode, TEdge>) {\n\tconst snapshotsRef = useRef<Map<string, ExplosionSnapshot<TNode, TEdge>>>(new Map());\n\n\tconst explodeNode = useCallback(\n\t\t(parentNodeId: string, options: ExplodeNodeOptions<TNode, TEdge>) => {\n\t\t\tconst { nodes, edges, setNodes, setEdges } = target;\n\t\t\tconst parent = nodes.find((n) => n.id === parentNodeId);\n\t\t\tif (!parent || options.childNodes.length === 0) return;\n\n\t\t\tconst originPos: XYPosition = { ...parent.position };\n\t\t\tconst displacedMap =\n\t\t\t\toptions.displacementStrategy === 'directional'\n\t\t\t\t\t? calculateDirectionalDisplacement({\n\t\t\t\t\t\t\texistingNodes: nodes,\n\t\t\t\t\t\t\toriginNode: parent,\n\t\t\t\t\t\t\tchildNodes: options.childNodes,\n\t\t\t\t\t\t\toptions: options.directionalOptions\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Map<string, XYPosition>();\n\n\t\t\t// Snapshot state for exact collapse\n\t\t\tconst snapshot: ExplosionSnapshot<TNode, TEdge> = {\n\t\t\t\tparentId: parentNodeId,\n\t\t\t\tchildNodeIds: options.childNodes.map((c) => c.id),\n\t\t\t\tchildEdgeIds: (options.childEdges ?? []).map((e) => e.id),\n\t\t\t\tdisplacedNodes: Array.from(displacedMap.entries()).map(([id]) => {\n\t\t\t\t\tconst node = nodes.find((n) => n.id === id)!;\n\t\t\t\t\treturn { id, originalPosition: { ...node.position } };\n\t\t\t\t}),\n\t\t\t\ttimestamp: Date.now()\n\t\t\t};\n\t\t\tsnapshotsRef.current.set(parentNodeId, snapshot);\n\n\t\t\t// Position child nodes initially at parent position for animation\n\t\t\tconst initialChildren = options.childNodes.map((child) => ({\n\t\t\t\t...child,\n\t\t\t\tposition: { ...originPos }\n\t\t\t}));\n\n\t\t\tconst mergedNodes = [...nodes, ...initialChildren];\n\t\t\tsetNodes(mergedNodes);\n\n\t\t\tif (options.childEdges && options.childEdges.length > 0) {\n\t\t\t\tsetEdges((prev) => [...prev, ...(options.childEdges as TEdge[])]);\n\t\t\t}\n\n\t\t\t// Animate child nodes outward & displaced existing nodes\n\t\t\tconst trajectory = options.trajectory ?? createFanOutTrajectory();\n\t\t\tconst transitions: NodeTransition<TNode>[] = [];\n\n\t\t\t// 1. Child nodes fan out\n\t\t\toptions.childNodes.forEach((child, index) => {\n\t\t\t\tconst liveChild = mergedNodes.find((n) => n.id === child.id);\n\t\t\t\tif (liveChild) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode: liveChild,\n\t\t\t\t\t\tfrom: originPos,\n\t\t\t\t\t\tto: child.position,\n\t\t\t\t\t\ttrajectory,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\ttotal: options.childNodes.length,\n\t\t\t\t\t\tduration: options.duration ?? 400,\n\t\t\t\t\t\teasing: options.easing\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// 2. Displaced sibling nodes slide\n\t\t\tdisplacedMap.forEach((targetPos, nodeId) => {\n\t\t\t\tconst node = mergedNodes.find((n) => n.id === nodeId);\n\t\t\t\tif (node) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom: { ...node.position },\n\t\t\t\t\t\tto: targetPos,\n\t\t\t\t\t\ttrajectory: linearPositionTrajectory,\n\t\t\t\t\t\tduration: options.duration ?? 400,\n\t\t\t\t\t\teasing: options.easing\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trunMultiNodeTransition(transitions, {\n\t\t\t\tstyleFormat: 'object',\n\t\t\t\tonUpdate: (updated) => setNodes(mergeById(mergedNodes, updated)),\n\t\t\t\tonComplete: () => options.onComplete?.()\n\t\t\t});\n\t\t},\n\t\t[target]\n\t);\n\n\tconst collapseNode = useCallback(\n\t\t(parentNodeId: string, options: CollapseNodeOptions = {}) => {\n\t\t\tconst { nodes, setNodes, setEdges } = target;\n\t\t\tconst snapshot = snapshotsRef.current.get(parentNodeId);\n\t\t\tif (!snapshot) return;\n\n\t\t\tconst parent = nodes.find((n) => n.id === parentNodeId);\n\t\t\tconst originPos: XYPosition = parent ? { ...parent.position } : { x: 0, y: 0 };\n\n\t\t\tconst childIdSet = new Set(snapshot.childNodeIds);\n\t\t\tconst edgeIdSet = new Set(snapshot.childEdgeIds);\n\n\t\t\tconst transitions: NodeTransition<TNode>[] = [];\n\n\t\t\t// 1. Children animate back into parent\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (childIdSet.has(node.id)) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom: { ...node.position },\n\t\t\t\t\t\tto: originPos,\n\t\t\t\t\t\tduration: options.duration ?? 300,\n\t\t\t\t\t\teasing: options.easing,\n\t\t\t\t\t\ttrajectory: options.trajectory\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// 2. Displaced nodes animate back to original positions\n\t\t\tsnapshot.displacedNodes.forEach((disp) => {\n\t\t\t\tconst node = nodes.find((n) => n.id === disp.id);\n\t\t\t\tif (node) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom: { ...node.position },\n\t\t\t\t\t\tto: disp.originalPosition,\n\t\t\t\t\t\tduration: options.duration ?? 300,\n\t\t\t\t\t\teasing: options.easing,\n\t\t\t\t\t\ttrajectory: linearPositionTrajectory\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trunMultiNodeTransition(transitions, {\n\t\t\t\tstyleFormat: 'object',\n\t\t\t\tonUpdate: (updated) => setNodes(mergeById(nodes, updated)),\n\t\t\t\tonComplete: () => {\n\t\t\t\t\t// Clean up child nodes and edges\n\t\t\t\t\tsetNodes((prev) => prev.filter((n) => !childIdSet.has(n.id)));\n\t\t\t\t\tsetEdges((prev) => prev.filter((e) => !edgeIdSet.has(e.id)));\n\t\t\t\t\tsnapshotsRef.current.delete(parentNodeId);\n\t\t\t\t\toptions.onComplete?.();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t[target]\n\t);\n\n\treturn {\n\t\texplodeNode,\n\t\tcollapseNode,\n\t\tisExploded: (parentNodeId: string) => snapshotsRef.current.has(parentNodeId),\n\t\tgetSnapshot: (parentNodeId: string) => snapshotsRef.current.get(parentNodeId)\n\t};\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tcreateCanvasArrangeController,\n\tmatchArrangeShortcut,\n\ttype ArrangeHistoryTarget,\n\ttype AutoLayoutOptions,\n\ttype ArrangeShortcutBinding,\n\ttype CanvasArrangeAction,\n\ttype CanvasNode,\n\ttype GuideLine,\n\ttype NodeRectOptions,\n\ttype SnapGuidesOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasArrangeOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** Ids acted on when a method is called without ids (default: nodes with `selected: true`). */\n\tgetSelectedIds?: () => string[];\n\t/** When set, every arrange action is recorded as one undoable command. */\n\thistory?: ArrangeHistoryTarget;\n\t/** Current zoom (e.g. `useViewport().zoom`) for the screen-pixel guide threshold. */\n\tzoom?: number;\n\tguides?: Omit<SnapGuidesOptions, 'zoom'>;\n\t/** Turns drag snapping off (default `true`). */\n\tsnapping?: boolean;\n\trectOptions?: NodeRectOptions;\n\t/** Re-run auto layout around arranged nodes in the same undo step (see `useCanvasAutoLayout`). */\n\tautoLayout?: boolean | AutoLayoutOptions;\n}\n\n/**\n * React hook for Freeform-style arrangement on React Flow: align, distribute, make same size,\n * lock / unlock, layer order and smart guides with snap-to-shape while dragging.\n *\n * Snapping: pass node changes through `snapPositionChanges` in `onNodesChange`\n * (`onNodesChange={(c) => setNodes((n) => applyNodeChanges(arrange.snapPositionChanges(c), n))}`)\n * and render `guides` with `<CanvasGuidesLayer>`.\n */\nexport function useCanvasArrange<TNode extends CanvasNode = CanvasNode>(options: UseCanvasArrangeOptions<TNode>) {\n\tconst [guides, setGuides] = useState<GuideLine[]>([]);\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasArrangeController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive actions (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tgetSelectedIds: () =>\n\t\t\t\t\toptionsRef.current.getSelectedIds?.() ??\n\t\t\t\t\tnodesRef.current.filter((n) => n.selected).map((n) => n.id),\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tgetZoom: () => optionsRef.current.zoom ?? 1,\n\t\t\t\tget guides() {\n\t\t\t\t\treturn optionsRef.current.guides;\n\t\t\t\t},\n\t\t\t\tget snapping() {\n\t\t\t\t\treturn optionsRef.current.snapping;\n\t\t\t\t},\n\t\t\t\tget rectOptions() {\n\t\t\t\t\treturn optionsRef.current.rectOptions;\n\t\t\t\t},\n\t\t\t\tget autoLayout() {\n\t\t\t\t\treturn optionsRef.current.autoLayout;\n\t\t\t\t},\n\t\t\t\tonGuidesChange: setGuides\n\t\t\t}),\n\t\t[]\n\t);\n\n\treturn useMemo(() => ({ ...controller, guides }), [controller, guides]);\n}\n\nexport type CanvasArrange = ReturnType<typeof useCanvasArrange>;\n\nexport interface UseCanvasArrangeShortcutsOptions {\n\tarrange: { runAction: (action: CanvasArrangeAction) => boolean };\n\t/** Scenes controller for PageDown / PageUp (next / previous scene). */\n\tscenes?: { next: () => unknown; previous: () => unknown };\n\ttargetElement?: HTMLElement | Window | null;\n\tenabled?: boolean;\n\tbindings?: readonly ArrangeShortcutBinding[];\n}\n\n/**\n * Registers the arrange keyboard shortcuts (see `DEFAULT_ARRANGE_SHORTCUTS`), ignoring\n * events from inputs, textareas, contenteditable and ProseMirror editors.\n */\nexport function useCanvasArrangeShortcuts(options: UseCanvasArrangeShortcutsOptions) {\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\tconst { targetElement, enabled = true } = options;\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\t\tconst target = targetElement ?? (typeof window !== 'undefined' ? window : null);\n\t\tif (!target) return;\n\n\t\tfunction handleKeyDown(event: Event) {\n\t\t\tconst { arrange, scenes, bindings } = optionsRef.current;\n\t\t\tconst action = matchArrangeShortcut(event as KeyboardEvent, bindings);\n\t\t\tif (!action) return;\n\t\t\tlet handled = false;\n\t\t\tif (action === 'nextScene' || action === 'previousScene') {\n\t\t\t\tif (scenes) {\n\t\t\t\t\tscenes[action === 'nextScene' ? 'next' : 'previous']();\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thandled = arrange.runAction(action);\n\t\t\t}\n\t\t\tif (handled) event.preventDefault();\n\t\t}\n\n\t\ttarget.addEventListener('keydown', handleKeyDown);\n\t\treturn () => target.removeEventListener('keydown', handleKeyDown);\n\t}, [targetElement, enabled]);\n}\n","import { useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n\tCanvasScenesStore,\n\tfitViewportToNodes,\n\ttype CanvasNode,\n\ttype CanvasScene,\n\ttype CanvasScenesOptions,\n\ttype CanvasViewport,\n\ttype FitViewportOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasScenesOptions extends CanvasScenesOptions {\n\t/** Reads the live viewport, used by `capture` / `recapture` (e.g. `useReactFlow().getViewport`). */\n\tgetViewport?: () => CanvasViewport;\n\t/** Moves the canvas to a scene (e.g. `useReactFlow().setViewport`). */\n\tsetViewport?: (viewport: CanvasViewport, options?: { duration?: number }) => void;\n\t/** Transition duration passed to `setViewport` when showing a scene (default 300ms). */\n\tduration?: number;\n\t/** Use an existing store (e.g. one shared with non-React code) instead of creating one. */\n\tstore?: CanvasScenesStore;\n}\n\n/**\n * React hook for Freeform-style Scenes: named saved viewports with show next / previous,\n * reorder, rename and JSON persistence. Backed by the framework-agnostic\n * `CanvasScenesStore` through `useSyncExternalStore`.\n */\nexport function useCanvasScenes(options: UseCanvasScenesOptions = {}) {\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\tconst storeRef = useRef<CanvasScenesStore | null>(null);\n\tif (!storeRef.current) storeRef.current = options.store ?? new CanvasScenesStore(options);\n\tconst store = storeRef.current;\n\n\tconst state = useSyncExternalStore(\n\t\t(listener) => store.subscribe(listener),\n\t\t() => store.getState(),\n\t\t() => store.getState()\n\t);\n\n\tconst actions = useMemo(() => {\n\t\tconst show = (scene: CanvasScene | undefined) => {\n\t\t\tif (scene) {\n\t\t\t\toptionsRef.current.setViewport?.(scene.viewport, { duration: optionsRef.current.duration ?? 300 });\n\t\t\t}\n\t\t\treturn scene;\n\t\t};\n\t\treturn {\n\t\t\tstore,\n\t\t\t/** Saves the current viewport (or `viewport`) as a new scene. */\n\t\t\tcapture(name?: string, extra: { viewport?: CanvasViewport; nodeIds?: string[]; index?: number } = {}) {\n\t\t\t\tconst viewport = extra.viewport ?? optionsRef.current.getViewport?.();\n\t\t\t\tif (!viewport) throw new Error('[useCanvasScenes] capture() needs a viewport or a getViewport option.');\n\t\t\t\treturn store.add({ viewport, name, nodeIds: extra.nodeIds }, extra.index);\n\t\t\t},\n\t\t\t/** Saves a scene framing the given nodes in a container of `size`. */\n\t\t\tcaptureNodes(\n\t\t\t\tnodes: CanvasNode[],\n\t\t\t\tids: string[],\n\t\t\t\tsize: { width: number; height: number },\n\t\t\t\tname?: string,\n\t\t\t\tfit?: FitViewportOptions\n\t\t\t) {\n\t\t\t\tconst viewport = fitViewportToNodes(nodes, size, ids, fit);\n\t\t\t\treturn viewport ? store.add({ viewport, name, nodeIds: ids }) : undefined;\n\t\t\t},\n\t\t\t/** Replaces a scene's viewport with the live one. */\n\t\t\trecapture(id: string) {\n\t\t\t\tconst viewport = optionsRef.current.getViewport?.();\n\t\t\t\treturn viewport ? store.update(id, { viewport }) : undefined;\n\t\t\t},\n\t\t\tupdate: (id: string, patch: Partial<Omit<CanvasScene, 'id'>>) => store.update(id, patch),\n\t\t\trename: (id: string, name: string) => store.rename(id, name),\n\t\t\tmove: (id: string, toIndex: number) => store.move(id, toIndex),\n\t\t\treorder: (ids: string[]) => store.reorder(ids),\n\t\t\tremove: (id: string) => store.remove(id),\n\t\t\tclear: () => store.clear(),\n\t\t\tgoTo: (id: string) => show(store.goTo(id)),\n\t\t\tnext: () => show(store.next()),\n\t\t\tprevious: () => show(store.previous()),\n\t\t\ttoJSON: () => store.toJSON(),\n\t\t\tserialize: () => store.serialize(),\n\t\t\tload: (input: string | unknown) => store.load(input)\n\t\t};\n\t}, [store]);\n\n\treturn {\n\t\t...actions,\n\t\tscenes: state.scenes,\n\t\tcurrentId: state.currentId,\n\t\tcurrentIndex: state.currentIndex,\n\t\tcurrent: state.currentIndex === -1 ? null : state.scenes[state.currentIndex]\n\t};\n}\n\nexport type CanvasScenes = ReturnType<typeof useCanvasScenes>;\n","import React from 'react';\nimport type { CanvasViewport, GuideLine } from '@pixerate/editor/canvas';\n\nexport interface CanvasGuidesLayerProps {\n\t/** Guide segments in flow coordinates (e.g. `arrange.guides`). */\n\tguides: GuideLine[];\n\t/** Current viewport (e.g. `useViewport()` from React Flow). */\n\tviewport?: CanvasViewport;\n\t/** Colour of edge and centre guides. */\n\tcolor?: string;\n\t/** Colour of equal-spacing guides. */\n\tspacingColor?: string;\n\t/** Colour of measuring lines, their labels and extension lines. */\n\tmeasureColor?: string;\n\tclassName?: string;\n}\n\nconst DEFAULT_VIEWPORT: CanvasViewport = { x: 0, y: 0, zoom: 1 };\n\n/**\n * Smart-guide overlay for React Flow. Place it inside the flow container (it is absolutely\n * positioned over the whole pane) and pass the live viewport.\n */\nexport function CanvasGuidesLayer({\n\tguides,\n\tviewport = DEFAULT_VIEWPORT,\n\tcolor = '#f59e0b',\n\tspacingColor = '#ec4899',\n\tmeasureColor = '#ef4444',\n\tclassName = ''\n}: CanvasGuidesLayerProps) {\n\tif (!guides || guides.length === 0) return null;\n\tconst sx = (x: number) => x * viewport.zoom + viewport.x;\n\tconst sy = (y: number) => y * viewport.zoom + viewport.y;\n\n\treturn (\n\t\t<svg\n\t\t\tclassName={`pixerate-canvas-guides ${className}`}\n\t\t\tstyle={{\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: 0,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\toverflow: 'visible',\n\t\t\t\tzIndex: 10\n\t\t\t}}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t{guides.map((guide, i) => {\n\t\t\t\tconst measuring = guide.kind === 'measure' || guide.kind === 'extension';\n\t\t\t\treturn (\n\t\t\t\t\t<line\n\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\tdata-kind={guide.kind}\n\t\t\t\t\t\tx1={sx(guide.x1)}\n\t\t\t\t\t\ty1={sy(guide.y1)}\n\t\t\t\t\t\tx2={sx(guide.x2)}\n\t\t\t\t\t\ty2={sy(guide.y2)}\n\t\t\t\t\t\tstroke={measuring ? measureColor : guide.kind === 'spacing' ? spacingColor : color}\n\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\tstrokeDasharray={guide.kind === 'centre' ? '4 3' : guide.kind === 'extension' ? '3 3' : undefined}\n\t\t\t\t\t\tshapeRendering=\"crispEdges\"\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{guides.map((guide, i) => {\n\t\t\t\tif (!guide.label) return null;\n\t\t\t\tconst x = sx((guide.x1 + guide.x2) / 2);\n\t\t\t\tconst y = sy((guide.y1 + guide.y2) / 2);\n\t\t\t\t// Labels sit beside vertical lines and below horizontal ones.\n\t\t\t\tconst vertical = guide.orientation === 'vertical';\n\t\t\t\tconst width = guide.label.length * 6.5 + 8;\n\t\t\t\treturn (\n\t\t\t\t\t<g\n\t\t\t\t\t\tkey={`label-${i}`}\n\t\t\t\t\t\tclassName=\"pixerate-canvas-guides__label\"\n\t\t\t\t\t\tdata-label={guide.label}\n\t\t\t\t\t\ttransform={`translate(${vertical ? x + 4 : x - width / 2} ${vertical ? y - 8 : y + 4})`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<rect width={width} height={16} rx={3} fill={measureColor} />\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={width / 2}\n\t\t\t\t\t\t\ty={11.5}\n\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\tfontSize={11}\n\t\t\t\t\t\t\tfontFamily=\"system-ui, sans-serif\"\n\t\t\t\t\t\t\tfill=\"#fff\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{guide.label}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t</g>\n\t\t\t\t);\n\t\t\t})}\n\t\t</svg>\n\t);\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tcreateCanvasDrawController,\n\ttype ArrangeHistoryTarget,\n\ttype CanvasNode,\n\ttype FreehandDrawOptions,\n\ttype FreehandStroke,\n\ttype FreehandStrokeStyle,\n\ttype FreehandTool\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasDrawOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\thistory?: ArrangeHistoryTarget;\n\tinitialTool?: FreehandTool;\n\tinitialStyle?: Partial<FreehandStrokeStyle>;\n\tdrawOptions?: FreehandDrawOptions;\n\tgenerateNodeId?: () => string;\n\tonStrokeComplete?: (node: TNode) => void;\n\tonNodesErase?: (erasedNodes: TNode[]) => void;\n}\n\nexport interface CanvasDrawState {\n\ttool: FreehandTool;\n\tstyle: FreehandStrokeStyle;\n\tactiveStroke: FreehandStroke | null;\n\tisDrawing: boolean;\n}\n\nexport interface CanvasDrawActions<TNode extends CanvasNode = CanvasNode> {\n\tsetTool: (tool: FreehandTool) => void;\n\tsetStyle: (style: Partial<FreehandStrokeStyle>) => void;\n\tstartStroke: (point: [number, number]) => void;\n\tcontinueStroke: (point: [number, number]) => void;\n\tendStroke: () => TNode | null;\n\tcancelStroke: () => void;\n\teraseAt: (point: [number, number], radius?: number) => TNode[];\n}\n\nexport type CanvasDraw<TNode extends CanvasNode = CanvasNode> = CanvasDrawState &\n\tCanvasDrawActions<TNode>;\n\n/**\n * React hook managing freehand drawing tools (pen, highlighter, eraser) on a canvas.\n */\nexport function useCanvasDraw<TNode extends CanvasNode = CanvasNode>(\n\toptions: UseCanvasDrawOptions<TNode>\n): CanvasDraw<TNode> {\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst [tool, setToolState] = useState<FreehandTool>(options.initialTool ?? 'select');\n\tconst [activeStroke, setActiveStroke] = useState<FreehandStroke | null>(null);\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasDrawController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\ttool: options.initialTool ?? 'select',\n\t\t\t\tstyle: options.initialStyle,\n\t\t\t\tdrawOptions: options.drawOptions,\n\t\t\t\tgenerateNodeId: options.generateNodeId,\n\t\t\t\tonToolChange: setToolState,\n\t\t\t\tonStyleChange: (s) => setStyleState(s),\n\t\t\t\tonActiveStrokeChange: setActiveStroke,\n\t\t\t\tonStrokeComplete: (n) => optionsRef.current.onStrokeComplete?.(n),\n\t\t\t\tonNodesErase: (erased) => optionsRef.current.onNodesErase?.(erased)\n\t\t\t}),\n\t\t[]\n\t);\n\n\tconst [style, setStyleState] = useState<FreehandStrokeStyle>(controller.style);\n\n\t// Synchronize initialTool changes if passed as reactive prop\n\tuseEffect(() => {\n\t\tif (options.initialTool && options.initialTool !== controller.tool) {\n\t\t\tcontroller.setTool(options.initialTool);\n\t\t}\n\t}, [options.initialTool, controller]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\ttool,\n\t\t\tstyle,\n\t\t\tactiveStroke,\n\t\t\tisDrawing: activeStroke !== null,\n\t\t\tsetTool: controller.setTool,\n\t\t\tsetStyle: controller.setStyle,\n\t\t\tstartStroke: controller.startStroke,\n\t\t\tcontinueStroke: controller.continueStroke,\n\t\t\tendStroke: controller.endStroke,\n\t\t\tcancelStroke: controller.cancelStroke,\n\t\t\teraseAt: controller.eraseAt\n\t\t}),\n\t\t[tool, style, activeStroke, controller]\n\t);\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CanvasDraw } from './useCanvasDraw.js';\nimport {\n\tstrokePointsToPathData,\n\tresolveCanvasGradient,\n\tgradientToSvgDef,\n\ttype CanvasNode,\n\ttype CanvasViewport\n} from '@pixerate/editor/canvas';\n\nexport interface CanvasDrawLayerProps<TNode extends CanvasNode = CanvasNode> {\n\t/** Draw state and controller actions from `useCanvasDraw`. */\n\tdraw: CanvasDraw<TNode>;\n\t/** Current viewport (e.g. `useViewport()` from React Flow). */\n\tviewport?: CanvasViewport;\n\t/** Optional class name on the root SVG overlay element. */\n\tclassName?: string;\n\t/** Optional inline styles on the root SVG overlay element. */\n\tstyle?: React.CSSProperties;\n\t/** Cursor styling override when drawing or erasing. */\n\tcursor?: string;\n\t/** Eraser circle preview radius in screen pixels (default: 12). */\n\teraserRadius?: number;\n}\n\nconst DEFAULT_VIEWPORT: CanvasViewport = { x: 0, y: 0, zoom: 1 };\n\n/**\n * Overlay component for freehand drawing inside React Flow.\n * Renders an interactive SVG capturing drawing pointer events when `draw.tool !== 'select'`.\n * Also supports holding Spacebar to temporarily pan the canvas without switching tools.\n */\nexport function CanvasDrawLayer<TNode extends CanvasNode = CanvasNode>({\n\tdraw,\n\tviewport = DEFAULT_VIEWPORT,\n\tclassName = '',\n\tstyle,\n\tcursor,\n\teraserRadius = 12\n}: CanvasDrawLayerProps<TNode>) {\n\tconst svgRef = useRef<SVGSVGElement | null>(null);\n\tconst [spaceHeld, setSpaceHeld] = useState(false);\n\tconst [eraserPos, setEraserPos] = useState<[number, number] | null>(null);\n\n\t// Spacebar navigation override\n\tuseEffect(() => {\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.code === 'Space' && !e.repeat) {\n\t\t\t\tconst tag = (e.target as HTMLElement)?.tagName;\n\t\t\t\tif (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetSpaceHeld(true);\n\t\t\t}\n\t\t}\n\t\tfunction onKeyUp(e: KeyboardEvent) {\n\t\t\tif (e.code === 'Space') {\n\t\t\t\tsetSpaceHeld(false);\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('keydown', onKeyDown);\n\t\twindow.addEventListener('keyup', onKeyUp);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('keydown', onKeyDown);\n\t\t\twindow.removeEventListener('keyup', onKeyUp);\n\t\t};\n\t}, []);\n\n\t// Transform screen client coordinates to flow canvas coordinates\n\tconst clientToFlow = useCallback(\n\t\t(clientX: number, clientY: number): [number, number] => {\n\t\t\tif (!svgRef.current) return [0, 0];\n\t\t\tconst rect = svgRef.current.getBoundingClientRect();\n\t\t\tconst screenX = clientX - rect.left;\n\t\t\tconst screenY = clientY - rect.top;\n\t\t\tconst flowX = (screenX - viewport.x) / viewport.zoom;\n\t\t\tconst flowY = (screenY - viewport.y) / viewport.zoom;\n\t\t\treturn [flowX, flowY];\n\t\t},\n\t\t[viewport.x, viewport.y, viewport.zoom]\n\t);\n\n\tconst isDrawingMode = draw.tool !== 'select';\n\tconst interactive = isDrawingMode && !spaceHeld;\n\n\tconst handlePointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n\t\tif (!interactive || e.button !== 0) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t(e.target as Element).setPointerCapture?.(e.pointerId);\n\n\t\tconst flowPt = clientToFlow(e.clientX, e.clientY);\n\t\tdraw.startStroke(flowPt);\n\n\t\tif (draw.tool === 'eraser') {\n\t\t\tsetEraserPos([e.clientX, e.clientY]);\n\t\t}\n\t};\n\n\tconst handlePointerMove = (e: React.PointerEvent<SVGSVGElement>) => {\n\t\tif (draw.tool === 'eraser' && !spaceHeld) {\n\t\t\tsetEraserPos([e.clientX, e.clientY]);\n\t\t}\n\n\t\tif (!interactive) return;\n\t\t// If pointer is pressed down (or dragging)\n\t\tif (e.buttons === 1) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst flowPt = clientToFlow(e.clientX, e.clientY);\n\t\t\tdraw.continueStroke(flowPt);\n\t\t}\n\t};\n\n\tconst handlePointerUp = (e: React.PointerEvent<SVGSVGElement>) => {\n\t\tif (!interactive || e.button !== 0) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\ttry {\n\t\t\t(e.target as Element).releasePointerCapture?.(e.pointerId);\n\t\t} catch {\n\t\t\t// ignore if already released\n\t\t}\n\t\tdraw.endStroke();\n\t};\n\n\tconst handlePointerLeave = () => {\n\t\tsetEraserPos(null);\n\t};\n\n\t// Determine cursor style\n\tconst resolvedCursor = cursor\n\t\t? cursor\n\t\t: spaceHeld\n\t\t\t? 'grab'\n\t\t\t: draw.tool === 'eraser'\n\t\t\t\t? 'crosshair'\n\t\t\t\t: draw.tool === 'pen' || draw.tool === 'highlighter'\n\t\t\t\t\t? 'crosshair'\n\t\t\t\t\t: 'default';\n\n\t// Render preview of active live stroke\n\tconst strokePath = draw.activeStroke\n\t\t? strokePointsToPathData(draw.activeStroke.points)\n\t\t: null;\n\n\tconst activeGradient = draw.activeStroke\n\t\t? resolveCanvasGradient(draw.activeStroke.style.gradient ?? draw.activeStroke.style.color)\n\t\t: null;\n\tconst resolvedGradientDef = activeGradient\n\t\t? gradientToSvgDef(activeGradient, 'active-draw-stroke-gradient')\n\t\t: null;\n\tconst strokePaint = resolvedGradientDef\n\t\t? `url(#${resolvedGradientDef.id})`\n\t\t: draw.activeStroke\n\t\t\t? (draw.activeStroke.style.color as string)\n\t\t\t: 'currentColor';\n\n\treturn (\n\t\t<svg\n\t\t\tref={svgRef}\n\t\t\tclassName={`pixerate-canvas-draw-layer ${className}`}\n\t\t\tstyle={{\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: 0,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tpointerEvents: interactive ? 'all' : 'none',\n\t\t\t\tcursor: interactive ? resolvedCursor : undefined,\n\t\t\t\toverflow: 'visible',\n\t\t\t\tzIndex: 20,\n\t\t\t\ttouchAction: 'none',\n\t\t\t\t...style\n\t\t\t}}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={handlePointerUp}\n\t\t\tonPointerLeave={handlePointerLeave}\n\t\t>\n\t\t\t{/* Gradient defs for active freehand stroke */}\n\t\t\t{resolvedGradientDef && (\n\t\t\t\t<defs>\n\t\t\t\t\t{resolvedGradientDef.type === 'linear' && (\n\t\t\t\t\t\t<linearGradient id={resolvedGradientDef.id} {...resolvedGradientDef.attrs}>\n\t\t\t\t\t\t\t{resolvedGradientDef.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t)}\n\t\t\t\t\t{resolvedGradientDef.type === 'radial' && (\n\t\t\t\t\t\t<radialGradient id={resolvedGradientDef.id} {...resolvedGradientDef.attrs}>\n\t\t\t\t\t\t\t{resolvedGradientDef.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t)}\n\t\t\t\t</defs>\n\t\t\t)}\n\n\t\t\t{/* Canvas-space items transformed by current React Flow viewport */}\n\t\t\t<g transform={`translate(${viewport.x}, ${viewport.y}) scale(${viewport.zoom})`}>\n\t\t\t\t{draw.activeStroke && strokePath && (\n\t\t\t\t\t<path\n\t\t\t\t\t\tclassName=\"pixerate-canvas-draw-active\"\n\t\t\t\t\t\td={strokePath}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke={strokePaint}\n\t\t\t\t\t\tstrokeWidth={draw.activeStroke.style.width}\n\t\t\t\t\t\topacity={draw.activeStroke.style.opacity}\n\t\t\t\t\t\tstrokeLinecap={draw.activeStroke.style.cap ?? 'round'}\n\t\t\t\t\t\tstrokeLinejoin={draw.activeStroke.style.join ?? 'round'}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</g>\n\n\t\t\t{/* Screen-space eraser cursor indicator */}\n\t\t\t{draw.tool === 'eraser' && eraserPos && svgRef.current && (\n\t\t\t\t<circle\n\t\t\t\t\tcx={eraserPos[0] - svgRef.current.getBoundingClientRect().left}\n\t\t\t\t\tcy={eraserPos[1] - svgRef.current.getBoundingClientRect().top}\n\t\t\t\t\tr={eraserRadius}\n\t\t\t\t\tfill=\"rgba(239, 68, 68, 0.15)\"\n\t\t\t\t\tstroke=\"rgba(239, 68, 68, 0.8)\"\n\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\tstrokeDasharray=\"3 3\"\n\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tisMeasureModifierHeld,\n\tmeasureSelection,\n\ttype CanvasNode,\n\ttype MeasureSelectionResult,\n\ttype NodeRectOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasMeasureOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\t/** Ids measured from (default: nodes with `selected: true`). */\n\tgetSelectedIds?: () => string[];\n\t/** Turns measuring off (default `true`). */\n\tenabled?: boolean;\n\t/** Measure only while Alt / Option is held (default `true`); `false` always measures. */\n\trequireModifier?: boolean;\n\t/** Element receiving the Alt key events (default `window`). */\n\ttargetElement?: HTMLElement | Window | null;\n\trectOptions?: NodeRectOptions;\n}\n\nconst EMPTY: MeasureSelectionResult = { guides: [], target: null, selection: null };\n\n/**\n * Alt-hover distance measuring for React Flow: hold Alt / Option and hover a node to see\n * red distance lines with labels from the selection to it (or to the selection's parent\n * when hovering the selection or empty space). Wire `onNodeMouseEnter` / `onNodeMouseLeave`\n * to `<ReactFlow>` and render `guides` with `<CanvasGuidesLayer>` (concatenate them with\n * `arrange.guides` to share one layer).\n */\nexport function useCanvasMeasure<TNode extends CanvasNode = CanvasNode>(options: UseCanvasMeasureOptions<TNode>) {\n\tconst { nodes, enabled = true, requireModifier = true, targetElement, rectOptions } = options;\n\tconst [hoveredId, setHoveredId] = useState<string | null>(null);\n\tconst [modifier, setModifier] = useState(false);\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\t\tconst target = targetElement ?? (typeof window !== 'undefined' ? window : null);\n\t\tif (!target) return;\n\t\tconst onKey = (event: Event) => setModifier(isMeasureModifierHeld(event as KeyboardEvent));\n\t\tconst onBlur = () => setModifier(false);\n\t\ttarget.addEventListener('keydown', onKey);\n\t\ttarget.addEventListener('keyup', onKey);\n\t\tconst win = typeof window !== 'undefined' ? window : null;\n\t\twin?.addEventListener('blur', onBlur);\n\t\treturn () => {\n\t\t\ttarget.removeEventListener('keydown', onKey);\n\t\t\ttarget.removeEventListener('keyup', onKey);\n\t\t\twin?.removeEventListener('blur', onBlur);\n\t\t};\n\t}, [enabled, targetElement]);\n\n\tconst active = enabled && (!requireModifier || modifier);\n\tconst result = useMemo(() => {\n\t\tif (!active) return EMPTY;\n\t\tconst ids = optionsRef.current.getSelectedIds?.() ?? nodes.filter((n) => n.selected).map((n) => n.id);\n\t\treturn measureSelection(nodes, ids, hoveredId, rectOptions);\n\t}, [active, nodes, hoveredId, rectOptions]);\n\n\tconst onNodeMouseEnter = useCallback((event: { altKey?: boolean } | null, node: { id: string }) => {\n\t\tsetHoveredId(node.id);\n\t\tif (event && typeof event.altKey === 'boolean') setModifier(event.altKey);\n\t}, []);\n\tconst onNodeMouseLeave = useCallback((_event: unknown, node: { id: string }) => {\n\t\tsetHoveredId((current) => (current === node.id ? null : current));\n\t}, []);\n\n\treturn {\n\t\t/** Measuring lines (flow coordinates) to pass to `<CanvasGuidesLayer>`. */\n\t\tguides: result.guides,\n\t\t/** The box measured to (outline it), or `null`. */\n\t\ttarget: result.target,\n\t\t/** Whether measuring is showing (enabled and Alt held, unless `requireModifier: false`). */\n\t\tactive,\n\t\thoveredId,\n\t\tsetHoveredId,\n\t\t/** Sets the modifier state by hand (e.g. from a toolbar toggle). */\n\t\tsetModifier,\n\t\tonNodeMouseEnter,\n\t\tonNodeMouseLeave\n\t};\n}\n\nexport type CanvasMeasure = ReturnType<typeof useCanvasMeasure>;\n","export {\n\tAgentPresenceLayer,\n\ttype AgentPresenceLayerProps\n} from './AgentPresenceLayer.js';\n\nexport {\n\tuseStreamingCanvas,\n\ttype UseStreamingCanvasOptions\n} from './useStreamingCanvas.js';\n\nexport {\n\tuseCanvasGraph,\n\ttype UseCanvasGraphOptions\n} from './useCanvasGraph.js';\n\nexport {\n\tuseCanvasLayout,\n\ttype UseCanvasLayoutOptions\n} from './useCanvasLayout.js';\n\nexport {\n\tuseCanvasClipboard,\n\ttype UseCanvasClipboardOptions\n} from './useCanvasClipboard.js';\n\nexport {\n\tuseCanvasShortcuts,\n\ttype UseCanvasShortcutsOptions\n} from './useCanvasShortcuts.js';\n\nexport {\n\tuseCanvasDocking,\n\ttype UseCanvasDockingOptions\n} from './useCanvasDocking.js';\n\nexport {\n\tuseCanvasExplosion,\n\ttype CanvasGraphTarget\n} from './useCanvasExplosion.js';\n\n// Arrangement (align / distribute / size / lock / z-order), smart guides and scenes\nexport {\n\tuseCanvasArrange,\n\tuseCanvasArrangeShortcuts,\n\ttype CanvasArrange,\n\ttype UseCanvasArrangeOptions,\n\ttype UseCanvasArrangeShortcutsOptions\n} from './useCanvasArrange.js';\n\nexport {\n\tuseCanvasScenes,\n\ttype CanvasScenes,\n\ttype UseCanvasScenesOptions\n} from './useCanvasScenes.js';\n\nexport {\n\tCanvasGuidesLayer,\n\ttype CanvasGuidesLayerProps\n} from './CanvasGuidesLayer.js';\n\n// Freehand drawing tools (pen, highlighter, eraser)\nexport {\n\tuseCanvasDraw,\n\ttype CanvasDraw,\n\ttype CanvasDrawState,\n\ttype CanvasDrawActions,\n\ttype UseCanvasDrawOptions\n} from './useCanvasDraw.js';\n\nexport {\n\tCanvasDrawLayer,\n\ttype CanvasDrawLayerProps\n} from './CanvasDrawLayer.js';\n\n// Distance measuring (Alt-hover), resize / grid snapping and curve fitting\nexport {\n\tuseCanvasMeasure,\n\ttype CanvasMeasure,\n\ttype UseCanvasMeasureOptions\n} from './useCanvasMeasure.js';\n\nexport {\n\tmeasureBetween,\n\tmeasureToLine,\n\tmeasureSelection,\n\tmeasureLabel,\n\tisMeasureModifierHeld,\n\tsnapToGrid,\n\tsnapResize,\n\tsnapNodeResize,\n\tinferResizeHandle,\n\tresizeHandleAxes,\n\tgetResizingNodeRect,\n\tRESIZE_HANDLES,\n\tfitCubics,\n\tfitCubicRun,\n\tfitPathData,\n\tfitFreehandPath,\n\tcubicsToPathData,\n\tcubicPointAt,\n\tisStraightCubic,\n\ttype MeasureGuide,\n\ttype MeasureSelectionResult,\n\ttype MeasureSelectionOptions,\n\ttype ResizeHandle,\n\ttype SnapResizeOptions,\n\ttype SnapResizeResult,\n\ttype SnapNodeResizeOptions,\n\ttype SnapNodeResizeResult,\n\ttype CubicSegment,\n\ttype FitCubicsOptions,\n\ttype FitPathDataOptions\n} from '@pixerate/editor/canvas';\n\nexport {\n\talignNodes,\n\tdistributeNodes,\n\tmatchSize,\n\treorderNodes,\n\tapplyNodeUpdates,\n\tinvertNodeUpdates,\n\tlockNodes,\n\tunlockNodes,\n\ttoggleLockNodes,\n\tisLocked,\n\tgetNodeSize,\n\tgetNodeRect,\n\tgetAbsolutePosition,\n\treadStyleSize,\n\twithStyleSize,\n\tcomputeSnapGuides,\n\tcreateGuideIndex,\n\tcreateNodeGuideIndex,\n\tsnapNodeDrag,\n\tfindConnectorSnap,\n\tnearestHandlePositions,\n\thandlePoint,\n\tpositionToSide,\n\tsideToPosition,\n\toppositePosition,\n\tCONNECTION_LINE_TYPES,\n\tCanvasScenesStore,\n\tcreateCanvasScenesStore,\n\tparseCanvasScenes,\n\tfitViewportToRect,\n\tfitViewportToNodes,\n\tmatchArrangeShortcut,\n\tDEFAULT_ARRANGE_SHORTCUTS,\n\ttype AlignEdge,\n\ttype DistributeAxis,\n\ttype DistributeMode,\n\ttype SizeDimension,\n\ttype ZOrderOperation,\n\ttype CanvasNodeUpdate,\n\ttype GuideLine,\n\ttype GuideIndex,\n\ttype SnapGuidesOptions,\n\ttype SnapResult,\n\ttype ConnectorSnap,\n\ttype ConnectorSnapTarget,\n\ttype CanvasConnectionLineType,\n\ttype CanvasScene,\n\ttype CanvasScenesState,\n\ttype CanvasViewport,\n\ttype CanvasArrangeAction,\n\ttype ArrangeShortcutBinding\n} from '@pixerate/editor/canvas';\n\nexport { ShapeNode, type ShapeNodeProps } from './ShapeNode.js';\n\n// Shape nodes and boolean operations (Unite / Intersect / Subtract / Exclude / Divide)\nexport {\n\tcombineShapeNodes,\n\tcanCombineShapeNodes,\n\tapplyShapeCombination,\n\trevertShapeCombination,\n\tshapeNodeToPolygon,\n\tisShapeNode,\n\tgetNodeShape,\n\tSHAPE_DATA_KEY,\n\tSHAPE_NODE_TYPE,\n\tSHAPE_OPERATIONS,\n\tSHAPE_KINDS,\n\tisShapeDescription,\n\tshapeToPolygon,\n\tgetShapeSvg,\n\tgetShapeRenderData,\n\tparseSvgPath,\n\tflattenSvgPath,\n\tpolygonToSvgPath,\n\tsimplifyRing,\n\tpolygonBoolean,\n\tunionPolygons,\n\tintersectPolygons,\n\tsubtractPolygons,\n\txorPolygons,\n\tdividePolygons,\n\tpolygonArea,\n\tmultiPolygonArea,\n\tmultiPolygonBounds,\n\tringSignedArea,\n\tpointInRings,\n\tpointInMultiPolygon,\n\ttype ShapeOperation,\n\ttype ShapeDescription,\n\ttype ShapeKind,\n\ttype ShapePaint,\n\ttype ShapeSize,\n\ttype ShapeRenderData,\n\ttype RectShape,\n\ttype EllipseShape,\n\ttype RegularPolygonShape,\n\ttype StarShape,\n\ttype PathShape,\n\ttype PathCommand,\n\ttype FlattenOptions,\n\ttype PolygonToPathOptions,\n\ttype CombineShapeNodesOptions,\n\ttype CombineShapeNodesResult,\n\ttype CombineShapeNodesRefusal,\n\ttype ShapeNodePolygonOptions,\n\ttype MultiPolygon,\n\ttype PolygonWithHoles,\n\ttype PolygonRing,\n\ttype PolygonFillRule,\n\ttype PolygonOperand,\n\ttype PolygonInput,\n\ttype PolygonPiece,\n\ttype PolygonBooleanOperation,\n\ttype PolygonBooleanOptions\n} from '@pixerate/editor/canvas';\n\n// Curve-preserving path operations, Offset Path and Outline Stroke\nexport {\n\toffsetShapeNodes,\n\toutlineShapeNodeStrokes,\n\tcanOffsetShapeNodes,\n\tcanOutlineShapeNodeStrokes,\n\tapplyShapeReplacement,\n\thasVisibleStroke,\n\tshapeToBezierPath,\n\tshapeNodeToBezierPath,\n\tpathBoolean,\n\tunitePaths,\n\tintersectPaths,\n\tsubtractPaths,\n\texcludePaths,\n\tdividePaths,\n\tnormalizeBezierPath,\n\tbezierPathArea,\n\toffsetPath,\n\toutlineStroke,\n\tstrokeOutlineRings,\n\tdashContours,\n\ttoBezierPath,\n\tbezierPathToSvg,\n\ttransformBezierPath,\n\tbezierPathBounds,\n\tbezierPathSignedArea,\n\tbezierPathLength,\n\tbezierPathPointAtLength,\n\tpointInBezierPath,\n\tdistanceToBezierPath,\n\tcountPathSegments,\n\ttype BezierCommand,\n\ttype BezierPath,\n\ttype BezierPathInput,\n\ttype PathOperand,\n\ttype PathOperandInput,\n\ttype PathOpsOptions,\n\ttype PathBooleanResult,\n\ttype DividePathsResult,\n\ttype StrokeJoin,\n\ttype StrokeCap,\n\ttype OutlineStrokeOptions,\n\ttype OffsetPathOptions,\n\ttype OffsetShapeNodesOptions,\n\ttype OutlineShapeStrokesOptions,\n\ttype ShapePathEditResult,\n\ttype ShapePathEditRefusal,\n\ttype ShapePathEditOperation\n} from '@pixerate/editor/canvas';\n\n// Re-export shared canvas types & pure math from core\nexport {\n\tgetLayoutedNodes,\n\tensureLayout,\n\tcenterNodes,\n\tgetCenteredNodePosition,\n\tplaceBeside,\n\testimateNodeSize,\n\tflowSide,\n\tboundsOf,\n\tcentre,\n\toverlaps,\n\tlinearTrajectory,\n\tlinearPositionTrajectory,\n\tcreateFanOutTrajectory,\n\tcreateBezierTrajectory,\n\trunMultiNodeTransition,\n\tdefaultEasing,\n\tcomputeNodesBoundingBox,\n\tcalculateDirectionalDisplacement,\n\tcalculateDagreReflowDisplacement,\n\tisEventFromTextInput,\n\tisValidCanvasNode,\n\tisValidUrl,\n\tserializeCanvasNodes,\n\tparseCanvasClipboardData,\n\tremapPastedNodes,\n\trepositionNodesTo,\n\trealClock,\n\tManualClock,\n\tlayoutBounds,\n\tcanvasHeight,\n\testimateCanvasHeight,\n\tblendLayout,\n\tconnectedOnly,\n\ttype Clock,\n\ttype CanvasHeightOptions,\n\ttype CanvasNode,\n\ttype CanvasEdge,\n\ttype GraphDifferences,\n\ttype CanvasClipboardPayload,\n\ttype CanvasLayoutOptions,\n\ttype IncrementalLayoutOptions,\n\ttype PlaceBesideOptions,\n\ttype TrajectoryPoint,\n\ttype TrajectoryFunction,\n\ttype FanOutTrajectoryOptions,\n\ttype NodeTransition,\n\ttype DisplacementDirection,\n\ttype DirectionalDisplacementOptions,\n\ttype ReflowDisplacementOptions,\n\ttype ExplosionSnapshot,\n\ttype ExplodeNodeOptions,\n\ttype CollapseNodeOptions,\n\ttype DockStrategy,\n\ttype CanvasDockingCallbacks,\n\ttype XYPosition,\n\ttype Rect,\n\ttype Side,\n\ttype Point,\n\ttype Position\n} from '@pixerate/editor/canvas';\n\n// Auto layout (Figma-style stacks, wrap, grid, hug / fill / fixed) and constraints\nexport {\n\tlayoutFrame,\n\tlayoutAll,\n\tlayoutUp,\n\tlayoutUpMany,\n\tapplyConstraints,\n\tgetAutoLayout,\n\tgetChildLayout,\n\tgetLayoutSizing,\n\tgetAutoLayoutGrid,\n\tgetAutoLayoutInsertTarget,\n\tgetFlowChildren,\n\tgetLayoutParent,\n\tisAutoLayoutFrame,\n\tmakeSizingCoherent,\n\tmoveLayoutChild,\n\tmergeNodeUpdates,\n\trelayoutUpdates,\n\tresolvePadding,\n\tclampLayoutSize,\n\tcreateCanvasAutoLayoutController,\n\tAUTO_LAYOUT_DATA_KEY,\n\tCHILD_LAYOUT_DATA_KEY,\n\ttype AutoLayout,\n\ttype AutoLayoutChild,\n\ttype AutoLayoutMode,\n\ttype AutoLayoutSizing,\n\ttype AutoLayoutSizingPair,\n\ttype AutoLayoutSize,\n\ttype AutoLayoutAlignMain,\n\ttype AutoLayoutAlignCross,\n\ttype AutoLayoutAlignContent,\n\ttype AutoLayoutPadding,\n\ttype AutoLayoutGrid,\n\ttype AutoLayoutGridTrack,\n\ttype AutoLayoutGridArea,\n\ttype AutoLayoutGridCell,\n\ttype AutoLayoutGridGeometry,\n\ttype AutoLayoutCellAlign,\n\ttype AutoLayoutConstraints,\n\ttype AutoLayoutHorizontalConstraint,\n\ttype AutoLayoutVerticalConstraint,\n\ttype AutoLayoutMeasure,\n\ttype AutoLayoutOptions,\n\ttype AutoLayoutInsertTarget,\n\ttype CanvasAutoLayoutController,\n\ttype CanvasAutoLayoutControllerOptions\n} from '@pixerate/editor/canvas';\n\nexport {\n\tuseCanvasAutoLayout,\n\ttype CanvasAutoLayout,\n\ttype UseCanvasAutoLayoutOptions\n} from './useCanvasAutoLayout.js';\n\n// Design tokens: bindings, per-frame modes and inspector controls\nexport {\n\tuseCanvasTokens,\n\ttype CanvasTokens,\n\ttype UseCanvasTokensOptions\n} from './useCanvasTokens.js';\n\nexport {\n\tTokenBindingPicker,\n\tTokenModeSwitcher,\n\ttype TokenBindingPickerProps,\n\ttype TokenModeSwitcherProps\n} from './TokenBindingPicker.js';\n\nexport {\n\tbindCanvasToken,\n\tsetCanvasTokenMode,\n\tresolveCanvasTokens,\n\tdetachTokenBindings,\n\tpruneCanvasTokenModes,\n\tinspectNodeTokens,\n\tgetNodeTokenBindings,\n\tgetNodeTokenModes,\n\tgetEffectiveTokenModes,\n\tgetBindableTokenProperties,\n\tgetCanvasTokenProperty,\n\tgetTokenPropertyScope,\n\tgetTokensForProperty,\n\treadNodeStyleProperty,\n\twriteNodeStyleProperty,\n\tCANVAS_TOKEN_PROPERTIES,\n\tTOKEN_BINDINGS_DATA_KEY,\n\tTOKEN_MODES_DATA_KEY,\n\ttype CanvasTokenProperty,\n\ttype CanvasTokenOptions,\n\ttype CanvasTokenBindingInfo\n} from '@pixerate/editor/canvas';\n\n// Keyframe animation: playback, record mode, timeline and export\nexport {\n\tuseCanvasAnimation,\n\ttype CanvasAnimation,\n\ttype UseCanvasAnimationOptions\n} from './useCanvasAnimation.js';\n\nexport { AnimationTimeline, type AnimationTimelineProps } from './AnimationTimeline.js';\n\nexport {\n\tcreateCanvasAnimationController,\n\tAnimationPlayer,\n\tcreateAnimationPlayer,\n\tAnimationEditError,\n\tANIMATION_DATA_KEY,\n\tANIMATION_TIME_EPSILON,\n\tANIMATABLE_PROPERTIES,\n\tANIMATION_EASING_PRESETS,\n\tANIMATION_EASING_LABELS,\n\tCUBIC_BEZIER_PRESETS,\n\tMAX_KEYFRAME_REFS,\n\tCSS_ANIMATION_PROPERTIES,\n\tevaluateAnimation,\n\tevaluateTrack,\n\tevaluateEasing,\n\tapplyAnimation,\n\tapplyAnimationOverrides,\n\tinterpolateAnimationValue,\n\tgetAnimationDuration,\n\twrapAnimationTime,\n\tcubicBezierAt,\n\tspringAt,\n\tresolveEasing,\n\tparseCssEasing,\n\teasingToCss,\n\teasingLabel,\n\teasingFromInfluence,\n\tisAnimationEasing,\n\tmixColorsOklab,\n\trgbToOklab,\n\toklabToRgb,\n\tparseOklab,\n\tformatOklab,\n\tgetNodeAnimation,\n\tgetAnimationTrack,\n\tgetAnimatedProperties,\n\tgetAnimatableProperty,\n\tisNodeAnimated,\n\twithNodeAnimation,\n\tnormalizeKeyframes,\n\tisAnimationKeyframe,\n\tclampAnimationValue,\n\tsetKeyframe,\n\taddKeyframesAtTime,\n\tupdateKeyframe,\n\tdeleteKeyframes,\n\tsetKeyframeEasing,\n\tsetTrackEnabled,\n\tremoveTrack,\n\tsetMotionPath,\n\tmoveKeyframes,\n\tscaleKeyframes,\n\tsnapKeyframeDelta,\n\tsnapTimeToFrame,\n\tgetKeyframeTimes,\n\tcopyKeyframes,\n\tpasteKeyframes,\n\tparseKeyframeClipboard,\n\trecordAnimationChanges,\n\tanimateNode,\n\tgetAnimatedValue,\n\treadAnimatableValue,\n\tsampleAnimationFrames,\n\texportCssAnimation,\n\ttoWebAnimations,\n\tplayWebAnimations,\n\tgetCssPropertyAnimations,\n\tisCssExportExact,\n\tgetTimelineRows,\n\tgetTimelineTicks,\n\tisKeyframeSelected,\n\ttimeToX,\n\txToTime,\n\tformatAnimationTime,\n\ttype AnimatableProperty,\n\ttype AnimationValue,\n\ttype AnimationValueType,\n\ttype AnimationKeyframe,\n\ttype AnimationTrack,\n\ttype AnimationMotionPath,\n\ttype NodeAnimation,\n\ttype AnimationEasing,\n\ttype AnimationEasingPreset,\n\ttype CubicBezierEasing,\n\ttype SpringEasing,\n\ttype AnimationLoopMode,\n\ttype AnimationDocument,\n\ttype AnimationOverrides,\n\ttype AnimationFrame,\n\ttype AnimationPlayerState,\n\ttype AnimationPlayerOptions,\n\ttype AnimationHistoryTarget,\n\ttype AnimationKeyframeClipboard,\n\ttype AnimationEditErrorCode,\n\ttype KeyframeRef,\n\ttype KeyframePatch,\n\ttype KeyframeSnap,\n\ttype KeyframeDragState,\n\ttype AnimateNodeOptions,\n\ttype CanvasAnimationController,\n\ttype CanvasAnimationControllerOptions,\n\ttype CanvasAnimationState,\n\ttype CssAnimationExport,\n\ttype CssExportOptions,\n\ttype WebAnimationSpec,\n\ttype TimelineRow,\n\ttype TimelineKeyframe,\n\ttype OklabColor\n} from '@pixerate/editor/canvas';\n\n// Components and instances: hook, components panel and instance inspector\nexport {\n\tuseCanvasComponents,\n\ttype CanvasComponents,\n\ttype UseCanvasComponentsOptions\n} from './useCanvasComponents.js';\n\nexport {\n\tCanvasComponentsPanel,\n\tCanvasInstanceInspector,\n\ttype CanvasComponentsPanelProps,\n\ttype CanvasComponentsPanelActions,\n\ttype CanvasInstanceInspectorProps,\n\ttype CanvasInstanceInspectorActions\n} from './CanvasComponentsPanel.js';\n\nexport {\n\tcreateCanvasComponentsController,\n\tcreateCanvasComponent,\n\tcombineCanvasComponentsAsVariants,\n\tcreateCanvasInstance,\n\tdetachCanvasInstance,\n\tresetCanvasInstanceOverrides,\n\tpushCanvasInstanceOverrides,\n\tswapCanvasInstance,\n\tsetCanvasInstanceProperties,\n\tsetCanvasComponentProperty,\n\tbindCanvasComponentProperty,\n\trestoreCanvasMainComponent,\n\taddCanvasVariant,\n\tremoveCanvasVariant,\n\tsetCanvasVariantProperties,\n\trenameCanvasVariantProperty,\n\trenameCanvasVariantValue,\n\tgetNextVariantValues,\n\tsyncCanvasComponents,\n\tsyncCanvasInstance,\n\tsyncAllCanvasInstances,\n\tlistCanvasComponents,\n\tinspectCanvasInstance,\n\tgetInstanceStatus,\n\tgetNodeOverrides,\n\tgetComponentSourceId,\n\tgetInstanceData,\n\tgetCanvasComponentDragId,\n\tisCanvasComponent,\n\tisCanvasComponentSet,\n\tisCanvasInstance,\n\twouldCreateComponentCycle,\n\tCANVAS_COMPONENT_DRAG_TYPE,\n\ttype CanvasComponentsController,\n\ttype CanvasComponentsControllerOptions,\n\ttype CanvasComponentPropertyDef,\n\ttype CanvasComponentPropertyField,\n\ttype CanvasComponentResult,\n\ttype CanvasComponentSyncOptions,\n\ttype CanvasInstanceInfo,\n\ttype CanvasComponentInfo,\n\ttype CanvasComponentSetInfo,\n\ttype AddCanvasVariantOptions,\n\ttype SetCanvasVariantPropertiesOptions,\n\t// Freehand drawing exports\n\tcreateCanvasDrawController,\n\tcreateDefaultStrokeStyle,\n\tfindStrokesAtPoint,\n\tstreamlinePoints,\n\tstrokePointsToPathData,\n\tstrokeToShapeNode,\n\ttype CanvasDrawControllerOptions,\n\ttype FreehandStroke,\n\ttype FreehandStrokeStyle,\n\ttype FreehandTool,\n\ttype StrokeToShapeNodeOptions,\n\t// Gradients\n\tCANVAS_GRADIENT_PRESETS,\n\tisCanvasGradient,\n\tparseCssGradient,\n\tresolveCanvasGradient,\n\tangleToSvgLinearCoords,\n\tgradientToSvgDef,\n\ttype GradientStop,\n\ttype CanvasLinearGradient,\n\ttype CanvasRadialGradient,\n\ttype CanvasGradientDef,\n\ttype SvgGradientStop,\n\ttype SvgGradientDef\n} from '@pixerate/editor/canvas';\n\n// Mermaid diagrams (flowchart, state, class, ER) on the canvas, with streaming\nexport {\n\tuseMermaidDiagram,\n\tuseMermaidStream,\n\tuseDiagramState,\n\ttype UseMermaidDiagramOptions,\n\ttype UseMermaidDiagramResult,\n\ttype UseMermaidStreamOptions,\n\ttype UseMermaidStreamResult\n} from './useMermaidDiagram.js';\n\nexport {\n\tMermaidDiagramNode,\n\tMermaidDiagramGroup,\n\tmermaidNodeStyle,\n\ttype MermaidDiagramNodeData,\n\ttype MermaidDiagramNodeProps\n} from './MermaidDiagramNode.js';\n\n// Static previews of Mermaid diagrams\nexport { MermaidThumbnail, type MermaidThumbnailProps } from './MermaidThumbnail.js';\n\n// Agent cursors acting out diagram edits\nexport { useDiagramDirector, usePresenceState, type UseDiagramDirectorOptions } from './useDiagramDirector.js';\nexport { DiagramPresenceLayer, type DiagramPresenceLayerProps } from './DiagramPresenceLayer.js';\n","import React from 'react';\nimport { getShapeRenderData, isShapeDescription, type ShapeDescription } from '@pixerate/editor/canvas';\n\nexport interface ShapeNodeProps {\n\t/** Node data; `data.shape` holds the shape description. */\n\tdata: { shape?: ShapeDescription; [key: string]: any };\n\t/** Node width / height (React Flow passes them to custom nodes). */\n\twidth?: number;\n\theight?: number;\n\tselected?: boolean;\n\tclassName?: string;\n\t/** Rendered over the shape, e.g. React Flow `<Handle>`s or a label. */\n\tchildren?: React.ReactNode;\n\t[key: string]: any;\n}\n\n/**\n * Headless shape node: draws `data.shape` as one SVG path that fills the node box.\n * Register it as a React Flow node type (`nodeTypes={{ shape: ShapeNode }}`), or wrap it\n * to add handles. Strokes keep their width when the node is resized\n * (`vector-effect: non-scaling-stroke`). Renders nothing when `data.shape` is missing.\n */\nexport function ShapeNode({ id, data, width, height, selected, className = '', children }: ShapeNodeProps) {\n\tconst shape = data?.shape;\n\tif (!isShapeDescription(shape)) return null;\n\tconst render = getShapeRenderData(shape, { width, height }, { id: id || data?.id });\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-shape-node ${className}`.trim()}\n\t\t\tdata-shape-kind={shape.kind}\n\t\t\tdata-selected={selected ? 'true' : undefined}\n\t\t\tstyle={{ position: 'relative', width: '100%', height: '100%' }}\n\t\t>\n\t\t\t<svg\n\t\t\t\tviewBox={render.viewBox}\n\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tstyle={{ display: 'block', overflow: 'visible' }}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{(render.fillGradient || render.strokeGradient) && (\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t{render.fillGradient && render.fillGradient.type === 'linear' && (\n\t\t\t\t\t\t\t<linearGradient id={render.fillGradient.id} {...render.fillGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.fillGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{render.fillGradient && render.fillGradient.type === 'radial' && (\n\t\t\t\t\t\t\t<radialGradient id={render.fillGradient.id} {...render.fillGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.fillGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{render.strokeGradient && render.strokeGradient.type === 'linear' && (\n\t\t\t\t\t\t\t<linearGradient id={render.strokeGradient.id} {...render.strokeGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.strokeGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{render.strokeGradient && render.strokeGradient.type === 'radial' && (\n\t\t\t\t\t\t\t<radialGradient id={render.strokeGradient.id} {...render.strokeGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.strokeGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</defs>\n\t\t\t\t)}\n\t\t\t\t<path\n\t\t\t\t\td={render.d}\n\t\t\t\t\ttransform={render.transform}\n\t\t\t\t\tfill={render.fill}\n\t\t\t\t\tfillRule={render.fillRule}\n\t\t\t\t\tstroke={render.stroke}\n\t\t\t\t\tstrokeWidth={render.strokeWidth}\n\t\t\t\t\tstrokeLinecap={render.strokeLinecap}\n\t\t\t\t\tstrokeLinejoin={render.strokeLinejoin}\n\t\t\t\t\topacity={render.opacity}\n\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tcreateCanvasAutoLayoutController,\n\ttype ArrangeHistoryTarget,\n\ttype AutoLayoutMeasure,\n\ttype CanvasNode,\n\ttype GuideLine,\n\ttype NodeRectOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasAutoLayoutOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** When set, the hook's actions (add / remove / resize / reorder / apply) are undoable steps. */\n\thistory?: ArrangeHistoryTarget;\n\t/** Turns automatic relayout off (`applyAutoLayout` still works). Default `true`. */\n\tenabled?: boolean;\n\t/** Reorder flow children by dragging them within their frame (default `true`). */\n\tdragReorder?: boolean;\n\t/** Text measuring and size hooks (default: xyflow `measured` sizes). */\n\tmeasure?: AutoLayoutMeasure;\n\trectOptions?: NodeRectOptions;\n}\n\n/**\n * React hook for Figma-style auto layout on React Flow sub-flows. Frames are nodes with\n * `data.layout`; their children (`parentId`) are stacked, wrapped or placed on a grid, with\n * hug / fill / fixed sizing, min / max, padding, alignment and constraints.\n *\n * Pass every `onNodesChange` batch through `noteChanges` before applying it\n * (`onNodesChange={(c) => setNodes((n) => applyNodeChanges(autoLayout.noteChanges(c), n))}`):\n * after the nodes update the hook relayouts frames whose children were measured, resized,\n * added or removed, and turns drags of a flow child inside its frame into a reorder (one\n * undoable step). Render `guides` (the drop marker) with `<CanvasGuidesLayer>`.\n */\nexport function useCanvasAutoLayout<TNode extends CanvasNode = CanvasNode>(options: UseCanvasAutoLayoutOptions<TNode>) {\n\tconst [guides, setGuides] = useState<GuideLine[]>([]);\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasAutoLayoutController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive actions (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tget enabled() {\n\t\t\t\t\treturn optionsRef.current.enabled;\n\t\t\t\t},\n\t\t\t\tget dragReorder() {\n\t\t\t\t\treturn optionsRef.current.dragReorder;\n\t\t\t\t},\n\t\t\t\tget measure() {\n\t\t\t\t\treturn optionsRef.current.measure;\n\t\t\t\t},\n\t\t\t\tget rectOptions() {\n\t\t\t\t\treturn optionsRef.current.rectOptions;\n\t\t\t\t},\n\t\t\t\tonGuidesChange: setGuides\n\t\t\t}),\n\t\t[]\n\t);\n\n\t// Noted changes are applied once React has committed the new nodes.\n\tuseLayoutEffect(() => {\n\t\tif (controller.hasPending) controller.flush();\n\t}, [options.nodes, controller]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\t...controller,\n\t\t\t/** Drop marker of the active reorder drag (flow coordinates). */\n\t\t\tguides,\n\t\t\tget hasPending() {\n\t\t\t\treturn controller.hasPending;\n\t\t\t}\n\t\t}),\n\t\t[controller, guides]\n\t);\n}\n\nexport type CanvasAutoLayout = ReturnType<typeof useCanvasAutoLayout>;\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';\nimport {\n bindCanvasToken,\n detachTokenBindings,\n getEffectiveTokenModes,\n resolveCanvasTokens,\n setCanvasTokenMode,\n type CanvasNode,\n type CanvasTokenOptions,\n} from '@pixerate/editor/canvas';\nimport type { TokenModeContext, TokenState, TokenStore } from '@pixerate/editor/tokens';\n\nexport interface UseCanvasTokensOptions<TNode extends CanvasNode> extends Omit<CanvasTokenOptions, 'modes'> {\n store: TokenStore;\n nodes: TNode[];\n setNodes: (update: TNode[] | ((nodes: TNode[]) => TNode[])) => void;\n /** Modes for nodes without an explicit mode up their tree (e.g. the page's). */\n modes?: TokenModeContext;\n}\n\nexport interface CanvasTokens {\n state: TokenState;\n /** Binds (or with `null` unbinds) a property of the nodes; throws `TokenError` when refused. */\n bind: (ids: Iterable<string>, propertyKey: string, variableId: string | null) => void;\n /** Sets (or with `null` clears) an explicit mode on frames / groups; descendants follow. */\n setMode: (ids: Iterable<string>, collectionId: string, modeId: string | null) => void;\n /** The modes a node is in (its own, inherited, then the root `modes`). */\n modesOf: (nodeId: string) => Record<string, string>;\n}\n\n/**\n * Keeps token-bound node properties resolved: whenever the token store, the nodes or the root\n * modes change, bound values are written into the nodes (only when something changed, so it\n * does not loop). Deleting a variable detaches the nodes bound to it, keeping their values.\n */\nexport function useCanvasTokens<TNode extends CanvasNode>(options: UseCanvasTokensOptions<TNode>): CanvasTokens {\n const { store, nodes, setNodes, modes, properties } = options;\n const state = useSyncExternalStore(store.subscribe, store.getState, store.getState);\n const latest = useRef({ nodes, setNodes, modes, properties });\n latest.current = { nodes, setNodes, modes, properties };\n const opts = (): CanvasTokenOptions => ({ modes: latest.current.modes, properties: latest.current.properties });\n\n useEffect(\n () =>\n store.subscribe((event) => {\n if (event.deletedVariableIds.length === 0) return;\n latest.current.setNodes((prev) => detachTokenBindings(prev, event.previous, event.deletedVariableIds, opts()));\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n\n const modesKey = JSON.stringify(modes ?? {});\n useEffect(() => {\n const next = resolveCanvasTokens(nodes, state, opts());\n if (next !== nodes) setNodes(next);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nodes, state, modesKey, properties]);\n\n const bind = useCallback(\n (ids: Iterable<string>, propertyKey: string, variableId: string | null) => {\n const next = bindCanvasToken(latest.current.nodes, ids, propertyKey, variableId, store.getState(), opts());\n if (next !== latest.current.nodes) latest.current.setNodes(next);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n const setMode = useCallback(\n (ids: Iterable<string>, collectionId: string, modeId: string | null) => {\n const next = setCanvasTokenMode(latest.current.nodes, ids, collectionId, modeId, store.getState(), opts());\n if (next !== latest.current.nodes) latest.current.setNodes(next);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n const modesOf = useCallback(\n (nodeId: string) => {\n const node = latest.current.nodes.find((n) => n.id === nodeId);\n return node ? getEffectiveTokenModes(node, latest.current.nodes, store.getState(), opts()) : {};\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n return { state, bind, setMode, modesOf };\n}\n","import React from 'react';\nimport {\n bindCanvasToken,\n getBindableTokenProperties,\n getEffectiveTokenModes,\n getNodeTokenBindings,\n getNodeTokenModes,\n setCanvasTokenMode,\n getTokensForProperty,\n type CanvasNode,\n type CanvasTokenOptions,\n} from '@pixerate/editor/canvas';\nimport { getCurrentMode, resolveToken, type TokenState } from '@pixerate/editor/tokens';\n\nexport interface TokenBindingPickerProps<TNode extends CanvasNode = CanvasNode> {\n state: TokenState;\n nodes: TNode[];\n /** Nodes to bind (the first one decides which properties are listed). */\n selectedIds: readonly string[];\n /** Receives the nodes with the binding applied and resolved. */\n onChange: (nodes: TNode[]) => void;\n options?: CanvasTokenOptions;\n /** Limit to these property keys (in this order). */\n properties?: readonly string[];\n onError?: (error: Error) => void;\n className?: string;\n}\n\n/**\n * Inspector rows that bind node properties (fill, stroke, opacity, radius, gap, padding, text\n * colour / size, …) to variables of the right type and scope, showing each resolved value.\n */\nexport function TokenBindingPicker<TNode extends CanvasNode = CanvasNode>({\n state,\n nodes,\n selectedIds,\n onChange,\n options = {},\n properties,\n onError,\n className = '',\n}: TokenBindingPickerProps<TNode>) {\n const selected = nodes.filter((n) => selectedIds.includes(n.id));\n const first = selected[0];\n if (!first) return null;\n let rows = getBindableTokenProperties(first, options);\n if (properties) rows = properties.map((key) => rows.find((p) => p.key === key)).filter((p): p is (typeof rows)[number] => !!p);\n const modes = getEffectiveTokenModes(first, nodes, state, options);\n\n return (\n <div data-token-binding-picker=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`}>\n {rows.map((property) => {\n const ids = new Set(selected.map((n) => getNodeTokenBindings(n)[property.key] ?? ''));\n const value = ids.size === 1 ? [...ids][0] : '__mixed';\n const candidates = getTokensForProperty(state, property, first);\n const resolved = value && value !== '__mixed' ? resolveToken(state, value, modes) : null;\n return (\n <label key={property.key} className=\"flex items-center gap-2\" data-token-property={property.key}>\n <span className=\"w-28 shrink-0 text-muted-foreground\">{property.label}</span>\n <select\n aria-label={`${property.label} variable`}\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={value}\n onChange={(e) => {\n const id = e.currentTarget.value || null;\n try {\n onChange(bindCanvasToken(nodes, selectedIds, property.key, id, state, options));\n } catch (error) {\n onError?.(error as Error);\n }\n }}\n >\n {value === '__mixed' ? <option value=\"__mixed\">Mixed</option> : null}\n <option value=\"\">None</option>\n {candidates.map((v) => {\n const collection = state.collections.find((c) => c.id === v.collectionId);\n return (\n <option key={v.id} value={v.id}>\n {v.name}\n {collection && state.collections.length > 1 ? ` (${collection.name})` : ''}\n </option>\n );\n })}\n </select>\n <span className=\"w-16 shrink-0 truncate text-right text-muted-foreground\" data-token-resolved=\"\">\n {resolved?.ok ? (\n property.type === 'color' ? (\n <span\n className=\"inline-block h-3 w-3 rounded border border-border align-middle\"\n style={{ background: String(resolved.value) }}\n title={String(resolved.value)}\n />\n ) : (\n String(resolved.value)\n )\n ) : resolved ? (\n <span title={resolved.message}>⚠</span>\n ) : null}\n </span>\n </label>\n );\n })}\n {state.collections.length === 0 ? <p className=\"text-muted-foreground\">No variables yet.</p> : null}\n </div>\n );\n}\n\nexport interface TokenModeSwitcherProps<TNode extends CanvasNode = CanvasNode> {\n state: TokenState;\n nodes: TNode[];\n /** Frames / groups whose explicit mode is set (the first one's choice is shown). */\n nodeIds: readonly string[];\n onChange: (nodes: TNode[]) => void;\n options?: CanvasTokenOptions;\n /** Show collections with a single mode too (default `false`). */\n showSingleMode?: boolean;\n className?: string;\n}\n\n/**\n * Per-collection mode pickers for the selected frames: \"Auto\" (inherit from the parent, then\n * the root modes, then the default mode) or an explicit mode that descendants inherit.\n */\nexport function TokenModeSwitcher<TNode extends CanvasNode = CanvasNode>({\n state,\n nodes,\n nodeIds,\n onChange,\n options = {},\n showSingleMode = false,\n className = '',\n}: TokenModeSwitcherProps<TNode>) {\n const first = nodes.find((n) => nodeIds.includes(n.id));\n if (!first) return null;\n const own = getNodeTokenModes(first);\n const parent = first.parentId ? nodes.find((n) => n.id === first.parentId) : undefined;\n const inherited = parent ? getEffectiveTokenModes(parent, nodes, state, options) : { ...options.modes };\n const collections = state.collections.filter((c) => showSingleMode || c.modes.length > 1);\n return (\n <div data-token-mode-switcher=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`}>\n {collections.map((collection) => {\n const auto = getCurrentMode(collection, inherited);\n const explicit = collection.modes.some((m) => m.id === own[collection.id]) ? own[collection.id] : '';\n return (\n <label key={collection.id} className=\"flex items-center gap-2\" data-token-collection={collection.id}>\n <span className=\"w-28 shrink-0 truncate text-muted-foreground\">{collection.name}</span>\n <select\n aria-label={`${collection.name} mode`}\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={explicit}\n onChange={(e) =>\n onChange(setCanvasTokenMode(nodes, nodeIds, collection.id, e.currentTarget.value || null, state, options))\n }\n >\n <option value=\"\">Auto ({auto.name})</option>\n {collection.modes.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n </label>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n\tcreateCanvasAnimationController,\n\ttype AnimatableProperty,\n\ttype AnimationHistoryTarget,\n\ttype AnimationLoopMode,\n\ttype CanvasNode,\n\ttype Clock\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasAnimationOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** When set, keyframe edits are undoable steps. */\n\thistory?: AnimationHistoryTarget;\n\t/** Ids acted on without explicit ids (default: nodes with `selected: true`). */\n\tgetSelectedIds?: () => string[];\n\t/** Playback time source (default `realClock`); pass a `ManualClock` for tests or rendering. Read once. */\n\tclock?: Clock;\n\t/** Fixed timeline length (ms); omitted = the last keyframe, at least `minDuration`. Read once. */\n\tduration?: number;\n\tminDuration?: number;\n\tloop?: AnimationLoopMode;\n\tplaybackRate?: number;\n\tfps?: number;\n\trecording?: boolean;\n\tproperties?: readonly AnimatableProperty[];\n\tonTime?: (time: number) => void;\n}\n\n/**\n * React hook for keyframe animation on the canvas: a playhead player (play / pause / seek /\n * scrub, loop, ping-pong, rate), record mode, undoable keyframe edits, multi-keyframe drags\n * with snapping, copy / paste and CSS / Web Animations export.\n *\n * Render `displayNodes` (the nodes evaluated at the playhead) in React Flow and pass its edits\n * back through `applyDisplayChanges`:\n * `onNodesChange={(c) => animation.applyDisplayChanges(applyNodeChanges(c, animation.displayNodes))}`.\n * Animated properties are then keyed at the playhead instead of being overwritten.\n */\nexport function useCanvasAnimation<TNode extends CanvasNode = CanvasNode>(options: UseCanvasAnimationOptions<TNode>) {\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasAnimationController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive edits (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tget getSelectedIds() {\n\t\t\t\t\treturn optionsRef.current.getSelectedIds;\n\t\t\t\t},\n\t\t\t\tget properties() {\n\t\t\t\t\treturn optionsRef.current.properties;\n\t\t\t\t},\n\t\t\t\tclock: options.clock,\n\t\t\t\tduration: options.duration,\n\t\t\t\tminDuration: options.minDuration,\n\t\t\t\tloop: options.loop,\n\t\t\t\tplaybackRate: options.playbackRate,\n\t\t\t\tfps: options.fps,\n\t\t\t\trecording: options.recording,\n\t\t\t\tonTime: (time) => optionsRef.current.onTime?.(time)\n\t\t\t}),\n\t\t[]\n\t);\n\n\tuseEffect(() => () => controller.destroy(), [controller]);\n\n\t// Option changes after mount.\n\tuseEffect(() => {\n\t\tif (options.loop !== undefined) controller.setLoop(options.loop);\n\t}, [controller, options.loop]);\n\tuseEffect(() => {\n\t\tif (options.playbackRate !== undefined) controller.setPlaybackRate(options.playbackRate);\n\t}, [controller, options.playbackRate]);\n\tuseEffect(() => {\n\t\tif (options.recording !== undefined) controller.setRecording(options.recording);\n\t}, [controller, options.recording]);\n\n\tconst state = useSyncExternalStore(\n\t\t(listener) => controller.subscribe(listener),\n\t\t() => controller.getState(),\n\t\t() => controller.getState()\n\t);\n\n\t// The automatic duration follows the nodes.\n\tuseEffect(() => {\n\t\tcontroller.refresh();\n\t}, [controller, options.nodes]);\n\n\tconst displayNodes = useMemo(() => controller.display(options.nodes), [controller, options.nodes, state.time]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\t...controller,\n\t\t\tstate,\n\t\t\ttime: state.time,\n\t\t\tplaying: state.playing,\n\t\t\trecording: state.recording,\n\t\t\tduration: state.duration,\n\t\t\tselection: state.selection,\n\t\t\tdrag: state.drag,\n\t\t\t/** The nodes evaluated at the playhead; render these. */\n\t\t\tdisplayNodes,\n\t\t\tget clipboard() {\n\t\t\t\treturn controller.clipboard;\n\t\t\t}\n\t\t}),\n\t\t[controller, state, displayNodes]\n\t);\n}\n\nexport type CanvasAnimation<TNode extends CanvasNode = CanvasNode> = ReturnType<typeof useCanvasAnimation<TNode>>;\n","import React, { useEffect, useRef } from 'react';\nimport {\n\tANIMATION_EASING_LABELS,\n\tANIMATION_EASING_PRESETS,\n\tformatAnimationTime,\n\tgetTimelineTicks,\n\ttimeToX,\n\txToTime,\n\ttype AnimationLoopMode,\n\ttype CanvasNode,\n\ttype KeyframeRef\n} from '@pixerate/editor/canvas';\nimport type { CanvasAnimation } from './useCanvasAnimation.js';\n\nexport interface AnimationTimelineProps {\n\t/** The `useCanvasAnimation` result. */\n\tanimation: CanvasAnimation<any>;\n\t/** Nodes whose tracks are listed (default: the selected nodes). */\n\tnodeIds?: readonly string[];\n\t/** Width of the keyframe lanes in px (default 360). */\n\twidth?: number;\n\t/** Snap distance in screen px while dragging keyframes (default 8; hold Alt to turn snapping off). */\n\tsnapThreshold?: number;\n\tlabelOf?: (node: CanvasNode) => string;\n\tclassName?: string;\n}\n\nconst LOOP_LABELS: Record<AnimationLoopMode, string> = { none: 'Once', loop: 'Loop', 'ping-pong': 'Ping-pong' };\nconst easingValue = (easing: unknown) => (typeof easing === 'string' ? easing : easing ? 'custom' : 'linear');\n\n/**\n * Compact timeline: play / pause, record toggle, playhead ruler (drag to scrub), one lane per\n * animated property of the selected nodes with draggable keyframe diamonds (snapping to other\n * keys, the playhead and frames; Shift-click adds to the selection, Escape cancels a drag,\n * Delete removes), an easing picker for the selected keyframes and the loop mode.\n */\nexport function AnimationTimeline({ animation, nodeIds, width = 360, snapThreshold = 8, labelOf, className = '' }: AnimationTimelineProps) {\n\tconst { state } = animation;\n\tconst duration = state.duration;\n\tconst rows = animation.timelineRows(nodeIds ?? undefined, labelOf ? { labelOf } : {});\n\tconst ticks = getTimelineTicks(duration, width);\n\tconst selectedEasing = (() => {\n\t\tconst first = state.selection[0];\n\t\tif (!first) return '';\n\t\tfor (const row of rows) for (const k of row.keyframes) if (k.selected && k.ref.property === first.property && k.ref.nodeId === first.nodeId) return easingValue(k.easing);\n\t\treturn '';\n\t})();\n\tconst dragRef = useRef<{ startX: number } | null>(null);\n\n\tuseEffect(() => {\n\t\tconst onKey = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape' && dragRef.current) {\n\t\t\t\tdragRef.current = null;\n\t\t\t\tanimation.cancelKeyframeDrag();\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('keydown', onKey);\n\t\treturn () => window.removeEventListener('keydown', onKey);\n\t}, [animation]);\n\n\tconst onRulerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n\t\tconst lane = event.currentTarget;\n\t\tconst left = lane.getBoundingClientRect().left;\n\t\tanimation.scrub(xToTime(event.clientX - left, duration, width));\n\t\tconst move = (e: PointerEvent) => animation.scrub(xToTime(e.clientX - left, duration, width));\n\t\tconst up = () => {\n\t\t\twindow.removeEventListener('pointermove', move);\n\t\t\twindow.removeEventListener('pointerup', up);\n\t\t\tanimation.endScrub();\n\t\t};\n\t\twindow.addEventListener('pointermove', move);\n\t\twindow.addEventListener('pointerup', up);\n\t};\n\n\tconst onKeyDown = (ref: KeyframeRef) => (event: React.PointerEvent<HTMLButtonElement>) => {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tif (event.shiftKey || event.metaKey || event.ctrlKey) {\n\t\t\tanimation.selectKeyframes([ref], 'toggle');\n\t\t\treturn;\n\t\t}\n\t\tanimation.beginKeyframeDrag([ref]);\n\t\tdragRef.current = { startX: event.clientX };\n\t\tconst msPerPx = width > 0 ? duration / width : 0;\n\t\tconst move = (e: PointerEvent) => {\n\t\t\tif (!dragRef.current) return;\n\t\t\tanimation.updateKeyframeDrag((e.clientX - dragRef.current.startX) * msPerPx, { snap: !e.altKey, thresholdMs: snapThreshold * msPerPx });\n\t\t};\n\t\tconst up = () => {\n\t\t\twindow.removeEventListener('pointermove', move);\n\t\t\twindow.removeEventListener('pointerup', up);\n\t\t\tif (!dragRef.current) return;\n\t\t\tdragRef.current = null;\n\t\t\tanimation.endKeyframeDrag();\n\t\t};\n\t\twindow.addEventListener('pointermove', move);\n\t\twindow.addEventListener('pointerup', up);\n\t};\n\n\tconst onTimelineKey = (event: React.KeyboardEvent) => {\n\t\tif ((event.key === 'Delete' || event.key === 'Backspace') && state.selection.length > 0) {\n\t\t\tevent.preventDefault();\n\t\t\tanimation.deleteKeyframes();\n\t\t}\n\t};\n\n\tconst btn = 'rounded border border-border px-2 py-0.5 text-xs hover:bg-muted disabled:opacity-50';\n\tconst playheadX = timeToX(state.time, duration, width);\n\tconst labelWidth = 120;\n\n\treturn (\n\t\t<div data-animation-timeline=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`} tabIndex={0} onKeyDown={onTimelineKey}>\n\t\t\t<div className=\"flex flex-wrap items-center gap-2\" role=\"toolbar\" aria-label=\"Animation\">\n\t\t\t\t<button type=\"button\" className={btn} data-action=\"toggle-play\" aria-label={state.playing ? 'Pause' : 'Play'} onClick={() => animation.toggle()}>\n\t\t\t\t\t{state.playing ? '❚❚' : '▶'}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={`${btn} ${state.recording ? 'text-red-500' : ''}`}\n\t\t\t\t\tdata-action=\"record\"\n\t\t\t\t\taria-pressed={state.recording}\n\t\t\t\t\taria-label=\"Record keyframes\"\n\t\t\t\t\tonClick={() => animation.toggleRecording()}\n\t\t\t\t>\n\t\t\t\t\t● Rec\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" className={btn} data-action=\"add-keyframe\" onClick={() => animation.addKeyframe()}>\n\t\t\t\t\t◆ Key\n\t\t\t\t</button>\n\t\t\t\t<span data-time=\"\" className=\"tabular-nums text-muted-foreground\">\n\t\t\t\t\t{formatAnimationTime(state.time)} / {formatAnimationTime(duration)}\n\t\t\t\t</span>\n\t\t\t\t<select\n\t\t\t\t\taria-label=\"Easing\"\n\t\t\t\t\tdata-easing-picker=\"\"\n\t\t\t\t\tclassName=\"rounded border border-border bg-background px-1 py-0.5\"\n\t\t\t\t\tvalue={selectedEasing}\n\t\t\t\t\tdisabled={state.selection.length === 0}\n\t\t\t\t\tonChange={(e) => e.target.value && e.target.value !== 'custom' && animation.setEasing(e.target.value)}\n\t\t\t\t>\n\t\t\t\t\t<option value=\"\">Easing…</option>\n\t\t\t\t\t{ANIMATION_EASING_PRESETS.map((preset) => (\n\t\t\t\t\t\t<option key={preset} value={preset}>\n\t\t\t\t\t\t\t{ANIMATION_EASING_LABELS[preset]}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t\t{selectedEasing === 'custom' ? <option value=\"custom\">Custom</option> : null}\n\t\t\t\t</select>\n\t\t\t\t<select\n\t\t\t\t\taria-label=\"Loop\"\n\t\t\t\t\tdata-loop-picker=\"\"\n\t\t\t\t\tclassName=\"rounded border border-border bg-background px-1 py-0.5\"\n\t\t\t\t\tvalue={state.loop}\n\t\t\t\t\tonChange={(e) => animation.setLoop(e.target.value as AnimationLoopMode)}\n\t\t\t\t>\n\t\t\t\t\t{(Object.keys(LOOP_LABELS) as AnimationLoopMode[]).map((mode) => (\n\t\t\t\t\t\t<option key={mode} value={mode}>\n\t\t\t\t\t\t\t{LOOP_LABELS[mode]}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t\t<div className=\"flex\">\n\t\t\t\t<div style={{ width: labelWidth }} className=\"shrink-0\" />\n\t\t\t\t<div\n\t\t\t\t\tdata-timeline-ruler=\"\"\n\t\t\t\t\tclassName=\"relative h-5 cursor-ew-resize border-b border-border\"\n\t\t\t\t\tstyle={{ width }}\n\t\t\t\t\tonPointerDown={onRulerDown}\n\t\t\t\t>\n\t\t\t\t\t{ticks.map((tick) => (\n\t\t\t\t\t\t<span key={tick.time} className=\"absolute top-0 -translate-x-1/2 text-[10px] text-muted-foreground\" style={{ left: tick.x }}>\n\t\t\t\t\t\t\t{tick.label}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t\t<div data-playhead=\"\" className=\"absolute top-0 h-5 w-px bg-red-500\" style={{ left: playheadX }} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<p className=\"text-muted-foreground\" data-timeline-empty=\"\">\n\t\t\t\t\tSelect an animated node, or press ◆ Key to add a keyframe.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\trows.map((row) => (\n\t\t\t\t\t<div key={row.id} className=\"flex items-center\" data-track={row.id}>\n\t\t\t\t\t\t<label className=\"flex shrink-0 items-center gap-1 truncate pr-2\" style={{ width: labelWidth }} title={`${row.nodeLabel} · ${row.label}`}>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\taria-label={`Enable ${row.label}`}\n\t\t\t\t\t\t\t\tchecked={row.enabled}\n\t\t\t\t\t\t\t\tonChange={(e) => animation.setTrackEnabled(row.nodeId, row.property, e.target.checked)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span className=\"truncate\">{rows.filter((r) => r.nodeId === row.nodeId).length < rows.length ? `${row.nodeLabel} · ` : ''}{row.label}</span>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<div data-lane=\"\" className={`relative h-5 rounded bg-muted/40 ${row.enabled ? '' : 'opacity-50'}`} style={{ width }}>\n\t\t\t\t\t\t\t<div className=\"pointer-events-none absolute top-0 h-5 w-px bg-red-500/60\" style={{ left: playheadX }} />\n\t\t\t\t\t\t\t{state.drag?.target != null ? (\n\t\t\t\t\t\t\t\t<div data-snap-target=\"\" className=\"pointer-events-none absolute top-0 h-5 w-px bg-sky-400\" style={{ left: timeToX(state.drag.target, duration, width) }} />\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{row.keyframes.map((k) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={k.ref.time}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-keyframe={k.ref.time}\n\t\t\t\t\t\t\t\t\taria-pressed={k.selected}\n\t\t\t\t\t\t\t\t\taria-label={`${row.label} keyframe at ${formatAnimationTime(k.ref.time)}`}\n\t\t\t\t\t\t\t\t\ttitle={`${formatAnimationTime(k.time)} · ${String(k.value)}`}\n\t\t\t\t\t\t\t\t\tclassName={`absolute top-1/2 h-2.5 w-2.5 -translate-x-1/2 -translate-y-1/2 rotate-45 border ${\n\t\t\t\t\t\t\t\t\t\tk.selected ? 'border-sky-300 bg-sky-500' : 'border-foreground/60 bg-background'\n\t\t\t\t\t\t\t\t\t} ${k.easing === 'hold' ? 'rounded-none' : 'rounded-[1px]'}`}\n\t\t\t\t\t\t\t\t\tstyle={{ left: timeToX(k.time, duration, width) }}\n\t\t\t\t\t\t\t\t\tonPointerDown={onKeyDown(k.ref)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useLayoutEffect, useMemo, useRef } from 'react';\nimport {\n\tcreateCanvasComponentsController,\n\ttype ArrangeHistoryTarget,\n\ttype CanvasComponentSyncOptions,\n\ttype CanvasNode\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasComponentsOptions<TNode extends CanvasNode = CanvasNode> extends CanvasComponentSyncOptions {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** When set, every component action is one undoable step. */\n\thistory?: ArrangeHistoryTarget;\n\t/** The selection (default: nodes with `selected`). */\n\tgetSelectedIds?: () => string[];\n\t/** Called by `goToMainComponent` with the main (e.g. to pan the viewport to it). */\n\tonReveal?: (node: TNode) => void;\n\t/** Sync instances with their mains after every node change (default `true`). */\n\tautoSync?: boolean;\n}\n\n/**\n * React hook for Figma-style components and instances on a React Flow canvas. After every\n * node change it records edits inside instances as overrides and rebuilds the instances of\n * edited main components (keeping overrides). Its actions (`createComponent`,\n * `createInstance`, `combineAsVariants`, `detachInstance`, `resetOverrides`, `pushOverrides`,\n * `swapInstance`, `setInstanceProperties`, `restoreMainComponent`, …) are undoable steps\n * with a `history`, and each has a `can…` check returning `true` or the reason it can't run.\n */\nexport function useCanvasComponents<TNode extends CanvasNode = CanvasNode>(options: UseCanvasComponentsOptions<TNode>) {\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasComponentsController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive actions (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tget getSelectedIds() {\n\t\t\t\t\treturn optionsRef.current.getSelectedIds;\n\t\t\t\t},\n\t\t\t\tonReveal: (node) => optionsRef.current.onReveal?.(node),\n\t\t\t\tget idGenerator() {\n\t\t\t\t\treturn optionsRef.current.idGenerator;\n\t\t\t\t},\n\t\t\t\tget textTypes() {\n\t\t\t\t\treturn optionsRef.current.textTypes;\n\t\t\t\t},\n\t\t\t\tget layout() {\n\t\t\t\t\treturn optionsRef.current.layout;\n\t\t\t\t},\n\t\t\t\tget tokens() {\n\t\t\t\t\treturn optionsRef.current.tokens;\n\t\t\t\t}\n\t\t\t}),\n\t\t[]\n\t);\n\n\t// Edits are synced once React has committed the new nodes.\n\tuseLayoutEffect(() => {\n\t\tif (optionsRef.current.autoSync !== false) controller.sync();\n\t}, [options.nodes, controller]);\n\n\treturn controller;\n}\n\nexport type CanvasComponents<TNode extends CanvasNode = CanvasNode> = ReturnType<typeof useCanvasComponents<TNode>>;\n","import React, { useState } from 'react';\nimport {\n\tCANVAS_COMPONENT_DRAG_TYPE,\n\tinspectCanvasInstance,\n\tlistCanvasComponents,\n\ttype CanvasComponentsController,\n\ttype CanvasNode\n} from '@pixerate/editor/canvas';\n\n/** The variant-editing actions the components panel runs (a components controller or hook satisfies it). */\nexport type CanvasComponentsPanelActions = Pick<\n\tCanvasComponentsController<any>,\n\t'addVariant' | 'removeVariant' | 'setVariantProperties' | 'renameVariantProperty' | 'renameVariantValue'\n>;\n\nexport interface CanvasComponentsPanelProps<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\t/** Inserts an instance of a component (or a set's default variant); called on click. */\n\tonInsert: (componentId: string) => void;\n\t/**\n\t * Variant editing: with it, sets get \"+ Variant\" and a properties editor (rename properties\n\t * and values inline), and variants a menu (also on right click) to edit, duplicate or remove them.\n\t */\n\tcomponents?: CanvasComponentsPanelActions;\n\t/** Receives refusals (e.g. a duplicate variant combination). */\n\tonError?: (reason: string) => void;\n\t/** Show the search field (default `true`). */\n\tsearch?: boolean;\n\tclassName?: string;\n}\n\ntype Outcome = { ok: boolean; reason?: string } | undefined;\n\n/** A text field that commits on blur / Enter when its value changed (Escape reverts). */\nfunction InlineField({ value, label, onCommit }: { value: string; label: string; onCommit: (next: string) => void }) {\n\treturn (\n\t\t<input\n\t\t\tkey={value}\n\t\t\ttype=\"text\"\n\t\t\taria-label={label}\n\t\t\tdefaultValue={value}\n\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\tonBlur={(e) => {\n\t\t\t\tconst next = e.currentTarget.value.trim();\n\t\t\t\tif (next && next !== value) onCommit(next);\n\t\t\t\telse e.currentTarget.value = value;\n\t\t\t}}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === 'Enter') e.currentTarget.blur();\n\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\te.currentTarget.value = value;\n\t\t\t\t\te.currentTarget.blur();\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t);\n}\n\n/**\n * Components panel: component sets (with their variants) and lone components. Click one to\n * insert an instance, or drag it onto the canvas (the drag carries the id as\n * `CANVAS_COMPONENT_DRAG_TYPE`; read it with `getCanvasComponentDragId`). With `components`,\n * sets and variants can be edited: \"+ Variant\", rename properties / values, edit, duplicate or\n * remove a variant.\n */\nexport function CanvasComponentsPanel<TNode extends CanvasNode = CanvasNode>({\n\tnodes,\n\tonInsert,\n\tcomponents,\n\tonError,\n\tsearch = true,\n\tclassName = ''\n}: CanvasComponentsPanelProps<TNode>) {\n\tconst [query, setQuery] = useState('');\n\tconst [propsOpen, setPropsOpen] = useState<string | null>(null);\n\tconst [menuFor, setMenuFor] = useState<string | null>(null);\n\tconst [editing, setEditing] = useState<string | null>(null);\n\tconst { components: all, sets } = listCanvasComponents(nodes);\n\tconst q = query.trim().toLowerCase();\n\tconst match = (name: string) => !q || name.toLowerCase().includes(q);\n\tconst lone = all.filter((c) => !c.setId && match(c.name));\n\tconst shownSets = sets.filter((s) => match(s.name) || s.variants.some((v) => match(v.name)));\n\tconst report = (result: Outcome) => {\n\t\tif (result && !result.ok && result.reason) onError?.(result.reason);\n\t\treturn !!result?.ok;\n\t};\n\tconst small = 'shrink-0 rounded px-1 text-[10px] text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-40';\n\tconst menuItem = 'rounded px-2 py-0.5 text-left hover:bg-muted disabled:opacity-40';\n\tconst item = (id: string, name: string, count: number, extra: Record<string, string> = {}, onContextMenu?: (e: React.MouseEvent) => void) => (\n\t\t<button\n\t\t\tkey={id}\n\t\t\ttype=\"button\"\n\t\t\tdraggable\n\t\t\tdata-component-id={id}\n\t\t\t{...extra}\n\t\t\tclassName=\"flex w-full min-w-0 items-center justify-between gap-2 rounded px-2 py-1 text-left text-xs hover:bg-muted\"\n\t\t\ttitle={`Insert an instance of ${name}`}\n\t\t\tonClick={() => onInsert(id)}\n\t\t\tonContextMenu={onContextMenu}\n\t\t\tonDragStart={(e) => {\n\t\t\t\te.dataTransfer.setData(CANVAS_COMPONENT_DRAG_TYPE, id);\n\t\t\t\te.dataTransfer.setData('text/plain', name);\n\t\t\t\te.dataTransfer.effectAllowed = 'copy';\n\t\t\t}}\n\t\t>\n\t\t\t<span className=\"truncate\">\n\t\t\t\t<span aria-hidden className=\"mr-1 text-muted-foreground\">\n\t\t\t\t\t◇\n\t\t\t\t</span>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t\t<span className=\"text-[10px] text-muted-foreground\" data-instance-count=\"\">\n\t\t\t\t{count}\n\t\t\t</span>\n\t\t</button>\n\t);\n\treturn (\n\t\t<div data-components-panel=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`}>\n\t\t\t{search ? (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\taria-label=\"Search components\"\n\t\t\t\t\tplaceholder=\"Search components\"\n\t\t\t\t\tclassName=\"rounded border border-border bg-background px-2 py-1 text-xs\"\n\t\t\t\t\tonInput={(e) => setQuery((e.target as HTMLInputElement).value)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t{shownSets.map((set) => (\n\t\t\t\t<div key={set.id} data-component-set={set.id} className=\"flex flex-col\">\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t{item(set.id, set.name, set.variants.reduce((sum, v) => sum + v.instanceCount, 0), { 'data-kind': 'set' })}\n\t\t\t\t\t\t{components ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={small}\n\t\t\t\t\t\t\t\t\tdata-action=\"add-variant\"\n\t\t\t\t\t\t\t\t\taria-label={`Add a variant to ${set.name}`}\n\t\t\t\t\t\t\t\t\ttitle=\"Add a variant (duplicates the default variant)\"\n\t\t\t\t\t\t\t\t\tonClick={() => report(components.addVariant(set.id))}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t+&nbsp;Variant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={small}\n\t\t\t\t\t\t\t\t\tdata-action=\"variant-properties\"\n\t\t\t\t\t\t\t\t\taria-expanded={propsOpen === set.id}\n\t\t\t\t\t\t\t\t\taria-label={`Edit the variant properties of ${set.name}`}\n\t\t\t\t\t\t\t\t\ttitle=\"Rename variant properties and values\"\n\t\t\t\t\t\t\t\t\tonClick={() => setPropsOpen(propsOpen === set.id ? null : set.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t⚙\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t\t{components && propsOpen === set.id ? (\n\t\t\t\t\t\t<div data-variant-properties={set.id} className=\"ml-3 flex flex-col gap-1 border-l border-border py-1 pl-2\">\n\t\t\t\t\t\t\t{set.options.map((option) => (\n\t\t\t\t\t\t\t\t<div key={option.name} data-variant-option={option.name} className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t<InlineField\n\t\t\t\t\t\t\t\t\t\tvalue={option.name}\n\t\t\t\t\t\t\t\t\t\tlabel={`Rename property ${option.name}`}\n\t\t\t\t\t\t\t\t\t\tonCommit={(next) => report(components.renameVariantProperty(option.name, next, set.id))}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<div className=\"ml-2 flex flex-wrap gap-1\">\n\t\t\t\t\t\t\t\t\t\t{option.values.map((value) => (\n\t\t\t\t\t\t\t\t\t\t\t<InlineField\n\t\t\t\t\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\t\t\tlabel={`Rename ${option.name} value ${value}`}\n\t\t\t\t\t\t\t\t\t\t\t\tonCommit={(next) => report(components.renameVariantValue(option.name, value, next, set.id))}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"ml-3 flex flex-col border-l border-border pl-1\">\n\t\t\t\t\t\t{set.variants.map((v) => (\n\t\t\t\t\t\t\t<div key={v.id} data-variant-row={v.id} className=\"flex flex-col\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t{item(\n\t\t\t\t\t\t\t\t\t\tv.id,\n\t\t\t\t\t\t\t\t\t\tv.name,\n\t\t\t\t\t\t\t\t\t\tv.instanceCount,\n\t\t\t\t\t\t\t\t\t\t{ 'data-kind': 'variant' },\n\t\t\t\t\t\t\t\t\t\tcomponents\n\t\t\t\t\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(v.id);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{components ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={small}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"variant-menu\"\n\t\t\t\t\t\t\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t\t\t\t\t\t\t\taria-expanded={menuFor === v.id}\n\t\t\t\t\t\t\t\t\t\t\taria-label={`Variant actions for ${v.name}`}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setMenuFor(menuFor === v.id ? null : v.id)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t⋯\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{components && menuFor === v.id ? (\n\t\t\t\t\t\t\t\t\t<div role=\"menu\" data-variant-menu={v.id} className=\"ml-2 flex flex-col rounded border border-border bg-background p-1 shadow\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={menuItem}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"edit-variant\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetEditing(v.id);\n\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(null);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tEdit values…\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={menuItem}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"duplicate-variant\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(null);\n\t\t\t\t\t\t\t\t\t\t\t\treport(components.addVariant(set.id, { from: v.id }));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tDuplicate\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={menuItem}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"remove-variant\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={set.variants.length < 2}\n\t\t\t\t\t\t\t\t\t\t\ttitle={set.variants.length < 2 ? 'A component set needs at least one variant.' : 'Its instances switch to the closest variant'}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(null);\n\t\t\t\t\t\t\t\t\t\t\t\treport(components.removeVariant(v.id));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tRemove variant\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{components && editing === v.id ? (\n\t\t\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\t\t\tdata-variant-editor={v.id}\n\t\t\t\t\t\t\t\t\t\tclassName=\"ml-2 flex flex-col gap-1 py-1\"\n\t\t\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\tconst values: Record<string, string> = {};\n\t\t\t\t\t\t\t\t\t\t\tfor (const input of e.currentTarget.querySelectorAll<HTMLInputElement>('input[data-variant-value]')) {\n\t\t\t\t\t\t\t\t\t\t\t\tvalues[input.dataset.variantValue!] = input.value;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (report(components.setVariantProperties(values, v.id))) setEditing(null);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{set.options.map((option) => (\n\t\t\t\t\t\t\t\t\t\t\t<label key={option.name} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"w-16 shrink-0 truncate text-muted-foreground\">{option.name}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-variant-value={option.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`${option.name} value`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue={v.variant?.[option.name] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" className=\"rounded border border-border px-2 py-0.5 hover:bg-muted\" data-action=\"save-variant\">\n\t\t\t\t\t\t\t\t\t\t\t\tSave\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" className=\"rounded px-2 py-0.5 hover:bg-muted\" data-action=\"cancel-variant\" onClick={() => setEditing(null)}>\n\t\t\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t\t{lone.map((c) => item(c.id, c.name, c.instanceCount, { 'data-kind': 'component' }))}\n\t\t\t{all.length === 0 ? <p className=\"text-muted-foreground\">No components yet. Select a frame and choose Create Component.</p> : null}\n\t\t</div>\n\t);\n}\n\n/** The actions the instance inspector runs (a components controller or hook satisfies it). */\nexport type CanvasInstanceInspectorActions = Pick<\n\tCanvasComponentsController<any>,\n\t'setInstanceProperties' | 'resetOverrides' | 'detachInstance' | 'goToMainComponent' | 'pushOverrides' | 'restoreMainComponent'\n>;\n\nexport interface CanvasInstanceInspectorProps<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\t/** An instance, or a layer inside one; nothing is shown otherwise. */\n\tnodeId: string | null | undefined;\n\tcomponents: CanvasInstanceInspectorActions;\n\t/** Receives refusals (e.g. a property value that would nest a component in itself). */\n\tonError?: (reason: string) => void;\n\tclassName?: string;\n}\n\n/**\n * Instance inspector: main component (or \"missing main\" with Restore), variant pickers,\n * component property controls, the overrides of its layers (each resettable), and Reset all,\n * Detach, Go to main and Push changes.\n */\nexport function CanvasInstanceInspector<TNode extends CanvasNode = CanvasNode>({\n\tnodes,\n\tnodeId,\n\tcomponents,\n\tonError,\n\tclassName = ''\n}: CanvasInstanceInspectorProps<TNode>) {\n\tconst info = nodeId ? inspectCanvasInstance(nodes, nodeId) : undefined;\n\tif (!info) return null;\n\tconst report = (result: { ok: boolean; reason?: string } | undefined) => {\n\t\tif (result && !result.ok && result.reason) onError?.(result.reason);\n\t};\n\tconst setProp = (name: string, value: unknown) => report(components.setInstanceProperties({ [name]: value }, [info.id]));\n\tconst allComponents = listCanvasComponents(nodes).components;\n\tconst linked = info.status === 'linked';\n\tconst btn = 'rounded border border-border px-2 py-0.5 text-xs hover:bg-muted disabled:opacity-40';\n\treturn (\n\t\t<div data-instance-inspector=\"\" data-instance-id={info.id} className={`flex flex-col gap-2 text-xs text-foreground ${className}`}>\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<span className=\"truncate font-medium\" data-instance-main=\"\">\n\t\t\t\t\t{linked ? info.componentName : 'Main component missing'}\n\t\t\t\t</span>\n\t\t\t\t{info.nested ? <span className=\"text-muted-foreground\">Nested</span> : null}\n\t\t\t</div>\n\t\t\t{info.variantOptions.map((option) => (\n\t\t\t\t<label key={option.name} className=\"flex items-center gap-2\" data-variant-property={option.name}>\n\t\t\t\t\t<span className=\"w-24 shrink-0 truncate text-muted-foreground\">{option.name}</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\taria-label={`${option.name} variant`}\n\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\tvalue={info.variant[option.name] ?? ''}\n\t\t\t\t\t\tonChange={(e) => setProp(option.name, e.currentTarget.value)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{option.values.map((v) => (\n\t\t\t\t\t\t\t<option key={v} value={v}>\n\t\t\t\t\t\t\t\t{v}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t))}\n\t\t\t{info.properties.map((p) => (\n\t\t\t\t<label key={p.name} className=\"flex items-center gap-2\" data-component-property={p.name}>\n\t\t\t\t\t<span className=\"w-24 shrink-0 truncate text-muted-foreground\">{p.name}</span>\n\t\t\t\t\t{p.type === 'boolean' ? (\n\t\t\t\t\t\t<input type=\"checkbox\" aria-label={p.name} checked={p.value === true} onChange={(e) => setProp(p.name, e.currentTarget.checked)} />\n\t\t\t\t\t) : p.type === 'text' ? (\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tkey={String(p.value)}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\taria-label={p.name}\n\t\t\t\t\t\t\tdefaultValue={String(p.value)}\n\t\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\t\tonBlur={(e) => {\n\t\t\t\t\t\t\t\tif (e.currentTarget.value !== p.value) setProp(p.name, e.currentTarget.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter') e.currentTarget.blur();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\taria-label={p.name}\n\t\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\t\tvalue={String(p.value)}\n\t\t\t\t\t\t\tonChange={(e) => setProp(p.name, e.currentTarget.value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{allComponents\n\t\t\t\t\t\t\t\t.filter((c) => !p.preferred?.length || p.preferred.includes(c.id) || c.id === p.value)\n\t\t\t\t\t\t\t\t.map((c) => (\n\t\t\t\t\t\t\t\t\t<option key={c.id} value={c.id}>\n\t\t\t\t\t\t\t\t\t\t{c.name}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t)}\n\t\t\t\t</label>\n\t\t\t))}\n\t\t\t{info.overrides.length ? (\n\t\t\t\t<div className=\"flex flex-col gap-1\" data-instance-overrides=\"\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">Overrides</span>\n\t\t\t\t\t{info.overrides.map((o) => (\n\t\t\t\t\t\t<div key={o.id} className=\"flex flex-wrap items-center gap-1\" data-override-layer={o.id}>\n\t\t\t\t\t\t\t<span className=\"mr-1 truncate\">{o.name}</span>\n\t\t\t\t\t\t\t{o.groups.map((g) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={g}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"rounded bg-muted px-1 text-[10px]\"\n\t\t\t\t\t\t\t\t\tdata-override-group={g}\n\t\t\t\t\t\t\t\t\ttitle={`Reset ${g}`}\n\t\t\t\t\t\t\t\t\tonClick={() => report(components.resetOverrides(o.id, g))}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{g} ×\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{linked ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button type=\"button\" className={btn} data-action=\"reset\" onClick={() => report(components.resetOverrides(info.id))}>\n\t\t\t\t\t\t\tReset all\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" className={btn} data-action=\"go-to-main\" onClick={() => components.goToMainComponent(info.id)}>\n\t\t\t\t\t\t\tGo to main\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={btn}\n\t\t\t\t\t\t\tdata-action=\"push\"\n\t\t\t\t\t\t\tdisabled={info.overrides.length === 0}\n\t\t\t\t\t\t\tonClick={() => report(components.pushOverrides(info.rootId))}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tPush changes\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<button type=\"button\" className={btn} data-action=\"restore\" onClick={() => report(components.restoreMainComponent(info.rootId))}>\n\t\t\t\t\t\tRestore main component\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={btn}\n\t\t\t\t\tdata-action=\"detach\"\n\t\t\t\t\tdisabled={info.nested}\n\t\t\t\t\ttitle={info.nested ? 'Detach the outer instance first' : undefined}\n\t\t\t\t\tonClick={() => report(components.detachInstance([info.id]))}\n\t\t\t\t>\n\t\t\t\t\tDetach\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport {\n\tDiagramController,\n\ttype DiagramActionResult,\n\ttype DiagramControllerOptions,\n\ttype DiagramState,\n\ttype EditOp,\n\ttype MermaidDocument\n} from '@pixerate/editor/diagram';\nimport {\n\tDiagramStream,\n\tblendDiagramLayout,\n\teaseDiagramTween,\n\tmermaidMovesFromCanvas,\n\tmermaidToCanvas,\n\ttype DiagramLayout,\n\ttype DiagramLayoutOptions,\n\ttype MermaidFlowEdge,\n\ttype MermaidFlowNode\n} from '@pixerate/editor/canvas';\n\nexport interface UseMermaidDiagramOptions extends DiagramControllerOptions {\n\t/** Layout spacing and node measuring for new nodes (stored positions always win). */\n\tlayoutOptions?: DiagramLayoutOptions;\n}\n\ntype Placed = { id: string; position: { x: number; y: number }; parentId?: string };\n\nexport interface UseMermaidDiagramResult {\n\tcontroller: DiagramController;\n\tstate: DiagramState;\n\tdocument: MermaidDocument;\n\t/** The Mermaid text (with the `%% @pixerate` layout comment). */\n\tsource: string;\n\t/** Canvas nodes (groups first, children relative to their group) and edges. */\n\tnodes: MermaidFlowNode[];\n\tedges: MermaidFlowEdge[];\n\tlayout: DiagramLayout;\n\tapply: (ops: EditOp | EditOp[], label?: string) => DiagramActionResult;\n\t/** Replaces the source; `clearHistory` when opening a different diagram. */\n\tload: (source: string, options?: { clearHistory?: boolean }) => DiagramActionResult;\n\t/** Stores where dragged nodes ended up (pass every canvas node as `all` so groups carry their contents). */\n\tmoveNodes: (moved: readonly Placed[], all?: readonly Placed[]) => DiagramActionResult | null;\n\tconnect: (source: string, target: string, label?: string) => DiagramActionResult;\n\t/** Removes nodes / groups (with their edges) and edges by id, as one undo step. */\n\tremove: (ids: readonly string[]) => DiagramActionResult;\n\trename: (id: string, label: string) => DiagramActionResult;\n\tselect: (ids: readonly string[]) => void;\n\tundo: () => void;\n\tredo: () => void;\n}\n\n/** The controller's state (re-renders on every change). */\nexport function useDiagramState(controller: DiagramController): DiagramState {\n\treturn useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);\n}\n\n/**\n * A Mermaid diagram on a React Flow canvas: subscribes to a `DiagramController` (or creates\n * one from options), lays it out and returns canvas nodes and edges with bound edits. Every\n * edit rewrites only the statements it touches; positions go into `%% @pixerate`.\n */\nexport function useMermaidDiagram(controllerOrOptions: DiagramController | UseMermaidDiagramOptions = {}): UseMermaidDiagramResult {\n\tconst own = useRef<DiagramController | null>(null);\n\tlet controller: DiagramController;\n\tif (controllerOrOptions instanceof DiagramController) controller = controllerOrOptions;\n\telse {\n\t\tif (!own.current) own.current = new DiagramController(controllerOrOptions);\n\t\tcontroller = own.current;\n\t}\n\tconst layoutOptions = controllerOrOptions instanceof DiagramController ? undefined : controllerOrOptions.layoutOptions;\n\tconst state = useDiagramState(controller);\n\tconst canvas = useMemo(\n\t\t() => mermaidToCanvas(state.document, { ...layoutOptions, editable: state.editable }),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[state.document, state.editable]\n\t);\n\tconst layoutRef = useRef(canvas.layout);\n\tlayoutRef.current = canvas.layout;\n\n\tconst actions = useMemo(\n\t\t() => ({\n\t\t\tapply: (ops: EditOp | EditOp[], label?: string) => controller.apply(ops, label),\n\t\t\tload: (source: string, options?: { clearHistory?: boolean }) => controller.load(source, options),\n\t\t\tmoveNodes: (moved: readonly Placed[], all: readonly Placed[] = moved) => {\n\t\t\t\tconst op = mermaidMovesFromCanvas(layoutRef.current, moved, all, { stored: controller.getDocument().meta.layout ?? {} });\n\t\t\t\treturn op ? controller.apply(op, 'Move') : null;\n\t\t\t},\n\t\t\tconnect: (source: string, target: string, label?: string) =>\n\t\t\t\tcontroller.apply({ type: 'addEdge', edge: { source, target, ...(label ? { label } : {}) } }, 'Connect'),\n\t\t\tremove: (ids: readonly string[]) => {\n\t\t\t\tconst graph = controller.getDocument().graph;\n\t\t\t\tconst edgeIds = new Set(graph.edges.map((e) => e.id));\n\t\t\t\tconst edges = ids.filter((id) => edgeIds.has(id));\n\t\t\t\tconst nodes = ids.filter((id) => !edgeIds.has(id));\n\t\t\t\tconst ops: EditOp[] = [];\n\t\t\t\tif (edges.length) ops.push({ type: 'removeEdges', ids: edges });\n\t\t\t\tif (nodes.length) ops.push({ type: 'removeNodes', ids: nodes });\n\t\t\t\treturn controller.apply(ops, 'Delete');\n\t\t\t},\n\t\t\trename: (id: string, label: string) =>\n\t\t\t\tcontroller.apply(\n\t\t\t\t\tcontroller.getDocument().graph.groups.some((g) => g.id === id) ? { type: 'renameGroup', id, label } : { type: 'renameNode', id, label },\n\t\t\t\t\t'Rename'\n\t\t\t\t),\n\t\t\tselect: (ids: readonly string[]) => controller.select(ids),\n\t\t\tundo: () => void controller.undo(),\n\t\t\tredo: () => void controller.redo()\n\t\t}),\n\t\t[controller]\n\t);\n\treturn { controller, state, document: state.document, source: state.source, ...canvas, ...actions };\n}\n\nexport interface UseMermaidStreamOptions extends DiagramLayoutOptions {\n\t/** True once the whole source has arrived (unconnected nodes are shown then). */\n\tcomplete?: boolean;\n\t/** Glide duration between layouts in ms (default 300; 0 jumps). */\n\tduration?: number;\n}\n\nexport interface UseMermaidStreamResult {\n\tdocument: MermaidDocument | null;\n\tnodes: MermaidFlowNode[];\n\tedges: MermaidFlowEdge[];\n\t/** The layout being shown (mid-glide while `settled` is false). */\n\tlayout: DiagramLayout | null;\n\tsettled: boolean;\n}\n\n/**\n * Draws Mermaid that is still being written (e.g. a model's reply): nodes appear once an\n * edge places them and glide to their new places as the layout grows. Read-only.\n */\nexport function useMermaidStream(source: string, options: UseMermaidStreamOptions = {}): UseMermaidStreamResult {\n\tconst { complete = false, duration = 300, ...layoutOptions } = options;\n\tconst stream = useRef<DiagramStream | null>(null);\n\tif (!stream.current) stream.current = new DiagramStream(layoutOptions);\n\tconst result = useMemo(() => stream.current!.update(source, complete), [source, complete]);\n\tconst [shown, setShown] = useState<{ layout: DiagramLayout | null; settled: boolean }>({ layout: result.layout, settled: true });\n\tconst shownRef = useRef(shown.layout);\n\tshownRef.current = shown.layout;\n\n\tuseEffect(() => {\n\t\tconst target = result.layout;\n\t\tif (!target) return setShown({ layout: null, settled: true });\n\t\tconst from = shownRef.current;\n\t\tif (!from || duration <= 0 || typeof requestAnimationFrame !== 'function') return setShown({ layout: target, settled: true });\n\t\tif (from === target) return;\n\t\tlet frame = 0;\n\t\tconst start = performance.now();\n\t\tconst step = () => {\n\t\t\tconst t = Math.min(1, (performance.now() - start) / duration);\n\t\t\tsetShown({ layout: blendDiagramLayout(from, target, easeDiagramTween(t)), settled: t >= 1 });\n\t\t\tif (t < 1) frame = requestAnimationFrame(step);\n\t\t};\n\t\tframe = requestAnimationFrame(step);\n\t\treturn () => cancelAnimationFrame(frame);\n\t}, [result.layout, duration]);\n\n\tconst doc = result.document.tier === 'editable' ? result.document : null;\n\tconst canvas = useMemo(() => {\n\t\tif (!doc || !shown.layout) return { nodes: [], edges: [] };\n\t\t// Only what has been placed: labels may run ahead of the layout.\n\t\tconst placed = new Set(Object.keys(shown.layout.positions));\n\t\tconst graph = {\n\t\t\t...doc.graph,\n\t\t\tnodes: doc.graph.nodes.filter((n) => placed.has(n.id)),\n\t\t\tgroups: doc.graph.groups.filter((g) => placed.has(g.id)),\n\t\t\tedges: doc.graph.edges.filter((e) => placed.has(e.source) && placed.has(e.target))\n\t\t};\n\t\treturn mermaidToCanvas({ ...doc, graph }, { layout: shown.layout });\n\t}, [doc, shown.layout]);\n\treturn { document: doc, ...canvas, layout: shown.layout, settled: shown.settled };\n}\n\n","import React from 'react';\nimport { MERMAID_SHAPE_PAINT, mermaidLabelLines, mermaidNodeMembers, mermaidNodePaint, mermaidShapePaths } from '@pixerate/editor/canvas';\n\n/** Node data as `mermaidToCanvas` produces it. */\nexport interface MermaidDiagramNodeData {\n\tnode?: { id: string; label: string; shape: string; data?: Record<string, unknown> };\n\tgroup?: { id: string; label: string };\n\tresolvedStyles?: Record<string, string>;\n\t[key: string]: unknown;\n}\n\nexport interface MermaidDiagramNodeProps {\n\tid?: string;\n\tdata: MermaidDiagramNodeData;\n\twidth?: number;\n\theight?: number;\n\tselected?: boolean;\n\tclassName?: string;\n\t/** Rendered over the node, e.g. React Flow `<Handle>`s. */\n\tchildren?: React.ReactNode;\n\t[key: string]: unknown;\n}\n\n/** Mermaid `style` / `classDef` declarations as the CSS the node paints with. */\nexport function mermaidNodeStyle(styles: Record<string, string> = {}, selected = false): React.CSSProperties {\n\tconst paint = mermaidNodePaint(styles, selected);\n\tconst { color, 'stroke-width': strokeWidth, 'stroke-dasharray': strokeDasharray, ...vars } = paint;\n\treturn { ...vars, color, strokeWidth, strokeDasharray } as React.CSSProperties;\n}\n\n/**\n * Headless Mermaid node: draws the node's shape (flowchart, state, class, ER) as SVG with\n * its label, painted from its Mermaid styles. Register it as the `mermaid-node` React Flow\n * node type and pass `<Handle>`s as children.\n */\nexport function MermaidDiagramNode({ data, width = 160, height = 56, selected, className = '', children }: MermaidDiagramNodeProps) {\n\tconst node = data.node;\n\tif (!node) return null;\n\tconst members = mermaidNodeMembers(node.data);\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-diagram-node ${className}`.trim()}\n\t\t\tdata-shape={node.shape}\n\t\t\tdata-selected={selected ? 'true' : undefined}\n\t\t\tstyle={{ position: 'relative', width: '100%', height: '100%', ...mermaidNodeStyle(data.resolvedStyles, selected) }}\n\t\t>\n\t\t\t<svg viewBox={`0 0 ${width} ${height}`} preserveAspectRatio=\"none\" width=\"100%\" height=\"100%\" style={{ position: 'absolute', inset: 0, overflow: 'visible' }} aria-hidden=\"true\">\n\t\t\t\t{mermaidShapePaths(node.shape, width, height).map((path, i) => (\n\t\t\t\t\t<path key={i} d={path.d} style={{ ...MERMAID_SHAPE_PAINT[path.paint], vectorEffect: 'non-scaling-stroke' }} />\n\t\t\t\t))}\n\t\t\t</svg>\n\t\t\t<div\n\t\t\t\tstyle={{ position: 'relative', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: members.length ? 'flex-start' : 'center', height: '100%', padding: '6px 10px', boxSizing: 'border-box', fontSize: 13, lineHeight: 1.3, textAlign: 'center', pointerEvents: 'none' }}\n\t\t\t>\n\t\t\t\t{mermaidLabelLines(node.label).map((line, i) => (\n\t\t\t\t\t<span key={i} style={{ fontWeight: members.length ? 600 : undefined }}>\n\t\t\t\t\t\t{line}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t\t{members.length > 0 && (\n\t\t\t\t\t<div style={{ alignSelf: 'stretch', marginTop: 4, paddingTop: 4, borderTop: '1px solid var(--pixerate-diagram-node-border)', textAlign: 'left', fontSize: 12 }}>\n\t\t\t\t\t\t{members.map((m, i) => (\n\t\t\t\t\t\t\t<div key={i}>{m}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/** Headless Mermaid group (subgraph, composite state, namespace): a titled frame. Register as `mermaid-group`. */\nexport function MermaidDiagramGroup({ data, selected, className = '', children }: MermaidDiagramNodeProps) {\n\tconst group = data.group;\n\tif (!group) return null;\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-diagram-group ${className}`.trim()}\n\t\t\tdata-selected={selected ? 'true' : undefined}\n\t\t\tstyle={{\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tboxSizing: 'border-box',\n\t\t\t\tborderRadius: 8,\n\t\t\t\tborder: `1px ${selected ? 'solid' : 'dashed'} ${selected ? 'var(--primary, #2563eb)' : (data.resolvedStyles?.stroke ?? 'var(--border, #cbd5e1)')}`,\n\t\t\t\tbackground: data.resolvedStyles?.fill ?? 'var(--muted, rgba(148, 163, 184, 0.08))',\n\t\t\t\tcolor: data.resolvedStyles?.color ?? 'var(--muted-foreground, #475569)'\n\t\t\t}}\n\t\t>\n\t\t\t<div style={{ padding: '6px 10px', fontSize: 12, fontWeight: 600 }}>{mermaidLabelLines(group.label).join(' ')}</div>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import React, { useMemo } from 'react';\nimport { parseMermaid, type MermaidDocument } from '@pixerate/editor/diagram';\nimport { mermaidThumbnailSvg, type DiagramSvgOptions } from '@pixerate/editor/canvas';\n\nexport interface MermaidThumbnailProps extends DiagramSvgOptions {\n\t/** Mermaid text, or an already parsed document. */\n\tsource: string | MermaidDocument;\n\tclassName?: string;\n\t/** Shown for families that cannot be drawn here (sequence, Gantt, …) and empty diagrams. */\n\tfallback?: React.ReactNode;\n}\n\n/**\n * A static preview of a flowchart, state, class or ER diagram (no canvas, no Mermaid runtime):\n * `mermaidThumbnailSvg` fitted inside `maxWidth` × `maxHeight` (default 240 × 160).\n */\nexport function MermaidThumbnail({ source, className = '', fallback = null, ...options }: MermaidThumbnailProps) {\n\tconst doc = useMemo(() => (typeof source === 'string' ? parseMermaid(source) : source), [source]);\n\tconst key = JSON.stringify(options);\n\tconst drawn = useMemo(\n\t\t() => (doc.tier === 'editable' && doc.graph.nodes.length ? mermaidThumbnailSvg(doc, options) : null),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[doc, key]\n\t);\n\tif (!drawn) return <>{fallback}</>;\n\t// The SVG is built by mermaidToSvg with every label escaped.\n\treturn <span className={`pixerate-diagram-thumbnail ${className}`.trim()} style={{ display: 'inline-block', lineHeight: 0 }} dangerouslySetInnerHTML={{ __html: drawn.svg }} />;\n}\n","import { useRef, useSyncExternalStore } from 'react';\nimport { DiagramDirector, PresenceStore, type DiagramController, type DiagramPlacement, type PresenceClock, type PresenceState } from '@pixerate/editor/diagram';\n\nexport interface UseDiagramDirectorOptions {\n\t/** Where nodes are drawn now, e.g. `() => diagram.layout` from `useMermaidDiagram`. */\n\tplacement: () => DiagramPlacement;\n\t/** 1 = natural speed; 2 = twice as fast. */\n\tspeed?: number;\n\tclock?: PresenceClock;\n\t/** Hide a cursor this long after its last call (ms, default 1500). */\n\tlinger?: number;\n}\n\n/**\n * A `PresenceStore` and `DiagramDirector` for a diagram, created once: pass `director` to\n * `createDiagramToolProvider` so agent edits are acted out by a cursor, and `presence` to\n * `<DiagramPresenceLayer>` to draw it.\n */\nexport function useDiagramDirector(controller: DiagramController, options: UseDiagramDirectorOptions) {\n\tconst placement = useRef(options.placement);\n\tplacement.current = options.placement;\n\tconst ref = useRef<{ presence: PresenceStore; director: DiagramDirector } | null>(null);\n\tif (!ref.current) {\n\t\tconst presence = new PresenceStore();\n\t\tref.current = {\n\t\t\tpresence,\n\t\t\tdirector: new DiagramDirector(controller, presence, { placement: () => placement.current(), speed: options.speed, clock: options.clock, linger: options.linger })\n\t\t};\n\t}\n\treturn ref.current;\n}\n\n/** The presence store's state (re-renders on every cursor move). */\nexport function usePresenceState(presence: PresenceStore): PresenceState {\n\treturn useSyncExternalStore(presence.subscribe, presence.getState, presence.getState);\n}\n","import React from 'react';\nimport type { PresenceStore } from '@pixerate/editor/diagram';\nimport { usePresenceState } from './useDiagramDirector.js';\n\nexport interface DiagramPresenceLayerProps {\n\tpresence: PresenceStore;\n\t/** The canvas viewport (React Flow's `useViewport()`), to place cursors given in canvas coordinates. */\n\tviewport: { x: number; y: number; zoom: number };\n\tclassName?: string;\n}\n\n/** Agent cursors and their notes over a canvas, from a `PresenceStore` (see `DiagramDirector`). */\nexport function DiagramPresenceLayer({ presence, viewport, className = '' }: DiagramPresenceLayerProps) {\n\tconst { actors } = usePresenceState(presence);\n\tif (!actors.length) return null;\n\treturn (\n\t\t<div className={`pixerate-diagram-presence ${className}`.trim()} aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, pointerEvents: 'none', overflow: 'hidden', zIndex: 50 }}>\n\t\t\t{actors.map((a) => (\n\t\t\t\t<div key={a.id} data-actor={a.id} style={{ position: 'absolute', left: 0, top: 0, transform: `translate(${a.x * viewport.zoom + viewport.x}px, ${a.y * viewport.zoom + viewport.y}px)` }}>\n\t\t\t\t\t<svg width=\"18\" height=\"20\" viewBox=\"0 0 12 18\" style={{ display: 'block', transform: a.pressed ? 'scale(0.85)' : undefined, transformOrigin: '0 0' }}>\n\t\t\t\t\t\t<path d=\"M0,0 L0,14 L4,10.5 L7,17 L9.5,16 L6.5,9.5 L11.5,9.5 Z\" style={{ fill: a.color, stroke: '#ffffff', strokeWidth: 1 }} />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<span style={{ position: 'absolute', left: 14, top: 16, whiteSpace: 'nowrap', borderRadius: 4, padding: '1px 6px', fontSize: 11, fontWeight: 600, color: '#ffffff', background: a.color }}>\n\t\t\t\t\t\t{a.message ?? a.name}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["useCallback","useRef","useCallback","useCallback","useEffect","isEventFromTextInput","useCallback","useRef","useCallback","useRef","useEffect","useRef","useState","useMemo","useRef","jsx","jsxs","useEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","jsx","jsxs","DEFAULT_VIEWPORT","useCallback","useEffect","useMemo","useRef","useState","measureSelection","isMeasureModifierHeld","CanvasScenesStore","fitViewportToNodes","matchArrangeShortcut","jsx","jsxs","isShapeDescription","getShapeRenderData","getLayoutedNodes","ensureLayout","centerNodes","getCenteredNodePosition","placeBeside","linearPositionTrajectory","createFanOutTrajectory","runMultiNodeTransition","calculateDirectionalDisplacement","isEventFromTextInput","isValidUrl","serializeCanvasNodes","parseCanvasClipboardData","remapPastedNodes","createCanvasAutoLayoutController","useMemo","useRef","useState","useCallback","useEffect","useRef","useSyncExternalStore","bindCanvasToken","getEffectiveTokenModes","setCanvasTokenMode","jsx","jsxs","bindCanvasToken","setCanvasTokenMode","resolveCanvasTokens","detachTokenBindings","getNodeTokenBindings","getNodeTokenModes","getEffectiveTokenModes","getBindableTokenProperties","getTokensForProperty","useEffect","useMemo","useRef","useSyncExternalStore","useEffect","useRef","jsx","jsxs","createCanvasAnimationController","ANIMATION_EASING_PRESETS","ANIMATION_EASING_LABELS","getTimelineTicks","timeToX","xToTime","formatAnimationTime","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","createCanvasComponentsController","listCanvasComponents","inspectCanvasInstance","CANVAS_COMPONENT_DRAG_TYPE","createCanvasDrawController","strokePointsToPathData","resolveCanvasGradient","gradientToSvgDef","useEffect","useMemo","useRef","useState","useSyncExternalStore","jsx","jsxs","useMemo","Fragment","jsx","useRef","useSyncExternalStore","jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/canvas/AgentPresenceLayer.tsx","../../src/canvas/useStreamingCanvas.ts","../../src/canvas/useCanvasGraph.ts","../../src/canvas/useCanvasLayout.ts","../../src/canvas/useCanvasClipboard.ts","../../src/canvas/useCanvasShortcuts.ts","../../src/canvas/useCanvasDocking.ts","../../src/canvas/useCanvasExplosion.ts","../../src/canvas/useCanvasArrange.ts","../../src/canvas/useCanvasScenes.ts","../../src/canvas/CanvasGuidesLayer.tsx","../../src/canvas/useCanvasDraw.ts","../../src/canvas/CanvasDrawLayer.tsx","../../src/canvas/useCanvasMeasure.ts","../../src/canvas/index.ts","../../src/canvas/ShapeNode.tsx","../../src/canvas/useCanvasAutoLayout.ts","../../src/canvas/useCanvasTokens.ts","../../src/canvas/TokenBindingPicker.tsx","../../src/canvas/useCanvasAnimation.ts","../../src/canvas/AnimationTimeline.tsx","../../src/canvas/useCanvasComponents.ts","../../src/canvas/CanvasComponentsPanel.tsx","../../src/canvas/MermaidFamilyScene.tsx","../../src/canvas/useMermaidDiagram.ts","../../src/canvas/MermaidDiagramNode.tsx","../../src/canvas/MermaidThumbnail.tsx","../../src/canvas/useDiagramDirector.ts","../../src/canvas/DiagramPresenceLayer.tsx"],"sourcesContent":["import React from 'react';\nimport type { AgentPresence } from '@pixerate/editor/agent';\n\nexport interface AgentPresenceLayerProps {\n\tpresences: AgentPresence[];\n\tclassName?: string;\n}\n\n/**\n * Visual multiplayer and agent choreography presence layer for React Canvas.\n * Renders floating cursor indicators, agent name tags, and active status tooltips.\n */\nexport function AgentPresenceLayer({ presences, className = '' }: AgentPresenceLayerProps) {\n\tif (!presences || presences.length === 0) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-presence agent-presence pixerate-agent-presence-layer pointer-events-none absolute inset-0 z-50 overflow-hidden ${className}`}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t{presences.map((agent) => {\n\t\t\t\tif (!agent.cursorPosition) return null;\n\t\t\t\tconst { x, y } = agent.cursorPosition;\n\t\t\t\tconst color = agent.color || '#3b82f6';\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={agent.agentId}\n\t\t\t\t\t\tclassName=\"absolute transition-transform duration-75 ease-out\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: `translate3d(${x}px, ${y}px, 0)`\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Cursor SVG */}\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclassName=\"h-5 w-5 drop-shadow-md\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\td=\"M5.65376 12.3673H5.46026L5.31717 12.4976L0.500002 16.8829L0.500002 1.19841L11.7841 12.3673H5.65376Z\"\n\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\tstroke=\"white\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"1\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\n\t\t\t\t\t\t{/* Agent Label Pill */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"mt-1 flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium text-white shadow-md whitespace-nowrap\"\n\t\t\t\t\t\t\tstyle={{ backgroundColor: color }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span>{agent.name}</span>\n\t\t\t\t\t\t\t{agent.statusMessage && (\n\t\t\t\t\t\t\t\t<span className=\"opacity-80 text-[10px]\">({agent.statusMessage})</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Narration Bubble (say / note) */}\n\t\t\t\t\t\t{agent.note && (\n\t\t\t\t\t\t\t<div className=\"mt-1 max-w-xs rounded-lg bg-white/95 backdrop-blur-sm border border-slate-200 px-2.5 py-1.5 text-xs text-slate-800 shadow-lg dark:bg-slate-900/95 dark:border-slate-700 dark:text-slate-100\">\n\t\t\t\t\t\t\t\t{agent.note}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport {\n\tStreamingLayoutManager,\n\ttype CanvasEdge,\n\ttype CanvasNode,\n\ttype IncrementalLayoutOptions,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseStreamingCanvasOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tthrottleMs?: number;\n\tglideDurationMs?: number;\n\tconnectedOnly?: boolean;\n\tclock?: any;\n\tlayoutOptions?: IncrementalLayoutOptions;\n\tonPositionsChange: (positions: Map<string, XYPosition>) => void;\n}\n\n/**\n * React hook that throttles rapid node/edge streaming additions (e.g. from LLM streams)\n * and glides nodes into position smoothly using physics/tweened trajectories without jarring jumps.\n */\nexport function useStreamingCanvas<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseStreamingCanvasOptions<TNode, TEdge>) {\n\tconst managerRef = useRef<StreamingLayoutManager<TNode, TEdge> | null>(null);\n\n\tuseEffect(() => {\n\t\tconst manager = new StreamingLayoutManager<TNode, TEdge>({\n\t\t\tthrottleMs: options.throttleMs,\n\t\t\tglideDurationMs: options.glideDurationMs,\n\t\t\tconnectedOnly: options.connectedOnly,\n\t\t\tclock: options.clock,\n\t\t\tlayoutOptions: options.layoutOptions,\n\t\t\tonLayoutUpdated: options.onPositionsChange\n\t\t});\n\t\tmanagerRef.current = manager;\n\n\t\treturn () => {\n\t\t\tmanager.destroy();\n\t\t\tmanagerRef.current = null;\n\t\t};\n\t}, [\n\t\toptions.throttleMs,\n\t\toptions.glideDurationMs,\n\t\toptions.connectedOnly,\n\t\toptions.clock,\n\t\toptions.onPositionsChange\n\t]);\n\n\tconst pushStreamUpdate = useCallback(\n\t\t(nodes: TNode[], edges: TEdge[], currentPositions: Map<string, XYPosition>) => {\n\t\t\tmanagerRef.current?.pushStreamUpdate(nodes, edges, currentPositions);\n\t\t},\n\t\t[]\n\t);\n\n\tconst flush = useCallback(\n\t\t(nodes: TNode[], edges: TEdge[], currentPositions: Map<string, XYPosition>) => {\n\t\t\tmanagerRef.current?.flush(nodes, edges, currentPositions);\n\t\t},\n\t\t[]\n\t);\n\n\treturn {\n\t\tpushStreamUpdate,\n\t\tflush\n\t};\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { CanvasNode, CanvasEdge, GraphDifferences } from '@pixerate/editor/canvas';\n\nexport interface UseCanvasGraphOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tinitialNodes?: TNode[];\n\tinitialEdges?: TEdge[];\n\tonNodesChange?: (nodes: TNode[]) => void;\n\tonEdgesChange?: (edges: TEdge[]) => void;\n}\n\n/**\n * React hook managing canvas graph state (nodes, edges, selection, and structural differences).\n */\nexport function useCanvasGraph<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseCanvasGraphOptions<TNode, TEdge> = {}) {\n\tconst [nodes, setNodesState] = useState<TNode[]>(options.initialNodes ?? []);\n\tconst [edges, setEdgesState] = useState<TEdge[]>(options.initialEdges ?? []);\n\n\tconst baselineNodesRef = useRef<TNode[]>(options.initialNodes ?? []);\n\tconst baselineEdgesRef = useRef<TEdge[]>(options.initialEdges ?? []);\n\n\tconst setNodes = useCallback(\n\t\t(updater: TNode[] | ((prev: TNode[]) => TNode[])) => {\n\t\t\tsetNodesState((prev) => {\n\t\t\t\tconst next = typeof updater === 'function' ? updater(prev) : updater;\n\t\t\t\toptions.onNodesChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[options.onNodesChange]\n\t);\n\n\tconst setEdges = useCallback(\n\t\t(updater: TEdge[] | ((prev: TEdge[]) => TEdge[])) => {\n\t\t\tsetEdgesState((prev) => {\n\t\t\t\tconst next = typeof updater === 'function' ? updater(prev) : updater;\n\t\t\t\toptions.onEdgesChange?.(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[options.onEdgesChange]\n\t);\n\n\tconst addNode = useCallback(\n\t\t(node: TNode) => {\n\t\t\tsetNodes((prev) => [...prev, node]);\n\t\t},\n\t\t[setNodes]\n\t);\n\n\tconst removeNodes = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst idSet = new Set(ids);\n\t\t\tsetNodes((prev) => prev.filter((n) => !idSet.has(n.id)));\n\t\t\tsetEdges((prev) => prev.filter((e) => !idSet.has(e.source) && !idSet.has(e.target)));\n\t\t},\n\t\t[setNodes, setEdges]\n\t);\n\n\tconst updateNodeData = useCallback(\n\t\t(id: string, patch: Partial<TNode['data']>) => {\n\t\t\tsetNodes((prev) =>\n\t\t\t\tprev.map((node) => {\n\t\t\t\t\tif (node.id !== id) return node;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...node,\n\t\t\t\t\t\tdata: { ...node.data, ...patch }\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[setNodes]\n\t);\n\n\tconst updateNodePosition = useCallback(\n\t\t(id: string, position: { x: number; y: number }) => {\n\t\t\tsetNodes((prev) =>\n\t\t\t\tprev.map((node) => {\n\t\t\t\t\tif (node.id !== id) return node;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...node,\n\t\t\t\t\t\tposition: { ...position }\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[setNodes]\n\t);\n\n\tconst addEdge = useCallback(\n\t\t(edge: TEdge) => {\n\t\t\tsetEdges((prev) => [...prev, edge]);\n\t\t},\n\t\t[setEdges]\n\t);\n\n\tconst removeEdges = useCallback(\n\t\t(ids: string[]) => {\n\t\t\tconst idSet = new Set(ids);\n\t\t\tsetEdges((prev) => prev.filter((e) => !idSet.has(e.id)));\n\t\t},\n\t\t[setEdges]\n\t);\n\n\tconst resetBaseline = useCallback(() => {\n\t\tbaselineNodesRef.current = nodes;\n\t\tbaselineEdgesRef.current = edges;\n\t}, [nodes, edges]);\n\n\tconst getDifferences = useCallback((): GraphDifferences<TNode, TEdge> => {\n\t\tconst currentNodesMap = new Map(nodes.map((n) => [n.id, n]));\n\t\tconst currentEdgesMap = new Map(edges.map((e) => [e.id, e]));\n\t\tconst baselineNodesMap = new Map(baselineNodesRef.current.map((n) => [n.id, n]));\n\t\tconst baselineEdgesMap = new Map(baselineEdgesRef.current.map((e) => [e.id, e]));\n\n\t\tconst changedNodes: TNode[] = [];\n\t\tconst removedNodes: TNode[] = [];\n\t\tconst changedEdges: TEdge[] = [];\n\t\tconst removedEdges: TEdge[] = [];\n\n\t\tfor (const [id, node] of currentNodesMap) {\n\t\t\tconst base = baselineNodesMap.get(id);\n\t\t\tif (!base || base.position.x !== node.position.x || base.position.y !== node.position.y) {\n\t\t\t\tchangedNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, node] of baselineNodesMap) {\n\t\t\tif (!currentNodesMap.has(id)) {\n\t\t\t\tremovedNodes.push(node);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, edge] of currentEdgesMap) {\n\t\t\tconst base = baselineEdgesMap.get(id);\n\t\t\tif (!base || base.source !== edge.source || base.target !== edge.target) {\n\t\t\t\tchangedEdges.push(edge);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, edge] of baselineEdgesMap) {\n\t\t\tif (!currentEdgesMap.has(id)) {\n\t\t\t\tremovedEdges.push(edge);\n\t\t\t}\n\t\t}\n\n\t\treturn { changedNodes, changedEdges, removedNodes, removedEdges };\n\t}, [nodes, edges]);\n\n\treturn {\n\t\tnodes,\n\t\tedges,\n\t\tsetNodes,\n\t\tsetEdges,\n\t\taddNode,\n\t\tremoveNodes,\n\t\tupdateNodeData,\n\t\tupdateNodePosition,\n\t\taddEdge,\n\t\tremoveEdges,\n\t\tresetBaseline,\n\t\tgetDifferences\n\t};\n}\n","import { useCallback } from 'react';\nimport {\n\tcenterNodes,\n\tensureLayout,\n\tgetCenteredNodePosition,\n\tgetLayoutedNodes,\n\tplaceBeside,\n\ttype CanvasEdge,\n\ttype CanvasLayoutOptions,\n\ttype CanvasNode,\n\ttype IncrementalLayoutOptions,\n\ttype PlaceBesideOptions,\n\ttype Rect,\n\ttype Side,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasLayoutOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tnodes: TNode[];\n\tedges: TEdge[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\tgetNodesBounds?: (nodes: TNode[]) => Rect;\n\tscreenToFlowPosition?: (position: XYPosition) => XYPosition;\n}\n\n/**\n * React hook providing layout automation: Dagre hierarchy, incremental layout blending,\n * collision-aware directional placement, and viewport centering.\n */\nexport function useCanvasLayout<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseCanvasLayoutOptions<TNode, TEdge>) {\n\tconst { nodes, edges, setNodes, getNodesBounds, screenToFlowPosition } = options;\n\n\t/**\n\t * Runs standard hierarchical Dagre layout across all nodes and edges.\n\t */\n\tconst applyLayout = useCallback(\n\t\t(layoutOptions: CanvasLayoutOptions = {}) => {\n\t\t\tconst layouted = getLayoutedNodes(nodes, edges, getNodesBounds, layoutOptions);\n\t\t\tsetNodes(layouted);\n\t\t\treturn layouted;\n\t\t},\n\t\t[nodes, edges, getNodesBounds, setNodes]\n\t);\n\n\t/**\n\t * Incremental layout blending:\n\t * Preserves manual positions of established nodes and positions new/unplaced nodes\n\t * relative to the Dagre layout using mean centroid translation.\n\t */\n\tconst applyIncrementalLayout = useCallback(\n\t\t(incrementalOptions: IncrementalLayoutOptions = {}) => {\n\t\t\tconst storedPositions =\n\t\t\t\tincrementalOptions.storedPositions ??\n\t\t\t\tObject.fromEntries(nodes.map((n) => [n.id, n.position]));\n\n\t\t\tconst blended = ensureLayout(nodes, edges, {\n\t\t\t\t...incrementalOptions,\n\t\t\t\tstoredPositions\n\t\t\t});\n\t\t\tsetNodes(blended);\n\t\t\treturn blended;\n\t\t},\n\t\t[nodes, edges, setNodes]\n\t);\n\n\t/**\n\t * Centers the collective bounding box of nodes within the viewport.\n\t */\n\tconst center = useCallback(\n\t\t(screenDimensions?: { width: number; height: number }) => {\n\t\t\tif (!screenToFlowPosition || !getNodesBounds) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'[useCanvasLayout] Centering requires screenToFlowPosition and getNodesBounds options.'\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst centered = centerNodes(nodes, screenToFlowPosition, getNodesBounds, screenDimensions);\n\t\t\tsetNodes(centered);\n\t\t},\n\t\t[nodes, screenToFlowPosition, getNodesBounds, setNodes]\n\t);\n\n\t/**\n\t * Finds a collision-free position for a new node adjacent to an existing anchor node.\n\t */\n\tconst getPlacementPosition = useCallback(\n\t\t(\n\t\t\tsize: { width: number; height: number },\n\t\t\tside: Side = 'right',\n\t\t\tnearNodeId?: string,\n\t\t\tplacementOptions: PlaceBesideOptions = {}\n\t\t): XYPosition => {\n\t\t\tconst rects: Record<string, Rect> = {};\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst width = node.measured?.width ?? (node as any).width ?? 200;\n\t\t\t\tconst height = node.measured?.height ?? (node as any).height ?? 60;\n\t\t\t\trects[node.id] = {\n\t\t\t\t\tx: node.position.x,\n\t\t\t\t\ty: node.position.y,\n\t\t\t\t\twidth,\n\t\t\t\t\theight\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn placeBeside(rects, size, side, nearNodeId, placementOptions);\n\t\t},\n\t\t[nodes]\n\t);\n\n\treturn {\n\t\tapplyLayout,\n\t\tapplyIncrementalLayout,\n\t\tcenter,\n\t\tgetPlacementPosition,\n\t\tgetCenteredNodePosition\n\t};\n}\n","import { useCallback } from 'react';\nimport {\n\tisEventFromTextInput,\n\tisValidUrl,\n\tparseCanvasClipboardData,\n\tremapPastedNodes,\n\tserializeCanvasNodes,\n\ttype CanvasEdge,\n\ttype CanvasNode,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasClipboardOptions<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tonPasteNodes?: (nodes: TNode[], edges?: TEdge[]) => void | Promise<void>;\n\tonPasteUrl?: (url: string, position?: XYPosition) => void;\n\tonPasteText?: (text: string, position?: XYPosition) => void;\n\tscreenToFlowPosition?: (position: XYPosition) => XYPosition;\n}\n\n/**\n * React hook managing canvas clipboard copy and paste operations.\n */\nexport function useCanvasClipboard<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(options: UseCanvasClipboardOptions<TNode, TEdge> = {}) {\n\tconst copySelectedNodes = useCallback(\n\t\t(\n\t\t\tselectedNodes: TNode[],\n\t\t\tconnectedEdges?: TEdge[],\n\t\t\tevent?: ClipboardEvent | React.ClipboardEvent\n\t\t): boolean => {\n\t\t\tconst native = (event && 'nativeEvent' in event) ? (event as any).nativeEvent : event;\n\t\t\tif (native && isEventFromTextInput(native)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (selectedNodes.length === 0) return false;\n\n\t\t\tconst serialized = serializeCanvasNodes(selectedNodes, connectedEdges);\n\n\t\t\tconst clipboardData = (event as any)?.clipboardData || (native as any)?.clipboardData;\n\t\t\tif (clipboardData) {\n\t\t\t\tclipboardData.setData('application/json', serialized);\n\t\t\t\tclipboardData.setData('text/plain', serialized);\n\t\t\t\t(event as any)?.preventDefault?.();\n\t\t\t} else if (typeof navigator !== 'undefined' && navigator.clipboard) {\n\t\t\t\tnavigator.clipboard.writeText(serialized).catch(() => {});\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\t[]\n\t);\n\n\tconst handlePasteEvent = useCallback(\n\t\tasync (event: ClipboardEvent | React.ClipboardEvent): Promise<boolean> => {\n\t\t\tconst native = ('nativeEvent' in event) ? (event as any).nativeEvent : event;\n\t\t\tif (isEventFromTextInput(native)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst clipboardData = (native as any)?.clipboardData || (event as any)?.clipboardData;\n\t\t\tif (!clipboardData) return false;\n\n\t\t\tconst prevent = () => {\n\t\t\t\t(event as any)?.preventDefault?.();\n\t\t\t\t(native as any)?.preventDefault?.();\n\t\t\t};\n\n\t\t\t// Priority 1: application/json canvas payload\n\t\t\tconst jsonText = clipboardData.getData('application/json');\n\t\t\tif (jsonText) {\n\t\t\t\tconst parsed = parseCanvasClipboardData<TNode, TEdge>(jsonText);\n\t\t\t\tif (parsed && parsed.nodes.length > 0) {\n\t\t\t\t\tprevent();\n\t\t\t\t\tconst remapped = remapPastedNodes(parsed.nodes, parsed.edges);\n\t\t\t\t\tawait options.onPasteNodes?.(remapped.nodes, remapped.edges);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Priority 2: text/plain\n\t\t\tconst text = clipboardData.getData('text/plain')?.trim();\n\t\t\tif (text) {\n\t\t\t\tconst parsed = parseCanvasClipboardData<TNode, TEdge>(text);\n\t\t\t\tif (parsed && parsed.nodes.length > 0) {\n\t\t\t\t\tprevent();\n\t\t\t\t\tconst remapped = remapPastedNodes(parsed.nodes, parsed.edges);\n\t\t\t\t\tawait options.onPasteNodes?.(remapped.nodes, remapped.edges);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif (isValidUrl(text)) {\n\t\t\t\t\tprevent();\n\t\t\t\t\toptions.onPasteUrl?.(text);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif (options.onPasteText) {\n\t\t\t\t\tprevent();\n\t\t\t\t\toptions.onPasteText(text);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\t[options]\n\t);\n\n\treturn {\n\t\tcopySelectedNodes,\n\t\thandlePasteEvent\n\t};\n}\n","import { useEffect } from 'react';\nimport { isEventFromTextInput, type CanvasNode } from '@pixerate/editor/canvas';\n\nexport interface UseCanvasShortcutsOptions<TNode extends CanvasNode = CanvasNode> {\n\ttargetElement?: HTMLElement | Window | null;\n\tenabled?: boolean;\n\tonCopy?: (selectedNodes: TNode[]) => void;\n\tonCut?: (selectedNodes: TNode[]) => void;\n\tonPaste?: (event: ClipboardEvent) => void;\n\tonDelete?: (selectedNodes: TNode[]) => void;\n\tonDuplicate?: (selectedNodes: TNode[]) => void;\n\tonSelectAll?: () => void;\n\tonGroup?: (selectedNodes: TNode[]) => void;\n\tonUngroup?: (selectedNodes: TNode[]) => void;\n\tonZoomIn?: () => void;\n\tonZoomOut?: () => void;\n\tonFitView?: () => void;\n\tgetSelectedNodes?: () => TNode[];\n}\n\n/**\n * React hook registering canvas keyboard shortcuts while rigorously guarding against\n * hijacking typing inside text inputs, textareas, and rich-text ProseMirror elements.\n */\nexport function useCanvasShortcuts<TNode extends CanvasNode = CanvasNode>(\n\toptions: UseCanvasShortcutsOptions<TNode> = {}\n) {\n\tconst {\n\t\ttargetElement,\n\t\tenabled = true,\n\t\tonCopy,\n\t\tonCut,\n\t\tonPaste,\n\t\tonDelete,\n\t\tonDuplicate,\n\t\tonSelectAll,\n\t\tonGroup,\n\t\tonUngroup,\n\t\tonZoomIn,\n\t\tonZoomOut,\n\t\tonFitView,\n\t\tgetSelectedNodes\n\t} = options;\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst target = targetElement ?? (typeof window !== 'undefined' ? window : null);\n\t\tif (!target) return;\n\n\t\tfunction handleKeyDown(event: Event) {\n\t\t\tconst keyboardEvent = event as KeyboardEvent;\n\t\t\tif (isEventFromTextInput(keyboardEvent)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n\t\t\tconst isMod = isMac ? keyboardEvent.metaKey : keyboardEvent.ctrlKey;\n\t\t\tconst key = keyboardEvent.key.toLowerCase();\n\t\t\tconst selectedNodes = getSelectedNodes ? getSelectedNodes() : [];\n\n\t\t\t// Delete / Backspace\n\t\t\tif ((keyboardEvent.key === 'Backspace' || keyboardEvent.key === 'Delete') && !isMod) {\n\t\t\t\tif (selectedNodes.length > 0 && onDelete) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonDelete(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Duplicate: Mod+D\n\t\t\tif (isMod && key === 'd') {\n\t\t\t\tif (selectedNodes.length > 0 && onDuplicate) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonDuplicate(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Select All: Mod+A\n\t\t\tif (isMod && key === 'a' && onSelectAll) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonSelectAll();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Group: Mod+G\n\t\t\tif (isMod && key === 'g' && !keyboardEvent.shiftKey && onGroup) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonGroup(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Ungroup: Mod+Shift+G\n\t\t\tif (isMod && key === 'g' && keyboardEvent.shiftKey && onUngroup) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\tonUngroup(selectedNodes);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Zoom In: Mod + Plus/Equal\n\t\t\tif (isMod && (key === '+' || key === '=') && onZoomIn) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonZoomIn();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Zoom Out: Mod + Minus\n\t\t\tif (isMod && key === '-' && onZoomOut) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonZoomOut();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Fit View: Mod + 0 or Shift + 1\n\t\t\tif (isMod && key === '0' && onFitView) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\tonFitView();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttarget.addEventListener('keydown', handleKeyDown as EventListener);\n\t\treturn () => {\n\t\t\ttarget.removeEventListener('keydown', handleKeyDown as EventListener);\n\t\t};\n\t}, [\n\t\ttargetElement,\n\t\tenabled,\n\t\tonCopy,\n\t\tonCut,\n\t\tonPaste,\n\t\tonDelete,\n\t\tonDuplicate,\n\t\tonSelectAll,\n\t\tonGroup,\n\t\tonUngroup,\n\t\tonZoomIn,\n\t\tonZoomOut,\n\t\tonFitView,\n\t\tgetSelectedNodes\n\t]);\n}\n","import { useCallback, useRef } from 'react';\nimport type {\n\tCanvasDockingCallbacks,\n\tCanvasNode,\n\tDockStrategy,\n\tRect,\n\tXYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasDockingOptions<TNode extends CanvasNode = CanvasNode>\n\textends CanvasDockingCallbacks<TNode> {\n\tstrategy?: DockStrategy;\n\tdockableTypes?: string[];\n\ttargetTypes?: string[];\n}\n\n/**\n * React hook resolving docking targets and intersections when dragging nodes across the canvas.\n */\nexport function useCanvasDocking<TNode extends CanvasNode = CanvasNode>(\n\toptions: UseCanvasDockingOptions<TNode> = {}\n) {\n\tconst {\n\t\tstrategy = 'center-point',\n\t\tdockableTypes,\n\t\ttargetTypes,\n\t\tonDockHover,\n\t\tonDockLeave,\n\t\tonDockDrop\n\t} = options;\n\n\tconst activeDockTargetRef = useRef<TNode | null>(null);\n\n\tconst isDockable = useCallback(\n\t\t(node: TNode): boolean => {\n\t\t\tif (!dockableTypes || dockableTypes.length === 0) return true;\n\t\t\treturn !!node.type && dockableTypes.includes(node.type);\n\t\t},\n\t\t[dockableTypes]\n\t);\n\n\tconst isTarget = useCallback(\n\t\t(node: TNode): boolean => {\n\t\t\tif (!targetTypes || targetTypes.length === 0) return true;\n\t\t\treturn !!node.type && targetTypes.includes(node.type);\n\t\t},\n\t\t[targetTypes]\n\t);\n\n\tconst findDockTarget = useCallback(\n\t\t(\n\t\t\tdraggedNode: TNode,\n\t\t\tcandidates: TNode[],\n\t\t\tcursorPos?: XYPosition\n\t\t): TNode | null => {\n\t\t\tif (!isDockable(draggedNode)) return null;\n\n\t\t\tconst draggedWidth = draggedNode.measured?.width ?? (draggedNode as any).width ?? 200;\n\t\t\tconst draggedHeight = draggedNode.measured?.height ?? (draggedNode as any).height ?? 60;\n\t\t\tconst draggedCenter: XYPosition = {\n\t\t\t\tx: draggedNode.position.x + draggedWidth / 2,\n\t\t\t\ty: draggedNode.position.y + draggedHeight / 2\n\t\t\t};\n\n\t\t\tconst validCandidates = candidates.filter(\n\t\t\t\t(c) => c.id !== draggedNode.id && isTarget(c)\n\t\t\t);\n\n\t\t\tlet bestTarget: TNode | null = null;\n\t\t\tlet maxIntersectionArea = 0;\n\t\t\tlet minDistance = Infinity;\n\n\t\t\tfor (const candidate of validCandidates) {\n\t\t\t\tconst candWidth = candidate.measured?.width ?? (candidate as any).width ?? 200;\n\t\t\t\tconst candHeight = candidate.measured?.height ?? (candidate as any).height ?? 60;\n\n\t\t\t\tconst candRect: Rect = {\n\t\t\t\t\tx: candidate.position.x,\n\t\t\t\t\ty: candidate.position.y,\n\t\t\t\t\twidth: candWidth,\n\t\t\t\t\theight: candHeight\n\t\t\t\t};\n\n\t\t\t\t// Overlap bounds\n\t\t\t\tconst overlapX = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(draggedNode.position.x + draggedWidth, candRect.x + candRect.width) -\n\t\t\t\t\t\tMath.max(draggedNode.position.x, candRect.x)\n\t\t\t\t);\n\t\t\t\tconst overlapY = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(draggedNode.position.y + draggedHeight, candRect.y + candRect.height) -\n\t\t\t\t\t\tMath.max(draggedNode.position.y, candRect.y)\n\t\t\t\t);\n\t\t\t\tconst overlapArea = overlapX * overlapY;\n\n\t\t\t\tif (strategy === 'max-overlap') {\n\t\t\t\t\tif (overlapArea > maxIntersectionArea) {\n\t\t\t\t\t\tmaxIntersectionArea = overlapArea;\n\t\t\t\t\t\tbestTarget = candidate;\n\t\t\t\t\t}\n\t\t\t\t} else if (strategy === 'center-point') {\n\t\t\t\t\tconst candCenter: XYPosition = {\n\t\t\t\t\t\tx: candRect.x + candRect.width / 2,\n\t\t\t\t\t\ty: candRect.y + candRect.height / 2\n\t\t\t\t\t};\n\t\t\t\t\tconst dist = Math.hypot(\n\t\t\t\t\t\tdraggedCenter.x - candCenter.x,\n\t\t\t\t\t\tdraggedCenter.y - candCenter.y\n\t\t\t\t\t);\n\t\t\t\t\tif (overlapArea > 0 && dist < minDistance) {\n\t\t\t\t\t\tminDistance = dist;\n\t\t\t\t\t\tbestTarget = candidate;\n\t\t\t\t\t}\n\t\t\t\t} else if (strategy === 'first') {\n\t\t\t\t\tif (overlapArea > 0) return candidate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn bestTarget;\n\t\t},\n\t\t[isDockable, isTarget, strategy]\n\t);\n\n\tconst updateDragOver = useCallback(\n\t\t(draggedNode: TNode, candidates: TNode[], cursorPos?: XYPosition) => {\n\t\t\tconst target = findDockTarget(draggedNode, candidates, cursorPos);\n\n\t\t\tif (target?.id !== activeDockTargetRef.current?.id) {\n\t\t\t\tif (activeDockTargetRef.current) {\n\t\t\t\t\tonDockLeave?.(activeDockTargetRef.current, draggedNode);\n\t\t\t\t}\n\t\t\t\tactiveDockTargetRef.current = target;\n\t\t\t\tif (target) {\n\t\t\t\t\tonDockHover?.(target, draggedNode);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[findDockTarget, onDockHover, onDockLeave]\n\t);\n\n\tconst finalizeDock = useCallback(\n\t\t(draggedNode: TNode) => {\n\t\t\tif (activeDockTargetRef.current) {\n\t\t\t\tonDockDrop?.(activeDockTargetRef.current, draggedNode);\n\t\t\t\tactiveDockTargetRef.current = null;\n\t\t\t}\n\t\t},\n\t\t[onDockDrop]\n\t);\n\n\treturn {\n\t\tfindDockTarget,\n\t\tupdateDragOver,\n\t\tfinalizeDock,\n\t\tgetActiveDockTarget: () => activeDockTargetRef.current\n\t};\n}\n","import { useCallback, useRef } from 'react';\nimport {\n\tcalculateDirectionalDisplacement,\n\tcreateFanOutTrajectory,\n\tlinearPositionTrajectory,\n\trunMultiNodeTransition,\n\ttype CanvasEdge,\n\ttype CanvasNode,\n\ttype CollapseNodeOptions,\n\ttype ExplodeNodeOptions,\n\ttype ExplosionSnapshot,\n\ttype NodeTransition,\n\ttype XYPosition\n} from '@pixerate/editor/canvas';\n\nexport interface CanvasGraphTarget<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n> {\n\tnodes: TNode[];\n\tedges: TEdge[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\tsetEdges: (updater: TEdge[] | ((prev: TEdge[]) => TEdge[])) => void;\n}\n\n/**\n * Replaces nodes in `base` with the same-id node from `updated` (transition frame copies).\n */\nfunction mergeById<TNode extends CanvasNode>(base: TNode[], updated: TNode[]): TNode[] {\n\tif (updated.length === 0) return [...base];\n\tconst byId = new Map(updated.map((n) => [n.id, n]));\n\treturn base.map((n) => byId.get(n.id) ?? n);\n}\n\n/**\n * React hook managing node explosion and collapse transitions with exact reversibility.\n */\nexport function useCanvasExplosion<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(target: CanvasGraphTarget<TNode, TEdge>) {\n\tconst snapshotsRef = useRef<Map<string, ExplosionSnapshot<TNode, TEdge>>>(new Map());\n\n\tconst explodeNode = useCallback(\n\t\t(parentNodeId: string, options: ExplodeNodeOptions<TNode, TEdge>) => {\n\t\t\tconst { nodes, edges, setNodes, setEdges } = target;\n\t\t\tconst parent = nodes.find((n) => n.id === parentNodeId);\n\t\t\tif (!parent || options.childNodes.length === 0) return;\n\n\t\t\tconst originPos: XYPosition = { ...parent.position };\n\t\t\tconst displacedMap =\n\t\t\t\toptions.displacementStrategy === 'directional'\n\t\t\t\t\t? calculateDirectionalDisplacement({\n\t\t\t\t\t\t\texistingNodes: nodes,\n\t\t\t\t\t\t\toriginNode: parent,\n\t\t\t\t\t\t\tchildNodes: options.childNodes,\n\t\t\t\t\t\t\toptions: options.directionalOptions\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Map<string, XYPosition>();\n\n\t\t\t// Snapshot state for exact collapse\n\t\t\tconst snapshot: ExplosionSnapshot<TNode, TEdge> = {\n\t\t\t\tparentId: parentNodeId,\n\t\t\t\tchildNodeIds: options.childNodes.map((c) => c.id),\n\t\t\t\tchildEdgeIds: (options.childEdges ?? []).map((e) => e.id),\n\t\t\t\tdisplacedNodes: Array.from(displacedMap.entries()).map(([id]) => {\n\t\t\t\t\tconst node = nodes.find((n) => n.id === id)!;\n\t\t\t\t\treturn { id, originalPosition: { ...node.position } };\n\t\t\t\t}),\n\t\t\t\ttimestamp: Date.now()\n\t\t\t};\n\t\t\tsnapshotsRef.current.set(parentNodeId, snapshot);\n\n\t\t\t// Position child nodes initially at parent position for animation\n\t\t\tconst initialChildren = options.childNodes.map((child) => ({\n\t\t\t\t...child,\n\t\t\t\tposition: { ...originPos }\n\t\t\t}));\n\n\t\t\tconst mergedNodes = [...nodes, ...initialChildren];\n\t\t\tsetNodes(mergedNodes);\n\n\t\t\tif (options.childEdges && options.childEdges.length > 0) {\n\t\t\t\tsetEdges((prev) => [...prev, ...(options.childEdges as TEdge[])]);\n\t\t\t}\n\n\t\t\t// Animate child nodes outward & displaced existing nodes\n\t\t\tconst trajectory = options.trajectory ?? createFanOutTrajectory();\n\t\t\tconst transitions: NodeTransition<TNode>[] = [];\n\n\t\t\t// 1. Child nodes fan out\n\t\t\toptions.childNodes.forEach((child, index) => {\n\t\t\t\tconst liveChild = mergedNodes.find((n) => n.id === child.id);\n\t\t\t\tif (liveChild) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode: liveChild,\n\t\t\t\t\t\tfrom: originPos,\n\t\t\t\t\t\tto: child.position,\n\t\t\t\t\t\ttrajectory,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\ttotal: options.childNodes.length,\n\t\t\t\t\t\tduration: options.duration ?? 400,\n\t\t\t\t\t\teasing: options.easing\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// 2. Displaced sibling nodes slide\n\t\t\tdisplacedMap.forEach((targetPos, nodeId) => {\n\t\t\t\tconst node = mergedNodes.find((n) => n.id === nodeId);\n\t\t\t\tif (node) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom: { ...node.position },\n\t\t\t\t\t\tto: targetPos,\n\t\t\t\t\t\ttrajectory: linearPositionTrajectory,\n\t\t\t\t\t\tduration: options.duration ?? 400,\n\t\t\t\t\t\teasing: options.easing\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trunMultiNodeTransition(transitions, {\n\t\t\t\tstyleFormat: 'object',\n\t\t\t\tonUpdate: (updated) => setNodes(mergeById(mergedNodes, updated)),\n\t\t\t\tonComplete: () => options.onComplete?.()\n\t\t\t});\n\t\t},\n\t\t[target]\n\t);\n\n\tconst collapseNode = useCallback(\n\t\t(parentNodeId: string, options: CollapseNodeOptions = {}) => {\n\t\t\tconst { nodes, setNodes, setEdges } = target;\n\t\t\tconst snapshot = snapshotsRef.current.get(parentNodeId);\n\t\t\tif (!snapshot) return;\n\n\t\t\tconst parent = nodes.find((n) => n.id === parentNodeId);\n\t\t\tconst originPos: XYPosition = parent ? { ...parent.position } : { x: 0, y: 0 };\n\n\t\t\tconst childIdSet = new Set(snapshot.childNodeIds);\n\t\t\tconst edgeIdSet = new Set(snapshot.childEdgeIds);\n\n\t\t\tconst transitions: NodeTransition<TNode>[] = [];\n\n\t\t\t// 1. Children animate back into parent\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (childIdSet.has(node.id)) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom: { ...node.position },\n\t\t\t\t\t\tto: originPos,\n\t\t\t\t\t\tduration: options.duration ?? 300,\n\t\t\t\t\t\teasing: options.easing,\n\t\t\t\t\t\ttrajectory: options.trajectory\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// 2. Displaced nodes animate back to original positions\n\t\t\tsnapshot.displacedNodes.forEach((disp) => {\n\t\t\t\tconst node = nodes.find((n) => n.id === disp.id);\n\t\t\t\tif (node) {\n\t\t\t\t\ttransitions.push({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom: { ...node.position },\n\t\t\t\t\t\tto: disp.originalPosition,\n\t\t\t\t\t\tduration: options.duration ?? 300,\n\t\t\t\t\t\teasing: options.easing,\n\t\t\t\t\t\ttrajectory: linearPositionTrajectory\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trunMultiNodeTransition(transitions, {\n\t\t\t\tstyleFormat: 'object',\n\t\t\t\tonUpdate: (updated) => setNodes(mergeById(nodes, updated)),\n\t\t\t\tonComplete: () => {\n\t\t\t\t\t// Clean up child nodes and edges\n\t\t\t\t\tsetNodes((prev) => prev.filter((n) => !childIdSet.has(n.id)));\n\t\t\t\t\tsetEdges((prev) => prev.filter((e) => !edgeIdSet.has(e.id)));\n\t\t\t\t\tsnapshotsRef.current.delete(parentNodeId);\n\t\t\t\t\toptions.onComplete?.();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t[target]\n\t);\n\n\treturn {\n\t\texplodeNode,\n\t\tcollapseNode,\n\t\tisExploded: (parentNodeId: string) => snapshotsRef.current.has(parentNodeId),\n\t\tgetSnapshot: (parentNodeId: string) => snapshotsRef.current.get(parentNodeId)\n\t};\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tcreateCanvasArrangeController,\n\tmatchArrangeShortcut,\n\ttype ArrangeHistoryTarget,\n\ttype AutoLayoutOptions,\n\ttype ArrangeShortcutBinding,\n\ttype CanvasArrangeAction,\n\ttype CanvasNode,\n\ttype GuideLine,\n\ttype NodeRectOptions,\n\ttype SnapGuidesOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasArrangeOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** Ids acted on when a method is called without ids (default: nodes with `selected: true`). */\n\tgetSelectedIds?: () => string[];\n\t/** When set, every arrange action is recorded as one undoable command. */\n\thistory?: ArrangeHistoryTarget;\n\t/** Current zoom (e.g. `useViewport().zoom`) for the screen-pixel guide threshold. */\n\tzoom?: number;\n\tguides?: Omit<SnapGuidesOptions, 'zoom'>;\n\t/** Turns drag snapping off (default `true`). */\n\tsnapping?: boolean;\n\trectOptions?: NodeRectOptions;\n\t/** Re-run auto layout around arranged nodes in the same undo step (see `useCanvasAutoLayout`). */\n\tautoLayout?: boolean | AutoLayoutOptions;\n}\n\n/**\n * React hook for Freeform-style arrangement on React Flow: align, distribute, make same size,\n * lock / unlock, layer order and smart guides with snap-to-shape while dragging.\n *\n * Snapping: pass node changes through `snapPositionChanges` in `onNodesChange`\n * (`onNodesChange={(c) => setNodes((n) => applyNodeChanges(arrange.snapPositionChanges(c), n))}`)\n * and render `guides` with `<CanvasGuidesLayer>`.\n */\nexport function useCanvasArrange<TNode extends CanvasNode = CanvasNode>(options: UseCanvasArrangeOptions<TNode>) {\n\tconst [guides, setGuides] = useState<GuideLine[]>([]);\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasArrangeController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive actions (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tgetSelectedIds: () =>\n\t\t\t\t\toptionsRef.current.getSelectedIds?.() ??\n\t\t\t\t\tnodesRef.current.filter((n) => n.selected).map((n) => n.id),\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tgetZoom: () => optionsRef.current.zoom ?? 1,\n\t\t\t\tget guides() {\n\t\t\t\t\treturn optionsRef.current.guides;\n\t\t\t\t},\n\t\t\t\tget snapping() {\n\t\t\t\t\treturn optionsRef.current.snapping;\n\t\t\t\t},\n\t\t\t\tget rectOptions() {\n\t\t\t\t\treturn optionsRef.current.rectOptions;\n\t\t\t\t},\n\t\t\t\tget autoLayout() {\n\t\t\t\t\treturn optionsRef.current.autoLayout;\n\t\t\t\t},\n\t\t\t\tonGuidesChange: setGuides\n\t\t\t}),\n\t\t[]\n\t);\n\n\treturn useMemo(() => ({ ...controller, guides }), [controller, guides]);\n}\n\nexport type CanvasArrange = ReturnType<typeof useCanvasArrange>;\n\nexport interface UseCanvasArrangeShortcutsOptions {\n\tarrange: { runAction: (action: CanvasArrangeAction) => boolean };\n\t/** Scenes controller for PageDown / PageUp (next / previous scene). */\n\tscenes?: { next: () => unknown; previous: () => unknown };\n\ttargetElement?: HTMLElement | Window | null;\n\tenabled?: boolean;\n\tbindings?: readonly ArrangeShortcutBinding[];\n}\n\n/**\n * Registers the arrange keyboard shortcuts (see `DEFAULT_ARRANGE_SHORTCUTS`), ignoring\n * events from inputs, textareas, contenteditable and ProseMirror editors.\n */\nexport function useCanvasArrangeShortcuts(options: UseCanvasArrangeShortcutsOptions) {\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\tconst { targetElement, enabled = true } = options;\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\t\tconst target = targetElement ?? (typeof window !== 'undefined' ? window : null);\n\t\tif (!target) return;\n\n\t\tfunction handleKeyDown(event: Event) {\n\t\t\tconst { arrange, scenes, bindings } = optionsRef.current;\n\t\t\tconst action = matchArrangeShortcut(event as KeyboardEvent, bindings);\n\t\t\tif (!action) return;\n\t\t\tlet handled = false;\n\t\t\tif (action === 'nextScene' || action === 'previousScene') {\n\t\t\t\tif (scenes) {\n\t\t\t\t\tscenes[action === 'nextScene' ? 'next' : 'previous']();\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thandled = arrange.runAction(action);\n\t\t\t}\n\t\t\tif (handled) event.preventDefault();\n\t\t}\n\n\t\ttarget.addEventListener('keydown', handleKeyDown);\n\t\treturn () => target.removeEventListener('keydown', handleKeyDown);\n\t}, [targetElement, enabled]);\n}\n","import { useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n\tCanvasScenesStore,\n\tfitViewportToNodes,\n\ttype CanvasNode,\n\ttype CanvasScene,\n\ttype CanvasScenesOptions,\n\ttype CanvasViewport,\n\ttype FitViewportOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasScenesOptions extends CanvasScenesOptions {\n\t/** Reads the live viewport, used by `capture` / `recapture` (e.g. `useReactFlow().getViewport`). */\n\tgetViewport?: () => CanvasViewport;\n\t/** Moves the canvas to a scene (e.g. `useReactFlow().setViewport`). */\n\tsetViewport?: (viewport: CanvasViewport, options?: { duration?: number }) => void;\n\t/** Transition duration passed to `setViewport` when showing a scene (default 300ms). */\n\tduration?: number;\n\t/** Use an existing store (e.g. one shared with non-React code) instead of creating one. */\n\tstore?: CanvasScenesStore;\n}\n\n/**\n * React hook for Freeform-style Scenes: named saved viewports with show next / previous,\n * reorder, rename and JSON persistence. Backed by the framework-agnostic\n * `CanvasScenesStore` through `useSyncExternalStore`.\n */\nexport function useCanvasScenes(options: UseCanvasScenesOptions = {}) {\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\tconst storeRef = useRef<CanvasScenesStore | null>(null);\n\tif (!storeRef.current) storeRef.current = options.store ?? new CanvasScenesStore(options);\n\tconst store = storeRef.current;\n\n\tconst state = useSyncExternalStore(\n\t\t(listener) => store.subscribe(listener),\n\t\t() => store.getState(),\n\t\t() => store.getState()\n\t);\n\n\tconst actions = useMemo(() => {\n\t\tconst show = (scene: CanvasScene | undefined) => {\n\t\t\tif (scene) {\n\t\t\t\toptionsRef.current.setViewport?.(scene.viewport, { duration: optionsRef.current.duration ?? 300 });\n\t\t\t}\n\t\t\treturn scene;\n\t\t};\n\t\treturn {\n\t\t\tstore,\n\t\t\t/** Saves the current viewport (or `viewport`) as a new scene. */\n\t\t\tcapture(name?: string, extra: { viewport?: CanvasViewport; nodeIds?: string[]; index?: number } = {}) {\n\t\t\t\tconst viewport = extra.viewport ?? optionsRef.current.getViewport?.();\n\t\t\t\tif (!viewport) throw new Error('[useCanvasScenes] capture() needs a viewport or a getViewport option.');\n\t\t\t\treturn store.add({ viewport, name, nodeIds: extra.nodeIds }, extra.index);\n\t\t\t},\n\t\t\t/** Saves a scene framing the given nodes in a container of `size`. */\n\t\t\tcaptureNodes(\n\t\t\t\tnodes: CanvasNode[],\n\t\t\t\tids: string[],\n\t\t\t\tsize: { width: number; height: number },\n\t\t\t\tname?: string,\n\t\t\t\tfit?: FitViewportOptions\n\t\t\t) {\n\t\t\t\tconst viewport = fitViewportToNodes(nodes, size, ids, fit);\n\t\t\t\treturn viewport ? store.add({ viewport, name, nodeIds: ids }) : undefined;\n\t\t\t},\n\t\t\t/** Replaces a scene's viewport with the live one. */\n\t\t\trecapture(id: string) {\n\t\t\t\tconst viewport = optionsRef.current.getViewport?.();\n\t\t\t\treturn viewport ? store.update(id, { viewport }) : undefined;\n\t\t\t},\n\t\t\tupdate: (id: string, patch: Partial<Omit<CanvasScene, 'id'>>) => store.update(id, patch),\n\t\t\trename: (id: string, name: string) => store.rename(id, name),\n\t\t\tmove: (id: string, toIndex: number) => store.move(id, toIndex),\n\t\t\treorder: (ids: string[]) => store.reorder(ids),\n\t\t\tremove: (id: string) => store.remove(id),\n\t\t\tclear: () => store.clear(),\n\t\t\tgoTo: (id: string) => show(store.goTo(id)),\n\t\t\tnext: () => show(store.next()),\n\t\t\tprevious: () => show(store.previous()),\n\t\t\ttoJSON: () => store.toJSON(),\n\t\t\tserialize: () => store.serialize(),\n\t\t\tload: (input: string | unknown) => store.load(input)\n\t\t};\n\t}, [store]);\n\n\treturn {\n\t\t...actions,\n\t\tscenes: state.scenes,\n\t\tcurrentId: state.currentId,\n\t\tcurrentIndex: state.currentIndex,\n\t\tcurrent: state.currentIndex === -1 ? null : state.scenes[state.currentIndex]\n\t};\n}\n\nexport type CanvasScenes = ReturnType<typeof useCanvasScenes>;\n","import React from 'react';\nimport type { CanvasViewport, GuideLine } from '@pixerate/editor/canvas';\n\nexport interface CanvasGuidesLayerProps {\n\t/** Guide segments in flow coordinates (e.g. `arrange.guides`). */\n\tguides: GuideLine[];\n\t/** Current viewport (e.g. `useViewport()` from React Flow). */\n\tviewport?: CanvasViewport;\n\t/** Colour of edge and centre guides. */\n\tcolor?: string;\n\t/** Colour of equal-spacing guides. */\n\tspacingColor?: string;\n\t/** Colour of measuring lines, their labels and extension lines. */\n\tmeasureColor?: string;\n\tclassName?: string;\n}\n\nconst DEFAULT_VIEWPORT: CanvasViewport = { x: 0, y: 0, zoom: 1 };\n\n/**\n * Smart-guide overlay for React Flow. Place it inside the flow container (it is absolutely\n * positioned over the whole pane) and pass the live viewport.\n */\nexport function CanvasGuidesLayer({\n\tguides,\n\tviewport = DEFAULT_VIEWPORT,\n\tcolor = '#f59e0b',\n\tspacingColor = '#ec4899',\n\tmeasureColor = '#ef4444',\n\tclassName = ''\n}: CanvasGuidesLayerProps) {\n\tif (!guides || guides.length === 0) return null;\n\tconst sx = (x: number) => x * viewport.zoom + viewport.x;\n\tconst sy = (y: number) => y * viewport.zoom + viewport.y;\n\n\treturn (\n\t\t<svg\n\t\t\tclassName={`pixerate-canvas-guides ${className}`}\n\t\t\tstyle={{\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: 0,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\toverflow: 'visible',\n\t\t\t\tzIndex: 10\n\t\t\t}}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t{guides.map((guide, i) => {\n\t\t\t\tconst measuring = guide.kind === 'measure' || guide.kind === 'extension';\n\t\t\t\treturn (\n\t\t\t\t\t<line\n\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\tdata-kind={guide.kind}\n\t\t\t\t\t\tx1={sx(guide.x1)}\n\t\t\t\t\t\ty1={sy(guide.y1)}\n\t\t\t\t\t\tx2={sx(guide.x2)}\n\t\t\t\t\t\ty2={sy(guide.y2)}\n\t\t\t\t\t\tstroke={measuring ? measureColor : guide.kind === 'spacing' ? spacingColor : color}\n\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\tstrokeDasharray={guide.kind === 'centre' ? '4 3' : guide.kind === 'extension' ? '3 3' : undefined}\n\t\t\t\t\t\tshapeRendering=\"crispEdges\"\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{guides.map((guide, i) => {\n\t\t\t\tif (!guide.label) return null;\n\t\t\t\tconst x = sx((guide.x1 + guide.x2) / 2);\n\t\t\t\tconst y = sy((guide.y1 + guide.y2) / 2);\n\t\t\t\t// Labels sit beside vertical lines and below horizontal ones.\n\t\t\t\tconst vertical = guide.orientation === 'vertical';\n\t\t\t\tconst width = guide.label.length * 6.5 + 8;\n\t\t\t\treturn (\n\t\t\t\t\t<g\n\t\t\t\t\t\tkey={`label-${i}`}\n\t\t\t\t\t\tclassName=\"pixerate-canvas-guides__label\"\n\t\t\t\t\t\tdata-label={guide.label}\n\t\t\t\t\t\ttransform={`translate(${vertical ? x + 4 : x - width / 2} ${vertical ? y - 8 : y + 4})`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<rect width={width} height={16} rx={3} fill={measureColor} />\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={width / 2}\n\t\t\t\t\t\t\ty={11.5}\n\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\tfontSize={11}\n\t\t\t\t\t\t\tfontFamily=\"system-ui, sans-serif\"\n\t\t\t\t\t\t\tfill=\"#fff\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{guide.label}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t</g>\n\t\t\t\t);\n\t\t\t})}\n\t\t</svg>\n\t);\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tcreateCanvasDrawController,\n\ttype ArrangeHistoryTarget,\n\ttype CanvasNode,\n\ttype FreehandDrawOptions,\n\ttype FreehandStroke,\n\ttype FreehandStrokeStyle,\n\ttype FreehandTool\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasDrawOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\thistory?: ArrangeHistoryTarget;\n\tinitialTool?: FreehandTool;\n\tinitialStyle?: Partial<FreehandStrokeStyle>;\n\tdrawOptions?: FreehandDrawOptions;\n\tgenerateNodeId?: () => string;\n\tonStrokeComplete?: (node: TNode) => void;\n\tonNodesErase?: (erasedNodes: TNode[]) => void;\n}\n\nexport interface CanvasDrawState {\n\ttool: FreehandTool;\n\tstyle: FreehandStrokeStyle;\n\tactiveStroke: FreehandStroke | null;\n\tisDrawing: boolean;\n}\n\nexport interface CanvasDrawActions<TNode extends CanvasNode = CanvasNode> {\n\tsetTool: (tool: FreehandTool) => void;\n\tsetStyle: (style: Partial<FreehandStrokeStyle>) => void;\n\tstartStroke: (point: [number, number]) => void;\n\tcontinueStroke: (point: [number, number]) => void;\n\tendStroke: () => TNode | null;\n\tcancelStroke: () => void;\n\teraseAt: (point: [number, number], radius?: number) => TNode[];\n}\n\nexport type CanvasDraw<TNode extends CanvasNode = CanvasNode> = CanvasDrawState &\n\tCanvasDrawActions<TNode>;\n\n/**\n * React hook managing freehand drawing tools (pen, highlighter, eraser) on a canvas.\n */\nexport function useCanvasDraw<TNode extends CanvasNode = CanvasNode>(\n\toptions: UseCanvasDrawOptions<TNode>\n): CanvasDraw<TNode> {\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst [tool, setToolState] = useState<FreehandTool>(options.initialTool ?? 'select');\n\tconst [activeStroke, setActiveStroke] = useState<FreehandStroke | null>(null);\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasDrawController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\ttool: options.initialTool ?? 'select',\n\t\t\t\tstyle: options.initialStyle,\n\t\t\t\tdrawOptions: options.drawOptions,\n\t\t\t\tgenerateNodeId: options.generateNodeId,\n\t\t\t\tonToolChange: setToolState,\n\t\t\t\tonStyleChange: (s) => setStyleState(s),\n\t\t\t\tonActiveStrokeChange: setActiveStroke,\n\t\t\t\tonStrokeComplete: (n) => optionsRef.current.onStrokeComplete?.(n),\n\t\t\t\tonNodesErase: (erased) => optionsRef.current.onNodesErase?.(erased)\n\t\t\t}),\n\t\t[]\n\t);\n\n\tconst [style, setStyleState] = useState<FreehandStrokeStyle>(controller.style);\n\n\t// Synchronize initialTool changes if passed as reactive prop\n\tuseEffect(() => {\n\t\tif (options.initialTool && options.initialTool !== controller.tool) {\n\t\t\tcontroller.setTool(options.initialTool);\n\t\t}\n\t}, [options.initialTool, controller]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\ttool,\n\t\t\tstyle,\n\t\t\tactiveStroke,\n\t\t\tisDrawing: activeStroke !== null,\n\t\t\tsetTool: controller.setTool,\n\t\t\tsetStyle: controller.setStyle,\n\t\t\tstartStroke: controller.startStroke,\n\t\t\tcontinueStroke: controller.continueStroke,\n\t\t\tendStroke: controller.endStroke,\n\t\t\tcancelStroke: controller.cancelStroke,\n\t\t\teraseAt: controller.eraseAt\n\t\t}),\n\t\t[tool, style, activeStroke, controller]\n\t);\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CanvasDraw } from './useCanvasDraw.js';\nimport {\n\tstrokePointsToPathData,\n\tresolveCanvasGradient,\n\tgradientToSvgDef,\n\ttype CanvasNode,\n\ttype CanvasViewport\n} from '@pixerate/editor/canvas';\n\nexport interface CanvasDrawLayerProps<TNode extends CanvasNode = CanvasNode> {\n\t/** Draw state and controller actions from `useCanvasDraw`. */\n\tdraw: CanvasDraw<TNode>;\n\t/** Current viewport (e.g. `useViewport()` from React Flow). */\n\tviewport?: CanvasViewport;\n\t/** Optional class name on the root SVG overlay element. */\n\tclassName?: string;\n\t/** Optional inline styles on the root SVG overlay element. */\n\tstyle?: React.CSSProperties;\n\t/** Cursor styling override when drawing or erasing. */\n\tcursor?: string;\n\t/** Eraser circle preview radius in screen pixels (default: 12). */\n\teraserRadius?: number;\n}\n\nconst DEFAULT_VIEWPORT: CanvasViewport = { x: 0, y: 0, zoom: 1 };\n\n/**\n * Overlay component for freehand drawing inside React Flow.\n * Renders an interactive SVG capturing drawing pointer events when `draw.tool !== 'select'`.\n * Also supports holding Spacebar to temporarily pan the canvas without switching tools.\n */\nexport function CanvasDrawLayer<TNode extends CanvasNode = CanvasNode>({\n\tdraw,\n\tviewport = DEFAULT_VIEWPORT,\n\tclassName = '',\n\tstyle,\n\tcursor,\n\teraserRadius = 12\n}: CanvasDrawLayerProps<TNode>) {\n\tconst svgRef = useRef<SVGSVGElement | null>(null);\n\tconst [spaceHeld, setSpaceHeld] = useState(false);\n\tconst [eraserPos, setEraserPos] = useState<[number, number] | null>(null);\n\n\t// Spacebar navigation override\n\tuseEffect(() => {\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.code === 'Space' && !e.repeat) {\n\t\t\t\tconst tag = (e.target as HTMLElement)?.tagName;\n\t\t\t\tif (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetSpaceHeld(true);\n\t\t\t}\n\t\t}\n\t\tfunction onKeyUp(e: KeyboardEvent) {\n\t\t\tif (e.code === 'Space') {\n\t\t\t\tsetSpaceHeld(false);\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('keydown', onKeyDown);\n\t\twindow.addEventListener('keyup', onKeyUp);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('keydown', onKeyDown);\n\t\t\twindow.removeEventListener('keyup', onKeyUp);\n\t\t};\n\t}, []);\n\n\t// Transform screen client coordinates to flow canvas coordinates\n\tconst clientToFlow = useCallback(\n\t\t(clientX: number, clientY: number): [number, number] => {\n\t\t\tif (!svgRef.current) return [0, 0];\n\t\t\tconst rect = svgRef.current.getBoundingClientRect();\n\t\t\tconst screenX = clientX - rect.left;\n\t\t\tconst screenY = clientY - rect.top;\n\t\t\tconst flowX = (screenX - viewport.x) / viewport.zoom;\n\t\t\tconst flowY = (screenY - viewport.y) / viewport.zoom;\n\t\t\treturn [flowX, flowY];\n\t\t},\n\t\t[viewport.x, viewport.y, viewport.zoom]\n\t);\n\n\tconst isDrawingMode = draw.tool !== 'select';\n\tconst interactive = isDrawingMode && !spaceHeld;\n\n\tconst handlePointerDown = (e: React.PointerEvent<SVGSVGElement>) => {\n\t\tif (!interactive || e.button !== 0) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t(e.target as Element).setPointerCapture?.(e.pointerId);\n\n\t\tconst flowPt = clientToFlow(e.clientX, e.clientY);\n\t\tdraw.startStroke(flowPt);\n\n\t\tif (draw.tool === 'eraser') {\n\t\t\tsetEraserPos([e.clientX, e.clientY]);\n\t\t}\n\t};\n\n\tconst handlePointerMove = (e: React.PointerEvent<SVGSVGElement>) => {\n\t\tif (draw.tool === 'eraser' && !spaceHeld) {\n\t\t\tsetEraserPos([e.clientX, e.clientY]);\n\t\t}\n\n\t\tif (!interactive) return;\n\t\t// If pointer is pressed down (or dragging)\n\t\tif (e.buttons === 1) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst flowPt = clientToFlow(e.clientX, e.clientY);\n\t\t\tdraw.continueStroke(flowPt);\n\t\t}\n\t};\n\n\tconst handlePointerUp = (e: React.PointerEvent<SVGSVGElement>) => {\n\t\tif (!interactive || e.button !== 0) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\ttry {\n\t\t\t(e.target as Element).releasePointerCapture?.(e.pointerId);\n\t\t} catch {\n\t\t\t// ignore if already released\n\t\t}\n\t\tdraw.endStroke();\n\t};\n\n\tconst handlePointerLeave = () => {\n\t\tsetEraserPos(null);\n\t};\n\n\t// Determine cursor style\n\tconst resolvedCursor = cursor\n\t\t? cursor\n\t\t: spaceHeld\n\t\t\t? 'grab'\n\t\t\t: draw.tool === 'eraser'\n\t\t\t\t? 'crosshair'\n\t\t\t\t: draw.tool === 'pen' || draw.tool === 'highlighter'\n\t\t\t\t\t? 'crosshair'\n\t\t\t\t\t: 'default';\n\n\t// Render preview of active live stroke\n\tconst strokePath = draw.activeStroke\n\t\t? strokePointsToPathData(draw.activeStroke.points)\n\t\t: null;\n\n\tconst activeGradient = draw.activeStroke\n\t\t? resolveCanvasGradient(draw.activeStroke.style.gradient ?? draw.activeStroke.style.color)\n\t\t: null;\n\tconst resolvedGradientDef = activeGradient\n\t\t? gradientToSvgDef(activeGradient, 'active-draw-stroke-gradient')\n\t\t: null;\n\tconst strokePaint = resolvedGradientDef\n\t\t? `url(#${resolvedGradientDef.id})`\n\t\t: draw.activeStroke\n\t\t\t? (draw.activeStroke.style.color as string)\n\t\t\t: 'currentColor';\n\n\treturn (\n\t\t<svg\n\t\t\tref={svgRef}\n\t\t\tclassName={`pixerate-canvas-draw-layer ${className}`}\n\t\t\tstyle={{\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: 0,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tpointerEvents: interactive ? 'all' : 'none',\n\t\t\t\tcursor: interactive ? resolvedCursor : undefined,\n\t\t\t\toverflow: 'visible',\n\t\t\t\tzIndex: 20,\n\t\t\t\ttouchAction: 'none',\n\t\t\t\t...style\n\t\t\t}}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={handlePointerUp}\n\t\t\tonPointerLeave={handlePointerLeave}\n\t\t>\n\t\t\t{/* Gradient defs for active freehand stroke */}\n\t\t\t{resolvedGradientDef && (\n\t\t\t\t<defs>\n\t\t\t\t\t{resolvedGradientDef.type === 'linear' && (\n\t\t\t\t\t\t<linearGradient id={resolvedGradientDef.id} {...resolvedGradientDef.attrs}>\n\t\t\t\t\t\t\t{resolvedGradientDef.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t)}\n\t\t\t\t\t{resolvedGradientDef.type === 'radial' && (\n\t\t\t\t\t\t<radialGradient id={resolvedGradientDef.id} {...resolvedGradientDef.attrs}>\n\t\t\t\t\t\t\t{resolvedGradientDef.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t)}\n\t\t\t\t</defs>\n\t\t\t)}\n\n\t\t\t{/* Canvas-space items transformed by current React Flow viewport */}\n\t\t\t<g transform={`translate(${viewport.x}, ${viewport.y}) scale(${viewport.zoom})`}>\n\t\t\t\t{draw.activeStroke && strokePath && (\n\t\t\t\t\t<path\n\t\t\t\t\t\tclassName=\"pixerate-canvas-draw-active\"\n\t\t\t\t\t\td={strokePath}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke={strokePaint}\n\t\t\t\t\t\tstrokeWidth={draw.activeStroke.style.width}\n\t\t\t\t\t\topacity={draw.activeStroke.style.opacity}\n\t\t\t\t\t\tstrokeLinecap={draw.activeStroke.style.cap ?? 'round'}\n\t\t\t\t\t\tstrokeLinejoin={draw.activeStroke.style.join ?? 'round'}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</g>\n\n\t\t\t{/* Screen-space eraser cursor indicator */}\n\t\t\t{draw.tool === 'eraser' && eraserPos && svgRef.current && (\n\t\t\t\t<circle\n\t\t\t\t\tcx={eraserPos[0] - svgRef.current.getBoundingClientRect().left}\n\t\t\t\t\tcy={eraserPos[1] - svgRef.current.getBoundingClientRect().top}\n\t\t\t\t\tr={eraserRadius}\n\t\t\t\t\tfill=\"rgba(239, 68, 68, 0.15)\"\n\t\t\t\t\tstroke=\"rgba(239, 68, 68, 0.8)\"\n\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\tstrokeDasharray=\"3 3\"\n\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</svg>\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tisMeasureModifierHeld,\n\tmeasureSelection,\n\ttype CanvasNode,\n\ttype MeasureSelectionResult,\n\ttype NodeRectOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasMeasureOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\t/** Ids measured from (default: nodes with `selected: true`). */\n\tgetSelectedIds?: () => string[];\n\t/** Turns measuring off (default `true`). */\n\tenabled?: boolean;\n\t/** Measure only while Alt / Option is held (default `true`); `false` always measures. */\n\trequireModifier?: boolean;\n\t/** Element receiving the Alt key events (default `window`). */\n\ttargetElement?: HTMLElement | Window | null;\n\trectOptions?: NodeRectOptions;\n}\n\nconst EMPTY: MeasureSelectionResult = { guides: [], target: null, selection: null };\n\n/**\n * Alt-hover distance measuring for React Flow: hold Alt / Option and hover a node to see\n * red distance lines with labels from the selection to it (or to the selection's parent\n * when hovering the selection or empty space). Wire `onNodeMouseEnter` / `onNodeMouseLeave`\n * to `<ReactFlow>` and render `guides` with `<CanvasGuidesLayer>` (concatenate them with\n * `arrange.guides` to share one layer).\n */\nexport function useCanvasMeasure<TNode extends CanvasNode = CanvasNode>(options: UseCanvasMeasureOptions<TNode>) {\n\tconst { nodes, enabled = true, requireModifier = true, targetElement, rectOptions } = options;\n\tconst [hoveredId, setHoveredId] = useState<string | null>(null);\n\tconst [modifier, setModifier] = useState(false);\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\t\tconst target = targetElement ?? (typeof window !== 'undefined' ? window : null);\n\t\tif (!target) return;\n\t\tconst onKey = (event: Event) => setModifier(isMeasureModifierHeld(event as KeyboardEvent));\n\t\tconst onBlur = () => setModifier(false);\n\t\ttarget.addEventListener('keydown', onKey);\n\t\ttarget.addEventListener('keyup', onKey);\n\t\tconst win = typeof window !== 'undefined' ? window : null;\n\t\twin?.addEventListener('blur', onBlur);\n\t\treturn () => {\n\t\t\ttarget.removeEventListener('keydown', onKey);\n\t\t\ttarget.removeEventListener('keyup', onKey);\n\t\t\twin?.removeEventListener('blur', onBlur);\n\t\t};\n\t}, [enabled, targetElement]);\n\n\tconst active = enabled && (!requireModifier || modifier);\n\tconst result = useMemo(() => {\n\t\tif (!active) return EMPTY;\n\t\tconst ids = optionsRef.current.getSelectedIds?.() ?? nodes.filter((n) => n.selected).map((n) => n.id);\n\t\treturn measureSelection(nodes, ids, hoveredId, rectOptions);\n\t}, [active, nodes, hoveredId, rectOptions]);\n\n\tconst onNodeMouseEnter = useCallback((event: { altKey?: boolean } | null, node: { id: string }) => {\n\t\tsetHoveredId(node.id);\n\t\tif (event && typeof event.altKey === 'boolean') setModifier(event.altKey);\n\t}, []);\n\tconst onNodeMouseLeave = useCallback((_event: unknown, node: { id: string }) => {\n\t\tsetHoveredId((current) => (current === node.id ? null : current));\n\t}, []);\n\n\treturn {\n\t\t/** Measuring lines (flow coordinates) to pass to `<CanvasGuidesLayer>`. */\n\t\tguides: result.guides,\n\t\t/** The box measured to (outline it), or `null`. */\n\t\ttarget: result.target,\n\t\t/** Whether measuring is showing (enabled and Alt held, unless `requireModifier: false`). */\n\t\tactive,\n\t\thoveredId,\n\t\tsetHoveredId,\n\t\t/** Sets the modifier state by hand (e.g. from a toolbar toggle). */\n\t\tsetModifier,\n\t\tonNodeMouseEnter,\n\t\tonNodeMouseLeave\n\t};\n}\n\nexport type CanvasMeasure = ReturnType<typeof useCanvasMeasure>;\n","export {\n\tAgentPresenceLayer,\n\ttype AgentPresenceLayerProps\n} from './AgentPresenceLayer.js';\n\nexport {\n\tuseStreamingCanvas,\n\ttype UseStreamingCanvasOptions\n} from './useStreamingCanvas.js';\n\nexport {\n\tuseCanvasGraph,\n\ttype UseCanvasGraphOptions\n} from './useCanvasGraph.js';\n\nexport {\n\tuseCanvasLayout,\n\ttype UseCanvasLayoutOptions\n} from './useCanvasLayout.js';\n\nexport {\n\tuseCanvasClipboard,\n\ttype UseCanvasClipboardOptions\n} from './useCanvasClipboard.js';\n\nexport {\n\tuseCanvasShortcuts,\n\ttype UseCanvasShortcutsOptions\n} from './useCanvasShortcuts.js';\n\nexport {\n\tuseCanvasDocking,\n\ttype UseCanvasDockingOptions\n} from './useCanvasDocking.js';\n\nexport {\n\tuseCanvasExplosion,\n\ttype CanvasGraphTarget\n} from './useCanvasExplosion.js';\n\n// Arrangement (align / distribute / size / lock / z-order), smart guides and scenes\nexport {\n\tuseCanvasArrange,\n\tuseCanvasArrangeShortcuts,\n\ttype CanvasArrange,\n\ttype UseCanvasArrangeOptions,\n\ttype UseCanvasArrangeShortcutsOptions\n} from './useCanvasArrange.js';\n\nexport {\n\tuseCanvasScenes,\n\ttype CanvasScenes,\n\ttype UseCanvasScenesOptions\n} from './useCanvasScenes.js';\n\nexport {\n\tCanvasGuidesLayer,\n\ttype CanvasGuidesLayerProps\n} from './CanvasGuidesLayer.js';\n\n// Freehand drawing tools (pen, highlighter, eraser)\nexport {\n\tuseCanvasDraw,\n\ttype CanvasDraw,\n\ttype CanvasDrawState,\n\ttype CanvasDrawActions,\n\ttype UseCanvasDrawOptions\n} from './useCanvasDraw.js';\n\nexport {\n\tCanvasDrawLayer,\n\ttype CanvasDrawLayerProps\n} from './CanvasDrawLayer.js';\n\n// Distance measuring (Alt-hover), resize / grid snapping and curve fitting\nexport {\n\tuseCanvasMeasure,\n\ttype CanvasMeasure,\n\ttype UseCanvasMeasureOptions\n} from './useCanvasMeasure.js';\n\nexport {\n\tmeasureBetween,\n\tmeasureToLine,\n\tmeasureSelection,\n\tmeasureLabel,\n\tisMeasureModifierHeld,\n\tsnapToGrid,\n\tsnapResize,\n\tsnapNodeResize,\n\tinferResizeHandle,\n\tresizeHandleAxes,\n\tgetResizingNodeRect,\n\tRESIZE_HANDLES,\n\tfitCubics,\n\tfitCubicRun,\n\tfitPathData,\n\tfitFreehandPath,\n\tcubicsToPathData,\n\tcubicPointAt,\n\tisStraightCubic,\n\ttype MeasureGuide,\n\ttype MeasureSelectionResult,\n\ttype MeasureSelectionOptions,\n\ttype ResizeHandle,\n\ttype SnapResizeOptions,\n\ttype SnapResizeResult,\n\ttype SnapNodeResizeOptions,\n\ttype SnapNodeResizeResult,\n\ttype CubicSegment,\n\ttype FitCubicsOptions,\n\ttype FitPathDataOptions\n} from '@pixerate/editor/canvas';\n\nexport {\n\talignNodes,\n\tdistributeNodes,\n\tmatchSize,\n\treorderNodes,\n\tapplyNodeUpdates,\n\tinvertNodeUpdates,\n\tlockNodes,\n\tunlockNodes,\n\ttoggleLockNodes,\n\tisLocked,\n\tgetNodeSize,\n\tgetNodeRect,\n\tgetAbsolutePosition,\n\treadStyleSize,\n\twithStyleSize,\n\tcomputeSnapGuides,\n\tcreateGuideIndex,\n\tcreateNodeGuideIndex,\n\tsnapNodeDrag,\n\tfindConnectorSnap,\n\tnearestHandlePositions,\n\thandlePoint,\n\tpositionToSide,\n\tsideToPosition,\n\toppositePosition,\n\tCONNECTION_LINE_TYPES,\n\tCanvasScenesStore,\n\tcreateCanvasScenesStore,\n\tparseCanvasScenes,\n\tfitViewportToRect,\n\tfitViewportToNodes,\n\tmatchArrangeShortcut,\n\tDEFAULT_ARRANGE_SHORTCUTS,\n\ttype AlignEdge,\n\ttype DistributeAxis,\n\ttype DistributeMode,\n\ttype SizeDimension,\n\ttype ZOrderOperation,\n\ttype CanvasNodeUpdate,\n\ttype GuideLine,\n\ttype GuideIndex,\n\ttype SnapGuidesOptions,\n\ttype SnapResult,\n\ttype ConnectorSnap,\n\ttype ConnectorSnapTarget,\n\ttype CanvasConnectionLineType,\n\ttype CanvasScene,\n\ttype CanvasScenesState,\n\ttype CanvasViewport,\n\ttype CanvasArrangeAction,\n\ttype ArrangeShortcutBinding\n} from '@pixerate/editor/canvas';\n\nexport { ShapeNode, type ShapeNodeProps } from './ShapeNode.js';\n\n// Shape nodes and boolean operations (Unite / Intersect / Subtract / Exclude / Divide)\nexport {\n\tcombineShapeNodes,\n\tcanCombineShapeNodes,\n\tapplyShapeCombination,\n\trevertShapeCombination,\n\tshapeNodeToPolygon,\n\tisShapeNode,\n\tgetNodeShape,\n\tSHAPE_DATA_KEY,\n\tSHAPE_NODE_TYPE,\n\tSHAPE_OPERATIONS,\n\tSHAPE_KINDS,\n\tisShapeDescription,\n\tshapeToPolygon,\n\tgetShapeSvg,\n\tgetShapeRenderData,\n\tparseSvgPath,\n\tflattenSvgPath,\n\tpolygonToSvgPath,\n\tsimplifyRing,\n\tpolygonBoolean,\n\tunionPolygons,\n\tintersectPolygons,\n\tsubtractPolygons,\n\txorPolygons,\n\tdividePolygons,\n\tpolygonArea,\n\tmultiPolygonArea,\n\tmultiPolygonBounds,\n\tringSignedArea,\n\tpointInRings,\n\tpointInMultiPolygon,\n\ttype ShapeOperation,\n\ttype ShapeDescription,\n\ttype ShapeKind,\n\ttype ShapePaint,\n\ttype ShapeSize,\n\ttype ShapeRenderData,\n\ttype RectShape,\n\ttype EllipseShape,\n\ttype RegularPolygonShape,\n\ttype StarShape,\n\ttype PathShape,\n\ttype PathCommand,\n\ttype FlattenOptions,\n\ttype PolygonToPathOptions,\n\ttype CombineShapeNodesOptions,\n\ttype CombineShapeNodesResult,\n\ttype CombineShapeNodesRefusal,\n\ttype ShapeNodePolygonOptions,\n\ttype MultiPolygon,\n\ttype PolygonWithHoles,\n\ttype PolygonRing,\n\ttype PolygonFillRule,\n\ttype PolygonOperand,\n\ttype PolygonInput,\n\ttype PolygonPiece,\n\ttype PolygonBooleanOperation,\n\ttype PolygonBooleanOptions\n} from '@pixerate/editor/canvas';\n\n// Curve-preserving path operations, Offset Path and Outline Stroke\nexport {\n\toffsetShapeNodes,\n\toutlineShapeNodeStrokes,\n\tcanOffsetShapeNodes,\n\tcanOutlineShapeNodeStrokes,\n\tapplyShapeReplacement,\n\thasVisibleStroke,\n\tshapeToBezierPath,\n\tshapeNodeToBezierPath,\n\tpathBoolean,\n\tunitePaths,\n\tintersectPaths,\n\tsubtractPaths,\n\texcludePaths,\n\tdividePaths,\n\tnormalizeBezierPath,\n\tbezierPathArea,\n\toffsetPath,\n\toutlineStroke,\n\tstrokeOutlineRings,\n\tdashContours,\n\ttoBezierPath,\n\tbezierPathToSvg,\n\ttransformBezierPath,\n\tbezierPathBounds,\n\tbezierPathSignedArea,\n\tbezierPathLength,\n\tbezierPathPointAtLength,\n\tpointInBezierPath,\n\tdistanceToBezierPath,\n\tcountPathSegments,\n\ttype BezierCommand,\n\ttype BezierPath,\n\ttype BezierPathInput,\n\ttype PathOperand,\n\ttype PathOperandInput,\n\ttype PathOpsOptions,\n\ttype PathBooleanResult,\n\ttype DividePathsResult,\n\ttype StrokeJoin,\n\ttype StrokeCap,\n\ttype OutlineStrokeOptions,\n\ttype OffsetPathOptions,\n\ttype OffsetShapeNodesOptions,\n\ttype OutlineShapeStrokesOptions,\n\ttype ShapePathEditResult,\n\ttype ShapePathEditRefusal,\n\ttype ShapePathEditOperation\n} from '@pixerate/editor/canvas';\n\n// Re-export shared canvas types & pure math from core\nexport {\n\tgetLayoutedNodes,\n\tensureLayout,\n\tcenterNodes,\n\tgetCenteredNodePosition,\n\tplaceBeside,\n\testimateNodeSize,\n\tflowSide,\n\tboundsOf,\n\tcentre,\n\toverlaps,\n\tlinearTrajectory,\n\tlinearPositionTrajectory,\n\tcreateFanOutTrajectory,\n\tcreateBezierTrajectory,\n\trunMultiNodeTransition,\n\tdefaultEasing,\n\tcomputeNodesBoundingBox,\n\tcalculateDirectionalDisplacement,\n\tcalculateDagreReflowDisplacement,\n\tisEventFromTextInput,\n\tisValidCanvasNode,\n\tisValidUrl,\n\tserializeCanvasNodes,\n\tparseCanvasClipboardData,\n\tremapPastedNodes,\n\trepositionNodesTo,\n\trealClock,\n\tManualClock,\n\tlayoutBounds,\n\tcanvasHeight,\n\testimateCanvasHeight,\n\tblendLayout,\n\tconnectedOnly,\n\ttype Clock,\n\ttype CanvasHeightOptions,\n\ttype CanvasNode,\n\ttype CanvasEdge,\n\ttype GraphDifferences,\n\ttype CanvasClipboardPayload,\n\ttype CanvasLayoutOptions,\n\ttype IncrementalLayoutOptions,\n\ttype PlaceBesideOptions,\n\ttype TrajectoryPoint,\n\ttype TrajectoryFunction,\n\ttype FanOutTrajectoryOptions,\n\ttype NodeTransition,\n\ttype DisplacementDirection,\n\ttype DirectionalDisplacementOptions,\n\ttype ReflowDisplacementOptions,\n\ttype ExplosionSnapshot,\n\ttype ExplodeNodeOptions,\n\ttype CollapseNodeOptions,\n\ttype DockStrategy,\n\ttype CanvasDockingCallbacks,\n\ttype XYPosition,\n\ttype Rect,\n\ttype Side,\n\ttype Point,\n\ttype Position\n} from '@pixerate/editor/canvas';\n\n// Auto layout (Figma-style stacks, wrap, grid, hug / fill / fixed) and constraints\nexport {\n\tlayoutFrame,\n\tlayoutAll,\n\tlayoutUp,\n\tlayoutUpMany,\n\tapplyConstraints,\n\tgetAutoLayout,\n\tgetChildLayout,\n\tgetLayoutSizing,\n\tgetAutoLayoutGrid,\n\tgetAutoLayoutInsertTarget,\n\tgetFlowChildren,\n\tgetLayoutParent,\n\tisAutoLayoutFrame,\n\tmakeSizingCoherent,\n\tmoveLayoutChild,\n\tmergeNodeUpdates,\n\trelayoutUpdates,\n\tresolvePadding,\n\tclampLayoutSize,\n\tcreateCanvasAutoLayoutController,\n\tAUTO_LAYOUT_DATA_KEY,\n\tCHILD_LAYOUT_DATA_KEY,\n\ttype AutoLayout,\n\ttype AutoLayoutChild,\n\ttype AutoLayoutMode,\n\ttype AutoLayoutSizing,\n\ttype AutoLayoutSizingPair,\n\ttype AutoLayoutSize,\n\ttype AutoLayoutAlignMain,\n\ttype AutoLayoutAlignCross,\n\ttype AutoLayoutAlignContent,\n\ttype AutoLayoutPadding,\n\ttype AutoLayoutGrid,\n\ttype AutoLayoutGridTrack,\n\ttype AutoLayoutGridArea,\n\ttype AutoLayoutGridCell,\n\ttype AutoLayoutGridGeometry,\n\ttype AutoLayoutCellAlign,\n\ttype AutoLayoutConstraints,\n\ttype AutoLayoutHorizontalConstraint,\n\ttype AutoLayoutVerticalConstraint,\n\ttype AutoLayoutMeasure,\n\ttype AutoLayoutOptions,\n\ttype AutoLayoutInsertTarget,\n\ttype CanvasAutoLayoutController,\n\ttype CanvasAutoLayoutControllerOptions\n} from '@pixerate/editor/canvas';\n\nexport {\n\tuseCanvasAutoLayout,\n\ttype CanvasAutoLayout,\n\ttype UseCanvasAutoLayoutOptions\n} from './useCanvasAutoLayout.js';\n\n// Design tokens: bindings, per-frame modes and inspector controls\nexport {\n\tuseCanvasTokens,\n\ttype CanvasTokens,\n\ttype UseCanvasTokensOptions\n} from './useCanvasTokens.js';\n\nexport {\n\tTokenBindingPicker,\n\tTokenModeSwitcher,\n\ttype TokenBindingPickerProps,\n\ttype TokenModeSwitcherProps\n} from './TokenBindingPicker.js';\n\nexport {\n\tbindCanvasToken,\n\tsetCanvasTokenMode,\n\tresolveCanvasTokens,\n\tdetachTokenBindings,\n\tpruneCanvasTokenModes,\n\tinspectNodeTokens,\n\tgetNodeTokenBindings,\n\tgetNodeTokenModes,\n\tgetEffectiveTokenModes,\n\tgetBindableTokenProperties,\n\tgetCanvasTokenProperty,\n\tgetTokenPropertyScope,\n\tgetTokensForProperty,\n\treadNodeStyleProperty,\n\twriteNodeStyleProperty,\n\tCANVAS_TOKEN_PROPERTIES,\n\tTOKEN_BINDINGS_DATA_KEY,\n\tTOKEN_MODES_DATA_KEY,\n\ttype CanvasTokenProperty,\n\ttype CanvasTokenOptions,\n\ttype CanvasTokenBindingInfo\n} from '@pixerate/editor/canvas';\n\n// Keyframe animation: playback, record mode, timeline and export\nexport {\n\tuseCanvasAnimation,\n\ttype CanvasAnimation,\n\ttype UseCanvasAnimationOptions\n} from './useCanvasAnimation.js';\n\nexport { AnimationTimeline, type AnimationTimelineProps } from './AnimationTimeline.js';\n\nexport {\n\tcreateCanvasAnimationController,\n\tAnimationPlayer,\n\tcreateAnimationPlayer,\n\tAnimationEditError,\n\tANIMATION_DATA_KEY,\n\tANIMATION_TIME_EPSILON,\n\tANIMATABLE_PROPERTIES,\n\tANIMATION_EASING_PRESETS,\n\tANIMATION_EASING_LABELS,\n\tCUBIC_BEZIER_PRESETS,\n\tMAX_KEYFRAME_REFS,\n\tCSS_ANIMATION_PROPERTIES,\n\tevaluateAnimation,\n\tevaluateTrack,\n\tevaluateEasing,\n\tapplyAnimation,\n\tapplyAnimationOverrides,\n\tinterpolateAnimationValue,\n\tgetAnimationDuration,\n\twrapAnimationTime,\n\tcubicBezierAt,\n\tspringAt,\n\tresolveEasing,\n\tparseCssEasing,\n\teasingToCss,\n\teasingLabel,\n\teasingFromInfluence,\n\tisAnimationEasing,\n\tmixColorsOklab,\n\trgbToOklab,\n\toklabToRgb,\n\tparseOklab,\n\tformatOklab,\n\tgetNodeAnimation,\n\tgetAnimationTrack,\n\tgetAnimatedProperties,\n\tgetAnimatableProperty,\n\tisNodeAnimated,\n\twithNodeAnimation,\n\tnormalizeKeyframes,\n\tisAnimationKeyframe,\n\tclampAnimationValue,\n\tsetKeyframe,\n\taddKeyframesAtTime,\n\tupdateKeyframe,\n\tdeleteKeyframes,\n\tsetKeyframeEasing,\n\tsetTrackEnabled,\n\tremoveTrack,\n\tsetMotionPath,\n\tmoveKeyframes,\n\tscaleKeyframes,\n\tsnapKeyframeDelta,\n\tsnapTimeToFrame,\n\tgetKeyframeTimes,\n\tcopyKeyframes,\n\tpasteKeyframes,\n\tparseKeyframeClipboard,\n\trecordAnimationChanges,\n\tanimateNode,\n\tgetAnimatedValue,\n\treadAnimatableValue,\n\tsampleAnimationFrames,\n\texportCssAnimation,\n\ttoWebAnimations,\n\tplayWebAnimations,\n\tgetCssPropertyAnimations,\n\tisCssExportExact,\n\tgetTimelineRows,\n\tgetTimelineTicks,\n\tisKeyframeSelected,\n\ttimeToX,\n\txToTime,\n\tformatAnimationTime,\n\ttype AnimatableProperty,\n\ttype AnimationValue,\n\ttype AnimationValueType,\n\ttype AnimationKeyframe,\n\ttype AnimationTrack,\n\ttype AnimationMotionPath,\n\ttype NodeAnimation,\n\ttype AnimationEasing,\n\ttype AnimationEasingPreset,\n\ttype CubicBezierEasing,\n\ttype SpringEasing,\n\ttype AnimationLoopMode,\n\ttype AnimationDocument,\n\ttype AnimationOverrides,\n\ttype AnimationFrame,\n\ttype AnimationPlayerState,\n\ttype AnimationPlayerOptions,\n\ttype AnimationHistoryTarget,\n\ttype AnimationKeyframeClipboard,\n\ttype AnimationEditErrorCode,\n\ttype KeyframeRef,\n\ttype KeyframePatch,\n\ttype KeyframeSnap,\n\ttype KeyframeDragState,\n\ttype AnimateNodeOptions,\n\ttype CanvasAnimationController,\n\ttype CanvasAnimationControllerOptions,\n\ttype CanvasAnimationState,\n\ttype CssAnimationExport,\n\ttype CssExportOptions,\n\ttype WebAnimationSpec,\n\ttype TimelineRow,\n\ttype TimelineKeyframe,\n\ttype OklabColor\n} from '@pixerate/editor/canvas';\n\n// Components and instances: hook, components panel and instance inspector\nexport {\n\tuseCanvasComponents,\n\ttype CanvasComponents,\n\ttype UseCanvasComponentsOptions\n} from './useCanvasComponents.js';\n\nexport {\n\tCanvasComponentsPanel,\n\tCanvasInstanceInspector,\n\ttype CanvasComponentsPanelProps,\n\ttype CanvasComponentsPanelActions,\n\ttype CanvasInstanceInspectorProps,\n\ttype CanvasInstanceInspectorActions\n} from './CanvasComponentsPanel.js';\n\nexport {\n\tcreateCanvasComponentsController,\n\tcreateCanvasComponent,\n\tcombineCanvasComponentsAsVariants,\n\tcreateCanvasInstance,\n\tdetachCanvasInstance,\n\tresetCanvasInstanceOverrides,\n\tpushCanvasInstanceOverrides,\n\tswapCanvasInstance,\n\tsetCanvasInstanceProperties,\n\tsetCanvasComponentProperty,\n\tbindCanvasComponentProperty,\n\trestoreCanvasMainComponent,\n\taddCanvasVariant,\n\tremoveCanvasVariant,\n\tsetCanvasVariantProperties,\n\trenameCanvasVariantProperty,\n\trenameCanvasVariantValue,\n\tgetNextVariantValues,\n\tsyncCanvasComponents,\n\tsyncCanvasInstance,\n\tsyncAllCanvasInstances,\n\tlistCanvasComponents,\n\tinspectCanvasInstance,\n\tgetInstanceStatus,\n\tgetNodeOverrides,\n\tgetComponentSourceId,\n\tgetInstanceData,\n\tgetCanvasComponentDragId,\n\tisCanvasComponent,\n\tisCanvasComponentSet,\n\tisCanvasInstance,\n\twouldCreateComponentCycle,\n\tCANVAS_COMPONENT_DRAG_TYPE,\n\ttype CanvasComponentsController,\n\ttype CanvasComponentsControllerOptions,\n\ttype CanvasComponentPropertyDef,\n\ttype CanvasComponentPropertyField,\n\ttype CanvasComponentResult,\n\ttype CanvasComponentSyncOptions,\n\ttype CanvasInstanceInfo,\n\ttype CanvasComponentInfo,\n\ttype CanvasComponentSetInfo,\n\ttype AddCanvasVariantOptions,\n\ttype SetCanvasVariantPropertiesOptions,\n\t// Freehand drawing exports\n\tcreateCanvasDrawController,\n\tcreateDefaultStrokeStyle,\n\tfindStrokesAtPoint,\n\tstreamlinePoints,\n\tstrokePointsToPathData,\n\tstrokeToShapeNode,\n\ttype CanvasDrawControllerOptions,\n\ttype FreehandStroke,\n\ttype FreehandStrokeStyle,\n\ttype FreehandTool,\n\ttype StrokeToShapeNodeOptions,\n\t// Gradients\n\tCANVAS_GRADIENT_PRESETS,\n\tisCanvasGradient,\n\tparseCssGradient,\n\tresolveCanvasGradient,\n\tangleToSvgLinearCoords,\n\tgradientToSvgDef,\n\ttype GradientStop,\n\ttype CanvasLinearGradient,\n\ttype CanvasRadialGradient,\n\ttype CanvasGradientDef,\n\ttype SvgGradientStop,\n\ttype SvgGradientDef\n} from '@pixerate/editor/canvas';\n\n// Mermaid diagrams on the canvas (flowchart, state, class, ER as nodes and edges; the other\n// families as their own picture with MermaidFamilyScene), with streaming\nexport { MermaidFamilyScene, type MermaidFamilySceneProps } from './MermaidFamilyScene.js';\nexport {\n\tuseMermaidDiagram,\n\tuseMermaidStream,\n\tuseDiagramState,\n\ttype UseMermaidDiagramOptions,\n\ttype UseMermaidDiagramResult,\n\ttype UseMermaidStreamOptions,\n\ttype UseMermaidStreamResult\n} from './useMermaidDiagram.js';\n\nexport {\n\tMermaidDiagramNode,\n\tMermaidDiagramGroup,\n\tmermaidNodeStyle,\n\ttype MermaidDiagramNodeData,\n\ttype MermaidDiagramNodeProps\n} from './MermaidDiagramNode.js';\n\n// Static previews of Mermaid diagrams\nexport { MermaidThumbnail, type MermaidThumbnailProps } from './MermaidThumbnail.js';\n\n// Agent cursors acting out diagram edits\nexport { useDiagramDirector, usePresenceState, type UseDiagramDirectorOptions } from './useDiagramDirector.js';\nexport { DiagramPresenceLayer, type DiagramPresenceLayerProps } from './DiagramPresenceLayer.js';\n","import React from 'react';\nimport { getShapeRenderData, isShapeDescription, type ShapeDescription } from '@pixerate/editor/canvas';\n\nexport interface ShapeNodeProps {\n\t/** Node data; `data.shape` holds the shape description. */\n\tdata: { shape?: ShapeDescription; [key: string]: any };\n\t/** Node width / height (React Flow passes them to custom nodes). */\n\twidth?: number;\n\theight?: number;\n\tselected?: boolean;\n\tclassName?: string;\n\t/** Rendered over the shape, e.g. React Flow `<Handle>`s or a label. */\n\tchildren?: React.ReactNode;\n\t[key: string]: any;\n}\n\n/**\n * Headless shape node: draws `data.shape` as one SVG path that fills the node box.\n * Register it as a React Flow node type (`nodeTypes={{ shape: ShapeNode }}`), or wrap it\n * to add handles. Strokes keep their width when the node is resized\n * (`vector-effect: non-scaling-stroke`). Renders nothing when `data.shape` is missing.\n */\nexport function ShapeNode({ id, data, width, height, selected, className = '', children }: ShapeNodeProps) {\n\tconst shape = data?.shape;\n\tif (!isShapeDescription(shape)) return null;\n\tconst render = getShapeRenderData(shape, { width, height }, { id: id || data?.id });\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-shape-node ${className}`.trim()}\n\t\t\tdata-shape-kind={shape.kind}\n\t\t\tdata-selected={selected ? 'true' : undefined}\n\t\t\tstyle={{ position: 'relative', width: '100%', height: '100%' }}\n\t\t>\n\t\t\t<svg\n\t\t\t\tviewBox={render.viewBox}\n\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tstyle={{ display: 'block', overflow: 'visible' }}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{(render.fillGradient || render.strokeGradient) && (\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t{render.fillGradient && render.fillGradient.type === 'linear' && (\n\t\t\t\t\t\t\t<linearGradient id={render.fillGradient.id} {...render.fillGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.fillGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{render.fillGradient && render.fillGradient.type === 'radial' && (\n\t\t\t\t\t\t\t<radialGradient id={render.fillGradient.id} {...render.fillGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.fillGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{render.strokeGradient && render.strokeGradient.type === 'linear' && (\n\t\t\t\t\t\t\t<linearGradient id={render.strokeGradient.id} {...render.strokeGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.strokeGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{render.strokeGradient && render.strokeGradient.type === 'radial' && (\n\t\t\t\t\t\t\t<radialGradient id={render.strokeGradient.id} {...render.strokeGradient.attrs}>\n\t\t\t\t\t\t\t\t{render.strokeGradient.stops.map((stop, i) => (\n\t\t\t\t\t\t\t\t\t<stop key={i} offset={stop.offset} stopColor={stop.stopColor} stopOpacity={stop.stopOpacity} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</defs>\n\t\t\t\t)}\n\t\t\t\t<path\n\t\t\t\t\td={render.d}\n\t\t\t\t\ttransform={render.transform}\n\t\t\t\t\tfill={render.fill}\n\t\t\t\t\tfillRule={render.fillRule}\n\t\t\t\t\tstroke={render.stroke}\n\t\t\t\t\tstrokeWidth={render.strokeWidth}\n\t\t\t\t\tstrokeLinecap={render.strokeLinecap}\n\t\t\t\t\tstrokeLinejoin={render.strokeLinejoin}\n\t\t\t\t\topacity={render.opacity}\n\t\t\t\t\tvectorEffect=\"non-scaling-stroke\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n\tcreateCanvasAutoLayoutController,\n\ttype ArrangeHistoryTarget,\n\ttype AutoLayoutMeasure,\n\ttype CanvasNode,\n\ttype GuideLine,\n\ttype NodeRectOptions\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasAutoLayoutOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** When set, the hook's actions (add / remove / resize / reorder / apply) are undoable steps. */\n\thistory?: ArrangeHistoryTarget;\n\t/** Turns automatic relayout off (`applyAutoLayout` still works). Default `true`. */\n\tenabled?: boolean;\n\t/** Reorder flow children by dragging them within their frame (default `true`). */\n\tdragReorder?: boolean;\n\t/** Text measuring and size hooks (default: xyflow `measured` sizes). */\n\tmeasure?: AutoLayoutMeasure;\n\trectOptions?: NodeRectOptions;\n}\n\n/**\n * React hook for Figma-style auto layout on React Flow sub-flows. Frames are nodes with\n * `data.layout`; their children (`parentId`) are stacked, wrapped or placed on a grid, with\n * hug / fill / fixed sizing, min / max, padding, alignment and constraints.\n *\n * Pass every `onNodesChange` batch through `noteChanges` before applying it\n * (`onNodesChange={(c) => setNodes((n) => applyNodeChanges(autoLayout.noteChanges(c), n))}`):\n * after the nodes update the hook relayouts frames whose children were measured, resized,\n * added or removed, and turns drags of a flow child inside its frame into a reorder (one\n * undoable step). Render `guides` (the drop marker) with `<CanvasGuidesLayer>`.\n */\nexport function useCanvasAutoLayout<TNode extends CanvasNode = CanvasNode>(options: UseCanvasAutoLayoutOptions<TNode>) {\n\tconst [guides, setGuides] = useState<GuideLine[]>([]);\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasAutoLayoutController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive actions (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tget enabled() {\n\t\t\t\t\treturn optionsRef.current.enabled;\n\t\t\t\t},\n\t\t\t\tget dragReorder() {\n\t\t\t\t\treturn optionsRef.current.dragReorder;\n\t\t\t\t},\n\t\t\t\tget measure() {\n\t\t\t\t\treturn optionsRef.current.measure;\n\t\t\t\t},\n\t\t\t\tget rectOptions() {\n\t\t\t\t\treturn optionsRef.current.rectOptions;\n\t\t\t\t},\n\t\t\t\tonGuidesChange: setGuides\n\t\t\t}),\n\t\t[]\n\t);\n\n\t// Noted changes are applied once React has committed the new nodes.\n\tuseLayoutEffect(() => {\n\t\tif (controller.hasPending) controller.flush();\n\t}, [options.nodes, controller]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\t...controller,\n\t\t\t/** Drop marker of the active reorder drag (flow coordinates). */\n\t\t\tguides,\n\t\t\tget hasPending() {\n\t\t\t\treturn controller.hasPending;\n\t\t\t}\n\t\t}),\n\t\t[controller, guides]\n\t);\n}\n\nexport type CanvasAutoLayout = ReturnType<typeof useCanvasAutoLayout>;\n","import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';\nimport {\n bindCanvasToken,\n detachTokenBindings,\n getEffectiveTokenModes,\n resolveCanvasTokens,\n setCanvasTokenMode,\n type CanvasNode,\n type CanvasTokenOptions,\n} from '@pixerate/editor/canvas';\nimport type { TokenModeContext, TokenState, TokenStore } from '@pixerate/editor/tokens';\n\nexport interface UseCanvasTokensOptions<TNode extends CanvasNode> extends Omit<CanvasTokenOptions, 'modes'> {\n store: TokenStore;\n nodes: TNode[];\n setNodes: (update: TNode[] | ((nodes: TNode[]) => TNode[])) => void;\n /** Modes for nodes without an explicit mode up their tree (e.g. the page's). */\n modes?: TokenModeContext;\n}\n\nexport interface CanvasTokens {\n state: TokenState;\n /** Binds (or with `null` unbinds) a property of the nodes; throws `TokenError` when refused. */\n bind: (ids: Iterable<string>, propertyKey: string, variableId: string | null) => void;\n /** Sets (or with `null` clears) an explicit mode on frames / groups; descendants follow. */\n setMode: (ids: Iterable<string>, collectionId: string, modeId: string | null) => void;\n /** The modes a node is in (its own, inherited, then the root `modes`). */\n modesOf: (nodeId: string) => Record<string, string>;\n}\n\n/**\n * Keeps token-bound node properties resolved: whenever the token store, the nodes or the root\n * modes change, bound values are written into the nodes (only when something changed, so it\n * does not loop). Deleting a variable detaches the nodes bound to it, keeping their values.\n */\nexport function useCanvasTokens<TNode extends CanvasNode>(options: UseCanvasTokensOptions<TNode>): CanvasTokens {\n const { store, nodes, setNodes, modes, properties } = options;\n const state = useSyncExternalStore(store.subscribe, store.getState, store.getState);\n const latest = useRef({ nodes, setNodes, modes, properties });\n latest.current = { nodes, setNodes, modes, properties };\n const opts = (): CanvasTokenOptions => ({ modes: latest.current.modes, properties: latest.current.properties });\n\n useEffect(\n () =>\n store.subscribe((event) => {\n if (event.deletedVariableIds.length === 0) return;\n latest.current.setNodes((prev) => detachTokenBindings(prev, event.previous, event.deletedVariableIds, opts()));\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n\n const modesKey = JSON.stringify(modes ?? {});\n useEffect(() => {\n const next = resolveCanvasTokens(nodes, state, opts());\n if (next !== nodes) setNodes(next);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nodes, state, modesKey, properties]);\n\n const bind = useCallback(\n (ids: Iterable<string>, propertyKey: string, variableId: string | null) => {\n const next = bindCanvasToken(latest.current.nodes, ids, propertyKey, variableId, store.getState(), opts());\n if (next !== latest.current.nodes) latest.current.setNodes(next);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n const setMode = useCallback(\n (ids: Iterable<string>, collectionId: string, modeId: string | null) => {\n const next = setCanvasTokenMode(latest.current.nodes, ids, collectionId, modeId, store.getState(), opts());\n if (next !== latest.current.nodes) latest.current.setNodes(next);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n const modesOf = useCallback(\n (nodeId: string) => {\n const node = latest.current.nodes.find((n) => n.id === nodeId);\n return node ? getEffectiveTokenModes(node, latest.current.nodes, store.getState(), opts()) : {};\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store],\n );\n return { state, bind, setMode, modesOf };\n}\n","import React from 'react';\nimport {\n bindCanvasToken,\n getBindableTokenProperties,\n getEffectiveTokenModes,\n getNodeTokenBindings,\n getNodeTokenModes,\n setCanvasTokenMode,\n getTokensForProperty,\n type CanvasNode,\n type CanvasTokenOptions,\n} from '@pixerate/editor/canvas';\nimport { getCurrentMode, resolveToken, type TokenState } from '@pixerate/editor/tokens';\n\nexport interface TokenBindingPickerProps<TNode extends CanvasNode = CanvasNode> {\n state: TokenState;\n nodes: TNode[];\n /** Nodes to bind (the first one decides which properties are listed). */\n selectedIds: readonly string[];\n /** Receives the nodes with the binding applied and resolved. */\n onChange: (nodes: TNode[]) => void;\n options?: CanvasTokenOptions;\n /** Limit to these property keys (in this order). */\n properties?: readonly string[];\n onError?: (error: Error) => void;\n className?: string;\n}\n\n/**\n * Inspector rows that bind node properties (fill, stroke, opacity, radius, gap, padding, text\n * colour / size, …) to variables of the right type and scope, showing each resolved value.\n */\nexport function TokenBindingPicker<TNode extends CanvasNode = CanvasNode>({\n state,\n nodes,\n selectedIds,\n onChange,\n options = {},\n properties,\n onError,\n className = '',\n}: TokenBindingPickerProps<TNode>) {\n const selected = nodes.filter((n) => selectedIds.includes(n.id));\n const first = selected[0];\n if (!first) return null;\n let rows = getBindableTokenProperties(first, options);\n if (properties) rows = properties.map((key) => rows.find((p) => p.key === key)).filter((p): p is (typeof rows)[number] => !!p);\n const modes = getEffectiveTokenModes(first, nodes, state, options);\n\n return (\n <div data-token-binding-picker=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`}>\n {rows.map((property) => {\n const ids = new Set(selected.map((n) => getNodeTokenBindings(n)[property.key] ?? ''));\n const value = ids.size === 1 ? [...ids][0] : '__mixed';\n const candidates = getTokensForProperty(state, property, first);\n const resolved = value && value !== '__mixed' ? resolveToken(state, value, modes) : null;\n return (\n <label key={property.key} className=\"flex items-center gap-2\" data-token-property={property.key}>\n <span className=\"w-28 shrink-0 text-muted-foreground\">{property.label}</span>\n <select\n aria-label={`${property.label} variable`}\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={value}\n onChange={(e) => {\n const id = e.currentTarget.value || null;\n try {\n onChange(bindCanvasToken(nodes, selectedIds, property.key, id, state, options));\n } catch (error) {\n onError?.(error as Error);\n }\n }}\n >\n {value === '__mixed' ? <option value=\"__mixed\">Mixed</option> : null}\n <option value=\"\">None</option>\n {candidates.map((v) => {\n const collection = state.collections.find((c) => c.id === v.collectionId);\n return (\n <option key={v.id} value={v.id}>\n {v.name}\n {collection && state.collections.length > 1 ? ` (${collection.name})` : ''}\n </option>\n );\n })}\n </select>\n <span className=\"w-16 shrink-0 truncate text-right text-muted-foreground\" data-token-resolved=\"\">\n {resolved?.ok ? (\n property.type === 'color' ? (\n <span\n className=\"inline-block h-3 w-3 rounded border border-border align-middle\"\n style={{ background: String(resolved.value) }}\n title={String(resolved.value)}\n />\n ) : (\n String(resolved.value)\n )\n ) : resolved ? (\n <span title={resolved.message}>⚠</span>\n ) : null}\n </span>\n </label>\n );\n })}\n {state.collections.length === 0 ? <p className=\"text-muted-foreground\">No variables yet.</p> : null}\n </div>\n );\n}\n\nexport interface TokenModeSwitcherProps<TNode extends CanvasNode = CanvasNode> {\n state: TokenState;\n nodes: TNode[];\n /** Frames / groups whose explicit mode is set (the first one's choice is shown). */\n nodeIds: readonly string[];\n onChange: (nodes: TNode[]) => void;\n options?: CanvasTokenOptions;\n /** Show collections with a single mode too (default `false`). */\n showSingleMode?: boolean;\n className?: string;\n}\n\n/**\n * Per-collection mode pickers for the selected frames: \"Auto\" (inherit from the parent, then\n * the root modes, then the default mode) or an explicit mode that descendants inherit.\n */\nexport function TokenModeSwitcher<TNode extends CanvasNode = CanvasNode>({\n state,\n nodes,\n nodeIds,\n onChange,\n options = {},\n showSingleMode = false,\n className = '',\n}: TokenModeSwitcherProps<TNode>) {\n const first = nodes.find((n) => nodeIds.includes(n.id));\n if (!first) return null;\n const own = getNodeTokenModes(first);\n const parent = first.parentId ? nodes.find((n) => n.id === first.parentId) : undefined;\n const inherited = parent ? getEffectiveTokenModes(parent, nodes, state, options) : { ...options.modes };\n const collections = state.collections.filter((c) => showSingleMode || c.modes.length > 1);\n return (\n <div data-token-mode-switcher=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`}>\n {collections.map((collection) => {\n const auto = getCurrentMode(collection, inherited);\n const explicit = collection.modes.some((m) => m.id === own[collection.id]) ? own[collection.id] : '';\n return (\n <label key={collection.id} className=\"flex items-center gap-2\" data-token-collection={collection.id}>\n <span className=\"w-28 shrink-0 truncate text-muted-foreground\">{collection.name}</span>\n <select\n aria-label={`${collection.name} mode`}\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n value={explicit}\n onChange={(e) =>\n onChange(setCanvasTokenMode(nodes, nodeIds, collection.id, e.currentTarget.value || null, state, options))\n }\n >\n <option value=\"\">Auto ({auto.name})</option>\n {collection.modes.map((m) => (\n <option key={m.id} value={m.id}>\n {m.name}\n </option>\n ))}\n </select>\n </label>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport {\n\tcreateCanvasAnimationController,\n\ttype AnimatableProperty,\n\ttype AnimationHistoryTarget,\n\ttype AnimationLoopMode,\n\ttype CanvasNode,\n\ttype Clock\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasAnimationOptions<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** When set, keyframe edits are undoable steps. */\n\thistory?: AnimationHistoryTarget;\n\t/** Ids acted on without explicit ids (default: nodes with `selected: true`). */\n\tgetSelectedIds?: () => string[];\n\t/** Playback time source (default `realClock`); pass a `ManualClock` for tests or rendering. Read once. */\n\tclock?: Clock;\n\t/** Fixed timeline length (ms); omitted = the last keyframe, at least `minDuration`. Read once. */\n\tduration?: number;\n\tminDuration?: number;\n\tloop?: AnimationLoopMode;\n\tplaybackRate?: number;\n\tfps?: number;\n\trecording?: boolean;\n\tproperties?: readonly AnimatableProperty[];\n\tonTime?: (time: number) => void;\n}\n\n/**\n * React hook for keyframe animation on the canvas: a playhead player (play / pause / seek /\n * scrub, loop, ping-pong, rate), record mode, undoable keyframe edits, multi-keyframe drags\n * with snapping, copy / paste and CSS / Web Animations export.\n *\n * Render `displayNodes` (the nodes evaluated at the playhead) in React Flow and pass its edits\n * back through `applyDisplayChanges`:\n * `onNodesChange={(c) => animation.applyDisplayChanges(applyNodeChanges(c, animation.displayNodes))}`.\n * Animated properties are then keyed at the playhead instead of being overwritten.\n */\nexport function useCanvasAnimation<TNode extends CanvasNode = CanvasNode>(options: UseCanvasAnimationOptions<TNode>) {\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasAnimationController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive edits (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tget getSelectedIds() {\n\t\t\t\t\treturn optionsRef.current.getSelectedIds;\n\t\t\t\t},\n\t\t\t\tget properties() {\n\t\t\t\t\treturn optionsRef.current.properties;\n\t\t\t\t},\n\t\t\t\tclock: options.clock,\n\t\t\t\tduration: options.duration,\n\t\t\t\tminDuration: options.minDuration,\n\t\t\t\tloop: options.loop,\n\t\t\t\tplaybackRate: options.playbackRate,\n\t\t\t\tfps: options.fps,\n\t\t\t\trecording: options.recording,\n\t\t\t\tonTime: (time) => optionsRef.current.onTime?.(time)\n\t\t\t}),\n\t\t[]\n\t);\n\n\tuseEffect(() => () => controller.destroy(), [controller]);\n\n\t// Option changes after mount.\n\tuseEffect(() => {\n\t\tif (options.loop !== undefined) controller.setLoop(options.loop);\n\t}, [controller, options.loop]);\n\tuseEffect(() => {\n\t\tif (options.playbackRate !== undefined) controller.setPlaybackRate(options.playbackRate);\n\t}, [controller, options.playbackRate]);\n\tuseEffect(() => {\n\t\tif (options.recording !== undefined) controller.setRecording(options.recording);\n\t}, [controller, options.recording]);\n\n\tconst state = useSyncExternalStore(\n\t\t(listener) => controller.subscribe(listener),\n\t\t() => controller.getState(),\n\t\t() => controller.getState()\n\t);\n\n\t// The automatic duration follows the nodes.\n\tuseEffect(() => {\n\t\tcontroller.refresh();\n\t}, [controller, options.nodes]);\n\n\tconst displayNodes = useMemo(() => controller.display(options.nodes), [controller, options.nodes, state.time]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\t...controller,\n\t\t\tstate,\n\t\t\ttime: state.time,\n\t\t\tplaying: state.playing,\n\t\t\trecording: state.recording,\n\t\t\tduration: state.duration,\n\t\t\tselection: state.selection,\n\t\t\tdrag: state.drag,\n\t\t\t/** The nodes evaluated at the playhead; render these. */\n\t\t\tdisplayNodes,\n\t\t\tget clipboard() {\n\t\t\t\treturn controller.clipboard;\n\t\t\t}\n\t\t}),\n\t\t[controller, state, displayNodes]\n\t);\n}\n\nexport type CanvasAnimation<TNode extends CanvasNode = CanvasNode> = ReturnType<typeof useCanvasAnimation<TNode>>;\n","import React, { useEffect, useRef } from 'react';\nimport {\n\tANIMATION_EASING_LABELS,\n\tANIMATION_EASING_PRESETS,\n\tformatAnimationTime,\n\tgetTimelineTicks,\n\ttimeToX,\n\txToTime,\n\ttype AnimationLoopMode,\n\ttype CanvasNode,\n\ttype KeyframeRef\n} from '@pixerate/editor/canvas';\nimport type { CanvasAnimation } from './useCanvasAnimation.js';\n\nexport interface AnimationTimelineProps {\n\t/** The `useCanvasAnimation` result. */\n\tanimation: CanvasAnimation<any>;\n\t/** Nodes whose tracks are listed (default: the selected nodes). */\n\tnodeIds?: readonly string[];\n\t/** Width of the keyframe lanes in px (default 360). */\n\twidth?: number;\n\t/** Snap distance in screen px while dragging keyframes (default 8; hold Alt to turn snapping off). */\n\tsnapThreshold?: number;\n\tlabelOf?: (node: CanvasNode) => string;\n\tclassName?: string;\n}\n\nconst LOOP_LABELS: Record<AnimationLoopMode, string> = { none: 'Once', loop: 'Loop', 'ping-pong': 'Ping-pong' };\nconst easingValue = (easing: unknown) => (typeof easing === 'string' ? easing : easing ? 'custom' : 'linear');\n\n/**\n * Compact timeline: play / pause, record toggle, playhead ruler (drag to scrub), one lane per\n * animated property of the selected nodes with draggable keyframe diamonds (snapping to other\n * keys, the playhead and frames; Shift-click adds to the selection, Escape cancels a drag,\n * Delete removes), an easing picker for the selected keyframes and the loop mode.\n */\nexport function AnimationTimeline({ animation, nodeIds, width = 360, snapThreshold = 8, labelOf, className = '' }: AnimationTimelineProps) {\n\tconst { state } = animation;\n\tconst duration = state.duration;\n\tconst rows = animation.timelineRows(nodeIds ?? undefined, labelOf ? { labelOf } : {});\n\tconst ticks = getTimelineTicks(duration, width);\n\tconst selectedEasing = (() => {\n\t\tconst first = state.selection[0];\n\t\tif (!first) return '';\n\t\tfor (const row of rows) for (const k of row.keyframes) if (k.selected && k.ref.property === first.property && k.ref.nodeId === first.nodeId) return easingValue(k.easing);\n\t\treturn '';\n\t})();\n\tconst dragRef = useRef<{ startX: number } | null>(null);\n\n\tuseEffect(() => {\n\t\tconst onKey = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape' && dragRef.current) {\n\t\t\t\tdragRef.current = null;\n\t\t\t\tanimation.cancelKeyframeDrag();\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('keydown', onKey);\n\t\treturn () => window.removeEventListener('keydown', onKey);\n\t}, [animation]);\n\n\tconst onRulerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n\t\tconst lane = event.currentTarget;\n\t\tconst left = lane.getBoundingClientRect().left;\n\t\tanimation.scrub(xToTime(event.clientX - left, duration, width));\n\t\tconst move = (e: PointerEvent) => animation.scrub(xToTime(e.clientX - left, duration, width));\n\t\tconst up = () => {\n\t\t\twindow.removeEventListener('pointermove', move);\n\t\t\twindow.removeEventListener('pointerup', up);\n\t\t\tanimation.endScrub();\n\t\t};\n\t\twindow.addEventListener('pointermove', move);\n\t\twindow.addEventListener('pointerup', up);\n\t};\n\n\tconst onKeyDown = (ref: KeyframeRef) => (event: React.PointerEvent<HTMLButtonElement>) => {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tif (event.shiftKey || event.metaKey || event.ctrlKey) {\n\t\t\tanimation.selectKeyframes([ref], 'toggle');\n\t\t\treturn;\n\t\t}\n\t\tanimation.beginKeyframeDrag([ref]);\n\t\tdragRef.current = { startX: event.clientX };\n\t\tconst msPerPx = width > 0 ? duration / width : 0;\n\t\tconst move = (e: PointerEvent) => {\n\t\t\tif (!dragRef.current) return;\n\t\t\tanimation.updateKeyframeDrag((e.clientX - dragRef.current.startX) * msPerPx, { snap: !e.altKey, thresholdMs: snapThreshold * msPerPx });\n\t\t};\n\t\tconst up = () => {\n\t\t\twindow.removeEventListener('pointermove', move);\n\t\t\twindow.removeEventListener('pointerup', up);\n\t\t\tif (!dragRef.current) return;\n\t\t\tdragRef.current = null;\n\t\t\tanimation.endKeyframeDrag();\n\t\t};\n\t\twindow.addEventListener('pointermove', move);\n\t\twindow.addEventListener('pointerup', up);\n\t};\n\n\tconst onTimelineKey = (event: React.KeyboardEvent) => {\n\t\tif ((event.key === 'Delete' || event.key === 'Backspace') && state.selection.length > 0) {\n\t\t\tevent.preventDefault();\n\t\t\tanimation.deleteKeyframes();\n\t\t}\n\t};\n\n\tconst btn = 'rounded border border-border px-2 py-0.5 text-xs hover:bg-muted disabled:opacity-50';\n\tconst playheadX = timeToX(state.time, duration, width);\n\tconst labelWidth = 120;\n\n\treturn (\n\t\t<div data-animation-timeline=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`} tabIndex={0} onKeyDown={onTimelineKey}>\n\t\t\t<div className=\"flex flex-wrap items-center gap-2\" role=\"toolbar\" aria-label=\"Animation\">\n\t\t\t\t<button type=\"button\" className={btn} data-action=\"toggle-play\" aria-label={state.playing ? 'Pause' : 'Play'} onClick={() => animation.toggle()}>\n\t\t\t\t\t{state.playing ? '❚❚' : '▶'}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={`${btn} ${state.recording ? 'text-red-500' : ''}`}\n\t\t\t\t\tdata-action=\"record\"\n\t\t\t\t\taria-pressed={state.recording}\n\t\t\t\t\taria-label=\"Record keyframes\"\n\t\t\t\t\tonClick={() => animation.toggleRecording()}\n\t\t\t\t>\n\t\t\t\t\t● Rec\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" className={btn} data-action=\"add-keyframe\" onClick={() => animation.addKeyframe()}>\n\t\t\t\t\t◆ Key\n\t\t\t\t</button>\n\t\t\t\t<span data-time=\"\" className=\"tabular-nums text-muted-foreground\">\n\t\t\t\t\t{formatAnimationTime(state.time)} / {formatAnimationTime(duration)}\n\t\t\t\t</span>\n\t\t\t\t<select\n\t\t\t\t\taria-label=\"Easing\"\n\t\t\t\t\tdata-easing-picker=\"\"\n\t\t\t\t\tclassName=\"rounded border border-border bg-background px-1 py-0.5\"\n\t\t\t\t\tvalue={selectedEasing}\n\t\t\t\t\tdisabled={state.selection.length === 0}\n\t\t\t\t\tonChange={(e) => e.target.value && e.target.value !== 'custom' && animation.setEasing(e.target.value)}\n\t\t\t\t>\n\t\t\t\t\t<option value=\"\">Easing…</option>\n\t\t\t\t\t{ANIMATION_EASING_PRESETS.map((preset) => (\n\t\t\t\t\t\t<option key={preset} value={preset}>\n\t\t\t\t\t\t\t{ANIMATION_EASING_LABELS[preset]}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t\t{selectedEasing === 'custom' ? <option value=\"custom\">Custom</option> : null}\n\t\t\t\t</select>\n\t\t\t\t<select\n\t\t\t\t\taria-label=\"Loop\"\n\t\t\t\t\tdata-loop-picker=\"\"\n\t\t\t\t\tclassName=\"rounded border border-border bg-background px-1 py-0.5\"\n\t\t\t\t\tvalue={state.loop}\n\t\t\t\t\tonChange={(e) => animation.setLoop(e.target.value as AnimationLoopMode)}\n\t\t\t\t>\n\t\t\t\t\t{(Object.keys(LOOP_LABELS) as AnimationLoopMode[]).map((mode) => (\n\t\t\t\t\t\t<option key={mode} value={mode}>\n\t\t\t\t\t\t\t{LOOP_LABELS[mode]}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t\t<div className=\"flex\">\n\t\t\t\t<div style={{ width: labelWidth }} className=\"shrink-0\" />\n\t\t\t\t<div\n\t\t\t\t\tdata-timeline-ruler=\"\"\n\t\t\t\t\tclassName=\"relative h-5 cursor-ew-resize border-b border-border\"\n\t\t\t\t\tstyle={{ width }}\n\t\t\t\t\tonPointerDown={onRulerDown}\n\t\t\t\t>\n\t\t\t\t\t{ticks.map((tick) => (\n\t\t\t\t\t\t<span key={tick.time} className=\"absolute top-0 -translate-x-1/2 text-[10px] text-muted-foreground\" style={{ left: tick.x }}>\n\t\t\t\t\t\t\t{tick.label}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t\t<div data-playhead=\"\" className=\"absolute top-0 h-5 w-px bg-red-500\" style={{ left: playheadX }} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<p className=\"text-muted-foreground\" data-timeline-empty=\"\">\n\t\t\t\t\tSelect an animated node, or press ◆ Key to add a keyframe.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\trows.map((row) => (\n\t\t\t\t\t<div key={row.id} className=\"flex items-center\" data-track={row.id}>\n\t\t\t\t\t\t<label className=\"flex shrink-0 items-center gap-1 truncate pr-2\" style={{ width: labelWidth }} title={`${row.nodeLabel} · ${row.label}`}>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\taria-label={`Enable ${row.label}`}\n\t\t\t\t\t\t\t\tchecked={row.enabled}\n\t\t\t\t\t\t\t\tonChange={(e) => animation.setTrackEnabled(row.nodeId, row.property, e.target.checked)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span className=\"truncate\">{rows.filter((r) => r.nodeId === row.nodeId).length < rows.length ? `${row.nodeLabel} · ` : ''}{row.label}</span>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<div data-lane=\"\" className={`relative h-5 rounded bg-muted/40 ${row.enabled ? '' : 'opacity-50'}`} style={{ width }}>\n\t\t\t\t\t\t\t<div className=\"pointer-events-none absolute top-0 h-5 w-px bg-red-500/60\" style={{ left: playheadX }} />\n\t\t\t\t\t\t\t{state.drag?.target != null ? (\n\t\t\t\t\t\t\t\t<div data-snap-target=\"\" className=\"pointer-events-none absolute top-0 h-5 w-px bg-sky-400\" style={{ left: timeToX(state.drag.target, duration, width) }} />\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{row.keyframes.map((k) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={k.ref.time}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-keyframe={k.ref.time}\n\t\t\t\t\t\t\t\t\taria-pressed={k.selected}\n\t\t\t\t\t\t\t\t\taria-label={`${row.label} keyframe at ${formatAnimationTime(k.ref.time)}`}\n\t\t\t\t\t\t\t\t\ttitle={`${formatAnimationTime(k.time)} · ${String(k.value)}`}\n\t\t\t\t\t\t\t\t\tclassName={`absolute top-1/2 h-2.5 w-2.5 -translate-x-1/2 -translate-y-1/2 rotate-45 border ${\n\t\t\t\t\t\t\t\t\t\tk.selected ? 'border-sky-300 bg-sky-500' : 'border-foreground/60 bg-background'\n\t\t\t\t\t\t\t\t\t} ${k.easing === 'hold' ? 'rounded-none' : 'rounded-[1px]'}`}\n\t\t\t\t\t\t\t\t\tstyle={{ left: timeToX(k.time, duration, width) }}\n\t\t\t\t\t\t\t\t\tonPointerDown={onKeyDown(k.ref)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useLayoutEffect, useMemo, useRef } from 'react';\nimport {\n\tcreateCanvasComponentsController,\n\ttype ArrangeHistoryTarget,\n\ttype CanvasComponentSyncOptions,\n\ttype CanvasNode\n} from '@pixerate/editor/canvas';\n\nexport interface UseCanvasComponentsOptions<TNode extends CanvasNode = CanvasNode> extends CanvasComponentSyncOptions {\n\tnodes: TNode[];\n\tsetNodes: (updater: TNode[] | ((prev: TNode[]) => TNode[])) => void;\n\t/** When set, every component action is one undoable step. */\n\thistory?: ArrangeHistoryTarget;\n\t/** The selection (default: nodes with `selected`). */\n\tgetSelectedIds?: () => string[];\n\t/** Called by `goToMainComponent` with the main (e.g. to pan the viewport to it). */\n\tonReveal?: (node: TNode) => void;\n\t/** Sync instances with their mains after every node change (default `true`). */\n\tautoSync?: boolean;\n}\n\n/**\n * React hook for Figma-style components and instances on a React Flow canvas. After every\n * node change it records edits inside instances as overrides and rebuilds the instances of\n * edited main components (keeping overrides). Its actions (`createComponent`,\n * `createInstance`, `combineAsVariants`, `detachInstance`, `resetOverrides`, `pushOverrides`,\n * `swapInstance`, `setInstanceProperties`, `restoreMainComponent`, …) are undoable steps\n * with a `history`, and each has a `can…` check returning `true` or the reason it can't run.\n */\nexport function useCanvasComponents<TNode extends CanvasNode = CanvasNode>(options: UseCanvasComponentsOptions<TNode>) {\n\tconst nodesRef = useRef(options.nodes);\n\tnodesRef.current = options.nodes;\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tconst controller = useMemo(\n\t\t() =>\n\t\t\tcreateCanvasComponentsController<TNode>({\n\t\t\t\tgetNodes: () => nodesRef.current,\n\t\t\t\tsetNodes: (next) => {\n\t\t\t\t\t// Keep the ref current so consecutive actions (and undo) see the latest nodes.\n\t\t\t\t\tnodesRef.current = next;\n\t\t\t\t\toptionsRef.current.setNodes(next);\n\t\t\t\t},\n\t\t\t\tget history() {\n\t\t\t\t\treturn optionsRef.current.history;\n\t\t\t\t},\n\t\t\t\tget getSelectedIds() {\n\t\t\t\t\treturn optionsRef.current.getSelectedIds;\n\t\t\t\t},\n\t\t\t\tonReveal: (node) => optionsRef.current.onReveal?.(node),\n\t\t\t\tget idGenerator() {\n\t\t\t\t\treturn optionsRef.current.idGenerator;\n\t\t\t\t},\n\t\t\t\tget textTypes() {\n\t\t\t\t\treturn optionsRef.current.textTypes;\n\t\t\t\t},\n\t\t\t\tget layout() {\n\t\t\t\t\treturn optionsRef.current.layout;\n\t\t\t\t},\n\t\t\t\tget tokens() {\n\t\t\t\t\treturn optionsRef.current.tokens;\n\t\t\t\t}\n\t\t\t}),\n\t\t[]\n\t);\n\n\t// Edits are synced once React has committed the new nodes.\n\tuseLayoutEffect(() => {\n\t\tif (optionsRef.current.autoSync !== false) controller.sync();\n\t}, [options.nodes, controller]);\n\n\treturn controller;\n}\n\nexport type CanvasComponents<TNode extends CanvasNode = CanvasNode> = ReturnType<typeof useCanvasComponents<TNode>>;\n","import React, { useState } from 'react';\nimport {\n\tCANVAS_COMPONENT_DRAG_TYPE,\n\tinspectCanvasInstance,\n\tlistCanvasComponents,\n\ttype CanvasComponentsController,\n\ttype CanvasNode\n} from '@pixerate/editor/canvas';\n\n/** The variant-editing actions the components panel runs (a components controller or hook satisfies it). */\nexport type CanvasComponentsPanelActions = Pick<\n\tCanvasComponentsController<any>,\n\t'addVariant' | 'removeVariant' | 'setVariantProperties' | 'renameVariantProperty' | 'renameVariantValue'\n>;\n\nexport interface CanvasComponentsPanelProps<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\t/** Inserts an instance of a component (or a set's default variant); called on click. */\n\tonInsert: (componentId: string) => void;\n\t/**\n\t * Variant editing: with it, sets get \"+ Variant\" and a properties editor (rename properties\n\t * and values inline), and variants a menu (also on right click) to edit, duplicate or remove them.\n\t */\n\tcomponents?: CanvasComponentsPanelActions;\n\t/** Receives refusals (e.g. a duplicate variant combination). */\n\tonError?: (reason: string) => void;\n\t/** Show the search field (default `true`). */\n\tsearch?: boolean;\n\tclassName?: string;\n}\n\ntype Outcome = { ok: boolean; reason?: string } | undefined;\n\n/** A text field that commits on blur / Enter when its value changed (Escape reverts). */\nfunction InlineField({ value, label, onCommit }: { value: string; label: string; onCommit: (next: string) => void }) {\n\treturn (\n\t\t<input\n\t\t\tkey={value}\n\t\t\ttype=\"text\"\n\t\t\taria-label={label}\n\t\t\tdefaultValue={value}\n\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\tonBlur={(e) => {\n\t\t\t\tconst next = e.currentTarget.value.trim();\n\t\t\t\tif (next && next !== value) onCommit(next);\n\t\t\t\telse e.currentTarget.value = value;\n\t\t\t}}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === 'Enter') e.currentTarget.blur();\n\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\te.currentTarget.value = value;\n\t\t\t\t\te.currentTarget.blur();\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t);\n}\n\n/**\n * Components panel: component sets (with their variants) and lone components. Click one to\n * insert an instance, or drag it onto the canvas (the drag carries the id as\n * `CANVAS_COMPONENT_DRAG_TYPE`; read it with `getCanvasComponentDragId`). With `components`,\n * sets and variants can be edited: \"+ Variant\", rename properties / values, edit, duplicate or\n * remove a variant.\n */\nexport function CanvasComponentsPanel<TNode extends CanvasNode = CanvasNode>({\n\tnodes,\n\tonInsert,\n\tcomponents,\n\tonError,\n\tsearch = true,\n\tclassName = ''\n}: CanvasComponentsPanelProps<TNode>) {\n\tconst [query, setQuery] = useState('');\n\tconst [propsOpen, setPropsOpen] = useState<string | null>(null);\n\tconst [menuFor, setMenuFor] = useState<string | null>(null);\n\tconst [editing, setEditing] = useState<string | null>(null);\n\tconst { components: all, sets } = listCanvasComponents(nodes);\n\tconst q = query.trim().toLowerCase();\n\tconst match = (name: string) => !q || name.toLowerCase().includes(q);\n\tconst lone = all.filter((c) => !c.setId && match(c.name));\n\tconst shownSets = sets.filter((s) => match(s.name) || s.variants.some((v) => match(v.name)));\n\tconst report = (result: Outcome) => {\n\t\tif (result && !result.ok && result.reason) onError?.(result.reason);\n\t\treturn !!result?.ok;\n\t};\n\tconst small = 'shrink-0 rounded px-1 text-[10px] text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-40';\n\tconst menuItem = 'rounded px-2 py-0.5 text-left hover:bg-muted disabled:opacity-40';\n\tconst item = (id: string, name: string, count: number, extra: Record<string, string> = {}, onContextMenu?: (e: React.MouseEvent) => void) => (\n\t\t<button\n\t\t\tkey={id}\n\t\t\ttype=\"button\"\n\t\t\tdraggable\n\t\t\tdata-component-id={id}\n\t\t\t{...extra}\n\t\t\tclassName=\"flex w-full min-w-0 items-center justify-between gap-2 rounded px-2 py-1 text-left text-xs hover:bg-muted\"\n\t\t\ttitle={`Insert an instance of ${name}`}\n\t\t\tonClick={() => onInsert(id)}\n\t\t\tonContextMenu={onContextMenu}\n\t\t\tonDragStart={(e) => {\n\t\t\t\te.dataTransfer.setData(CANVAS_COMPONENT_DRAG_TYPE, id);\n\t\t\t\te.dataTransfer.setData('text/plain', name);\n\t\t\t\te.dataTransfer.effectAllowed = 'copy';\n\t\t\t}}\n\t\t>\n\t\t\t<span className=\"truncate\">\n\t\t\t\t<span aria-hidden className=\"mr-1 text-muted-foreground\">\n\t\t\t\t\t◇\n\t\t\t\t</span>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t\t<span className=\"text-[10px] text-muted-foreground\" data-instance-count=\"\">\n\t\t\t\t{count}\n\t\t\t</span>\n\t\t</button>\n\t);\n\treturn (\n\t\t<div data-components-panel=\"\" className={`flex flex-col gap-1 text-xs text-foreground ${className}`}>\n\t\t\t{search ? (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\taria-label=\"Search components\"\n\t\t\t\t\tplaceholder=\"Search components\"\n\t\t\t\t\tclassName=\"rounded border border-border bg-background px-2 py-1 text-xs\"\n\t\t\t\t\tonInput={(e) => setQuery((e.target as HTMLInputElement).value)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t{shownSets.map((set) => (\n\t\t\t\t<div key={set.id} data-component-set={set.id} className=\"flex flex-col\">\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t{item(set.id, set.name, set.variants.reduce((sum, v) => sum + v.instanceCount, 0), { 'data-kind': 'set' })}\n\t\t\t\t\t\t{components ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={small}\n\t\t\t\t\t\t\t\t\tdata-action=\"add-variant\"\n\t\t\t\t\t\t\t\t\taria-label={`Add a variant to ${set.name}`}\n\t\t\t\t\t\t\t\t\ttitle=\"Add a variant (duplicates the default variant)\"\n\t\t\t\t\t\t\t\t\tonClick={() => report(components.addVariant(set.id))}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t+&nbsp;Variant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={small}\n\t\t\t\t\t\t\t\t\tdata-action=\"variant-properties\"\n\t\t\t\t\t\t\t\t\taria-expanded={propsOpen === set.id}\n\t\t\t\t\t\t\t\t\taria-label={`Edit the variant properties of ${set.name}`}\n\t\t\t\t\t\t\t\t\ttitle=\"Rename variant properties and values\"\n\t\t\t\t\t\t\t\t\tonClick={() => setPropsOpen(propsOpen === set.id ? null : set.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t⚙\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\t\t\t\t\t{components && propsOpen === set.id ? (\n\t\t\t\t\t\t<div data-variant-properties={set.id} className=\"ml-3 flex flex-col gap-1 border-l border-border py-1 pl-2\">\n\t\t\t\t\t\t\t{set.options.map((option) => (\n\t\t\t\t\t\t\t\t<div key={option.name} data-variant-option={option.name} className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t<InlineField\n\t\t\t\t\t\t\t\t\t\tvalue={option.name}\n\t\t\t\t\t\t\t\t\t\tlabel={`Rename property ${option.name}`}\n\t\t\t\t\t\t\t\t\t\tonCommit={(next) => report(components.renameVariantProperty(option.name, next, set.id))}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<div className=\"ml-2 flex flex-wrap gap-1\">\n\t\t\t\t\t\t\t\t\t\t{option.values.map((value) => (\n\t\t\t\t\t\t\t\t\t\t\t<InlineField\n\t\t\t\t\t\t\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\t\t\tlabel={`Rename ${option.name} value ${value}`}\n\t\t\t\t\t\t\t\t\t\t\t\tonCommit={(next) => report(components.renameVariantValue(option.name, value, next, set.id))}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"ml-3 flex flex-col border-l border-border pl-1\">\n\t\t\t\t\t\t{set.variants.map((v) => (\n\t\t\t\t\t\t\t<div key={v.id} data-variant-row={v.id} className=\"flex flex-col\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t{item(\n\t\t\t\t\t\t\t\t\t\tv.id,\n\t\t\t\t\t\t\t\t\t\tv.name,\n\t\t\t\t\t\t\t\t\t\tv.instanceCount,\n\t\t\t\t\t\t\t\t\t\t{ 'data-kind': 'variant' },\n\t\t\t\t\t\t\t\t\t\tcomponents\n\t\t\t\t\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(v.id);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{components ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={small}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"variant-menu\"\n\t\t\t\t\t\t\t\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\t\t\t\t\t\t\t\taria-expanded={menuFor === v.id}\n\t\t\t\t\t\t\t\t\t\t\taria-label={`Variant actions for ${v.name}`}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setMenuFor(menuFor === v.id ? null : v.id)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t⋯\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{components && menuFor === v.id ? (\n\t\t\t\t\t\t\t\t\t<div role=\"menu\" data-variant-menu={v.id} className=\"ml-2 flex flex-col rounded border border-border bg-background p-1 shadow\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={menuItem}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"edit-variant\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetEditing(v.id);\n\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(null);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tEdit values…\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={menuItem}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"duplicate-variant\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(null);\n\t\t\t\t\t\t\t\t\t\t\t\treport(components.addVariant(set.id, { from: v.id }));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tDuplicate\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={menuItem}\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"remove-variant\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={set.variants.length < 2}\n\t\t\t\t\t\t\t\t\t\t\ttitle={set.variants.length < 2 ? 'A component set needs at least one variant.' : 'Its instances switch to the closest variant'}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetMenuFor(null);\n\t\t\t\t\t\t\t\t\t\t\t\treport(components.removeVariant(v.id));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tRemove variant\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{components && editing === v.id ? (\n\t\t\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\t\t\tdata-variant-editor={v.id}\n\t\t\t\t\t\t\t\t\t\tclassName=\"ml-2 flex flex-col gap-1 py-1\"\n\t\t\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\tconst values: Record<string, string> = {};\n\t\t\t\t\t\t\t\t\t\t\tfor (const input of e.currentTarget.querySelectorAll<HTMLInputElement>('input[data-variant-value]')) {\n\t\t\t\t\t\t\t\t\t\t\t\tvalues[input.dataset.variantValue!] = input.value;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (report(components.setVariantProperties(values, v.id))) setEditing(null);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{set.options.map((option) => (\n\t\t\t\t\t\t\t\t\t\t\t<label key={option.name} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"w-16 shrink-0 truncate text-muted-foreground\">{option.name}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-variant-value={option.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`${option.name} value`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultValue={v.variant?.[option.name] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" className=\"rounded border border-border px-2 py-0.5 hover:bg-muted\" data-action=\"save-variant\">\n\t\t\t\t\t\t\t\t\t\t\t\tSave\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" className=\"rounded px-2 py-0.5 hover:bg-muted\" data-action=\"cancel-variant\" onClick={() => setEditing(null)}>\n\t\t\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t\t{lone.map((c) => item(c.id, c.name, c.instanceCount, { 'data-kind': 'component' }))}\n\t\t\t{all.length === 0 ? <p className=\"text-muted-foreground\">No components yet. Select a frame and choose Create Component.</p> : null}\n\t\t</div>\n\t);\n}\n\n/** The actions the instance inspector runs (a components controller or hook satisfies it). */\nexport type CanvasInstanceInspectorActions = Pick<\n\tCanvasComponentsController<any>,\n\t'setInstanceProperties' | 'resetOverrides' | 'detachInstance' | 'goToMainComponent' | 'pushOverrides' | 'restoreMainComponent'\n>;\n\nexport interface CanvasInstanceInspectorProps<TNode extends CanvasNode = CanvasNode> {\n\tnodes: TNode[];\n\t/** An instance, or a layer inside one; nothing is shown otherwise. */\n\tnodeId: string | null | undefined;\n\tcomponents: CanvasInstanceInspectorActions;\n\t/** Receives refusals (e.g. a property value that would nest a component in itself). */\n\tonError?: (reason: string) => void;\n\tclassName?: string;\n}\n\n/**\n * Instance inspector: main component (or \"missing main\" with Restore), variant pickers,\n * component property controls, the overrides of its layers (each resettable), and Reset all,\n * Detach, Go to main and Push changes.\n */\nexport function CanvasInstanceInspector<TNode extends CanvasNode = CanvasNode>({\n\tnodes,\n\tnodeId,\n\tcomponents,\n\tonError,\n\tclassName = ''\n}: CanvasInstanceInspectorProps<TNode>) {\n\tconst info = nodeId ? inspectCanvasInstance(nodes, nodeId) : undefined;\n\tif (!info) return null;\n\tconst report = (result: { ok: boolean; reason?: string } | undefined) => {\n\t\tif (result && !result.ok && result.reason) onError?.(result.reason);\n\t};\n\tconst setProp = (name: string, value: unknown) => report(components.setInstanceProperties({ [name]: value }, [info.id]));\n\tconst allComponents = listCanvasComponents(nodes).components;\n\tconst linked = info.status === 'linked';\n\tconst btn = 'rounded border border-border px-2 py-0.5 text-xs hover:bg-muted disabled:opacity-40';\n\treturn (\n\t\t<div data-instance-inspector=\"\" data-instance-id={info.id} className={`flex flex-col gap-2 text-xs text-foreground ${className}`}>\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<span className=\"truncate font-medium\" data-instance-main=\"\">\n\t\t\t\t\t{linked ? info.componentName : 'Main component missing'}\n\t\t\t\t</span>\n\t\t\t\t{info.nested ? <span className=\"text-muted-foreground\">Nested</span> : null}\n\t\t\t</div>\n\t\t\t{info.variantOptions.map((option) => (\n\t\t\t\t<label key={option.name} className=\"flex items-center gap-2\" data-variant-property={option.name}>\n\t\t\t\t\t<span className=\"w-24 shrink-0 truncate text-muted-foreground\">{option.name}</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\taria-label={`${option.name} variant`}\n\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\tvalue={info.variant[option.name] ?? ''}\n\t\t\t\t\t\tonChange={(e) => setProp(option.name, e.currentTarget.value)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{option.values.map((v) => (\n\t\t\t\t\t\t\t<option key={v} value={v}>\n\t\t\t\t\t\t\t\t{v}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t))}\n\t\t\t{info.properties.map((p) => (\n\t\t\t\t<label key={p.name} className=\"flex items-center gap-2\" data-component-property={p.name}>\n\t\t\t\t\t<span className=\"w-24 shrink-0 truncate text-muted-foreground\">{p.name}</span>\n\t\t\t\t\t{p.type === 'boolean' ? (\n\t\t\t\t\t\t<input type=\"checkbox\" aria-label={p.name} checked={p.value === true} onChange={(e) => setProp(p.name, e.currentTarget.checked)} />\n\t\t\t\t\t) : p.type === 'text' ? (\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tkey={String(p.value)}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\taria-label={p.name}\n\t\t\t\t\t\t\tdefaultValue={String(p.value)}\n\t\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\t\tonBlur={(e) => {\n\t\t\t\t\t\t\t\tif (e.currentTarget.value !== p.value) setProp(p.name, e.currentTarget.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter') e.currentTarget.blur();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\taria-label={p.name}\n\t\t\t\t\t\t\tclassName=\"min-w-0 flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs\"\n\t\t\t\t\t\t\tvalue={String(p.value)}\n\t\t\t\t\t\t\tonChange={(e) => setProp(p.name, e.currentTarget.value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{allComponents\n\t\t\t\t\t\t\t\t.filter((c) => !p.preferred?.length || p.preferred.includes(c.id) || c.id === p.value)\n\t\t\t\t\t\t\t\t.map((c) => (\n\t\t\t\t\t\t\t\t\t<option key={c.id} value={c.id}>\n\t\t\t\t\t\t\t\t\t\t{c.name}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t)}\n\t\t\t\t</label>\n\t\t\t))}\n\t\t\t{info.overrides.length ? (\n\t\t\t\t<div className=\"flex flex-col gap-1\" data-instance-overrides=\"\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">Overrides</span>\n\t\t\t\t\t{info.overrides.map((o) => (\n\t\t\t\t\t\t<div key={o.id} className=\"flex flex-wrap items-center gap-1\" data-override-layer={o.id}>\n\t\t\t\t\t\t\t<span className=\"mr-1 truncate\">{o.name}</span>\n\t\t\t\t\t\t\t{o.groups.map((g) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={g}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"rounded bg-muted px-1 text-[10px]\"\n\t\t\t\t\t\t\t\t\tdata-override-group={g}\n\t\t\t\t\t\t\t\t\ttitle={`Reset ${g}`}\n\t\t\t\t\t\t\t\t\tonClick={() => report(components.resetOverrides(o.id, g))}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{g} ×\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{linked ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button type=\"button\" className={btn} data-action=\"reset\" onClick={() => report(components.resetOverrides(info.id))}>\n\t\t\t\t\t\t\tReset all\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" className={btn} data-action=\"go-to-main\" onClick={() => components.goToMainComponent(info.id)}>\n\t\t\t\t\t\t\tGo to main\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={btn}\n\t\t\t\t\t\t\tdata-action=\"push\"\n\t\t\t\t\t\t\tdisabled={info.overrides.length === 0}\n\t\t\t\t\t\t\tonClick={() => report(components.pushOverrides(info.rootId))}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tPush changes\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<button type=\"button\" className={btn} data-action=\"restore\" onClick={() => report(components.restoreMainComponent(info.rootId))}>\n\t\t\t\t\t\tRestore main component\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={btn}\n\t\t\t\t\tdata-action=\"detach\"\n\t\t\t\t\tdisabled={info.nested}\n\t\t\t\t\ttitle={info.nested ? 'Detach the outer instance first' : undefined}\n\t\t\t\t\tonClick={() => report(components.detachInstance([info.id]))}\n\t\t\t\t>\n\t\t\t\t\tDetach\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React, { useId } from 'react';\nimport { diagramTextBaseline, type DiagramMark, type DiagramScene } from '@pixerate/editor/canvas';\n\nexport interface MermaidFamilySceneProps {\n\t/** The family's picture (`useMermaidDiagram().scene`, or `mermaidToScene`). */\n\tscene: DiagramScene;\n\t/** Room around the drawing in px (default 16). */\n\tpadding?: number;\n\t/** Marks with a target get a pointer and report clicks (default true). */\n\tinteractive?: boolean;\n\t/** A mark was clicked: its node, edge, group or `::title` target (null: the background). */\n\tonSelect?: (target: string | null, event: React.MouseEvent) => void;\n\t/** A mark was double-clicked (rename it with `diagramRenameOp`). */\n\tonOpen?: (target: string, event: React.MouseEvent) => void;\n\t/** Colour of selected marks' outline (default `var(--primary, #2563eb)`). */\n\tselectionColor?: string;\n\t/** Arrow head colour (default `var(--muted-foreground, #64748b)`). */\n\tmarkerColor?: string;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\t/** Accessible name (default: the family). */\n\ttitle?: string;\n}\n\n/**\n * Headless renderer for a Mermaid family drawn as its own picture (pie, Gantt, sequence,\n * quadrant, timeline, journey, gitGraph, mindmap, C4, architecture, XY and radar charts):\n * one SVG of the scene's marks, sized to the drawing. Clicking a mark selects its node,\n * edge or group; double-clicking opens it for renaming.\n */\nexport function MermaidFamilyScene({\n\tscene,\n\tpadding = 16,\n\tinteractive = true,\n\tonSelect,\n\tonOpen,\n\tselectionColor = 'var(--primary, #2563eb)',\n\tmarkerColor = 'var(--muted-foreground, #64748b)',\n\tclassName = '',\n\tstyle,\n\ttitle\n}: MermaidFamilySceneProps) {\n\tconst uid = useId().replace(/:/g, '');\n\tconst marker = (kind?: 'arrow' | 'arrowclosed') => (kind ? `url(#${uid}-${kind})` : undefined);\n\tconst x = scene.x - padding;\n\tconst y = scene.y - padding;\n\tconst width = Math.max(1, scene.width + padding * 2);\n\tconst height = Math.max(1, scene.height + padding * 2);\n\tconst handlers = (mark: DiagramMark) =>\n\t\tinteractive && mark.target\n\t\t\t? {\n\t\t\t\t\tonClick: (event: React.MouseEvent) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonSelect?.(mark.target!, event);\n\t\t\t\t\t},\n\t\t\t\t\tonDoubleClick: (event: React.MouseEvent) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonOpen?.(mark.target!, event);\n\t\t\t\t\t},\n\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t}\n\t\t\t: { pointerEvents: 'none' as const };\n\tconst stroke = (mark: { stroke?: string; strokeWidth?: number; selected?: boolean }) =>\n\t\tmark.selected ? { stroke: selectionColor, strokeWidth: Math.max(2, mark.strokeWidth ?? 0) } : { stroke: mark.stroke, strokeWidth: mark.strokeWidth };\n\treturn (\n\t\t<svg\n\t\t\tclassName={`pixerate-diagram-scene ${className}`.trim()}\n\t\t\tdata-family={scene.family}\n\t\t\trole=\"img\"\n\t\t\taria-label={title ?? `${scene.family} diagram`}\n\t\t\tviewBox={`${x} ${y} ${width} ${height}`}\n\t\t\twidth={width}\n\t\t\theight={height}\n\t\t\tstyle={{ display: 'block', maxWidth: '100%', height: 'auto', overflow: 'visible', ...style }}\n\t\t\tonClick={interactive ? (event) => onSelect?.(null, event) : undefined}\n\t\t>\n\t\t\t<defs>\n\t\t\t\t<marker id={`${uid}-arrowclosed`} viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\">\n\t\t\t\t\t<path d=\"M0,0 L10,5 L0,10 Z\" style={{ fill: markerColor }} />\n\t\t\t\t</marker>\n\t\t\t\t<marker id={`${uid}-arrow`} viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\">\n\t\t\t\t\t<path d=\"M0,0 L10,5 L0,10\" style={{ fill: 'none', stroke: markerColor, strokeWidth: 1.5 }} />\n\t\t\t\t</marker>\n\t\t\t</defs>\n\t\t\t{scene.marks.map((mark) => {\n\t\t\t\tconst common = { 'data-role': mark.role, 'data-target': mark.target, 'data-selected': mark.selected ? '' : undefined, opacity: mark.opacity, ...handlers(mark) };\n\t\t\t\tswitch (mark.kind) {\n\t\t\t\t\tcase 'rect':\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\tkey={mark.key}\n\t\t\t\t\t\t\t\t{...common}\n\t\t\t\t\t\t\t\tx={mark.x}\n\t\t\t\t\t\t\t\ty={mark.y}\n\t\t\t\t\t\t\t\twidth={Math.max(0, mark.width)}\n\t\t\t\t\t\t\t\theight={Math.max(0, mark.height)}\n\t\t\t\t\t\t\t\trx={mark.radius}\n\t\t\t\t\t\t\t\tstrokeDasharray={mark.dash}\n\t\t\t\t\t\t\t\tstyle={{ fill: mark.fill, ...stroke(mark) }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\tcase 'circle':\n\t\t\t\t\t\treturn <circle key={mark.key} {...common} cx={mark.cx} cy={mark.cy} r={mark.r} style={{ fill: mark.fill, ...stroke(mark) }} />;\n\t\t\t\t\tcase 'line':\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tkey={mark.key}\n\t\t\t\t\t\t\t\t{...common}\n\t\t\t\t\t\t\t\tx1={mark.x1}\n\t\t\t\t\t\t\t\ty1={mark.y1}\n\t\t\t\t\t\t\t\tx2={mark.x2}\n\t\t\t\t\t\t\t\ty2={mark.y2}\n\t\t\t\t\t\t\t\tstrokeDasharray={mark.dash}\n\t\t\t\t\t\t\t\tmarkerEnd={marker(mark.markerEnd)}\n\t\t\t\t\t\t\t\tmarkerStart={marker(mark.markerStart)}\n\t\t\t\t\t\t\t\tstyle={{ stroke: mark.selected ? selectionColor : mark.stroke, strokeWidth: mark.strokeWidth ?? 1 }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\tcase 'path':\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tkey={mark.key}\n\t\t\t\t\t\t\t\t{...common}\n\t\t\t\t\t\t\t\td={mark.d}\n\t\t\t\t\t\t\t\tstrokeDasharray={mark.dash}\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tmarkerEnd={marker(mark.markerEnd)}\n\t\t\t\t\t\t\t\tmarkerStart={marker(mark.markerStart)}\n\t\t\t\t\t\t\t\tstyle={{ fill: mark.fill ?? 'none', ...stroke(mark) }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\tkey={mark.key}\n\t\t\t\t\t\t\t\t{...common}\n\t\t\t\t\t\t\t\tx={mark.x}\n\t\t\t\t\t\t\t\ty={mark.y}\n\t\t\t\t\t\t\t\ttextAnchor={mark.anchor}\n\t\t\t\t\t\t\t\tdominantBaseline={diagramTextBaseline(mark.baseline)}\n\t\t\t\t\t\t\t\ttransform={mark.rotate ? `rotate(${mark.rotate} ${mark.x} ${mark.y})` : undefined}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfill: mark.selected ? selectionColor : mark.fill,\n\t\t\t\t\t\t\t\t\tfontSize: mark.size,\n\t\t\t\t\t\t\t\t\tfontWeight: mark.weight,\n\t\t\t\t\t\t\t\t\tfontStyle: mark.italic ? 'italic' : undefined,\n\t\t\t\t\t\t\t\t\tuserSelect: 'none'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{mark.text}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})}\n\t\t</svg>\n\t);\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport {\n\tDiagramController,\n\ttype DiagramActionResult,\n\ttype DiagramControllerOptions,\n\ttype DiagramState,\n\ttype EditOp,\n\ttype MermaidDocument\n} from '@pixerate/editor/diagram';\nimport {\n\tCSS_VARIABLE_DIAGRAM_SCENE_THEME,\n\tDiagramStream,\n\tblendDiagramLayout,\n\tdiagramRenameOp,\n\tfamilySceneFromLayout,\n\teaseDiagramTween,\n\tmermaidMovesFromCanvas,\n\tmermaidToCanvas,\n\ttype DiagramLayout,\n\ttype DiagramLayoutOptions,\n\ttype DiagramScene,\n\ttype DiagramSceneTheme,\n\ttype MermaidFlowEdge,\n\ttype MermaidFlowNode\n} from '@pixerate/editor/canvas';\n\nexport interface UseMermaidDiagramOptions extends DiagramControllerOptions {\n\t/** Layout spacing and node measuring for new nodes (stored positions always win). */\n\tlayoutOptions?: DiagramLayoutOptions;\n\t/** Colours for families drawn as scenes (default: the page's CSS colour variables). */\n\tsceneTheme?: Partial<DiagramSceneTheme>;\n}\n\ntype Placed = { id: string; position: { x: number; y: number }; parentId?: string };\n\nexport interface UseMermaidDiagramResult {\n\tcontroller: DiagramController;\n\tstate: DiagramState;\n\tdocument: MermaidDocument;\n\t/** The Mermaid text (with the `%% @pixerate` layout comment). */\n\tsource: string;\n\t/** Canvas nodes (groups first, children relative to their group) and edges. */\n\tnodes: MermaidFlowNode[];\n\tedges: MermaidFlowEdge[];\n\tlayout: DiagramLayout;\n\t/**\n\t * The family's own picture (pie, Gantt, sequence, XY, radar…) with the selection marked;\n\t * null for families drawn as nodes and edges (flowchart, state, class, ER) and text-only\n\t * ones. Render it with `MermaidFamilyScene`.\n\t */\n\tscene: DiagramScene | null;\n\tapply: (ops: EditOp | EditOp[], label?: string) => DiagramActionResult;\n\t/** Replaces the source; `clearHistory` when opening a different diagram. */\n\tload: (source: string, options?: { clearHistory?: boolean }) => DiagramActionResult;\n\t/** Stores where dragged nodes ended up (pass every canvas node as `all` so groups carry their contents). */\n\tmoveNodes: (moved: readonly Placed[], all?: readonly Placed[]) => DiagramActionResult | null;\n\tconnect: (source: string, target: string, label?: string) => DiagramActionResult;\n\t/** Removes nodes / groups (with their edges) and edges by id, as one undo step. */\n\tremove: (ids: readonly string[]) => DiagramActionResult;\n\trename: (id: string, label: string) => DiagramActionResult;\n\t/** Renames what a scene mark targets: the title (`::title`), a group, an edge or a node. */\n\trenameTarget: (target: string, label: string) => DiagramActionResult | null;\n\tselect: (ids: readonly string[]) => void;\n\tundo: () => void;\n\tredo: () => void;\n}\n\n/** The controller's state (re-renders on every change). */\nexport function useDiagramState(controller: DiagramController): DiagramState {\n\treturn useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);\n}\n\n/**\n * A Mermaid diagram on a React Flow canvas: subscribes to a `DiagramController` (or creates\n * one from options), lays it out and returns canvas nodes and edges with bound edits. Every\n * edit rewrites only the statements it touches; positions go into `%% @pixerate`.\n */\nexport function useMermaidDiagram(\n\tcontrollerOrOptions: DiagramController | UseMermaidDiagramOptions = {},\n\t/** Layout and scene colours when passing a controller (options carry them otherwise). */\n\tview: Pick<UseMermaidDiagramOptions, 'layoutOptions' | 'sceneTheme'> = {}\n): UseMermaidDiagramResult {\n\tconst own = useRef<DiagramController | null>(null);\n\tlet controller: DiagramController;\n\tif (controllerOrOptions instanceof DiagramController) controller = controllerOrOptions;\n\telse {\n\t\tif (!own.current) own.current = new DiagramController(controllerOrOptions);\n\t\tcontroller = own.current;\n\t}\n\tconst layoutOptions = (controllerOrOptions instanceof DiagramController ? undefined : controllerOrOptions.layoutOptions) ?? view.layoutOptions;\n\tconst sceneTheme = (controllerOrOptions instanceof DiagramController ? undefined : controllerOrOptions.sceneTheme) ?? view.sceneTheme;\n\tconst state = useDiagramState(controller);\n\tconst canvas = useMemo(\n\t\t() => mermaidToCanvas(state.document, { ...layoutOptions, editable: state.editable }),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[state.document, state.editable]\n\t);\n\tconst scene = useMemo(\n\t\t() =>\n\t\t\tstate.document.tier === 'editable'\n\t\t\t\t? familySceneFromLayout(state.document.family, state.document.graph, canvas.layout, { theme: { ...CSS_VARIABLE_DIAGRAM_SCENE_THEME, ...sceneTheme }, selection: state.selection })\n\t\t\t\t: null,\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[state.document, canvas.layout, state.selection]\n\t);\n\tconst layoutRef = useRef(canvas.layout);\n\tlayoutRef.current = canvas.layout;\n\n\tconst actions = useMemo(\n\t\t() => ({\n\t\t\tapply: (ops: EditOp | EditOp[], label?: string) => controller.apply(ops, label),\n\t\t\tload: (source: string, options?: { clearHistory?: boolean }) => controller.load(source, options),\n\t\t\tmoveNodes: (moved: readonly Placed[], all: readonly Placed[] = moved) => {\n\t\t\t\tconst op = mermaidMovesFromCanvas(layoutRef.current, moved, all, { stored: controller.getDocument().meta.layout ?? {} });\n\t\t\t\treturn op ? controller.apply(op, 'Move') : null;\n\t\t\t},\n\t\t\tconnect: (source: string, target: string, label?: string) =>\n\t\t\t\tcontroller.apply({ type: 'addEdge', edge: { source, target, ...(label ? { label } : {}) } }, 'Connect'),\n\t\t\tremove: (ids: readonly string[]) => {\n\t\t\t\tconst graph = controller.getDocument().graph;\n\t\t\t\tconst edgeIds = new Set(graph.edges.map((e) => e.id));\n\t\t\t\tconst edges = ids.filter((id) => edgeIds.has(id));\n\t\t\t\tconst nodes = ids.filter((id) => !edgeIds.has(id));\n\t\t\t\tconst ops: EditOp[] = [];\n\t\t\t\tif (edges.length) ops.push({ type: 'removeEdges', ids: edges });\n\t\t\t\tif (nodes.length) ops.push({ type: 'removeNodes', ids: nodes });\n\t\t\t\treturn controller.apply(ops, 'Delete');\n\t\t\t},\n\t\t\trename: (id: string, label: string) =>\n\t\t\t\tcontroller.apply(\n\t\t\t\t\tcontroller.getDocument().graph.groups.some((g) => g.id === id) ? { type: 'renameGroup', id, label } : { type: 'renameNode', id, label },\n\t\t\t\t\t'Rename'\n\t\t\t\t),\n\t\t\trenameTarget: (target: string, label: string) => {\n\t\t\t\tconst op = diagramRenameOp(controller.getDocument(), target, label);\n\t\t\t\treturn op ? controller.apply(op, 'Rename') : null;\n\t\t\t},\n\t\t\tselect: (ids: readonly string[]) => controller.select(ids),\n\t\t\tundo: () => void controller.undo(),\n\t\t\tredo: () => void controller.redo()\n\t\t}),\n\t\t[controller]\n\t);\n\treturn { controller, state, document: state.document, source: state.source, ...canvas, scene, ...actions };\n}\n\nexport interface UseMermaidStreamOptions extends DiagramLayoutOptions {\n\t/** True once the whole source has arrived (unconnected nodes are shown then). */\n\tcomplete?: boolean;\n\t/** Glide duration between layouts in ms (default 300; 0 jumps). */\n\tduration?: number;\n}\n\nexport interface UseMermaidStreamResult {\n\tdocument: MermaidDocument | null;\n\tnodes: MermaidFlowNode[];\n\tedges: MermaidFlowEdge[];\n\t/** The layout being shown (mid-glide while `settled` is false). */\n\tlayout: DiagramLayout | null;\n\tsettled: boolean;\n}\n\n/**\n * Draws Mermaid that is still being written (e.g. a model's reply): nodes appear once an\n * edge places them and glide to their new places as the layout grows. Read-only.\n */\nexport function useMermaidStream(source: string, options: UseMermaidStreamOptions = {}): UseMermaidStreamResult {\n\tconst { complete = false, duration = 300, ...layoutOptions } = options;\n\tconst stream = useRef<DiagramStream | null>(null);\n\tif (!stream.current) stream.current = new DiagramStream(layoutOptions);\n\tconst result = useMemo(() => stream.current!.update(source, complete), [source, complete]);\n\tconst [shown, setShown] = useState<{ layout: DiagramLayout | null; settled: boolean }>({ layout: result.layout, settled: true });\n\tconst shownRef = useRef(shown.layout);\n\tshownRef.current = shown.layout;\n\n\tuseEffect(() => {\n\t\tconst target = result.layout;\n\t\tif (!target) return setShown({ layout: null, settled: true });\n\t\tconst from = shownRef.current;\n\t\tif (!from || duration <= 0 || typeof requestAnimationFrame !== 'function') return setShown({ layout: target, settled: true });\n\t\tif (from === target) return;\n\t\tlet frame = 0;\n\t\tconst start = performance.now();\n\t\tconst step = () => {\n\t\t\tconst t = Math.min(1, (performance.now() - start) / duration);\n\t\t\tsetShown({ layout: blendDiagramLayout(from, target, easeDiagramTween(t)), settled: t >= 1 });\n\t\t\tif (t < 1) frame = requestAnimationFrame(step);\n\t\t};\n\t\tframe = requestAnimationFrame(step);\n\t\treturn () => cancelAnimationFrame(frame);\n\t}, [result.layout, duration]);\n\n\tconst doc = result.document.tier === 'editable' ? result.document : null;\n\tconst canvas = useMemo(() => {\n\t\tif (!doc || !shown.layout) return { nodes: [], edges: [] };\n\t\t// Only what has been placed: labels may run ahead of the layout.\n\t\tconst placed = new Set(Object.keys(shown.layout.positions));\n\t\tconst graph = {\n\t\t\t...doc.graph,\n\t\t\tnodes: doc.graph.nodes.filter((n) => placed.has(n.id)),\n\t\t\tgroups: doc.graph.groups.filter((g) => placed.has(g.id)),\n\t\t\tedges: doc.graph.edges.filter((e) => placed.has(e.source) && placed.has(e.target))\n\t\t};\n\t\treturn mermaidToCanvas({ ...doc, graph }, { layout: shown.layout });\n\t}, [doc, shown.layout]);\n\treturn { document: doc, ...canvas, layout: shown.layout, settled: shown.settled };\n}\n\n","import React from 'react';\nimport { MERMAID_SHAPE_PAINT, mermaidLabelLines, mermaidNodeMembers, mermaidNodePaint, mermaidShapePaths } from '@pixerate/editor/canvas';\n\n/** Node data as `mermaidToCanvas` produces it. */\nexport interface MermaidDiagramNodeData {\n\tnode?: { id: string; label: string; shape: string; data?: Record<string, unknown> };\n\tgroup?: { id: string; label: string };\n\tresolvedStyles?: Record<string, string>;\n\t[key: string]: unknown;\n}\n\nexport interface MermaidDiagramNodeProps {\n\tid?: string;\n\tdata: MermaidDiagramNodeData;\n\twidth?: number;\n\theight?: number;\n\tselected?: boolean;\n\tclassName?: string;\n\t/** Rendered over the node, e.g. React Flow `<Handle>`s. */\n\tchildren?: React.ReactNode;\n\t[key: string]: unknown;\n}\n\n/** Mermaid `style` / `classDef` declarations as the CSS the node paints with. */\nexport function mermaidNodeStyle(styles: Record<string, string> = {}, selected = false): React.CSSProperties {\n\tconst paint = mermaidNodePaint(styles, selected);\n\tconst { color, 'stroke-width': strokeWidth, 'stroke-dasharray': strokeDasharray, ...vars } = paint;\n\treturn { ...vars, color, strokeWidth, strokeDasharray } as React.CSSProperties;\n}\n\n/**\n * Headless Mermaid node: draws the node's shape (flowchart, state, class, ER) as SVG with\n * its label, painted from its Mermaid styles. Register it as the `mermaid-node` React Flow\n * node type and pass `<Handle>`s as children.\n */\nexport function MermaidDiagramNode({ data, width = 160, height = 56, selected, className = '', children }: MermaidDiagramNodeProps) {\n\tconst node = data.node;\n\tif (!node) return null;\n\tconst members = mermaidNodeMembers(node.data);\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-diagram-node ${className}`.trim()}\n\t\t\tdata-shape={node.shape}\n\t\t\tdata-selected={selected ? 'true' : undefined}\n\t\t\tstyle={{ position: 'relative', width: '100%', height: '100%', ...mermaidNodeStyle(data.resolvedStyles, selected) }}\n\t\t>\n\t\t\t<svg viewBox={`0 0 ${width} ${height}`} preserveAspectRatio=\"none\" width=\"100%\" height=\"100%\" style={{ position: 'absolute', inset: 0, overflow: 'visible' }} aria-hidden=\"true\">\n\t\t\t\t{mermaidShapePaths(node.shape, width, height).map((path, i) => (\n\t\t\t\t\t<path key={i} d={path.d} style={{ ...MERMAID_SHAPE_PAINT[path.paint], vectorEffect: 'non-scaling-stroke' }} />\n\t\t\t\t))}\n\t\t\t</svg>\n\t\t\t<div\n\t\t\t\tstyle={{ position: 'relative', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: members.length ? 'flex-start' : 'center', height: '100%', padding: '6px 10px', boxSizing: 'border-box', fontSize: 13, lineHeight: 1.3, textAlign: 'center', pointerEvents: 'none' }}\n\t\t\t>\n\t\t\t\t{mermaidLabelLines(node.label).map((line, i) => (\n\t\t\t\t\t<span key={i} style={{ fontWeight: members.length ? 600 : undefined }}>\n\t\t\t\t\t\t{line}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t\t{members.length > 0 && (\n\t\t\t\t\t<div style={{ alignSelf: 'stretch', marginTop: 4, paddingTop: 4, borderTop: '1px solid var(--pixerate-diagram-node-border)', textAlign: 'left', fontSize: 12 }}>\n\t\t\t\t\t\t{members.map((m, i) => (\n\t\t\t\t\t\t\t<div key={i}>{m}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n/** Headless Mermaid group (subgraph, composite state, namespace): a titled frame. Register as `mermaid-group`. */\nexport function MermaidDiagramGroup({ data, selected, className = '', children }: MermaidDiagramNodeProps) {\n\tconst group = data.group;\n\tif (!group) return null;\n\treturn (\n\t\t<div\n\t\t\tclassName={`pixerate-diagram-group ${className}`.trim()}\n\t\t\tdata-selected={selected ? 'true' : undefined}\n\t\t\tstyle={{\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%',\n\t\t\t\tboxSizing: 'border-box',\n\t\t\t\tborderRadius: 8,\n\t\t\t\tborder: `1px ${selected ? 'solid' : 'dashed'} ${selected ? 'var(--primary, #2563eb)' : (data.resolvedStyles?.stroke ?? 'var(--border, #cbd5e1)')}`,\n\t\t\t\tbackground: data.resolvedStyles?.fill ?? 'var(--muted, rgba(148, 163, 184, 0.08))',\n\t\t\t\tcolor: data.resolvedStyles?.color ?? 'var(--muted-foreground, #475569)'\n\t\t\t}}\n\t\t>\n\t\t\t<div style={{ padding: '6px 10px', fontSize: 12, fontWeight: 600 }}>{mermaidLabelLines(group.label).join(' ')}</div>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import React, { useMemo } from 'react';\nimport { parseMermaid, type MermaidDocument } from '@pixerate/editor/diagram';\nimport { mermaidThumbnailSvg, type DiagramSvgOptions } from '@pixerate/editor/canvas';\n\nexport interface MermaidThumbnailProps extends DiagramSvgOptions {\n\t/** Mermaid text, or an already parsed document. */\n\tsource: string | MermaidDocument;\n\tclassName?: string;\n\t/** Shown for families that cannot be drawn here (sequence, Gantt, …) and empty diagrams. */\n\tfallback?: React.ReactNode;\n}\n\n/**\n * A static preview of a flowchart, state, class or ER diagram (no canvas, no Mermaid runtime):\n * `mermaidThumbnailSvg` fitted inside `maxWidth` × `maxHeight` (default 240 × 160).\n */\nexport function MermaidThumbnail({ source, className = '', fallback = null, ...options }: MermaidThumbnailProps) {\n\tconst doc = useMemo(() => (typeof source === 'string' ? parseMermaid(source) : source), [source]);\n\tconst key = JSON.stringify(options);\n\tconst drawn = useMemo(\n\t\t() => (doc.tier === 'editable' && doc.graph.nodes.length ? mermaidThumbnailSvg(doc, options) : null),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[doc, key]\n\t);\n\tif (!drawn) return <>{fallback}</>;\n\t// The SVG is built by mermaidToSvg with every label escaped.\n\treturn <span className={`pixerate-diagram-thumbnail ${className}`.trim()} style={{ display: 'inline-block', lineHeight: 0 }} dangerouslySetInnerHTML={{ __html: drawn.svg }} />;\n}\n","import { useRef, useSyncExternalStore } from 'react';\nimport { DiagramDirector, PresenceStore, type DiagramController, type DiagramPlacement, type PresenceClock, type PresenceState } from '@pixerate/editor/diagram';\n\nexport interface UseDiagramDirectorOptions {\n\t/** Where nodes are drawn now, e.g. `() => diagram.layout` from `useMermaidDiagram`. */\n\tplacement: () => DiagramPlacement;\n\t/** 1 = natural speed; 2 = twice as fast. */\n\tspeed?: number;\n\tclock?: PresenceClock;\n\t/** Hide a cursor this long after its last call (ms, default 1500). */\n\tlinger?: number;\n}\n\n/**\n * A `PresenceStore` and `DiagramDirector` for a diagram, created once: pass `director` to\n * `createDiagramToolProvider` so agent edits are acted out by a cursor, and `presence` to\n * `<DiagramPresenceLayer>` to draw it.\n */\nexport function useDiagramDirector(controller: DiagramController, options: UseDiagramDirectorOptions) {\n\tconst placement = useRef(options.placement);\n\tplacement.current = options.placement;\n\tconst ref = useRef<{ presence: PresenceStore; director: DiagramDirector } | null>(null);\n\tif (!ref.current) {\n\t\tconst presence = new PresenceStore();\n\t\tref.current = {\n\t\t\tpresence,\n\t\t\tdirector: new DiagramDirector(controller, presence, { placement: () => placement.current(), speed: options.speed, clock: options.clock, linger: options.linger })\n\t\t};\n\t}\n\treturn ref.current;\n}\n\n/** The presence store's state (re-renders on every cursor move). */\nexport function usePresenceState(presence: PresenceStore): PresenceState {\n\treturn useSyncExternalStore(presence.subscribe, presence.getState, presence.getState);\n}\n","import React from 'react';\nimport type { PresenceStore } from '@pixerate/editor/diagram';\nimport { usePresenceState } from './useDiagramDirector.js';\n\nexport interface DiagramPresenceLayerProps {\n\tpresence: PresenceStore;\n\t/** The canvas viewport (React Flow's `useViewport()`), to place cursors given in canvas coordinates. */\n\tviewport: { x: number; y: number; zoom: number };\n\tclassName?: string;\n}\n\n/** Agent cursors and their notes over a canvas, from a `PresenceStore` (see `DiagramDirector`). */\nexport function DiagramPresenceLayer({ presence, viewport, className = '' }: DiagramPresenceLayerProps) {\n\tconst { actors } = usePresenceState(presence);\n\tif (!actors.length) return null;\n\treturn (\n\t\t<div className={`pixerate-diagram-presence ${className}`.trim()} aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, pointerEvents: 'none', overflow: 'hidden', zIndex: 50 }}>\n\t\t\t{actors.map((a) => (\n\t\t\t\t<div key={a.id} data-actor={a.id} style={{ position: 'absolute', left: 0, top: 0, transform: `translate(${a.x * viewport.zoom + viewport.x}px, ${a.y * viewport.zoom + viewport.y}px)` }}>\n\t\t\t\t\t<svg width=\"18\" height=\"20\" viewBox=\"0 0 12 18\" style={{ display: 'block', transform: a.pressed ? 'scale(0.85)' : undefined, transformOrigin: '0 0' }}>\n\t\t\t\t\t\t<path d=\"M0,0 L0,14 L4,10.5 L7,17 L9.5,16 L6.5,9.5 L11.5,9.5 Z\" style={{ fill: a.color, stroke: '#ffffff', strokeWidth: 1 }} />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<span style={{ position: 'absolute', left: 14, top: 16, whiteSpace: 'nowrap', borderRadius: 4, padding: '1px 6px', fontSize: 11, fontWeight: 600, color: '#ffffff', background: a.color }}>\n\t\t\t\t\t\t{a.message ?? a.name}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["useCallback","useRef","useCallback","useCallback","useEffect","isEventFromTextInput","useCallback","useRef","useCallback","useRef","useEffect","useRef","useState","useMemo","useRef","jsx","jsxs","useEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","jsx","jsxs","DEFAULT_VIEWPORT","useCallback","useEffect","useMemo","useRef","useState","measureSelection","isMeasureModifierHeld","CanvasScenesStore","fitViewportToNodes","matchArrangeShortcut","jsx","jsxs","isShapeDescription","getShapeRenderData","getLayoutedNodes","ensureLayout","centerNodes","getCenteredNodePosition","placeBeside","linearPositionTrajectory","createFanOutTrajectory","runMultiNodeTransition","calculateDirectionalDisplacement","isEventFromTextInput","isValidUrl","serializeCanvasNodes","parseCanvasClipboardData","remapPastedNodes","createCanvasAutoLayoutController","useMemo","useRef","useState","useCallback","useEffect","useRef","useSyncExternalStore","bindCanvasToken","getEffectiveTokenModes","setCanvasTokenMode","jsx","jsxs","bindCanvasToken","setCanvasTokenMode","resolveCanvasTokens","detachTokenBindings","getNodeTokenBindings","getNodeTokenModes","getEffectiveTokenModes","getBindableTokenProperties","getTokensForProperty","useEffect","useMemo","useRef","useSyncExternalStore","useEffect","useRef","jsx","jsxs","createCanvasAnimationController","ANIMATION_EASING_PRESETS","ANIMATION_EASING_LABELS","getTimelineTicks","timeToX","xToTime","formatAnimationTime","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","createCanvasComponentsController","listCanvasComponents","inspectCanvasInstance","CANVAS_COMPONENT_DRAG_TYPE","createCanvasDrawController","strokePointsToPathData","resolveCanvasGradient","gradientToSvgDef","jsx","jsxs","useEffect","useMemo","useRef","useState","useSyncExternalStore","jsx","jsxs","useMemo","Fragment","jsx","useRef","useSyncExternalStore","jsx","jsxs"]}