dishui 0.0.65 → 0.0.67

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 (507) 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/Accordion/index.d.ts +39 -0
  5. package/dist/components/Accordion/index.js +70 -0
  6. package/dist/components/Accordion/index.js.map +1 -0
  7. package/dist/components/Avatar/index.d.ts +48 -0
  8. package/dist/components/Avatar/index.js +71 -0
  9. package/dist/components/Avatar/index.js.map +1 -0
  10. package/dist/components/Badge/index.js +10 -15
  11. package/dist/components/Badge/index.js.map +1 -1
  12. package/dist/components/Button/index.js +62 -89
  13. package/dist/components/Button/index.js.map +1 -1
  14. package/dist/components/Card/index.d.ts +142 -0
  15. package/dist/components/Card/index.js +368 -69
  16. package/dist/components/Card/index.js.map +1 -1
  17. package/dist/components/Chart/Chart.js +25 -25
  18. package/dist/components/Chart/Chart.js.map +1 -1
  19. package/dist/components/Checkbox/index.js +57 -65
  20. package/dist/components/Checkbox/index.js.map +1 -1
  21. package/dist/components/ChoicePicker/index.d.ts +44 -0
  22. package/dist/components/ChoicePicker/index.js +81 -0
  23. package/dist/components/ChoicePicker/index.js.map +1 -0
  24. package/dist/components/Column/index.d.ts +28 -0
  25. package/dist/components/Column/index.js +30 -0
  26. package/dist/components/Column/index.js.map +1 -0
  27. package/dist/components/DateTimeInput/index.d.ts +44 -0
  28. package/dist/components/DateTimeInput/index.js +48 -0
  29. package/dist/components/DateTimeInput/index.js.map +1 -0
  30. package/dist/components/Demo/index.js +107 -107
  31. package/dist/components/Demo/index.js.map +1 -1
  32. package/dist/components/Divider/index.d.ts +20 -0
  33. package/dist/components/Divider/index.js +30 -0
  34. package/dist/components/Divider/index.js.map +1 -0
  35. package/dist/components/EmptyState/index.js +24 -24
  36. package/dist/components/EmptyState/index.js.map +1 -1
  37. package/dist/components/FileUploader/DropZone.js +134 -136
  38. package/dist/components/FileUploader/DropZone.js.map +1 -1
  39. package/dist/components/FileUploader/FileItem.js +159 -163
  40. package/dist/components/FileUploader/FileItem.js.map +1 -1
  41. package/dist/components/FileUploader/FileUploader.js +126 -127
  42. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  43. package/dist/components/FileUploader/UploadQueue.js +62 -62
  44. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  45. package/dist/components/FloatWindow/index.d.ts +28 -0
  46. package/dist/components/GridLayout/index.d.ts +42 -0
  47. package/dist/components/Icon/index.d.ts +26 -0
  48. package/dist/components/Icon/index.js +27 -0
  49. package/dist/components/Icon/index.js.map +1 -0
  50. package/dist/components/Image/index.d.ts +33 -0
  51. package/dist/components/Image/index.js +44 -0
  52. package/dist/components/Image/index.js.map +1 -0
  53. package/dist/components/Input/index.js +196 -197
  54. package/dist/components/Input/index.js.map +1 -1
  55. package/dist/components/Label/index.js +62 -74
  56. package/dist/components/Label/index.js.map +1 -1
  57. package/dist/components/Layout/index.js +134 -139
  58. package/dist/components/Layout/index.js.map +1 -1
  59. package/dist/components/List/index.js +45 -58
  60. package/dist/components/List/index.js.map +1 -1
  61. package/dist/components/Markdown/Markdown.js +106 -107
  62. package/dist/components/Markdown/Markdown.js.map +1 -1
  63. package/dist/components/Markdown/codeThemes.js +24 -33
  64. package/dist/components/Markdown/codeThemes.js.map +1 -1
  65. package/dist/components/Markdown/markdownComponents.js +203 -208
  66. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  67. package/dist/components/Markdown/parseCodeBlockMeta.js +22 -22
  68. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  69. package/dist/components/Markdown/useMarkdownSource.js +46 -46
  70. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  71. package/dist/components/Markdown/useMarkmapRenderer.js +35 -36
  72. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  73. package/dist/components/Markdown/useMermaidRenderer.js +41 -42
  74. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  75. package/dist/components/Modal/index.js +82 -82
  76. package/dist/components/Modal/index.js.map +1 -1
  77. package/dist/components/MultipleChoice/index.d.ts +44 -0
  78. package/dist/components/MultipleChoice/index.js +52 -0
  79. package/dist/components/MultipleChoice/index.js.map +1 -0
  80. package/dist/components/Notification/index.d.ts +17 -0
  81. package/dist/components/Page/index.d.ts +1 -1
  82. package/dist/components/Page/index.js +40 -71
  83. package/dist/components/Page/index.js.map +1 -1
  84. package/dist/components/PageHeader/index.js +28 -28
  85. package/dist/components/PageHeader/index.js.map +1 -1
  86. package/dist/components/ProtectedRoute/index.js +8 -9
  87. package/dist/components/ProtectedRoute/index.js.map +1 -1
  88. package/dist/components/Row/index.d.ts +28 -0
  89. package/dist/components/Row/index.js +30 -0
  90. package/dist/components/Row/index.js.map +1 -0
  91. package/dist/components/Select/index.js +251 -254
  92. package/dist/components/Select/index.js.map +1 -1
  93. package/dist/components/SidebarToggleButton/index.js +56 -59
  94. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  95. package/dist/components/Slider/index.d.ts +39 -0
  96. package/dist/components/Slider/index.js +52 -0
  97. package/dist/components/Slider/index.js.map +1 -0
  98. package/dist/components/Switch/index.d.ts +34 -0
  99. package/dist/components/Switch/index.js +55 -0
  100. package/dist/components/Switch/index.js.map +1 -0
  101. package/dist/components/Tab/index.d.ts +40 -0
  102. package/dist/components/Table/index.js +109 -121
  103. package/dist/components/Table/index.js.map +1 -1
  104. package/dist/components/Tabs/index.js +28 -38
  105. package/dist/components/Tabs/index.js.map +1 -1
  106. package/dist/components/Text/index.d.ts +43 -0
  107. package/dist/components/Text/index.js +55 -0
  108. package/dist/components/Text/index.js.map +1 -0
  109. package/dist/components/Tooltip/index.d.ts +23 -0
  110. package/dist/components/Tooltip/index.js +34 -0
  111. package/dist/components/Tooltip/index.js.map +1 -0
  112. package/dist/components/Tree/Tree.js +205 -205
  113. package/dist/components/Tree/Tree.js.map +1 -1
  114. package/dist/components/pro/ArticleContextMenu/index.js +86 -87
  115. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  116. package/dist/components/pro/ArticleControl/ArticleControl2.js +250 -250
  117. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  118. package/dist/components/pro/ArticleControl/buildHeadingTree.js +31 -32
  119. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  120. package/dist/components/pro/ArticleControl/useArticleToc.js +100 -102
  121. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  122. package/dist/components/pro/Calendar/Calendar.d.ts +10 -0
  123. package/dist/components/pro/Calendar/hooks/useCalendarDrag.d.ts +47 -0
  124. package/dist/components/pro/Calendar/hooks/useCalendarState.d.ts +56 -0
  125. package/dist/components/pro/Calendar/index.d.ts +7 -0
  126. package/dist/components/pro/Calendar/types.d.ts +151 -0
  127. package/dist/components/pro/Calendar/utils.d.ts +94 -0
  128. package/dist/components/pro/Chat/Chat.d.ts +6 -0
  129. package/dist/components/pro/Chat/index.d.ts +2 -0
  130. package/dist/components/pro/Chat/types.d.ts +84 -0
  131. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +287 -327
  132. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  133. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -224
  134. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  135. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js +594 -613
  136. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  137. package/dist/components/pro/CodeEditor/extensions/contextMenu.js +54 -55
  138. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  139. package/dist/components/pro/CodeEditor/extensions/index.js +152 -160
  140. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  141. package/dist/components/pro/CodeEditor/langs/index.js +7 -15
  142. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  143. package/dist/components/pro/CodeEditor/langs/javascript.js +11 -48
  144. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  145. package/dist/components/pro/CodeEditor/langs/python.js +4 -40
  146. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  147. package/dist/components/pro/CodeEditor/langs/snippets.js +118 -147
  148. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  149. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js +153 -153
  150. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  151. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +180 -190
  152. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  153. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js +130 -137
  154. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  155. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js +228 -242
  156. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  157. package/dist/components/pro/CodeEditor/panels/VariablePanel.js +208 -248
  158. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  159. package/dist/components/pro/CodeEditor/themes.js +513 -483
  160. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  161. package/dist/components/pro/CodeEditor/types.d.ts +1 -1
  162. package/dist/components/pro/CodeEditor/utils.js +171 -175
  163. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  164. package/dist/components/pro/DataTable/DataTable.js +305 -306
  165. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  166. package/dist/components/pro/DataTable/Filters.js +299 -314
  167. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  168. package/dist/components/pro/DataTable/PivotPanel.js +203 -204
  169. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  170. package/dist/components/pro/DataTable/PivotView.js +142 -144
  171. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  172. package/dist/components/pro/DataTable/components/BulkActions.js +42 -42
  173. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  174. package/dist/components/pro/DataTable/components/ColumnSelector.js +84 -84
  175. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  176. package/dist/components/pro/DataTable/components/FilterBar.js +58 -58
  177. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  178. package/dist/components/pro/DataTable/components/TableBody.js +93 -94
  179. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  180. package/dist/components/pro/DataTable/components/TableHeader.js +78 -78
  181. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  182. package/dist/components/pro/DataTable/components/TablePagination.js +77 -77
  183. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  184. package/dist/components/pro/DataTable/components/TableToolbar.js +40 -40
  185. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  186. package/dist/components/pro/DataTable/extension.js +5 -5
  187. package/dist/components/pro/DataTable/extension.js.map +1 -1
  188. package/dist/components/pro/DataTable/pivotEngine.js +84 -92
  189. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  190. package/dist/components/pro/DataTable/pivotExtension.js +93 -93
  191. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  192. package/dist/components/pro/DataTable/rowDetailExtension.js +30 -30
  193. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  194. package/dist/components/pro/DataTable/tanstack-table.js +45 -62
  195. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  196. package/dist/components/pro/DataTable/treeDataUtils.js +37 -48
  197. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  198. package/dist/components/pro/DataTable/useColumnDragReorder.js +68 -68
  199. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  200. package/dist/components/pro/DataTable/utils.js +156 -168
  201. package/dist/components/pro/DataTable/utils.js.map +1 -1
  202. package/dist/components/pro/FileExplorer/Breadcrumb.js +180 -180
  203. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  204. package/dist/components/pro/FileExplorer/CreateDialog.js +78 -78
  205. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  206. package/dist/components/pro/FileExplorer/FileExplorer.js +202 -205
  207. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  208. package/dist/components/pro/FileExplorer/FileIcon.js +189 -189
  209. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  210. package/dist/components/pro/FileExplorer/GridView.js +100 -100
  211. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  212. package/dist/components/pro/FileExplorer/ListView.js +209 -209
  213. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  214. package/dist/components/pro/FileExplorer/Toolbar.js +199 -199
  215. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  216. package/dist/components/pro/Flow/Flow.js +920 -948
  217. package/dist/components/pro/Flow/Flow.js.map +1 -1
  218. package/dist/components/pro/Flow/FlowCanvas.js +1626 -1662
  219. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  220. package/dist/components/pro/Flow/archify/build.js +85 -94
  221. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  222. package/dist/components/pro/Flow/archify/convert.js +512 -519
  223. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  224. package/dist/components/pro/Flow/archify/palette.js +87 -104
  225. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  226. package/dist/components/pro/Flow/archify/presets.js +34 -37
  227. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  228. package/dist/components/pro/Flow/archify/spec.js +7 -7
  229. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  230. package/dist/components/pro/Flow/canvas/AlignmentGuides.js +25 -25
  231. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  232. package/dist/components/pro/Flow/canvas/GridRenderer.js +54 -55
  233. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  234. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +54 -58
  235. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  236. package/dist/components/pro/Flow/canvas/PixiApp.js +105 -102
  237. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  238. package/dist/components/pro/Flow/canvas/SelectionOverlay.js +38 -38
  239. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  240. package/dist/components/pro/Flow/canvas/ViewportContainer.js +117 -117
  241. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  242. package/dist/components/pro/Flow/constants.js +266 -278
  243. package/dist/components/pro/Flow/constants.js.map +1 -1
  244. package/dist/components/pro/Flow/context/FlowAIContext.js +27 -28
  245. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  246. package/dist/components/pro/Flow/context/FlowContext.js +60 -61
  247. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  248. package/dist/components/pro/Flow/context/FlowUIContext.js +115 -117
  249. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  250. package/dist/components/pro/Flow/edges/EdgeRenderer.js +135 -138
  251. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  252. package/dist/components/pro/Flow/edges/edgeMarkers.js +11 -14
  253. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  254. package/dist/components/pro/Flow/edges/edgePaths.js +351 -367
  255. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  256. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js +49 -52
  257. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  258. package/dist/components/pro/Flow/hooks/useClipboard.js +154 -154
  259. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  260. package/dist/components/pro/Flow/hooks/useCompactMode.js +17 -17
  261. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  262. package/dist/components/pro/Flow/hooks/useDeleteSelection.js +40 -40
  263. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  264. package/dist/components/pro/Flow/hooks/useDraggablePanel.js +51 -51
  265. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  266. package/dist/components/pro/Flow/hooks/useEdgeMutations.js +157 -157
  267. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  268. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +190 -201
  269. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  270. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js +32 -38
  271. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  272. package/dist/components/pro/Flow/hooks/useLayoutActions.js +172 -180
  273. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  274. package/dist/components/pro/Flow/hooks/useLineMutations.js +57 -57
  275. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  276. package/dist/components/pro/Flow/hooks/useMindMap.js +229 -238
  277. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  278. package/dist/components/pro/Flow/hooks/useNodeMutations.js +102 -102
  279. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  280. package/dist/components/pro/Flow/hooks/usePdfExport.js +55 -56
  281. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  282. package/dist/components/pro/Flow/hooks/usePixiApp.js +55 -57
  283. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  284. package/dist/components/pro/Flow/hooks/useResizablePanel.js +31 -31
  285. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  286. package/dist/components/pro/Flow/hooks/useSelection.js +69 -69
  287. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  288. package/dist/components/pro/Flow/hooks/useUndoRedo.js +27 -27
  289. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  290. package/dist/components/pro/Flow/hooks/useViewport.js +28 -28
  291. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  292. package/dist/components/pro/Flow/lines/FreehandTool.js +63 -63
  293. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  294. package/dist/components/pro/Flow/lines/GeometricLineTool.js +80 -80
  295. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  296. package/dist/components/pro/Flow/lines/LineRenderer.js +88 -88
  297. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  298. package/dist/components/pro/Flow/lines/lineSmoothing.js +32 -34
  299. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  300. package/dist/components/pro/Flow/nodes/DataNodeView.js +236 -242
  301. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  302. package/dist/components/pro/Flow/nodes/MediaContent.js +236 -246
  303. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  304. package/dist/components/pro/Flow/nodes/MediaOverlay.js +63 -63
  305. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  306. package/dist/components/pro/Flow/nodes/Model3DView.js +111 -113
  307. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  308. package/dist/components/pro/Flow/nodes/NodeHandles.js +74 -80
  309. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  310. package/dist/components/pro/Flow/nodes/NodeRenderer.js +303 -314
  311. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  312. package/dist/components/pro/Flow/nodes/NodeText.js +25 -29
  313. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  314. package/dist/components/pro/Flow/nodes/aiClient.js +124 -137
  315. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  316. package/dist/components/pro/Flow/nodes/animAnchors.js +42 -49
  317. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  318. package/dist/components/pro/Flow/nodes/dataUtils.js +246 -267
  319. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  320. package/dist/components/pro/Flow/nodes/nodeUtils.js +23 -28
  321. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  322. package/dist/components/pro/Flow/nodes/shapes.js +556 -589
  323. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  324. package/dist/components/pro/Flow/nodes/svgIconTexture.js +37 -39
  325. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  326. package/dist/components/pro/Flow/nodes/svgIcons.js +684 -689
  327. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  328. package/dist/components/pro/Flow/panels/AIPanel.js +464 -491
  329. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  330. package/dist/components/pro/Flow/panels/Breadcrumb.js +41 -41
  331. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  332. package/dist/components/pro/Flow/panels/ContextMenu.js +37 -37
  333. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  334. package/dist/components/pro/Flow/panels/DataInspectorSection.js +428 -432
  335. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  336. package/dist/components/pro/Flow/panels/ExpandableTextarea.js +61 -62
  337. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  338. package/dist/components/pro/Flow/panels/FlowPanelGroup.js +114 -114
  339. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  340. package/dist/components/pro/Flow/panels/FlowToolbar.js +347 -391
  341. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  342. package/dist/components/pro/Flow/panels/InspectorPanel.js +1792 -1798
  343. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  344. package/dist/components/pro/Flow/panels/OutlinePanel.js +242 -248
  345. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  346. package/dist/components/pro/Flow/panels/PresentationMode.js +137 -140
  347. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  348. package/dist/components/pro/Flow/panels/ProjectTitle.js +46 -46
  349. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  350. package/dist/components/pro/Flow/panels/ShapePalette.js +557 -572
  351. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  352. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +0 -1
  353. package/dist/components/pro/Flow/panels/toolbarIcons.js +508 -557
  354. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  355. package/dist/components/pro/Flow/types.js +26 -26
  356. package/dist/components/pro/Flow/types.js.map +1 -1
  357. package/dist/components/pro/Flow/utils/dashedLine.js +113 -117
  358. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  359. package/dist/components/pro/Flow/utils/gradient.js +55 -55
  360. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  361. package/dist/components/pro/Flow/utils/pdfExport.js +50 -89
  362. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  363. package/dist/components/pro/Flow/utils/themeColor.js +185 -195
  364. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  365. package/dist/components/pro/Gantt/Gantt.d.ts +7 -0
  366. package/dist/components/pro/Gantt/hooks/useGanttDrag.d.ts +31 -0
  367. package/dist/components/pro/Gantt/hooks/useGanttState.d.ts +58 -0
  368. package/dist/components/pro/Gantt/index.d.ts +6 -0
  369. package/dist/components/pro/Gantt/types.d.ts +478 -0
  370. package/dist/components/pro/Gantt/utils.d.ts +124 -0
  371. package/dist/components/pro/Resizable/Resizable.d.ts +30 -0
  372. package/dist/components/pro/Resizable/index.d.ts +2 -0
  373. package/dist/components/pro/RichTextEditor/AIRewrite.js +323 -334
  374. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  375. package/dist/components/pro/RichTextEditor/BlockHandle.js +314 -316
  376. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  377. package/dist/components/pro/RichTextEditor/BubbleToolbar.js +97 -97
  378. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  379. package/dist/components/pro/RichTextEditor/CommentDialog.js +88 -88
  380. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  381. package/dist/components/pro/RichTextEditor/CommentPanel.js +240 -240
  382. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  383. package/dist/components/pro/RichTextEditor/CommentPopover.js +234 -234
  384. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  385. package/dist/components/pro/RichTextEditor/ContextMenu.js +251 -252
  386. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  387. package/dist/components/pro/RichTextEditor/RichTextEditor.js +267 -271
  388. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  389. package/dist/components/pro/RichTextEditor/SlashMenu.js +214 -214
  390. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  391. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -75
  392. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  393. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +261 -261
  394. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  395. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +172 -526
  396. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  397. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js +112 -114
  398. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  399. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +194 -194
  400. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  401. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +970 -973
  402. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  403. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +11 -12
  404. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  405. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +310 -344
  406. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  407. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +38 -39
  408. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  409. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +620 -625
  410. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  411. package/dist/components/pro/RichTextEditor/extensions/FontSize.js +25 -25
  412. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  413. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +167 -176
  414. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  415. package/dist/components/pro/RichTextEditor/types.js +75 -75
  416. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  417. package/dist/contexts/AppContext.d.ts +1 -1
  418. package/dist/contexts/AppContext.js +216 -221
  419. package/dist/contexts/AppContext.js.map +1 -1
  420. package/dist/data-table.js +15 -41
  421. package/dist/data-table.js.map +1 -1
  422. package/dist/dishui.css +1 -1
  423. package/dist/flow.js +27 -83
  424. package/dist/hooks/useClickOutside.js +18 -18
  425. package/dist/hooks/useClickOutside.js.map +1 -1
  426. package/dist/hooks/useContainerElement.js +9 -9
  427. package/dist/hooks/useContainerElement.js.map +1 -1
  428. package/dist/hooks/useControllableState.js +33 -35
  429. package/dist/hooks/useControllableState.js.map +1 -1
  430. package/dist/hooks/useCopyToClipboard.js +16 -16
  431. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  432. package/dist/hooks/useDebounce.js +14 -14
  433. package/dist/hooks/useDebounce.js.map +1 -1
  434. package/dist/hooks/useDraggable.js +50 -50
  435. package/dist/hooks/useDraggable.js.map +1 -1
  436. package/dist/hooks/useTableColumns.js +39 -41
  437. package/dist/hooks/useTableColumns.js.map +1 -1
  438. package/dist/hooks/useTableData.js +67 -68
  439. package/dist/hooks/useTableData.js.map +1 -1
  440. package/dist/index-nostyled.d.ts +8 -0
  441. package/dist/index.d.ts +31 -3
  442. package/dist/index.js +106 -241
  443. package/dist/layouts/MainLayout.js +56 -56
  444. package/dist/layouts/MainLayout.js.map +1 -1
  445. package/dist/layouts/Navbar.js +214 -214
  446. package/dist/layouts/Navbar.js.map +1 -1
  447. package/dist/layouts/Sidebar.js +184 -186
  448. package/dist/layouts/Sidebar.js.map +1 -1
  449. package/dist/layouts/headbar/Headbar.js +25 -25
  450. package/dist/layouts/headbar/Headbar.js.map +1 -1
  451. package/dist/layouts/headbar/HeadbarLangSwitcher.js +39 -39
  452. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  453. package/dist/layouts/headbar/HeadbarSearch.js +120 -120
  454. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  455. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +27 -27
  456. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  457. package/dist/layouts/headbar/HeadbarTitle.js +26 -26
  458. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  459. package/dist/lite.js +9 -24
  460. package/dist/markdown.js +4 -9
  461. package/dist/pages/components/Calendar/index.d.ts +3 -0
  462. package/dist/pages/components/Calendar/index.en.d.ts +3 -0
  463. package/dist/pages/components/Calendar/index.zh.d.ts +3 -0
  464. package/dist/pages/components/Chat/index.d.ts +3 -0
  465. package/dist/pages/components/Chat/index.en.d.ts +3 -0
  466. package/dist/pages/components/Chat/index.zh.d.ts +3 -0
  467. package/dist/pages/components/FloatWindow/index.d.ts +3 -0
  468. package/dist/pages/components/FloatWindow/index.en.d.ts +3 -0
  469. package/dist/pages/components/FloatWindow/index.zh.d.ts +3 -0
  470. package/dist/pages/components/Gantt/index.d.ts +3 -0
  471. package/dist/pages/components/Gantt/index.en.d.ts +3 -0
  472. package/dist/pages/components/Gantt/index.zh.d.ts +3 -0
  473. package/dist/pages/components/GridLayout/index.d.ts +3 -0
  474. package/dist/pages/components/GridLayout/index.en.d.ts +3 -0
  475. package/dist/pages/components/GridLayout/index.zh.d.ts +3 -0
  476. package/dist/pages/components/Notification/index.d.ts +3 -0
  477. package/dist/pages/components/Notification/index.en.d.ts +3 -0
  478. package/dist/pages/components/Notification/index.zh.d.ts +3 -0
  479. package/dist/pages/components/Resizable/index.d.ts +3 -0
  480. package/dist/pages/components/Resizable/index.en.d.ts +3 -0
  481. package/dist/pages/components/Resizable/index.zh.d.ts +3 -0
  482. package/dist/pages/components/Tab/index.d.ts +3 -0
  483. package/dist/pages/components/Tab/index.en.d.ts +3 -0
  484. package/dist/pages/components/Tab/index.zh.d.ts +3 -0
  485. package/dist/styles/themeStyles.js +87 -86
  486. package/dist/styles/themeStyles.js.map +1 -1
  487. package/dist/utils/cn.d.ts +13 -0
  488. package/dist/utils/cn.js +16 -0
  489. package/dist/utils/cn.js.map +1 -0
  490. package/dist/utils/i18n.js +700 -602
  491. package/dist/utils/i18n.js.map +1 -1
  492. package/dist/utils/menu.js +94 -94
  493. package/dist/utils/menu.js.map +1 -1
  494. package/dist/utils/rehype-code-meta.js +14 -14
  495. package/dist/utils/rehype-code-meta.js.map +1 -1
  496. package/dist/utils/remark-code-meta.js +9 -9
  497. package/dist/utils/remark-code-meta.js.map +1 -1
  498. package/dist/utils/routerBuilder.js +59 -60
  499. package/dist/utils/routerBuilder.js.map +1 -1
  500. package/dist/utils/selection.js +28 -29
  501. package/dist/utils/selection.js.map +1 -1
  502. package/dist/utils/themes.js +275 -255
  503. package/dist/utils/themes.js.map +1 -1
  504. package/package.json +19 -6
  505. package/dist/components/StatCard/index.d.ts +0 -24
  506. package/dist/components/StatCard/index.js +0 -90
  507. package/dist/components/StatCard/index.js.map +0 -1
@@ -1,209 +1,198 @@
1
- import { ROOT_CANVAS_ID as $, createEmptyDocument as x } from "../constants.js";
2
- import { useFlowContext as C } from "../context/FlowContext.js";
3
- import { generateId as O } from "../nodes/nodeUtils.js";
4
- import { isArchifySpec as M } from "../archify/spec.js";
5
- import { archifyToFlowDocument as S } from "../archify/convert.js";
6
- import { useCallback as b } from "react";
7
- var R = 1;
8
- function j(n, o = "flowchart") {
9
- return (n ?? "").trim().replace(/[\\/:*?"<>|]+/g, "-").replace(/\s+/g, " ").trim() || o;
1
+ import { ROOT_CANVAS_ID as e, createEmptyDocument as t } from "../constants.js";
2
+ import { useFlowContext as n } from "../context/FlowContext.js";
3
+ import { generateId as r } from "../nodes/nodeUtils.js";
4
+ import { isArchifySpec as i } from "../archify/spec.js";
5
+ import { archifyToFlowDocument as a } from "../archify/convert.js";
6
+ import { useCallback as o } from "react";
7
+ //#region src/components/pro/Flow/hooks/useFlowImportExport.ts
8
+ var s = 1;
9
+ function c(e, t = "flowchart") {
10
+ return (e ?? "").trim().replace(/[\\/:*?"<>|]+/g, "-").replace(/\s+/g, " ").trim() || t;
10
11
  }
11
- function z() {
12
- const { doc: n, setDoc: o } = C();
13
- return {
14
- exportJSON: b(() => {
15
- const e = {
16
- version: R,
17
- canvases: n.canvases,
18
- stack: n.stack,
19
- title: n.title
20
- };
21
- return JSON.stringify(e, null, 2);
22
- }, [n]),
23
- importJSON: b((e) => {
24
- try {
25
- const s = JSON.parse(e);
26
- if (M(s)) {
27
- o(S(s));
28
- return;
29
- }
30
- const i = s;
31
- if (!i.canvases || !i.stack) throw new Error("Invalid document format");
32
- o({
33
- canvases: i.canvases,
34
- stack: i.stack,
35
- title: i.title
36
- });
37
- } catch (s) {
38
- console.error("Failed to import JSON:", s);
39
- }
40
- }, [o]),
41
- importArchify: b((e) => {
42
- try {
43
- const s = typeof e == "string" ? JSON.parse(e) : e;
44
- return M(s) ? (o(S(s)), !0) : !1;
45
- } catch (s) {
46
- return console.error("Failed to import Archify spec:", s), !1;
47
- }
48
- }, [o]),
49
- importMermaid: b((e) => {
50
- const s = L(e);
51
- o(s);
52
- }, [o]),
53
- exportMarkdown: b(() => E(n), [n]),
54
- clearDocument: b(() => {
55
- o(x());
56
- }, [o])
57
- };
12
+ function l() {
13
+ let { doc: e, setDoc: r } = n();
14
+ return {
15
+ exportJSON: o(() => {
16
+ let t = {
17
+ version: s,
18
+ canvases: e.canvases,
19
+ stack: e.stack,
20
+ title: e.title
21
+ };
22
+ return JSON.stringify(t, null, 2);
23
+ }, [e]),
24
+ importJSON: o((e) => {
25
+ try {
26
+ let t = JSON.parse(e);
27
+ if (i(t)) {
28
+ r(a(t));
29
+ return;
30
+ }
31
+ let n = t;
32
+ if (!n.canvases || !n.stack) throw Error("Invalid document format");
33
+ r({
34
+ canvases: n.canvases,
35
+ stack: n.stack,
36
+ title: n.title
37
+ });
38
+ } catch (e) {
39
+ console.error("Failed to import JSON:", e);
40
+ }
41
+ }, [r]),
42
+ importArchify: o((e) => {
43
+ try {
44
+ let t = typeof e == "string" ? JSON.parse(e) : e;
45
+ return i(t) ? (r(a(t)), !0) : !1;
46
+ } catch (e) {
47
+ return console.error("Failed to import Archify spec:", e), !1;
48
+ }
49
+ }, [r]),
50
+ importMermaid: o((e) => {
51
+ let t = d(e);
52
+ r(t);
53
+ }, [r]),
54
+ exportMarkdown: o(() => u(e), [e]),
55
+ clearDocument: o(() => {
56
+ r(t());
57
+ }, [r])
58
+ };
58
59
  }
59
- function E(n) {
60
- const o = [], e = (c) => {
61
- const f = (c.data.label ?? "").trim();
62
- return f ? f.replace(/\s+/g, " ") : c.type === "mediaNode" ? `(${c.data.mediaKind ?? "media"})` : `(${c.type})`;
63
- }, s = (c, f, h) => {
64
- const m = n.canvases[c];
65
- if (!m) return;
66
- const y = new Map(m.nodes.map((t) => [t.id, t])), a = /* @__PURE__ */ new Map();
67
- for (const t of m.nodes) {
68
- const r = t.parentId && y.has(t.parentId) ? t.parentId : void 0, d = a.get(r) ?? [];
69
- d.push(t), a.set(r, d);
70
- }
71
- const p = (t, r) => {
72
- const d = " ".repeat(r), l = t.data.isGroup || t.type === "flowGroup" || t.type === "geometryGroup" ? `**${e(t)}**` : e(t);
73
- if (o.push(`${d}- ${l}`), t.type === "mediaNode" && t.data.mediaKind) {
74
- const g = t.data.mediaKind;
75
- if (g === "data" && t.data.dataConfig) {
76
- const k = t.data.dataConfig, N = k.columns.map((I) => I.label ?? I.key).join(", ");
77
- o.push(`${d} - 数据表:${k.rows.length} 行 · 列(${N})`);
78
- } else if (t.data.mediaContent && g !== "image" && g !== "model3d") {
79
- const k = t.data.mediaContent.trim().split(`
80
- `)[0].slice(0, 80);
81
- k && o.push(`${d} - ${g}: ${k}`);
82
- }
83
- }
84
- const v = a.get(t.id) ?? [];
85
- for (const g of v) p(g, r + 1);
86
- const w = t.data.childCanvasId;
87
- w && n.canvases[w] && !h.has(w) && (h.add(w), s(w, f + 1, h));
88
- }, u = a.get(void 0) ?? [];
89
- for (const t of u) p(t, 0);
90
- if (m.edges.length > 0) {
91
- o.push(""), o.push(`${"#".repeat(Math.min(6, f + 1))} 连接关系`);
92
- for (const t of m.edges) {
93
- const r = y.get(t.source), d = y.get(t.target);
94
- if (!r || !d) continue;
95
- const l = t.data.labelText ? ` (${t.data.labelText})` : "";
96
- o.push(`- ${e(r)} → ${e(d)}${l}`);
97
- }
98
- }
99
- }, i = /* @__PURE__ */ new Set([$]);
100
- o.push("# 流程图"), o.push(""), s($, 1, i);
101
- for (const c of Object.keys(n.canvases))
102
- i.has(c) || (i.add(c), o.push(""), o.push(`## 画布 ${c}`), o.push(""), s(c, 2, i));
103
- return o.join(`
104
- `).replace(/\n{3,}/g, `
105
-
106
- `).trim() + `
107
- `;
60
+ function u(t) {
61
+ let n = [], r = (e) => {
62
+ let t = (e.data.label ?? "").trim();
63
+ return t ? t.replace(/\s+/g, " ") : e.type === "mediaNode" ? `(${e.data.mediaKind ?? "media"})` : `(${e.type})`;
64
+ }, i = (e, a, o) => {
65
+ let s = t.canvases[e];
66
+ if (!s) return;
67
+ let c = new Map(s.nodes.map((e) => [e.id, e])), l = /* @__PURE__ */ new Map();
68
+ for (let e of s.nodes) {
69
+ let t = e.parentId && c.has(e.parentId) ? e.parentId : void 0, n = l.get(t) ?? [];
70
+ n.push(e), l.set(t, n);
71
+ }
72
+ let u = (e, s) => {
73
+ let c = " ".repeat(s), d = e.data.isGroup || e.type === "flowGroup" || e.type === "geometryGroup" ? `**${r(e)}**` : r(e);
74
+ if (n.push(`${c}- ${d}`), e.type === "mediaNode" && e.data.mediaKind) {
75
+ let t = e.data.mediaKind;
76
+ if (t === "data" && e.data.dataConfig) {
77
+ let t = e.data.dataConfig, r = t.columns.map((e) => e.label ?? e.key).join(", ");
78
+ n.push(`${c} - 数据表:${t.rows.length} 行 · 列(${r})`);
79
+ } else if (e.data.mediaContent && t !== "image" && t !== "model3d") {
80
+ let r = e.data.mediaContent.trim().split("\n")[0].slice(0, 80);
81
+ r && n.push(`${c} - ${t}: ${r}`);
82
+ }
83
+ }
84
+ let f = l.get(e.id) ?? [];
85
+ for (let e of f) u(e, s + 1);
86
+ let p = e.data.childCanvasId;
87
+ p && t.canvases[p] && !o.has(p) && (o.add(p), i(p, a + 1, o));
88
+ }, d = l.get(void 0) ?? [];
89
+ for (let e of d) u(e, 0);
90
+ if (s.edges.length > 0) {
91
+ n.push(""), n.push(`${"#".repeat(Math.min(6, a + 1))} 连接关系`);
92
+ for (let e of s.edges) {
93
+ let t = c.get(e.source), i = c.get(e.target);
94
+ if (!t || !i) continue;
95
+ let a = e.data.labelText ? ` (${e.data.labelText})` : "";
96
+ n.push(`- ${r(t)} → ${r(i)}${a}`);
97
+ }
98
+ }
99
+ }, a = /* @__PURE__ */ new Set([e]);
100
+ n.push("# 流程图"), n.push(""), i(e, 1, a);
101
+ for (let e of Object.keys(t.canvases)) a.has(e) || (a.add(e), n.push(""), n.push(`## 画布 ${e}`), n.push(""), i(e, 2, a));
102
+ return n.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
108
103
  }
109
- function L(n) {
110
- const o = n.split(`
111
- `).map((a) => a.trim()).filter((a) => a && !a.startsWith("%%")), e = /* @__PURE__ */ new Map(), s = [];
112
- let i = !1;
113
- for (const a of o) {
114
- if (/^(graph|flowchart)\s+(LR|RL)/i.test(a)) {
115
- i = !0;
116
- continue;
117
- }
118
- if (/^(graph|flowchart)\s+/i.test(a)) continue;
119
- const p = a.match(/^(\w+)(?:\[([^\]]*)\])?\s*(-->|---|-\.->|==>)(?:\|([^|]*)\|)?\s*(\w+)(?:\[([^\]]*)\])?/);
120
- if (p) {
121
- const [, t, r, , d, l, v] = p;
122
- r && !e.has(t) && e.set(t, {
123
- id: t,
124
- label: r
125
- }), v && !e.has(l) && e.set(l, {
126
- id: l,
127
- label: v
128
- }), e.has(t) || e.set(t, {
129
- id: t,
130
- label: t
131
- }), e.has(l) || e.set(l, {
132
- id: l,
133
- label: l
134
- }), s.push({
135
- from: t,
136
- to: l,
137
- label: d?.trim()
138
- });
139
- continue;
140
- }
141
- const u = a.match(/^(\w+)\[([^\]]*)\]/);
142
- if (u) {
143
- const [, t, r] = u;
144
- e.has(t) || e.set(t, {
145
- id: t,
146
- label: r
147
- });
148
- }
149
- }
150
- const c = [...e.keys()], f = i ? c.length : Math.ceil(Math.sqrt(c.length)), h = {
151
- x: 200,
152
- y: 120
153
- }, m = c.map((a, p) => {
154
- const u = p % f, t = Math.floor(p / f), r = e.get(a);
155
- return {
156
- id: r.id,
157
- type: "shapeRoundRect",
158
- position: {
159
- x: 100 + u * h.x,
160
- y: 100 + t * h.y
161
- },
162
- width: 140,
163
- height: 60,
164
- data: {
165
- label: r.label,
166
- fill: "theme:base-100",
167
- stroke: "theme:base-content",
168
- strokeWidth: 2,
169
- color: "theme:base-content",
170
- fontSize: 14
171
- }
172
- };
173
- }), y = s.map((a) => ({
174
- id: O("edge"),
175
- source: a.from,
176
- target: a.to,
177
- type: "smoothstep",
178
- data: {
179
- strokeColor: "theme:base-content",
180
- strokeWidth: 2,
181
- lineStyle: "solid",
182
- markerEnd: "arrowclosed",
183
- labelText: a.label
184
- }
185
- }));
186
- return {
187
- canvases: { [$]: {
188
- nodes: m,
189
- edges: y,
190
- lines: []
191
- } },
192
- stack: [$]
193
- };
104
+ function d(t) {
105
+ let n = t.split("\n").map((e) => e.trim()).filter((e) => e && !e.startsWith("%%")), i = /* @__PURE__ */ new Map(), a = [], o = !1;
106
+ for (let e of n) {
107
+ if (/^(graph|flowchart)\s+(LR|RL)/i.test(e)) {
108
+ o = !0;
109
+ continue;
110
+ }
111
+ if (/^(graph|flowchart)\s+/i.test(e)) continue;
112
+ let t = e.match(/^(\w+)(?:\[([^\]]*)\])?\s*(-->|---|-\.->|==>)(?:\|([^|]*)\|)?\s*(\w+)(?:\[([^\]]*)\])?/);
113
+ if (t) {
114
+ let [, e, n, , r, o, s] = t;
115
+ n && !i.has(e) && i.set(e, {
116
+ id: e,
117
+ label: n
118
+ }), s && !i.has(o) && i.set(o, {
119
+ id: o,
120
+ label: s
121
+ }), i.has(e) || i.set(e, {
122
+ id: e,
123
+ label: e
124
+ }), i.has(o) || i.set(o, {
125
+ id: o,
126
+ label: o
127
+ }), a.push({
128
+ from: e,
129
+ to: o,
130
+ label: r?.trim()
131
+ });
132
+ continue;
133
+ }
134
+ let n = e.match(/^(\w+)\[([^\]]*)\]/);
135
+ if (n) {
136
+ let [, e, t] = n;
137
+ i.has(e) || i.set(e, {
138
+ id: e,
139
+ label: t
140
+ });
141
+ }
142
+ }
143
+ let s = [...i.keys()], c = o ? s.length : Math.ceil(Math.sqrt(s.length)), l = {
144
+ x: 200,
145
+ y: 120
146
+ }, u = s.map((e, t) => {
147
+ let n = t % c, r = Math.floor(t / c), a = i.get(e);
148
+ return {
149
+ id: a.id,
150
+ type: "shapeRoundRect",
151
+ position: {
152
+ x: 100 + n * l.x,
153
+ y: 100 + r * l.y
154
+ },
155
+ width: 140,
156
+ height: 60,
157
+ data: {
158
+ label: a.label,
159
+ fill: "theme:base-100",
160
+ stroke: "theme:base-content",
161
+ strokeWidth: 2,
162
+ color: "theme:base-content",
163
+ fontSize: 14
164
+ }
165
+ };
166
+ }), d = a.map((e) => ({
167
+ id: r("edge"),
168
+ source: e.from,
169
+ target: e.to,
170
+ type: "smoothstep",
171
+ data: {
172
+ strokeColor: "theme:base-content",
173
+ strokeWidth: 2,
174
+ lineStyle: "solid",
175
+ markerEnd: "arrowclosed",
176
+ labelText: e.label
177
+ }
178
+ }));
179
+ return {
180
+ canvases: { [e]: {
181
+ nodes: u,
182
+ edges: d,
183
+ lines: []
184
+ } },
185
+ stack: [e]
186
+ };
194
187
  }
195
- async function K(n) {
196
- return n.toDataURL("image/png");
188
+ async function f(e) {
189
+ return e.toDataURL("image/png");
197
190
  }
198
- function W(n, o) {
199
- const e = document.createElement("a");
200
- e.href = n, e.download = o, document.body.appendChild(e), e.click(), document.body.removeChild(e);
191
+ function p(e, t) {
192
+ let n = document.createElement("a");
193
+ n.href = e, n.download = t, document.body.appendChild(n), n.click(), document.body.removeChild(n);
201
194
  }
202
- export {
203
- W as downloadDataURL,
204
- K as exportCanvasToPNG,
205
- j as safeFileBaseName,
206
- z as useFlowImportExport
207
- };
195
+ //#endregion
196
+ export { p as downloadDataURL, f as exportCanvasToPNG, c as safeFileBaseName, l as useFlowImportExport };
208
197
 
209
198
  //# sourceMappingURL=useFlowImportExport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFlowImportExport.js","names":[],"sources":["../../../../../src/components/pro/Flow/hooks/useFlowImportExport.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\nimport type { FlowDocument, FlowCanvasData, FlowNode, FlowEdge, FlowLine } from '../types';\nimport { createEmptyDocument, ROOT_CANVAS_ID } from '../constants';\nimport { generateId } from '../nodes/nodeUtils';\nimport { isArchifySpec, archifyToFlowDocument } from '../archify';\n\nconst PERSIST_VERSION = 1;\n\ninterface SerializedDocument {\n version: number;\n canvases: Record<string, FlowCanvasData>;\n stack: string[];\n title?: string;\n}\n\n/**\n * Sanitize a project title into a safe file base name, falling back to a\n * default when empty. Shared by all export paths so filenames stay consistent.\n */\nexport function safeFileBaseName(title: string | undefined, fallback = 'flowchart'): string {\n const name = (title ?? '').trim().replace(/[\\\\/:*?\"<>|]+/g, '-').replace(/\\s+/g, ' ').trim();\n return name || fallback;\n}\n\n/**\n * Serialize/deserialize FlowDocument to/from JSON.\n * Also includes Mermaid flowchart import.\n */\nexport function useFlowImportExport() {\n const { doc, setDoc } = useFlowContext();\n\n const exportJSON = useCallback((): string => {\n const serialized: SerializedDocument = {\n version: PERSIST_VERSION,\n canvases: doc.canvases,\n stack: doc.stack,\n title: doc.title,\n };\n return JSON.stringify(serialized, null, 2);\n }, [doc]);\n\n const importJSON = useCallback((json: string) => {\n try {\n const parsed = JSON.parse(json) as unknown;\n // Auto-detect an Archify spec and convert it to a Flow document so the\n // same \"import JSON\" entry point accepts both native and Archify files.\n if (isArchifySpec(parsed)) {\n setDoc(archifyToFlowDocument(parsed));\n return;\n }\n const doc = parsed as SerializedDocument;\n if (!doc.canvases || !doc.stack) throw new Error('Invalid document format');\n setDoc({\n canvases: doc.canvases,\n stack: doc.stack,\n title: doc.title,\n });\n } catch (err) {\n console.error('Failed to import JSON:', err);\n }\n }, [setDoc]);\n\n /**\n * Import an Archify diagram spec (architecture / workflow / sequence /\n * dataflow / lifecycle), converting it to a native Flow document. Accepts a\n * JSON string or an already-parsed object. Returns true on success.\n */\n const importArchify = useCallback((input: string | object): boolean => {\n try {\n const spec = typeof input === 'string' ? JSON.parse(input) : input;\n if (!isArchifySpec(spec)) return false;\n setDoc(archifyToFlowDocument(spec));\n return true;\n } catch (err) {\n console.error('Failed to import Archify spec:', err);\n return false;\n }\n }, [setDoc]);\n\n const importMermaid = useCallback((mermaidCode: string) => {\n const doc = parseMermaidFlowchart(mermaidCode);\n setDoc(doc);\n }, [setDoc]);\n\n const exportMarkdown = useCallback((): string => {\n return documentToMarkdown(doc);\n }, [doc]);\n\n const clearDocument = useCallback(() => {\n setDoc(createEmptyDocument());\n }, [setDoc]);\n\n return { exportJSON, importJSON, importArchify, importMermaid, exportMarkdown, clearDocument };\n}\n\n/**\n * Render a FlowDocument as a Markdown outline describing the node hierarchy\n * and connections. Groups become sections with their children nested beneath;\n * edges are listed as a connection summary per canvas. Sub-canvases (drill-down\n * nodes) are rendered as nested sections.\n */\nfunction documentToMarkdown(doc: FlowDocument): string {\n const lines: string[] = [];\n\n const nodeLabel = (n: FlowNode): string => {\n const raw = (n.data.label ?? '').trim();\n if (raw) return raw.replace(/\\s+/g, ' ');\n if (n.type === 'mediaNode') return `(${n.data.mediaKind ?? 'media'})`;\n return `(${n.type})`;\n };\n\n const renderCanvas = (canvasId: string, headingLevel: number, seenCanvases: Set<string>) => {\n const canvas = doc.canvases[canvasId];\n if (!canvas) return;\n\n // Index nodes by id and by parent for hierarchy traversal.\n const byId = new Map(canvas.nodes.map((n) => [n.id, n]));\n const childrenOf = new Map<string | undefined, FlowNode[]>();\n for (const n of canvas.nodes) {\n const key = n.parentId && byId.has(n.parentId) ? n.parentId : undefined;\n const list = childrenOf.get(key) ?? [];\n list.push(n);\n childrenOf.set(key, list);\n }\n\n const emitNode = (node: FlowNode, depth: number) => {\n const indent = ' '.repeat(depth);\n const isGroup = node.data.isGroup || node.type === 'flowGroup' || node.type === 'geometryGroup';\n const bullet = isGroup ? `**${nodeLabel(node)}**` : nodeLabel(node);\n lines.push(`${indent}- ${bullet}`);\n\n // Media content (markdown/data/etc.) as a short description line.\n if (node.type === 'mediaNode' && node.data.mediaKind) {\n const kind = node.data.mediaKind;\n if (kind === 'data' && node.data.dataConfig) {\n const cfg = node.data.dataConfig;\n const cols = cfg.columns.map((c) => c.label ?? c.key).join(', ');\n lines.push(`${indent} - 数据表:${cfg.rows.length} 行 · 列(${cols})`);\n } else if (node.data.mediaContent && kind !== 'image' && kind !== 'model3d') {\n const preview = node.data.mediaContent.trim().split('\\n')[0].slice(0, 80);\n if (preview) lines.push(`${indent} - ${kind}: ${preview}`);\n }\n }\n\n // Recurse into visual group children.\n const kids = childrenOf.get(node.id) ?? [];\n for (const kid of kids) emitNode(kid, depth + 1);\n\n // Recurse into a drill-down sub-canvas, if any.\n const childCanvasId = node.data.childCanvasId;\n if (childCanvasId && doc.canvases[childCanvasId] && !seenCanvases.has(childCanvasId)) {\n seenCanvases.add(childCanvasId);\n renderCanvas(childCanvasId, headingLevel + 1, seenCanvases);\n }\n };\n\n const roots = childrenOf.get(undefined) ?? [];\n for (const root of roots) emitNode(root, 0);\n\n // Connections summary.\n if (canvas.edges.length > 0) {\n lines.push('');\n lines.push(`${'#'.repeat(Math.min(6, headingLevel + 1))} 连接关系`);\n for (const edge of canvas.edges) {\n const from = byId.get(edge.source);\n const to = byId.get(edge.target);\n if (!from || !to) continue;\n const edgeLabel = edge.data.labelText ? ` (${edge.data.labelText})` : '';\n lines.push(`- ${nodeLabel(from)} → ${nodeLabel(to)}${edgeLabel}`);\n }\n }\n };\n\n const seen = new Set<string>([ROOT_CANVAS_ID]);\n lines.push('# 流程图');\n lines.push('');\n renderCanvas(ROOT_CANVAS_ID, 1, seen);\n\n // Any orphan canvases not reached via drill-down nodes.\n for (const canvasId of Object.keys(doc.canvases)) {\n if (seen.has(canvasId)) continue;\n seen.add(canvasId);\n lines.push('');\n lines.push(`## 画布 ${canvasId}`);\n lines.push('');\n renderCanvas(canvasId, 2, seen);\n }\n\n return lines.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n';\n}\n\n/**\n * Simple Mermaid flowchart parser.\n * Handles basic `graph TD` / `flowchart LR` syntax with node definitions and edges.\n */\nfunction parseMermaidFlowchart(code: string): FlowDocument {\n const lines = code.split('\\n').map(l => l.trim()).filter(l => l && !l.startsWith('%%'));\n\n const nodeMap = new Map<string, { id: string; label: string }>();\n const edges: Array<{ from: string; to: string; label?: string }> = [];\n\n let isHorizontal = false;\n\n for (const line of lines) {\n // Detect direction\n if (/^(graph|flowchart)\\s+(LR|RL)/i.test(line)) {\n isHorizontal = true;\n continue;\n }\n if (/^(graph|flowchart)\\s+/i.test(line)) continue;\n\n // Edge patterns: A --> B, A -->|label| B, A --- B\n const edgeMatch = line.match(/^(\\w+)(?:\\[([^\\]]*)\\])?\\s*(-->|---|-\\.->|==>)(?:\\|([^|]*)\\|)?\\s*(\\w+)(?:\\[([^\\]]*)\\])?/);\n if (edgeMatch) {\n const [, fromId, fromLabel, , edgeLabel, toId, toLabel] = edgeMatch;\n if (fromLabel && !nodeMap.has(fromId)) nodeMap.set(fromId, { id: fromId, label: fromLabel });\n if (toLabel && !nodeMap.has(toId)) nodeMap.set(toId, { id: toId, label: toLabel });\n if (!nodeMap.has(fromId)) nodeMap.set(fromId, { id: fromId, label: fromId });\n if (!nodeMap.has(toId)) nodeMap.set(toId, { id: toId, label: toId });\n edges.push({ from: fromId, to: toId, label: edgeLabel?.trim() });\n continue;\n }\n\n // Standalone node: A[Label]\n const nodeMatch = line.match(/^(\\w+)\\[([^\\]]*)\\]/);\n if (nodeMatch) {\n const [, id, label] = nodeMatch;\n if (!nodeMap.has(id)) nodeMap.set(id, { id, label });\n }\n }\n\n // Layout: simple grid placement\n const nodeIds = [...nodeMap.keys()];\n const cols = isHorizontal ? nodeIds.length : Math.ceil(Math.sqrt(nodeIds.length));\n const spacing = { x: 200, y: 120 };\n\n const nodes: FlowNode[] = nodeIds.map((id, i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n const data = nodeMap.get(id)!;\n return {\n id: data.id,\n type: 'shapeRoundRect' as const,\n position: { x: 100 + col * spacing.x, y: 100 + row * spacing.y },\n width: 140,\n height: 60,\n data: {\n label: data.label,\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 2,\n color: 'theme:base-content',\n fontSize: 14,\n },\n };\n });\n\n const flowEdges: FlowEdge[] = edges.map((e) => ({\n id: generateId('edge'),\n source: e.from,\n target: e.to,\n type: 'smoothstep' as const,\n data: {\n strokeColor: 'theme:base-content',\n strokeWidth: 2,\n lineStyle: 'solid' as const,\n markerEnd: 'arrowclosed' as const,\n labelText: e.label,\n },\n }));\n\n return {\n canvases: {\n [ROOT_CANVAS_ID]: { nodes, edges: flowEdges, lines: [] },\n },\n stack: [ROOT_CANVAS_ID],\n };\n}\n\n/**\n * Export the PixiJS canvas as PNG data URL.\n */\nexport async function exportCanvasToPNG(canvas: HTMLCanvasElement): Promise<string> {\n return canvas.toDataURL('image/png');\n}\n\n/**\n * Download a data URL as a file.\n */\nexport function downloadDataURL(dataUrl: string, filename: string): void {\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useFlowImportExport.js","names":[],"sources":["../../../../../src/components/pro/Flow/hooks/useFlowImportExport.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\nimport type { FlowDocument, FlowCanvasData, FlowNode, FlowEdge, FlowLine } from '../types';\nimport { createEmptyDocument, ROOT_CANVAS_ID } from '../constants';\nimport { generateId } from '../nodes/nodeUtils';\nimport { isArchifySpec, archifyToFlowDocument } from '../archify';\n\nconst PERSIST_VERSION = 1;\n\ninterface SerializedDocument {\n version: number;\n canvases: Record<string, FlowCanvasData>;\n stack: string[];\n title?: string;\n}\n\n/**\n * Sanitize a project title into a safe file base name, falling back to a\n * default when empty. Shared by all export paths so filenames stay consistent.\n */\nexport function safeFileBaseName(title: string | undefined, fallback = 'flowchart'): string {\n const name = (title ?? '').trim().replace(/[\\\\/:*?\"<>|]+/g, '-').replace(/\\s+/g, ' ').trim();\n return name || fallback;\n}\n\n/**\n * Serialize/deserialize FlowDocument to/from JSON.\n * Also includes Mermaid flowchart import.\n */\nexport function useFlowImportExport() {\n const { doc, setDoc } = useFlowContext();\n\n const exportJSON = useCallback((): string => {\n const serialized: SerializedDocument = {\n version: PERSIST_VERSION,\n canvases: doc.canvases,\n stack: doc.stack,\n title: doc.title,\n };\n return JSON.stringify(serialized, null, 2);\n }, [doc]);\n\n const importJSON = useCallback((json: string) => {\n try {\n const parsed = JSON.parse(json) as unknown;\n // Auto-detect an Archify spec and convert it to a Flow document so the\n // same \"import JSON\" entry point accepts both native and Archify files.\n if (isArchifySpec(parsed)) {\n setDoc(archifyToFlowDocument(parsed));\n return;\n }\n const doc = parsed as SerializedDocument;\n if (!doc.canvases || !doc.stack) throw new Error('Invalid document format');\n setDoc({\n canvases: doc.canvases,\n stack: doc.stack,\n title: doc.title,\n });\n } catch (err) {\n console.error('Failed to import JSON:', err);\n }\n }, [setDoc]);\n\n /**\n * Import an Archify diagram spec (architecture / workflow / sequence /\n * dataflow / lifecycle), converting it to a native Flow document. Accepts a\n * JSON string or an already-parsed object. Returns true on success.\n */\n const importArchify = useCallback((input: string | object): boolean => {\n try {\n const spec = typeof input === 'string' ? JSON.parse(input) : input;\n if (!isArchifySpec(spec)) return false;\n setDoc(archifyToFlowDocument(spec));\n return true;\n } catch (err) {\n console.error('Failed to import Archify spec:', err);\n return false;\n }\n }, [setDoc]);\n\n const importMermaid = useCallback((mermaidCode: string) => {\n const doc = parseMermaidFlowchart(mermaidCode);\n setDoc(doc);\n }, [setDoc]);\n\n const exportMarkdown = useCallback((): string => {\n return documentToMarkdown(doc);\n }, [doc]);\n\n const clearDocument = useCallback(() => {\n setDoc(createEmptyDocument());\n }, [setDoc]);\n\n return { exportJSON, importJSON, importArchify, importMermaid, exportMarkdown, clearDocument };\n}\n\n/**\n * Render a FlowDocument as a Markdown outline describing the node hierarchy\n * and connections. Groups become sections with their children nested beneath;\n * edges are listed as a connection summary per canvas. Sub-canvases (drill-down\n * nodes) are rendered as nested sections.\n */\nfunction documentToMarkdown(doc: FlowDocument): string {\n const lines: string[] = [];\n\n const nodeLabel = (n: FlowNode): string => {\n const raw = (n.data.label ?? '').trim();\n if (raw) return raw.replace(/\\s+/g, ' ');\n if (n.type === 'mediaNode') return `(${n.data.mediaKind ?? 'media'})`;\n return `(${n.type})`;\n };\n\n const renderCanvas = (canvasId: string, headingLevel: number, seenCanvases: Set<string>) => {\n const canvas = doc.canvases[canvasId];\n if (!canvas) return;\n\n // Index nodes by id and by parent for hierarchy traversal.\n const byId = new Map(canvas.nodes.map((n) => [n.id, n]));\n const childrenOf = new Map<string | undefined, FlowNode[]>();\n for (const n of canvas.nodes) {\n const key = n.parentId && byId.has(n.parentId) ? n.parentId : undefined;\n const list = childrenOf.get(key) ?? [];\n list.push(n);\n childrenOf.set(key, list);\n }\n\n const emitNode = (node: FlowNode, depth: number) => {\n const indent = ' '.repeat(depth);\n const isGroup = node.data.isGroup || node.type === 'flowGroup' || node.type === 'geometryGroup';\n const bullet = isGroup ? `**${nodeLabel(node)}**` : nodeLabel(node);\n lines.push(`${indent}- ${bullet}`);\n\n // Media content (markdown/data/etc.) as a short description line.\n if (node.type === 'mediaNode' && node.data.mediaKind) {\n const kind = node.data.mediaKind;\n if (kind === 'data' && node.data.dataConfig) {\n const cfg = node.data.dataConfig;\n const cols = cfg.columns.map((c) => c.label ?? c.key).join(', ');\n lines.push(`${indent} - 数据表:${cfg.rows.length} 行 · 列(${cols})`);\n } else if (node.data.mediaContent && kind !== 'image' && kind !== 'model3d') {\n const preview = node.data.mediaContent.trim().split('\\n')[0].slice(0, 80);\n if (preview) lines.push(`${indent} - ${kind}: ${preview}`);\n }\n }\n\n // Recurse into visual group children.\n const kids = childrenOf.get(node.id) ?? [];\n for (const kid of kids) emitNode(kid, depth + 1);\n\n // Recurse into a drill-down sub-canvas, if any.\n const childCanvasId = node.data.childCanvasId;\n if (childCanvasId && doc.canvases[childCanvasId] && !seenCanvases.has(childCanvasId)) {\n seenCanvases.add(childCanvasId);\n renderCanvas(childCanvasId, headingLevel + 1, seenCanvases);\n }\n };\n\n const roots = childrenOf.get(undefined) ?? [];\n for (const root of roots) emitNode(root, 0);\n\n // Connections summary.\n if (canvas.edges.length > 0) {\n lines.push('');\n lines.push(`${'#'.repeat(Math.min(6, headingLevel + 1))} 连接关系`);\n for (const edge of canvas.edges) {\n const from = byId.get(edge.source);\n const to = byId.get(edge.target);\n if (!from || !to) continue;\n const edgeLabel = edge.data.labelText ? ` (${edge.data.labelText})` : '';\n lines.push(`- ${nodeLabel(from)} → ${nodeLabel(to)}${edgeLabel}`);\n }\n }\n };\n\n const seen = new Set<string>([ROOT_CANVAS_ID]);\n lines.push('# 流程图');\n lines.push('');\n renderCanvas(ROOT_CANVAS_ID, 1, seen);\n\n // Any orphan canvases not reached via drill-down nodes.\n for (const canvasId of Object.keys(doc.canvases)) {\n if (seen.has(canvasId)) continue;\n seen.add(canvasId);\n lines.push('');\n lines.push(`## 画布 ${canvasId}`);\n lines.push('');\n renderCanvas(canvasId, 2, seen);\n }\n\n return lines.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n';\n}\n\n/**\n * Simple Mermaid flowchart parser.\n * Handles basic `graph TD` / `flowchart LR` syntax with node definitions and edges.\n */\nfunction parseMermaidFlowchart(code: string): FlowDocument {\n const lines = code.split('\\n').map(l => l.trim()).filter(l => l && !l.startsWith('%%'));\n\n const nodeMap = new Map<string, { id: string; label: string }>();\n const edges: Array<{ from: string; to: string; label?: string }> = [];\n\n let isHorizontal = false;\n\n for (const line of lines) {\n // Detect direction\n if (/^(graph|flowchart)\\s+(LR|RL)/i.test(line)) {\n isHorizontal = true;\n continue;\n }\n if (/^(graph|flowchart)\\s+/i.test(line)) continue;\n\n // Edge patterns: A --> B, A -->|label| B, A --- B\n const edgeMatch = line.match(/^(\\w+)(?:\\[([^\\]]*)\\])?\\s*(-->|---|-\\.->|==>)(?:\\|([^|]*)\\|)?\\s*(\\w+)(?:\\[([^\\]]*)\\])?/);\n if (edgeMatch) {\n const [, fromId, fromLabel, , edgeLabel, toId, toLabel] = edgeMatch;\n if (fromLabel && !nodeMap.has(fromId)) nodeMap.set(fromId, { id: fromId, label: fromLabel });\n if (toLabel && !nodeMap.has(toId)) nodeMap.set(toId, { id: toId, label: toLabel });\n if (!nodeMap.has(fromId)) nodeMap.set(fromId, { id: fromId, label: fromId });\n if (!nodeMap.has(toId)) nodeMap.set(toId, { id: toId, label: toId });\n edges.push({ from: fromId, to: toId, label: edgeLabel?.trim() });\n continue;\n }\n\n // Standalone node: A[Label]\n const nodeMatch = line.match(/^(\\w+)\\[([^\\]]*)\\]/);\n if (nodeMatch) {\n const [, id, label] = nodeMatch;\n if (!nodeMap.has(id)) nodeMap.set(id, { id, label });\n }\n }\n\n // Layout: simple grid placement\n const nodeIds = [...nodeMap.keys()];\n const cols = isHorizontal ? nodeIds.length : Math.ceil(Math.sqrt(nodeIds.length));\n const spacing = { x: 200, y: 120 };\n\n const nodes: FlowNode[] = nodeIds.map((id, i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n const data = nodeMap.get(id)!;\n return {\n id: data.id,\n type: 'shapeRoundRect' as const,\n position: { x: 100 + col * spacing.x, y: 100 + row * spacing.y },\n width: 140,\n height: 60,\n data: {\n label: data.label,\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 2,\n color: 'theme:base-content',\n fontSize: 14,\n },\n };\n });\n\n const flowEdges: FlowEdge[] = edges.map((e) => ({\n id: generateId('edge'),\n source: e.from,\n target: e.to,\n type: 'smoothstep' as const,\n data: {\n strokeColor: 'theme:base-content',\n strokeWidth: 2,\n lineStyle: 'solid' as const,\n markerEnd: 'arrowclosed' as const,\n labelText: e.label,\n },\n }));\n\n return {\n canvases: {\n [ROOT_CANVAS_ID]: { nodes, edges: flowEdges, lines: [] },\n },\n stack: [ROOT_CANVAS_ID],\n };\n}\n\n/**\n * Export the PixiJS canvas as PNG data URL.\n */\nexport async function exportCanvasToPNG(canvas: HTMLCanvasElement): Promise<string> {\n return canvas.toDataURL('image/png');\n}\n\n/**\n * Download a data URL as a file.\n */\nexport function downloadDataURL(dataUrl: string, filename: string): void {\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n"],"mappings":";;;;;;;AAOA,IAAM,IAAkB;AAaxB,SAAgB,EAAiB,GAA2B,IAAW,aAAqB;CAE1F,QADc,KAAS,GAAA,CAAI,KAAK,CAAC,CAAC,QAAQ,kBAAkB,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAC/E,KAAQ;AACjB;AAMA,SAAgB,IAAsB;CACpC,IAAM,EAAE,QAAK,cAAW,EAAe;CA+DvC,OAAO;EAAE,YA7DU,QAA0B;GAC3C,IAAM,IAAiC;IACrC,SAAS;IACT,UAAU,EAAI;IACd,OAAO,EAAI;IACX,OAAO,EAAI;GACb;GACA,OAAO,KAAK,UAAU,GAAY,MAAM,CAAC;EAC3C,GAAG,CAAC,CAAG,CAqDE;EAAY,YAnDF,GAAa,MAAiB;GAC/C,IAAI;IACF,IAAM,IAAS,KAAK,MAAM,CAAI;IAG9B,IAAI,EAAc,CAAM,GAAG;KACzB,EAAO,EAAsB,CAAM,CAAC;KACpC;IACF;IACA,IAAM,IAAM;IACZ,IAAI,CAAC,EAAI,YAAY,CAAC,EAAI,OAAO,MAAU,MAAM,yBAAyB;IAC1E,EAAO;KACL,UAAU,EAAI;KACd,OAAO,EAAI;KACX,OAAO,EAAI;IACb,CAAC;GACH,SAAS,GAAK;IACZ,QAAQ,MAAM,0BAA0B,CAAG;GAC7C;EACF,GAAG,CAAC,CAAM,CAgCW;EAAY,eAzBX,GAAa,MAAoC;GACrE,IAAI;IACF,IAAM,IAAO,OAAO,KAAU,WAAW,KAAK,MAAM,CAAK,IAAI;IAG7D,OAFK,EAAc,CAAI,KACvB,EAAO,EAAsB,CAAI,CAAC,GAC3B,MAF0B;GAGnC,SAAS,GAAK;IAEZ,OADA,QAAQ,MAAM,kCAAkC,CAAG,GAC5C;GACT;EACF,GAAG,CAAC,CAAM,CAeuB;EAAe,eAb1B,GAAa,MAAwB;GACzD,IAAM,IAAM,EAAsB,CAAW;GAC7C,EAAO,CAAG;EACZ,GAAG,CAAC,CAAM,CAUsC;EAAe,gBARxC,QACd,EAAmB,CAAG,GAC5B,CAAC,CAAG,CAMwD;EAAgB,eAJzD,QAAkB;GACtC,EAAO,EAAoB,CAAC;EAC9B,GAAG,CAAC,CAAM,CAEqE;CAAc;AAC/F;AAQA,SAAS,EAAmB,GAA2B;CACrD,IAAM,IAAkB,CAAC,GAEnB,KAAa,MAAwB;EACzC,IAAM,KAAO,EAAE,KAAK,SAAS,GAAA,CAAI,KAAK;EAGtC,OAFI,IAAY,EAAI,QAAQ,QAAQ,GAAG,IACnC,EAAE,SAAS,cAAoB,IAAI,EAAE,KAAK,aAAa,QAAQ,KAC5D,IAAI,EAAE,KAAK;CACpB,GAEM,KAAgB,GAAkB,GAAsB,MAA8B;EAC1F,IAAM,IAAS,EAAI,SAAS;EAC5B,IAAI,CAAC,GAAQ;EAGb,IAAM,IAAO,IAAI,IAAI,EAAO,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GACjD,oBAAa,IAAI,IAAoC;EAC3D,KAAK,IAAM,KAAK,EAAO,OAAO;GAC5B,IAAM,IAAM,EAAE,YAAY,EAAK,IAAI,EAAE,QAAQ,IAAI,EAAE,WAAW,KAAA,GACxD,IAAO,EAAW,IAAI,CAAG,KAAK,CAAC;GAErC,AADA,EAAK,KAAK,CAAC,GACX,EAAW,IAAI,GAAK,CAAI;EAC1B;EAEA,IAAM,KAAY,GAAgB,MAAkB;GAClD,IAAM,IAAS,KAAK,OAAO,CAAK,GAE1B,IADU,EAAK,KAAK,WAAW,EAAK,SAAS,eAAe,EAAK,SAAS,kBACvD,KAAK,EAAU,CAAI,EAAE,MAAM,EAAU,CAAI;GAIlE,IAHA,EAAM,KAAK,GAAG,EAAO,IAAI,GAAQ,GAG7B,EAAK,SAAS,eAAe,EAAK,KAAK,WAAW;IACpD,IAAM,IAAO,EAAK,KAAK;IACvB,IAAI,MAAS,UAAU,EAAK,KAAK,YAAY;KAC3C,IAAM,IAAM,EAAK,KAAK,YAChB,IAAO,EAAI,QAAQ,KAAK,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI;KAC/D,EAAM,KAAK,GAAG,EAAO,UAAU,EAAI,KAAK,OAAO,SAAS,EAAK,EAAE;IACjE,OAAO,IAAI,EAAK,KAAK,gBAAgB,MAAS,WAAW,MAAS,WAAW;KAC3E,IAAM,IAAU,EAAK,KAAK,aAAa,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE;KACxE,AAAI,KAAS,EAAM,KAAK,GAAG,EAAO,MAAM,EAAK,IAAI,GAAS;IAC5D;GACF;GAGA,IAAM,IAAO,EAAW,IAAI,EAAK,EAAE,KAAK,CAAC;GACzC,KAAK,IAAM,KAAO,GAAM,EAAS,GAAK,IAAQ,CAAC;GAG/C,IAAM,IAAgB,EAAK,KAAK;GAChC,AAAI,KAAiB,EAAI,SAAS,MAAkB,CAAC,EAAa,IAAI,CAAa,MACjF,EAAa,IAAI,CAAa,GAC9B,EAAa,GAAe,IAAe,GAAG,CAAY;EAE9D,GAEM,IAAQ,EAAW,IAAI,KAAA,CAAS,KAAK,CAAC;EAC5C,KAAK,IAAM,KAAQ,GAAO,EAAS,GAAM,CAAC;EAG1C,IAAI,EAAO,MAAM,SAAS,GAAG;GAE3B,AADA,EAAM,KAAK,EAAE,GACb,EAAM,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,IAAe,CAAC,CAAC,EAAE,MAAM;GAC9D,KAAK,IAAM,KAAQ,EAAO,OAAO;IAC/B,IAAM,IAAO,EAAK,IAAI,EAAK,MAAM,GAC3B,IAAK,EAAK,IAAI,EAAK,MAAM;IAC/B,IAAI,CAAC,KAAQ,CAAC,GAAI;IAClB,IAAM,IAAY,EAAK,KAAK,YAAY,KAAK,EAAK,KAAK,UAAU,KAAK;IACtE,EAAM,KAAK,KAAK,EAAU,CAAI,EAAE,KAAK,EAAU,CAAE,IAAI,GAAW;GAClE;EACF;CACF,GAEM,oBAAO,IAAI,IAAY,CAAC,CAAc,CAAC;CAG7C,AAFA,EAAM,KAAK,OAAO,GAClB,EAAM,KAAK,EAAE,GACb,EAAa,GAAgB,GAAG,CAAI;CAGpC,KAAK,IAAM,KAAY,OAAO,KAAK,EAAI,QAAQ,GACzC,EAAK,IAAI,CAAQ,MACrB,EAAK,IAAI,CAAQ,GACjB,EAAM,KAAK,EAAE,GACb,EAAM,KAAK,SAAS,GAAU,GAC9B,EAAM,KAAK,EAAE,GACb,EAAa,GAAU,GAAG,CAAI;CAGhC,OAAO,EAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK,IAAI;AAC9D;AAMA,SAAS,EAAsB,GAA4B;CACzD,IAAM,IAAQ,EAAK,MAAM,IAAI,CAAC,CAAC,KAAI,MAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAO,MAAK,KAAK,CAAC,EAAE,WAAW,IAAI,CAAC,GAEhF,oBAAU,IAAI,IAA2C,GACzD,IAA6D,CAAC,GAEhE,IAAe;CAEnB,KAAK,IAAM,KAAQ,GAAO;EAExB,IAAI,gCAAgC,KAAK,CAAI,GAAG;GAC9C,IAAe;GACf;EACF;EACA,IAAI,yBAAyB,KAAK,CAAI,GAAG;EAGzC,IAAM,IAAY,EAAK,MAAM,wFAAwF;EACrH,IAAI,GAAW;GACb,IAAM,GAAG,GAAQ,KAAa,GAAW,GAAM,KAAW;GAK1D,AAJI,KAAa,CAAC,EAAQ,IAAI,CAAM,KAAG,EAAQ,IAAI,GAAQ;IAAE,IAAI;IAAQ,OAAO;GAAU,CAAC,GACvF,KAAW,CAAC,EAAQ,IAAI,CAAI,KAAG,EAAQ,IAAI,GAAM;IAAE,IAAI;IAAM,OAAO;GAAQ,CAAC,GAC5E,EAAQ,IAAI,CAAM,KAAG,EAAQ,IAAI,GAAQ;IAAE,IAAI;IAAQ,OAAO;GAAO,CAAC,GACtE,EAAQ,IAAI,CAAI,KAAG,EAAQ,IAAI,GAAM;IAAE,IAAI;IAAM,OAAO;GAAK,CAAC,GACnE,EAAM,KAAK;IAAE,MAAM;IAAQ,IAAI;IAAM,OAAO,GAAW,KAAK;GAAE,CAAC;GAC/D;EACF;EAGA,IAAM,IAAY,EAAK,MAAM,oBAAoB;EACjD,IAAI,GAAW;GACb,IAAM,GAAG,GAAI,KAAS;GACtB,AAAK,EAAQ,IAAI,CAAE,KAAG,EAAQ,IAAI,GAAI;IAAE;IAAI;GAAM,CAAC;EACrD;CACF;CAGA,IAAM,IAAU,CAAC,GAAG,EAAQ,KAAK,CAAC,GAC5B,IAAO,IAAe,EAAQ,SAAS,KAAK,KAAK,KAAK,KAAK,EAAQ,MAAM,CAAC,GAC1E,IAAU;EAAE,GAAG;EAAK,GAAG;CAAI,GAE3B,IAAoB,EAAQ,KAAK,GAAI,MAAM;EAC/C,IAAM,IAAM,IAAI,GACV,IAAM,KAAK,MAAM,IAAI,CAAI,GACzB,IAAO,EAAQ,IAAI,CAAE;EAC3B,OAAO;GACL,IAAI,EAAK;GACT,MAAM;GACN,UAAU;IAAE,GAAG,MAAM,IAAM,EAAQ;IAAG,GAAG,MAAM,IAAM,EAAQ;GAAE;GAC/D,OAAO;GACP,QAAQ;GACR,MAAM;IACJ,OAAO,EAAK;IACZ,MAAM;IACN,QAAQ;IACR,aAAa;IACb,OAAO;IACP,UAAU;GACZ;EACF;CACF,CAAC,GAEK,IAAwB,EAAM,KAAK,OAAO;EAC9C,IAAI,EAAW,MAAM;EACrB,QAAQ,EAAE;EACV,QAAQ,EAAE;EACV,MAAM;EACN,MAAM;GACJ,aAAa;GACb,aAAa;GACb,WAAW;GACX,WAAW;GACX,WAAW,EAAE;EACf;CACF,EAAE;CAEF,OAAO;EACL,UAAU,GACP,IAAiB;GAAE;GAAO,OAAO;GAAW,OAAO,CAAC;EAAE,EACzD;EACA,OAAO,CAAC,CAAc;CACxB;AACF;AAKA,eAAsB,EAAkB,GAA4C;CAClF,OAAO,EAAO,UAAU,WAAW;AACrC;AAKA,SAAgB,EAAgB,GAAiB,GAAwB;CACvE,IAAM,IAAI,SAAS,cAAc,GAAG;CAKpC,AAJA,EAAE,OAAO,GACT,EAAE,WAAW,GACb,SAAS,KAAK,YAAY,CAAC,GAC3B,EAAE,MAAM,GACR,SAAS,KAAK,YAAY,CAAC;AAC7B"}
@@ -1,41 +1,35 @@
1
- import { useFlowContext as u } from "../context/FlowContext.js";
2
- import { useFlowUI as i } from "../context/FlowUIContext.js";
3
- import { useEffect as d } from "react";
4
- function D(t) {
5
- const { selection: a, setSelection: f, currentCanvas: p } = u(), { editingNodeId: n, setToolMode: y, setPendingPlacement: s } = i();
6
- d(() => {
7
- const o = (e) => {
8
- const l = e.target;
9
- if (l.tagName === "INPUT" || l.tagName === "TEXTAREA" || l.isContentEditable || n) return;
10
- const r = e.metaKey || e.ctrlKey;
11
- if (r && e.key === "z" && !e.shiftKey)
12
- e.preventDefault(), t.undo();
13
- else if (r && (e.key === "Z" || e.key === "z" && e.shiftKey))
14
- e.preventDefault(), t.redo();
15
- else if (r && e.key === "c")
16
- e.preventDefault(), t.copy();
17
- else if (r && e.key === "x")
18
- e.preventDefault(), t.cut();
19
- else {
20
- if (r && e.key === "v") return;
21
- r && e.key === "a" ? (e.preventDefault(), t.selectAll()) : r && (e.key === "d" || e.key === "D") ? (e.preventDefault(), t.duplicate()) : r && e.altKey && (e.key === "g" || e.key === "G") ? (e.preventDefault(), t.geoGroup?.()) : r && e.key === "g" && !e.shiftKey && !e.altKey ? (e.preventDefault(), t.group?.()) : r && (e.key === "G" || e.key === "g" && e.shiftKey) && !e.altKey ? (e.preventDefault(), t.ungroup?.()) : r && e.shiftKey && e.key === "ArrowUp" ? (e.preventDefault(), t.bringToFront?.()) : r && !e.shiftKey && e.key === "ArrowUp" ? (e.preventDefault(), t.bringForward?.()) : r && !e.shiftKey && e.key === "ArrowDown" ? (e.preventDefault(), t.sendBackward?.()) : r && e.shiftKey && e.key === "ArrowDown" ? (e.preventDefault(), t.sendToBack?.()) : e.key === "Delete" || e.key === "Backspace" ? (e.preventDefault(), t.deleteSelected()) : e.key === "Escape" && (f({
22
- nodeIds: /* @__PURE__ */ new Set(),
23
- edgeIds: /* @__PURE__ */ new Set(),
24
- lineIds: /* @__PURE__ */ new Set()
25
- }), y("select"), s(null));
26
- }
27
- };
28
- return window.addEventListener("keydown", o), () => window.removeEventListener("keydown", o);
29
- }, [
30
- t,
31
- n,
32
- f,
33
- y,
34
- s
35
- ]);
1
+ import { useFlowContext as e } from "../context/FlowContext.js";
2
+ import { useFlowUI as t } from "../context/FlowUIContext.js";
3
+ import { useEffect as n } from "react";
4
+ //#region src/components/pro/Flow/hooks/useKeyboardShortcuts.ts
5
+ function r(r) {
6
+ let { selection: i, setSelection: a, currentCanvas: o } = e(), { editingNodeId: s, setToolMode: c, setPendingPlacement: l } = t();
7
+ n(() => {
8
+ let e = (e) => {
9
+ let t = e.target;
10
+ if (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable || s) return;
11
+ let n = e.metaKey || e.ctrlKey;
12
+ if (n && e.key === "z" && !e.shiftKey) e.preventDefault(), r.undo();
13
+ else if (n && (e.key === "Z" || e.key === "z" && e.shiftKey)) e.preventDefault(), r.redo();
14
+ else if (n && e.key === "c") e.preventDefault(), r.copy();
15
+ else if (n && e.key === "x") e.preventDefault(), r.cut();
16
+ else if (n && e.key === "v") return;
17
+ else n && e.key === "a" ? (e.preventDefault(), r.selectAll()) : n && (e.key === "d" || e.key === "D") ? (e.preventDefault(), r.duplicate()) : n && e.altKey && (e.key === "g" || e.key === "G") ? (e.preventDefault(), r.geoGroup?.()) : n && e.key === "g" && !e.shiftKey && !e.altKey ? (e.preventDefault(), r.group?.()) : n && (e.key === "G" || e.key === "g" && e.shiftKey) && !e.altKey ? (e.preventDefault(), r.ungroup?.()) : n && e.shiftKey && e.key === "ArrowUp" ? (e.preventDefault(), r.bringToFront?.()) : n && !e.shiftKey && e.key === "ArrowUp" ? (e.preventDefault(), r.bringForward?.()) : n && !e.shiftKey && e.key === "ArrowDown" ? (e.preventDefault(), r.sendBackward?.()) : n && e.shiftKey && e.key === "ArrowDown" ? (e.preventDefault(), r.sendToBack?.()) : e.key === "Delete" || e.key === "Backspace" ? (e.preventDefault(), r.deleteSelected()) : e.key === "Escape" && (a({
18
+ nodeIds: /* @__PURE__ */ new Set(),
19
+ edgeIds: /* @__PURE__ */ new Set(),
20
+ lineIds: /* @__PURE__ */ new Set()
21
+ }), c("select"), l(null));
22
+ };
23
+ return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
24
+ }, [
25
+ r,
26
+ s,
27
+ a,
28
+ c,
29
+ l
30
+ ]);
36
31
  }
37
- export {
38
- D as useKeyboardShortcuts
39
- };
32
+ //#endregion
33
+ export { r as useKeyboardShortcuts };
40
34
 
41
35
  //# sourceMappingURL=useKeyboardShortcuts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardShortcuts.js","names":[],"sources":["../../../../../src/components/pro/Flow/hooks/useKeyboardShortcuts.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowUI } from '../context/FlowUIContext';\n\ninterface KeyboardShortcutActions {\n undo: () => void;\n redo: () => void;\n copy: () => void;\n cut: () => void;\n paste: () => void;\n duplicate: () => void;\n deleteSelected: () => void;\n selectAll: () => void;\n group?: () => void;\n geoGroup?: () => void;\n ungroup?: () => void;\n bringToFront?: () => void;\n bringForward?: () => void;\n sendBackward?: () => void;\n sendToBack?: () => void;\n}\n\n/**\n * Registers global keyboard shortcuts for the flow editor.\n */\nexport function useKeyboardShortcuts(actions: KeyboardShortcutActions) {\n const { selection, setSelection, currentCanvas } = useFlowContext();\n const { editingNodeId, setToolMode, setPendingPlacement } = useFlowUI();\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n // Don't intercept when editing text in inputs\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) return;\n if (editingNodeId) return;\n\n const meta = e.metaKey || e.ctrlKey;\n\n if (meta && e.key === 'z' && !e.shiftKey) {\n e.preventDefault();\n actions.undo();\n } else if (meta && (e.key === 'Z' || (e.key === 'z' && e.shiftKey))) {\n e.preventDefault();\n actions.redo();\n } else if (meta && e.key === 'c') {\n e.preventDefault();\n actions.copy();\n } else if (meta && e.key === 'x') {\n e.preventDefault();\n actions.cut();\n } else if (meta && e.key === 'v') {\n // Let the native paste event inspect image clipboard data. Structured\n // Flow clipboard fallback is handled there when no image is present.\n return;\n } else if (meta && e.key === 'a') {\n e.preventDefault();\n actions.selectAll();\n } else if (meta && (e.key === 'd' || e.key === 'D')) {\n e.preventDefault();\n actions.duplicate();\n } else if (meta && e.altKey && (e.key === 'g' || e.key === 'G')) {\n e.preventDefault();\n actions.geoGroup?.();\n } else if (meta && e.key === 'g' && !e.shiftKey && !e.altKey) {\n e.preventDefault();\n actions.group?.();\n } else if (meta && (e.key === 'G' || (e.key === 'g' && e.shiftKey)) && !e.altKey) {\n e.preventDefault();\n actions.ungroup?.();\n } else if (meta && e.shiftKey && e.key === 'ArrowUp') {\n e.preventDefault();\n actions.bringToFront?.();\n } else if (meta && !e.shiftKey && e.key === 'ArrowUp') {\n e.preventDefault();\n actions.bringForward?.();\n } else if (meta && !e.shiftKey && e.key === 'ArrowDown') {\n e.preventDefault();\n actions.sendBackward?.();\n } else if (meta && e.shiftKey && e.key === 'ArrowDown') {\n e.preventDefault();\n actions.sendToBack?.();\n } else if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault();\n actions.deleteSelected();\n } else if (e.key === 'Escape') {\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n setToolMode('select');\n setPendingPlacement(null);\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [actions, editingNodeId, setSelection, setToolMode, setPendingPlacement]);\n}\n"],"mappings":";;;AAyBA,SAAgB,EAAqB,GAAkC;AACrE,QAAM,EAAE,WAAA,GAAW,cAAA,GAAc,eAAA,EAAA,IAAkB,EAAe,GAC5D,EAAE,eAAA,GAAe,aAAA,GAAa,qBAAA,EAAA,IAAwB,EAAU;AAEtE,EAAA,EAAA,MAAgB;AACd,UAAM,IAAA,CAAW,MAAqB;AAEpC,YAAM,IAAS,EAAE;AAEjB,UADI,EAAO,YAAY,WAAW,EAAO,YAAY,cAAc,EAAO,qBACtE,EAAe;AAEnB,YAAM,IAAO,EAAE,WAAW,EAAE;AAE5B,UAAI,KAAQ,EAAE,QAAQ,OAAO,CAAC,EAAE;AAC9B,UAAE,eAAe,GACjB,EAAQ,KAAK;AAAA,eACJ,MAAS,EAAE,QAAQ,OAAQ,EAAE,QAAQ,OAAO,EAAE;AACvD,UAAE,eAAe,GACjB,EAAQ,KAAK;AAAA,eACJ,KAAQ,EAAE,QAAQ;AAC3B,UAAE,eAAe,GACjB,EAAQ,KAAK;AAAA,eACJ,KAAQ,EAAE,QAAQ;AAC3B,UAAE,eAAe,GACjB,EAAQ,IAAI;AAAA,WACP;AAAA,YAAI,KAAQ,EAAE,QAAQ,IAG3B;AACK,QAAI,KAAQ,EAAE,QAAQ,OAC3B,EAAE,eAAe,GACjB,EAAQ,UAAU,KACT,MAAS,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAC7C,EAAE,eAAe,GACjB,EAAQ,UAAU,KACT,KAAQ,EAAE,WAAW,EAAE,QAAQ,OAAO,EAAE,QAAQ,QACzD,EAAE,eAAe,GACjB,EAAQ,WAAW,KACV,KAAQ,EAAE,QAAQ,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,UACpD,EAAE,eAAe,GACjB,EAAQ,QAAQ,KACP,MAAS,EAAE,QAAQ,OAAQ,EAAE,QAAQ,OAAO,EAAE,aAAc,CAAC,EAAE,UACxE,EAAE,eAAe,GACjB,EAAQ,UAAU,KACT,KAAQ,EAAE,YAAY,EAAE,QAAQ,aACzC,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,KAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,aAC1C,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,KAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,eAC1C,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,KAAQ,EAAE,YAAY,EAAE,QAAQ,eACzC,EAAE,eAAe,GACjB,EAAQ,aAAa,KACZ,EAAE,QAAQ,YAAY,EAAE,QAAQ,eACzC,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,EAAE,QAAQ,aACnB,EAAa;AAAA,UAAE,SAAS,oBAAI,IAAI;AAAA,UAAG,SAAS,oBAAI,IAAI;AAAA,UAAG,SAAS,oBAAI,IAAI;AAAA,QAAE,CAAC,GAC3E,EAAY,QAAQ,GACpB,EAAoB,IAAI;AAAA;AAAA,IAE5B;AAEA,kBAAO,iBAAiB,WAAW,CAAO,GAC1C,MAAa,OAAO,oBAAoB,WAAW,CAAO;AAAA,EAC5D,GAAG;AAAA,IAAC;AAAA,IAAS;AAAA,IAAe;AAAA,IAAc;AAAA,IAAa;AAAA,EAAmB,CAAC;AAC7E"}
1
+ {"version":3,"file":"useKeyboardShortcuts.js","names":[],"sources":["../../../../../src/components/pro/Flow/hooks/useKeyboardShortcuts.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowUI } from '../context/FlowUIContext';\n\ninterface KeyboardShortcutActions {\n undo: () => void;\n redo: () => void;\n copy: () => void;\n cut: () => void;\n paste: () => void;\n duplicate: () => void;\n deleteSelected: () => void;\n selectAll: () => void;\n group?: () => void;\n geoGroup?: () => void;\n ungroup?: () => void;\n bringToFront?: () => void;\n bringForward?: () => void;\n sendBackward?: () => void;\n sendToBack?: () => void;\n}\n\n/**\n * Registers global keyboard shortcuts for the flow editor.\n */\nexport function useKeyboardShortcuts(actions: KeyboardShortcutActions) {\n const { selection, setSelection, currentCanvas } = useFlowContext();\n const { editingNodeId, setToolMode, setPendingPlacement } = useFlowUI();\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n // Don't intercept when editing text in inputs\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) return;\n if (editingNodeId) return;\n\n const meta = e.metaKey || e.ctrlKey;\n\n if (meta && e.key === 'z' && !e.shiftKey) {\n e.preventDefault();\n actions.undo();\n } else if (meta && (e.key === 'Z' || (e.key === 'z' && e.shiftKey))) {\n e.preventDefault();\n actions.redo();\n } else if (meta && e.key === 'c') {\n e.preventDefault();\n actions.copy();\n } else if (meta && e.key === 'x') {\n e.preventDefault();\n actions.cut();\n } else if (meta && e.key === 'v') {\n // Let the native paste event inspect image clipboard data. Structured\n // Flow clipboard fallback is handled there when no image is present.\n return;\n } else if (meta && e.key === 'a') {\n e.preventDefault();\n actions.selectAll();\n } else if (meta && (e.key === 'd' || e.key === 'D')) {\n e.preventDefault();\n actions.duplicate();\n } else if (meta && e.altKey && (e.key === 'g' || e.key === 'G')) {\n e.preventDefault();\n actions.geoGroup?.();\n } else if (meta && e.key === 'g' && !e.shiftKey && !e.altKey) {\n e.preventDefault();\n actions.group?.();\n } else if (meta && (e.key === 'G' || (e.key === 'g' && e.shiftKey)) && !e.altKey) {\n e.preventDefault();\n actions.ungroup?.();\n } else if (meta && e.shiftKey && e.key === 'ArrowUp') {\n e.preventDefault();\n actions.bringToFront?.();\n } else if (meta && !e.shiftKey && e.key === 'ArrowUp') {\n e.preventDefault();\n actions.bringForward?.();\n } else if (meta && !e.shiftKey && e.key === 'ArrowDown') {\n e.preventDefault();\n actions.sendBackward?.();\n } else if (meta && e.shiftKey && e.key === 'ArrowDown') {\n e.preventDefault();\n actions.sendToBack?.();\n } else if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault();\n actions.deleteSelected();\n } else if (e.key === 'Escape') {\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n setToolMode('select');\n setPendingPlacement(null);\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [actions, editingNodeId, setSelection, setToolMode, setPendingPlacement]);\n}\n"],"mappings":";;;;AAyBA,SAAgB,EAAqB,GAAkC;CACrE,IAAM,EAAE,cAAW,iBAAc,qBAAkB,EAAe,GAC5D,EAAE,kBAAe,gBAAa,2BAAwB,EAAU;CAEtE,QAAgB;EACd,IAAM,KAAW,MAAqB;GAEpC,IAAM,IAAS,EAAE;GAEjB,IADI,EAAO,YAAY,WAAW,EAAO,YAAY,cAAc,EAAO,qBACtE,GAAe;GAEnB,IAAM,IAAO,EAAE,WAAW,EAAE;GAE5B,IAAI,KAAQ,EAAE,QAAQ,OAAO,CAAC,EAAE,UAE9B,AADA,EAAE,eAAe,GACjB,EAAQ,KAAK;QACR,IAAI,MAAS,EAAE,QAAQ,OAAQ,EAAE,QAAQ,OAAO,EAAE,WAEvD,AADA,EAAE,eAAe,GACjB,EAAQ,KAAK;QACR,IAAI,KAAQ,EAAE,QAAQ,KAE3B,AADA,EAAE,eAAe,GACjB,EAAQ,KAAK;QACR,IAAI,KAAQ,EAAE,QAAQ,KAE3B,AADA,EAAE,eAAe,GACjB,EAAQ,IAAI;QACP,IAAI,KAAQ,EAAE,QAAQ,KAG3B;QACK,AAAI,KAAQ,EAAE,QAAQ,OAC3B,EAAE,eAAe,GACjB,EAAQ,UAAU,KACT,MAAS,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAC7C,EAAE,eAAe,GACjB,EAAQ,UAAU,KACT,KAAQ,EAAE,WAAW,EAAE,QAAQ,OAAO,EAAE,QAAQ,QACzD,EAAE,eAAe,GACjB,EAAQ,WAAW,KACV,KAAQ,EAAE,QAAQ,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,UACpD,EAAE,eAAe,GACjB,EAAQ,QAAQ,KACP,MAAS,EAAE,QAAQ,OAAQ,EAAE,QAAQ,OAAO,EAAE,aAAc,CAAC,EAAE,UACxE,EAAE,eAAe,GACjB,EAAQ,UAAU,KACT,KAAQ,EAAE,YAAY,EAAE,QAAQ,aACzC,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,KAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,aAC1C,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,KAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,eAC1C,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,KAAQ,EAAE,YAAY,EAAE,QAAQ,eACzC,EAAE,eAAe,GACjB,EAAQ,aAAa,KACZ,EAAE,QAAQ,YAAY,EAAE,QAAQ,eACzC,EAAE,eAAe,GACjB,EAAQ,eAAe,KACd,EAAE,QAAQ,aACnB,EAAa;IAAE,yBAAS,IAAI,IAAI;IAAG,yBAAS,IAAI,IAAI;IAAG,yBAAS,IAAI,IAAI;GAAE,CAAC,GAC3E,EAAY,QAAQ,GACpB,EAAoB,IAAI;EAE5B;EAGA,OADA,OAAO,iBAAiB,WAAW,CAAO,SAC7B,OAAO,oBAAoB,WAAW,CAAO;CAC5D,GAAG;EAAC;EAAS;EAAe;EAAc;EAAa;CAAmB,CAAC;AAC7E"}