@pixerate/editor-react 0.13.0 → 0.14.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/README.md +3 -3
- package/dist/canvas/index.cjs +180 -68
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +36 -6
- package/dist/canvas/index.d.ts +36 -6
- package/dist/canvas/index.js +113 -1
- package/dist/canvas/index.js.map +1 -1
- package/dist/{chunk-MHTAR3RS.js → chunk-25S5EHH4.js} +84 -27
- package/dist/chunk-25S5EHH4.js.map +1 -0
- package/dist/image-editor/index.d.cts +3 -3
- package/dist/image-editor/index.d.ts +3 -3
- package/dist/index.cjs +94 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -17
- package/dist/index.d.ts +26 -17
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/spreadsheet/index.cjs +78 -21
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.d.cts +8 -9
- package/dist/spreadsheet/index.d.ts +8 -9
- package/dist/spreadsheet/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-MHTAR3RS.js.map +0 -1
package/dist/canvas/index.js
CHANGED
|
@@ -972,6 +972,86 @@ import {
|
|
|
972
972
|
matchArrangeShortcut as matchArrangeShortcut2,
|
|
973
973
|
DEFAULT_ARRANGE_SHORTCUTS
|
|
974
974
|
} from "@pixerate/editor/canvas";
|
|
975
|
+
|
|
976
|
+
// src/canvas/ShapeNode.tsx
|
|
977
|
+
import { getShapeRenderData, isShapeDescription } from "@pixerate/editor/canvas";
|
|
978
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
979
|
+
function ShapeNode({ data, width, height, selected, className = "", children }) {
|
|
980
|
+
const shape = data?.shape;
|
|
981
|
+
if (!isShapeDescription(shape)) return null;
|
|
982
|
+
const render = getShapeRenderData(shape, { width, height });
|
|
983
|
+
return /* @__PURE__ */ jsxs2(
|
|
984
|
+
"div",
|
|
985
|
+
{
|
|
986
|
+
className: `pixerate-shape-node ${className}`.trim(),
|
|
987
|
+
"data-shape-kind": shape.kind,
|
|
988
|
+
"data-selected": selected ? "true" : void 0,
|
|
989
|
+
style: { position: "relative", width: "100%", height: "100%" },
|
|
990
|
+
children: [
|
|
991
|
+
/* @__PURE__ */ jsx3(
|
|
992
|
+
"svg",
|
|
993
|
+
{
|
|
994
|
+
viewBox: render.viewBox,
|
|
995
|
+
preserveAspectRatio: "none",
|
|
996
|
+
width: "100%",
|
|
997
|
+
height: "100%",
|
|
998
|
+
style: { display: "block", overflow: "visible" },
|
|
999
|
+
"aria-hidden": "true",
|
|
1000
|
+
children: /* @__PURE__ */ jsx3(
|
|
1001
|
+
"path",
|
|
1002
|
+
{
|
|
1003
|
+
d: render.d,
|
|
1004
|
+
transform: render.transform,
|
|
1005
|
+
fill: render.fill,
|
|
1006
|
+
fillRule: render.fillRule,
|
|
1007
|
+
stroke: render.stroke,
|
|
1008
|
+
strokeWidth: render.strokeWidth,
|
|
1009
|
+
opacity: render.opacity,
|
|
1010
|
+
vectorEffect: "non-scaling-stroke"
|
|
1011
|
+
}
|
|
1012
|
+
)
|
|
1013
|
+
}
|
|
1014
|
+
),
|
|
1015
|
+
children
|
|
1016
|
+
]
|
|
1017
|
+
}
|
|
1018
|
+
);
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
// src/canvas/index.ts
|
|
1022
|
+
import {
|
|
1023
|
+
combineShapeNodes,
|
|
1024
|
+
canCombineShapeNodes,
|
|
1025
|
+
applyShapeCombination,
|
|
1026
|
+
revertShapeCombination,
|
|
1027
|
+
shapeNodeToPolygon,
|
|
1028
|
+
isShapeNode,
|
|
1029
|
+
getNodeShape,
|
|
1030
|
+
SHAPE_DATA_KEY,
|
|
1031
|
+
SHAPE_NODE_TYPE,
|
|
1032
|
+
SHAPE_OPERATIONS,
|
|
1033
|
+
SHAPE_KINDS,
|
|
1034
|
+
isShapeDescription as isShapeDescription2,
|
|
1035
|
+
shapeToPolygon,
|
|
1036
|
+
getShapeSvg,
|
|
1037
|
+
getShapeRenderData as getShapeRenderData2,
|
|
1038
|
+
parseSvgPath,
|
|
1039
|
+
flattenSvgPath,
|
|
1040
|
+
polygonToSvgPath,
|
|
1041
|
+
simplifyRing,
|
|
1042
|
+
polygonBoolean,
|
|
1043
|
+
unionPolygons,
|
|
1044
|
+
intersectPolygons,
|
|
1045
|
+
subtractPolygons,
|
|
1046
|
+
xorPolygons,
|
|
1047
|
+
dividePolygons,
|
|
1048
|
+
polygonArea,
|
|
1049
|
+
multiPolygonArea,
|
|
1050
|
+
multiPolygonBounds,
|
|
1051
|
+
ringSignedArea,
|
|
1052
|
+
pointInRings,
|
|
1053
|
+
pointInMultiPolygon
|
|
1054
|
+
} from "@pixerate/editor/canvas";
|
|
975
1055
|
import {
|
|
976
1056
|
getLayoutedNodes as getLayoutedNodes2,
|
|
977
1057
|
ensureLayout as ensureLayout2,
|
|
@@ -1014,15 +1094,23 @@ export {
|
|
|
1014
1094
|
CanvasScenesStore2 as CanvasScenesStore,
|
|
1015
1095
|
DEFAULT_ARRANGE_SHORTCUTS,
|
|
1016
1096
|
ManualClock,
|
|
1097
|
+
SHAPE_DATA_KEY,
|
|
1098
|
+
SHAPE_KINDS,
|
|
1099
|
+
SHAPE_NODE_TYPE,
|
|
1100
|
+
SHAPE_OPERATIONS,
|
|
1101
|
+
ShapeNode,
|
|
1017
1102
|
alignNodes,
|
|
1018
1103
|
applyNodeUpdates,
|
|
1104
|
+
applyShapeCombination,
|
|
1019
1105
|
blendLayout,
|
|
1020
1106
|
boundsOf,
|
|
1021
1107
|
calculateDagreReflowDisplacement,
|
|
1022
1108
|
calculateDirectionalDisplacement2 as calculateDirectionalDisplacement,
|
|
1109
|
+
canCombineShapeNodes,
|
|
1023
1110
|
canvasHeight,
|
|
1024
1111
|
centerNodes2 as centerNodes,
|
|
1025
1112
|
centre,
|
|
1113
|
+
combineShapeNodes,
|
|
1026
1114
|
computeNodesBoundingBox,
|
|
1027
1115
|
computeSnapGuides,
|
|
1028
1116
|
connectedOnly,
|
|
@@ -1033,22 +1121,30 @@ export {
|
|
|
1033
1121
|
createNodeGuideIndex,
|
|
1034
1122
|
defaultEasing,
|
|
1035
1123
|
distributeNodes,
|
|
1124
|
+
dividePolygons,
|
|
1036
1125
|
ensureLayout2 as ensureLayout,
|
|
1037
1126
|
estimateCanvasHeight,
|
|
1038
1127
|
estimateNodeSize,
|
|
1039
1128
|
findConnectorSnap,
|
|
1040
1129
|
fitViewportToNodes2 as fitViewportToNodes,
|
|
1041
1130
|
fitViewportToRect,
|
|
1131
|
+
flattenSvgPath,
|
|
1042
1132
|
flowSide,
|
|
1043
1133
|
getAbsolutePosition,
|
|
1044
1134
|
getCenteredNodePosition2 as getCenteredNodePosition,
|
|
1045
1135
|
getLayoutedNodes2 as getLayoutedNodes,
|
|
1046
1136
|
getNodeRect,
|
|
1137
|
+
getNodeShape,
|
|
1047
1138
|
getNodeSize,
|
|
1139
|
+
getShapeRenderData2 as getShapeRenderData,
|
|
1140
|
+
getShapeSvg,
|
|
1048
1141
|
handlePoint,
|
|
1142
|
+
intersectPolygons,
|
|
1049
1143
|
invertNodeUpdates,
|
|
1050
1144
|
isEventFromTextInput3 as isEventFromTextInput,
|
|
1051
1145
|
isLocked,
|
|
1146
|
+
isShapeDescription2 as isShapeDescription,
|
|
1147
|
+
isShapeNode,
|
|
1052
1148
|
isValidCanvasNode,
|
|
1053
1149
|
isValidUrl2 as isValidUrl,
|
|
1054
1150
|
layoutBounds,
|
|
@@ -1057,23 +1153,38 @@ export {
|
|
|
1057
1153
|
lockNodes,
|
|
1058
1154
|
matchArrangeShortcut2 as matchArrangeShortcut,
|
|
1059
1155
|
matchSize,
|
|
1156
|
+
multiPolygonArea,
|
|
1157
|
+
multiPolygonBounds,
|
|
1060
1158
|
nearestHandlePositions,
|
|
1061
1159
|
oppositePosition,
|
|
1062
1160
|
overlaps,
|
|
1063
1161
|
parseCanvasClipboardData2 as parseCanvasClipboardData,
|
|
1064
1162
|
parseCanvasScenes,
|
|
1163
|
+
parseSvgPath,
|
|
1065
1164
|
placeBeside2 as placeBeside,
|
|
1165
|
+
pointInMultiPolygon,
|
|
1166
|
+
pointInRings,
|
|
1167
|
+
polygonArea,
|
|
1168
|
+
polygonBoolean,
|
|
1169
|
+
polygonToSvgPath,
|
|
1066
1170
|
positionToSide,
|
|
1067
1171
|
readStyleSize,
|
|
1068
1172
|
realClock,
|
|
1069
1173
|
remapPastedNodes2 as remapPastedNodes,
|
|
1070
1174
|
reorderNodes,
|
|
1071
1175
|
repositionNodesTo,
|
|
1176
|
+
revertShapeCombination,
|
|
1177
|
+
ringSignedArea,
|
|
1072
1178
|
runMultiNodeTransition2 as runMultiNodeTransition,
|
|
1073
1179
|
serializeCanvasNodes2 as serializeCanvasNodes,
|
|
1180
|
+
shapeNodeToPolygon,
|
|
1181
|
+
shapeToPolygon,
|
|
1074
1182
|
sideToPosition,
|
|
1183
|
+
simplifyRing,
|
|
1075
1184
|
snapNodeDrag,
|
|
1185
|
+
subtractPolygons,
|
|
1076
1186
|
toggleLockNodes,
|
|
1187
|
+
unionPolygons,
|
|
1077
1188
|
unlockNodes,
|
|
1078
1189
|
useCanvasArrange,
|
|
1079
1190
|
useCanvasArrangeShortcuts,
|
|
@@ -1085,6 +1196,7 @@ export {
|
|
|
1085
1196
|
useCanvasScenes,
|
|
1086
1197
|
useCanvasShortcuts,
|
|
1087
1198
|
useStreamingCanvas,
|
|
1088
|
-
withStyleSize
|
|
1199
|
+
withStyleSize,
|
|
1200
|
+
xorPolygons
|
|
1089
1201
|
};
|
|
1090
1202
|
//# sourceMappingURL=index.js.map
|
package/dist/canvas/index.js.map
CHANGED
|
@@ -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/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-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 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}\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\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\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\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\t<line\n\t\t\t\t\tkey={i}\n\t\t\t\t\tdata-kind={guide.kind}\n\t\t\t\t\tx1={sx(guide.x1)}\n\t\t\t\t\ty1={sy(guide.y1)}\n\t\t\t\t\tx2={sx(guide.x2)}\n\t\t\t\t\ty2={sy(guide.y2)}\n\t\t\t\t\tstroke={guide.kind === 'spacing' ? spacingColor : color}\n\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\tstrokeDasharray={guide.kind === 'centre' ? '4 3' : undefined}\n\t\t\t\t\tshapeRendering=\"crispEdges\"\n\t\t\t\t/>\n\t\t\t))}\n\t\t</svg>\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// 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\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\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"],"mappings":"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","names":["useCallback","useRef","useCallback","useCallback","useEffect","isEventFromTextInput","useCallback","useRef","useCallback","useRef","useEffect","useRef","useState","useMemo","useRef","jsx","CanvasScenesStore","fitViewportToNodes","matchArrangeShortcut","getLayoutedNodes","ensureLayout","centerNodes","getCenteredNodePosition","placeBeside","linearPositionTrajectory","createFanOutTrajectory","runMultiNodeTransition","calculateDirectionalDisplacement","isEventFromTextInput","isValidUrl","serializeCanvasNodes","parseCanvasClipboardData","remapPastedNodes"]}
|
|
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/index.ts","../../src/canvas/ShapeNode.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 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}\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\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\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\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\t<line\n\t\t\t\t\tkey={i}\n\t\t\t\t\tdata-kind={guide.kind}\n\t\t\t\t\tx1={sx(guide.x1)}\n\t\t\t\t\ty1={sy(guide.y1)}\n\t\t\t\t\tx2={sx(guide.x2)}\n\t\t\t\t\ty2={sy(guide.y2)}\n\t\t\t\t\tstroke={guide.kind === 'spacing' ? spacingColor : color}\n\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\tstrokeDasharray={guide.kind === 'centre' ? '4 3' : undefined}\n\t\t\t\t\tshapeRendering=\"crispEdges\"\n\t\t\t\t/>\n\t\t\t))}\n\t\t</svg>\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// 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\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// 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","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({ 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 });\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<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\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"],"mappings":"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","names":["useCallback","useRef","useCallback","useCallback","useEffect","isEventFromTextInput","useCallback","useRef","useCallback","useRef","useEffect","useRef","useState","useMemo","useRef","jsx","CanvasScenesStore","fitViewportToNodes","matchArrangeShortcut","jsx","jsxs","isShapeDescription","getShapeRenderData","getLayoutedNodes","ensureLayout","centerNodes","getCenteredNodePosition","placeBeside","linearPositionTrajectory","createFanOutTrajectory","runMultiNodeTransition","calculateDirectionalDisplacement","isEventFromTextInput","isValidUrl","serializeCanvasNodes","parseCanvasClipboardData","remapPastedNodes"]}
|