@pixerate/editor-react 0.5.1 → 0.6.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.
- package/dist/canvas/index.cjs +824 -0
- package/dist/canvas/index.cjs.map +1 -0
- package/dist/canvas/index.d.cts +150 -0
- package/dist/canvas/index.d.ts +150 -0
- package/dist/canvas/index.js +810 -0
- package/dist/canvas/index.js.map +1 -0
- package/dist/index.cjs +39 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -2
- package/dist/index.d.ts +15 -2
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/package.json +20 -2
|
@@ -0,0 +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/index.ts"],"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-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\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\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\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}, [options.throttleMs, options.glideDurationMs, options.onPositionsChange]);\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 * 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\tonUpdate: () => setNodes([...mergedNodes]),\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\tonUpdate: () => setNodes([...nodes]),\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","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// 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\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"],"mappings":"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","names":["useCallback","useRef","useCallback","useCallback","useEffect","isEventFromTextInput","useCallback","useRef","useCallback","useRef","getLayoutedNodes","ensureLayout","centerNodes","getCenteredNodePosition","placeBeside","linearPositionTrajectory","createFanOutTrajectory","runMultiNodeTransition","calculateDirectionalDisplacement","isEventFromTextInput","isValidUrl","serializeCanvasNodes","parseCanvasClipboardData","remapPastedNodes"]}
|
package/dist/index.cjs
CHANGED
|
@@ -28,11 +28,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
|
|
30
30
|
// src/index.ts
|
|
31
|
-
var
|
|
32
|
-
__export(
|
|
31
|
+
var src_exports = {};
|
|
32
|
+
__export(src_exports, {
|
|
33
33
|
BubbleMenu: () => BubbleMenu,
|
|
34
34
|
DirtyTracker: () => import_editor7.DirtyTracker,
|
|
35
35
|
EditorContent: () => EditorContent,
|
|
36
|
+
EditorSlotsProvider: () => EditorSlotsProvider,
|
|
36
37
|
HistoryManager: () => import_editor7.HistoryManager,
|
|
37
38
|
SpreadsheetEditor: () => SpreadsheetEditor,
|
|
38
39
|
TemplateRenderer: () => TemplateRenderer,
|
|
@@ -41,13 +42,14 @@ __export(index_exports, {
|
|
|
41
42
|
defaultIsEqual: () => import_editor7.defaultIsEqual,
|
|
42
43
|
useDismissGuard: () => useDismissGuard,
|
|
43
44
|
useEditor: () => useEditor2,
|
|
45
|
+
useEditorSlots: () => useEditorSlots,
|
|
44
46
|
useHistory: () => useHistory,
|
|
45
47
|
useHistoryShortcuts: () => useHistoryShortcuts,
|
|
46
48
|
useNavigationGuard: () => useNavigationGuard,
|
|
47
49
|
usePromptEditor: () => usePromptEditor,
|
|
48
50
|
useSpreadsheetEditor: () => useSpreadsheetEditor
|
|
49
51
|
});
|
|
50
|
-
module.exports = __toCommonJS(
|
|
52
|
+
module.exports = __toCommonJS(src_exports);
|
|
51
53
|
|
|
52
54
|
// src/hooks/usePromptEditor.ts
|
|
53
55
|
var import_react = require("react");
|
|
@@ -1215,11 +1217,44 @@ var SpreadsheetEditor = ({
|
|
|
1215
1217
|
}
|
|
1216
1218
|
);
|
|
1217
1219
|
};
|
|
1220
|
+
|
|
1221
|
+
// src/slots.tsx
|
|
1222
|
+
var import_react13 = require("react");
|
|
1223
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1224
|
+
var defaultSlots = {
|
|
1225
|
+
Button: (props) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1226
|
+
"button",
|
|
1227
|
+
{
|
|
1228
|
+
type: "button",
|
|
1229
|
+
className: `pixerate-btn ${props.className || ""}`,
|
|
1230
|
+
onClick: props.onClick,
|
|
1231
|
+
disabled: props.disabled,
|
|
1232
|
+
children: props.children
|
|
1233
|
+
}
|
|
1234
|
+
),
|
|
1235
|
+
Tooltip: (props) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `pixerate-tooltip-container ${props.className || ""}`, title: String(props.content), children: props.children }),
|
|
1236
|
+
NodeHeader: (props) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: `pixerate-node-header flex items-center justify-between ${props.className || ""}`, children: [
|
|
1237
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1238
|
+
props.icon,
|
|
1239
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "font-semibold", children: props.title })
|
|
1240
|
+
] }),
|
|
1241
|
+
props.onClose && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", onClick: props.onClose, className: "opacity-70 hover:opacity-100", children: "\xD7" })
|
|
1242
|
+
] })
|
|
1243
|
+
};
|
|
1244
|
+
var EditorSlotsContext = (0, import_react13.createContext)(defaultSlots);
|
|
1245
|
+
function EditorSlotsProvider({ slots, children }) {
|
|
1246
|
+
const mergedSlots = (0, import_react13.useMemo)(() => ({ ...defaultSlots, ...slots }), [slots]);
|
|
1247
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(EditorSlotsContext.Provider, { value: mergedSlots, children });
|
|
1248
|
+
}
|
|
1249
|
+
function useEditorSlots() {
|
|
1250
|
+
return (0, import_react13.useContext)(EditorSlotsContext);
|
|
1251
|
+
}
|
|
1218
1252
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1219
1253
|
0 && (module.exports = {
|
|
1220
1254
|
BubbleMenu,
|
|
1221
1255
|
DirtyTracker,
|
|
1222
1256
|
EditorContent,
|
|
1257
|
+
EditorSlotsProvider,
|
|
1223
1258
|
HistoryManager,
|
|
1224
1259
|
SpreadsheetEditor,
|
|
1225
1260
|
TemplateRenderer,
|
|
@@ -1228,6 +1263,7 @@ var SpreadsheetEditor = ({
|
|
|
1228
1263
|
defaultIsEqual,
|
|
1229
1264
|
useDismissGuard,
|
|
1230
1265
|
useEditor,
|
|
1266
|
+
useEditorSlots,
|
|
1231
1267
|
useHistory,
|
|
1232
1268
|
useHistoryShortcuts,
|
|
1233
1269
|
useNavigationGuard,
|