dishui 0.0.65 → 0.0.66

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 (500) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +10 -11
  2. package/dist/chart.js +12 -46
  3. package/dist/code-editor.js +16 -43
  4. package/dist/components/Badge/index.js +10 -15
  5. package/dist/components/Badge/index.js.map +1 -1
  6. package/dist/components/Button/index.js +62 -89
  7. package/dist/components/Button/index.js.map +1 -1
  8. package/dist/components/Card/index.d.ts +76 -0
  9. package/dist/components/Card/index.js +178 -69
  10. package/dist/components/Card/index.js.map +1 -1
  11. package/dist/components/Chart/Chart.js +25 -25
  12. package/dist/components/Chart/Chart.js.map +1 -1
  13. package/dist/components/Checkbox/index.js +57 -65
  14. package/dist/components/Checkbox/index.js.map +1 -1
  15. package/dist/components/ChoicePicker/index.d.ts +44 -0
  16. package/dist/components/ChoicePicker/index.js +81 -0
  17. package/dist/components/ChoicePicker/index.js.map +1 -0
  18. package/dist/components/Column/index.d.ts +28 -0
  19. package/dist/components/Column/index.js +30 -0
  20. package/dist/components/Column/index.js.map +1 -0
  21. package/dist/components/DateTimeInput/index.d.ts +44 -0
  22. package/dist/components/DateTimeInput/index.js +48 -0
  23. package/dist/components/DateTimeInput/index.js.map +1 -0
  24. package/dist/components/Demo/index.js +107 -107
  25. package/dist/components/Demo/index.js.map +1 -1
  26. package/dist/components/Divider/index.d.ts +20 -0
  27. package/dist/components/Divider/index.js +30 -0
  28. package/dist/components/Divider/index.js.map +1 -0
  29. package/dist/components/EmptyState/index.js +24 -24
  30. package/dist/components/EmptyState/index.js.map +1 -1
  31. package/dist/components/FileUploader/DropZone.js +134 -136
  32. package/dist/components/FileUploader/DropZone.js.map +1 -1
  33. package/dist/components/FileUploader/FileItem.js +159 -163
  34. package/dist/components/FileUploader/FileItem.js.map +1 -1
  35. package/dist/components/FileUploader/FileUploader.js +126 -127
  36. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  37. package/dist/components/FileUploader/UploadQueue.js +62 -62
  38. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  39. package/dist/components/FloatWindow/index.d.ts +28 -0
  40. package/dist/components/GridLayout/index.d.ts +42 -0
  41. package/dist/components/Icon/index.d.ts +24 -0
  42. package/dist/components/Icon/index.js +26 -0
  43. package/dist/components/Icon/index.js.map +1 -0
  44. package/dist/components/Image/index.d.ts +33 -0
  45. package/dist/components/Image/index.js +44 -0
  46. package/dist/components/Image/index.js.map +1 -0
  47. package/dist/components/Input/index.js +196 -197
  48. package/dist/components/Input/index.js.map +1 -1
  49. package/dist/components/Label/index.js +62 -74
  50. package/dist/components/Label/index.js.map +1 -1
  51. package/dist/components/Layout/index.js +134 -139
  52. package/dist/components/Layout/index.js.map +1 -1
  53. package/dist/components/List/index.js +45 -58
  54. package/dist/components/List/index.js.map +1 -1
  55. package/dist/components/Markdown/Markdown.js +106 -107
  56. package/dist/components/Markdown/Markdown.js.map +1 -1
  57. package/dist/components/Markdown/codeThemes.js +24 -33
  58. package/dist/components/Markdown/codeThemes.js.map +1 -1
  59. package/dist/components/Markdown/markdownComponents.js +203 -208
  60. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  61. package/dist/components/Markdown/parseCodeBlockMeta.js +22 -22
  62. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  63. package/dist/components/Markdown/useMarkdownSource.js +46 -46
  64. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  65. package/dist/components/Markdown/useMarkmapRenderer.js +35 -36
  66. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  67. package/dist/components/Markdown/useMermaidRenderer.js +41 -42
  68. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  69. package/dist/components/Modal/index.js +82 -82
  70. package/dist/components/Modal/index.js.map +1 -1
  71. package/dist/components/MultipleChoice/index.d.ts +44 -0
  72. package/dist/components/MultipleChoice/index.js +52 -0
  73. package/dist/components/MultipleChoice/index.js.map +1 -0
  74. package/dist/components/Notification/index.d.ts +17 -0
  75. package/dist/components/Page/index.js +40 -71
  76. package/dist/components/Page/index.js.map +1 -1
  77. package/dist/components/PageHeader/index.js +28 -28
  78. package/dist/components/PageHeader/index.js.map +1 -1
  79. package/dist/components/ProtectedRoute/index.js +8 -9
  80. package/dist/components/ProtectedRoute/index.js.map +1 -1
  81. package/dist/components/Row/index.d.ts +28 -0
  82. package/dist/components/Row/index.js +30 -0
  83. package/dist/components/Row/index.js.map +1 -0
  84. package/dist/components/Select/index.js +251 -254
  85. package/dist/components/Select/index.js.map +1 -1
  86. package/dist/components/SidebarToggleButton/index.js +56 -59
  87. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  88. package/dist/components/Slider/index.d.ts +39 -0
  89. package/dist/components/Slider/index.js +52 -0
  90. package/dist/components/Slider/index.js.map +1 -0
  91. package/dist/components/StatCard/index.d.ts +29 -1
  92. package/dist/components/StatCard/index.js +189 -86
  93. package/dist/components/StatCard/index.js.map +1 -1
  94. package/dist/components/Switch/index.d.ts +34 -0
  95. package/dist/components/Switch/index.js +55 -0
  96. package/dist/components/Switch/index.js.map +1 -0
  97. package/dist/components/Tab/index.d.ts +40 -0
  98. package/dist/components/Table/index.js +109 -121
  99. package/dist/components/Table/index.js.map +1 -1
  100. package/dist/components/Tabs/index.js +28 -38
  101. package/dist/components/Tabs/index.js.map +1 -1
  102. package/dist/components/Text/index.d.ts +43 -0
  103. package/dist/components/Text/index.js +55 -0
  104. package/dist/components/Text/index.js.map +1 -0
  105. package/dist/components/Tooltip/index.d.ts +23 -0
  106. package/dist/components/Tooltip/index.js +34 -0
  107. package/dist/components/Tooltip/index.js.map +1 -0
  108. package/dist/components/Tree/Tree.js +205 -205
  109. package/dist/components/Tree/Tree.js.map +1 -1
  110. package/dist/components/pro/ArticleContextMenu/index.js +86 -87
  111. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  112. package/dist/components/pro/ArticleControl/ArticleControl2.js +250 -250
  113. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  114. package/dist/components/pro/ArticleControl/buildHeadingTree.js +31 -32
  115. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  116. package/dist/components/pro/ArticleControl/useArticleToc.js +100 -102
  117. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  118. package/dist/components/pro/Calendar/Calendar.d.ts +10 -0
  119. package/dist/components/pro/Calendar/hooks/useCalendarDrag.d.ts +47 -0
  120. package/dist/components/pro/Calendar/hooks/useCalendarState.d.ts +56 -0
  121. package/dist/components/pro/Calendar/index.d.ts +7 -0
  122. package/dist/components/pro/Calendar/types.d.ts +151 -0
  123. package/dist/components/pro/Calendar/utils.d.ts +94 -0
  124. package/dist/components/pro/Chat/Chat.d.ts +6 -0
  125. package/dist/components/pro/Chat/index.d.ts +2 -0
  126. package/dist/components/pro/Chat/types.d.ts +84 -0
  127. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +287 -327
  128. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  129. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -224
  130. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  131. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js +594 -613
  132. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  133. package/dist/components/pro/CodeEditor/extensions/contextMenu.js +54 -55
  134. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  135. package/dist/components/pro/CodeEditor/extensions/index.js +152 -160
  136. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  137. package/dist/components/pro/CodeEditor/langs/index.js +7 -15
  138. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  139. package/dist/components/pro/CodeEditor/langs/javascript.js +11 -48
  140. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  141. package/dist/components/pro/CodeEditor/langs/python.js +4 -40
  142. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  143. package/dist/components/pro/CodeEditor/langs/snippets.js +118 -147
  144. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  145. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js +153 -153
  146. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  147. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +180 -190
  148. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  149. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js +130 -137
  150. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  151. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js +228 -242
  152. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  153. package/dist/components/pro/CodeEditor/panels/VariablePanel.js +208 -248
  154. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  155. package/dist/components/pro/CodeEditor/themes.js +513 -483
  156. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  157. package/dist/components/pro/CodeEditor/types.d.ts +1 -1
  158. package/dist/components/pro/CodeEditor/utils.js +171 -175
  159. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  160. package/dist/components/pro/DataTable/DataTable.js +305 -306
  161. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  162. package/dist/components/pro/DataTable/Filters.js +299 -314
  163. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  164. package/dist/components/pro/DataTable/PivotPanel.js +203 -204
  165. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  166. package/dist/components/pro/DataTable/PivotView.js +142 -144
  167. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  168. package/dist/components/pro/DataTable/components/BulkActions.js +42 -42
  169. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  170. package/dist/components/pro/DataTable/components/ColumnSelector.js +84 -84
  171. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  172. package/dist/components/pro/DataTable/components/FilterBar.js +58 -58
  173. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  174. package/dist/components/pro/DataTable/components/TableBody.js +93 -94
  175. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  176. package/dist/components/pro/DataTable/components/TableHeader.js +78 -78
  177. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  178. package/dist/components/pro/DataTable/components/TablePagination.js +77 -77
  179. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  180. package/dist/components/pro/DataTable/components/TableToolbar.js +40 -40
  181. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  182. package/dist/components/pro/DataTable/extension.js +5 -5
  183. package/dist/components/pro/DataTable/extension.js.map +1 -1
  184. package/dist/components/pro/DataTable/pivotEngine.js +84 -92
  185. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  186. package/dist/components/pro/DataTable/pivotExtension.js +93 -93
  187. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  188. package/dist/components/pro/DataTable/rowDetailExtension.js +30 -30
  189. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  190. package/dist/components/pro/DataTable/tanstack-table.js +45 -62
  191. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  192. package/dist/components/pro/DataTable/treeDataUtils.js +37 -48
  193. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  194. package/dist/components/pro/DataTable/useColumnDragReorder.js +68 -68
  195. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  196. package/dist/components/pro/DataTable/utils.js +156 -168
  197. package/dist/components/pro/DataTable/utils.js.map +1 -1
  198. package/dist/components/pro/FileExplorer/Breadcrumb.js +180 -180
  199. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  200. package/dist/components/pro/FileExplorer/CreateDialog.js +78 -78
  201. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  202. package/dist/components/pro/FileExplorer/FileExplorer.js +202 -205
  203. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  204. package/dist/components/pro/FileExplorer/FileIcon.js +189 -189
  205. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  206. package/dist/components/pro/FileExplorer/GridView.js +100 -100
  207. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  208. package/dist/components/pro/FileExplorer/ListView.js +209 -209
  209. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  210. package/dist/components/pro/FileExplorer/Toolbar.js +199 -199
  211. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  212. package/dist/components/pro/Flow/Flow.js +920 -948
  213. package/dist/components/pro/Flow/Flow.js.map +1 -1
  214. package/dist/components/pro/Flow/FlowCanvas.js +1626 -1662
  215. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  216. package/dist/components/pro/Flow/archify/build.js +85 -94
  217. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  218. package/dist/components/pro/Flow/archify/convert.js +512 -519
  219. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  220. package/dist/components/pro/Flow/archify/palette.js +87 -104
  221. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  222. package/dist/components/pro/Flow/archify/presets.js +34 -37
  223. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  224. package/dist/components/pro/Flow/archify/spec.js +7 -7
  225. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  226. package/dist/components/pro/Flow/canvas/AlignmentGuides.js +25 -25
  227. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  228. package/dist/components/pro/Flow/canvas/GridRenderer.js +54 -55
  229. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  230. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +54 -58
  231. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  232. package/dist/components/pro/Flow/canvas/PixiApp.js +105 -102
  233. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  234. package/dist/components/pro/Flow/canvas/SelectionOverlay.js +38 -38
  235. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  236. package/dist/components/pro/Flow/canvas/ViewportContainer.js +117 -117
  237. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  238. package/dist/components/pro/Flow/constants.js +266 -278
  239. package/dist/components/pro/Flow/constants.js.map +1 -1
  240. package/dist/components/pro/Flow/context/FlowAIContext.js +27 -28
  241. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  242. package/dist/components/pro/Flow/context/FlowContext.js +60 -61
  243. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  244. package/dist/components/pro/Flow/context/FlowUIContext.js +115 -117
  245. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  246. package/dist/components/pro/Flow/edges/EdgeRenderer.js +135 -138
  247. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  248. package/dist/components/pro/Flow/edges/edgeMarkers.js +11 -14
  249. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  250. package/dist/components/pro/Flow/edges/edgePaths.js +351 -367
  251. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  252. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js +49 -52
  253. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  254. package/dist/components/pro/Flow/hooks/useClipboard.js +154 -154
  255. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  256. package/dist/components/pro/Flow/hooks/useCompactMode.js +17 -17
  257. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  258. package/dist/components/pro/Flow/hooks/useDeleteSelection.js +40 -40
  259. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  260. package/dist/components/pro/Flow/hooks/useDraggablePanel.js +51 -51
  261. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  262. package/dist/components/pro/Flow/hooks/useEdgeMutations.js +157 -157
  263. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  264. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +190 -201
  265. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  266. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js +32 -38
  267. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  268. package/dist/components/pro/Flow/hooks/useLayoutActions.js +172 -180
  269. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  270. package/dist/components/pro/Flow/hooks/useLineMutations.js +57 -57
  271. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  272. package/dist/components/pro/Flow/hooks/useMindMap.js +229 -238
  273. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  274. package/dist/components/pro/Flow/hooks/useNodeMutations.js +102 -102
  275. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  276. package/dist/components/pro/Flow/hooks/usePdfExport.js +55 -56
  277. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  278. package/dist/components/pro/Flow/hooks/usePixiApp.js +55 -57
  279. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  280. package/dist/components/pro/Flow/hooks/useResizablePanel.js +31 -31
  281. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  282. package/dist/components/pro/Flow/hooks/useSelection.js +69 -69
  283. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  284. package/dist/components/pro/Flow/hooks/useUndoRedo.js +27 -27
  285. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  286. package/dist/components/pro/Flow/hooks/useViewport.js +28 -28
  287. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  288. package/dist/components/pro/Flow/lines/FreehandTool.js +63 -63
  289. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  290. package/dist/components/pro/Flow/lines/GeometricLineTool.js +80 -80
  291. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  292. package/dist/components/pro/Flow/lines/LineRenderer.js +88 -88
  293. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  294. package/dist/components/pro/Flow/lines/lineSmoothing.js +32 -34
  295. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  296. package/dist/components/pro/Flow/nodes/DataNodeView.js +236 -242
  297. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  298. package/dist/components/pro/Flow/nodes/MediaContent.js +236 -246
  299. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  300. package/dist/components/pro/Flow/nodes/MediaOverlay.js +63 -63
  301. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  302. package/dist/components/pro/Flow/nodes/Model3DView.js +111 -113
  303. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  304. package/dist/components/pro/Flow/nodes/NodeHandles.js +74 -80
  305. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  306. package/dist/components/pro/Flow/nodes/NodeRenderer.js +303 -314
  307. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  308. package/dist/components/pro/Flow/nodes/NodeText.js +25 -29
  309. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  310. package/dist/components/pro/Flow/nodes/aiClient.js +124 -137
  311. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  312. package/dist/components/pro/Flow/nodes/animAnchors.js +42 -49
  313. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  314. package/dist/components/pro/Flow/nodes/dataUtils.js +246 -267
  315. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  316. package/dist/components/pro/Flow/nodes/nodeUtils.js +23 -28
  317. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  318. package/dist/components/pro/Flow/nodes/shapes.js +556 -589
  319. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  320. package/dist/components/pro/Flow/nodes/svgIconTexture.js +37 -39
  321. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  322. package/dist/components/pro/Flow/nodes/svgIcons.js +684 -689
  323. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  324. package/dist/components/pro/Flow/panels/AIPanel.js +464 -491
  325. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  326. package/dist/components/pro/Flow/panels/Breadcrumb.js +41 -41
  327. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  328. package/dist/components/pro/Flow/panels/ContextMenu.js +37 -37
  329. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  330. package/dist/components/pro/Flow/panels/DataInspectorSection.js +428 -432
  331. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  332. package/dist/components/pro/Flow/panels/ExpandableTextarea.js +61 -62
  333. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  334. package/dist/components/pro/Flow/panels/FlowPanelGroup.js +114 -114
  335. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  336. package/dist/components/pro/Flow/panels/FlowToolbar.js +347 -391
  337. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  338. package/dist/components/pro/Flow/panels/InspectorPanel.js +1792 -1798
  339. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  340. package/dist/components/pro/Flow/panels/OutlinePanel.js +242 -248
  341. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  342. package/dist/components/pro/Flow/panels/PresentationMode.js +137 -140
  343. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  344. package/dist/components/pro/Flow/panels/ProjectTitle.js +46 -46
  345. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  346. package/dist/components/pro/Flow/panels/ShapePalette.js +557 -572
  347. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  348. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +0 -1
  349. package/dist/components/pro/Flow/panels/toolbarIcons.js +508 -557
  350. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  351. package/dist/components/pro/Flow/types.js +26 -26
  352. package/dist/components/pro/Flow/types.js.map +1 -1
  353. package/dist/components/pro/Flow/utils/dashedLine.js +113 -117
  354. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  355. package/dist/components/pro/Flow/utils/gradient.js +55 -55
  356. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  357. package/dist/components/pro/Flow/utils/pdfExport.js +50 -89
  358. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  359. package/dist/components/pro/Flow/utils/themeColor.js +185 -195
  360. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  361. package/dist/components/pro/Gantt/Gantt.d.ts +7 -0
  362. package/dist/components/pro/Gantt/hooks/useGanttDrag.d.ts +31 -0
  363. package/dist/components/pro/Gantt/hooks/useGanttState.d.ts +58 -0
  364. package/dist/components/pro/Gantt/index.d.ts +6 -0
  365. package/dist/components/pro/Gantt/types.d.ts +478 -0
  366. package/dist/components/pro/Gantt/utils.d.ts +124 -0
  367. package/dist/components/pro/Resizable/Resizable.d.ts +30 -0
  368. package/dist/components/pro/Resizable/index.d.ts +2 -0
  369. package/dist/components/pro/RichTextEditor/AIRewrite.js +323 -334
  370. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  371. package/dist/components/pro/RichTextEditor/BlockHandle.js +314 -316
  372. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  373. package/dist/components/pro/RichTextEditor/BubbleToolbar.js +97 -97
  374. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  375. package/dist/components/pro/RichTextEditor/CommentDialog.js +88 -88
  376. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  377. package/dist/components/pro/RichTextEditor/CommentPanel.js +240 -240
  378. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  379. package/dist/components/pro/RichTextEditor/CommentPopover.js +234 -234
  380. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  381. package/dist/components/pro/RichTextEditor/ContextMenu.js +251 -252
  382. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  383. package/dist/components/pro/RichTextEditor/RichTextEditor.js +267 -271
  384. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  385. package/dist/components/pro/RichTextEditor/SlashMenu.js +214 -214
  386. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  387. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -75
  388. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  389. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +261 -261
  390. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  391. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +172 -526
  392. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  393. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js +112 -114
  394. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  395. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +194 -194
  396. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  397. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +970 -973
  398. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  399. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +11 -12
  400. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  401. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +310 -344
  402. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  403. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +38 -39
  404. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  405. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +620 -625
  406. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  407. package/dist/components/pro/RichTextEditor/extensions/FontSize.js +25 -25
  408. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  409. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +167 -176
  410. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  411. package/dist/components/pro/RichTextEditor/types.js +75 -75
  412. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  413. package/dist/contexts/AppContext.d.ts +1 -1
  414. package/dist/contexts/AppContext.js +216 -221
  415. package/dist/contexts/AppContext.js.map +1 -1
  416. package/dist/data-table.js +15 -41
  417. package/dist/data-table.js.map +1 -1
  418. package/dist/dishui.css +1 -1
  419. package/dist/flow.js +27 -83
  420. package/dist/hooks/useClickOutside.js +18 -18
  421. package/dist/hooks/useClickOutside.js.map +1 -1
  422. package/dist/hooks/useContainerElement.js +9 -9
  423. package/dist/hooks/useContainerElement.js.map +1 -1
  424. package/dist/hooks/useControllableState.js +33 -35
  425. package/dist/hooks/useControllableState.js.map +1 -1
  426. package/dist/hooks/useCopyToClipboard.js +16 -16
  427. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  428. package/dist/hooks/useDebounce.js +14 -14
  429. package/dist/hooks/useDebounce.js.map +1 -1
  430. package/dist/hooks/useDraggable.js +50 -50
  431. package/dist/hooks/useDraggable.js.map +1 -1
  432. package/dist/hooks/useTableColumns.js +39 -41
  433. package/dist/hooks/useTableColumns.js.map +1 -1
  434. package/dist/hooks/useTableData.js +67 -68
  435. package/dist/hooks/useTableData.js.map +1 -1
  436. package/dist/index-nostyled.d.ts +8 -0
  437. package/dist/index.d.ts +27 -1
  438. package/dist/index.js +105 -241
  439. package/dist/layouts/MainLayout.js +56 -56
  440. package/dist/layouts/MainLayout.js.map +1 -1
  441. package/dist/layouts/Navbar.js +214 -214
  442. package/dist/layouts/Navbar.js.map +1 -1
  443. package/dist/layouts/Sidebar.js +184 -186
  444. package/dist/layouts/Sidebar.js.map +1 -1
  445. package/dist/layouts/headbar/Headbar.js +25 -25
  446. package/dist/layouts/headbar/Headbar.js.map +1 -1
  447. package/dist/layouts/headbar/HeadbarLangSwitcher.js +39 -39
  448. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  449. package/dist/layouts/headbar/HeadbarSearch.js +120 -120
  450. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  451. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +27 -27
  452. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  453. package/dist/layouts/headbar/HeadbarTitle.js +26 -26
  454. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  455. package/dist/lite.js +9 -24
  456. package/dist/markdown.js +4 -9
  457. package/dist/pages/components/Calendar/index.d.ts +3 -0
  458. package/dist/pages/components/Calendar/index.en.d.ts +3 -0
  459. package/dist/pages/components/Calendar/index.zh.d.ts +3 -0
  460. package/dist/pages/components/Chat/index.d.ts +3 -0
  461. package/dist/pages/components/Chat/index.en.d.ts +3 -0
  462. package/dist/pages/components/Chat/index.zh.d.ts +3 -0
  463. package/dist/pages/components/FloatWindow/index.d.ts +3 -0
  464. package/dist/pages/components/FloatWindow/index.en.d.ts +3 -0
  465. package/dist/pages/components/FloatWindow/index.zh.d.ts +3 -0
  466. package/dist/pages/components/Gantt/index.d.ts +3 -0
  467. package/dist/pages/components/Gantt/index.en.d.ts +3 -0
  468. package/dist/pages/components/Gantt/index.zh.d.ts +3 -0
  469. package/dist/pages/components/GridLayout/index.d.ts +3 -0
  470. package/dist/pages/components/GridLayout/index.en.d.ts +3 -0
  471. package/dist/pages/components/GridLayout/index.zh.d.ts +3 -0
  472. package/dist/pages/components/Notification/index.d.ts +3 -0
  473. package/dist/pages/components/Notification/index.en.d.ts +3 -0
  474. package/dist/pages/components/Notification/index.zh.d.ts +3 -0
  475. package/dist/pages/components/Resizable/index.d.ts +3 -0
  476. package/dist/pages/components/Resizable/index.en.d.ts +3 -0
  477. package/dist/pages/components/Resizable/index.zh.d.ts +3 -0
  478. package/dist/pages/components/Tab/index.d.ts +3 -0
  479. package/dist/pages/components/Tab/index.en.d.ts +3 -0
  480. package/dist/pages/components/Tab/index.zh.d.ts +3 -0
  481. package/dist/styles/themeStyles.js +87 -86
  482. package/dist/styles/themeStyles.js.map +1 -1
  483. package/dist/utils/cn.d.ts +13 -0
  484. package/dist/utils/cn.js +16 -0
  485. package/dist/utils/cn.js.map +1 -0
  486. package/dist/utils/i18n.js +690 -602
  487. package/dist/utils/i18n.js.map +1 -1
  488. package/dist/utils/menu.js +94 -94
  489. package/dist/utils/menu.js.map +1 -1
  490. package/dist/utils/rehype-code-meta.js +14 -14
  491. package/dist/utils/rehype-code-meta.js.map +1 -1
  492. package/dist/utils/remark-code-meta.js +9 -9
  493. package/dist/utils/remark-code-meta.js.map +1 -1
  494. package/dist/utils/routerBuilder.js +59 -60
  495. package/dist/utils/routerBuilder.js.map +1 -1
  496. package/dist/utils/selection.js +28 -29
  497. package/dist/utils/selection.js.map +1 -1
  498. package/dist/utils/themes.js +275 -255
  499. package/dist/utils/themes.js.map +1 -1
  500. package/package.json +19 -6
@@ -1 +1 @@
1
- {"version":3,"file":"AIPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/AIPanel.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport Button from '../../../Button';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Label from '../../../Label';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowAI } from '../context/FlowAIContext';\nimport { completeAIChatStream } from '../nodes/aiClient';\nimport { ROOT_CANVAS_ID, DEFAULT_NODE_DATA, DEFAULT_EDGE_DATA } from '../constants';\nimport type { FlowAIConfig, FlowDocument } from '../types';\n\n/**\n * System prompt that constrains the model to emit a FlowDocument JSON so the\n * result can be parsed and loaded directly onto the canvas.\n */\nconst SYSTEM_PROMPT = `You are a diagramming assistant for a flowchart editor. Convert the user's request (a description, or an uploaded diagram image to reproduce) into a flow document.\n\nReply with ONE fenced \\`\\`\\`json code block and nothing else. The JSON must match:\n{\n \"canvases\": {\n \"root\": {\n \"nodes\": [\n { \"id\": \"n1\", \"type\": \"shapeRoundRect\", \"position\": {\"x\": 80, \"y\": 80}, \"width\": 160, \"height\": 64,\n \"data\": { \"label\": \"Start\" } }\n ],\n \"edges\": [\n { \"id\": \"e1\", \"source\": \"n1\", \"target\": \"n2\", \"type\": \"smoothstep\",\n \"data\": { \"labelText\": \"yes\" } }\n ],\n \"lines\": []\n }\n },\n \"stack\": [\"root\"]\n}\n\nRules:\n- Node \"type\" is one of: shapeRect, shapeRoundRect, shapeEllipse, shapeDiamond, shapeParallelogram, shapeDocument, shapeHexagon. Use shapeDiamond for decisions, shapeRoundRect for processes, shapeEllipse for start/end.\n- Give every node a unique \"id\". Every edge \"source\"/\"target\" must reference an existing node id.\n- Lay nodes out on a readable grid (top-to-bottom or left-to-right), spacing ~180px, no overlaps. Widths ~140-180, heights ~56-72 (diamonds ~120x100).\n- Put a short \"label\" on each node. Optional edge label goes in data.labelText.\n- Do NOT include colors; the editor themes them automatically.\n- Output ONLY the JSON code block.`;\n\n/** Extract and parse the first JSON object from an AI reply. */\nfunction parseFlowJson(text: string): FlowDocument | null {\n let raw = text.trim();\n const fence = /```(?:json)?\\s*([\\s\\S]*?)```/i.exec(raw);\n if (fence) raw = fence[1].trim();\n else {\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n if (start >= 0 && end > start) raw = raw.slice(start, end + 1);\n }\n try {\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || !parsed.canvases) return null;\n return parsed as FlowDocument;\n } catch {\n return null;\n }\n}\n\n/** Normalize an AI-produced document: fill defaults, ensure a root canvas. */\nfunction normalizeAIDocument(doc: FlowDocument): FlowDocument {\n const canvases = doc.canvases ?? {};\n const rootKey = doc.stack?.[doc.stack.length - 1] ?? ROOT_CANVAS_ID;\n const canvas = canvases[rootKey] ?? canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n const nodes = (canvas.nodes ?? []).map((n: any, i: number) => ({\n id: n.id ?? `n${i + 1}`,\n type: n.type ?? 'shapeRoundRect',\n position: { x: Number(n.position?.x ?? 80), y: Number(n.position?.y ?? 80 + i * 120) },\n width: Number(n.width ?? 160),\n height: Number(n.height ?? 64),\n zIndex: n.zIndex ?? i,\n data: { ...DEFAULT_NODE_DATA, ...(n.data ?? {}), label: n.data?.label ?? n.label ?? 'Node' },\n }));\n const nodeById = new Map<string, any>(nodes.map((n) => [n.id, n]));\n const edges = (canvas.edges ?? []).map((e: any, i: number) => ({\n id: e.id ?? `e${i + 1}`,\n source: e.source,\n target: e.target,\n type: e.type ?? 'smoothstep',\n data: { ...DEFAULT_EDGE_DATA, ...(e.data ?? {}) },\n })).filter((e: any) => e.source && e.target)\n .map((e: any) => pinEdgeToSideMidpoints(e, nodeById));\n return {\n canvases: { [ROOT_CANVAS_ID]: { nodes, edges, lines: [] } },\n stack: [ROOT_CANVAS_ID],\n };\n}\n\n/**\n * Pin an AI-generated edge to the midpoint handles of the facing node sides\n * (`r_0.5` / `l_0.5` / `t_0.5` / `b_0.5`) so connections attach at the center\n * of each side instead of sliding along the side toward the other node.\n */\nfunction pinEdgeToSideMidpoints(edge: any, nodeById: Map<string, any>): any {\n const s = nodeById.get(edge.source);\n const t = nodeById.get(edge.target);\n if (!s || !t || s === t) return edge;\n const dx = (t.position.x + t.width / 2) - (s.position.x + s.width / 2);\n const dy = (t.position.y + t.height / 2) - (s.position.y + s.height / 2);\n if (Math.abs(dx) >= Math.abs(dy)) {\n const forward = dx >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'r_0.5' : 'l_0.5',\n targetHandle: forward ? 'l_0.5' : 'r_0.5',\n };\n }\n const forward = dy >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'b_0.5' : 't_0.5',\n targetHandle: forward ? 't_0.5' : 'b_0.5',\n };\n}\n\nconst PROTOCOL_OPTIONS = [\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic' },\n];\n\n/** Char count at which the simulated progress bar saturates (99%). */\nconst PROGRESS_FULL_CHARS = 20000;\n\nexport function AIPanelContent() {\n const { setDoc } = useFlowContext();\n const { aiConfig, setAIConfig, showAIConfig } = useFlowAI();\n\n const [prompt, setPrompt] = useState('');\n const [imageDataUrl, setImageDataUrl] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [streamOpen, setStreamOpen] = useState(false);\n const [finished, setFinished] = useState(false);\n const [pendingDoc, setPendingDoc] = useState<FlowDocument | null>(null);\n const [displayLen, setDisplayLen] = useState(0);\n const abortRef = useRef<AbortController | null>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const streamBodyRef = useRef<HTMLPreElement>(null);\n const streamTailRef = useRef<HTMLPreElement>(null);\n /** Full text received from the model so far (grows on every SSE delta). */\n const targetRef = useRef('');\n\n const updateConfig = useCallback((patch: Partial<FlowAIConfig>) => {\n setAIConfig({ ...aiConfig, ...patch });\n }, [aiConfig, setAIConfig]);\n\n const onPickImage = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n // Accept an image pasted from the clipboard (Ctrl/Cmd+V) anywhere in the panel\n // or into the textarea. Falls through to normal text paste otherwise.\n const onPaste = useCallback((e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n for (const item of items) {\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) {\n e.preventDefault();\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n return;\n }\n }\n }\n }, []);\n\n // Progressive reveal: SSE deltas land in `targetRef` (often several chunks\n // per network read, which React would batch into a single paint), and this\n // timer types the text out with an exponential catch-up so the panel always\n // shows the reply growing character-by-character.\n useEffect(() => {\n const timer = window.setInterval(() => {\n setDisplayLen((len) => {\n const target = targetRef.current.length;\n if (len >= target) return len;\n return len + Math.max(8, Math.ceil((target - len) / 8));\n });\n }, 40);\n return () => window.clearInterval(timer);\n }, []);\n\n const streamText = targetRef.current.slice(0, displayLen);\n\n // Keep the streaming output pinned to the latest chunk while visible.\n useEffect(() => {\n const el = streamBodyRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n const tail = streamTailRef.current;\n if (tail) tail.scrollTop = tail.scrollHeight;\n }, [streamText, streamOpen]);\n\n const generate = useCallback(async () => {\n if (busy) return;\n if (!aiConfig.gateway || !aiConfig.model) {\n setError('请先配置 AI 接口地址与模型');\n return;\n }\n if (!prompt.trim() && !imageDataUrl) {\n setError('请输入需求描述,或上传一张流程图');\n return;\n }\n setError(null);\n setStatus('正在生成…');\n targetRef.current = '';\n setDisplayLen(0);\n setFinished(false);\n setPendingDoc(null);\n setBusy(true);\n const ac = new AbortController();\n abortRef.current = ac;\n try {\n const text = await completeAIChatStream(\n aiConfig,\n prompt.trim() || '请根据这张图片复刻出对应的流程图。',\n {\n imageDataUrl: imageDataUrl ?? undefined,\n systemPrompt: SYSTEM_PROMPT,\n signal: ac.signal,\n onDelta: (accumulated) => { targetRef.current = accumulated; },\n },\n );\n setFinished(true);\n const parsed = parseFlowJson(text);\n if (!parsed) {\n setError('AI 返回内容无法解析为流程图,请重试或调整描述');\n setStatus(null);\n return;\n }\n setPendingDoc(normalizeAIDocument(parsed));\n setStatus(null);\n } catch (err: any) {\n if (err?.name !== 'AbortError') setError(err?.message ?? '生成失败');\n setStatus(null);\n } finally {\n setBusy(false);\n abortRef.current = null;\n }\n }, [busy, aiConfig, prompt, imageDataUrl]);\n\n const cancel = useCallback(() => abortRef.current?.abort(), []);\n\n /** Merge the generated canvas into the current canvas, remapping ids. */\n const applyInsert = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n const cur = prev.canvases[canvasId] ?? { nodes: [], edges: [], lines: [] };\n const used = new Set([\n ...cur.nodes.map((n) => n.id),\n ...cur.edges.map((e) => e.id),\n ...cur.lines.map((l) => l.id),\n ]);\n const fresh = (id: string) => {\n let next = id;\n let i = 1;\n while (used.has(next)) next = `${id}_${i++}`;\n used.add(next);\n return next;\n };\n const idMap = new Map<string, string>();\n const nodes = gen.nodes.map((n) => {\n const id = fresh(n.id);\n idMap.set(n.id, id);\n return { ...n, id };\n });\n const edges = gen.edges.map((e) => ({\n ...e,\n id: fresh(e.id),\n source: idMap.get(e.source) ?? e.source,\n target: idMap.get(e.target) ?? e.target,\n }));\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: [...cur.nodes, ...nodes], edges: [...cur.edges, ...edges], lines: cur.lines },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已插入流程图');\n }, [pendingDoc, setDoc]);\n\n /** Clear the current canvas, then place the generated content onto it. */\n const applyReplace = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: gen.nodes, edges: gen.edges, lines: [] },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已替换画布');\n }, [pendingDoc, setDoc]);\n\n const charCount = streamText.length;\n const fullyRevealed = charCount >= targetRef.current.length;\n const progress = finished && fullyRevealed\n ? 100\n : Math.min(99, Math.floor((charCount / PROGRESS_FULL_CHARS) * 99));\n\n return (\n <div className=\"flow-ai-panel\" onPaste={onPaste}>\n {showAIConfig && (\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">模型配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={PROTOCOL_OPTIONS}\n value={aiConfig.protocol}\n onChange={(v) => updateConfig({ protocol: v as FlowAIConfig['protocol'] })}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={aiConfig.gateway}\n placeholder=\"https://api.moonshot.cn/v1\"\n onChange={(e) => updateConfig({ gateway: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={aiConfig.model}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateConfig({ model: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={aiConfig.apiKey ?? ''}\n placeholder=\"sk-…\"\n onChange={(e) => updateConfig({ apiKey: e.target.value })}\n />\n </div>\n </div>\n )}\n\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">生成流程图</div>\n <textarea\n className=\"flow-ai-textarea\"\n value={prompt}\n placeholder=\"描述你想要的流程,例如:用户注册流程,包含邮箱校验、发送验证码、创建账号等步骤(可直接粘贴图片)\"\n onChange={(e) => setPrompt(e.target.value)}\n onPaste={onPaste}\n onPointerDown={(e) => e.stopPropagation()}\n />\n\n <div className=\"flow-ai-image-row\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={onPickImage}\n />\n {imageDataUrl ? (\n <div className=\"flow-ai-image-preview\">\n <img src={imageDataUrl} alt=\"参考图\" />\n <button\n type=\"button\"\n className=\"flow-ai-image-remove\"\n title=\"移除图片\"\n onClick={() => setImageDataUrl(null)}\n >×</button>\n </div>\n ) : (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => fileRef.current?.click()}>\n 上传流程图图片\n </Button>\n )}\n <span className=\"flow-ai-hint\">或粘贴图片 (Ctrl/⌘+V)</span>\n </div>\n\n <div className=\"flow-ai-actions\">\n {busy ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={cancel}>停止</Button>\n ) : (\n <Button size=\"xs\" variant=\"primary\" onClick={generate}>生成流程图</Button>\n )}\n </div>\n\n {(busy || streamText) && (\n <div className=\"flow-ai-stream\">\n <div className=\"flow-ai-progress\">\n <div className=\"flow-ai-progress-track\">\n <div className=\"flow-ai-progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <span className=\"flow-ai-progress-label\">{progress}%</span>\n </div>\n <button\n type=\"button\"\n className=\"flow-ai-stream-header\"\n onClick={() => setStreamOpen((open) => !open)}\n >\n <span className={`flow-ai-stream-chevron${streamOpen ? ' flow-ai-stream-chevron--open' : ''}`}>▸</span>\n <span>返回内容</span>\n <span className=\"flow-ai-stream-count\">{charCount.toLocaleString()} 字符</span>\n </button>\n {streamOpen ? (\n <pre ref={streamBodyRef} className=\"flow-ai-stream-body\">{streamText || '等待返回…'}</pre>\n ) : (\n streamText && <pre ref={streamTailRef} className=\"flow-ai-stream-tail\">{streamText}</pre>\n )}\n </div>\n )}\n\n {status && !error && <div className=\"flow-ai-status\">{status}</div>}\n {error && <div className=\"flow-media-error\">{error}</div>}\n </div>\n\n {pendingDoc && (\n <div className=\"flow-ai-dialog-overlay\" onClick={() => setPendingDoc(null)}>\n <div\n className=\"flow-ai-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"流程图已生成\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flow-ai-dialog-title\">流程图已生成</div>\n <div className=\"flow-ai-dialog-desc\">\n 插入:将生成内容追加到当前画布;替换:清空当前画布后再插入。\n </div>\n <div className=\"flow-ai-dialog-actions\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setPendingDoc(null)}>取消</Button>\n <Button size=\"xs\" variant=\"neutral\" outline onClick={applyInsert}>插入</Button>\n <Button size=\"xs\" variant=\"primary\" onClick={applyReplace}>替换</Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAM,KAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BtB,SAAS,GAAc,GAAmC;AACxD,MAAI,IAAM,EAAK,KAAK;AACpB,QAAM,IAAQ,gCAAgC,KAAK,CAAG;AACtD,MAAI,EAAO,CAAA,IAAM,EAAM,CAAA,EAAG,KAAK;AAAA,OAC1B;AACH,UAAM,IAAQ,EAAI,QAAQ,GAAG,GACvB,IAAM,EAAI,YAAY,GAAG;AAC/B,IAAI,KAAS,KAAK,IAAM,MAAO,IAAM,EAAI,MAAM,GAAO,IAAM,CAAC;AAAA,EAC/D;AACA,MAAI;AACF,UAAM,IAAS,KAAK,MAAM,CAAG;AAC7B,WAAI,CAAC,KAAU,OAAO,KAAW,YAAY,CAAC,EAAO,WAAiB,OAC/D;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,GAAoB,GAAiC;AAC5D,QAAM,IAAW,EAAI,YAAY,CAAC,GAE5B,IAAS,EADC,EAAI,QAAQ,EAAI,MAAM,SAAS,CAAA,KAAA,MAAA,KACX,EAAA,QAA4B;AAAA,IAAE,OAAO,CAAC;AAAA,IAAG,OAAO,CAAC;AAAA,IAAG,OAAO,CAAC;AAAA,EAAE,GAC5F,KAAS,EAAO,SAAS,CAAC,GAAG,IAAA,CAAK,GAAQ,OAAe;AAAA,IAC7D,IAAI,EAAE,MAAM,IAAI,IAAI,CAAA;AAAA,IACpB,MAAM,EAAE,QAAQ;AAAA,IAChB,UAAU;AAAA,MAAE,GAAG,OAAO,EAAE,UAAU,KAAK,EAAE;AAAA,MAAG,GAAG,OAAO,EAAE,UAAU,KAAK,KAAK,IAAI,GAAG;AAAA,IAAE;AAAA,IACrF,OAAO,OAAO,EAAE,SAAS,GAAG;AAAA,IAC5B,QAAQ,OAAO,EAAE,UAAU,EAAE;AAAA,IAC7B,QAAQ,EAAE,UAAU;AAAA,IACpB,MAAM;AAAA,MAAE,GAAG;AAAA,MAAmB,GAAI,EAAE,QAAQ,CAAC;AAAA,MAAI,OAAO,EAAE,MAAM,SAAS,EAAE,SAAS;AAAA,IAAO;AAAA,EAC7F,EAAE,GACI,IAAW,IAAI,IAAiB,EAAM,IAAA,CAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAC3D,KAAS,EAAO,SAAS,CAAC,GAAG,IAAA,CAAK,GAAQ,OAAe;AAAA,IAC7D,IAAI,EAAE,MAAM,IAAI,IAAI,CAAA;AAAA,IACpB,QAAQ,EAAE;AAAA,IACV,QAAQ,EAAE;AAAA,IACV,MAAM,EAAE,QAAQ;AAAA,IAChB,MAAM;AAAA,MAAE,GAAG;AAAA,MAAmB,GAAI,EAAE,QAAQ,CAAC;AAAA,IAAG;AAAA,EAClD,EAAE,EAAE,OAAA,CAAQ,MAAW,EAAE,UAAU,EAAE,MAAM,EACxC,IAAA,CAAK,MAAW,GAAuB,GAAG,CAAQ,CAAC;AACtD,SAAO;AAAA,IACL,UAAU,EAAA,CAAG,CAAA,GAAiB;AAAA,MAAE,OAAA;AAAA,MAAO,OAAA;AAAA,MAAO,OAAO,CAAC;AAAA,IAAE,EAAE;AAAA,IAC1D,OAAO,CAAC,CAAc;AAAA,EACxB;AACF;AAOA,SAAS,GAAuB,GAAW,GAAiC;AAC1E,QAAM,IAAI,EAAS,IAAI,EAAK,MAAM,GAC5B,IAAI,EAAS,IAAI,EAAK,MAAM;AAClC,MAAI,CAAC,KAAK,CAAC,KAAK,MAAM,EAAG,QAAO;AAChC,QAAM,IAAM,EAAE,SAAS,IAAI,EAAE,QAAQ,KAAM,EAAE,SAAS,IAAI,EAAE,QAAQ,IAC9D,IAAM,EAAE,SAAS,IAAI,EAAE,SAAS,KAAM,EAAE,SAAS,IAAI,EAAE,SAAS;AACtE,MAAI,KAAK,IAAI,CAAE,KAAK,KAAK,IAAI,CAAE,GAAG;AAChC,UAAM,IAAU,KAAM;AACtB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,cAAc,IAAU,UAAU;AAAA,MAClC,cAAc,IAAU,UAAU;AAAA,IACpC;AAAA,EACF;AACA,QAAM,IAAU,KAAM;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,IAAU,UAAU;AAAA,IAClC,cAAc,IAAU,UAAU;AAAA,EACpC;AACF;AAEA,IAAM,KAAmB,CACvB;AAAA,EAAE,OAAO;AAAA,EAAU,OAAO;AAAY,GACtC;AAAA,EAAE,OAAO;AAAA,EAAa,OAAO;AAAY,CAC3C,GAGM,KAAsB;AAE5B,SAAgB,KAAiB;AAC/B,QAAM,EAAE,QAAA,EAAA,IAAW,GAAe,GAC5B,EAAE,UAAA,GAAU,aAAA,GAAa,cAAA,EAAA,IAAiB,GAAU,GAEpD,CAAC,GAAQ,CAAA,IAAa,EAAS,EAAE,GACjC,CAAC,GAAc,CAAA,IAAmB,EAAwB,IAAI,GAC9D,CAAC,GAAM,CAAA,IAAW,EAAS,EAAK,GAChC,CAAC,GAAO,CAAA,IAAY,EAAwB,IAAI,GAChD,CAAC,GAAQ,CAAA,IAAa,EAAwB,IAAI,GAClD,CAAC,GAAY,CAAA,IAAiB,EAAS,EAAK,GAC5C,CAAC,GAAU,CAAA,IAAe,EAAS,EAAK,GACxC,CAAC,GAAY,CAAA,IAAiB,EAA8B,IAAI,GAChE,CAAC,GAAY,CAAA,IAAiB,EAAS,CAAC,GACxC,IAAW,EAA+B,IAAI,GAC9C,IAAU,EAAyB,IAAI,GACvC,IAAgB,EAAuB,IAAI,GAC3C,IAAgB,EAAuB,IAAI,GAE3C,IAAY,EAAO,EAAE,GAErB,IAAe,EAAA,CAAa,MAAiC;AACjE,IAAA,EAAY;AAAA,MAAE,GAAG;AAAA,MAAU,GAAG;AAAA,IAAM,CAAC;AAAA,EACvC,GAAG,CAAC,GAAU,CAAW,CAAC,GAEpB,IAAc,EAAA,CAAa,MAA2C;AAC1E,UAAM,IAAO,EAAE,OAAO,QAAQ,CAAA;AAE9B,QADA,EAAE,OAAO,QAAQ,IACb,CAAC,EAAM;AACX,UAAM,IAAS,IAAI,WAAW;AAC9B,IAAA,EAAO,SAAA,MAAe,EAAgB,EAAO,MAAgB,GAC7D,EAAO,cAAc,CAAI;AAAA,EAC3B,GAAG,CAAC,CAAC,GAIC,IAAU,EAAA,CAAa,MAA4B;AACvD,UAAM,IAAQ,EAAE,eAAe;AAC/B,QAAK;AACL,iBAAW,KAAQ,EACjB,KAAI,EAAK,KAAK,WAAW,QAAQ,GAAG;AAClC,cAAM,IAAO,EAAK,UAAU;AAC5B,YAAI,GAAM;AACR,YAAE,eAAe;AACjB,gBAAM,IAAS,IAAI,WAAW;AAC9B,UAAA,EAAO,SAAA,MAAe,EAAgB,EAAO,MAAgB,GAC7D,EAAO,cAAc,CAAI;AACzB;AAAA,QACF;AAAA,MACF;AAAA;AAAA,EAEJ,GAAG,CAAC,CAAC;AAML,EAAA,EAAA,MAAgB;AACd,UAAM,IAAQ,OAAO,YAAA,MAAkB;AACrC,MAAA,EAAA,CAAe,MAAQ;AACrB,cAAM,IAAS,EAAU,QAAQ;AACjC,eAAI,KAAO,IAAe,IACnB,IAAM,KAAK,IAAI,GAAG,KAAK,MAAM,IAAS,KAAO,CAAC,CAAC;AAAA,MACxD,CAAC;AAAA,IACH,GAAG,EAAE;AACL,WAAA,MAAa,OAAO,cAAc,CAAK;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,IAAa,EAAU,QAAQ,MAAM,GAAG,CAAU;AAGxD,EAAA,EAAA,MAAgB;AACd,UAAM,IAAK,EAAc;AACzB,IAAI,MAAI,EAAG,YAAY,EAAG;AAC1B,UAAM,IAAO,EAAc;AAC3B,IAAI,MAAM,EAAK,YAAY,EAAK;AAAA,EAClC,GAAG,CAAC,GAAY,CAAU,CAAC;AAE3B,QAAM,IAAW,EAAY,YAAY;AACvC,QAAI,EAAM;AACV,QAAI,CAAC,EAAS,WAAW,CAAC,EAAS,OAAO;AACxC,MAAA,EAAS,iBAAiB;AAC1B;AAAA,IACF;AACA,QAAI,CAAC,EAAO,KAAK,KAAK,CAAC,GAAc;AACnC,MAAA,EAAS,kBAAkB;AAC3B;AAAA,IACF;AACA,IAAA,EAAS,IAAI,GACb,EAAU,OAAO,GACjB,EAAU,UAAU,IACpB,EAAc,CAAC,GACf,EAAY,EAAK,GACjB,EAAc,IAAI,GAClB,EAAQ,EAAI;AACZ,UAAM,IAAK,IAAI,gBAAgB;AAC/B,IAAA,EAAS,UAAU;AACnB,QAAI;AACF,YAAM,IAAO,MAAM,GACjB,GACA,EAAO,KAAK,KAAK,qBACjB;AAAA,QACE,cAAc,KAAgB;AAAA,QAC9B,cAAc;AAAA,QACd,QAAQ,EAAG;AAAA,QACX,SAAA,CAAU,MAAgB;AAAE,UAAA,EAAU,UAAU;AAAA,QAAa;AAAA,MAC/D,CACF;AACA,MAAA,EAAY,EAAI;AAChB,YAAM,IAAS,GAAc,CAAI;AACjC,UAAI,CAAC,GAAQ;AACX,QAAA,EAAS,0BAA0B,GACnC,EAAU,IAAI;AACd;AAAA,MACF;AACA,MAAA,EAAc,GAAoB,CAAM,CAAC,GACzC,EAAU,IAAI;AAAA,IAChB,SAAS,GAAU;AACjB,MAAI,GAAK,SAAS,gBAAc,EAAS,GAAK,WAAW,MAAM,GAC/D,EAAU,IAAI;AAAA,IAChB,UAAA;AACE,MAAA,EAAQ,EAAK,GACb,EAAS,UAAU;AAAA,IACrB;AAAA,EACF,GAAG;AAAA,IAAC;AAAA,IAAM;AAAA,IAAU;AAAA,IAAQ;AAAA,EAAY,CAAC,GAEnC,IAAS,EAAA,MAAkB,EAAS,SAAS,MAAM,GAAG,CAAC,CAAC,GAGxD,KAAc,EAAA,MAAkB;AACpC,QAAI,CAAC,EAAY;AACjB,UAAM,IAAM,EAAW,SAAA,QAA4B;AAAA,MAAE,OAAO,CAAC;AAAA,MAAG,OAAO,CAAC;AAAA,MAAG,OAAO,CAAC;AAAA,IAAE;AACrF,IAAA,EAAA,CAAQ,MAAS;AACf,YAAM,IAAW,EAAK,MAAM,EAAK,MAAM,SAAS,CAAA,KAAA,QAC1C,IAAM,EAAK,SAAS,CAAA,KAAa;AAAA,QAAE,OAAO,CAAC;AAAA,QAAG,OAAO,CAAC;AAAA,QAAG,OAAO,CAAC;AAAA,MAAE,GACnE,IAAO,oBAAI,IAAI;AAAA,QACnB,GAAG,EAAI,MAAM,IAAA,CAAK,MAAM,EAAE,EAAE;AAAA,QAC5B,GAAG,EAAI,MAAM,IAAA,CAAK,MAAM,EAAE,EAAE;AAAA,QAC5B,GAAG,EAAI,MAAM,IAAA,CAAK,MAAM,EAAE,EAAE;AAAA,MAC9B,CAAC,GACK,IAAA,CAAS,MAAe;AAC5B,YAAI,IAAO,GACP,KAAI;AACR,eAAO,EAAK,IAAI,CAAI,IAAG,CAAA,IAAO,GAAG,CAAA,IAAM,IAAA;AACvC,eAAA,EAAK,IAAI,CAAI,GACN;AAAA,MACT,GACM,IAAQ,oBAAI,IAAoB,GAChC,KAAQ,EAAI,MAAM,IAAA,CAAK,MAAM;AACjC,cAAM,IAAK,EAAM,EAAE,EAAE;AACrB,eAAA,EAAM,IAAI,EAAE,IAAI,CAAE,GACX;AAAA,UAAE,GAAG;AAAA,UAAG,IAAA;AAAA,QAAG;AAAA,MACpB,CAAC,GACK,KAAQ,EAAI,MAAM,IAAA,CAAK,OAAO;AAAA,QAClC,GAAG;AAAA,QACH,IAAI,EAAM,EAAE,EAAE;AAAA,QACd,QAAQ,EAAM,IAAI,EAAE,MAAM,KAAK,EAAE;AAAA,QACjC,QAAQ,EAAM,IAAI,EAAE,MAAM,KAAK,EAAE;AAAA,MACnC,EAAE;AACF,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,EAAK;AAAA,UACP,CAAA,CAAA,GAAW;AAAA,YAAE,OAAO,CAAC,GAAG,EAAI,OAAO,GAAG,EAAK;AAAA,YAAG,OAAO,CAAC,GAAG,EAAI,OAAO,GAAG,EAAK;AAAA,YAAG,OAAO,EAAI;AAAA,UAAM;AAAA,QACnG;AAAA,MACF;AAAA,IACF,CAAC,GACD,EAAc,IAAI,GAClB,EAAU,QAAQ;AAAA,EACpB,GAAG,CAAC,GAAY,CAAM,CAAC,GAGjB,KAAe,EAAA,MAAkB;AACrC,QAAI,CAAC,EAAY;AACjB,UAAM,IAAM,EAAW,SAAA,QAA4B;AAAA,MAAE,OAAO,CAAC;AAAA,MAAG,OAAO,CAAC;AAAA,MAAG,OAAO,CAAC;AAAA,IAAE;AACrF,IAAA,EAAA,CAAQ,MAAS;AACf,YAAM,IAAW,EAAK,MAAM,EAAK,MAAM,SAAS,CAAA,KAAA;AAChD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,EAAK;AAAA,UACP,CAAA,CAAA,GAAW;AAAA,YAAE,OAAO,EAAI;AAAA,YAAO,OAAO,EAAI;AAAA,YAAO,OAAO,CAAC;AAAA,UAAE;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,CAAC,GACD,EAAc,IAAI,GAClB,EAAU,OAAO;AAAA,EACnB,GAAG,CAAC,GAAY,CAAM,CAAC,GAEjB,IAAY,EAAW,QACvB,KAAgB,KAAa,EAAU,QAAQ,QAC/C,IAAW,KAAY,KACzB,MACA,KAAK,IAAI,IAAI,KAAK,MAAO,IAAY,KAAuB,EAAE,CAAC;AAEnE,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAyB,SAAA;AAAA,IAAxC,UAAA;AAAA,MACG,KACC,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UACE,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAwB,UAAA;AAAA,UAAS,CAAA;AAAA,UAChD,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,cAAO,MAAK;AAAA,cAAK,WAAU;AAAA,cAAuB,UAAA;AAAA,YAAS,CAAA,GAC3D,gBAAA,EAAC,IAAD;AAAA,cACE,SAAS;AAAA,cACT,OAAO,EAAS;AAAA,cAChB,UAAA,CAAW,MAAM,EAAa,EAAE,UAAU,EAA8B,CAAC;AAAA,cACzE,OAAO,EAAE,UAAU,GAAG;AAAA,YACvB,CAAA,CACE;AAAA;UACL,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,cAAO,MAAK;AAAA,cAAK,WAAU;AAAA,cAAuB,UAAA;AAAA,YAAW,CAAA,GAC7D,gBAAA,EAAC,GAAD;AAAA,cACE,MAAK;AAAA,cACL,OAAO,EAAS;AAAA,cAChB,aAAY;AAAA,cACZ,UAAA,CAAW,MAAM,EAAa,EAAE,SAAS,EAAE,OAAO,MAAM,CAAC;AAAA,YAC1D,CAAA,CACE;AAAA;UACL,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,cAAO,MAAK;AAAA,cAAK,WAAU;AAAA,cAAuB,UAAA;AAAA,YAAS,CAAA,GAC3D,gBAAA,EAAC,GAAD;AAAA,cACE,MAAK;AAAA,cACL,OAAO,EAAS;AAAA,cAChB,aAAY;AAAA,cACZ,UAAA,CAAW,MAAM,EAAa,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,YACxD,CAAA,CACE;AAAA;UACL,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,cAAO,MAAK;AAAA,cAAK,WAAU;AAAA,cAAuB,UAAA;AAAA,YAAc,CAAA,GAChE,gBAAA,EAAC,GAAD;AAAA,cACE,MAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO,EAAS,UAAU;AAAA,cAC1B,aAAY;AAAA,cACZ,UAAA,CAAW,MAAM,EAAa,EAAE,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,YACzD,CAAA,CACE;AAAA;QACF;AAAA;MAGP,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UACE,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAwB,UAAA;AAAA,UAAU,CAAA;AAAA,UACjD,gBAAA,EAAC,YAAD;AAAA,YACE,WAAU;AAAA,YACV,OAAO;AAAA,YACP,aAAY;AAAA,YACZ,UAAA,CAAW,MAAM,EAAU,EAAE,OAAO,KAAK;AAAA,YAChC,SAAA;AAAA,YACT,eAAA,CAAgB,MAAM,EAAE,gBAAgB;AAAA,UACzC,CAAA;AAAA,UAED,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA;AAAA,cACE,gBAAA,EAAC,SAAD;AAAA,gBACE,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,OAAO,EAAE,SAAS,OAAO;AAAA,gBACzB,UAAU;AAAA,cACX,CAAA;AAAA,cACA,IACC,gBAAA,EAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,kBAAK,KAAK;AAAA,kBAAc,KAAI;AAAA,gBAAO,CAAA,GACnC,gBAAA,EAAC,UAAD;AAAA,kBACE,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAM;AAAA,kBACN,SAAA,MAAe,EAAgB,IAAI;AAAA,kBACpC,UAAA;AAAA,gBAAS,CAAA,CACP;AAAA,cAEL,CAAA,IAAA,gBAAA,EAAC,GAAD;AAAA,gBAAQ,MAAK;AAAA,gBAAK,SAAQ;AAAA,gBAAQ,SAAA,MAAe,EAAQ,SAAS,MAAM;AAAA,gBAAG,UAAA;AAAA,cAEnE,CAAA;AAAA,cAEV,gBAAA,EAAC,QAAD;AAAA,gBAAM,WAAU;AAAA,gBAAe,UAAA;AAAA,cAAsB,CAAA;AAAA,YAClD;AAAA;UAEL,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YACZ,UAAA,IACC,gBAAA,EAAC,GAAD;AAAA,cAAQ,MAAK;AAAA,cAAK,SAAQ;AAAA,cAAQ,SAAS;AAAA,cAAQ,UAAA;AAAA,YAAU,CAAA,IAE7D,gBAAA,EAAC,GAAD;AAAA,cAAQ,MAAK;AAAA,cAAK,SAAQ;AAAA,cAAU,SAAS;AAAA,cAAU,UAAA;AAAA,YAAa,CAAA;AAAA,UAEnE,CAAA;AAAA,WAEH,KAAQ,MACR,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA;AAAA,cACE,gBAAA,EAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAAA,CACE,gBAAA,EAAC,OAAD;AAAA,kBAAK,WAAU;AAAA,kBACb,UAAA,gBAAA,EAAC,OAAD;AAAA,oBAAK,WAAU;AAAA,oBAAuB,OAAO,EAAE,OAAO,GAAG,CAAA,IAAY;AAAA,kBAAI,CAAA;AAAA,gBACtE,CAAA,GACL,gBAAA,EAAC,QAAD;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAAA,CAA0C,GAAS,GAAO;AAAA,gBACvD,CAAA,CAAA;AAAA;cACL,gBAAA,EAAC,UAAD;AAAA,gBACE,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAA,MAAe,EAAA,CAAe,MAAS,CAAC,CAAI;AAAA,gBAH9C,UAAA;AAAA,kBAKE,gBAAA,EAAC,QAAD;AAAA,oBAAM,WAAW,yBAAyB,IAAa,kCAAkC,EAAA;AAAA,oBAAM,UAAA;AAAA,kBAAO,CAAA;AAAA,kBACtG,gBAAA,EAAC,QAAD,EAAA,UAAM,OAAU,CAAA;AAAA,kBAChB,gBAAA,EAAC,QAAD;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAAA,CAAwC,EAAU,eAAe,GAAE,KAAS;AAAA;gBACtE;AAAA;cACP,IACC,gBAAA,EAAC,OAAD;AAAA,gBAAK,KAAK;AAAA,gBAAe,WAAU;AAAA,gBAAuB,UAAA,KAAc;AAAA,cAAa,CAAA,IAErF,KAAc,gBAAA,EAAC,OAAD;AAAA,gBAAK,KAAK;AAAA,gBAAe,WAAU;AAAA,gBAAuB,UAAA;AAAA,cAAgB,CAAA;AAAA,YAEvF;AAAA;UAGN,KAAU,CAAC,KAAS,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAkB,UAAA;AAAA,UAAY,CAAA;AAAA,UACjE,KAAS,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAoB,UAAA;AAAA,UAAW,CAAA;AAAA,QACrD;AAAA;MAEJ,KACC,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAyB,SAAA,MAAe,EAAc,IAAI;AAAA,QACvE,UAAA,gBAAA,EAAC,OAAD;AAAA,UACE,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,cAAW;AAAA,UACX,SAAA,CAAU,MAAM,EAAE,gBAAgB;AAAA,UALpC,UAAA;AAAA,YAOE,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAU;AAAA,cAAuB,UAAA;AAAA,YAAW,CAAA;AAAA,YACjD,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAU;AAAA,cAAsB,UAAA;AAAA,YAEhC,CAAA;AAAA,YACL,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAU;AAAA,cAAf,UAAA;AAAA,gBACE,gBAAA,EAAC,GAAD;AAAA,kBAAQ,MAAK;AAAA,kBAAK,SAAQ;AAAA,kBAAQ,SAAA,MAAe,EAAc,IAAI;AAAA,kBAAG,UAAA;AAAA,gBAAU,CAAA;AAAA,gBAChF,gBAAA,EAAC,GAAD;AAAA,kBAAQ,MAAK;AAAA,kBAAK,SAAQ;AAAA,kBAAU,SAAA;AAAA,kBAAQ,SAAS;AAAA,kBAAa,UAAA;AAAA,gBAAU,CAAA;AAAA,gBAC5E,gBAAA,EAAC,GAAD;AAAA,kBAAQ,MAAK;AAAA,kBAAK,SAAQ;AAAA,kBAAU,SAAS;AAAA,kBAAc,UAAA;AAAA,gBAAU,CAAA;AAAA,cAClE;AAAA;UACF;AAAA;MACF,CAAA;AAAA,IAEJ;AAAA;AAET"}
1
+ {"version":3,"file":"AIPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/AIPanel.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport Button from '../../../Button';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Label from '../../../Label';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowAI } from '../context/FlowAIContext';\nimport { completeAIChatStream } from '../nodes/aiClient';\nimport { ROOT_CANVAS_ID, DEFAULT_NODE_DATA, DEFAULT_EDGE_DATA } from '../constants';\nimport type { FlowAIConfig, FlowDocument } from '../types';\n\n/**\n * System prompt that constrains the model to emit a FlowDocument JSON so the\n * result can be parsed and loaded directly onto the canvas.\n */\nconst SYSTEM_PROMPT = `You are a diagramming assistant for a flowchart editor. Convert the user's request (a description, or an uploaded diagram image to reproduce) into a flow document.\n\nReply with ONE fenced \\`\\`\\`json code block and nothing else. The JSON must match:\n{\n \"canvases\": {\n \"root\": {\n \"nodes\": [\n { \"id\": \"n1\", \"type\": \"shapeRoundRect\", \"position\": {\"x\": 80, \"y\": 80}, \"width\": 160, \"height\": 64,\n \"data\": { \"label\": \"Start\" } }\n ],\n \"edges\": [\n { \"id\": \"e1\", \"source\": \"n1\", \"target\": \"n2\", \"type\": \"smoothstep\",\n \"data\": { \"labelText\": \"yes\" } }\n ],\n \"lines\": []\n }\n },\n \"stack\": [\"root\"]\n}\n\nRules:\n- Node \"type\" is one of: shapeRect, shapeRoundRect, shapeEllipse, shapeDiamond, shapeParallelogram, shapeDocument, shapeHexagon. Use shapeDiamond for decisions, shapeRoundRect for processes, shapeEllipse for start/end.\n- Give every node a unique \"id\". Every edge \"source\"/\"target\" must reference an existing node id.\n- Lay nodes out on a readable grid (top-to-bottom or left-to-right), spacing ~180px, no overlaps. Widths ~140-180, heights ~56-72 (diamonds ~120x100).\n- Put a short \"label\" on each node. Optional edge label goes in data.labelText.\n- Do NOT include colors; the editor themes them automatically.\n- Output ONLY the JSON code block.`;\n\n/** Extract and parse the first JSON object from an AI reply. */\nfunction parseFlowJson(text: string): FlowDocument | null {\n let raw = text.trim();\n const fence = /```(?:json)?\\s*([\\s\\S]*?)```/i.exec(raw);\n if (fence) raw = fence[1].trim();\n else {\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n if (start >= 0 && end > start) raw = raw.slice(start, end + 1);\n }\n try {\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || !parsed.canvases) return null;\n return parsed as FlowDocument;\n } catch {\n return null;\n }\n}\n\n/** Normalize an AI-produced document: fill defaults, ensure a root canvas. */\nfunction normalizeAIDocument(doc: FlowDocument): FlowDocument {\n const canvases = doc.canvases ?? {};\n const rootKey = doc.stack?.[doc.stack.length - 1] ?? ROOT_CANVAS_ID;\n const canvas = canvases[rootKey] ?? canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n const nodes = (canvas.nodes ?? []).map((n: any, i: number) => ({\n id: n.id ?? `n${i + 1}`,\n type: n.type ?? 'shapeRoundRect',\n position: { x: Number(n.position?.x ?? 80), y: Number(n.position?.y ?? 80 + i * 120) },\n width: Number(n.width ?? 160),\n height: Number(n.height ?? 64),\n zIndex: n.zIndex ?? i,\n data: { ...DEFAULT_NODE_DATA, ...n.data, label: n.data?.label ?? n.label ?? 'Node' },\n }));\n const nodeById = new Map<string, any>(nodes.map((n) => [n.id, n]));\n const edges = (canvas.edges ?? []).map((e: any, i: number) => ({\n id: e.id ?? `e${i + 1}`,\n source: e.source,\n target: e.target,\n type: e.type ?? 'smoothstep',\n data: { ...DEFAULT_EDGE_DATA, ...e.data },\n })).filter((e: any) => e.source && e.target)\n .map((e: any) => pinEdgeToSideMidpoints(e, nodeById));\n return {\n canvases: { [ROOT_CANVAS_ID]: { nodes, edges, lines: [] } },\n stack: [ROOT_CANVAS_ID],\n };\n}\n\n/**\n * Pin an AI-generated edge to the midpoint handles of the facing node sides\n * (`r_0.5` / `l_0.5` / `t_0.5` / `b_0.5`) so connections attach at the center\n * of each side instead of sliding along the side toward the other node.\n */\nfunction pinEdgeToSideMidpoints(edge: any, nodeById: Map<string, any>): any {\n const s = nodeById.get(edge.source);\n const t = nodeById.get(edge.target);\n if (!s || !t || s === t) return edge;\n const dx = (t.position.x + t.width / 2) - (s.position.x + s.width / 2);\n const dy = (t.position.y + t.height / 2) - (s.position.y + s.height / 2);\n if (Math.abs(dx) >= Math.abs(dy)) {\n const forward = dx >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'r_0.5' : 'l_0.5',\n targetHandle: forward ? 'l_0.5' : 'r_0.5',\n };\n }\n const forward = dy >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'b_0.5' : 't_0.5',\n targetHandle: forward ? 't_0.5' : 'b_0.5',\n };\n}\n\nconst PROTOCOL_OPTIONS = [\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic' },\n];\n\n/** Char count at which the simulated progress bar saturates (99%). */\nconst PROGRESS_FULL_CHARS = 20000;\n\nexport function AIPanelContent() {\n const { setDoc } = useFlowContext();\n const { aiConfig, setAIConfig, showAIConfig } = useFlowAI();\n\n const [prompt, setPrompt] = useState('');\n const [imageDataUrl, setImageDataUrl] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [streamOpen, setStreamOpen] = useState(false);\n const [finished, setFinished] = useState(false);\n const [pendingDoc, setPendingDoc] = useState<FlowDocument | null>(null);\n const [displayLen, setDisplayLen] = useState(0);\n const abortRef = useRef<AbortController | null>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const streamBodyRef = useRef<HTMLPreElement>(null);\n const streamTailRef = useRef<HTMLPreElement>(null);\n /** Full text received from the model so far (grows on every SSE delta). */\n const targetRef = useRef('');\n\n const updateConfig = useCallback((patch: Partial<FlowAIConfig>) => {\n setAIConfig({ ...aiConfig, ...patch });\n }, [aiConfig, setAIConfig]);\n\n const onPickImage = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n // Accept an image pasted from the clipboard (Ctrl/Cmd+V) anywhere in the panel\n // or into the textarea. Falls through to normal text paste otherwise.\n const onPaste = useCallback((e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n for (const item of items) {\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) {\n e.preventDefault();\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n return;\n }\n }\n }\n }, []);\n\n // Progressive reveal: SSE deltas land in `targetRef` (often several chunks\n // per network read, which React would batch into a single paint), and this\n // timer types the text out with an exponential catch-up so the panel always\n // shows the reply growing character-by-character.\n useEffect(() => {\n const timer = window.setInterval(() => {\n setDisplayLen((len) => {\n const target = targetRef.current.length;\n if (len >= target) return len;\n return len + Math.max(8, Math.ceil((target - len) / 8));\n });\n }, 40);\n return () => window.clearInterval(timer);\n }, []);\n\n const streamText = targetRef.current.slice(0, displayLen);\n\n // Keep the streaming output pinned to the latest chunk while visible.\n useEffect(() => {\n const el = streamBodyRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n const tail = streamTailRef.current;\n if (tail) tail.scrollTop = tail.scrollHeight;\n }, [streamText, streamOpen]);\n\n const generate = useCallback(async () => {\n if (busy) return;\n if (!aiConfig.gateway || !aiConfig.model) {\n setError('请先配置 AI 接口地址与模型');\n return;\n }\n if (!prompt.trim() && !imageDataUrl) {\n setError('请输入需求描述,或上传一张流程图');\n return;\n }\n setError(null);\n setStatus('正在生成…');\n targetRef.current = '';\n setDisplayLen(0);\n setFinished(false);\n setPendingDoc(null);\n setBusy(true);\n const ac = new AbortController();\n abortRef.current = ac;\n try {\n const text = await completeAIChatStream(\n aiConfig,\n prompt.trim() || '请根据这张图片复刻出对应的流程图。',\n {\n imageDataUrl: imageDataUrl ?? undefined,\n systemPrompt: SYSTEM_PROMPT,\n signal: ac.signal,\n onDelta: (accumulated) => { targetRef.current = accumulated; },\n },\n );\n setFinished(true);\n const parsed = parseFlowJson(text);\n if (!parsed) {\n setError('AI 返回内容无法解析为流程图,请重试或调整描述');\n setStatus(null);\n return;\n }\n setPendingDoc(normalizeAIDocument(parsed));\n setStatus(null);\n } catch (err: any) {\n if (err?.name !== 'AbortError') setError(err?.message ?? '生成失败');\n setStatus(null);\n } finally {\n setBusy(false);\n abortRef.current = null;\n }\n }, [busy, aiConfig, prompt, imageDataUrl]);\n\n const cancel = useCallback(() => abortRef.current?.abort(), []);\n\n /** Merge the generated canvas into the current canvas, remapping ids. */\n const applyInsert = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n const cur = prev.canvases[canvasId] ?? { nodes: [], edges: [], lines: [] };\n const used = new Set([\n ...cur.nodes.map((n) => n.id),\n ...cur.edges.map((e) => e.id),\n ...cur.lines.map((l) => l.id),\n ]);\n const fresh = (id: string) => {\n let next = id;\n let i = 1;\n while (used.has(next)) next = `${id}_${i++}`;\n used.add(next);\n return next;\n };\n const idMap = new Map<string, string>();\n const nodes = gen.nodes.map((n) => {\n const id = fresh(n.id);\n idMap.set(n.id, id);\n return { ...n, id };\n });\n const edges = gen.edges.map((e) => ({\n ...e,\n id: fresh(e.id),\n source: idMap.get(e.source) ?? e.source,\n target: idMap.get(e.target) ?? e.target,\n }));\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: [...cur.nodes, ...nodes], edges: [...cur.edges, ...edges], lines: cur.lines },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已插入流程图');\n }, [pendingDoc, setDoc]);\n\n /** Clear the current canvas, then place the generated content onto it. */\n const applyReplace = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: gen.nodes, edges: gen.edges, lines: [] },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已替换画布');\n }, [pendingDoc, setDoc]);\n\n const charCount = streamText.length;\n const fullyRevealed = charCount >= targetRef.current.length;\n const progress = finished && fullyRevealed\n ? 100\n : Math.min(99, Math.floor((charCount / PROGRESS_FULL_CHARS) * 99));\n\n return (\n <div className=\"flow-ai-panel\" onPaste={onPaste}>\n {showAIConfig && (\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">模型配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={PROTOCOL_OPTIONS}\n value={aiConfig.protocol}\n onChange={(v) => updateConfig({ protocol: v as FlowAIConfig['protocol'] })}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={aiConfig.gateway}\n placeholder=\"https://api.moonshot.cn/v1\"\n onChange={(e) => updateConfig({ gateway: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={aiConfig.model}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateConfig({ model: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={aiConfig.apiKey ?? ''}\n placeholder=\"sk-…\"\n onChange={(e) => updateConfig({ apiKey: e.target.value })}\n />\n </div>\n </div>\n )}\n\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">生成流程图</div>\n <textarea\n className=\"flow-ai-textarea\"\n value={prompt}\n placeholder=\"描述你想要的流程,例如:用户注册流程,包含邮箱校验、发送验证码、创建账号等步骤(可直接粘贴图片)\"\n onChange={(e) => setPrompt(e.target.value)}\n onPaste={onPaste}\n onPointerDown={(e) => e.stopPropagation()}\n />\n\n <div className=\"flow-ai-image-row\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={onPickImage}\n />\n {imageDataUrl ? (\n <div className=\"flow-ai-image-preview\">\n <img src={imageDataUrl} alt=\"参考图\" />\n <button\n type=\"button\"\n className=\"flow-ai-image-remove\"\n title=\"移除图片\"\n onClick={() => setImageDataUrl(null)}\n >×</button>\n </div>\n ) : (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => fileRef.current?.click()}>\n 上传流程图图片\n </Button>\n )}\n <span className=\"flow-ai-hint\">或粘贴图片 (Ctrl/⌘+V)</span>\n </div>\n\n <div className=\"flow-ai-actions\">\n {busy ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={cancel}>停止</Button>\n ) : (\n <Button size=\"xs\" variant=\"primary\" onClick={generate}>生成流程图</Button>\n )}\n </div>\n\n {(busy || streamText) && (\n <div className=\"flow-ai-stream\">\n <div className=\"flow-ai-progress\">\n <div className=\"flow-ai-progress-track\">\n <div className=\"flow-ai-progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <span className=\"flow-ai-progress-label\">{progress}%</span>\n </div>\n <button\n type=\"button\"\n className=\"flow-ai-stream-header\"\n onClick={() => setStreamOpen((open) => !open)}\n >\n <span className={`flow-ai-stream-chevron${streamOpen ? ' flow-ai-stream-chevron--open' : ''}`}>▸</span>\n <span>返回内容</span>\n <span className=\"flow-ai-stream-count\">{charCount.toLocaleString()} 字符</span>\n </button>\n {streamOpen ? (\n <pre ref={streamBodyRef} className=\"flow-ai-stream-body\">{streamText || '等待返回…'}</pre>\n ) : (\n streamText && <pre ref={streamTailRef} className=\"flow-ai-stream-tail\">{streamText}</pre>\n )}\n </div>\n )}\n\n {status && !error && <div className=\"flow-ai-status\">{status}</div>}\n {error && <div className=\"flow-media-error\">{error}</div>}\n </div>\n\n {pendingDoc && (\n <div className=\"flow-ai-dialog-overlay\" onClick={() => setPendingDoc(null)}>\n <div\n className=\"flow-ai-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"流程图已生成\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flow-ai-dialog-title\">流程图已生成</div>\n <div className=\"flow-ai-dialog-desc\">\n 插入:将生成内容追加到当前画布;替换:清空当前画布后再插入。\n </div>\n <div className=\"flow-ai-dialog-actions\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setPendingDoc(null)}>取消</Button>\n <Button size=\"xs\" variant=\"neutral\" outline onClick={applyInsert}>插入</Button>\n <Button size=\"xs\" variant=\"primary\" onClick={applyReplace}>替换</Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,46 +1,46 @@
1
- import d from "../../../Button/index.js";
1
+ import e from "../../../Button/index.js";
2
2
  import "../constants.js";
3
- import { useFlowContext as m } from "../context/FlowContext.js";
4
- import f from "react";
5
- import { jsx as a, jsxs as u } from "react/jsx-runtime";
6
- function b(n, o) {
7
- if (o === "root") return "Root";
8
- for (const [, s] of Object.entries(n.canvases)) for (const e of s.nodes) if (e.data.childCanvasId === o) return e.data.label || e.type;
9
- return o;
3
+ import { useFlowContext as t } from "../context/FlowContext.js";
4
+ import n from "react";
5
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
+ //#region src/components/pro/Flow/panels/Breadcrumb.tsx
7
+ function a(e, t) {
8
+ if (t === "root") return "Root";
9
+ for (let [, n] of Object.entries(e.canvases)) for (let e of n.nodes) if (e.data.childCanvasId === t) return e.data.label || e.type;
10
+ return t;
10
11
  }
11
- function N() {
12
- const { doc: n, setDoc: o, setSelection: s } = m(), { stack: e } = n;
13
- if (e.length <= 1) return null;
14
- const l = (r) => {
15
- r !== e.length - 1 && (o((t) => ({
16
- ...t,
17
- stack: t.stack.slice(0, r + 1)
18
- })), s({
19
- nodeIds: /* @__PURE__ */ new Set(),
20
- edgeIds: /* @__PURE__ */ new Set(),
21
- lineIds: /* @__PURE__ */ new Set()
22
- }));
23
- };
24
- return /* @__PURE__ */ a("div", {
25
- className: "flow-breadcrumb",
26
- children: e.map((r, t) => {
27
- const i = b(n, r), c = t === e.length - 1;
28
- return /* @__PURE__ */ u(f.Fragment, { children: [t > 0 && /* @__PURE__ */ a("span", {
29
- className: "flow-breadcrumb-sep",
30
- children: "›"
31
- }), /* @__PURE__ */ a(d, {
32
- variant: "ghost",
33
- size: "xs",
34
- className: `flow-breadcrumb-item ${c ? "flow-breadcrumb-item--active" : ""}`,
35
- onClick: () => l(t),
36
- disabled: c,
37
- children: i
38
- })] }, r);
39
- })
40
- });
12
+ function o() {
13
+ let { doc: o, setDoc: s, setSelection: c } = t(), { stack: l } = o;
14
+ if (l.length <= 1) return null;
15
+ let u = (e) => {
16
+ e !== l.length - 1 && (s((t) => ({
17
+ ...t,
18
+ stack: t.stack.slice(0, e + 1)
19
+ })), c({
20
+ nodeIds: /* @__PURE__ */ new Set(),
21
+ edgeIds: /* @__PURE__ */ new Set(),
22
+ lineIds: /* @__PURE__ */ new Set()
23
+ }));
24
+ };
25
+ return /* @__PURE__ */ r("div", {
26
+ className: "flow-breadcrumb",
27
+ children: l.map((t, s) => {
28
+ let c = a(o, t), d = s === l.length - 1;
29
+ return /* @__PURE__ */ i(n.Fragment, { children: [s > 0 && /* @__PURE__ */ r("span", {
30
+ className: "flow-breadcrumb-sep",
31
+ children: "›"
32
+ }), /* @__PURE__ */ r(e, {
33
+ variant: "ghost",
34
+ size: "xs",
35
+ className: `flow-breadcrumb-item ${d ? "flow-breadcrumb-item--active" : ""}`,
36
+ onClick: () => u(s),
37
+ disabled: d,
38
+ children: c
39
+ })] }, t);
40
+ })
41
+ });
41
42
  }
42
- export {
43
- N as default
44
- };
43
+ //#endregion
44
+ export { o as default };
45
45
 
46
46
  //# sourceMappingURL=Breadcrumb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport Button from '../../../Button';\nimport { useFlowContext } from '../context/FlowContext';\nimport { ROOT_CANVAS_ID } from '../constants';\n\nfunction findNodeLabel(doc: ReturnType<typeof useFlowContext>['doc'], canvasId: string): string {\n if (canvasId === ROOT_CANVAS_ID) return 'Root';\n for (const [, canvas] of Object.entries(doc.canvases)) {\n for (const node of canvas.nodes) {\n if (node.data.childCanvasId === canvasId) {\n return node.data.label || node.type;\n }\n }\n }\n return canvasId;\n}\n\nexport default function Breadcrumb() {\n const { doc, setDoc, setSelection } = useFlowContext();\n const { stack } = doc;\n\n if (stack.length <= 1) return null;\n\n const handleClick = (index: number) => {\n if (index === stack.length - 1) return;\n setDoc(prev => ({\n ...prev,\n stack: prev.stack.slice(0, index + 1),\n }));\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n };\n\n return (\n <div className=\"flow-breadcrumb\">\n {stack.map((canvasId, i) => {\n const label = findNodeLabel(doc, canvasId);\n const isLast = i === stack.length - 1;\n return (\n <React.Fragment key={canvasId}>\n {i > 0 && <span className=\"flow-breadcrumb-sep\">›</span>}\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className={`flow-breadcrumb-item ${isLast ? 'flow-breadcrumb-item--active' : ''}`}\n onClick={() => handleClick(i)}\n disabled={isLast}\n >\n {label}\n </Button>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAc,GAA+C,GAA0B;AAC9F,MAAI,MAAA,OAA6B,QAAO;AACxC,aAAW,CAAA,EAAG,CAAA,KAAW,OAAO,QAAQ,EAAI,QAAQ,EAClD,YAAW,KAAQ,EAAO,MACxB,KAAI,EAAK,KAAK,kBAAkB,EAC9B,QAAO,EAAK,KAAK,SAAS,EAAK;AAIrC,SAAO;AACT;AAEA,SAAwB,IAAa;AACnC,QAAM,EAAE,KAAA,GAAK,QAAA,GAAQ,cAAA,EAAA,IAAiB,EAAe,GAC/C,EAAE,OAAA,EAAA,IAAU;AAElB,MAAI,EAAM,UAAU,EAAG,QAAO;AAE9B,QAAM,IAAA,CAAe,MAAkB;AACrC,IAAI,MAAU,EAAM,SAAS,MAC7B,EAAA,CAAO,OAAS;AAAA,MACd,GAAG;AAAA,MACH,OAAO,EAAK,MAAM,MAAM,GAAG,IAAQ,CAAC;AAAA,IACtC,EAAE,GACF,EAAa;AAAA,MAAE,SAAS,oBAAI,IAAI;AAAA,MAAG,SAAS,oBAAI,IAAI;AAAA,MAAG,SAAS,oBAAI,IAAI;AAAA,IAAE,CAAC;AAAA,EAC7E;AAEA,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IACZ,UAAA,EAAM,IAAA,CAAK,GAAU,MAAM;AAC1B,YAAM,IAAQ,EAAc,GAAK,CAAQ,GACnC,IAAS,MAAM,EAAM,SAAS;AACpC,aACE,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACG,IAAI,KAAK,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,QAAsB,UAAA;AAAA,MAAO,CAAA,GACvD,gBAAA,EAAC,GAAD;AAAA,QACE,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAW,wBAAwB,IAAS,iCAAiC,EAAA;AAAA,QAC7E,SAAA,MAAe,EAAY,CAAC;AAAA,QAC5B,UAAU;AAAA,QAET,UAAA;AAAA,MACK,CAAA,CACM,EAAA,GAXK,CAWL;AAAA,IAEpB,CAAC;AAAA,EACE,CAAA;AAET"}
1
+ {"version":3,"file":"Breadcrumb.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport Button from '../../../Button';\nimport { useFlowContext } from '../context/FlowContext';\nimport { ROOT_CANVAS_ID } from '../constants';\n\nfunction findNodeLabel(doc: ReturnType<typeof useFlowContext>['doc'], canvasId: string): string {\n if (canvasId === ROOT_CANVAS_ID) return 'Root';\n for (const [, canvas] of Object.entries(doc.canvases)) {\n for (const node of canvas.nodes) {\n if (node.data.childCanvasId === canvasId) {\n return node.data.label || node.type;\n }\n }\n }\n return canvasId;\n}\n\nexport default function Breadcrumb() {\n const { doc, setDoc, setSelection } = useFlowContext();\n const { stack } = doc;\n\n if (stack.length <= 1) return null;\n\n const handleClick = (index: number) => {\n if (index === stack.length - 1) return;\n setDoc(prev => ({\n ...prev,\n stack: prev.stack.slice(0, index + 1),\n }));\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n };\n\n return (\n <div className=\"flow-breadcrumb\">\n {stack.map((canvasId, i) => {\n const label = findNodeLabel(doc, canvasId);\n const isLast = i === stack.length - 1;\n return (\n <React.Fragment key={canvasId}>\n {i > 0 && <span className=\"flow-breadcrumb-sep\">›</span>}\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className={`flow-breadcrumb-item ${isLast ? 'flow-breadcrumb-item--active' : ''}`}\n onClick={() => handleClick(i)}\n disabled={isLast}\n >\n {label}\n </Button>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAS,EAAc,GAA+C,GAA0B;CAC9F,IAAI,MAAA,QAA6B,OAAO;CACxC,KAAK,IAAM,GAAG,MAAW,OAAO,QAAQ,EAAI,QAAQ,GAClD,KAAK,IAAM,KAAQ,EAAO,OACxB,IAAI,EAAK,KAAK,kBAAkB,GAC9B,OAAO,EAAK,KAAK,SAAS,EAAK;CAIrC,OAAO;AACT;AAEA,SAAwB,IAAa;CACnC,IAAM,EAAE,QAAK,WAAQ,oBAAiB,EAAe,GAC/C,EAAE,aAAU;CAElB,IAAI,EAAM,UAAU,GAAG,OAAO;CAE9B,IAAM,KAAe,MAAkB;EACjC,MAAU,EAAM,SAAS,MAC7B,GAAO,OAAS;GACd,GAAG;GACH,OAAO,EAAK,MAAM,MAAM,GAAG,IAAQ,CAAC;EACtC,EAAE,GACF,EAAa;GAAE,yBAAS,IAAI,IAAI;GAAG,yBAAS,IAAI,IAAI;GAAG,yBAAS,IAAI,IAAI;EAAE,CAAC;CAC7E;CAEA,OACE,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,EAAM,KAAK,GAAU,MAAM;GAC1B,IAAM,IAAQ,EAAc,GAAK,CAAQ,GACnC,IAAS,MAAM,EAAM,SAAS;GACpC,OACE,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,IAAI,KAAK,kBAAC,QAAD;IAAM,WAAU;IAAsB,UAAA;GAAO,CAAA,GACvD,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,WAAW,wBAAwB,IAAS,iCAAiC;IAC7E,eAAe,EAAY,CAAC;IAC5B,UAAU;IAET,UAAA;GACK,CAAA,CACM,EAAA,GAXK,CAWL;EAEpB,CAAC;CACE,CAAA;AAET"}
@@ -1,40 +1,40 @@
1
- import { useEffect as c, useRef as l } from "react";
2
- import { jsx as r, jsxs as u } from "react/jsx-runtime";
3
- function v({ x: a, y: d, items: s, onClose: t }) {
4
- const o = l(null);
5
- return c(() => {
6
- const e = (n) => {
7
- o.current && !o.current.contains(n.target) && t();
8
- };
9
- return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
10
- }, [t]), c(() => {
11
- const e = (n) => {
12
- n.key === "Escape" && t();
13
- };
14
- return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
15
- }, [t]), /* @__PURE__ */ r("div", {
16
- ref: o,
17
- className: "flow-context-menu",
18
- style: {
19
- left: a,
20
- top: d
21
- },
22
- children: s.map((e, n) => e.label === "---" ? /* @__PURE__ */ r("div", { className: "flow-context-menu-separator" }, n) : /* @__PURE__ */ u("div", {
23
- className: "flow-context-menu-item",
24
- style: {
25
- opacity: e.disabled ? 0.4 : 1,
26
- pointerEvents: e.disabled ? "none" : void 0,
27
- color: e.danger ? "oklch(var(--er))" : void 0
28
- },
29
- onClick: () => {
30
- e.action(), t();
31
- },
32
- children: [e.icon && /* @__PURE__ */ r("span", { children: e.icon }), /* @__PURE__ */ r("span", { children: e.label })]
33
- }, n))
34
- });
1
+ import { useEffect as e, useRef as t } from "react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ //#region src/components/pro/Flow/panels/ContextMenu.tsx
4
+ function i({ x: i, y: a, items: o, onClose: s }) {
5
+ let c = t(null);
6
+ return e(() => {
7
+ let e = (e) => {
8
+ c.current && !c.current.contains(e.target) && s();
9
+ };
10
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
11
+ }, [s]), e(() => {
12
+ let e = (e) => {
13
+ e.key === "Escape" && s();
14
+ };
15
+ return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
16
+ }, [s]), /* @__PURE__ */ n("div", {
17
+ ref: c,
18
+ className: "flow-context-menu",
19
+ style: {
20
+ left: i,
21
+ top: a
22
+ },
23
+ children: o.map((e, t) => e.label === "---" ? /* @__PURE__ */ n("div", { className: "flow-context-menu-separator" }, t) : /* @__PURE__ */ r("div", {
24
+ className: "flow-context-menu-item",
25
+ style: {
26
+ opacity: e.disabled ? .4 : 1,
27
+ pointerEvents: e.disabled ? "none" : void 0,
28
+ color: e.danger ? "oklch(var(--er))" : void 0
29
+ },
30
+ onClick: () => {
31
+ e.action(), s();
32
+ },
33
+ children: [e.icon && /* @__PURE__ */ n("span", { children: e.icon }), /* @__PURE__ */ n("span", { children: e.label })]
34
+ }, t))
35
+ });
35
36
  }
36
- export {
37
- v as default
38
- };
37
+ //#endregion
38
+ export { i as default };
39
39
 
40
40
  //# sourceMappingURL=ContextMenu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ContextMenu.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nexport interface ContextMenuItem {\n label: string;\n icon?: string;\n action: () => void;\n danger?: boolean;\n disabled?: boolean;\n}\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuItem[];\n onClose: () => void;\n}\n\nexport default function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [onClose]);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [onClose]);\n\n return (\n <div ref={ref} className=\"flow-context-menu\" style={{ left: x, top: y }}>\n {items.map((item, i) => {\n if (item.label === '---') {\n return <div key={i} className=\"flow-context-menu-separator\" />;\n }\n return (\n <div\n key={i}\n className=\"flow-context-menu-item\"\n style={{\n opacity: item.disabled ? 0.4 : 1,\n pointerEvents: item.disabled ? 'none' : undefined,\n color: item.danger ? 'oklch(var(--er))' : undefined,\n }}\n onClick={() => { item.action(); onClose(); }}\n >\n {item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;AAiBA,SAAwB,EAAY,EAAE,GAAA,GAAG,GAAA,GAAG,OAAA,GAAO,SAAA,EAAA,GAA6B;AAC9E,QAAM,IAAM,EAAuB,IAAI;AAEvC,SAAA,EAAA,MAAgB;AACd,UAAM,IAAA,CAAW,MAAkB;AACjC,MAAI,EAAI,WAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,MAAc,KACvD,EAAQ;AAAA,IAEZ;AACA,oBAAS,iBAAiB,aAAa,CAAO,GAC9C,MAAa,SAAS,oBAAoB,aAAa,CAAO;AAAA,EAChE,GAAG,CAAC,CAAO,CAAC,GAEZ,EAAA,MAAgB;AACd,UAAM,IAAA,CAAW,MAAqB;AACpC,MAAI,EAAE,QAAQ,YAAU,EAAQ;AAAA,IAClC;AACA,oBAAS,iBAAiB,WAAW,CAAO,GAC5C,MAAa,SAAS,oBAAoB,WAAW,CAAO;AAAA,EAC9D,GAAG,CAAC,CAAO,CAAC,GAGV,gBAAA,EAAC,OAAD;AAAA,IAAU,KAAA;AAAA,IAAK,WAAU;AAAA,IAAoB,OAAO;AAAA,MAAE,MAAM;AAAA,MAAG,KAAK;AAAA,IAAE;AAAA,IACnE,UAAA,EAAM,IAAA,CAAK,GAAM,MACZ,EAAK,UAAU,QACV,gBAAA,EAAC,OAAD,EAAa,WAAU,8BAA+B,GAA5C,CAA4C,IAG7D,gBAAA,EAAC,OAAD;AAAA,MAEE,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS,EAAK,WAAW,MAAM;AAAA,QAC/B,eAAe,EAAK,WAAW,SAAS;AAAA,QACxC,OAAO,EAAK,SAAS,qBAAqB;AAAA,MAC5C;AAAA,MACA,SAAA,MAAe;AAAE,QAAA,EAAK,OAAO,GAAG,EAAQ;AAAA,MAAG;AAAA,MAR7C,UAAA,CAUG,EAAK,QAAQ,gBAAA,EAAC,QAAD,EAAA,UAAO,EAAK,KAAW,CAAA,GACrC,gBAAA,EAAC,QAAD,EAAA,UAAO,EAAK,MAAY,CAAA,CACrB;AAAA,IAXE,GAAA,CAWF,CAER;AAAA,EACE,CAAA;AAET"}
1
+ {"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ContextMenu.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nexport interface ContextMenuItem {\n label: string;\n icon?: string;\n action: () => void;\n danger?: boolean;\n disabled?: boolean;\n}\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuItem[];\n onClose: () => void;\n}\n\nexport default function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [onClose]);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [onClose]);\n\n return (\n <div ref={ref} className=\"flow-context-menu\" style={{ left: x, top: y }}>\n {items.map((item, i) => {\n if (item.label === '---') {\n return <div key={i} className=\"flow-context-menu-separator\" />;\n }\n return (\n <div\n key={i}\n className=\"flow-context-menu-item\"\n style={{\n opacity: item.disabled ? 0.4 : 1,\n pointerEvents: item.disabled ? 'none' : undefined,\n color: item.danger ? 'oklch(var(--er))' : undefined,\n }}\n onClick={() => { item.action(); onClose(); }}\n >\n {item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;AAiBA,SAAwB,EAAY,EAAE,MAAG,MAAG,UAAO,cAA6B;CAC9E,IAAM,IAAM,EAAuB,IAAI;CAoBvC,OAlBA,QAAgB;EACd,IAAM,KAAW,MAAkB;GACjC,AAAI,EAAI,WAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,MAAc,KACvD,EAAQ;EAEZ;EAEA,OADA,SAAS,iBAAiB,aAAa,CAAO,SACjC,SAAS,oBAAoB,aAAa,CAAO;CAChE,GAAG,CAAC,CAAO,CAAC,GAEZ,QAAgB;EACd,IAAM,KAAW,MAAqB;GACpC,AAAI,EAAE,QAAQ,YAAU,EAAQ;EAClC;EAEA,OADA,SAAS,iBAAiB,WAAW,CAAO,SAC/B,SAAS,oBAAoB,WAAW,CAAO;CAC9D,GAAG,CAAC,CAAO,CAAC,GAGV,kBAAC,OAAD;EAAU;EAAK,WAAU;EAAoB,OAAO;GAAE,MAAM;GAAG,KAAK;EAAE;EACnE,UAAA,EAAM,KAAK,GAAM,MACZ,EAAK,UAAU,QACV,kBAAC,OAAD,EAAa,WAAU,8BAA+B,GAA5C,CAA4C,IAG7D,kBAAC,OAAD;GAEE,WAAU;GACV,OAAO;IACL,SAAS,EAAK,WAAW,KAAM;IAC/B,eAAe,EAAK,WAAW,SAAS,KAAA;IACxC,OAAO,EAAK,SAAS,qBAAqB,KAAA;GAC5C;GACA,eAAe;IAAiB,AAAf,EAAK,OAAO,GAAG,EAAQ;GAAG;GAR7C,UAAA,CAUG,EAAK,QAAQ,kBAAC,QAAD,EAAA,UAAO,EAAK,KAAW,CAAA,GACrC,kBAAC,QAAD,EAAA,UAAO,EAAK,MAAY,CAAA,CACrB;EAXE,GAAA,CAWF,CAER;CACE,CAAA;AAET"}