entangle-ui 0.10.0 → 0.11.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.
Files changed (563) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +7 -5
  3. package/dist/esm/assets/src/components/controls/Select/{Select.css.ts.vanilla-oZnFUorL.css → Select.css.ts.vanilla-Cpu2BvWL.css} +3 -0
  4. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertyPanel.css.ts.vanilla-RYv_XgOu.css → PropertyPanel.css.ts.vanilla-Dpr_k5I3.css} +4 -1
  5. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertyRow.css.ts.vanilla-C3YZnnHb.css → PropertyRow.css.ts.vanilla-pq1Uhd2a.css} +15 -8
  6. package/dist/esm/assets/src/components/editor/PropertyInspector/{PropertySection.css.ts.vanilla-DK12opZc.css → PropertySection.css.ts.vanilla-6MWWAqyd.css} +50 -32
  7. package/dist/esm/components/Icons/AddIcon.js.map +1 -1
  8. package/dist/esm/components/Icons/AiChatIcon.js.map +1 -1
  9. package/dist/esm/components/Icons/AiSparklesIcon.js.map +1 -1
  10. package/dist/esm/components/Icons/ArchiveIcon.js.map +1 -1
  11. package/dist/esm/components/Icons/ArrowDownIcon.js.map +1 -1
  12. package/dist/esm/components/Icons/ArrowLeftIcon.js.map +1 -1
  13. package/dist/esm/components/Icons/ArrowRightIcon.js.map +1 -1
  14. package/dist/esm/components/Icons/ArrowUpIcon.js.map +1 -1
  15. package/dist/esm/components/Icons/BookmarkIcon.js.map +1 -1
  16. package/dist/esm/components/Icons/BugIcon.js.map +1 -1
  17. package/dist/esm/components/Icons/BuildingIcon.js.map +1 -1
  18. package/dist/esm/components/Icons/CalendarIcon.js.map +1 -1
  19. package/dist/esm/components/Icons/CameraIcon.js +31 -0
  20. package/dist/esm/components/Icons/CameraIcon.js.map +1 -0
  21. package/dist/esm/components/Icons/CheckIcon.js.map +1 -1
  22. package/dist/esm/components/Icons/ChevronDownIcon.js.map +1 -1
  23. package/dist/esm/components/Icons/ChevronLeftIcon.js.map +1 -1
  24. package/dist/esm/components/Icons/ChevronRightIcon.js.map +1 -1
  25. package/dist/esm/components/Icons/ChevronUpIcon.js.map +1 -1
  26. package/dist/esm/components/Icons/CircleIcon.js.map +1 -1
  27. package/dist/esm/components/Icons/ClockIcon.js.map +1 -1
  28. package/dist/esm/components/Icons/CloseIcon.js.map +1 -1
  29. package/dist/esm/components/Icons/CloudUploadIcon.js.map +1 -1
  30. package/dist/esm/components/Icons/CodeIcon.js.map +1 -1
  31. package/dist/esm/components/Icons/CopyIcon.js.map +1 -1
  32. package/dist/esm/components/Icons/CubeIcon.js +31 -0
  33. package/dist/esm/components/Icons/CubeIcon.js.map +1 -0
  34. package/dist/esm/components/Icons/CutIcon.js.map +1 -1
  35. package/dist/esm/components/Icons/DotsHorizontalIcon.js.map +1 -1
  36. package/dist/esm/components/Icons/DotsVerticalIcon.js.map +1 -1
  37. package/dist/esm/components/Icons/DownloadIcon.js.map +1 -1
  38. package/dist/esm/components/Icons/EditIcon.js.map +1 -1
  39. package/dist/esm/components/Icons/ErrorIcon.js.map +1 -1
  40. package/dist/esm/components/Icons/ExternalLinkIcon.js.map +1 -1
  41. package/dist/esm/components/Icons/EyeDropperIcon.js.map +1 -1
  42. package/dist/esm/components/Icons/EyeIcon.js.map +1 -1
  43. package/dist/esm/components/Icons/FileTextIcon.js.map +1 -1
  44. package/dist/esm/components/Icons/FilterIcon.js.map +1 -1
  45. package/dist/esm/components/Icons/FirstIcon.js.map +1 -1
  46. package/dist/esm/components/Icons/FolderCogIcon.js.map +1 -1
  47. package/dist/esm/components/Icons/FolderIcon.js.map +1 -1
  48. package/dist/esm/components/Icons/FolderOpenIcon.js.map +1 -1
  49. package/dist/esm/components/Icons/FullscreenIcon.js.map +1 -1
  50. package/dist/esm/components/Icons/GitBranchIcon.js.map +1 -1
  51. package/dist/esm/components/Icons/GridIcon.js.map +1 -1
  52. package/dist/esm/components/Icons/HeartIcon.js.map +1 -1
  53. package/dist/esm/components/Icons/HelpIcon.js.map +1 -1
  54. package/dist/esm/components/Icons/HomeIcon.js.map +1 -1
  55. package/dist/esm/components/Icons/ImageIcon.js.map +1 -1
  56. package/dist/esm/components/Icons/InfoIcon.js.map +1 -1
  57. package/dist/esm/components/Icons/LastIcon.js.map +1 -1
  58. package/dist/esm/components/Icons/LinkIcon.js.map +1 -1
  59. package/dist/esm/components/Icons/ListIcon.js.map +1 -1
  60. package/dist/esm/components/Icons/LockIcon.js.map +1 -1
  61. package/dist/esm/components/Icons/MaximizeIcon.js.map +1 -1
  62. package/dist/esm/components/Icons/MenuIcon.js.map +1 -1
  63. package/dist/esm/components/Icons/MinimizeIcon.js.map +1 -1
  64. package/dist/esm/components/Icons/MinusIcon.js.map +1 -1
  65. package/dist/esm/components/Icons/OrbitIcon.js +31 -0
  66. package/dist/esm/components/Icons/OrbitIcon.js.map +1 -0
  67. package/dist/esm/components/Icons/PasteIcon.js.map +1 -1
  68. package/dist/esm/components/Icons/PauseIcon.js.map +1 -1
  69. package/dist/esm/components/Icons/PinIcon.js.map +1 -1
  70. package/dist/esm/components/Icons/PlayIcon.js.map +1 -1
  71. package/dist/esm/components/Icons/RedoIcon.js.map +1 -1
  72. package/dist/esm/components/Icons/RefreshIcon.js.map +1 -1
  73. package/dist/esm/components/Icons/RobotIcon.js.map +1 -1
  74. package/dist/esm/components/Icons/RotateIcon.js +32 -0
  75. package/dist/esm/components/Icons/RotateIcon.js.map +1 -0
  76. package/dist/esm/components/Icons/SaveIcon.js.map +1 -1
  77. package/dist/esm/components/Icons/SearchIcon.js.map +1 -1
  78. package/dist/esm/components/Icons/SendIcon.js.map +1 -1
  79. package/dist/esm/components/Icons/SettingsIcon.js.map +1 -1
  80. package/dist/esm/components/Icons/SortIcon.js.map +1 -1
  81. package/dist/esm/components/Icons/SpinIcon.js +32 -0
  82. package/dist/esm/components/Icons/SpinIcon.js.map +1 -0
  83. package/dist/esm/components/Icons/StarIcon.js.map +1 -1
  84. package/dist/esm/components/Icons/StopIcon.js.map +1 -1
  85. package/dist/esm/components/Icons/SuccessIcon.js.map +1 -1
  86. package/dist/esm/components/Icons/TagIcon.js.map +1 -1
  87. package/dist/esm/components/Icons/TangentAlignedIcon.js.map +1 -1
  88. package/dist/esm/components/Icons/TangentAutoIcon.js.map +1 -1
  89. package/dist/esm/components/Icons/TangentFreeIcon.js.map +1 -1
  90. package/dist/esm/components/Icons/TangentLinearIcon.js.map +1 -1
  91. package/dist/esm/components/Icons/TangentMirroredIcon.js.map +1 -1
  92. package/dist/esm/components/Icons/TangentStepIcon.js.map +1 -1
  93. package/dist/esm/components/Icons/TerminalIcon.js.map +1 -1
  94. package/dist/esm/components/Icons/TrashIcon.js.map +1 -1
  95. package/dist/esm/components/Icons/UndoIcon.js.map +1 -1
  96. package/dist/esm/components/Icons/UnlinkIcon.js.map +1 -1
  97. package/dist/esm/components/Icons/UnlockIcon.js.map +1 -1
  98. package/dist/esm/components/Icons/UploadIcon.js.map +1 -1
  99. package/dist/esm/components/Icons/UserIcon.js.map +1 -1
  100. package/dist/esm/components/Icons/UsersIcon.js.map +1 -1
  101. package/dist/esm/components/Icons/WarningIcon.js.map +1 -1
  102. package/dist/esm/components/Icons/ZoomFitIcon.js +32 -0
  103. package/dist/esm/components/Icons/ZoomFitIcon.js.map +1 -0
  104. package/dist/esm/components/Icons/ZoomInIcon.js.map +1 -1
  105. package/dist/esm/components/Icons/ZoomOutIcon.js.map +1 -1
  106. package/dist/esm/components/controls/CartesianPicker/CartesianPicker.js.map +1 -1
  107. package/dist/esm/components/controls/CartesianPicker/useCartesianInteraction.js.map +1 -1
  108. package/dist/esm/components/controls/CartesianPicker/useCartesianRenderer.js.map +1 -1
  109. package/dist/esm/components/controls/ColorPicker/AlphaSlider.js.map +1 -1
  110. package/dist/esm/components/controls/ColorPicker/ColorArea.js.map +1 -1
  111. package/dist/esm/components/controls/ColorPicker/ColorInputs.js.map +1 -1
  112. package/dist/esm/components/controls/ColorPicker/ColorPalette.js.map +1 -1
  113. package/dist/esm/components/controls/ColorPicker/ColorPicker.js.map +1 -1
  114. package/dist/esm/components/controls/ColorPicker/ColorPresets.js.map +1 -1
  115. package/dist/esm/components/controls/ColorPicker/ColorSwatch.js.map +1 -1
  116. package/dist/esm/components/controls/ColorPicker/EyeDropper.js.map +1 -1
  117. package/dist/esm/components/controls/ColorPicker/HueSlider.js.map +1 -1
  118. package/dist/esm/components/controls/ColorPicker/colorUtils.js.map +1 -1
  119. package/dist/esm/components/controls/ColorPicker/palettes/material.js.map +1 -1
  120. package/dist/esm/components/controls/ColorPicker/palettes/professional.js.map +1 -1
  121. package/dist/esm/components/controls/ColorPicker/palettes/tailwind.js.map +1 -1
  122. package/dist/esm/components/controls/ColorPicker/useColor.js.map +1 -1
  123. package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -1
  124. package/dist/esm/components/controls/CurveEditor/CurveCanvas.js.map +1 -1
  125. package/dist/esm/components/controls/CurveEditor/CurveEditor.js.map +1 -1
  126. package/dist/esm/components/controls/CurveEditor/CurveToolbar.js.map +1 -1
  127. package/dist/esm/components/controls/CurveEditor/curvePresets.js.map +1 -1
  128. package/dist/esm/components/controls/CurveEditor/curveUtils.js.map +1 -1
  129. package/dist/esm/components/controls/CurveEditor/useCurveInteraction.js.map +1 -1
  130. package/dist/esm/components/controls/CurveEditor/useCurveRenderer.js.map +1 -1
  131. package/dist/esm/components/controls/FileTree/FileTree.js +7 -1
  132. package/dist/esm/components/controls/FileTree/FileTree.js.map +1 -1
  133. package/dist/esm/components/controls/FileTree/fileTreeIcons.js.map +1 -1
  134. package/dist/esm/components/controls/FileTree/fileTreeLabels.js.map +1 -1
  135. package/dist/esm/components/controls/FileTree/useFileTreeDrop.js +1 -1
  136. package/dist/esm/components/controls/FileTree/useFileTreeDrop.js.map +1 -1
  137. package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -1
  138. package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -1
  139. package/dist/esm/components/controls/NumberInput/NumberInput.js.map +1 -1
  140. package/dist/esm/components/controls/NumberInput/useNumberInput.js.map +1 -1
  141. package/dist/esm/components/controls/Select/Select.css.js +1 -1
  142. package/dist/esm/components/controls/Select/Select.js +15 -7
  143. package/dist/esm/components/controls/Select/Select.js.map +1 -1
  144. package/dist/esm/components/controls/Slider/Slider.js.map +1 -1
  145. package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -1
  146. package/dist/esm/components/controls/TreeView/TreeNode.js +6 -0
  147. package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
  148. package/dist/esm/components/controls/TreeView/TreeView.js.map +1 -1
  149. package/dist/esm/components/controls/TreeView/useTreeState.js.map +1 -1
  150. package/dist/esm/components/controls/VectorInput/VectorInput.js +6 -0
  151. package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
  152. package/dist/esm/components/data/DataTable/DataTable.js.map +1 -1
  153. package/dist/esm/components/editor/AssetBrowser/AssetBrowser.js.map +1 -1
  154. package/dist/esm/components/editor/AssetBrowser/AssetBrowserAnnouncementLive.js.map +1 -1
  155. package/dist/esm/components/editor/AssetBrowser/AssetBrowserBreadcrumbs.js.map +1 -1
  156. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js +6 -0
  157. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContent.js.map +1 -1
  158. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContext.js.map +1 -1
  159. package/dist/esm/components/editor/AssetBrowser/AssetBrowserContextMenu.js.map +1 -1
  160. package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js +6 -0
  161. package/dist/esm/components/editor/AssetBrowser/AssetBrowserDefaultMenus.js.map +1 -1
  162. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js +1 -1
  163. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGrid.js.map +1 -1
  164. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js +6 -0
  165. package/dist/esm/components/editor/AssetBrowser/AssetBrowserGridItem.js.map +1 -1
  166. package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js +6 -0
  167. package/dist/esm/components/editor/AssetBrowser/AssetBrowserList.js.map +1 -1
  168. package/dist/esm/components/editor/AssetBrowser/AssetBrowserRenameField.js.map +1 -1
  169. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSidebar.js.map +1 -1
  170. package/dist/esm/components/editor/AssetBrowser/AssetBrowserStatusBar.js.map +1 -1
  171. package/dist/esm/components/editor/AssetBrowser/AssetBrowserStore.js.map +1 -1
  172. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js +6 -0
  173. package/dist/esm/components/editor/AssetBrowser/AssetBrowserSurface.js.map +1 -1
  174. package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js +6 -0
  175. package/dist/esm/components/editor/AssetBrowser/AssetBrowserToolbar.js.map +1 -1
  176. package/dist/esm/components/editor/AssetBrowser/assetBrowserFilter.js.map +1 -1
  177. package/dist/esm/components/editor/AssetBrowser/assetBrowserFormat.js.map +1 -1
  178. package/dist/esm/components/editor/AssetBrowser/assetBrowserGeometry.js.map +1 -1
  179. package/dist/esm/components/editor/AssetBrowser/assetBrowserKeyboard.js.map +1 -1
  180. package/dist/esm/components/editor/AssetBrowser/assetBrowserLabels.js.map +1 -1
  181. package/dist/esm/components/editor/AssetBrowser/slots.js.map +1 -1
  182. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserAnnouncement.js.map +1 -1
  183. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js +1 -1
  184. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserHandle.js.map +1 -1
  185. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js +1 -1
  186. package/dist/esm/components/editor/AssetBrowser/useAssetBrowserViewState.js.map +1 -1
  187. package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js +1 -1
  188. package/dist/esm/components/editor/AssetBrowser/useAssetDnd.js.map +1 -1
  189. package/dist/esm/components/editor/AssetBrowser/useAssetGridKeyboardNav.js.map +1 -1
  190. package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js +1 -1
  191. package/dist/esm/components/editor/AssetBrowser/useAssetGridVirtualizer.js.map +1 -1
  192. package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js +1 -1
  193. package/dist/esm/components/editor/AssetBrowser/useAssetMarqueeGesture.js.map +1 -1
  194. package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js +1 -1
  195. package/dist/esm/components/editor/AssetBrowser/useAssetMutationKeyboard.js.map +1 -1
  196. package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js +1 -1
  197. package/dist/esm/components/editor/AssetBrowser/useAssetMutations.js.map +1 -1
  198. package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js +1 -1
  199. package/dist/esm/components/editor/AssetBrowser/useAssetNavigation.js.map +1 -1
  200. package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js +1 -1
  201. package/dist/esm/components/editor/AssetBrowser/useAssetSelectionController.js.map +1 -1
  202. package/dist/esm/components/editor/ChatPanel/ChatActionBar.js.map +1 -1
  203. package/dist/esm/components/editor/ChatPanel/ChatAttachment.js.map +1 -1
  204. package/dist/esm/components/editor/ChatPanel/ChatBubble.js.map +1 -1
  205. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js +6 -0
  206. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
  207. package/dist/esm/components/editor/ChatPanel/ChatContextChip.js.map +1 -1
  208. package/dist/esm/components/editor/ChatPanel/ChatEmptyState.js.map +1 -1
  209. package/dist/esm/components/editor/ChatPanel/ChatIcons.js.map +1 -1
  210. package/dist/esm/components/editor/ChatPanel/ChatInput.js +6 -0
  211. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  212. package/dist/esm/components/editor/ChatPanel/ChatInputToolbar.js.map +1 -1
  213. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -1
  214. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +6 -0
  215. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  216. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
  217. package/dist/esm/components/editor/ChatPanel/ChatPanel.js.map +1 -1
  218. package/dist/esm/components/editor/ChatPanel/ChatToolCall.js.map +1 -1
  219. package/dist/esm/components/editor/ChatPanel/ChatTypingIndicator.js.map +1 -1
  220. package/dist/esm/components/editor/ChatPanel/useChatInput.js.map +1 -1
  221. package/dist/esm/components/editor/ChatPanel/useChatMessages.js.map +1 -1
  222. package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
  223. package/dist/esm/components/editor/Minimap/Minimap.js +1 -1
  224. package/dist/esm/components/editor/Minimap/Minimap.js.map +1 -1
  225. package/dist/esm/components/editor/Minimap/Minimap.types.js.map +1 -1
  226. package/dist/esm/components/editor/Minimap/MinimapContext.js.map +1 -1
  227. package/dist/esm/components/editor/Minimap/MinimapCorner.js.map +1 -1
  228. package/dist/esm/components/editor/Minimap/MinimapFooter.js.map +1 -1
  229. package/dist/esm/components/editor/Minimap/MinimapStore.js.map +1 -1
  230. package/dist/esm/components/editor/Minimap/MinimapTitle.js.map +1 -1
  231. package/dist/esm/components/editor/Minimap/ViewportMinimap.js +1 -1
  232. package/dist/esm/components/editor/Minimap/ViewportMinimap.js.map +1 -1
  233. package/dist/esm/components/editor/Minimap/computeBoundsFromItems.js.map +1 -1
  234. package/dist/esm/components/editor/Minimap/index.js.map +1 -1
  235. package/dist/esm/components/editor/Minimap/minimapCoords.js.map +1 -1
  236. package/dist/esm/components/editor/Minimap/minimapDrawing.js.map +1 -1
  237. package/dist/esm/components/editor/Minimap/minimapHitTest.js.map +1 -1
  238. package/dist/esm/components/editor/Minimap/useMinimapGestures.js +1 -1
  239. package/dist/esm/components/editor/Minimap/useMinimapGestures.js.map +1 -1
  240. package/dist/esm/components/editor/NodeGraph/NodeGraph.js +1 -1
  241. package/dist/esm/components/editor/NodeGraph/NodeGraph.js.map +1 -1
  242. package/dist/esm/components/editor/NodeGraph/NodeGraph.types.js.map +1 -1
  243. package/dist/esm/components/editor/NodeGraph/NodeGraphContext.js.map +1 -1
  244. package/dist/esm/components/editor/NodeGraph/NodeGraphEdgeLabels.js.map +1 -1
  245. package/dist/esm/components/editor/NodeGraph/NodeGraphGroup.js.map +1 -1
  246. package/dist/esm/components/editor/NodeGraph/NodeGraphMinimap.js.map +1 -1
  247. package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js +1 -1
  248. package/dist/esm/components/editor/NodeGraph/NodeGraphNode.js.map +1 -1
  249. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeContext.js.map +1 -1
  250. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeParts.js.map +1 -1
  251. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js +1 -1
  252. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSection.js.map +1 -1
  253. package/dist/esm/components/editor/NodeGraph/NodeGraphNodeSectionContext.js.map +1 -1
  254. package/dist/esm/components/editor/NodeGraph/NodeGraphPin.js.map +1 -1
  255. package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js +1 -1
  256. package/dist/esm/components/editor/NodeGraph/NodeGraphPort.js.map +1 -1
  257. package/dist/esm/components/editor/NodeGraph/NodeGraphPortVisual.js.map +1 -1
  258. package/dist/esm/components/editor/NodeGraph/NodeGraphSlots.js.map +1 -1
  259. package/dist/esm/components/editor/NodeGraph/NodeGraphSpawnPalette.js.map +1 -1
  260. package/dist/esm/components/editor/NodeGraph/NodeGraphStore.js.map +1 -1
  261. package/dist/esm/components/editor/NodeGraph/NodeGraphToolbar.js.map +1 -1
  262. package/dist/esm/components/editor/NodeGraph/createTypeMatchValidator.js.map +1 -1
  263. package/dist/esm/components/editor/NodeGraph/nodeGraphActions.js.map +1 -1
  264. package/dist/esm/components/editor/NodeGraph/nodeGraphDrawing.js.map +1 -1
  265. package/dist/esm/components/editor/NodeGraph/nodeGraphIds.js.map +1 -1
  266. package/dist/esm/components/editor/NodeGraph/nodeGraphMath.js.map +1 -1
  267. package/dist/esm/components/editor/NodeGraph/sortSlots.js.map +1 -1
  268. package/dist/esm/components/editor/NodeGraph/useDragGesture.js.map +1 -1
  269. package/dist/esm/components/editor/NodeGraph/useNodeGraph.js +1 -1
  270. package/dist/esm/components/editor/NodeGraph/useNodeGraph.js.map +1 -1
  271. package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js +1 -1
  272. package/dist/esm/components/editor/NodeGraph/useNodeGraphConnection.js.map +1 -1
  273. package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js +1 -1
  274. package/dist/esm/components/editor/NodeGraph/useNodeGraphEdgeInteraction.js.map +1 -1
  275. package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js +1 -1
  276. package/dist/esm/components/editor/NodeGraph/useNodeGraphGroupDrag.js.map +1 -1
  277. package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js +1 -1
  278. package/dist/esm/components/editor/NodeGraph/useNodeGraphKeyboard.js.map +1 -1
  279. package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js +1 -1
  280. package/dist/esm/components/editor/NodeGraph/useNodeGraphNodeDrag.js.map +1 -1
  281. package/dist/esm/components/editor/NodeGraph/useStoreSlice.js.map +1 -1
  282. package/dist/esm/components/editor/PropertyInspector/PropertyGroup.js.map +1 -1
  283. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.css.js +4 -3
  284. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.css.js.map +1 -1
  285. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js +5 -4
  286. package/dist/esm/components/editor/PropertyInspector/PropertyPanel.js.map +1 -1
  287. package/dist/esm/components/editor/PropertyInspector/PropertyRow.css.js +7 -6
  288. package/dist/esm/components/editor/PropertyInspector/PropertyRow.css.js.map +1 -1
  289. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +18 -3
  290. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -1
  291. package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js +11 -10
  292. package/dist/esm/components/editor/PropertyInspector/PropertySection.css.js.map +1 -1
  293. package/dist/esm/components/editor/PropertyInspector/PropertySection.js +29 -21
  294. package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -1
  295. package/dist/esm/components/editor/PropertyInspector/usePropertyUndo.js.map +1 -1
  296. package/dist/esm/components/editor/Timeline/Timeline.js +1 -1
  297. package/dist/esm/components/editor/Timeline/Timeline.js.map +1 -1
  298. package/dist/esm/components/editor/Timeline/Timeline.types.js.map +1 -1
  299. package/dist/esm/components/editor/Timeline/TimelineContext.js.map +1 -1
  300. package/dist/esm/components/editor/Timeline/TimelineFooter.js.map +1 -1
  301. package/dist/esm/components/editor/Timeline/TimelineMinimap.js +1 -1
  302. package/dist/esm/components/editor/Timeline/TimelineMinimap.js.map +1 -1
  303. package/dist/esm/components/editor/Timeline/TimelineStore.js.map +1 -1
  304. package/dist/esm/components/editor/Timeline/TimelineToolbar.js.map +1 -1
  305. package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js +1 -1
  306. package/dist/esm/components/editor/Timeline/TimelineTrackHeaders.js.map +1 -1
  307. package/dist/esm/components/editor/Timeline/TimelineTrackScale.js.map +1 -1
  308. package/dist/esm/components/editor/Timeline/index.js.map +1 -1
  309. package/dist/esm/components/editor/Timeline/timelineCoords.js.map +1 -1
  310. package/dist/esm/components/editor/Timeline/timelineDrawing.js.map +1 -1
  311. package/dist/esm/components/editor/Timeline/timelineEdits.js.map +1 -1
  312. package/dist/esm/components/editor/Timeline/timelineHitTest.js.map +1 -1
  313. package/dist/esm/components/editor/Timeline/timelineLayout.js.map +1 -1
  314. package/dist/esm/components/editor/Timeline/timelineSelection.js.map +1 -1
  315. package/dist/esm/components/editor/Timeline/useTimelineDraw.js +1 -1
  316. package/dist/esm/components/editor/Timeline/useTimelineDraw.js.map +1 -1
  317. package/dist/esm/components/editor/Timeline/useTimelineGestures.js +1 -1
  318. package/dist/esm/components/editor/Timeline/useTimelineGestures.js.map +1 -1
  319. package/dist/esm/components/editor/Timeline/useTimelinePlayback.js.map +1 -1
  320. package/dist/esm/components/editor/TransformControl/TransformControl.js.map +1 -1
  321. package/dist/esm/components/editor/ViewportGizmo/ViewportGizmo.js.map +1 -1
  322. package/dist/esm/components/editor/ViewportGizmo/gizmoMath.js.map +1 -1
  323. package/dist/esm/components/editor/ViewportGizmo/useGizmoInteraction.js.map +1 -1
  324. package/dist/esm/components/editor/ViewportGizmo/useGizmoRenderer.js.map +1 -1
  325. package/dist/esm/components/feedback/Alert/Alert.js.map +1 -1
  326. package/dist/esm/components/feedback/Alert/AlertActions.js.map +1 -1
  327. package/dist/esm/components/feedback/Alert/AlertDescription.js.map +1 -1
  328. package/dist/esm/components/feedback/Alert/AlertTitle.js.map +1 -1
  329. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js.map +1 -1
  330. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js.map +1 -1
  331. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -1
  332. package/dist/esm/components/feedback/Dialog/Dialog.js.map +1 -1
  333. package/dist/esm/components/feedback/Dialog/DialogBody.js.map +1 -1
  334. package/dist/esm/components/feedback/Dialog/DialogClose.js.map +1 -1
  335. package/dist/esm/components/feedback/Dialog/DialogFooter.js.map +1 -1
  336. package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
  337. package/dist/esm/components/feedback/Dialog/useDialogAnimation.js.map +1 -1
  338. package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -1
  339. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -1
  340. package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -1
  341. package/dist/esm/components/feedback/LogView/LogView.js.map +1 -1
  342. package/dist/esm/components/feedback/LogView/LogViewBody.js.map +1 -1
  343. package/dist/esm/components/feedback/LogView/LogViewContext.js.map +1 -1
  344. package/dist/esm/components/feedback/LogView/LogViewParts.js.map +1 -1
  345. package/dist/esm/components/feedback/LogView/LogViewStore.js.map +1 -1
  346. package/dist/esm/components/feedback/LogView/logViewLabels.js.map +1 -1
  347. package/dist/esm/components/feedback/LogView/logViewLevels.js.map +1 -1
  348. package/dist/esm/components/feedback/LogView/logViewUtils.js.map +1 -1
  349. package/dist/esm/components/feedback/LogView/useFollowTail.js.map +1 -1
  350. package/dist/esm/components/feedback/LogView/useLogSelection.js.map +1 -1
  351. package/dist/esm/components/feedback/ProgressBar/CircularProgress.js.map +1 -1
  352. package/dist/esm/components/feedback/ProgressBar/ProgressBar.js.map +1 -1
  353. package/dist/esm/components/feedback/Skeleton/Skeleton.js.map +1 -1
  354. package/dist/esm/components/feedback/Skeleton/SkeletonGroup.js.map +1 -1
  355. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -1
  356. package/dist/esm/components/feedback/Spinner/Spinner.js.map +1 -1
  357. package/dist/esm/components/feedback/Stat/Stat.js.map +1 -1
  358. package/dist/esm/components/feedback/Toast/ToastContainer.js.map +1 -1
  359. package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -1
  360. package/dist/esm/components/feedback/Toast/ToastProvider.js.map +1 -1
  361. package/dist/esm/components/feedback/Toast/useToast.js.map +1 -1
  362. package/dist/esm/components/form/FormHelperText.js.map +1 -1
  363. package/dist/esm/components/form/FormLabel.js.map +1 -1
  364. package/dist/esm/components/form/InputWrapper.js.map +1 -1
  365. package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
  366. package/dist/esm/components/layout/Accordion/AccordionContent.js.map +1 -1
  367. package/dist/esm/components/layout/Accordion/AccordionItem.js.map +1 -1
  368. package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
  369. package/dist/esm/components/layout/Card/Card.js.map +1 -1
  370. package/dist/esm/components/layout/Divider/Divider.js.map +1 -1
  371. package/dist/esm/components/layout/Flex/Flex.js.map +1 -1
  372. package/dist/esm/components/layout/Grid/Grid.js.map +1 -1
  373. package/dist/esm/components/layout/ListItem/ListItem.js.map +1 -1
  374. package/dist/esm/components/layout/PageHeader/PageHeader.js.map +1 -1
  375. package/dist/esm/components/layout/PanelSurface/PanelSurface.js.map +1 -1
  376. package/dist/esm/components/layout/ScrollArea/ScrollArea.js.map +1 -1
  377. package/dist/esm/components/layout/Spacer/Spacer.js.map +1 -1
  378. package/dist/esm/components/layout/SplitPane/SplitPane.js.map +1 -1
  379. package/dist/esm/components/layout/SplitPane/SplitPanePanel.js.map +1 -1
  380. package/dist/esm/components/layout/Stack/Stack.js.map +1 -1
  381. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
  382. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -1
  383. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbSeparator.js.map +1 -1
  384. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +6 -0
  385. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
  386. package/dist/esm/components/navigation/ContextMenu/ContextMenu.js.map +1 -1
  387. package/dist/esm/components/navigation/Menu/Menu.js.map +1 -1
  388. package/dist/esm/components/navigation/Menu/MenuGapContext.js.map +1 -1
  389. package/dist/esm/components/navigation/Pagination/Pagination.js.map +1 -1
  390. package/dist/esm/components/navigation/Pagination/usePagination.js.map +1 -1
  391. package/dist/esm/components/navigation/PathBar/PathBar.js +7 -1
  392. package/dist/esm/components/navigation/PathBar/PathBar.js.map +1 -1
  393. package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js +6 -0
  394. package/dist/esm/components/navigation/PathBar/PathBarSiblingMenu.js.map +1 -1
  395. package/dist/esm/components/navigation/PathBar/pathUtils.js.map +1 -1
  396. package/dist/esm/components/navigation/SegmentedControl/SegmentedControl.js.map +1 -1
  397. package/dist/esm/components/navigation/SegmentedControl/SegmentedControlItem.js.map +1 -1
  398. package/dist/esm/components/navigation/Tabs/Tab.js.map +1 -1
  399. package/dist/esm/components/navigation/Tabs/TabList.js.map +1 -1
  400. package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -1
  401. package/dist/esm/components/navigation/Tabs/Tabs.js.map +1 -1
  402. package/dist/esm/components/primitives/Avatar/Avatar.js +6 -0
  403. package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
  404. package/dist/esm/components/primitives/Avatar/AvatarGroup.js.map +1 -1
  405. package/dist/esm/components/primitives/Badge/Badge.js +6 -0
  406. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -1
  407. package/dist/esm/components/primitives/Button/Button.js.map +1 -1
  408. package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
  409. package/dist/esm/components/primitives/Checkbox/CheckboxGroup.js.map +1 -1
  410. package/dist/esm/components/primitives/Code/Code.js.map +1 -1
  411. package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
  412. package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -1
  413. package/dist/esm/components/primitives/Icon/Icon.js.map +1 -1
  414. package/dist/esm/components/primitives/IconButton/IconButton.js.map +1 -1
  415. package/dist/esm/components/primitives/Input/Input.js.map +1 -1
  416. package/dist/esm/components/primitives/Kbd/Kbd.js.map +1 -1
  417. package/dist/esm/components/primitives/Link/Link.js.map +1 -1
  418. package/dist/esm/components/primitives/Paper/Paper.js.map +1 -1
  419. package/dist/esm/components/primitives/Popover/Popover.js.map +1 -1
  420. package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
  421. package/dist/esm/components/primitives/Popover/PopoverContent.js.map +1 -1
  422. package/dist/esm/components/primitives/Popover/PopoverTrigger.js.map +1 -1
  423. package/dist/esm/components/primitives/Radio/Radio.js.map +1 -1
  424. package/dist/esm/components/primitives/Radio/RadioGroup.js.map +1 -1
  425. package/dist/esm/components/primitives/Switch/Switch.js.map +1 -1
  426. package/dist/esm/components/primitives/Text/Text.js.map +1 -1
  427. package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -1
  428. package/dist/esm/components/primitives/Tooltip/Arrow.js.map +1 -1
  429. package/dist/esm/components/primitives/Tooltip/Tooltip.js.map +1 -1
  430. package/dist/esm/components/primitives/Tooltip/utils.js.map +1 -1
  431. package/dist/esm/components/primitives/VisuallyHidden/VisuallyHidden.js.map +1 -1
  432. package/dist/esm/components/primitives/canvas/CanvasContainer.js.map +1 -1
  433. package/dist/esm/components/primitives/canvas/canvasCoords.js.map +1 -1
  434. package/dist/esm/components/primitives/canvas/canvasDrawing.js.map +1 -1
  435. package/dist/esm/components/primitives/canvas/canvasTheme.js.map +1 -1
  436. package/dist/esm/components/primitives/canvas/useCanvasRenderer.js.map +1 -1
  437. package/dist/esm/components/primitives/viewport/Viewport.js +1 -1
  438. package/dist/esm/components/primitives/viewport/Viewport.js.map +1 -1
  439. package/dist/esm/components/primitives/viewport/ViewportContext.js.map +1 -1
  440. package/dist/esm/components/primitives/viewport/ViewportLayer.js +1 -1
  441. package/dist/esm/components/primitives/viewport/ViewportLayer.js.map +1 -1
  442. package/dist/esm/components/primitives/viewport/ViewportOverlay.js.map +1 -1
  443. package/dist/esm/components/primitives/viewport/ViewportStore.js.map +1 -1
  444. package/dist/esm/components/primitives/viewport/ViewportWorld.js.map +1 -1
  445. package/dist/esm/components/primitives/viewport/useViewportGestures.js +1 -1
  446. package/dist/esm/components/primitives/viewport/useViewportGestures.js.map +1 -1
  447. package/dist/esm/components/primitives/viewport/viewportCoords.js.map +1 -1
  448. package/dist/esm/components/primitives/viewport/viewportMath.js.map +1 -1
  449. package/dist/esm/components/shell/AppShell/AppShell.js.map +1 -1
  450. package/dist/esm/components/shell/FloatingPanel/FloatingPanel.js.map +1 -1
  451. package/dist/esm/components/shell/MenuBar/MenuBar.js.map +1 -1
  452. package/dist/esm/components/shell/StatusBar/StatusBar.js.map +1 -1
  453. package/dist/esm/components/shell/Toolbar/Toolbar.js.map +1 -1
  454. package/dist/esm/context/KeyboardContext.js.map +1 -1
  455. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -1
  456. package/dist/esm/hooks/useClickOutside/useClickOutside.js.map +1 -1
  457. package/dist/esm/hooks/useClipboard/useClipboard.js.map +1 -1
  458. package/dist/esm/hooks/useControlledState/useControlledState.js.map +1 -1
  459. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -1
  460. package/dist/esm/hooks/useDebounced/useDebouncedValue.js.map +1 -1
  461. package/dist/esm/hooks/useDisclosure/useDisclosure.js.map +1 -1
  462. package/dist/esm/hooks/useEventCallback/useEventCallback.js.map +1 -1
  463. package/dist/esm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  464. package/dist/esm/hooks/useHotkey/useHotkey.js.map +1 -1
  465. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
  466. package/dist/esm/hooks/useIsMounted/useIsMounted.js.map +1 -1
  467. package/dist/esm/hooks/useKeyboard/useKeyboard.js.map +1 -1
  468. package/dist/esm/hooks/useKeyboard/utils.js.map +1 -1
  469. package/dist/esm/hooks/useLatest/useLatest.js.map +1 -1
  470. package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -1
  471. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -1
  472. package/dist/esm/hooks/useMergedRef/useMergedRef.js.map +1 -1
  473. package/dist/esm/hooks/useNavigationHistory/useNavigationHistory.js.map +1 -1
  474. package/dist/esm/hooks/useResizeObserver/useResizeObserver.js.map +1 -1
  475. package/dist/esm/hooks/useTheme/useTheme.js +1 -1
  476. package/dist/esm/hooks/useTheme/useTheme.js.map +1 -1
  477. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -1
  478. package/dist/esm/index.js +6 -0
  479. package/dist/esm/index.js.map +1 -1
  480. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  481. package/dist/esm/styles.js +3 -0
  482. package/dist/esm/styles.js.map +1 -0
  483. package/dist/esm/theme/ThemeProvider.js +5 -3
  484. package/dist/esm/theme/ThemeProvider.js.map +1 -1
  485. package/dist/esm/theme/VanillaThemeProvider.js.map +1 -1
  486. package/dist/esm/theme/breakpoints.js.map +1 -1
  487. package/dist/esm/theme/createCustomTheme.js +1 -1
  488. package/dist/esm/theme/createCustomTheme.js.map +1 -1
  489. package/dist/esm/theme/createLightTheme.js.map +1 -1
  490. package/dist/esm/theme/darkThemeValues.js.map +1 -1
  491. package/dist/esm/theme/lightThemeValues.js.map +1 -1
  492. package/dist/esm/theme/themeContractData.js.map +1 -1
  493. package/dist/esm/utils/cx.js.map +1 -1
  494. package/dist/esm/utils/devWarn.js.map +1 -1
  495. package/dist/esm/utils/mathExpression.js.map +1 -1
  496. package/dist/esm/utils/mathUtils.js.map +1 -1
  497. package/dist/esm/utils/objects.js.map +1 -1
  498. package/dist/esm/utils/platform.js.map +1 -1
  499. package/dist/tokens/tokens.dark.css +1 -1
  500. package/dist/tokens/tokens.json +1 -1
  501. package/dist/tokens/tokens.light.css +1 -1
  502. package/dist/types/components/Icons/CameraIcon.d.ts +34 -0
  503. package/dist/types/components/Icons/CubeIcon.d.ts +34 -0
  504. package/dist/types/components/Icons/OrbitIcon.d.ts +34 -0
  505. package/dist/types/components/Icons/RotateIcon.d.ts +35 -0
  506. package/dist/types/components/Icons/SpinIcon.d.ts +35 -0
  507. package/dist/types/components/Icons/ZoomFitIcon.d.ts +35 -0
  508. package/dist/types/components/controls/Select/Select.d.ts +1 -1
  509. package/dist/types/components/controls/Select/Select.types.d.ts +43 -9
  510. package/dist/types/components/editor/PropertyInspector/PropertyInspector.types.d.ts +49 -3
  511. package/dist/types/components/primitives/Button/Button.d.ts +1 -1
  512. package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
  513. package/dist/types/index.d.ts +6 -0
  514. package/dist/types/theme/ThemeProvider.d.ts +5 -3
  515. package/package.json +6 -2
  516. package/dist/esm/_virtual/_commonjsHelpers.js +0 -6
  517. package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
  518. package/dist/esm/_virtual/cjs.js +0 -4
  519. package/dist/esm/_virtual/cjs.js.map +0 -1
  520. package/dist/esm/_virtual/cssesc.js +0 -8
  521. package/dist/esm/_virtual/cssesc.js.map +0 -1
  522. package/dist/esm/_virtual/picocolors.js +0 -8
  523. package/dist/esm/_virtual/picocolors.js.map +0 -1
  524. package/dist/esm/_virtual/picocolors2.js +0 -4
  525. package/dist/esm/_virtual/picocolors2.js.map +0 -1
  526. package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js +0 -56
  527. package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +0 -1
  528. package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js +0 -46
  529. package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js.map +0 -1
  530. package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js +0 -13
  531. package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js.map +0 -1
  532. package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js +0 -962
  533. package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js.map +0 -1
  534. package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js +0 -309
  535. package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js.map +0 -1
  536. package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js +0 -18
  537. package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js.map +0 -1
  538. package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js +0 -23
  539. package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js.map +0 -1
  540. package/dist/esm/node_modules/@vanilla-extract/css/node_modules/lru-cache/dist/esm/index.js +0 -1543
  541. package/dist/esm/node_modules/@vanilla-extract/css/node_modules/lru-cache/dist/esm/index.js.map +0 -1
  542. package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js +0 -38
  543. package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js.map +0 -1
  544. package/dist/esm/node_modules/css-what/lib/es/parse.js +0 -424
  545. package/dist/esm/node_modules/css-what/lib/es/parse.js.map +0 -1
  546. package/dist/esm/node_modules/css-what/lib/es/types.js +0 -29
  547. package/dist/esm/node_modules/css-what/lib/es/types.js.map +0 -1
  548. package/dist/esm/node_modules/cssesc/cssesc.js +0 -120
  549. package/dist/esm/node_modules/cssesc/cssesc.js.map +0 -1
  550. package/dist/esm/node_modules/dedent/dist/dedent.js +0 -100
  551. package/dist/esm/node_modules/dedent/dist/dedent.js.map +0 -1
  552. package/dist/esm/node_modules/deep-object-diff/mjs/diff.js +0 -40
  553. package/dist/esm/node_modules/deep-object-diff/mjs/diff.js.map +0 -1
  554. package/dist/esm/node_modules/deep-object-diff/mjs/utils.js +0 -9
  555. package/dist/esm/node_modules/deep-object-diff/mjs/utils.js.map +0 -1
  556. package/dist/esm/node_modules/deepmerge/dist/cjs.js +0 -143
  557. package/dist/esm/node_modules/deepmerge/dist/cjs.js.map +0 -1
  558. package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js +0 -1386
  559. package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js.map +0 -1
  560. package/dist/esm/node_modules/modern-ahocorasick/dist/index.js +0 -102
  561. package/dist/esm/node_modules/modern-ahocorasick/dist/index.js.map +0 -1
  562. package/dist/esm/node_modules/picocolors/picocolors.js +0 -87
  563. package/dist/esm/node_modules/picocolors/picocolors.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NodeGraphStore.js","sources":["../../../../../../src/components/editor/NodeGraph/NodeGraphStore.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NodeGraphStore.js","sources":["src/components/editor/NodeGraph/NodeGraphStore.ts"],"sourcesContent":["import type {\n NodeGraphEdge,\n NodeGraphNode,\n NodeGraphGroup,\n NodeGraphPortRef,\n NodeGraphPortSide,\n NodeGraphSelection,\n} from './NodeGraph.types';\nimport type { Point2D } from '@/components/primitives/canvas/canvas.types';\nimport type { WorldRect } from '@/components/primitives/viewport';\n\n/** Snapshot of the data slice — the canonical graph contents. */\nexport interface NodeGraphDataState {\n nodes: ReadonlyArray<NodeGraphNode>;\n edges: ReadonlyArray<NodeGraphEdge>;\n groups: ReadonlyArray<NodeGraphGroup>;\n defaultNodeSize: { width: number; height: number };\n}\n\n/**\n * A port's measured position registered by a `<NodeGraph.Port>` slot.\n * Coordinates are in **node-local pixels** (relative to the node wrapper's\n * top-left). Because the wrapper is positioned in world space but rendered\n * in CSS pixels at zoom = 1 (zoom is applied by the parent `<ViewportWorld>`\n * transform), these pixels are equivalent to node-local world units.\n */\nexport interface NodeGraphPortPosition {\n x: number;\n y: number;\n side: NodeGraphPortSide;\n dataType?: string;\n}\n\n/** Measured DOM size of a node wrapper, in node-local world units. */\nexport interface NodeGraphMeasuredSize {\n width: number;\n height: number;\n}\n\n/**\n * Snapshot of the interaction slice — the active gesture (if any) and its\n * scratch data. Designed so the edge/preview drawing layer can read everything\n * it needs in one slice subscription.\n */\n/** Eight points along a rectangle that can be grabbed to resize a group. */\nexport type NodeGraphGroupResizeHandle =\n | 'nw'\n | 'n'\n | 'ne'\n | 'e'\n | 'se'\n | 's'\n | 'sw'\n | 'w';\n\nexport type NodeGraphInteractionState =\n | { kind: 'idle' }\n | {\n kind: 'drag-nodes';\n /**\n * Ids of nodes being dragged together. Set (not Array) so per-node\n * subscribers can do O(1) membership checks in the hot per-frame\n * selector path — a Cartesian `Array.includes` was a measurable cost\n * at high node counts when the user dragged the whole selection.\n */\n nodeIds: ReadonlySet<string>;\n /** Pointer-down world position (start of the drag). */\n startWorld: Point2D;\n /** Cumulative drag delta in world units (snapped if grid active). */\n delta: Point2D;\n }\n | {\n kind: 'drag-groups';\n /** Ids of groups being dragged together. See {@link nodeIds} for why Set. */\n groupIds: ReadonlySet<string>;\n /**\n * Ids of nodes that were fully contained inside one of the dragged\n * groups at gesture start. They ride along with the group(s) and\n * receive the same drag delta — see `rectContains` in `nodeGraphMath`.\n */\n containedNodeIds: ReadonlySet<string>;\n /** Pointer-down world position. */\n startWorld: Point2D;\n /** Cumulative drag delta (snapped if grid active). */\n delta: Point2D;\n /**\n * True when the projected positions of the dragged groups would\n * overlap any other (non-dragged) group. The HTML overlay paints a\n * rejection state and the pointerup handler refuses to commit when\n * this is set.\n */\n blocked: boolean;\n }\n | {\n kind: 'resize-group';\n groupId: string;\n handle: NodeGraphGroupResizeHandle;\n /** Original bounds at the start of the resize. */\n startBounds: { x: number; y: number; width: number; height: number };\n /** Cumulative pointer delta in world units (snapped). */\n delta: Point2D;\n /** Set when the resized bounds would overlap another group. */\n blocked: boolean;\n }\n | {\n kind: 'connect';\n /**\n * Fixed endpoint the preview draws from. For a new connection this is\n * the port the drag started on; for a reconnect it's the *other* end\n * of the edge being edited (the one staying put).\n */\n source: NodeGraphPortRef;\n /** Current pointer position in world coordinates. */\n currentWorld: Point2D;\n /** Hovered candidate target port, or null when none. */\n candidate: NodeGraphPortRef | null;\n /** Whether the candidate is currently rejected by `isValidConnection`. */\n invalid: boolean;\n /**\n * Set while re-dragging an existing edge's endpoint. The edge is hidden\n * from the edge layer for the duration so only the preview shows, and\n * the drop either moves the endpoint, deletes the edge (detach), or —\n * on a click with no drag — selects it.\n */\n reconnectEdgeId?: string;\n /** Which end of `reconnectEdgeId` is being dragged. */\n reconnectEnd?: 'source' | 'target';\n }\n | {\n kind: 'marquee';\n /** Marquee start in world coordinates. */\n startWorld: Point2D;\n /** Current pointer position in world coordinates. */\n currentWorld: Point2D;\n /** Whether the additive modifier was held at gesture start. */\n additive: boolean;\n };\n\n/** Snapshot of the hover slice. */\nexport interface NodeGraphHoverState {\n hoveredNodeId: string | null;\n hoveredEdgeId: string | null;\n hoveredPort: NodeGraphPortRef | null;\n}\n\nconst EMPTY_DATA: NodeGraphDataState = {\n nodes: [],\n edges: [],\n groups: [],\n defaultNodeSize: { width: 180, height: 80 },\n};\n\nconst EMPTY_SELECTION: NodeGraphSelection = {\n nodes: [],\n edges: [],\n groups: [],\n};\n\nconst EMPTY_HOVER: NodeGraphHoverState = {\n hoveredNodeId: null,\n hoveredEdgeId: null,\n hoveredPort: null,\n};\n\nconst IDLE: NodeGraphInteractionState = { kind: 'idle' };\n\n/**\n * Hot-path runtime state for `<NodeGraph>` — graph data, selection,\n * interaction, hover. Each slice carries its own subscribe/get pair so\n * subscribers re-render only on relevant changes (e.g. the edge canvas\n * subscribes to data + interaction, individual node bodies subscribe only\n * to selection + drag delta for their own id).\n *\n * Mirrors `ViewportStore` / `MinimapStore` in structure.\n */\nexport class NodeGraphStore {\n private data: NodeGraphDataState = EMPTY_DATA;\n private selection: NodeGraphSelection = EMPTY_SELECTION;\n private interaction: NodeGraphInteractionState = IDLE;\n private hover: NodeGraphHoverState = EMPTY_HOVER;\n // `Map<id, NodeGraphNode>` mirror of `data.nodes` — rebuilt in `setData`.\n // Enables O(1) `getNodeById` lookups for hot paths (edge drawing,\n // pointer-driven drag handlers) that previously did O(n) `nodes.find`\n // per call.\n private nodeIndex = new Map<string, NodeGraphNode>();\n // Set of `\"${node}\\0${port}\"` keys for every port referenced by an edge\n // endpoint — recomputed in `setData` only when the edges reference\n // changes. Lets `<NodeGraph.Port>` slots auto-derive their \"connected\"\n // visual state without the consumer threading a parallel index down\n // through `renderNode`.\n private connectedPorts: ReadonlySet<string> = new Set<string>();\n\n // Map<nodeId, Map<portId, NodeGraphPortPosition>>.\n // Mutated in place by `<NodeGraph.Port>` slots on mount/resize. Listeners\n // are notified whenever any port's position, side, or dataType changes.\n private portPositions = new Map<string, Map<string, NodeGraphPortPosition>>();\n // Map<nodeId, NodeGraphMeasuredSize>. Populated by NodeGraphNodeView's\n // ResizeObserver — used by getNodeBox when node.width/height are absent.\n private measuredSizes = new Map<string, NodeGraphMeasuredSize>();\n\n private dataListeners = new Set<() => void>();\n private connectedPortsListeners = new Set<() => void>();\n private selectionListeners = new Set<() => void>();\n private interactionListeners = new Set<() => void>();\n // Per-node interaction subscriptions. Each `<NodeGraphNodeView>` registers\n // for its own id and is woken only when the interaction state changes in\n // a way that could affect that node's drag delta — i.e. the node was, or\n // now is, part of the active drag set. This cuts the notify fan-out from\n // O(all-nodes) to O(dragged-nodes) per pointermove flush, which is the\n // dominant cost when dragging a single node out of a large graph.\n private nodeInteractionListeners = new Map<string, Set<() => void>>();\n private hoverListeners = new Set<() => void>();\n private portPositionListeners = new Set<() => void>();\n private measuredSizeListeners = new Set<() => void>();\n\n // Monotonic counters used as `useSyncExternalStore` snapshots for the\n // notify-only port-positions / measured-sizes channels. A stable null\n // snapshot would let React skip the update via `Object.is(prev, next)`,\n // even when the subscription fired.\n private portPositionsVersion = 0;\n private measuredSizesVersion = 0;\n private spawnRequestListeners = new Set<\n (info: { worldPoint: Point2D; screenPoint: Point2D }) => void\n >();\n\n // ── Public read API ──\n\n getData = (): NodeGraphDataState => this.data;\n getSelection = (): NodeGraphSelection => this.selection;\n getInteraction = (): NodeGraphInteractionState => this.interaction;\n getHover = (): NodeGraphHoverState => this.hover;\n\n /**\n * The set of `\"${node}\\0${port}\"` keys that are referenced by at least\n * one edge endpoint. Reference is stable until the membership actually\n * changes, so it can back a `useSyncExternalStore` snapshot directly.\n */\n getConnectedPorts = (): ReadonlySet<string> => this.connectedPorts;\n\n /** True when the given port is referenced by at least one edge endpoint. */\n isPortConnected = (nodeId: string, portId: string): boolean => {\n return this.connectedPorts.has(portKey(nodeId, portId));\n };\n\n /**\n * O(1) node lookup by id, backed by an internal Map rebuilt on each\n * `setData`. Use this from hot paths instead of `data.nodes.find(...)`.\n */\n getNodeById = (id: string): NodeGraphNode | undefined => {\n return this.nodeIndex.get(id);\n };\n\n /**\n * Read the registered position of a single port. Returns `null` when the\n * port hasn't yet been measured (e.g. on first paint before\n * `useLayoutEffect` has run, or after the slot unmounted).\n */\n getPortPosition = (\n nodeId: string,\n portId: string\n ): NodeGraphPortPosition | null => {\n return this.portPositions.get(nodeId)?.get(portId) ?? null;\n };\n\n /** Read the measured DOM size of a node wrapper. */\n getMeasuredSize = (nodeId: string): NodeGraphMeasuredSize | null => {\n return this.measuredSizes.get(nodeId) ?? null;\n };\n\n /**\n * Monotonic snapshot of the port-positions channel — pass to\n * `useSyncExternalStore` alongside `subscribePortPositions` so React\n * actually re-renders consumers on every real change. Incremented\n * whenever a port position is added, updated, removed, or GC'd by\n * `setData`. Skipped on no-op writes.\n */\n getPortPositionsVersion = (): number => this.portPositionsVersion;\n\n /**\n * Monotonic snapshot of the measured-sizes channel — same role as\n * `getPortPositionsVersion`, for `subscribeMeasuredSizes`.\n */\n getMeasuredSizesVersion = (): number => this.measuredSizesVersion;\n\n // ── Subscriptions ──\n\n subscribeData = (cb: () => void): (() => void) => {\n this.dataListeners.add(cb);\n return () => {\n this.dataListeners.delete(cb);\n };\n };\n\n /**\n * Subscribe to the connected-ports channel — fires only when the set of\n * edge-referenced ports actually changes membership (not on every node\n * move). Backs the auto-`connected` state on `<NodeGraph.Port>`.\n */\n subscribeConnectedPorts = (cb: () => void): (() => void) => {\n this.connectedPortsListeners.add(cb);\n return () => {\n this.connectedPortsListeners.delete(cb);\n };\n };\n\n subscribeSelection = (cb: () => void): (() => void) => {\n this.selectionListeners.add(cb);\n return () => {\n this.selectionListeners.delete(cb);\n };\n };\n\n subscribeInteraction = (cb: () => void): (() => void) => {\n this.interactionListeners.add(cb);\n return () => {\n this.interactionListeners.delete(cb);\n };\n };\n\n /**\n * Subscribe to interaction changes that affect a specific node id. The\n * callback fires only when the node enters or leaves the active drag set\n * (drag-nodes `nodeIds`, drag-groups `containedNodeIds`) — every other\n * tick where the drag set is unchanged for this id is filtered out at the\n * store layer instead of waking the subscriber for a no-op compare.\n *\n * Use this from per-node React subscribers; the global\n * {@link subscribeInteraction} channel stays in place for canvas layers\n * and other consumers that care about every interaction change.\n */\n subscribeNodeInteraction = (nodeId: string, cb: () => void): (() => void) => {\n let set = this.nodeInteractionListeners.get(nodeId);\n if (!set) {\n set = new Set();\n this.nodeInteractionListeners.set(nodeId, set);\n }\n set.add(cb);\n return () => {\n const current = this.nodeInteractionListeners.get(nodeId);\n if (!current) return;\n current.delete(cb);\n if (current.size === 0) {\n this.nodeInteractionListeners.delete(nodeId);\n }\n };\n };\n\n subscribeHover = (cb: () => void): (() => void) => {\n this.hoverListeners.add(cb);\n return () => {\n this.hoverListeners.delete(cb);\n };\n };\n\n subscribePortPositions = (cb: () => void): (() => void) => {\n this.portPositionListeners.add(cb);\n return () => {\n this.portPositionListeners.delete(cb);\n };\n };\n\n subscribeMeasuredSizes = (cb: () => void): (() => void) => {\n this.measuredSizeListeners.add(cb);\n return () => {\n this.measuredSizeListeners.delete(cb);\n };\n };\n\n // ── Spawn-palette request channel ──\n //\n // Notification-only channel used by `<NodeGraph.SpawnPalette>` to\n // listen for \"user wants to spawn a node here\" events without forcing\n // the consumer to wire context-menu state through their own React\n // tree. The main `NodeGraph` component pumps this channel from its\n // `handleContextMenu` when the right-click target is `empty` or\n // `group` (i.e. a place where it makes sense to drop a new node).\n subscribeSpawnRequest = (\n cb: (info: { worldPoint: Point2D; screenPoint: Point2D }) => void\n ): (() => void) => {\n this.spawnRequestListeners.add(cb);\n return () => {\n this.spawnRequestListeners.delete(cb);\n };\n };\n\n requestSpawn(info: { worldPoint: Point2D; screenPoint: Point2D }): void {\n this.spawnRequestListeners.forEach(cb => {\n cb(info);\n });\n }\n\n // ── Mutators ──\n\n setData(next: NodeGraphDataState): void {\n if (\n next.nodes === this.data.nodes &&\n next.edges === this.data.edges &&\n next.groups === this.data.groups &&\n next.defaultNodeSize.width === this.data.defaultNodeSize.width &&\n next.defaultNodeSize.height === this.data.defaultNodeSize.height\n ) {\n return;\n }\n const edgesChanged = next.edges !== this.data.edges;\n const prevNodeIds = new Set(this.data.nodes.map(n => n.id));\n // Rebuild the id → node lookup in the same pass that collects the\n // next-frame id set, so GC and the index stay in sync without a\n // second iteration.\n this.nodeIndex.clear();\n const nextNodeIds = new Set<string>();\n for (const n of next.nodes) {\n nextNodeIds.add(n.id);\n this.nodeIndex.set(n.id, n);\n }\n // Garbage-collect port positions + measured sizes for nodes that have\n // been removed from the data. Slot unmount effects normally clear their\n // own entries, but if the node disappears in a single render tick (drop\n // from controlled state) the unmount and the data swap can race.\n let didMutatePortPositions = false;\n let didMutateMeasuredSizes = false;\n for (const id of prevNodeIds) {\n if (nextNodeIds.has(id)) continue;\n if (this.portPositions.delete(id)) didMutatePortPositions = true;\n if (this.measuredSizes.delete(id)) didMutateMeasuredSizes = true;\n }\n this.data = next;\n this.dataListeners.forEach(cb => {\n cb();\n });\n // Recompute the connected-ports index when edges changed, and notify\n // its dedicated channel only if the membership actually differs — an\n // edges array that was replaced but carries the same endpoints (e.g.\n // a label edit) leaves port \"connected\" state untouched.\n if (edgesChanged) {\n const nextConnected = computeConnectedPorts(next.edges);\n if (!connectedSetsEqual(nextConnected, this.connectedPorts)) {\n this.connectedPorts = nextConnected;\n this.connectedPortsListeners.forEach(cb => {\n cb();\n });\n }\n }\n if (didMutatePortPositions) {\n this.portPositionsVersion++;\n this.portPositionListeners.forEach(cb => {\n cb();\n });\n }\n if (didMutateMeasuredSizes) {\n this.measuredSizesVersion++;\n this.measuredSizeListeners.forEach(cb => {\n cb();\n });\n }\n }\n\n setSelection(next: NodeGraphSelection): void {\n if (selectionEqual(next, this.selection)) return;\n this.selection = next;\n this.selectionListeners.forEach(cb => {\n cb();\n });\n }\n\n setInteraction(next: NodeGraphInteractionState): void {\n if (interactionEqual(next, this.interaction)) return;\n const prev = this.interaction;\n this.interaction = next;\n\n // Global listeners: canvas layers, the main NodeGraph component (for\n // layer invalidation), and any consumer hook that wants every change.\n this.interactionListeners.forEach(cb => {\n cb();\n });\n\n // Per-node listeners: notify ids that are in the next or the prev drag\n // set. A node that *leaves* the drag set needs to clear its local\n // delta, so previously-affected ids must fire too even when they're no\n // longer in `next`.\n const prevIds = getDragAffectedNodeIds(prev);\n const nextIds = getDragAffectedNodeIds(next);\n if (prevIds.size === 0 && nextIds.size === 0) return;\n\n for (const id of nextIds) {\n this.nodeInteractionListeners.get(id)?.forEach(cb => {\n cb();\n });\n }\n for (const id of prevIds) {\n // Dedupe — already notified above when the node is in both sets.\n if (nextIds.has(id)) continue;\n this.nodeInteractionListeners.get(id)?.forEach(cb => {\n cb();\n });\n }\n }\n\n setHover(next: NodeGraphHoverState): void {\n if (hoverEqual(next, this.hover)) return;\n this.hover = next;\n this.hoverListeners.forEach(cb => {\n cb();\n });\n }\n\n /**\n * Register a port's measured position. Called by `<NodeGraph.Port>` from\n * a `useLayoutEffect` + `ResizeObserver`. No-ops when the incoming\n * position is identical to the cached one — protects edge layer from\n * redraw storms when nodes resize without porting any pin movement.\n */\n setPortPosition(\n nodeId: string,\n portId: string,\n next: NodeGraphPortPosition\n ): void {\n let perNode = this.portPositions.get(nodeId);\n if (!perNode) {\n perNode = new Map();\n this.portPositions.set(nodeId, perNode);\n }\n const prev = perNode.get(portId);\n if (\n prev?.x === next.x &&\n prev.y === next.y &&\n prev.side === next.side &&\n prev.dataType === next.dataType\n ) {\n return;\n }\n perNode.set(portId, next);\n this.portPositionsVersion++;\n this.portPositionListeners.forEach(cb => {\n cb();\n });\n }\n\n /** Remove a port registration. Called by `<NodeGraph.Port>` cleanup. */\n removePortPosition(nodeId: string, portId: string): void {\n const perNode = this.portPositions.get(nodeId);\n if (!perNode) return;\n if (!perNode.delete(portId)) return;\n if (perNode.size === 0) this.portPositions.delete(nodeId);\n this.portPositionsVersion++;\n this.portPositionListeners.forEach(cb => {\n cb();\n });\n }\n\n /**\n * Register / refresh the measured DOM size of a node wrapper. No-ops on\n * identical width+height.\n */\n setMeasuredSize(nodeId: string, next: NodeGraphMeasuredSize): void {\n const prev = this.measuredSizes.get(nodeId);\n if (prev?.width === next.width && prev.height === next.height) {\n return;\n }\n this.measuredSizes.set(nodeId, next);\n this.measuredSizesVersion++;\n this.measuredSizeListeners.forEach(cb => {\n cb();\n });\n }\n\n /** Clear the measured size of a node (called on unmount). */\n clearMeasuredSize(nodeId: string): void {\n if (!this.measuredSizes.delete(nodeId)) return;\n this.measuredSizesVersion++;\n this.measuredSizeListeners.forEach(cb => {\n cb();\n });\n }\n\n // ── Convenience selection helpers ──\n\n /** True when a node id is currently selected. */\n isNodeSelected(id: string): boolean {\n return this.selection.nodes.includes(id);\n }\n\n /** True when an edge id is currently selected. */\n isEdgeSelected(id: string): boolean {\n return this.selection.edges.includes(id);\n }\n\n /** True when a group id is currently selected. */\n isGroupSelected(id: string): boolean {\n return this.selection.groups.includes(id);\n }\n}\n\n// ─── Connected-ports index ───\n\n/**\n * Key for the connected-ports set. Uses a NUL separator so node / port ids\n * containing dots or dashes can't collide (`\"a.b\" + \"c\"` vs `\"a\" + \"b.c\"`).\n */\nfunction portKey(node: string, port: string): string {\n return `${node}\\u0000${port}`;\n}\n\n/** Build the set of `\"${node}\\0${port}\"` keys referenced by any edge. */\nfunction computeConnectedPorts(\n edges: ReadonlyArray<NodeGraphEdge>\n): Set<string> {\n const set = new Set<string>();\n for (const edge of edges) {\n set.add(portKey(edge.source.node, edge.source.port));\n set.add(portKey(edge.target.node, edge.target.port));\n }\n return set;\n}\n\nfunction connectedSetsEqual(\n a: ReadonlySet<string>,\n b: ReadonlySet<string>\n): boolean {\n if (a === b) return true;\n if (a.size !== b.size) return false;\n for (const key of a) {\n if (!b.has(key)) return false;\n }\n return true;\n}\n\n// ─── Equality helpers (shallow, identity-aware) ───\n\nfunction arrEqual<T>(a: ReadonlyArray<T>, b: ReadonlyArray<T>): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction setEqual<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): boolean {\n if (a === b) return true;\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n}\n\nconst EMPTY_NODE_ID_SET: ReadonlySet<string> = new Set<string>();\n\n/**\n * Node ids whose drag delta could be affected by the given interaction\n * state — used by `setInteraction` to fan out per-node notifications.\n * Idle / connect / marquee / resize-group don't move nodes, so they\n * return the empty set (no per-node subscriber needs waking).\n */\nfunction getDragAffectedNodeIds(\n state: NodeGraphInteractionState\n): ReadonlySet<string> {\n if (state.kind === 'drag-nodes') return state.nodeIds;\n if (state.kind === 'drag-groups') return state.containedNodeIds;\n return EMPTY_NODE_ID_SET;\n}\n\nfunction selectionEqual(a: NodeGraphSelection, b: NodeGraphSelection): boolean {\n return (\n arrEqual(a.nodes, b.nodes) &&\n arrEqual(a.edges, b.edges) &&\n arrEqual(a.groups, b.groups)\n );\n}\n\nfunction pointEqual(a: Point2D, b: Point2D): boolean {\n return a.x === b.x && a.y === b.y;\n}\n\nfunction portRefEqual(\n a: NodeGraphPortRef | null,\n b: NodeGraphPortRef | null\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.node === b.node && a.port === b.port;\n}\n\nfunction interactionEqual(\n a: NodeGraphInteractionState,\n b: NodeGraphInteractionState\n): boolean {\n if (a === b) return true;\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'idle':\n return true;\n case 'drag-nodes': {\n const bx = b as Extract<\n NodeGraphInteractionState,\n { kind: 'drag-nodes' }\n >;\n return (\n setEqual(a.nodeIds, bx.nodeIds) &&\n pointEqual(a.startWorld, bx.startWorld) &&\n pointEqual(a.delta, bx.delta)\n );\n }\n case 'drag-groups': {\n const bx = b as Extract<\n NodeGraphInteractionState,\n { kind: 'drag-groups' }\n >;\n return (\n setEqual(a.groupIds, bx.groupIds) &&\n setEqual(a.containedNodeIds, bx.containedNodeIds) &&\n pointEqual(a.startWorld, bx.startWorld) &&\n pointEqual(a.delta, bx.delta) &&\n a.blocked === bx.blocked\n );\n }\n case 'resize-group': {\n const bx = b as Extract<\n NodeGraphInteractionState,\n { kind: 'resize-group' }\n >;\n return (\n a.groupId === bx.groupId &&\n a.handle === bx.handle &&\n a.startBounds.x === bx.startBounds.x &&\n a.startBounds.y === bx.startBounds.y &&\n a.startBounds.width === bx.startBounds.width &&\n a.startBounds.height === bx.startBounds.height &&\n pointEqual(a.delta, bx.delta) &&\n a.blocked === bx.blocked\n );\n }\n case 'connect': {\n const bx = b as Extract<NodeGraphInteractionState, { kind: 'connect' }>;\n return (\n portRefEqual(a.source, bx.source) &&\n pointEqual(a.currentWorld, bx.currentWorld) &&\n portRefEqual(a.candidate, bx.candidate) &&\n a.invalid === bx.invalid &&\n a.reconnectEdgeId === bx.reconnectEdgeId &&\n a.reconnectEnd === bx.reconnectEnd\n );\n }\n case 'marquee': {\n const bx = b as Extract<NodeGraphInteractionState, { kind: 'marquee' }>;\n return (\n pointEqual(a.startWorld, bx.startWorld) &&\n pointEqual(a.currentWorld, bx.currentWorld) &&\n a.additive === bx.additive\n );\n }\n default:\n return false;\n }\n}\n\nfunction hoverEqual(a: NodeGraphHoverState, b: NodeGraphHoverState): boolean {\n return (\n a.hoveredNodeId === b.hoveredNodeId &&\n a.hoveredEdgeId === b.hoveredEdgeId &&\n portRefEqual(a.hoveredPort, b.hoveredPort)\n );\n}\n\n/**\n * Compute the rectangle of a marquee interaction in world coordinates,\n * normalized so width/height are non-negative.\n */\nexport function marqueeWorldRect(\n state: Extract<NodeGraphInteractionState, { kind: 'marquee' }>\n): WorldRect {\n const x = Math.min(state.startWorld.x, state.currentWorld.x);\n const y = Math.min(state.startWorld.y, state.currentWorld.y);\n return {\n x,\n y,\n width: Math.abs(state.currentWorld.x - state.startWorld.x),\n height: Math.abs(state.currentWorld.y - state.startWorld.y),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NodeGraphToolbar.js","sources":["../../../../../../src/components/editor/NodeGraph/NodeGraphToolbar.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;AAkBA;;;;;;;;AAQG;AACG;AAQJ;;;AAMM;AACD;;AAGD;AAKN;AAWM;;;AAYI;AAIV;AA2BM;AAUJ;AACA;AACA;AACE;AACA;;;;;;AAsBJ;AAWM;AAUJ;AACA;;;AAOA;AACE;AACA;AACA;;;;AAGA;;;;;;AAuBJ;AAQA;AAIE;AACA;;AAEA;AACA;AACE;AACA;;AAEF;;;AAGF;AAEM;AAUJ;AACA;AAKM;AACF;AAUN;AAEM;AAUJ;AACA;AAKM;AACF;AAUN;AAEA;AACM;AASJ;AACA;AAKM;AACF;AAUN;;"}
1
+ {"version":3,"file":"NodeGraphToolbar.js","sources":["src/components/editor/NodeGraph/NodeGraphToolbar.tsx"],"sourcesContent":["'use client';\n\nimport React, { useCallback } from 'react';\n\nimport { Button } from '@/components/primitives/Button';\nimport { useViewportStore } from '@/components/primitives/viewport/ViewportContext';\nimport { cx } from '@/utils/cx';\n\nimport {\n nodeGraphToolbarRecipe,\n nodeGraphToolbarSeparatorStyle,\n} from './NodeGraph.css';\nimport { useNodeGraphStore } from './NodeGraphContext';\nimport { computeNodesBounds } from './nodeGraphMath';\nimport { useStoreSlice } from './useStoreSlice';\n\nimport type { NodeGraphToolbarSlotProps } from './NodeGraph.types';\n\n/**\n * Live renderer for `<NodeGraph.Toolbar>`. Mounted inside the\n * `<ViewportOverlay>` so the toolbar sits above the graph but ignores\n * pan/zoom (toolbar buttons stay anchored to a viewport corner).\n *\n * Pointer events are auto-handled — the wrapper enables them so clicks\n * on toolbar buttons don't fall through to the underlying graph (which\n * would start a marquee selection).\n */\nexport function NodeGraphToolbarInner({\n placement = 'top-left',\n margin = 12,\n gap = 4,\n className,\n style,\n children,\n}: NodeGraphToolbarSlotProps): React.ReactElement {\n return (\n <div\n className={cx(nodeGraphToolbarRecipe({ placement }), className)}\n style={{\n margin,\n gap,\n ...style,\n }}\n onPointerDown={e => {\n e.stopPropagation();\n }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Visual separator for grouping toolbar buttons. Just a 1 px line; pass\n * `orientation=\"vertical\"` (default) inside a horizontal toolbar.\n */\nexport interface NodeGraphToolbarSeparatorProps {\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n}\n\nexport function NodeGraphToolbarSeparator({\n orientation = 'vertical',\n className,\n}: NodeGraphToolbarSeparatorProps): React.ReactElement {\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cx(nodeGraphToolbarSeparatorStyle, className)}\n style={\n orientation === 'horizontal'\n ? { width: '100%', height: 1 }\n : { width: 1, height: 18 }\n }\n />\n );\n}\n\n// ─── Action buttons ────────────────────────────────────────────────\n\ninterface CommonButtonProps {\n /** Override the label text. */\n label?: React.ReactNode;\n /** Override the icon (replaces the default). */\n icon?: React.ReactNode;\n /** Pass-through to the underlying `<Button>`. */\n size?: 'sm' | 'md' | 'lg';\n /** Pass-through variant. */\n variant?: 'default' | 'ghost' | 'filled';\n /** Extra class on the button. */\n className?: string;\n /** Inline style override. */\n style?: React.CSSProperties;\n /** Override the title / tooltip. */\n title?: string;\n}\n\n/** Fit all nodes inside the viewport. Calls the same code path as `ref.fitToContent`. */\nexport interface NodeGraphFitContentButtonProps extends CommonButtonProps {\n /** World-unit padding around the fitted bounds. @default 32 */\n padding?: number;\n}\n\nexport function NodeGraphFitContentButton({\n padding = 32,\n label = 'Fit',\n icon = '⊕',\n size = 'sm',\n variant = 'ghost',\n className,\n style,\n title = 'Fit all content in viewport',\n}: NodeGraphFitContentButtonProps): React.ReactElement {\n const ngStore = useNodeGraphStore();\n const vpStore = useViewportStore();\n const onClick = useCallback((): void => {\n const data = ngStore.getData();\n const bounds = computeNodesBounds(\n data.nodes,\n ngStore.getMeasuredSize,\n data.defaultNodeSize\n );\n if (bounds.width === 0 && bounds.height === 0) return;\n vpStore.handle.fitToContent(bounds, padding);\n }, [ngStore, vpStore, padding]);\n return (\n <Button\n size={size}\n variant={variant}\n onClick={onClick}\n className={className}\n style={style}\n title={title}\n aria-label={title}\n >\n {icon != null ? <span aria-hidden=\"true\">{icon}</span> : null}\n {label}\n </Button>\n );\n}\n\n/**\n * Fit the currently-selected nodes inside the viewport. Disabled when\n * the selection contains no nodes — reads the live selection slice so\n * the button's disabled state updates without consumer plumbing.\n */\nexport interface NodeGraphFitSelectionButtonProps extends CommonButtonProps {\n padding?: number;\n}\n\nexport function NodeGraphFitSelectionButton({\n padding = 64,\n label = 'Fit selection',\n icon = '◎',\n size = 'sm',\n variant = 'ghost',\n className,\n style,\n title = 'Fit selected nodes in viewport',\n}: NodeGraphFitSelectionButtonProps): React.ReactElement {\n const ngStore = useNodeGraphStore();\n const vpStore = useViewportStore();\n // Live disabled state — re-renders when the selection slice changes.\n const hasNodeSelection = useStoreSlice(\n ngStore.subscribeSelection,\n ngStore.getSelection,\n sel => sel.nodes.length > 0\n );\n const onClick = useCallback((): void => {\n const data = ngStore.getData();\n const sel = ngStore.getSelection();\n if (sel.nodes.length === 0) return;\n const selectedIds = new Set(sel.nodes);\n const selectedNodes = data.nodes.filter(n => selectedIds.has(n.id));\n const bounds = computeNodesBounds(\n selectedNodes,\n ngStore.getMeasuredSize,\n data.defaultNodeSize\n );\n if (bounds.width === 0 && bounds.height === 0) return;\n vpStore.handle.fitToContent(bounds, padding);\n }, [ngStore, vpStore, padding]);\n return (\n <Button\n size={size}\n variant={variant}\n onClick={onClick}\n disabled={!hasNodeSelection}\n className={className}\n style={style}\n title={title}\n aria-label={title}\n >\n {icon != null ? <span aria-hidden=\"true\">{icon}</span> : null}\n {label}\n </Button>\n );\n}\n\n/** Zoom in by a fixed factor (default 1.25×). */\nexport interface NodeGraphZoomButtonProps extends CommonButtonProps {\n /** Multiplier applied to the current zoom. @default 1.25 */\n factor?: number;\n}\n\nfunction applyZoomStep(\n vpStore: ReturnType<typeof useViewportStore>,\n factor: number\n): void {\n const t = vpStore.getTransform();\n const size = vpStore.getSize();\n // Anchor zoom at the viewport centre so the visible content stays put.\n const centerScreen = { x: size.width / 2, y: size.height / 2 };\n const centerWorld = {\n x: (centerScreen.x - t.x) / t.zoom,\n y: (centerScreen.y - t.y) / t.zoom,\n };\n const nextZoom = t.zoom * factor;\n // Reposition pan so `centerWorld` stays under `centerScreen` at the new zoom.\n vpStore.handle.centerOn(centerWorld, nextZoom);\n}\n\nexport function NodeGraphZoomInButton({\n factor = 1.25,\n label = '',\n icon = '+',\n size = 'sm',\n variant = 'ghost',\n className,\n style,\n title = 'Zoom in',\n}: NodeGraphZoomButtonProps): React.ReactElement {\n const vpStore = useViewportStore();\n return (\n <Button\n size={size}\n variant={variant}\n onClick={() => {\n applyZoomStep(vpStore, factor);\n }}\n className={className}\n style={style}\n title={title}\n aria-label={title}\n >\n {icon != null ? <span aria-hidden=\"true\">{icon}</span> : null}\n {label}\n </Button>\n );\n}\n\nexport function NodeGraphZoomOutButton({\n factor = 1.25,\n label = '',\n icon = '−',\n size = 'sm',\n variant = 'ghost',\n className,\n style,\n title = 'Zoom out',\n}: NodeGraphZoomButtonProps): React.ReactElement {\n const vpStore = useViewportStore();\n return (\n <Button\n size={size}\n variant={variant}\n onClick={() => {\n applyZoomStep(vpStore, 1 / factor);\n }}\n className={className}\n style={style}\n title={title}\n aria-label={title}\n >\n {icon != null ? <span aria-hidden=\"true\">{icon}</span> : null}\n {label}\n </Button>\n );\n}\n\n/** Reset zoom to 1× centred on the world origin. */\nexport function NodeGraphResetZoomButton({\n label = '1:1',\n icon,\n size = 'sm',\n variant = 'ghost',\n className,\n style,\n title = 'Reset zoom to 100%',\n}: CommonButtonProps): React.ReactElement {\n const vpStore = useViewportStore();\n return (\n <Button\n size={size}\n variant={variant}\n onClick={() => {\n vpStore.handle.centerOn({ x: 0, y: 0 }, 1);\n }}\n className={className}\n style={style}\n title={title}\n aria-label={title}\n >\n {icon != null ? <span aria-hidden=\"true\">{icon}</span> : null}\n {label}\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAkBA;;;;;;;;AAQG;AACG;AAQJ;;;AAMM;AACD;;AAGD;AAKN;AAWM;;;AAYI;AAIV;AA2BM;AAUJ;AACA;AACA;AACE;AACA;;;;;;AAsBJ;AAWM;AAUJ;AACA;;;AAOA;AACE;AACA;AACA;;;;AAGA;;;;;;AAuBJ;AAQA;AAIE;AACA;;AAEA;AACA;AACE;AACA;;AAEF;;;AAGF;AAEM;AAUJ;AACA;AAKM;AACF;AAUN;AAEM;AAUJ;AACA;AAKM;AACF;AAUN;AAEA;AACM;AASJ;AACA;AAKM;AACF;AAUN;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"createTypeMatchValidator.js","sources":["../../../../../../src/components/editor/NodeGraph/createTypeMatchValidator.ts"],"sourcesContent":[null],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;AAaG;AACG,SAAU,wBAAwB,CACtC,OAAmC,EAAA;AAMnC,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,OAAO,EAAE,UAAU,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CACtD;AACD,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK;AACzC,IAAA,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,KAAK;AACrD,IAAA,MAAM,KAAK,GACT,OAAO,EAAE,KAAK;AACd,SAAC,CAAC,MAAM,EAAE,MAAM,KAAa;AAC3B,YAAA,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAI;YAC7D,IAAI,MAAM,KAAK,MAAM;AAAE,gBAAA,OAAO,IAAI;AAClC,YAAA,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO;AACjD,QAAA,CAAC,CAAC;AAEJ,IAAA,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,KAAa;AACzC,QAAA,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;QACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,KAAK;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC;AACxD,IAAA,CAAC;AACH;;;;"}
1
+ {"version":3,"file":"createTypeMatchValidator.js","sources":["src/components/editor/NodeGraph/createTypeMatchValidator.ts"],"sourcesContent":["import type {\n NodeGraphConnectionValidationInfo,\n NodeGraphPortRef,\n} from './NodeGraph.types';\n\nexport interface TypeMatchValidatorOptions {\n /**\n * Allowed `info.sideCombo` values (e.g. `'right->left'`). Defaults to both\n * horizontal directions so the user can start the drag from either end of\n * a wire. Pass `['right->left']` to force output→input only.\n * @default ['right->left', 'left->right']\n */\n directions?: ReadonlyArray<string>;\n /**\n * `dataType` token that connects to anything. @default 'any'\n */\n anyType?: string;\n /**\n * Allow connecting two ports on the same node. @default false\n */\n allowSameNode?: boolean;\n /**\n * Custom type comparison, replacing the default (equality + `anyType` +\n * \"untyped ports accept anything\"). Receives the resolved `dataType`s,\n * either of which may be `undefined` when the port declared none.\n */\n match?: (\n sourceDataType: string | undefined,\n targetDataType: string | undefined\n ) => boolean;\n}\n\n/**\n * Build an `isValidConnection` validator for the common \"connect ports of\n * matching `dataType`, in an allowed direction\" rule — the logic most node\n * editors hand-write. Drop the result straight onto `<NodeGraph>`:\n *\n * ```tsx\n * const isValidConnection = useMemo(() => createTypeMatchValidator(), []);\n * <NodeGraph isValidConnection={isValidConnection} />\n * ```\n *\n * The default `match` accepts a connection when either port is untyped, the\n * two `dataType`s are equal, or one side is the `anyType` token. Override\n * `match` for richer rules (subtype graphs, numeric coercion, etc.).\n */\nexport function createTypeMatchValidator(\n options?: TypeMatchValidatorOptions\n): (\n source: NodeGraphPortRef,\n target: NodeGraphPortRef,\n info: NodeGraphConnectionValidationInfo\n) => boolean {\n const directions = new Set(\n options?.directions ?? ['right->left', 'left->right']\n );\n const anyType = options?.anyType ?? 'any';\n const allowSameNode = options?.allowSameNode ?? false;\n const match =\n options?.match ??\n ((source, target): boolean => {\n if (source === undefined || target === undefined) return true;\n if (source === target) return true;\n return source === anyType || target === anyType;\n });\n\n return (_source, _target, info): boolean => {\n if (!allowSameNode && info.sameNode) return false;\n if (!directions.has(info.sideCombo)) return false;\n return match(info.sourceDataType, info.targetDataType);\n };\n}\n"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;AAaG;AACG,SAAU,wBAAwB,CACtC,OAAmC,EAAA;AAMnC,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,OAAO,EAAE,UAAU,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CACtD;AACD,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK;AACzC,IAAA,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,KAAK;AACrD,IAAA,MAAM,KAAK,GACT,OAAO,EAAE,KAAK;AACd,SAAC,CAAC,MAAM,EAAE,MAAM,KAAa;AAC3B,YAAA,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAI;YAC7D,IAAI,MAAM,KAAK,MAAM;AAAE,gBAAA,OAAO,IAAI;AAClC,YAAA,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO;AACjD,QAAA,CAAC,CAAC;AAEJ,IAAA,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,KAAa;AACzC,QAAA,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;QACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,KAAK;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC;AACxD,IAAA,CAAC;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeGraphActions.js","sources":["../../../../../../src/components/editor/NodeGraph/nodeGraphActions.ts"],"sourcesContent":[null],"names":[],"mappings":";;AASA;;;;AAIG;AACG,SAAU,oBAAoB,CAClC,KAAmC,EACnC,GAAqB,EAAA;IAErB,MAAM,GAAG,GAAa,EAAE;AACxB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IACE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI;aAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAChE;AACA,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB;IACF;AACA,IAAA,OAAO,GAAG;AACZ;AAeA;;;;;;;;;;;;;AAaG;SACa,cAAc,CAC5B,KAAmC,EACnC,GAA0B,EAC1B,OAA+B,EAAA;AAE/B,IAAA,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAClD,IAAA,MAAM,MAAM,GAAG,OAAO,EAAE,SAAS,KAAK,GAAG,IAAI,cAAc,CAAC,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAC,CAAC;AAC3E,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,MAAM,GAAoB,EAAE;AAClC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE;QAC1B,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,GAAG,IAAI;AACP,YAAA,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,YAAA,QAAQ,EAAE;gBACR,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7B,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC9B,aAAA;AACF,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,MAAM;AACf;;;;"}
1
+ {"version":3,"file":"nodeGraphActions.js","sources":["src/components/editor/NodeGraph/nodeGraphActions.ts"],"sourcesContent":["import { generateNodeId } from './nodeGraphIds';\n\nimport type {\n NodeGraphEdge,\n NodeGraphNode,\n NodeGraphPortRef,\n} from './NodeGraph.types';\nimport type { Point2D } from '@/components/primitives/canvas/canvas.types';\n\n/**\n * Ids of every edge with an endpoint on the given port — i.e. all wires\n * connected to one socket. Use it to \"detach all\" or select a socket's wires\n * without maintaining a parallel index.\n */\nexport function edgesConnectedToPort(\n edges: ReadonlyArray<NodeGraphEdge>,\n ref: NodeGraphPortRef\n): string[] {\n const ids: string[] = [];\n for (const edge of edges) {\n if (\n (edge.source.node === ref.node && edge.source.port === ref.port) ||\n (edge.target.node === ref.node && edge.target.port === ref.port)\n ) {\n ids.push(edge.id);\n }\n }\n return ids;\n}\n\nexport interface DuplicateNodesOptions {\n /**\n * World-unit offset applied to each clone so it doesn't sit exactly on\n * top of its source. @default { x: 32, y: 32 }\n */\n offset?: Point2D;\n /**\n * Build the id for a clone from its source id. Defaults to a unique id\n * derived from `${sourceId}-copy`. Override to keep your own id scheme.\n */\n idFactory?: (sourceId: string) => string;\n}\n\n/**\n * Clone the nodes whose ids are listed in `ids`, offsetting each copy.\n * Pure — returns only the new node objects (not merged into the source\n * list), so callers stay in control of ordering and selection:\n *\n * ```ts\n * const copies = duplicateNodes(nodes, selection.nodes);\n * setNodes(prev => [...prev, ...copies]);\n * setSelection({ nodes: copies.map(n => n.id), edges: [], groups: [] });\n * ```\n *\n * Edges between duplicated nodes are intentionally not copied — wire that\n * in at the call site if your editor needs it.\n */\nexport function duplicateNodes(\n nodes: ReadonlyArray<NodeGraphNode>,\n ids: ReadonlyArray<string>,\n options?: DuplicateNodesOptions\n): NodeGraphNode[] {\n const offset = options?.offset ?? { x: 32, y: 32 };\n const makeId = options?.idFactory ?? (sid => generateNodeId(`${sid}-copy`));\n const wanted = new Set(ids);\n const copies: NodeGraphNode[] = [];\n for (const node of nodes) {\n if (!wanted.has(node.id)) continue;\n copies.push({\n ...node,\n id: makeId(node.id),\n position: {\n x: node.position.x + offset.x,\n y: node.position.y + offset.y,\n },\n });\n }\n return copies;\n}\n"],"names":[],"mappings":";;AASA;;;;AAIG;AACG,SAAU,oBAAoB,CAClC,KAAmC,EACnC,GAAqB,EAAA;IAErB,MAAM,GAAG,GAAa,EAAE;AACxB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IACE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI;aAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAChE;AACA,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB;IACF;AACA,IAAA,OAAO,GAAG;AACZ;AAeA;;;;;;;;;;;;;AAaG;SACa,cAAc,CAC5B,KAAmC,EACnC,GAA0B,EAC1B,OAA+B,EAAA;AAE/B,IAAA,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAClD,IAAA,MAAM,MAAM,GAAG,OAAO,EAAE,SAAS,KAAK,GAAG,IAAI,cAAc,CAAC,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAC,CAAC;AAC3E,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,MAAM,GAAoB,EAAE;AAClC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE;QAC1B,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,GAAG,IAAI;AACP,YAAA,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,YAAA,QAAQ,EAAE;gBACR,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7B,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC9B,aAAA;AACF,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,MAAM;AACf;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeGraphDrawing.js","sources":["../../../../../../src/components/editor/NodeGraph/nodeGraphDrawing.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nodeGraphDrawing.js","sources":["src/components/editor/NodeGraph/nodeGraphDrawing.ts"],"sourcesContent":["import {\n applyGroupResize,\n getBezierControlPoints,\n resolveEdgeEndpoints,\n} from './nodeGraphMath';\n\nimport type {\n NodeGraphEdgeStyleFn,\n NodeGraphPortRef,\n NodeGraphPortSide,\n NodeGraphSelection,\n} from './NodeGraph.types';\nimport type {\n BezierControlPoints,\n NodeLookup,\n PortPositionLookup,\n} from './nodeGraphMath';\nimport type {\n NodeGraphDataState,\n NodeGraphInteractionState,\n} from './NodeGraphStore';\nimport type {\n CanvasThemeColors,\n Point2D,\n} from '@/components/primitives/canvas/canvas.types';\nimport type { ViewportLayerDrawInfo } from '@/components/primitives/viewport';\n\nexport interface NodeGraphDrawTheme extends CanvasThemeColors {\n /** Colour of an unselected, non-hovered edge. */\n edgeStroke: string;\n /** Colour of a selected edge. */\n edgeStrokeSelected: string;\n /** Colour of the hovered edge. */\n edgeStrokeHovered: string;\n /** Colour of the in-flight connection preview. */\n previewStroke: string;\n /** Colour of an in-flight connection rejected by `isValidConnection`. */\n previewStrokeInvalid: string;\n /** Group backdrop fill. */\n groupFill: string;\n /** Group backdrop fill when selected. */\n groupFillSelected: string;\n /** Group outline colour. */\n groupStroke: string;\n /** Group label colour. */\n groupLabel: string;\n}\n\n/** Stroke widths in *screen* pixels — independent of zoom. */\nconst EDGE_STROKE_WIDTH = 1.5;\nconst EDGE_STROKE_WIDTH_SELECTED = 2.5;\nconst EDGE_STROKE_WIDTH_HOVERED = 2;\nconst PREVIEW_STROKE_WIDTH = 2;\nconst GROUP_STROKE_WIDTH = 1;\n\n/**\n * Stroke a cubic Bézier to the given context. The control points are in\n * screen coordinates (already transformed by the caller).\n */\nfunction strokeBezier(\n ctx: CanvasRenderingContext2D,\n cp: BezierControlPoints\n): void {\n ctx.beginPath();\n ctx.moveTo(cp.p0.x, cp.p0.y);\n ctx.bezierCurveTo(cp.c1.x, cp.c1.y, cp.c2.x, cp.c2.y, cp.p3.x, cp.p3.y);\n ctx.stroke();\n}\n\nfunction toScreenCp(\n cp: BezierControlPoints,\n worldToScreen: (p: Point2D) => Point2D\n): BezierControlPoints {\n return {\n p0: worldToScreen(cp.p0),\n c1: worldToScreen(cp.c1),\n c2: worldToScreen(cp.c2),\n p3: worldToScreen(cp.p3),\n };\n}\n\n/**\n * Margin (screen px) added around the viewport before culling an edge.\n * Covers the stroke half-width + round line-cap overshoot for the default\n * styles, plus headroom for moderately wider consumer `edgeStyle` widths.\n * A curve whose control-point bbox is more than this far outside the\n * viewport cannot paint a visible pixel inside it.\n */\nconst EDGE_CULL_MARGIN_PX = 32;\n\n/**\n * True when a cubic Bézier (given by its screen-space control points)\n * cannot intersect the viewport. The curve lies within the convex hull of\n * its control points, so an axis-aligned bbox of the four points is a\n * conservative bound — if that bbox is entirely past one viewport edge\n * (plus {@link EDGE_CULL_MARGIN_PX}), the curve is off-screen.\n */\nexport function bezierOutsideViewport(\n cp: BezierControlPoints,\n width: number,\n height: number\n): boolean {\n const minX = Math.min(cp.p0.x, cp.c1.x, cp.c2.x, cp.p3.x);\n if (minX > width + EDGE_CULL_MARGIN_PX) return true;\n const maxX = Math.max(cp.p0.x, cp.c1.x, cp.c2.x, cp.p3.x);\n if (maxX < -EDGE_CULL_MARGIN_PX) return true;\n const minY = Math.min(cp.p0.y, cp.c1.y, cp.c2.y, cp.p3.y);\n if (minY > height + EDGE_CULL_MARGIN_PX) return true;\n const maxY = Math.max(cp.p0.y, cp.c1.y, cp.c2.y, cp.p3.y);\n if (maxY < -EDGE_CULL_MARGIN_PX) return true;\n return false;\n}\n\n/** Draw all edges in the graph. */\nexport function drawEdges(\n ctx: CanvasRenderingContext2D,\n info: ViewportLayerDrawInfo,\n data: NodeGraphDataState,\n selection: NodeGraphSelection,\n hoveredEdgeId: string | null,\n interaction: NodeGraphInteractionState,\n getNodeById: NodeLookup,\n getPortPosition: PortPositionLookup,\n edgeStyle: NodeGraphEdgeStyleFn | undefined,\n theme: NodeGraphDrawTheme\n): void {\n // Either a node-drag (`drag-nodes`) or a group-drag carrying contained\n // nodes (`drag-groups.containedNodeIds`) shifts edge endpoints live —\n // resolve to a single (ids, delta) shape so the loop below stays simple.\n // The interaction state already exposes `nodeIds` / `containedNodeIds` as\n // ReadonlySet, so no per-frame Set construction is needed here.\n let dragSet: { ids: ReadonlySet<string>; delta: Point2D } | null = null;\n if (interaction.kind === 'drag-nodes') {\n dragSet = {\n ids: interaction.nodeIds,\n delta: interaction.delta,\n };\n } else if (interaction.kind === 'drag-groups') {\n dragSet = {\n ids: interaction.containedNodeIds,\n delta: interaction.delta,\n };\n }\n // While an endpoint is being re-dragged, hide the edge from this layer so\n // only the connection preview is shown (the wire \"detaches\" and follows\n // the cursor).\n const reconnectingId =\n interaction.kind === 'connect' ? interaction.reconnectEdgeId : undefined;\n // O(1) membership for the per-edge selected check below — this layer\n // redraws every frame during a drag, so a linear `selection.edges.includes`\n // per edge would be O(edges × selected) each frame.\n const selectedEdgeIds = new Set(selection.edges);\n for (const edge of data.edges) {\n if (edge.id === reconnectingId) continue;\n const endpoints = resolveEdgeEndpoints(edge, getNodeById, getPortPosition);\n if (!endpoints) continue;\n\n // Apply the in-flight drag delta so edges follow nodes 1:1 during a drag,\n // instead of snapping to the new position on pointerup.\n const source = dragSet?.ids.has(edge.source.node)\n ? {\n x: endpoints.source.x + dragSet.delta.x,\n y: endpoints.source.y + dragSet.delta.y,\n }\n : endpoints.source;\n const target = dragSet?.ids.has(edge.target.node)\n ? {\n x: endpoints.target.x + dragSet.delta.x,\n y: endpoints.target.y + dragSet.delta.y,\n }\n : endpoints.target;\n\n const cpWorld = getBezierControlPoints(\n source,\n endpoints.srcSide,\n target,\n endpoints.tgtSide\n );\n const cpScreen = toScreenCp(cpWorld, p => info.worldToScreen(p));\n\n // Frustum cull: a cubic Bézier is fully contained in the convex hull of\n // its four control points, so if the screen-space bbox of those points\n // lies entirely outside the viewport (plus a margin) the curve can't be\n // visible — skip the style callback + stroke entirely. This bounds the\n // per-frame edge cost by what's on screen rather than total edge count,\n // which is the dominant cost when zoomed in on a large graph.\n if (bezierOutsideViewport(cpScreen, info.size.width, info.size.height)) {\n continue;\n }\n\n const isSelected = selectedEdgeIds.has(edge.id);\n const isHovered = hoveredEdgeId === edge.id;\n\n // Resolve consumer override for this edge. Source/target ports\n // come from the store — `dataType` and `side` are already there,\n // no parallel index needed on the consumer side.\n const srcPos = getPortPosition(edge.source.node, edge.source.port);\n const tgtPos = getPortPosition(edge.target.node, edge.target.port);\n const customStyle = edgeStyle?.(edge, {\n selected: isSelected,\n hovered: isHovered,\n sourcePort: srcPos\n ? srcPos.dataType !== undefined\n ? { side: srcPos.side, dataType: srcPos.dataType }\n : { side: srcPos.side }\n : null,\n targetPort: tgtPos\n ? tgtPos.dataType !== undefined\n ? { side: tgtPos.side, dataType: tgtPos.dataType }\n : { side: tgtPos.side }\n : null,\n });\n\n // State-driven defaults; consumer overrides via `customStyle` take\n // precedence when they're not undefined. Selected / hovered still\n // win over a plain `edge.color` so the interaction state stays\n // visible — but consumer can override even that with `edgeStyle`.\n const defaultColor = isSelected\n ? theme.edgeStrokeSelected\n : isHovered\n ? theme.edgeStrokeHovered\n : (edge.color ?? theme.edgeStroke);\n const defaultWidth = isSelected\n ? EDGE_STROKE_WIDTH_SELECTED\n : isHovered\n ? EDGE_STROKE_WIDTH_HOVERED\n : EDGE_STROKE_WIDTH;\n\n ctx.strokeStyle = customStyle?.color ?? defaultColor;\n ctx.lineWidth = customStyle?.width ?? defaultWidth;\n ctx.lineCap = 'round';\n if (customStyle?.dash != null && customStyle.dash.length > 0) {\n ctx.setLineDash(customStyle.dash as number[]);\n } else {\n ctx.setLineDash([]);\n }\n\n strokeBezier(ctx, cpScreen);\n }\n // Reset shared state mutated above so subsequent layers (groups,\n // preview) don't inherit a stale dash pattern.\n ctx.setLineDash([]);\n}\n\n/** Draw group backdrops (under nodes, under edges). */\nexport function drawGroups(\n ctx: CanvasRenderingContext2D,\n info: ViewportLayerDrawInfo,\n data: NodeGraphDataState,\n selection: NodeGraphSelection,\n interaction: NodeGraphInteractionState,\n theme: NodeGraphDrawTheme\n): void {\n // Live drag / resize support — mirror what the HTML overlay shows so the\n // canvas backdrop stays glued to the user's cursor during gestures.\n const dragSet =\n interaction.kind === 'drag-groups'\n ? { ids: interaction.groupIds, delta: interaction.delta }\n : null;\n const resizing = interaction.kind === 'resize-group' ? interaction : null;\n const selectedGroupIds = new Set(selection.groups);\n\n for (const group of data.groups) {\n let bx = group.bounds.x;\n let by = group.bounds.y;\n let bw = group.bounds.width;\n let bh = group.bounds.height;\n if (dragSet?.ids.has(group.id)) {\n bx += dragSet.delta.x;\n by += dragSet.delta.y;\n } else if (resizing?.groupId === group.id) {\n const next = applyGroupResize(\n resizing.startBounds,\n resizing.handle,\n resizing.delta\n );\n bx = next.x;\n by = next.y;\n bw = next.width;\n bh = next.height;\n }\n\n const tl = info.worldToScreen({ x: bx, y: by });\n const br = info.worldToScreen({ x: bx + bw, y: by + bh });\n const width = br.x - tl.x;\n const height = br.y - tl.y;\n if (width <= 0 || height <= 0) continue;\n\n const isSelected = selectedGroupIds.has(group.id);\n\n ctx.fillStyle =\n group.color ?? (isSelected ? theme.groupFillSelected : theme.groupFill);\n ctx.fillRect(tl.x, tl.y, width, height);\n\n ctx.strokeStyle = group.color ?? theme.groupStroke;\n ctx.lineWidth = GROUP_STROKE_WIDTH;\n ctx.strokeRect(tl.x + 0.5, tl.y + 0.5, width - 1, height - 1);\n // The label is rendered by the HTML overlay (`NodeGraphGroupView`) so\n // it stays editable on click and scales with the world transform like\n // the rest of the group body. Canvas no longer paints it — avoids the\n // duplicate-title artefact where a screen-space canvas label and a\n // world-space HTML label drifted apart at non-1 zoom.\n }\n}\n\n/**\n * Draw the in-flight connection preview — a Bézier from the source port to\n * the current pointer position, styled to indicate validity.\n */\nexport function drawConnectionPreview(\n ctx: CanvasRenderingContext2D,\n info: ViewportLayerDrawInfo,\n interaction: NodeGraphInteractionState,\n resolveSourcePort: (\n ref: NodeGraphPortRef\n ) => { position: Point2D; side: NodeGraphPortSide } | null,\n theme: NodeGraphDrawTheme\n): void {\n if (interaction.kind !== 'connect') return;\n const src = resolveSourcePort(interaction.source);\n if (!src) return;\n\n // The \"target\" side for the preview curve mirrors the source so the curve\n // pulls toward the cursor naturally even when the cursor is free-floating.\n const tgtSide = oppositeSide(src.side);\n const cpWorld = getBezierControlPoints(\n src.position,\n src.side,\n interaction.currentWorld,\n tgtSide\n );\n const cpScreen = toScreenCp(cpWorld, p => info.worldToScreen(p));\n\n ctx.strokeStyle = interaction.invalid\n ? theme.previewStrokeInvalid\n : theme.previewStroke;\n ctx.lineWidth = PREVIEW_STROKE_WIDTH;\n ctx.lineCap = 'round';\n ctx.setLineDash(interaction.invalid ? [6, 4] : []);\n\n strokeBezier(ctx, cpScreen);\n\n ctx.setLineDash([]);\n\n // Endpoint marker at the cursor — small circle so the user sees the\n // pointer-snap target.\n const cursorScreen = info.worldToScreen(interaction.currentWorld);\n ctx.beginPath();\n ctx.arc(cursorScreen.x, cursorScreen.y, 4, 0, Math.PI * 2);\n ctx.fillStyle = interaction.invalid\n ? theme.previewStrokeInvalid\n : theme.previewStroke;\n ctx.fill();\n}\n\nfunction oppositeSide(side: NodeGraphPortSide): NodeGraphPortSide {\n switch (side) {\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n case 'top':\n return 'bottom';\n case 'bottom':\n return 'top';\n default: {\n const _unreached: never = side;\n return _unreached;\n }\n }\n}\n\n/** Resolved canvas-drawing theme assembled from the base theme + overrides. */\nexport function buildDrawTheme(base: CanvasThemeColors): NodeGraphDrawTheme {\n return {\n ...base,\n edgeStroke: base.textMuted,\n edgeStrokeSelected: base.accentPrimary,\n edgeStrokeHovered: base.textSecondary,\n previewStroke: base.accentPrimary,\n previewStrokeInvalid: 'rgba(220, 38, 38, 0.9)',\n groupFill: 'rgba(255, 255, 255, 0.03)',\n groupFillSelected: 'rgba(255, 255, 255, 0.05)',\n groupStroke: base.borderDefault,\n groupLabel: base.textSecondary,\n };\n}\n\n// ─── Background pattern (dots / grid) ───\n\nexport interface BackgroundDrawOptions {\n variant: 'dots' | 'grid' | 'none';\n /** Grid spacing in world units. */\n gap: number;\n /** Override pattern colour (defaults to theme.borderDefault). */\n color?: string;\n /** Override background fill (defaults to theme.backgroundSecondary). */\n background?: string;\n}\n\n/**\n * Minimum on-screen distance (in CSS pixels) between adjacent dots / grid\n * lines. When the base `gap × zoom` falls below this, the renderer drops\n * down to a coarser LOD level (effective gap × 2, × 4, …) so the screen\n * never carries more than `viewportArea / (TARGET_SCREEN_GAP²)` elements.\n *\n * Acts like a mip-map level for the background pattern — keeps perf\n * constant under zoom-out instead of scaling quadratically with the world\n * area exposed.\n */\nconst TARGET_SCREEN_GAP = 18;\n\n/**\n * Lower hard cutoff: when even the coarsest pattern would be denser than\n * this on screen, skip the pattern entirely. Without this, an\n * extreme-zoom-out (e.g. fitting a 100k-node graph in 800px) would still\n * fire pattern-fill operations that the GPU can't sample meaningfully.\n */\nconst MIN_VISIBLE_SCREEN_GAP = 3;\n\n/**\n * Draw a uniform background pattern across the entire visible viewport.\n * Used by `NodeGraph.Background`.\n *\n * Performance strategy:\n *\n * 1. **LOD** — when zoomed out the world gap is multiplied by the\n * smallest power-of-two that keeps the on-screen spacing ≥\n * `TARGET_SCREEN_GAP`. The number of dots/lines drawn per frame is\n * therefore bounded by `viewportArea / TARGET_SCREEN_GAP²` regardless\n * of how far the user zooms out.\n * 2. **Pattern fill** — a single off-screen tile is built (one dot or\n * one crosshair of lines) and used as `ctx.createPattern(…, 'repeat')`.\n * A single `fillRect` covers the whole viewport, replacing what was\n * previously O(n) `arc()`/`stroke()` calls. The pattern's origin is\n * translated so the tile aligns with the world grid.\n */\nexport function drawBackground(\n ctx: CanvasRenderingContext2D,\n info: ViewportLayerDrawInfo,\n theme: NodeGraphDrawTheme,\n options: BackgroundDrawOptions\n): void {\n const background = options.background ?? theme.backgroundSecondary;\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, info.size.width, info.size.height);\n\n if (options.variant === 'none' || options.gap <= 0) return;\n\n // Resolve the on-screen spacing the user-supplied world gap would yield\n // at the current zoom, then step up the world gap in powers of two\n // until each cell is at least TARGET_SCREEN_GAP pixels apart on screen.\n const baseScreenGap = options.gap * info.transform.zoom;\n if (baseScreenGap <= 0) return;\n let lodMultiplier = 1;\n while (baseScreenGap * lodMultiplier < TARGET_SCREEN_GAP) {\n lodMultiplier *= 2;\n // Safety: cap LOD at a sensible upper bound so a pathological zoom\n // (e.g. 1e-12) doesn't spin here forever.\n if (lodMultiplier > 1 << 20) break;\n }\n const screenGap = baseScreenGap * lodMultiplier;\n if (screenGap < MIN_VISIBLE_SCREEN_GAP) return;\n\n const color = options.color ?? theme.borderDefault;\n\n // World-space origin in screen pixels — the pattern's tile (0,0) must\n // land here so the dots/lines line up with the world grid. Modulo by\n // the tile size to keep the translation in `[0, tileSize)`.\n const origin = info.worldToScreen({ x: 0, y: 0 });\n const alignedTileSize = screenGap;\n const offsetX =\n ((origin.x % alignedTileSize) + alignedTileSize) % alignedTileSize;\n const offsetY =\n ((origin.y % alignedTileSize) + alignedTileSize) % alignedTileSize;\n\n // Snap the world origin offset to keep dots crisply pixel-aligned at\n // pan time. Sub-pixel pattern positions blur the rendered tile.\n const tx = Math.round(offsetX);\n const ty = Math.round(offsetY);\n\n const tileSize = Math.max(1, Math.round(alignedTileSize));\n if (options.variant === 'dots') {\n const dotRadius = Math.max(0.75, Math.min(1.75, screenGap / 24));\n const tile = getCachedTile(`dots:${tileSize}:${dotRadius}:${color}`, () =>\n buildDotTile(alignedTileSize, dotRadius, color)\n );\n if (!tile) return;\n fillWithPattern(ctx, tile, info.size.width, info.size.height, tx, ty);\n } else {\n const tile = getCachedTile(`grid:${tileSize}:${color}`, () =>\n buildGridTile(alignedTileSize, color)\n );\n if (!tile) return;\n ctx.globalAlpha = 0.6;\n fillWithPattern(ctx, tile, info.size.width, info.size.height, tx, ty);\n ctx.globalAlpha = 1;\n }\n}\n\n// Off-screen pattern tile cache. A pan keeps zoom (hence tile size, dot\n// radius, and colour) constant, so without this every panned frame would\n// allocate a fresh OffscreenCanvas and redraw the dot/grid. Keyed by every\n// input that affects the rendered pixels; bounded with FIFO eviction so a\n// continuous zoom (which varies the tile size per frame) can't grow it\n// without limit. Colour is in the key, so a theme switch produces a new tile\n// rather than a stale one.\nconst TILE_CACHE_LIMIT = 16;\nconst tileCache = new Map<string, HTMLCanvasElement | OffscreenCanvas>();\n\nfunction getCachedTile(\n key: string,\n build: () => HTMLCanvasElement | OffscreenCanvas | null\n): HTMLCanvasElement | OffscreenCanvas | null {\n const cached = tileCache.get(key);\n if (cached) return cached;\n const tile = build();\n if (!tile) return null;\n tileCache.set(key, tile);\n if (tileCache.size > TILE_CACHE_LIMIT) {\n const oldest = tileCache.keys().next().value;\n if (oldest !== undefined) tileCache.delete(oldest);\n }\n return tile;\n}\n\n/**\n * Build a single-cell repeating tile with one dot centred inside it.\n * Returns `null` when the environment has no `OffscreenCanvas`/`<canvas>`\n * (e.g. some SSR test runners) so the caller can bail without throwing.\n */\nfunction buildDotTile(\n tileSize: number,\n dotRadius: number,\n color: string\n): HTMLCanvasElement | OffscreenCanvas | null {\n const c = createTileCanvas(tileSize);\n if (!c) return null;\n const tctx = c.getContext('2d');\n if (!tctx) return null;\n tctx.clearRect(0, 0, tileSize, tileSize);\n tctx.fillStyle = color;\n tctx.beginPath();\n tctx.arc(tileSize / 2, tileSize / 2, dotRadius, 0, Math.PI * 2);\n tctx.fill();\n return c;\n}\n\n/**\n * Build a single-cell repeating tile carrying one vertical + one\n * horizontal line at the right/bottom edge — when tiled this forms a\n * full grid without overlap. Lines are at `tileSize - 0.5` so they fall\n * on whole pixels after the integer-snapped `setTransform` below.\n */\nfunction buildGridTile(\n tileSize: number,\n color: string\n): HTMLCanvasElement | OffscreenCanvas | null {\n const c = createTileCanvas(tileSize);\n if (!c) return null;\n const tctx = c.getContext('2d');\n if (!tctx) return null;\n tctx.clearRect(0, 0, tileSize, tileSize);\n tctx.strokeStyle = color;\n tctx.lineWidth = 1;\n // Right edge → vertical line; bottom edge → horizontal line.\n tctx.beginPath();\n tctx.moveTo(tileSize - 0.5, 0);\n tctx.lineTo(tileSize - 0.5, tileSize);\n tctx.moveTo(0, tileSize - 0.5);\n tctx.lineTo(tileSize, tileSize - 0.5);\n tctx.stroke();\n return c;\n}\n\nfunction createTileCanvas(\n size: number\n): HTMLCanvasElement | OffscreenCanvas | null {\n const rounded = Math.max(1, Math.round(size));\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(rounded, rounded);\n }\n if (typeof document === 'undefined') return null;\n const c = document.createElement('canvas');\n c.width = rounded;\n c.height = rounded;\n return c;\n}\n\n/**\n * Fill the entire viewport with a repeating pattern, translating the\n * pattern origin to `(tx, ty)` so the tile aligns with the world grid.\n * Single canvas call — independent of the number of dots/lines drawn.\n */\nfunction fillWithPattern(\n ctx: CanvasRenderingContext2D,\n tile: HTMLCanvasElement | OffscreenCanvas,\n width: number,\n height: number,\n tx: number,\n ty: number\n): void {\n const pattern = ctx.createPattern(tile, 'repeat');\n if (!pattern) return;\n ctx.save();\n // Move the pattern origin so the first tile starts at (tx, ty) instead\n // of (0, 0). The canvas tracks pattern origin via the current transform.\n ctx.translate(tx, ty);\n ctx.fillStyle = pattern;\n ctx.fillRect(-tx, -ty, width, height);\n ctx.restore();\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeGraphIds.js","sources":["../../../../../../src/components/editor/NodeGraph/nodeGraphIds.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,GAAG,CAAC;AAEjB,SAAS,YAAY,GAAA;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AACpC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAChD,IAAA,OAAO,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;AACzB;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,UAAkB,EAAA;AAC/C,IAAA,OAAO,GAAG,UAAU,CAAA,CAAA,EAAI,YAAY,EAAE,EAAE;AAC1C;AAEA;;;;;AAKG;AACG,SAAU,cAAc,CAC5B,MAAwB,EACxB,MAAwB,EAAA;IAExB,OAAO,CAAA,KAAA,EAAQ,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,IAAI,YAAY,EAAE,EAAE;AAC7F;;;;"}
1
+ {"version":3,"file":"nodeGraphIds.js","sources":["src/components/editor/NodeGraph/nodeGraphIds.ts"],"sourcesContent":["import type { NodeGraphPortRef } from './NodeGraph.types';\n\n// Module-scoped monotonic counter — guarantees uniqueness within a single\n// session even when `Date.now()` collides (tight bursts of connections,\n// fake timers in tests). Combined with a short random tail it gives a\n// near-zero collision risk without pulling in `crypto.randomUUID`, which\n// isn't available in every browser / runtime the library targets.\nlet idCounter = 0;\n\nfunction uniqueSuffix(): string {\n const t = Date.now().toString(36);\n const c = (idCounter++).toString(36);\n const r = Math.random().toString(36).slice(2, 6);\n return `${t}-${c}-${r}`;\n}\n\n/**\n * Generate a unique-enough id for a freshly-spawned node from a template.\n * Format: `${templateId}-${timestamp36}-${counter36}-${random36}`.\n */\nexport function generateNodeId(templateId: string): string {\n return `${templateId}-${uniqueSuffix()}`;\n}\n\n/**\n * Generate a unique edge id from its endpoints. Includes source/target\n * port refs in the id so it's somewhat readable in devtools, plus the\n * standard timestamp + counter + random tail to guarantee uniqueness\n * across rapid back-to-back connections.\n */\nexport function generateEdgeId(\n source: NodeGraphPortRef,\n target: NodeGraphPortRef\n): string {\n return `edge-${source.node}.${source.port}-${target.node}.${target.port}-${uniqueSuffix()}`;\n}\n"],"names":[],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,GAAG,CAAC;AAEjB,SAAS,YAAY,GAAA;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AACpC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAChD,IAAA,OAAO,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;AACzB;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,UAAkB,EAAA;AAC/C,IAAA,OAAO,GAAG,UAAU,CAAA,CAAA,EAAI,YAAY,EAAE,EAAE;AAC1C;AAEA;;;;;AAKG;AACG,SAAU,cAAc,CAC5B,MAAwB,EACxB,MAAwB,EAAA;IAExB,OAAO,CAAA,KAAA,EAAQ,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,IAAI,YAAY,EAAE,EAAE;AAC7F;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeGraphMath.js","sources":["../../../../../../src/components/editor/NodeGraph/nodeGraphMath.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nodeGraphMath.js","sources":["src/components/editor/NodeGraph/nodeGraphMath.ts"],"sourcesContent":["import type {\n NodeGraphEdge,\n NodeGraphNode,\n NodeGraphPortRef,\n NodeGraphPortSide,\n} from './NodeGraph.types';\nimport type {\n NodeGraphMeasuredSize,\n NodeGraphPortPosition,\n} from './NodeGraphStore';\nimport type { Point2D } from '@/components/primitives/canvas/canvas.types';\nimport type { WorldRect } from '@/components/primitives/viewport';\n\n/**\n * Fallback size used when a node has no measured DOM size yet (first paint\n * before `ResizeObserver` has fired) and no explicit `node.width`/`height`.\n */\nexport const DEFAULT_NODE_WIDTH = 180;\nexport const DEFAULT_NODE_HEIGHT = 80;\n\ninterface NodeBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Read the function used to look up the registered port position. Pure\n * resolver — the math module takes this as an argument so it stays free\n * of a store dependency.\n */\nexport type PortPositionLookup = (\n nodeId: string,\n portId: string\n) => NodeGraphPortPosition | null;\n\n/** Read the measured size of a node wrapper (or null if not measured yet). */\nexport type MeasuredSizeLookup = (\n nodeId: string\n) => NodeGraphMeasuredSize | null;\n\n/**\n * O(1) node-by-id lookup. Hot resolvers ({@link resolvePortRef},\n * {@link resolveEdgeEndpoints}) take this instead of an array to keep edge\n * drawing at `O(edges)` rather than `O(edges × nodes)`.\n */\nexport type NodeLookup = (id: string) => NodeGraphNode | undefined;\n\n/**\n * Resolve a node's effective bounding box.\n *\n * Priority: explicit `node.width`/`node.height` > measured DOM size >\n * `defaults`. This keeps consumer-controlled fixed-size nodes deterministic\n * while letting auto-sized nodes pick up their real dimensions for\n * hit-testing, marquee selection, and `fitToContent`.\n */\nexport function getNodeBox(\n node: NodeGraphNode,\n measuredSize?: NodeGraphMeasuredSize | null,\n defaults: { width: number; height: number } = {\n width: DEFAULT_NODE_WIDTH,\n height: DEFAULT_NODE_HEIGHT,\n }\n): NodeBox {\n return {\n x: node.position.x,\n y: node.position.y,\n width: node.width ?? measuredSize?.width ?? defaults.width,\n height: node.height ?? measuredSize?.height ?? defaults.height,\n };\n}\n\n/**\n * Unit vector pointing away from a port along its side. Used as the\n * tangent direction for the Bézier handle on that endpoint.\n */\nexport function sideVector(side: NodeGraphPortSide): Point2D {\n switch (side) {\n case 'left':\n return { x: -1, y: 0 };\n case 'right':\n return { x: 1, y: 0 };\n case 'top':\n return { x: 0, y: -1 };\n case 'bottom':\n return { x: 0, y: 1 };\n default: {\n const _unreached: never = side;\n return _unreached;\n }\n }\n}\n\nexport interface BezierControlPoints {\n /** Source endpoint. */\n p0: Point2D;\n /** Source-side control point. */\n c1: Point2D;\n /** Target-side control point. */\n c2: Point2D;\n /** Target endpoint. */\n p3: Point2D;\n}\n\n/**\n * Compute control points for a Cubic Bézier connecting `source` (on side\n * `srcSide`) to `target` (on side `tgtSide`). The handle length scales\n * with the distance between the endpoints, with a floor so short edges\n * still curve visibly.\n */\nexport function getBezierControlPoints(\n source: Point2D,\n srcSide: NodeGraphPortSide,\n target: Point2D,\n tgtSide: NodeGraphPortSide\n): BezierControlPoints {\n const dx = target.x - source.x;\n const dy = target.y - source.y;\n const dist = Math.hypot(dx, dy);\n\n const srcHorizontal = srcSide === 'left' || srcSide === 'right';\n const tgtHorizontal = tgtSide === 'left' || tgtSide === 'right';\n const srcAxis = srcHorizontal ? Math.abs(dx) : Math.abs(dy);\n const tgtAxis = tgtHorizontal ? Math.abs(dx) : Math.abs(dy);\n const minHandle = 32;\n const srcLen = Math.max(minHandle, srcAxis * 0.5, dist * 0.25);\n const tgtLen = Math.max(minHandle, tgtAxis * 0.5, dist * 0.25);\n\n const srcVec = sideVector(srcSide);\n const tgtVec = sideVector(tgtSide);\n\n return {\n p0: source,\n c1: { x: source.x + srcVec.x * srcLen, y: source.y + srcVec.y * srcLen },\n c2: { x: target.x + tgtVec.x * tgtLen, y: target.y + tgtVec.y * tgtLen },\n p3: target,\n };\n}\n\n/**\n * Evaluate a Cubic Bézier at parameter `t` in `[0, 1]`.\n */\nexport function evaluateBezier(cp: BezierControlPoints, t: number): Point2D {\n const it = 1 - t;\n const it2 = it * it;\n const t2 = t * t;\n const w0 = it2 * it;\n const w1 = 3 * it2 * t;\n const w2 = 3 * it * t2;\n const w3 = t2 * t;\n return {\n x: cp.p0.x * w0 + cp.c1.x * w1 + cp.c2.x * w2 + cp.p3.x * w3,\n y: cp.p0.y * w0 + cp.c1.y * w1 + cp.c2.y * w2 + cp.p3.y * w3,\n };\n}\n\n/**\n * Test whether a world point is within `threshold` world units of the\n * Bézier curve. Samples the curve at fixed intervals and measures\n * point-to-segment distance.\n */\nexport function isPointNearBezier(\n point: Point2D,\n cp: BezierControlPoints,\n threshold: number,\n samples = 24\n): boolean {\n let prev = cp.p0;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const curr = evaluateBezier(cp, t);\n if (pointToSegmentDistance(point, prev, curr) <= threshold) return true;\n prev = curr;\n }\n return false;\n}\n\n/**\n * Test whether a world point is inside (or on the edge of) a node box.\n */\nexport function isPointInNode(\n point: Point2D,\n node: NodeGraphNode,\n measuredSize?: NodeGraphMeasuredSize | null,\n defaults?: { width: number; height: number }\n): boolean {\n const box = getNodeBox(node, measuredSize, defaults);\n return (\n point.x >= box.x &&\n point.x <= box.x + box.width &&\n point.y >= box.y &&\n point.y <= box.y + box.height\n );\n}\n\n/** True when a rectangle contains a point. */\nexport function isPointInRect(point: Point2D, rect: WorldRect): boolean {\n return (\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height\n );\n}\n\n/** True when two axis-aligned rectangles overlap (non-strict). */\nexport function rectsIntersect(a: WorldRect, b: WorldRect): boolean {\n return (\n a.x < b.x + b.width &&\n a.x + a.width > b.x &&\n a.y < b.y + b.height &&\n a.y + a.height > b.y\n );\n}\n\n/**\n * True when `inner` is fully contained inside `outer` (closed comparison —\n * a rectangle that touches the outer's edge counts as contained). Used by\n * the group-drag controller to decide which nodes ride along with their\n * enclosing group.\n */\nexport function rectContains(outer: WorldRect, inner: WorldRect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.width <= outer.x + outer.width &&\n inner.y + inner.height <= outer.y + outer.height\n );\n}\n\n/**\n * Compute the tight bounding box of a node list, factoring in measured /\n * default sizes. Returns a zero-width rect at the origin when the list\n * is empty.\n */\nexport function computeNodesBounds(\n nodes: ReadonlyArray<NodeGraphNode>,\n measuredSizes?: MeasuredSizeLookup,\n defaults?: { width: number; height: number }\n): WorldRect {\n if (nodes.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const node of nodes) {\n const box = getNodeBox(node, measuredSizes?.(node.id), defaults);\n if (box.x < minX) minX = box.x;\n if (box.y < minY) minY = box.y;\n if (box.x + box.width > maxX) maxX = box.x + box.width;\n if (box.y + box.height > maxY) maxY = box.y + box.height;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/**\n * Snap a world-space delta to the nearest grid increment. Pass `false`\n * for `grid` to return the delta unchanged.\n */\nexport function snapDelta(delta: Point2D, grid: number | false): Point2D {\n if (grid === false || grid <= 0) return delta;\n return {\n x: Math.round(delta.x / grid) * grid,\n y: Math.round(delta.y / grid) * grid,\n };\n}\n\n/**\n * Resolve the next selection for a click on `id`, honouring the additive\n * modifier (shift / cmd / ctrl). Non-additive replaces the selection with\n * just `id`; additive toggles `id` in/out of the current set. Shared by the\n * node-drag, group-drag, and edge-click paths so the toggle semantics stay\n * identical everywhere.\n */\nexport function toggleSelected(\n ids: ReadonlyArray<string>,\n id: string,\n additive: boolean\n): string[] {\n if (!additive) return [id];\n return ids.includes(id)\n ? ids.filter(existing => existing !== id)\n : [...ids, id];\n}\n\n/** Minimum size (in world units) a group can be resized down to. */\nexport const MIN_GROUP_SIZE = 32;\n\n/**\n * Compute the new group bounds during a resize gesture, given the\n * original bounds, the cumulative drag delta, and which handle is being\n * dragged. Enforces a minimum size on each axis so the group doesn't\n * collapse to zero.\n */\nexport function applyGroupResize(\n start: WorldRect,\n handle: 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w',\n delta: Point2D,\n minSize = MIN_GROUP_SIZE\n): WorldRect {\n let { x, y, width, height } = start;\n\n const movesLeft = handle === 'nw' || handle === 'w' || handle === 'sw';\n const movesRight = handle === 'ne' || handle === 'e' || handle === 'se';\n const movesTop = handle === 'nw' || handle === 'n' || handle === 'ne';\n const movesBottom = handle === 'sw' || handle === 's' || handle === 'se';\n\n if (movesLeft) {\n const dx = Math.min(delta.x, start.width - minSize);\n x = start.x + dx;\n width = start.width - dx;\n } else if (movesRight) {\n width = Math.max(minSize, start.width + delta.x);\n }\n if (movesTop) {\n const dy = Math.min(delta.y, start.height - minSize);\n y = start.y + dy;\n height = start.height - dy;\n } else if (movesBottom) {\n height = Math.max(minSize, start.height + delta.y);\n }\n return { x, y, width, height };\n}\n\n/**\n * Resolve a port reference to its **world-space** position + side using\n * the slot-registered port position lookup. Returns `null` when the node\n * is missing or the port hasn't been measured yet (the slot's\n * `useLayoutEffect` hasn't run).\n */\nexport function resolvePortRef(\n ref: NodeGraphPortRef,\n getNodeById: NodeLookup,\n getPortPosition: PortPositionLookup\n): {\n node: NodeGraphNode;\n position: Point2D;\n side: NodeGraphPortSide;\n dataType?: string;\n} | null {\n const node = getNodeById(ref.node);\n if (!node) return null;\n const portPos = getPortPosition(ref.node, ref.port);\n if (!portPos) return null;\n return {\n node,\n position: {\n x: node.position.x + portPos.x,\n y: node.position.y + portPos.y,\n },\n side: portPos.side,\n ...(portPos.dataType !== undefined ? { dataType: portPos.dataType } : {}),\n };\n}\n\n/**\n * Resolve both endpoints of an edge to world-space positions + sides.\n * Returns `null` when either endpoint can't be resolved (missing node or\n * not-yet-measured port).\n */\nexport function resolveEdgeEndpoints(\n edge: NodeGraphEdge,\n getNodeById: NodeLookup,\n getPortPosition: PortPositionLookup\n): {\n source: Point2D;\n srcSide: NodeGraphPortSide;\n target: Point2D;\n tgtSide: NodeGraphPortSide;\n} | null {\n const src = resolvePortRef(edge.source, getNodeById, getPortPosition);\n if (!src) return null;\n const tgt = resolvePortRef(edge.target, getNodeById, getPortPosition);\n if (!tgt) return null;\n return {\n source: src.position,\n srcSide: src.side,\n target: tgt.position,\n tgtSide: tgt.side,\n };\n}\n\n/**\n * Apply a selection-driven cascade delete to a graph snapshot. Removes\n * the selected nodes / edges / groups and additionally drops any edge\n * whose source or target node was removed — eliminates the classic\n * \"orphan edge dangling off a deleted node\" bug. Pure function; returns\n * the same array references when nothing was removed.\n *\n * Used internally by `<NodeGraph>` when no `onDelete` is supplied, and\n * exported so consumers who DO supply `onDelete` (e.g. to snapshot for\n * undo, log telemetry, show confirmations) can reuse the same logic\n * without rewriting the filter.\n */\nexport function applyCascadeDelete<TNode extends { id: string }>(\n input: {\n nodes: ReadonlyArray<TNode>;\n edges: ReadonlyArray<NodeGraphEdge>;\n groups: ReadonlyArray<{ id: string }>;\n },\n selection: {\n nodes: ReadonlyArray<string>;\n edges: ReadonlyArray<string>;\n groups: ReadonlyArray<string>;\n }\n): {\n nodes: TNode[] | ReadonlyArray<TNode>;\n edges: NodeGraphEdge[] | ReadonlyArray<NodeGraphEdge>;\n groups: typeof input.groups;\n} {\n const removedNodeIds = new Set(selection.nodes);\n const removedEdgeIds = new Set(selection.edges);\n const removedGroupIds = new Set(selection.groups);\n\n const nodes =\n removedNodeIds.size > 0\n ? input.nodes.filter(n => !removedNodeIds.has(n.id))\n : input.nodes;\n const edges = input.edges.filter(\n e =>\n !removedEdgeIds.has(e.id) &&\n !removedNodeIds.has(e.source.node) &&\n !removedNodeIds.has(e.target.node)\n );\n const groups =\n removedGroupIds.size > 0\n ? input.groups.filter(g => !removedGroupIds.has(g.id))\n : input.groups;\n\n return {\n nodes,\n // Keep the input array reference when nothing changed — lets the\n // consumer skip an unnecessary `setEdges` if they want to.\n edges: edges.length === input.edges.length ? input.edges : edges,\n groups,\n };\n}\n\n/**\n * Find the topmost edge whose Bézier passes within `threshold` world units\n * of `point`. Iterates in reverse so the last-drawn edge wins, matching what\n * the user sees on top. Returns the edge id, or `null` when none is hit.\n *\n * Used for pointer hover + click selection + right-click targeting of edges,\n * which are drawn on a canvas (no DOM to hit-test against).\n */\nexport function findEdgeAtPoint(\n point: Point2D,\n edges: ReadonlyArray<NodeGraphEdge>,\n getNodeById: NodeLookup,\n getPortPosition: PortPositionLookup,\n threshold: number\n): string | null {\n for (let i = edges.length - 1; i >= 0; i--) {\n const edge = edges[i];\n if (!edge) continue;\n const ends = resolveEdgeEndpoints(edge, getNodeById, getPortPosition);\n if (!ends) continue;\n const cp = getBezierControlPoints(\n ends.source,\n ends.srcSide,\n ends.target,\n ends.tgtSide\n );\n // Broad-phase rejection: a cubic Bézier is contained within the convex\n // hull of its control points, so a point outside their bounding box\n // (expanded by `threshold`) can never be within `threshold` of the curve.\n // Skips the 24-sample distance test for the vast majority of edges on\n // large graphs — turns hover/click hit-testing from O(edges × 24) into a\n // couple of comparisons per non-candidate edge.\n if (point.x < Math.min(cp.p0.x, cp.c1.x, cp.c2.x, cp.p3.x) - threshold)\n continue;\n if (point.x > Math.max(cp.p0.x, cp.c1.x, cp.c2.x, cp.p3.x) + threshold)\n continue;\n if (point.y < Math.min(cp.p0.y, cp.c1.y, cp.c2.y, cp.p3.y) - threshold)\n continue;\n if (point.y > Math.max(cp.p0.y, cp.c1.y, cp.c2.y, cp.p3.y) + threshold)\n continue;\n if (isPointNearBezier(point, cp, threshold)) return edge.id;\n }\n return null;\n}\n\n// ─── Internals ───\n\nfunction pointToSegmentDistance(p: Point2D, a: Point2D, b: Point2D): number {\n const abx = b.x - a.x;\n const aby = b.y - a.y;\n const lenSq = abx * abx + aby * aby;\n if (lenSq === 0) return Math.hypot(p.x - a.x, p.y - a.y);\n let t = ((p.x - a.x) * abx + (p.y - a.y) * aby) / lenSq;\n if (t < 0) t = 0;\n else if (t > 1) t = 1;\n return Math.hypot(p.x - (a.x + t * abx), p.y - (a.y + t * aby));\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sortSlots.js","sources":["../../../../../../src/components/editor/NodeGraph/sortSlots.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAiCA,SAAS,WAAW,CAAC,EAAsB,EAAA;AACzC,IAAA,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;AAChE,QAAA,OAAO,IAAI;IACb;IACA,MAAM,MAAM,GAAI,EAAE,CAAC,IAAqC,CAAC,eAAe,CAAC;IACzE,OAAO,MAAM,IAAI,IAAI;AACvB;AAEA;;;;;;AAMG;AACG,SAAU,SAAS,CAAC,QAAyB,EAAA;;;;;IAKjD,IAAI,eAAe,GAAG,IAAuC;IAC7D,IAAI,YAAY,GAAG,IAAoC;IACvD,IAAI,iBAAiB,GAAG,IAAyC;IACjE,MAAM,QAAQ,GAA4B,EAAE;IAC5C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAG;QACvC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;YAChC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE;gBACpC,OAAO,CACL,uJAAuJ,CACxJ;YACH;YACA;QACF;AACA,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,IAAI,KAAK,YAAY,EAAE;AACzB,YAAA,eAAe,GAAG,KAAK,CAAC,KAAiC;QAC3D;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,YAAY,GAAG,KAAK,CAAC,KAA8B;QACrD;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAA8B,CAAC;QACrD;AAAO,aAAA,IAAI,IAAI,KAAK,eAAe,EAAE;AACnC,YAAA,iBAAiB,GAAG,KAAK,CAAC,KAAmC;QAC/D;aAAO;AACL,YAAA,MAAM,EAAE,GAAI,KAAK,CAAC;AAChB,kBAAE,WAAW;AACf,YAAA,IAAI,EAAE,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE;gBAChC,OAAO,CACL,CAAA,mBAAA,EAAsB,EAAE,CAAA,+CAAA,CAAiD;oBACvE,4EAA4E;AAC5E,oBAAA,oCAAoC,CACvC;YACH;QACF;AACF,IAAA,CAAC,CAAC;IACF,OAAO;QACL,aAAa,EAAE,eAAe,KAAK,IAAI;QACvC,eAAe;QACf,UAAU,EAAE,YAAY,KAAK,IAAI;QACjC,YAAY;QACZ,QAAQ;QACR,iBAAiB;KAClB;AACH;;;;"}
1
+ {"version":3,"file":"sortSlots.js","sources":["src/components/editor/NodeGraph/sortSlots.ts"],"sourcesContent":["import React from 'react';\n\nimport { devWarn } from '@/utils/devWarn';\n\nimport { NODE_GRAPH_SLOT } from './NodeGraph.types';\nimport {\n NodeGraphBackground,\n NodeGraphMinimap,\n NodeGraphSpawnPalette,\n NodeGraphToolbar,\n} from './NodeGraphSlots';\n\nimport type { NodeGraphSlotKind, NodeGraphSlotMarker } from './NodeGraph.types';\n\ntype NodeGraphBackgroundProps = React.ComponentProps<\n typeof NodeGraphBackground\n>;\ntype NodeGraphMinimapProps = React.ComponentProps<typeof NodeGraphMinimap>;\ntype NodeGraphToolbarProps = React.ComponentProps<typeof NodeGraphToolbar>;\ntype NodeGraphSpawnPaletteProps = React.ComponentProps<\n typeof NodeGraphSpawnPalette\n>;\n\nexport interface SortedSlots {\n hasBackground: boolean;\n backgroundProps: NodeGraphBackgroundProps | null;\n hasMinimap: boolean;\n minimapProps: NodeGraphMinimapProps | null;\n /** Multiple toolbars can co-exist (e.g. top-left + top-right). */\n toolbars: ReadonlyArray<NodeGraphToolbarProps>;\n spawnPaletteProps: NodeGraphSpawnPaletteProps | null;\n}\n\nfunction getSlotKind(el: React.ReactElement): NodeGraphSlotKind | null {\n if (typeof el.type !== 'function' && typeof el.type !== 'object') {\n return null;\n }\n const marker = (el.type as Partial<NodeGraphSlotMarker>)[NODE_GRAPH_SLOT];\n return marker ?? null;\n}\n\n/**\n * Walk `<NodeGraph>` children, recognise the compound slot subcomponents\n * (`<NodeGraph.Background>`, `<NodeGraph.Minimap>`, `<NodeGraph.Toolbar>`,\n * `<NodeGraph.SpawnPalette>`), and collect their props. Anything else\n * triggers a dev-time warning — the main component never renders raw\n * children, only the recognised slots in the right places of its tree.\n */\nexport function sortSlots(children: React.ReactNode): SortedSlots {\n // `null as T | null` (rather than `: T | null = null`) keeps the flow type a\n // nullable union: these are only ever assigned inside the `forEach` callback\n // below, and TypeScript can't see closure mutations, so a plain `= null`\n // would narrow them to `null` and make the `!== null` checks below look dead.\n let backgroundProps = null as NodeGraphBackgroundProps | null;\n let minimapProps = null as NodeGraphMinimapProps | null;\n let spawnPaletteProps = null as NodeGraphSpawnPaletteProps | null;\n const toolbars: NodeGraphToolbarProps[] = [];\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) {\n if (child != null && child !== false) {\n devWarn(\n '[NodeGraph] children must be slot subcomponents (<NodeGraph.Background />, <NodeGraph.Minimap />, <NodeGraph.Toolbar />, <NodeGraph.SpawnPalette />).'\n );\n }\n return;\n }\n const kind = getSlotKind(child);\n if (kind === 'background') {\n backgroundProps = child.props as NodeGraphBackgroundProps;\n } else if (kind === 'minimap') {\n minimapProps = child.props as NodeGraphMinimapProps;\n } else if (kind === 'toolbar') {\n toolbars.push(child.props as NodeGraphToolbarProps);\n } else if (kind === 'spawn-palette') {\n spawnPaletteProps = child.props as NodeGraphSpawnPaletteProps;\n } else {\n const dn = (child.type as { displayName?: string } | undefined)\n ?.displayName;\n if (dn?.startsWith('NodeGraph.')) {\n devWarn(\n `[NodeGraph] child \"${dn}\" looks like a slot subcomponent but lacks the ` +\n 'NODE_GRAPH_SLOT marker. If you wrapped it in React.memo or HOCs, copy the ' +\n 'marker symbol over to the wrapper.'\n );\n }\n }\n });\n return {\n hasBackground: backgroundProps !== null,\n backgroundProps,\n hasMinimap: minimapProps !== null,\n minimapProps,\n toolbars,\n spawnPaletteProps,\n };\n}\n"],"names":[],"mappings":";;;;AAiCA,SAAS,WAAW,CAAC,EAAsB,EAAA;AACzC,IAAA,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;AAChE,QAAA,OAAO,IAAI;IACb;IACA,MAAM,MAAM,GAAI,EAAE,CAAC,IAAqC,CAAC,eAAe,CAAC;IACzE,OAAO,MAAM,IAAI,IAAI;AACvB;AAEA;;;;;;AAMG;AACG,SAAU,SAAS,CAAC,QAAyB,EAAA;;;;;IAKjD,IAAI,eAAe,GAAG,IAAuC;IAC7D,IAAI,YAAY,GAAG,IAAoC;IACvD,IAAI,iBAAiB,GAAG,IAAyC;IACjE,MAAM,QAAQ,GAA4B,EAAE;IAC5C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAG;QACvC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;YAChC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE;gBACpC,OAAO,CACL,uJAAuJ,CACxJ;YACH;YACA;QACF;AACA,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,IAAI,KAAK,YAAY,EAAE;AACzB,YAAA,eAAe,GAAG,KAAK,CAAC,KAAiC;QAC3D;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,YAAY,GAAG,KAAK,CAAC,KAA8B;QACrD;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAA8B,CAAC;QACrD;AAAO,aAAA,IAAI,IAAI,KAAK,eAAe,EAAE;AACnC,YAAA,iBAAiB,GAAG,KAAK,CAAC,KAAmC;QAC/D;aAAO;AACL,YAAA,MAAM,EAAE,GAAI,KAAK,CAAC;AAChB,kBAAE,WAAW;AACf,YAAA,IAAI,EAAE,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE;gBAChC,OAAO,CACL,CAAA,mBAAA,EAAsB,EAAE,CAAA,+CAAA,CAAiD;oBACvE,4EAA4E;AAC5E,oBAAA,oCAAoC,CACvC;YACH;QACF;AACF,IAAA,CAAC,CAAC;IACF,OAAO;QACL,aAAa,EAAE,eAAe,KAAK,IAAI;QACvC,eAAe;QACf,UAAU,EAAE,YAAY,KAAK,IAAI;QACjC,YAAY;QACZ,QAAQ;QACR,iBAAiB;KAClB;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDragGesture.js","sources":["../../../../../../src/components/editor/NodeGraph/useDragGesture.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAyCA;;;;;;;AAOG;;AAED;;;AAIE;AACE;AACA;AACF;;;AAQE;AAEA;AACA;AAEA;AACE;;AACA;AACF;AACA;AACE;;AACA;;AAEF;;AAEA;AACE;AACA;;AAEE;;;AAIJ;AACA;;;AAMJ;AAEI;AACA;AAA2C;AAC3C;;AAEE;;;AAGF;;AAKJ;AACF;;"}
1
+ {"version":3,"file":"useDragGesture.js","sources":["src/components/editor/NodeGraph/useDragGesture.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useLayoutEffect, useRef } from 'react';\n\nimport type React from 'react';\n\ninterface ActiveGesture {\n pointerId: number;\n teardown: () => void;\n}\n\nexport interface DragGestureHandlers {\n /** Fired on each document `pointermove` for the captured pointer. */\n onMove: (event: PointerEvent) => void;\n /**\n * Fired on `pointercancel` for the captured pointer. Document listeners are\n * already detached by the time this runs — just reset business state.\n */\n onCancel: () => void;\n}\n\nexport interface DragGestureControls {\n /**\n * Begin a pointer-drag on `event.currentTarget`: capture the pointer, attach\n * document `pointermove` / `pointercancel` listeners, and remember the\n * gesture so `finish` (or unmount) can release it. Any gesture still in\n * flight is torn down first — defensive against a lost `pointercancel`\n * (e.g. pointer capture dropped on alt-tab between moves).\n */\n begin: (\n event: React.PointerEvent<HTMLElement>,\n handlers: DragGestureHandlers\n ) => void;\n /**\n * Finish from a `pointerup` handler: release pointer capture and detach the\n * document listeners. Returns `false` when the up doesn't belong to the\n * active gesture (stale or secondary pointer) so the caller can bail.\n */\n finish: (event: React.PointerEvent<HTMLElement>) => boolean;\n}\n\n/**\n * Mechanical lifecycle for a pointer-capture drag gesture, shared by the node\n * and group drag controllers. Owns pointer capture, document listener\n * attach/detach, the per-pointer id guard, and cleanup on unmount — leaving\n * each hook to supply only its own move / cancel / up business logic. Document\n * listeners exist only while a gesture is in flight, so there's zero\n * pointermove cost between drags.\n */\nexport function useDragGesture(): DragGestureControls {\n const activeRef = useRef<ActiveGesture | null>(null);\n\n // Release in-flight document listeners if the component unmounts mid-drag.\n useLayoutEffect(() => {\n return () => {\n activeRef.current?.teardown();\n activeRef.current = null;\n };\n }, []);\n\n const begin = useCallback(\n (\n event: React.PointerEvent<HTMLElement>,\n handlers: DragGestureHandlers\n ): void => {\n activeRef.current?.teardown();\n\n const pointerId = event.pointerId;\n event.currentTarget.setPointerCapture(pointerId);\n\n const handleMove = (e: PointerEvent): void => {\n if (e.pointerId !== pointerId) return;\n handlers.onMove(e);\n };\n const handleCancel = (e: PointerEvent): void => {\n if (e.pointerId !== pointerId) return;\n teardown();\n handlers.onCancel();\n };\n // Function declaration (hoisted) so the handlers above can close over it.\n function teardown(): void {\n document.removeEventListener('pointermove', handleMove);\n document.removeEventListener('pointercancel', handleCancel);\n if (activeRef.current?.pointerId === pointerId) {\n activeRef.current = null;\n }\n }\n\n document.addEventListener('pointermove', handleMove);\n document.addEventListener('pointercancel', handleCancel);\n activeRef.current = { pointerId, teardown };\n },\n []\n );\n\n const finish = useCallback(\n (event: React.PointerEvent<HTMLElement>): boolean => {\n const active = activeRef.current;\n if (active?.pointerId !== event.pointerId) return false;\n const target = event.currentTarget;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n active.teardown();\n return true;\n },\n []\n );\n\n return { begin, finish };\n}\n"],"names":[],"mappings":";;;AAyCA;;;;;;;AAOG;;AAED;;;AAIE;AACE;AACA;AACF;;;AAQE;AAEA;AACA;AAEA;AACE;;AACA;AACF;AACA;AACE;;AACA;;AAEF;;AAEA;AACE;AACA;;AAEE;;;AAIJ;AACA;;;AAMJ;AAEI;AACA;AAA2C;AAC3C;;AAEE;;;AAGF;;AAKJ;AACF;;"}
@@ -4,7 +4,7 @@ import '../../../utils/devWarn.js';
4
4
  import { useLatest } from '../../../hooks/useLatest/useLatest.js';
5
5
  import '../../../hooks/useBreakpoint/useBreakpoint.js';
6
6
  import './../../../assets/src/theme/lightTheme.css.ts.vanilla-Ct6f9Iym.css';
7
- import '../../../node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js';
7
+ import '@vanilla-extract/css';
8
8
  import './../../../assets/src/theme/darkTheme.css.ts.vanilla-BHZ3ecRn.css';
9
9
  import 'react/jsx-runtime';
10
10
  import './../../../assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';
@@ -1 +1 @@
1
- {"version":3,"file":"useNodeGraph.js","sources":["../../../../../../src/components/editor/NodeGraph/useNodeGraph.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;AAwBA;AACE;AACA;AACA;;AA2FF;;;;;;;;;;;;;;;;;;AAkBG;AACG;AAGJ;AAGA;AAGA;AAGA;;;AAMA;AACA;AACA;AACA;AAEA;;;AAGE;AACA;;AAGF;AAEI;;AACA;;;;;AAMG;AAGH;AACA;AACA;;AAIA;;AAEA;AACE;AACE;AACA;;AAED;;;AAMP;AAEI;;AACA;;AAEA;AACA;AACE;;AAEE;;AAED;;AAEL;;AAME;AACF;AAIF;AACE;AACA;AAEE;AACA;;;;;;;;AAYF;AACA;AACA;;;;;AAUE;AAKA;AAAyB;AACzB;AACA;AACA;AACA;AACF;;;AAaM;AACA;;AAGJ;;;AAEA;;;;AAIE;;AAEF;AACA;AACF;;;AAOE;;;AAGE;AACE;;AAEF;AACE;;;AAGJ;AACA;;AAKJ;AAEI;;AACA;;AAEA;AACA;AACE;;;AAGE;AACD;;AAEL;AAIF;;;AAIA;;;;;AAMI;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AA0BN;;"}
1
+ {"version":3,"file":"useNodeGraph.js","sources":["src/components/editor/NodeGraph/useNodeGraph.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { useLatest } from '@/hooks';\n\nimport {\n duplicateNodes as duplicateNodesImpl,\n edgesConnectedToPort,\n} from './nodeGraphActions';\nimport { generateEdgeId, generateNodeId } from './nodeGraphIds';\nimport { applyCascadeDelete } from './nodeGraphMath';\n\nimport type {\n NodeGraphEdge,\n NodeGraphGroup,\n NodeGraphNode,\n NodeGraphPortRef,\n NodeGraphSelection,\n} from './NodeGraph.types';\nimport type { DuplicateNodesOptions } from './nodeGraphActions';\nimport type { WorldRect } from '@/components/primitives/viewport';\nimport type { Dispatch, SetStateAction } from 'react';\n\nconst EMPTY_SELECTION: NodeGraphSelection = {\n nodes: [],\n edges: [],\n groups: [],\n};\n\n/** A node accepted by `addNode` — the `id` is generated when omitted. */\nexport type NodeGraphNodeInput = Omit<NodeGraphNode, 'id'> & { id?: string };\n\nexport interface UseNodeGraphOptions {\n /** Initial nodes. @default [] */\n nodes?: NodeGraphNode[];\n /** Initial edges. @default [] */\n edges?: NodeGraphEdge[];\n /** Initial groups. @default [] */\n groups?: NodeGraphGroup[];\n /** Initial selection. @default { nodes: [], edges: [], groups: [] } */\n selection?: NodeGraphSelection;\n}\n\nexport interface AddGroupOptions {\n /** Group id. Generated when omitted. */\n id?: string;\n label?: string;\n color?: string;\n}\n\n/** The four controlled props + change handlers, ready to spread. */\nexport interface NodeGraphBind {\n nodes: NodeGraphNode[];\n edges: NodeGraphEdge[];\n groups: NodeGraphGroup[];\n selection: NodeGraphSelection;\n onNodesChange: (nodes: NodeGraphNode[]) => void;\n onEdgesChange: (edges: NodeGraphEdge[]) => void;\n onGroupsChange: (groups: NodeGraphGroup[]) => void;\n onSelectionChange: (selection: NodeGraphSelection) => void;\n}\n\nexport interface UseNodeGraphReturn {\n nodes: NodeGraphNode[];\n edges: NodeGraphEdge[];\n groups: NodeGraphGroup[];\n selection: NodeGraphSelection;\n\n setNodes: Dispatch<SetStateAction<NodeGraphNode[]>>;\n setEdges: Dispatch<SetStateAction<NodeGraphEdge[]>>;\n setGroups: Dispatch<SetStateAction<NodeGraphGroup[]>>;\n setSelection: Dispatch<SetStateAction<NodeGraphSelection>>;\n\n /** Append a node (generating an id when omitted). Returns the node id. */\n addNode: (node: NodeGraphNodeInput) => string;\n /**\n * Cascade-delete the given nodes — removes them, drops any edge touching\n * them, and prunes them from the selection.\n */\n removeNodes: (ids: ReadonlyArray<string>) => void;\n /** Remove the given edges and prune them from the selection. */\n removeEdges: (ids: ReadonlyArray<string>) => void;\n /** Remove every edge connected to a port — \"detach all\" for one socket. */\n disconnectPort: (node: string, port: string) => void;\n /**\n * Cascade-delete the current selection (nodes + edges + groups) and clear\n * it — the programmatic equivalent of pressing Delete.\n */\n removeSelection: () => void;\n /**\n * Clone nodes (defaults to the current selection), append the copies, and\n * select them. Returns the new node ids.\n */\n duplicateNodes: (\n ids?: ReadonlyArray<string>,\n options?: DuplicateNodesOptions\n ) => string[];\n /**\n * Add an edge between two ports, de-duplicating identical endpoints.\n * Returns the new (or existing) edge id.\n */\n connect: (\n source: NodeGraphPortRef,\n target: NodeGraphPortRef,\n data?: unknown\n ) => string;\n /** Append a group. Returns the group id. */\n addGroup: (bounds: WorldRect, options?: AddGroupOptions) => string;\n /** Remove the given groups and prune them from the selection. */\n removeGroups: (ids: ReadonlyArray<string>) => void;\n /** Clear the selection. */\n clearSelection: () => void;\n\n /** Spread onto `<NodeGraph {...bind} />` to wire all four controlled props. */\n bind: NodeGraphBind;\n}\n\n/**\n * Own a node graph's state (nodes / edges / groups / selection) plus the\n * mutations every editor re-implements — add / remove (with edge cascade) /\n * duplicate / connect / group. Spread `bind` onto `<NodeGraph>` and call the\n * actions from your toolbar / context menu:\n *\n * ```tsx\n * const graph = useNodeGraph({ nodes: initialNodes, edges: initialEdges });\n * return (\n * <NodeGraph {...graph.bind} renderNode={renderNode}>\n * <NodeGraph.Background />\n * </NodeGraph>\n * );\n * // graph.addNode(...), graph.removeSelection(), graph.duplicateNodes(), ...\n * ```\n *\n * Uncontrolled by design — the hook owns the state. For controlled state\n * (Redux / Zustand / external store) wire the four `onChange` props yourself.\n */\nexport function useNodeGraph(\n options?: UseNodeGraphOptions\n): UseNodeGraphReturn {\n const [nodes, setNodes] = useState<NodeGraphNode[]>(\n () => options?.nodes ?? []\n );\n const [edges, setEdges] = useState<NodeGraphEdge[]>(\n () => options?.edges ?? []\n );\n const [groups, setGroups] = useState<NodeGraphGroup[]>(\n () => options?.groups ?? []\n );\n const [selection, setSelection] = useState<NodeGraphSelection>(\n () => options?.selection ?? EMPTY_SELECTION\n );\n\n // Snapshot refs so multi-slice actions read a consistent view without\n // re-creating the callbacks on every state change.\n const nodesRef = useLatest(nodes);\n const edgesRef = useLatest(edges);\n const groupsRef = useLatest(groups);\n const selectionRef = useLatest(selection);\n\n const addNode = useCallback((node: NodeGraphNodeInput): string => {\n const id = node.id ?? generateNodeId('node');\n const next: NodeGraphNode = { ...node, id };\n setNodes(prev => [...prev, next]);\n return id;\n }, []);\n\n const removeNodes = useCallback(\n (ids: ReadonlyArray<string>): void => {\n if (ids.length === 0) return;\n const removed = new Set(ids);\n const result = applyCascadeDelete(\n {\n nodes: nodesRef.current,\n edges: edgesRef.current,\n groups: groupsRef.current,\n },\n { nodes: ids, edges: [], groups: [] }\n );\n setNodes(result.nodes as NodeGraphNode[]);\n setEdges(result.edges as NodeGraphEdge[]);\n const sel = selectionRef.current;\n const keptEdgeIds = new Set(\n (result.edges as NodeGraphEdge[]).map(e => e.id)\n );\n const dropsNode = sel.nodes.some(nodeId => removed.has(nodeId));\n const dropsEdge = sel.edges.some(edgeId => !keptEdgeIds.has(edgeId));\n if (dropsNode || dropsEdge) {\n setSelection({\n nodes: sel.nodes.filter(nodeId => !removed.has(nodeId)),\n edges: sel.edges.filter(edgeId => keptEdgeIds.has(edgeId)),\n groups: sel.groups,\n });\n }\n },\n [nodesRef, edgesRef, groupsRef, selectionRef]\n );\n\n const removeEdges = useCallback(\n (ids: ReadonlyArray<string>): void => {\n if (ids.length === 0) return;\n const removed = new Set(ids);\n setEdges(prev => prev.filter(e => !removed.has(e.id)));\n const sel = selectionRef.current;\n if (sel.edges.some(edgeId => removed.has(edgeId))) {\n setSelection({\n nodes: sel.nodes,\n edges: sel.edges.filter(edgeId => !removed.has(edgeId)),\n groups: sel.groups,\n });\n }\n },\n [selectionRef]\n );\n\n const disconnectPort = useCallback(\n (node: string, port: string): void => {\n removeEdges(edgesConnectedToPort(edgesRef.current, { node, port }));\n },\n [edgesRef, removeEdges]\n );\n\n const removeSelection = useCallback((): void => {\n const sel = selectionRef.current;\n if (\n sel.nodes.length === 0 &&\n sel.edges.length === 0 &&\n sel.groups.length === 0\n ) {\n return;\n }\n const result = applyCascadeDelete(\n {\n nodes: nodesRef.current,\n edges: edgesRef.current,\n groups: groupsRef.current,\n },\n sel\n );\n setNodes(result.nodes as NodeGraphNode[]);\n setEdges(result.edges as NodeGraphEdge[]);\n setGroups(result.groups as NodeGraphGroup[]);\n setSelection(EMPTY_SELECTION);\n }, [nodesRef, edgesRef, groupsRef, selectionRef]);\n\n const duplicateNodes = useCallback(\n (\n ids?: ReadonlyArray<string>,\n duplicateOptions?: DuplicateNodesOptions\n ): string[] => {\n const targetIds = ids ?? selectionRef.current.nodes;\n const copies = duplicateNodesImpl(\n nodesRef.current,\n targetIds,\n duplicateOptions\n );\n if (copies.length === 0) return [];\n setNodes(prev => [...prev, ...copies]);\n const newIds = copies.map(n => n.id);\n setSelection({ nodes: newIds, edges: [], groups: [] });\n return newIds;\n },\n [nodesRef, selectionRef]\n );\n\n const connect = useCallback(\n (\n source: NodeGraphPortRef,\n target: NodeGraphPortRef,\n data?: unknown\n ): string => {\n const existing = edgesRef.current.find(\n e =>\n e.source.node === source.node &&\n e.source.port === source.port &&\n e.target.node === target.node &&\n e.target.port === target.port\n );\n if (existing) return existing.id;\n const id = generateEdgeId(source, target);\n const edge: NodeGraphEdge = {\n id,\n source,\n target,\n ...(data !== undefined ? { data } : {}),\n };\n setEdges(prev => [...prev, edge]);\n return id;\n },\n [edgesRef]\n );\n\n const addGroup = useCallback(\n (bounds: WorldRect, groupOptions?: AddGroupOptions): string => {\n const id = groupOptions?.id ?? generateNodeId('group');\n const group: NodeGraphGroup = {\n id,\n bounds,\n ...(groupOptions?.label !== undefined\n ? { label: groupOptions.label }\n : {}),\n ...(groupOptions?.color !== undefined\n ? { color: groupOptions.color }\n : {}),\n };\n setGroups(prev => [...prev, group]);\n return id;\n },\n []\n );\n\n const removeGroups = useCallback(\n (ids: ReadonlyArray<string>): void => {\n if (ids.length === 0) return;\n const removed = new Set(ids);\n setGroups(prev => prev.filter(g => !removed.has(g.id)));\n const sel = selectionRef.current;\n if (sel.groups.some(groupId => removed.has(groupId))) {\n setSelection({\n nodes: sel.nodes,\n edges: sel.edges,\n groups: sel.groups.filter(groupId => !removed.has(groupId)),\n });\n }\n },\n [selectionRef]\n );\n\n const clearSelection = useCallback((): void => {\n setSelection(EMPTY_SELECTION);\n }, []);\n\n const bind = useMemo<NodeGraphBind>(\n () => ({\n nodes,\n edges,\n groups,\n selection,\n onNodesChange: setNodes,\n onEdgesChange: setEdges,\n onGroupsChange: setGroups,\n onSelectionChange: setSelection,\n }),\n [nodes, edges, groups, selection]\n );\n\n return {\n nodes,\n edges,\n groups,\n selection,\n setNodes,\n setEdges,\n setGroups,\n setSelection,\n addNode,\n removeNodes,\n removeEdges,\n disconnectPort,\n removeSelection,\n duplicateNodes,\n connect,\n addGroup,\n removeGroups,\n clearSelection,\n bind,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAwBA;AACE;AACA;AACA;;AA2FF;;;;;;;;;;;;;;;;;;AAkBG;AACG;AAGJ;AAGA;AAGA;AAGA;;;AAMA;AACA;AACA;AACA;AAEA;;;AAGE;AACA;;AAGF;AAEI;;AACA;;;;;AAMG;AAGH;AACA;AACA;;AAIA;;AAEA;AACE;AACE;AACA;;AAED;;;AAMP;AAEI;;AACA;;AAEA;AACA;AACE;;AAEE;;AAED;;AAEL;;AAME;AACF;AAIF;AACE;AACA;AAEE;AACA;;;;;;;;AAYF;AACA;AACA;;;;;AAUE;AAKA;AAAyB;AACzB;AACA;AACA;AACA;AACF;;;AAaM;AACA;;AAGJ;;;AAEA;;;;AAIE;;AAEF;AACA;AACF;;;AAOE;;;AAGE;AACE;;AAEF;AACE;;;AAGJ;AACA;;AAKJ;AAEI;;AACA;;AAEA;AACA;AACE;;;AAGE;AACD;;AAEL;AAIF;;;AAIA;;;;;AAMI;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AA0BN;;"}
@@ -9,7 +9,7 @@ import '../../../utils/devWarn.js';
9
9
  import { useLatest } from '../../../hooks/useLatest/useLatest.js';
10
10
  import '../../../hooks/useBreakpoint/useBreakpoint.js';
11
11
  import './../../../assets/src/theme/lightTheme.css.ts.vanilla-Ct6f9Iym.css';
12
- import '../../../node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js';
12
+ import '@vanilla-extract/css';
13
13
  import './../../../assets/src/theme/darkTheme.css.ts.vanilla-BHZ3ecRn.css';
14
14
  import 'react/jsx-runtime';
15
15
  import './../../../assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';
@@ -1 +1 @@
1
- {"version":3,"file":"useNodeGraphConnection.js","sources":["../../../../../../src/components/editor/NodeGraph/useNodeGraphConnection.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBA;AACA;AAkDA;;;AAGG;AACH;;;;;;AAKsB;AAClB;;AAEF;AACF;AAEA;;;;AAIG;AACH;AAKE;AACA;;;AAGE;;;;;AAKJ;AAEA;;;;;;;;;AASG;AACG;AAGJ;AAWA;AACA;AACA;AACA;AACA;AAEA;;;;AAKE;AACE;AACA;AACF;;;AAKE;AACA;;AACA;;AAKF;;;;;;;;AAYE;AACA;AACF;;;;AAOF;;;AAUI;;;AAIE;;AAEA;AACA;AACA;AACA;AACE;;AAEH;AACD;AACE;;;;;;;;;AAWA;;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;AAkBE;;;AAGA;;AAEA;AACE;;AAEH;AACH;AAEA;;AAEI;AACA;;;;AAGF;AACA;AACE;;AAEJ;;AAGE;;;;AAIA;AACA;AACA;AACA;AACF;AAEA;;AAKE;AACA;AACE;AAEE;AAEF;;AAEJ;AAEA;AAIE;AACA;;AAEE;;;AAGA;;;AAGJ;;AAGE;AACA;;AAEA;;AACA;AACA;AAEA;;;;AAIM;AACA;AACA;AACD;;;AAGC;AACA;AACA;AACD;;;AAGH;AACA;;AAEK;AACA;AAEG;;;;AAKN;;;AAGE;AACA;AACA;AACD;;;;;;;AAQC;AACA;AACA;AACD;;;;;AAML;;;;;;;AAMI;AACE;;AAEA;;AAEF;;;;;AAKF;;AAEA;AACD;;;AAID;AACA;;AAEA;;;;AAGE;AACA;;AAED;;AAGH;AACA;AACA;AACA;AACF;;;;;;;;;AAUC;;AASC;;;;;;;;AAMA;;;;AAIE;AACD;AACH;AAIF;;AAQI;;;;AAGA;AACA;AACE;AACA;AACA;;AAED;AACH;AAIF;AACF;;"}
1
+ {"version":3,"file":"useNodeGraphConnection.js","sources":["src/components/editor/NodeGraph/useNodeGraphConnection.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef } from 'react';\n\nimport { screenToWorld } from '@/components/primitives/viewport';\nimport { useLatest } from '@/hooks';\n\nimport { generateEdgeId } from './nodeGraphIds';\n\nimport type {\n NodeGraphEdge,\n NodeGraphPortRef,\n NodeGraphSelection,\n NodeGraphConnectStartInfo,\n NodeGraphConnectEndInfo,\n NodeGraphConnectionValidationInfo,\n} from './NodeGraph.types';\nimport type { NodeGraphStore } from './NodeGraphStore';\nimport type { Point2D } from '@/components/primitives/canvas/canvas.types';\nimport type { ViewportTransform } from '@/components/primitives/viewport';\nimport type React from 'react';\n\n/** Pointer travel (screen px) before a reconnect grab counts as a drag. */\nconst RECONNECT_DRAG_THRESHOLD_PX = 4;\n\n/**\n * What a connection drag is doing: creating a brand-new edge from a port, or\n * re-dragging one endpoint of an existing edge (which on drop moves the\n * endpoint, deletes the edge, or — with no drag — selects it).\n */\ntype ConnectMode =\n | { kind: 'create' }\n | { kind: 'reconnect'; edgeId: string; end: 'source' | 'target' };\n\ninterface UseNodeGraphConnectionOptions {\n viewportRef: React.RefObject<HTMLDivElement | null>;\n store: NodeGraphStore;\n getTransform: () => ViewportTransform;\n isValidConnection?: (\n source: NodeGraphPortRef,\n target: NodeGraphPortRef,\n info: NodeGraphConnectionValidationInfo\n ) => boolean;\n onConnectStart?: (info: NodeGraphConnectStartInfo) => void;\n onConnectEnd?: (info: NodeGraphConnectEndInfo) => void;\n emitEdgesChange: (next: NodeGraphEdge[]) => void;\n /** Used to select an edge when a reconnect grab ends as a plain click. */\n emitSelectionChange?: (next: NodeGraphSelection) => void;\n}\n\ninterface UseNodeGraphConnectionReturn {\n /**\n * Handler attached to each `<NodeGraph.Port>` slot. Starts a connection\n * drag (create mode) and wires up document-level pointer listeners until\n * the drag terminates.\n */\n onPortPointerDown: (\n event: React.PointerEvent<HTMLElement>,\n nodeId: string,\n portId: string\n ) => void;\n /**\n * Start re-dragging one endpoint of an existing edge. Invoked by the\n * parent when the pointer grabs near an edge endpoint on the background.\n */\n onEdgeReconnectStart: (\n edgeId: string,\n end: 'source' | 'target',\n clientX: number,\n clientY: number\n ) => void;\n}\n\n/**\n * Read the port id/node id encoded in `data-*` attributes of an element\n * (or its ancestors). Returns null when the element isn't a port handle.\n */\nfunction readPortRefFromElement(el: Element | null): NodeGraphPortRef | null {\n let cursor: Element | null = el;\n while (cursor) {\n const node = cursor.getAttribute('data-node-id');\n const port = cursor.getAttribute('data-port-id');\n if (node && port) return { node, port };\n cursor = cursor.parentElement;\n }\n return null;\n}\n\n/**\n * Build the validation info object passed to `isValidConnection`. Looks up\n * the per-port side + dataType in the store so the consumer doesn't have\n * to maintain a parallel port index.\n */\nfunction buildValidationInfo(\n store: NodeGraphStore,\n source: NodeGraphPortRef,\n target: NodeGraphPortRef\n): NodeGraphConnectionValidationInfo {\n const src = store.getPortPosition(source.node, source.port);\n const tgt = store.getPortPosition(target.node, target.port);\n const sideCombo = src && tgt ? `${src.side}->${tgt.side}` : 'unknown';\n return {\n sameNode: source.node === target.node,\n sideCombo,\n ...(src?.dataType !== undefined ? { sourceDataType: src.dataType } : {}),\n ...(tgt?.dataType !== undefined ? { targetDataType: tgt.dataType } : {}),\n };\n}\n\n/**\n * Connection-drag controller. Owns the lifecycle from `pointerdown` (on a\n * port for a new edge, or near an edge endpoint for a reconnect) through\n * document-level `pointermove` / `pointerup` to the eventual edge emission.\n *\n * Document listeners are attached only while a drag is in flight — outside\n * of a gesture there is zero pointermove cost. Move events are coalesced\n * to one hit-test per animation frame so `document.elementFromPoint`\n * doesn't force a layout flush on every pointer poll.\n */\nexport function useNodeGraphConnection(\n options: UseNodeGraphConnectionOptions\n): UseNodeGraphConnectionReturn {\n const {\n viewportRef,\n store,\n getTransform,\n isValidConnection,\n onConnectStart,\n onConnectEnd,\n emitEdgesChange,\n emitSelectionChange,\n } = options;\n\n const isValidRef = useLatest(isValidConnection);\n const onConnectStartRef = useLatest(onConnectStart);\n const onConnectEndRef = useLatest(onConnectEnd);\n const emitEdgesChangeRef = useLatest(emitEdgesChange);\n const emitSelectionChangeRef = useLatest(emitSelectionChange);\n\n const teardownRef = useRef<(() => void) | null>(null);\n\n // If the component unmounts mid-drag, release the document listeners so\n // we don't leak handlers attached to the page.\n useEffect(() => {\n return () => {\n teardownRef.current?.();\n teardownRef.current = null;\n };\n }, []);\n\n const screenPointToWorld = useCallback(\n (clientX: number, clientY: number): Point2D => {\n const viewport = viewportRef.current;\n if (!viewport) return { x: 0, y: 0 };\n const rect = viewport.getBoundingClientRect();\n return screenToWorld(\n { x: clientX - rect.left, y: clientY - rect.top },\n getTransform()\n );\n },\n [viewportRef, getTransform]\n );\n\n // Whether a connection from `source` to `candidate` is allowed: defers to\n // the consumer's `isValidConnection` when provided, otherwise the built-in\n // rule of \"any port but one on the same node\". Shared by the live-hover\n // preview and both drop paths (create + reconnect) so the accept/reject\n // verdict can never drift between them.\n const isAcceptable = useCallback(\n (source: NodeGraphPortRef, candidate: NodeGraphPortRef): boolean => {\n const info = buildValidationInfo(store, source, candidate);\n const validator = isValidRef.current;\n return validator ? validator(source, candidate, info) : !info.sameNode;\n },\n [store, isValidRef]\n );\n\n // Shared drag lifecycle for both modes. `source` is the fixed endpoint the\n // preview draws from and the one passed to `isValidConnection` as the\n // source argument.\n const beginDrag = useCallback(\n (params: {\n source: NodeGraphPortRef;\n startClientX: number;\n startClientY: number;\n mode: ConnectMode;\n }): void => {\n const { source, startClientX, startClientY, mode } = params;\n\n // If a previous gesture didn't tear down for some reason, clean it now.\n teardownRef.current?.();\n\n const startWorld = screenPointToWorld(startClientX, startClientY);\n store.setInteraction({\n kind: 'connect',\n source,\n currentWorld: startWorld,\n candidate: null,\n invalid: false,\n ...(mode.kind === 'reconnect'\n ? { reconnectEdgeId: mode.edgeId, reconnectEnd: mode.end }\n : {}),\n });\n if (mode.kind === 'create') {\n onConnectStartRef.current?.({ source, worldPoint: startWorld });\n }\n\n let pendingPoint: { x: number; y: number } | null = null;\n let rafId = 0;\n let didMove = false;\n\n const runMove = (): void => {\n rafId = 0;\n const point = pendingPoint;\n pendingPoint = null;\n if (!point) return;\n const state = store.getInteraction();\n if (state.kind !== 'connect') return;\n\n const currentWorld = screenPointToWorld(point.x, point.y);\n const candidate = document.elementFromPoint(point.x, point.y);\n const candidateRef = readPortRefFromElement(candidate);\n\n let nextCandidate: NodeGraphPortRef | null = null;\n let invalid = false;\n if (candidateRef) {\n if (\n candidateRef.node === state.source.node &&\n candidateRef.port === state.source.port\n ) {\n // Hovering back over the fixed endpoint — treat as no candidate.\n nextCandidate = null;\n } else {\n nextCandidate = candidateRef;\n invalid = !isAcceptable(state.source, candidateRef);\n }\n }\n\n store.setInteraction({\n kind: 'connect',\n source: state.source,\n currentWorld,\n candidate: nextCandidate,\n invalid,\n ...(mode.kind === 'reconnect'\n ? { reconnectEdgeId: mode.edgeId, reconnectEnd: mode.end }\n : {}),\n });\n };\n\n const handleMove = (e: PointerEvent): void => {\n if (!didMove) {\n const dx = e.clientX - startClientX;\n const dy = e.clientY - startClientY;\n if (Math.hypot(dx, dy) >= RECONNECT_DRAG_THRESHOLD_PX) didMove = true;\n }\n pendingPoint = { x: e.clientX, y: e.clientY };\n if (rafId === 0) {\n rafId = requestAnimationFrame(runMove);\n }\n };\n\n const teardown = (): void => {\n if (rafId !== 0) {\n cancelAnimationFrame(rafId);\n rafId = 0;\n }\n document.removeEventListener('pointermove', handleMove);\n document.removeEventListener('pointerup', handleUp);\n document.removeEventListener('pointercancel', handleCancel);\n teardownRef.current = null;\n };\n\n const resolveCandidate = (\n clientX: number,\n clientY: number\n ): NodeGraphPortRef | null => {\n const dropEl = document.elementFromPoint(clientX, clientY);\n const finalCandidate = readPortRefFromElement(dropEl);\n return finalCandidate &&\n !(\n finalCandidate.node === source.node &&\n finalCandidate.port === source.port\n )\n ? finalCandidate\n : null;\n };\n\n const dropPoint = (\n clientX: number,\n clientY: number\n ): { worldPoint: Point2D; screenPoint: Point2D } => {\n const viewport = viewportRef.current;\n const rect = viewport?.getBoundingClientRect();\n const screenPoint = rect\n ? { x: clientX - rect.left, y: clientY - rect.top }\n : { x: clientX, y: clientY };\n return {\n worldPoint: screenPointToWorld(clientX, clientY),\n screenPoint,\n };\n };\n\n function handleUp(e: PointerEvent): void {\n teardown();\n const state = store.getInteraction();\n store.setInteraction({ kind: 'idle' });\n if (state.kind !== 'connect') return;\n const candidate = resolveCandidate(e.clientX, e.clientY);\n const drop = dropPoint(e.clientX, e.clientY);\n\n if (mode.kind === 'reconnect') {\n // A grab that never moved is a click — select the edge, keep it.\n if (!didMove) {\n emitSelectionChangeRef.current?.({\n nodes: [],\n edges: [mode.edgeId],\n groups: [],\n });\n onConnectEndRef.current?.({\n source,\n target: null,\n cancelled: true,\n ...drop,\n });\n return;\n }\n const accepted = candidate ? isAcceptable(source, candidate) : false;\n if (candidate && accepted) {\n const next = store\n .getData()\n .edges.map(edge =>\n edge.id === mode.edgeId\n ? mode.end === 'source'\n ? { ...edge, source: candidate }\n : { ...edge, target: candidate }\n : edge\n );\n emitEdgesChangeRef.current(next);\n onConnectEndRef.current?.({\n source,\n target: candidate,\n cancelled: false,\n ...drop,\n });\n } else {\n // Dropped on empty space or an invalid port → detach (delete).\n emitEdgesChangeRef.current(\n store.getData().edges.filter(edge => edge.id !== mode.edgeId)\n );\n onConnectEndRef.current?.({\n source,\n target: null,\n cancelled: true,\n ...drop,\n });\n }\n return;\n }\n\n // Create mode.\n let cancelled = !candidate;\n if (candidate) {\n const accepted = isAcceptable(source, candidate);\n if (!accepted) {\n cancelled = true;\n } else {\n const newEdge: NodeGraphEdge = {\n id: generateEdgeId(source, candidate),\n source,\n target: candidate,\n };\n emitEdgesChangeRef.current([...store.getData().edges, newEdge]);\n }\n }\n onConnectEndRef.current?.({\n source,\n target: cancelled ? null : (candidate ?? null),\n cancelled,\n ...drop,\n });\n }\n\n function handleCancel(e: PointerEvent): void {\n teardown();\n const state = store.getInteraction();\n store.setInteraction({ kind: 'idle' });\n if (state.kind !== 'connect') return;\n onConnectEndRef.current?.({\n source,\n target: null,\n cancelled: true,\n ...dropPoint(e.clientX, e.clientY),\n });\n }\n\n teardownRef.current = teardown;\n document.addEventListener('pointermove', handleMove);\n document.addEventListener('pointerup', handleUp);\n document.addEventListener('pointercancel', handleCancel);\n },\n [\n store,\n viewportRef,\n screenPointToWorld,\n onConnectStartRef,\n onConnectEndRef,\n emitEdgesChangeRef,\n emitSelectionChangeRef,\n isAcceptable,\n ]\n );\n\n const onPortPointerDown = useCallback(\n (\n event: React.PointerEvent<HTMLElement>,\n nodeId: string,\n portId: string\n ): void => {\n if (event.button !== 0) return;\n event.stopPropagation();\n event.preventDefault();\n // Bail when the port hasn't measured yet — without a registered\n // position the preview curve has no anchor.\n if (!store.getPortPosition(nodeId, portId)) return;\n beginDrag({\n source: { node: nodeId, port: portId },\n startClientX: event.clientX,\n startClientY: event.clientY,\n mode: { kind: 'create' },\n });\n },\n [store, beginDrag]\n );\n\n const onEdgeReconnectStart = useCallback(\n (\n edgeId: string,\n end: 'source' | 'target',\n clientX: number,\n clientY: number\n ): void => {\n const edge = store.getData().edges.find(e => e.id === edgeId);\n if (!edge) return;\n // The fixed endpoint is the *other* end — that's what the preview\n // anchors to and what the dragged end validates against.\n const fixed = end === 'source' ? edge.target : edge.source;\n beginDrag({\n source: fixed,\n startClientX: clientX,\n startClientY: clientY,\n mode: { kind: 'reconnect', edgeId, end },\n });\n },\n [store, beginDrag]\n );\n\n return { onPortPointerDown, onEdgeReconnectStart };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBA;AACA;AAkDA;;;AAGG;AACH;;;;;;AAKsB;AAClB;;AAEF;AACF;AAEA;;;;AAIG;AACH;AAKE;AACA;;;AAGE;;;;;AAKJ;AAEA;;;;;;;;;AASG;AACG;AAGJ;AAWA;AACA;AACA;AACA;AACA;AAEA;;;;AAKE;AACE;AACA;AACF;;;AAKE;AACA;;AACA;;AAKF;;;;;;;;AAYE;AACA;AACF;;;;AAOF;;;AAUI;;;AAIE;;AAEA;AACA;AACA;AACA;AACE;;AAEH;AACD;AACE;;;;;;;;;AAWA;;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;AAkBE;;;AAGA;;AAEA;AACE;;AAEH;AACH;AAEA;;AAEI;AACA;;;;AAGF;AACA;AACE;;AAEJ;;AAGE;;;;AAIA;AACA;AACA;AACA;AACF;AAEA;;AAKE;AACA;AACE;AAEE;AAEF;;AAEJ;AAEA;AAIE;AACA;;AAEE;;;AAGA;;;AAGJ;;AAGE;AACA;;AAEA;;AACA;AACA;AAEA;;;;AAIM;AACA;AACA;AACD;;;AAGC;AACA;AACA;AACD;;;AAGH;AACA;;AAEK;AACA;AAEG;;;;AAKN;;;AAGE;AACA;AACA;AACD;;;;;;;AAQC;AACA;AACA;AACD;;;;;AAML;;;;;;;AAMI;AACE;;AAEA;;AAEF;;;;;AAKF;;AAEA;AACD;;;AAID;AACA;;AAEA;;;;AAGE;AACA;;AAED;;AAGH;AACA;AACA;AACA;AACF;;;;;;;;;AAUC;;AASC;;;;;;;;AAMA;;;;AAIE;AACD;AACH;AAIF;;AAQI;;;;AAGA;AACA;AACE;AACA;AACA;;AAED;AACH;AAIF;AACF;;"}
@@ -9,7 +9,7 @@ import '../../../utils/devWarn.js';
9
9
  import { useLatest } from '../../../hooks/useLatest/useLatest.js';
10
10
  import '../../../hooks/useBreakpoint/useBreakpoint.js';
11
11
  import './../../../assets/src/theme/lightTheme.css.ts.vanilla-Ct6f9Iym.css';
12
- import '../../../node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js';
12
+ import '@vanilla-extract/css';
13
13
  import './../../../assets/src/theme/darkTheme.css.ts.vanilla-BHZ3ecRn.css';
14
14
  import 'react/jsx-runtime';
15
15
  import './../../../assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';