dishui 0.0.64 → 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 (504) 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 +11 -13
  5. package/dist/components/Badge/index.js.map +1 -1
  6. package/dist/components/Button/index.js +62 -86
  7. package/dist/components/Button/index.js.map +1 -1
  8. package/dist/components/Card/index.d.ts +87 -0
  9. package/dist/components/Card/index.js +178 -44
  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 -63
  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.d.ts +4 -1
  30. package/dist/components/EmptyState/index.js +24 -24
  31. package/dist/components/EmptyState/index.js.map +1 -1
  32. package/dist/components/FileUploader/DropZone.js +134 -136
  33. package/dist/components/FileUploader/DropZone.js.map +1 -1
  34. package/dist/components/FileUploader/FileItem.js +159 -163
  35. package/dist/components/FileUploader/FileItem.js.map +1 -1
  36. package/dist/components/FileUploader/FileUploader.js +126 -127
  37. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  38. package/dist/components/FileUploader/UploadQueue.js +62 -62
  39. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  40. package/dist/components/FloatWindow/index.d.ts +28 -0
  41. package/dist/components/GridLayout/index.d.ts +42 -0
  42. package/dist/components/Icon/index.d.ts +24 -0
  43. package/dist/components/Icon/index.js +26 -0
  44. package/dist/components/Icon/index.js.map +1 -0
  45. package/dist/components/Image/index.d.ts +33 -0
  46. package/dist/components/Image/index.js +44 -0
  47. package/dist/components/Image/index.js.map +1 -0
  48. package/dist/components/Input/index.js +196 -197
  49. package/dist/components/Input/index.js.map +1 -1
  50. package/dist/components/Label/index.js +62 -73
  51. package/dist/components/Label/index.js.map +1 -1
  52. package/dist/components/Layout/index.js +134 -139
  53. package/dist/components/Layout/index.js.map +1 -1
  54. package/dist/components/List/index.js +45 -43
  55. package/dist/components/List/index.js.map +1 -1
  56. package/dist/components/Markdown/Markdown.js +106 -103
  57. package/dist/components/Markdown/Markdown.js.map +1 -1
  58. package/dist/components/Markdown/codeThemes.js +24 -33
  59. package/dist/components/Markdown/codeThemes.js.map +1 -1
  60. package/dist/components/Markdown/markdownComponents.js +203 -208
  61. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  62. package/dist/components/Markdown/parseCodeBlockMeta.js +22 -22
  63. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  64. package/dist/components/Markdown/useMarkdownSource.js +46 -46
  65. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  66. package/dist/components/Markdown/useMarkmapRenderer.js +35 -36
  67. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  68. package/dist/components/Markdown/useMermaidRenderer.js +41 -42
  69. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  70. package/dist/components/Modal/index.d.ts +7 -3
  71. package/dist/components/Modal/index.js +82 -70
  72. package/dist/components/Modal/index.js.map +1 -1
  73. package/dist/components/MultipleChoice/index.d.ts +44 -0
  74. package/dist/components/MultipleChoice/index.js +52 -0
  75. package/dist/components/MultipleChoice/index.js.map +1 -0
  76. package/dist/components/Notification/index.d.ts +17 -0
  77. package/dist/components/Page/index.d.ts +58 -0
  78. package/dist/components/Page/index.js +43 -0
  79. package/dist/components/Page/index.js.map +1 -0
  80. package/dist/components/PageHeader/index.js +28 -28
  81. package/dist/components/PageHeader/index.js.map +1 -1
  82. package/dist/components/ProtectedRoute/index.js +8 -9
  83. package/dist/components/ProtectedRoute/index.js.map +1 -1
  84. package/dist/components/Row/index.d.ts +28 -0
  85. package/dist/components/Row/index.js +30 -0
  86. package/dist/components/Row/index.js.map +1 -0
  87. package/dist/components/Select/index.js +251 -257
  88. package/dist/components/Select/index.js.map +1 -1
  89. package/dist/components/SidebarToggleButton/index.js +56 -59
  90. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  91. package/dist/components/Slider/index.d.ts +39 -0
  92. package/dist/components/Slider/index.js +52 -0
  93. package/dist/components/Slider/index.js.map +1 -0
  94. package/dist/components/StatCard/index.d.ts +31 -1
  95. package/dist/components/StatCard/index.js +189 -58
  96. package/dist/components/StatCard/index.js.map +1 -1
  97. package/dist/components/Switch/index.d.ts +34 -0
  98. package/dist/components/Switch/index.js +55 -0
  99. package/dist/components/Switch/index.js.map +1 -0
  100. package/dist/components/Tab/index.d.ts +40 -0
  101. package/dist/components/Table/index.js +109 -103
  102. package/dist/components/Table/index.js.map +1 -1
  103. package/dist/components/Tabs/index.d.ts +19 -5
  104. package/dist/components/Tabs/index.js +30 -21
  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 -320
  132. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  133. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -221
  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 -305
  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 -141
  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 +190 -190
  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 -946
  217. package/dist/components/pro/Flow/Flow.js.map +1 -1
  218. package/dist/components/pro/Flow/FlowCanvas.js +1626 -1663
  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 -182
  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 -222
  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 -591
  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 -244
  345. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  346. package/dist/components/pro/Flow/panels/PresentationMode.js +137 -138
  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 -567
  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 -42
  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 +29 -1
  442. package/dist/index.js +106 -236
  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 -165
  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 +690 -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 -58
  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 +23 -10
@@ -1 +1 @@
1
- {"version":3,"file":"Flow.js","names":[],"sources":["../../../../src/components/pro/Flow/Flow.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect, useMemo, forwardRef, useImperativeHandle } from 'react';\nimport { FlowProvider, useFlowContext } from './context/FlowContext';\nimport { FlowUIProvider, useFlowUI } from './context/FlowUIContext';\nimport { FlowAIProvider } from './context/FlowAIContext';\nimport FlowCanvas from './FlowCanvas';\nimport FlowToolbar, { FlowZoomControls } from './panels/FlowToolbar';\nimport { ShapePaletteContent, SvgStampContent, MediaStampContent } from './panels/ShapePalette';\nimport { InspectorPanelContent } from './panels/InspectorPanel';\nimport { OutlinePanelContent } from './panels/OutlinePanel';\nimport { AIPanelContent } from './panels/AIPanel';\nimport { PresentationMode } from './panels/PresentationMode';\nimport { MediaOverlay } from './nodes/MediaOverlay';\nimport FlowPanelGroup, { type PanelTab } from './panels/FlowPanelGroup';\nimport type { FlowPanelDock } from './context/FlowUIContext';\nimport Breadcrumb from './panels/Breadcrumb';\nimport ContextMenu from './panels/ContextMenu';\nimport type { ContextMenuItem } from './panels/ContextMenu';\nimport Select from '../../Select';\nimport { MiniMapRenderer } from './canvas/MiniMapRenderer';\nimport { CodeEditor, type CodeEditorHandle } from '../CodeEditor';\nimport { EditorView } from '@codemirror/view';\nimport { useUndoRedo } from './hooks/useUndoRedo';\nimport { useClipboard } from './hooks/useClipboard';\nimport { useCompactMode } from './hooks/useCompactMode';\nimport { downloadDataURL, safeFileBaseName } from './hooks/useFlowImportExport';\nimport { usePdfExport } from './hooks/usePdfExport';\nimport { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts';\nimport { useMindMap } from './hooks/useMindMap';\nimport { useDeleteSelection } from './hooks/useDeleteSelection';\nimport { createEmptyDocument, ROOT_CANVAS_ID, DEFAULT_NODE_DATA } from './constants';\nimport { normalizeEdgeHandles } from './edges/edgePaths';\nimport { generateId } from './nodes/nodeUtils';\nimport type { FlowProps, FlowDocument, FlowNode, SelectionState, FlowCanvasData } from './types';\nimport type { PixiApp } from './canvas/PixiApp';\nimport './styles.css';\n\nfunction normalizeDocument(doc: FlowDocument): FlowDocument {\n let changed = false;\n const canvases = { ...doc.canvases };\n for (const [id, canvas] of Object.entries(canvases)) {\n const nodes = canvas.nodes.map(node => {\n if (node.type !== 'shapeSvg') return node;\n const legacyPlacement = node.data.labelPlacement as string | undefined;\n const labelPlacement = legacyPlacement === 'above'\n ? 'top'\n : legacyPlacement === 'center'\n ? 'middle'\n : legacyPlacement === 'below'\n ? 'bottom'\n : node.data.labelPlacement;\n if (labelPlacement === node.data.labelPlacement) return node;\n changed = true;\n return { ...node, data: { ...node.data, labelPlacement } };\n });\n // Mindmap nodes/edges created before theme tokens (≤ 0.0.56) persisted\n // literal colors, so they never followed theme switches. That exact palette\n // was only ever emitted by the old mindmap creator, so remap it to the same\n // tokens the current creator uses.\n let themedNodesChanged = false;\n const themedNodes = nodes.map(node => {\n if (!node.data.isMindMapNode) return node;\n const fill = node.data.fill === '#ffffff' || node.data.fill === '#eef2ff'\n ? 'theme:base-100'\n : node.data.fill;\n const stroke = node.data.stroke === '#6366f1'\n ? 'theme:base-content'\n : node.data.stroke === '#4f46e5'\n ? 'theme:primary'\n : node.data.stroke;\n if (fill === node.data.fill && stroke === node.data.stroke) return node;\n themedNodesChanged = true;\n return { ...node, data: { ...node.data, fill, stroke } };\n });\n const nodeMap = new Map<string, FlowNode>();\n for (const node of themedNodes) nodeMap.set(node.id, node);\n let edgesChanged = false;\n const edges = normalizeEdgeHandles(canvas.edges, nodeMap).map(edge => {\n if (edge.data.strokeColor !== '#94a3b8') return edge;\n const source = nodeMap.get(edge.source);\n const target = nodeMap.get(edge.target);\n if (!source?.data.isMindMapNode || !target?.data.isMindMapNode) return edge;\n edgesChanged = true;\n return { ...edge, data: { ...edge.data, strokeColor: 'theme:base-content' } };\n });\n if (themedNodesChanged || edgesChanged) changed = true;\n if (themedNodes !== nodes || edges !== canvas.edges) {\n canvases[id] = { ...canvas, nodes: themedNodes, edges };\n }\n }\n return changed ? { ...doc, canvases } : doc;\n}\n\nconst EMPTY_SELECTION: SelectionState = {\n nodeIds: new Set(),\n edgeIds: new Set(),\n lineIds: new Set(),\n};\n\nfunction FlowKeyboardShortcutsWire({ onUndo, onRedo, groupRef, geoGroupRef, ungroupRef }: {\n onUndo: () => void;\n onRedo: () => void;\n groupRef: React.MutableRefObject<(() => void) | null>;\n geoGroupRef: React.MutableRefObject<(() => void) | null>;\n ungroupRef: React.MutableRefObject<(() => void) | null>;\n}) {\n const { selection, setSelection, currentCanvas, setDoc, currentCanvasId } = useFlowContext();\n const { viewport } = useFlowUI();\n const { copy, cut, paste, duplicate } = useClipboard();\n const deleteSelected = useDeleteSelection();\n\n const selectAll = useCallback(() => {\n setSelection({\n nodeIds: new Set(currentCanvas.nodes.map(n => n.id)),\n edgeIds: new Set(currentCanvas.edges.map(e => e.id)),\n lineIds: new Set(currentCanvas.lines.map(l => l.id)),\n });\n }, [currentCanvas, setSelection]);\n\n const createGroup = useCallback((type: 'flowGroup' | 'geometryGroup') => {\n const nodeIds = selection.nodeIds;\n const lineIds = selection.lineIds;\n const totalCount = nodeIds.size + lineIds.size;\n if (totalCount < 2) return;\n const nodes = currentCanvas.nodes.filter(n => nodeIds.has(n.id));\n const lines = currentCanvas.lines.filter(l => lineIds.has(l.id));\n const PAD = 20;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of nodes) {\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + n.width);\n maxY = Math.max(maxY, n.position.y + n.height);\n }\n for (const l of lines) {\n for (const p of l.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n }\n const isGeo = type === 'geometryGroup';\n const groupId = generateId('group');\n const groupNode: FlowNode = {\n id: groupId,\n type,\n position: { x: minX - PAD, y: minY - PAD },\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2,\n data: {\n ...DEFAULT_NODE_DATA,\n label: isGeo ? 'Geo Group' : 'Group',\n fill: isGeo ? '#fefce8' : '#f0f9ff',\n stroke: '#9ca3af', strokeWidth: 1.5,\n borderStyle: isGeo ? 'dashed' : 'dotted',\n isGroup: true,\n },\n };\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: isGeo\n ? [groupNode, ...canvas.nodes]\n : [groupNode, ...canvas.nodes.map(n => nodeIds.has(n.id) ? { ...n, parentId: groupId } : n)],\n lines: isGeo\n ? canvas.lines\n : canvas.lines.map(l => lineIds.has(l.id) ? { ...l, parentId: groupId } : l),\n }},\n };\n });\n setSelection({ nodeIds: new Set([groupId]), edgeIds: new Set(), lineIds: new Set() });\n }, [selection, currentCanvas, setDoc, currentCanvasId, setSelection]);\n\n const groupSelected = useCallback(() => createGroup('flowGroup'), [createGroup]);\n const geoGroupSelected = useCallback(() => createGroup('geometryGroup'), [createGroup]);\n\n const ungroupSelected = useCallback(() => {\n const ids = selection.nodeIds;\n if (ids.size === 0) return;\n const groupNodeIds = new Set<string>();\n const childNodeIds = new Set<string>();\n const childLineIds = new Set<string>();\n for (const node of currentCanvas.nodes) {\n if (ids.has(node.id) && (node.type === 'flowGroup' || node.type === 'geometryGroup' || node.data.isGroup)) {\n groupNodeIds.add(node.id);\n }\n }\n if (groupNodeIds.size === 0) return;\n for (const node of currentCanvas.nodes) {\n if (node.parentId && groupNodeIds.has(node.parentId)) {\n childNodeIds.add(node.id);\n }\n }\n for (const line of currentCanvas.lines) {\n if (line.parentId && groupNodeIds.has(line.parentId)) {\n childLineIds.add(line.id);\n }\n }\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes\n .filter(n => !groupNodeIds.has(n.id))\n .map(n => childNodeIds.has(n.id) ? { ...n, parentId: undefined } : n),\n lines: canvas.lines\n .map(l => childLineIds.has(l.id) ? { ...l, parentId: undefined } : l),\n }},\n };\n });\n setSelection({ nodeIds: childNodeIds, edgeIds: new Set(), lineIds: childLineIds });\n }, [selection, currentCanvas, setDoc, currentCanvasId, setSelection]);\n\n groupRef.current = groupSelected;\n geoGroupRef.current = geoGroupSelected;\n ungroupRef.current = ungroupSelected;\n\n const changeZIndex = useCallback((mode: 'front' | 'back' | 'up' | 'down') => {\n const nodeIds = selection.nodeIds;\n const lineIds = selection.lineIds;\n if (nodeIds.size === 0 && lineIds.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const nodeAllZ = canvas.nodes.map(n => n.zIndex ?? 0);\n const nodeMaxZ = nodeAllZ.length > 0 ? Math.max(...nodeAllZ) : 0;\n const nodeMinZ = nodeAllZ.length > 0 ? Math.min(...nodeAllZ) : 0;\n const lineAllZ = canvas.lines.map(l => l.zIndex ?? 0);\n const lineMaxZ = lineAllZ.length > 0 ? Math.max(...lineAllZ) : 0;\n const lineMinZ = lineAllZ.length > 0 ? Math.min(...lineAllZ) : 0;\n const applyZ = (z: number, maxZ: number, minZ: number) => {\n if (mode === 'front') return maxZ + 1;\n if (mode === 'back') return minZ - 1;\n if (mode === 'up') return z + 1;\n return z - 1;\n };\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n => nodeIds.has(n.id) ? { ...n, zIndex: applyZ(n.zIndex ?? 0, nodeMaxZ, nodeMinZ) } : n),\n lines: canvas.lines.map(l => lineIds.has(l.id) ? { ...l, zIndex: applyZ(l.zIndex ?? 0, lineMaxZ, lineMinZ) } : l),\n }},\n };\n });\n }, [selection, setDoc, currentCanvasId]);\n\n useEffect(() => {\n const handlePaste = (event: ClipboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (target?.tagName === 'INPUT' || target?.tagName === 'TEXTAREA' || target?.isContentEditable) return;\n\n const imageItem = Array.from(event.clipboardData?.items ?? []).find(item => item.type.startsWith('image/'));\n if (!imageItem) {\n event.preventDefault();\n paste();\n return;\n }\n\n const file = imageItem.getAsFile();\n if (!file) return;\n event.preventDefault();\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') return;\n const selectedImage = selection.nodeIds.size === 1\n ? currentCanvas.nodes.find(node => selection.nodeIds.has(node.id) && node.type === 'mediaNode' && node.data.mediaKind === 'image')\n : undefined;\n\n if (selectedImage) {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(node => node.id === selectedImage.id\n ? { ...node, data: { ...node.data, mediaContent: reader.result as string } }\n : node),\n },\n },\n };\n });\n return;\n }\n\n const id = generateId('node');\n const width = 320;\n const height = 220;\n const screenWidth = window.innerWidth;\n const screenHeight = window.innerHeight;\n const centerX = (screenWidth / 2 - viewport.x) / viewport.zoom;\n const centerY = (screenHeight / 2 - viewport.y) / viewport.zoom;\n const highestZ = Math.max(0, ...currentCanvas.nodes.map(node => node.zIndex ?? 0));\n const imageNode: FlowNode = {\n id,\n type: 'mediaNode',\n position: { x: centerX - width / 2, y: centerY - height / 2 },\n width,\n height,\n zIndex: highestZ + 1,\n data: {\n ...DEFAULT_NODE_DATA,\n label: file.name || 'Image',\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: 'theme:base-content',\n fontSize: 13,\n borderStyle: 'solid',\n mediaKind: 'image',\n mediaContent: reader.result,\n },\n };\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: { ...canvas, nodes: [...canvas.nodes, imageNode] },\n },\n };\n });\n setSelection({ nodeIds: new Set([id]), edgeIds: new Set(), lineIds: new Set() });\n };\n reader.readAsDataURL(file);\n };\n\n window.addEventListener('paste', handlePaste);\n return () => window.removeEventListener('paste', handlePaste);\n }, [currentCanvas, currentCanvasId, paste, selection, setDoc, setSelection, viewport]);\n\n const actions = useMemo(() => ({\n undo: onUndo, redo: onRedo, copy, cut, paste, duplicate, deleteSelected, selectAll,\n group: groupSelected, geoGroup: geoGroupSelected, ungroup: ungroupSelected,\n bringToFront: () => changeZIndex('front'),\n bringForward: () => changeZIndex('up'),\n sendBackward: () => changeZIndex('down'),\n sendToBack: () => changeZIndex('back'),\n }), [onUndo, onRedo, copy, cut, paste, duplicate, deleteSelected, selectAll, groupSelected, geoGroupSelected, ungroupSelected, changeZIndex]);\n\n useKeyboardShortcuts(actions);\n useMindMap();\n return null;\n}\n\n/**\n * Bridges the anchor→PDF export (which needs canvas/viewport context) out to the\n * toolbar in the outer Flow component via a ref. Renders nothing.\n */\nfunction PdfExportWire({\n pixiRef,\n exportPdfRef,\n}: {\n pixiRef: React.RefObject<PixiApp | null>;\n exportPdfRef: React.MutableRefObject<(() => Promise<boolean>) | null>;\n}) {\n const exportPdf = usePdfExport(pixiRef);\n exportPdfRef.current = exportPdf;\n return null;\n}\n\n/** Imperative handle exposed via a ref on the `<Flow>` component. */\nexport interface FlowHandle {\n /** Export the current diagram to a PNG data URL (null if unavailable). */\n exportPNG: (backgroundColor?: number) => Promise<string | null>;\n /** Get the current document. */\n getDocument: () => FlowDocument;\n}\n\nconst Flow = forwardRef<FlowHandle, FlowProps>(function Flow({\n initialDocument,\n onChange,\n width,\n height,\n readOnly = false,\n onBack,\n onExportPNG,\n onPublish,\n showMiniMap = true,\n showGrid = true,\n gridSize = 20,\n className,\n showAI = true,\n showAIConfig = true,\n aiConfig,\n}: FlowProps, ref) {\n const [doc, setDoc] = useState<FlowDocument>(() => normalizeDocument(initialDocument ?? createEmptyDocument()));\n const [selection, setSelection] = useState<SelectionState>(EMPTY_SELECTION);\n const pixiRef = useRef<PixiApp | null>(null);\n const miniMapCanvasRef = useRef<HTMLCanvasElement>(null);\n const miniMapRef = useRef<MiniMapRenderer | null>(null);\n // Small-screen detection (container width based, see useCompactMode).\n const rootRef = useRef<HTMLDivElement>(null);\n const compact = useCompactMode(rootRef);\n\n const { wrappedSetDoc, undo, redo, canUndo, canRedo } = useUndoRedo(doc, setDoc);\n const groupRef = useRef<(() => void) | null>(null);\n const geoGroupRef = useRef<(() => void) | null>(null);\n const ungroupRef = useRef<(() => void) | null>(null);\n const exportPdfRef = useRef<(() => Promise<boolean>) | null>(null);\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Keep the latest doc in a ref for the imperative handle.\n const docRef = useRef(doc);\n docRef.current = doc;\n\n useImperativeHandle(ref, () => ({\n exportPNG: async (backgroundColor?: number) => {\n const pixi = pixiRef.current;\n if (!pixi || pixi.destroyed) return null;\n return pixi.exportPNG(backgroundColor);\n },\n getDocument: () => docRef.current,\n }), []);\n\n const outerSetDoc: React.Dispatch<React.SetStateAction<FlowDocument>> = useCallback(\n (action) => {\n wrappedSetDoc(prev => {\n const next = typeof action === 'function' ? action(prev) : action;\n if (readOnly) {\n // Read-only: discard any content mutation. Only pure canvas\n // navigation (stack push/pop — entering/leaving groups via\n // double-click or breadcrumb) is allowed through. onChange is not\n // fired, so hosts won't treat navigation as an unsaved change.\n const navigationOnly = next.canvases === prev.canvases && next.title === prev.title;\n return navigationOnly ? next : prev;\n }\n queueMicrotask(() => onChangeRef.current?.(next));\n return next;\n });\n },\n [wrappedSetDoc, readOnly],\n );\n\n // Undo/redo mutate the document directly through useUndoRedo's raw setDoc\n // (bypassing outerSetDoc), so they need their own read-only guard.\n const guardedUndo = useCallback(() => { if (!readOnly) undo(); }, [readOnly, undo]);\n const guardedRedo = useCallback(() => { if (!readOnly) redo(); }, [readOnly, redo]);\n\n const handlePixiReady = useCallback((pixi: PixiApp) => {\n pixiRef.current = pixi;\n if (miniMapCanvasRef.current && !miniMapRef.current) {\n miniMapRef.current = new MiniMapRenderer(miniMapCanvasRef.current);\n }\n }, []);\n\n // Built-in PNG export: if the host supplies `onExportPNG` we defer to it,\n // otherwise snapshot the Pixi scene and download it directly so the toolbar\n // button always works out of the box.\n const handleExportPNG = useCallback(async () => {\n if (onExportPNG) return void onExportPNG();\n const pixi = pixiRef.current;\n if (!pixi || pixi.destroyed) return;\n const url = await pixi.exportPNG(0xffffff);\n if (url) downloadDataURL(url, `${safeFileBaseName(docRef.current.title)}.png`);\n }, [onExportPNG]);\n\n // Built-in PDF export: capture each anchor's presentation framing into a\n // multi-page PDF (implemented by PdfExportWire inside the providers).\n const handleExportPDF = useCallback(async () => {\n await exportPdfRef.current?.();\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n let subscribed: PixiApp | null = null;\n\n const tickerFn = () => {\n const pixi = pixiRef.current;\n const mm = miniMapRef.current;\n if (!pixi || pixi.destroyed || !mm) return;\n const vp = { x: pixi.world.position.x, y: pixi.world.position.y, zoom: pixi.world.scale.x };\n const currentId = doc.stack[doc.stack.length - 1] ?? ROOT_CANVAS_ID;\n const canvas = doc.canvases[currentId];\n if (canvas) mm.update(canvas.nodes, vp, pixi.app.screen.width, pixi.app.screen.height);\n };\n\n // Pixi initializes asynchronously; the minimap renderer is created in\n // handlePixiReady. Poll until both exist, then attach the ticker. This\n // avoids a race where the effect runs before pixi is ready and the minimap\n // stays blank until the next document edit.\n const attach = () => {\n if (cancelled) return;\n const pixi = pixiRef.current;\n if (pixi && !pixi.destroyed && miniMapRef.current) {\n pixi.app.ticker.add(tickerFn);\n subscribed = pixi;\n } else {\n requestAnimationFrame(attach);\n }\n };\n attach();\n\n return () => {\n cancelled = true;\n if (subscribed && !subscribed.destroyed) subscribed.app.ticker.remove(tickerFn);\n };\n }, [doc]);\n\n const style: React.CSSProperties = { width: width ?? '100%', height: height ?? '100%' };\n\n return (\n <div ref={rootRef} className={`flow-container ${className ?? ''}`} style={style}>\n <FlowProvider doc={doc} setDoc={outerSetDoc} selection={selection} setSelection={setSelection}>\n <FlowUIProvider showMiniMap={showMiniMap} showGrid={showGrid} gridSize={gridSize} showAI={showAI} readOnly={readOnly}>\n <FlowAIProvider initialConfig={aiConfig} showAIConfig={showAIConfig}>\n <FlowKeyboardShortcutsWire onUndo={guardedUndo} onRedo={guardedRedo} groupRef={groupRef} geoGroupRef={geoGroupRef} ungroupRef={ungroupRef} />\n <PdfExportWire pixiRef={pixiRef} exportPdfRef={exportPdfRef} />\n <UnifiedPanelGroup\n compact={compact}\n toolbar={!readOnly ? (\n <FlowToolbar\n compact={compact}\n onBack={onBack}\n onUndo={guardedUndo} onRedo={guardedRedo} canUndo={canUndo} canRedo={canRedo}\n onGroup={() => groupRef.current?.()} onGeoGroup={() => geoGroupRef.current?.()} onUngroup={() => ungroupRef.current?.()}\n onExportPNG={handleExportPNG}\n onExportPDF={handleExportPDF}\n onPublish={onPublish}\n />\n ) : null}\n >\n <FlowCanvas onPixiReady={handlePixiReady} />\n {/* Media content (markdown/mermaid/data/…) must stay visible in\n presentation & read-only preview — PixiJS only draws the node\n frame, so hiding this layer would blank every media node. */}\n <MediaOverlay />\n <PresentationGate>\n {!readOnly && <FlowZoomControls />}\n <Breadcrumb />\n </PresentationGate>\n {!readOnly && <FlowContextMenuWire />}\n <MiniMapWrapper canvasRef={miniMapCanvasRef} pixiRef={pixiRef} miniMapRef={miniMapRef} />\n <PresentationMode />\n </UnifiedPanelGroup>\n </FlowAIProvider>\n </FlowUIProvider>\n </FlowProvider>\n </div>\n );\n});\n\nexport default Flow;\n\ninterface TabDef {\n id: string;\n label: string;\n icon: string;\n showKey?: 'showPalette' | 'showInspector' | 'showOutline' | 'showJson' | 'showAI';\n}\n\n/**\n * Hides all editable overlay UI (toolbar, panels, breadcrumb) while in\n * presentation mode, keeping only the canvas visible for the slideshow.\n */\nfunction PresentationGate({ children }: { children: React.ReactNode }) {\n const { presentation } = useFlowUI();\n return (\n <div className=\"flow-overlay\" style={{ display: presentation ? 'none' : undefined }}>\n {children}\n </div>\n );\n}\n\nconst ALL_TAB_DEFS: TabDef[] = [\n { id: 'shapes', label: 'Shapes', icon: '▢', showKey: 'showPalette' },\n { id: 'icons', label: 'Icons', icon: '★', showKey: 'showPalette' },\n { id: 'media', label: 'Media', icon: '▶', showKey: 'showPalette' },\n { id: 'inspector', label: 'Inspector', icon: '⚙', showKey: 'showInspector' },\n { id: 'outline', label: 'Outline', icon: '☰', showKey: 'showOutline' },\n { id: 'json', label: 'JSON', icon: '{ }', showKey: 'showJson' },\n { id: 'ai', label: 'AI', icon: '✨', showKey: 'showAI' },\n];\n\nfunction tabContent(id: string): React.ReactNode {\n switch (id) {\n case 'shapes': return <ShapePaletteContent />;\n case 'icons': return <SvgStampContent />;\n case 'media': return <MediaStampContent />;\n case 'inspector': return <InspectorPanelContent />;\n case 'outline': return <OutlinePanelContent />;\n case 'json': return <JsonEditorPanel />;\n case 'ai': return <AIPanelContent />;\n default: return null;\n }\n}\n\n/** Tab ids whose panels stamp objects onto the canvas (auto-collapse in compact mode). */\nconst STAMP_PANEL_IDS = new Set(['shapes', 'icons', 'media']);\n\nfunction UnifiedPanelGroup({ children, toolbar, compact }: { children: React.ReactNode; toolbar?: React.ReactNode; compact?: boolean }) {\n const ui = useFlowUI();\n const { panelDocks, setPanelDock, presentation, readOnly, setPendingPlacement } = ui;\n const { setShowPalette, setShowInspector, setShowOutline, setShowJson, setShowAI } = ui;\n\n // Read-only: hide every editing panel (palette/inspector/outline/JSON/AI).\n const visibleTabs = readOnly\n ? []\n : ALL_TAB_DEFS.filter(def =>\n !def.showKey || (ui as any)[def.showKey],\n );\n\n const toPanelTab = (def: TabDef): PanelTab => ({\n id: def.id, label: def.label, icon: def.icon, content: tabContent(def.id),\n });\n\n // Compact (small-screen) mode: the chosen panel renders full-screen above\n // the canvas. Shape/icon/media stamp panels collapse automatically once a\n // stamp is picked (pendingPlacement armed) so the user is returned to the\n // canvas to tap it into place; a virtual ESC button on the canvas cancels\n // continuous placement.\n const [activePanel, setActivePanel] = useState<string | null>(null);\n const prevPlacementKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!compact) {\n prevPlacementKeyRef.current = null;\n return;\n }\n const pp = ui.pendingPlacement;\n const key = pp ? `${pp.type}:${(pp.data as any)?.svgId ?? ''}:${(pp.data as any)?.mediaKind ?? ''}` : null;\n const prev = prevPlacementKeyRef.current;\n prevPlacementKeyRef.current = key;\n if (key && key !== prev && activePanel && STAMP_PANEL_IDS.has(activePanel)) {\n setActivePanel(null);\n }\n }, [ui.pendingPlacement, compact, activePanel]);\n\n // Floating-panel drag: highlight the dock edge it hovers over.\n const [dropHint, setDropHint] = useState<'left' | 'right' | null>(null);\n const handleDock = useCallback((tabId: string, dock: FlowPanelDock) => setPanelDock(tabId, dock), [setPanelDock]);\n // Each panel has its own close (✕) button; closed panels come back via the\n // matching toolbar toggle (shapes/icons/media share the palette flag).\n const handleClose = useCallback((tabId: string) => {\n if (tabId === 'inspector') setShowInspector(false);\n else if (tabId === 'outline') setShowOutline(false);\n else if (tabId === 'json') setShowJson(false);\n else if (tabId === 'ai') setShowAI(false);\n else setShowPalette(false);\n }, [setShowInspector, setShowOutline, setShowJson, setShowAI, setShowPalette]);\n\n // NOTE: every hook must run before this early return — moving hooks below it\n // would break the hooks-of-render contract in compact mode.\n if (compact && !presentation) {\n const activeDef = visibleTabs.find(d => d.id === activePanel) ?? null;\n return (\n <div className=\"flow-workspace\">\n {toolbar}\n {visibleTabs.length > 0 && (\n <div className=\"flow-mobile-panel-bar\">\n <Select\n placeholder=\"选择面板…\"\n options={visibleTabs.map(d => ({ value: d.id, label: d.label }))}\n value={activePanel ?? undefined}\n onChange={(v) => {\n // Switching panels always opens a clean \"pick a type\" state: a\n // stale armed stamp (continuous placement) would otherwise be\n // placed by the next canvas tap or toggle the tapped item off.\n setPendingPlacement(null);\n setActivePanel(String(v));\n }}\n />\n </div>\n )}\n <div className=\"flow-workspace-main\">\n <div className=\"flow-stage\">\n {children}\n </div>\n {activeDef && (\n <div className=\"flow-mobile-panel\">\n <div className=\"flow-mobile-panel-header\">\n <span className=\"flow-mobile-panel-title\">\n {activeDef.icon && <span className=\"flow-panel-tab-icon\">{activeDef.icon}</span>}\n {activeDef.label}\n </span>\n <button\n type=\"button\"\n className=\"flow-mobile-panel-close\"\n aria-label=\"关闭面板\"\n onClick={() => setActivePanel(null)}\n >✕</button>\n </div>\n <div className=\"flow-mobile-panel-body\">{tabContent(activeDef.id)}</div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Desktop layout: the left/right panel groups are merged into one panel\n // list docked on the left by default. Panels are switched with a dropdown\n // Select; users can move any panel to the right dock or let it float (via\n // header buttons or by dragging it onto a workspace edge). Docks without\n // panels are not rendered so the canvas fills the freed space.\n const getDock = (id: string): FlowPanelDock => panelDocks[id] ?? 'left';\n const leftTabs: PanelTab[] = visibleTabs\n .filter(def => getDock(def.id) === 'left')\n .map(toPanelTab);\n const rightTabs: PanelTab[] = visibleTabs\n .filter(def => getDock(def.id) === 'right')\n .map(toPanelTab);\n const floatList = visibleTabs.filter(def => getDock(def.id) === 'float');\n\n return (\n <div className=\"flow-workspace\">\n {/* Slim full-width toolbar strip above panels + canvas. */}\n {!presentation && toolbar}\n <div className=\"flow-workspace-main\">\n {!presentation && leftTabs.length > 0 && (\n <FlowPanelGroup\n tabs={leftTabs}\n defaultTab={leftTabs[0]?.id}\n resizeEdge=\"right\"\n defaultWidth={220}\n dock=\"left\"\n onDock={handleDock}\n onClose={handleClose}\n />\n )}\n <div className=\"flow-stage\">\n {children}\n </div>\n {!presentation && rightTabs.length > 0 && (\n <FlowPanelGroup\n tabs={rightTabs}\n defaultTab={rightTabs[0]?.id}\n resizeEdge=\"left\"\n defaultWidth={220}\n dock=\"right\"\n onDock={handleDock}\n onClose={handleClose}\n />\n )}\n {/* Floating panels drift above the docks; dragging one over a\n workspace edge shows a drop-zone hint and dropping attaches it to\n that dock. Rendered as a direct child of the (position:relative)\n workspace-main so they are not clipped by the stage's\n `overflow: hidden`. */}\n {!presentation && floatList.map((def, i) => (\n <FlowPanelGroup\n key={def.id}\n tabs={[toPanelTab(def)]}\n resizeEdge=\"right\"\n defaultWidth={220}\n dock=\"float\"\n style={{ top: 48 + i * 40, left: 24 + i * 30 }}\n onDock={handleDock}\n onClose={handleClose}\n onDragHintChange={setDropHint}\n />\n ))}\n {!presentation && dropHint && (\n <div className={`flow-dock-dropzone flow-dock-dropzone--${dropHint}`}>\n <span>{dropHint === 'left' ? '⇤ 停靠左侧' : '停靠右侧 ⇥'}</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction MiniMapWrapper({\n canvasRef,\n pixiRef,\n miniMapRef,\n}: {\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n pixiRef: React.RefObject<PixiApp | null>;\n miniMapRef: React.RefObject<MiniMapRenderer | null>;\n}) {\n const { showMiniMap, setViewport, presentation } = useFlowUI();\n const draggingRef = useRef(false);\n\n // Move the main canvas so that the world point under the minimap click is\n // centered in the viewport. Routed through setViewport so the change syncs\n // with the ViewportManager (setting world.position directly would be\n // overwritten on the next viewport apply).\n const navigateTo = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n const pixi = pixiRef.current;\n const mm = miniMapRef.current;\n if (!canvas || !pixi || pixi.destroyed || !mm) return;\n\n const rect = canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n // CSS pixels -> canvas backing pixels.\n const { width: cw, height: ch } = mm.size;\n const px = ((clientX - rect.left) / rect.width) * cw;\n const py = ((clientY - rect.top) / rect.height) * ch;\n\n const world = mm.minimapToWorld(px, py);\n if (!world) return;\n\n const zoom = pixi.world.scale.x || 1;\n const screenW = pixi.app.screen.width;\n const screenH = pixi.app.screen.height;\n setViewport({\n x: screenW / 2 - world.x * zoom,\n y: screenH / 2 - world.y * zoom,\n zoom,\n });\n }, [canvasRef, pixiRef, miniMapRef, setViewport]);\n\n const onPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n draggingRef.current = true;\n navigateTo(e.clientX, e.clientY);\n }, [navigateTo]);\n\n const onPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return;\n navigateTo(e.clientX, e.clientY);\n }, [navigateTo]);\n\n const onPointerUp = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n draggingRef.current = false;\n try { (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId); } catch { /* noop */ }\n }, []);\n\n return (\n <div\n className=\"flow-minimap\"\n style={{ display: showMiniMap && !presentation ? undefined : 'none', cursor: 'pointer' }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n title=\"点击或拖动以移动画布\"\n >\n <canvas ref={canvasRef} width={180} height={120} style={{ width: '100%', height: '100%', pointerEvents: 'none' }} />\n </div>\n );\n}\n\n/**\n * Find the line range (1-based) of a JSON object with the given id.\n */\nfunction findElementLineRange(jsonStr: string, elementId: string): { startLine: number; endLine: number } | null {\n const idPattern = `\"id\": \"${elementId}\"`;\n const idx = jsonStr.indexOf(idPattern);\n if (idx === -1) return null;\n\n let braceDepth = 0;\n let startIdx = -1;\n for (let i = idx; i >= 0; i--) {\n if (jsonStr[i] === '}') braceDepth++;\n if (jsonStr[i] === '{') {\n if (braceDepth === 0) { startIdx = i; break; }\n braceDepth--;\n }\n }\n if (startIdx === -1) return null;\n\n braceDepth = 0;\n let endIdx = -1;\n for (let i = startIdx; i < jsonStr.length; i++) {\n if (jsonStr[i] === '{') braceDepth++;\n if (jsonStr[i] === '}') {\n braceDepth--;\n if (braceDepth === 0) { endIdx = i; break; }\n }\n }\n if (endIdx === -1) return null;\n\n const startLine = jsonStr.slice(0, startIdx).split('\\n').length;\n const endLine = jsonStr.slice(0, endIdx + 1).split('\\n').length;\n return { startLine, endLine };\n}\n\nfunction clearLineHighlights(container: HTMLElement) {\n container.querySelectorAll('.cm-line.flow-json-hl').forEach(el => el.classList.remove('flow-json-hl'));\n}\n\nfunction applyLineHighlightsViaView(handle: CodeEditorHandle, startLine: number, endLine: number) {\n const view = handle.getView();\n if (!view) return;\n for (let ln = startLine; ln <= endLine; ln++) {\n try {\n const lineInfo = view.state.doc.line(ln);\n const dom = view.domAtPos(lineInfo.from);\n const lineEl = dom.node instanceof HTMLElement\n ? dom.node.closest('.cm-line')\n : dom.node.parentElement?.closest('.cm-line');\n if (lineEl) lineEl.classList.add('flow-json-hl');\n } catch { /* line not in viewport */ }\n }\n}\n\nfunction JsonEditorPanel() {\n const { setDoc, currentCanvasId, selection, currentCanvas } = useFlowContext();\n const [jsonStr, setJsonStr] = useState('');\n const [error, setError] = useState<string | null>(null);\n const skipNextSync = useRef(false);\n const editorRef = useRef<CodeEditorHandle>(null);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n const singleId = useMemo(() => {\n const total = selection.nodeIds.size + selection.edgeIds.size + selection.lineIds.size;\n if (total !== 1) return null;\n if (selection.nodeIds.size === 1) return [...selection.nodeIds][0];\n if (selection.edgeIds.size === 1) return [...selection.edgeIds][0];\n if (selection.lineIds.size === 1) return [...selection.lineIds][0];\n return null;\n }, [selection]);\n\n useEffect(() => {\n if (skipNextSync.current) { skipNextSync.current = false; return; }\n setJsonStr(JSON.stringify(currentCanvas, null, 2));\n setError(null);\n }, [currentCanvas]);\n\n useEffect(() => {\n const wrap = wrapRef.current;\n if (wrap) clearLineHighlights(wrap);\n if (!singleId) return;\n\n const timer = setTimeout(() => {\n const range = findElementLineRange(jsonStr, singleId);\n if (!range || !wrapRef.current) return;\n\n const view = editorRef.current?.getView();\n if (!view) return;\n\n const w = wrapRef.current;\n const scroller = view.scrollDOM;\n\n scroller.style.scrollBehavior = 'smooth';\n\n const lineInfo = view.state.doc.line(range.startLine);\n view.dispatch({\n effects: EditorView.scrollIntoView(lineInfo.from, { y: 'start', yMargin: 0 }),\n });\n\n const onScrollEnd = () => {\n scroller.style.scrollBehavior = '';\n clearLineHighlights(w);\n applyLineHighlightsViaView(editorRef.current!, range.startLine, range.endLine);\n };\n\n let scrollTimer: ReturnType<typeof setTimeout>;\n const onScroll = () => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(onScrollEnd, 100);\n };\n scroller.addEventListener('scroll', onScroll);\n scrollTimer = setTimeout(() => {\n scroller.removeEventListener('scroll', onScroll);\n onScrollEnd();\n }, 800);\n }, 120);\n return () => clearTimeout(timer);\n }, [singleId, jsonStr]);\n\n const handleChange = useCallback((value: string) => {\n setJsonStr(value);\n try {\n const parsed = JSON.parse(value);\n if (parsed && Array.isArray(parsed.nodes) && Array.isArray(parsed.edges) && Array.isArray(parsed.lines)) {\n setError(null);\n skipNextSync.current = true;\n setDoc(prev => ({\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: parsed },\n }));\n } else {\n setError('JSON must have nodes, edges, lines arrays');\n }\n } catch (e: any) {\n setError(e.message?.slice(0, 60) ?? 'Invalid JSON');\n }\n }, [setDoc, currentCanvasId]);\n\n const label = singleId\n ? (selection.nodeIds.has(singleId) ? 'Node' : selection.edgeIds.has(singleId) ? 'Edge' : 'Line')\n : null;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%', minHeight: 0 }}>\n <div className=\"flow-json-header\">\n <span className=\"flow-json-scope\">\n {label ? `${label}: ${singleId!.slice(0, 8)}` : `Canvas`}\n </span>\n </div>\n {error && (\n <div style={{ fontSize: 11, color: 'oklch(var(--er))', padding: '4px 0', flexShrink: 0 }}>\n {error}\n </div>\n )}\n <div ref={wrapRef} style={{ flex: 1, minHeight: 0 }}>\n <CodeEditor\n ref={editorRef}\n value={jsonStr}\n onChange={handleChange}\n language=\"json\"\n lineNumbers={false}\n height=\"100%\"\n highlightActiveLine={false}\n />\n </div>\n </div>\n );\n}\n\nfunction FlowContextMenuWire() {\n const { contextMenu, setContextMenu } = useFlowUI();\n const { doc, setDoc, currentCanvasId, pushCanvas, setSelection } = useFlowContext();\n const { duplicate } = useClipboard();\n\n if (!contextMenu) return null;\n\n const canvas = doc.canvases[currentCanvasId];\n if (!canvas) { setContextMenu(null); return null; }\n\n const node = contextMenu.nodeId ? canvas.nodes.find(n => n.id === contextMenu.nodeId) : null;\n const items: ContextMenuItem[] = [];\n\n if (node) {\n // Duplicate the node (Cmd/Ctrl+D equivalent). Ensure it is selected first so\n // the clone covers the intended target even on a right-click without a prior\n // left-click selection.\n items.push({\n label: 'Duplicate',\n icon: '⧉',\n action: () => {\n duplicate(24, 24, { nodeIds: new Set([node.id]) });\n },\n });\n items.push({ label: '---', action: () => {} });\n\n const hasChild = !!node.data.childCanvasId;\n\n if (hasChild) {\n items.push({\n label: 'Enter Sub-canvas',\n icon: '↓',\n action: () => {\n pushCanvas(node.data.childCanvasId!);\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n },\n });\n items.push({ label: '---', action: () => {} });\n items.push({\n label: 'Delete Sub-canvas',\n icon: '🗑',\n danger: true,\n action: () => {\n const childId = node.data.childCanvasId!;\n setDoc(prev => {\n const canvases = { ...prev.canvases };\n collectAndRemoveCanvases(canvases, childId);\n const c = canvases[currentCanvasId];\n if (!c) return prev;\n canvases[currentCanvasId] = {\n ...c,\n nodes: c.nodes.map(n =>\n n.id === node.id\n ? { ...n, data: { ...n.data, childCanvasId: undefined } }\n : n,\n ),\n };\n const stack = prev.stack.filter(id => canvases[id]);\n if (stack.length === 0) stack.push(ROOT_CANVAS_ID);\n return { ...prev, canvases, stack };\n });\n },\n });\n } else {\n items.push({\n label: 'Create Sub-canvas',\n icon: '⊞',\n action: () => {\n const childCanvasId = generateId('canvas');\n setDoc(prev => {\n const c = prev.canvases[currentCanvasId];\n if (!c) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...c,\n nodes: c.nodes.map(n =>\n n.id === node.id\n ? { ...n, data: { ...n.data, childCanvasId } }\n : n,\n ),\n },\n [childCanvasId]: { nodes: [], edges: [], lines: [] },\n },\n };\n });\n pushCanvas(childCanvasId);\n },\n });\n }\n }\n\n if (items.length === 0) return null;\n\n return (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n items={items}\n onClose={() => setContextMenu(null)}\n />\n );\n}\n\nfunction collectAndRemoveCanvases(\n canvases: Record<string, FlowCanvasData>,\n canvasId: string,\n): void {\n const canvas = canvases[canvasId];\n if (!canvas) return;\n for (const node of canvas.nodes) {\n if (node.data.childCanvasId) {\n collectAndRemoveCanvases(canvases, node.data.childCanvasId);\n }\n }\n delete canvases[canvasId];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Flow.js","names":[],"sources":["../../../../src/components/pro/Flow/Flow.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect, useMemo, forwardRef, useImperativeHandle } from 'react';\nimport { FlowProvider, useFlowContext } from './context/FlowContext';\nimport { FlowUIProvider, useFlowUI } from './context/FlowUIContext';\nimport { FlowAIProvider } from './context/FlowAIContext';\nimport FlowCanvas from './FlowCanvas';\nimport FlowToolbar, { FlowZoomControls } from './panels/FlowToolbar';\nimport { ShapePaletteContent, SvgStampContent, MediaStampContent } from './panels/ShapePalette';\nimport { InspectorPanelContent } from './panels/InspectorPanel';\nimport { OutlinePanelContent } from './panels/OutlinePanel';\nimport { AIPanelContent } from './panels/AIPanel';\nimport { PresentationMode } from './panels/PresentationMode';\nimport { MediaOverlay } from './nodes/MediaOverlay';\nimport FlowPanelGroup, { type PanelTab } from './panels/FlowPanelGroup';\nimport type { FlowPanelDock } from './context/FlowUIContext';\nimport Breadcrumb from './panels/Breadcrumb';\nimport ContextMenu from './panels/ContextMenu';\nimport type { ContextMenuItem } from './panels/ContextMenu';\nimport Select from '../../Select';\nimport { MiniMapRenderer } from './canvas/MiniMapRenderer';\nimport { CodeEditor, type CodeEditorHandle } from '../CodeEditor';\nimport { EditorView } from '@codemirror/view';\nimport { useUndoRedo } from './hooks/useUndoRedo';\nimport { useClipboard } from './hooks/useClipboard';\nimport { useCompactMode } from './hooks/useCompactMode';\nimport { downloadDataURL, safeFileBaseName } from './hooks/useFlowImportExport';\nimport { usePdfExport } from './hooks/usePdfExport';\nimport { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts';\nimport { useMindMap } from './hooks/useMindMap';\nimport { useDeleteSelection } from './hooks/useDeleteSelection';\nimport { createEmptyDocument, ROOT_CANVAS_ID, DEFAULT_NODE_DATA } from './constants';\nimport { normalizeEdgeHandles } from './edges/edgePaths';\nimport { generateId } from './nodes/nodeUtils';\nimport type { FlowProps, FlowDocument, FlowNode, SelectionState, FlowCanvasData } from './types';\nimport type { PixiApp } from './canvas/PixiApp';\nimport './styles.css';\n\nfunction normalizeDocument(doc: FlowDocument): FlowDocument {\n let changed = false;\n const canvases = { ...doc.canvases };\n for (const [id, canvas] of Object.entries(canvases)) {\n const nodes = canvas.nodes.map(node => {\n if (node.type !== 'shapeSvg') return node;\n const legacyPlacement = node.data.labelPlacement as string | undefined;\n const labelPlacement = legacyPlacement === 'above'\n ? 'top'\n : legacyPlacement === 'center'\n ? 'middle'\n : legacyPlacement === 'below'\n ? 'bottom'\n : node.data.labelPlacement;\n if (labelPlacement === node.data.labelPlacement) return node;\n changed = true;\n return { ...node, data: { ...node.data, labelPlacement } };\n });\n // Mindmap nodes/edges created before theme tokens (≤ 0.0.56) persisted\n // literal colors, so they never followed theme switches. That exact palette\n // was only ever emitted by the old mindmap creator, so remap it to the same\n // tokens the current creator uses.\n let themedNodesChanged = false;\n const themedNodes = nodes.map(node => {\n if (!node.data.isMindMapNode) return node;\n const fill = node.data.fill === '#ffffff' || node.data.fill === '#eef2ff'\n ? 'theme:base-100'\n : node.data.fill;\n const stroke = node.data.stroke === '#6366f1'\n ? 'theme:base-content'\n : node.data.stroke === '#4f46e5'\n ? 'theme:primary'\n : node.data.stroke;\n if (fill === node.data.fill && stroke === node.data.stroke) return node;\n themedNodesChanged = true;\n return { ...node, data: { ...node.data, fill, stroke } };\n });\n const nodeMap = new Map<string, FlowNode>();\n for (const node of themedNodes) nodeMap.set(node.id, node);\n let edgesChanged = false;\n const edges = normalizeEdgeHandles(canvas.edges, nodeMap).map(edge => {\n if (edge.data.strokeColor !== '#94a3b8') return edge;\n const source = nodeMap.get(edge.source);\n const target = nodeMap.get(edge.target);\n if (!source?.data.isMindMapNode || !target?.data.isMindMapNode) return edge;\n edgesChanged = true;\n return { ...edge, data: { ...edge.data, strokeColor: 'theme:base-content' } };\n });\n if (themedNodesChanged || edgesChanged) changed = true;\n if (themedNodes !== nodes || edges !== canvas.edges) {\n canvases[id] = { ...canvas, nodes: themedNodes, edges };\n }\n }\n return changed ? { ...doc, canvases } : doc;\n}\n\nconst EMPTY_SELECTION: SelectionState = {\n nodeIds: new Set(),\n edgeIds: new Set(),\n lineIds: new Set(),\n};\n\nfunction FlowKeyboardShortcutsWire({ onUndo, onRedo, groupRef, geoGroupRef, ungroupRef }: {\n onUndo: () => void;\n onRedo: () => void;\n groupRef: React.MutableRefObject<(() => void) | null>;\n geoGroupRef: React.MutableRefObject<(() => void) | null>;\n ungroupRef: React.MutableRefObject<(() => void) | null>;\n}) {\n const { selection, setSelection, currentCanvas, setDoc, currentCanvasId } = useFlowContext();\n const { viewport } = useFlowUI();\n const { copy, cut, paste, duplicate } = useClipboard();\n const deleteSelected = useDeleteSelection();\n\n const selectAll = useCallback(() => {\n setSelection({\n nodeIds: new Set(currentCanvas.nodes.map(n => n.id)),\n edgeIds: new Set(currentCanvas.edges.map(e => e.id)),\n lineIds: new Set(currentCanvas.lines.map(l => l.id)),\n });\n }, [currentCanvas, setSelection]);\n\n const createGroup = useCallback((type: 'flowGroup' | 'geometryGroup') => {\n const nodeIds = selection.nodeIds;\n const lineIds = selection.lineIds;\n const totalCount = nodeIds.size + lineIds.size;\n if (totalCount < 2) return;\n const nodes = currentCanvas.nodes.filter(n => nodeIds.has(n.id));\n const lines = currentCanvas.lines.filter(l => lineIds.has(l.id));\n const PAD = 20;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of nodes) {\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + n.width);\n maxY = Math.max(maxY, n.position.y + n.height);\n }\n for (const l of lines) {\n for (const p of l.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n }\n const isGeo = type === 'geometryGroup';\n const groupId = generateId('group');\n const groupNode: FlowNode = {\n id: groupId,\n type,\n position: { x: minX - PAD, y: minY - PAD },\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2,\n data: {\n ...DEFAULT_NODE_DATA,\n label: isGeo ? 'Geo Group' : 'Group',\n fill: isGeo ? '#fefce8' : '#f0f9ff',\n stroke: '#9ca3af', strokeWidth: 1.5,\n borderStyle: isGeo ? 'dashed' : 'dotted',\n isGroup: true,\n },\n };\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: isGeo\n ? [groupNode, ...canvas.nodes]\n : [groupNode, ...canvas.nodes.map(n => nodeIds.has(n.id) ? { ...n, parentId: groupId } : n)],\n lines: isGeo\n ? canvas.lines\n : canvas.lines.map(l => lineIds.has(l.id) ? { ...l, parentId: groupId } : l),\n }},\n };\n });\n setSelection({ nodeIds: new Set([groupId]), edgeIds: new Set(), lineIds: new Set() });\n }, [selection, currentCanvas, setDoc, currentCanvasId, setSelection]);\n\n const groupSelected = useCallback(() => createGroup('flowGroup'), [createGroup]);\n const geoGroupSelected = useCallback(() => createGroup('geometryGroup'), [createGroup]);\n\n const ungroupSelected = useCallback(() => {\n const ids = selection.nodeIds;\n if (ids.size === 0) return;\n const groupNodeIds = new Set<string>();\n const childNodeIds = new Set<string>();\n const childLineIds = new Set<string>();\n for (const node of currentCanvas.nodes) {\n if (ids.has(node.id) && (node.type === 'flowGroup' || node.type === 'geometryGroup' || node.data.isGroup)) {\n groupNodeIds.add(node.id);\n }\n }\n if (groupNodeIds.size === 0) return;\n for (const node of currentCanvas.nodes) {\n if (node.parentId && groupNodeIds.has(node.parentId)) {\n childNodeIds.add(node.id);\n }\n }\n for (const line of currentCanvas.lines) {\n if (line.parentId && groupNodeIds.has(line.parentId)) {\n childLineIds.add(line.id);\n }\n }\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes\n .filter(n => !groupNodeIds.has(n.id))\n .map(n => childNodeIds.has(n.id) ? { ...n, parentId: undefined } : n),\n lines: canvas.lines\n .map(l => childLineIds.has(l.id) ? { ...l, parentId: undefined } : l),\n }},\n };\n });\n setSelection({ nodeIds: childNodeIds, edgeIds: new Set(), lineIds: childLineIds });\n }, [selection, currentCanvas, setDoc, currentCanvasId, setSelection]);\n\n groupRef.current = groupSelected;\n geoGroupRef.current = geoGroupSelected;\n ungroupRef.current = ungroupSelected;\n\n const changeZIndex = useCallback((mode: 'front' | 'back' | 'up' | 'down') => {\n const nodeIds = selection.nodeIds;\n const lineIds = selection.lineIds;\n if (nodeIds.size === 0 && lineIds.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const nodeAllZ = canvas.nodes.map(n => n.zIndex ?? 0);\n const nodeMaxZ = nodeAllZ.length > 0 ? Math.max(...nodeAllZ) : 0;\n const nodeMinZ = nodeAllZ.length > 0 ? Math.min(...nodeAllZ) : 0;\n const lineAllZ = canvas.lines.map(l => l.zIndex ?? 0);\n const lineMaxZ = lineAllZ.length > 0 ? Math.max(...lineAllZ) : 0;\n const lineMinZ = lineAllZ.length > 0 ? Math.min(...lineAllZ) : 0;\n const applyZ = (z: number, maxZ: number, minZ: number) => {\n if (mode === 'front') return maxZ + 1;\n if (mode === 'back') return minZ - 1;\n if (mode === 'up') return z + 1;\n return z - 1;\n };\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n => nodeIds.has(n.id) ? { ...n, zIndex: applyZ(n.zIndex ?? 0, nodeMaxZ, nodeMinZ) } : n),\n lines: canvas.lines.map(l => lineIds.has(l.id) ? { ...l, zIndex: applyZ(l.zIndex ?? 0, lineMaxZ, lineMinZ) } : l),\n }},\n };\n });\n }, [selection, setDoc, currentCanvasId]);\n\n useEffect(() => {\n const handlePaste = (event: ClipboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (target?.tagName === 'INPUT' || target?.tagName === 'TEXTAREA' || target?.isContentEditable) return;\n\n const imageItem = Array.from(event.clipboardData?.items ?? []).find(item => item.type.startsWith('image/'));\n if (!imageItem) {\n event.preventDefault();\n paste();\n return;\n }\n\n const file = imageItem.getAsFile();\n if (!file) return;\n event.preventDefault();\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') return;\n const selectedImage = selection.nodeIds.size === 1\n ? currentCanvas.nodes.find(node => selection.nodeIds.has(node.id) && node.type === 'mediaNode' && node.data.mediaKind === 'image')\n : undefined;\n\n if (selectedImage) {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(node => node.id === selectedImage.id\n ? { ...node, data: { ...node.data, mediaContent: reader.result as string } }\n : node),\n },\n },\n };\n });\n return;\n }\n\n const id = generateId('node');\n const width = 320;\n const height = 220;\n const screenWidth = window.innerWidth;\n const screenHeight = window.innerHeight;\n const centerX = (screenWidth / 2 - viewport.x) / viewport.zoom;\n const centerY = (screenHeight / 2 - viewport.y) / viewport.zoom;\n const highestZ = Math.max(0, ...currentCanvas.nodes.map(node => node.zIndex ?? 0));\n const imageNode: FlowNode = {\n id,\n type: 'mediaNode',\n position: { x: centerX - width / 2, y: centerY - height / 2 },\n width,\n height,\n zIndex: highestZ + 1,\n data: {\n ...DEFAULT_NODE_DATA,\n label: file.name || 'Image',\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: 'theme:base-content',\n fontSize: 13,\n borderStyle: 'solid',\n mediaKind: 'image',\n mediaContent: reader.result,\n },\n };\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: { ...canvas, nodes: [...canvas.nodes, imageNode] },\n },\n };\n });\n setSelection({ nodeIds: new Set([id]), edgeIds: new Set(), lineIds: new Set() });\n };\n reader.readAsDataURL(file);\n };\n\n window.addEventListener('paste', handlePaste);\n return () => window.removeEventListener('paste', handlePaste);\n }, [currentCanvas, currentCanvasId, paste, selection, setDoc, setSelection, viewport]);\n\n const actions = useMemo(() => ({\n undo: onUndo, redo: onRedo, copy, cut, paste, duplicate, deleteSelected, selectAll,\n group: groupSelected, geoGroup: geoGroupSelected, ungroup: ungroupSelected,\n bringToFront: () => changeZIndex('front'),\n bringForward: () => changeZIndex('up'),\n sendBackward: () => changeZIndex('down'),\n sendToBack: () => changeZIndex('back'),\n }), [onUndo, onRedo, copy, cut, paste, duplicate, deleteSelected, selectAll, groupSelected, geoGroupSelected, ungroupSelected, changeZIndex]);\n\n useKeyboardShortcuts(actions);\n useMindMap();\n return null;\n}\n\n/**\n * Bridges the anchor→PDF export (which needs canvas/viewport context) out to the\n * toolbar in the outer Flow component via a ref. Renders nothing.\n */\nfunction PdfExportWire({\n pixiRef,\n exportPdfRef,\n}: {\n pixiRef: React.RefObject<PixiApp | null>;\n exportPdfRef: React.MutableRefObject<(() => Promise<boolean>) | null>;\n}) {\n const exportPdf = usePdfExport(pixiRef);\n exportPdfRef.current = exportPdf;\n return null;\n}\n\n/** Imperative handle exposed via a ref on the `<Flow>` component. */\nexport interface FlowHandle {\n /** Export the current diagram to a PNG data URL (null if unavailable). */\n exportPNG: (backgroundColor?: number) => Promise<string | null>;\n /** Get the current document. */\n getDocument: () => FlowDocument;\n}\n\nconst Flow = forwardRef<FlowHandle, FlowProps>(function Flow({\n initialDocument,\n onChange,\n width,\n height,\n readOnly = false,\n onBack,\n onExportPNG,\n onPublish,\n showMiniMap = true,\n showGrid = true,\n gridSize = 20,\n className,\n showAI = true,\n showAIConfig = true,\n aiConfig,\n}: FlowProps, ref) {\n const [doc, setDoc] = useState<FlowDocument>(() => normalizeDocument(initialDocument ?? createEmptyDocument()));\n const [selection, setSelection] = useState<SelectionState>(EMPTY_SELECTION);\n const pixiRef = useRef<PixiApp | null>(null);\n const miniMapCanvasRef = useRef<HTMLCanvasElement>(null);\n const miniMapRef = useRef<MiniMapRenderer | null>(null);\n // Small-screen detection (container width based, see useCompactMode).\n const rootRef = useRef<HTMLDivElement>(null);\n const compact = useCompactMode(rootRef);\n\n const { wrappedSetDoc, undo, redo, canUndo, canRedo } = useUndoRedo(doc, setDoc);\n const groupRef = useRef<(() => void) | null>(null);\n const geoGroupRef = useRef<(() => void) | null>(null);\n const ungroupRef = useRef<(() => void) | null>(null);\n const exportPdfRef = useRef<(() => Promise<boolean>) | null>(null);\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Keep the latest doc in a ref for the imperative handle.\n const docRef = useRef(doc);\n docRef.current = doc;\n\n useImperativeHandle(ref, () => ({\n exportPNG: async (backgroundColor?: number) => {\n const pixi = pixiRef.current;\n if (!pixi || pixi.destroyed) return null;\n return pixi.exportPNG(backgroundColor);\n },\n getDocument: () => docRef.current,\n }), []);\n\n const outerSetDoc: React.Dispatch<React.SetStateAction<FlowDocument>> = useCallback(\n (action) => {\n wrappedSetDoc(prev => {\n const next = typeof action === 'function' ? action(prev) : action;\n if (readOnly) {\n // Read-only: discard any content mutation. Only pure canvas\n // navigation (stack push/pop — entering/leaving groups via\n // double-click or breadcrumb) is allowed through. onChange is not\n // fired, so hosts won't treat navigation as an unsaved change.\n const navigationOnly = next.canvases === prev.canvases && next.title === prev.title;\n return navigationOnly ? next : prev;\n }\n queueMicrotask(() => onChangeRef.current?.(next));\n return next;\n });\n },\n [wrappedSetDoc, readOnly],\n );\n\n // Undo/redo mutate the document directly through useUndoRedo's raw setDoc\n // (bypassing outerSetDoc), so they need their own read-only guard.\n const guardedUndo = useCallback(() => { if (!readOnly) undo(); }, [readOnly, undo]);\n const guardedRedo = useCallback(() => { if (!readOnly) redo(); }, [readOnly, redo]);\n\n const handlePixiReady = useCallback((pixi: PixiApp) => {\n pixiRef.current = pixi;\n if (miniMapCanvasRef.current && !miniMapRef.current) {\n miniMapRef.current = new MiniMapRenderer(miniMapCanvasRef.current);\n }\n }, []);\n\n // Built-in PNG export: if the host supplies `onExportPNG` we defer to it,\n // otherwise snapshot the Pixi scene and download it directly so the toolbar\n // button always works out of the box.\n const handleExportPNG = useCallback(async () => {\n if (onExportPNG) return void onExportPNG();\n const pixi = pixiRef.current;\n if (!pixi || pixi.destroyed) return;\n const url = await pixi.exportPNG(0xffffff);\n if (url) downloadDataURL(url, `${safeFileBaseName(docRef.current.title)}.png`);\n }, [onExportPNG]);\n\n // Built-in PDF export: capture each anchor's presentation framing into a\n // multi-page PDF (implemented by PdfExportWire inside the providers).\n const handleExportPDF = useCallback(async () => {\n await exportPdfRef.current?.();\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n let subscribed: PixiApp | null = null;\n\n const tickerFn = () => {\n const pixi = pixiRef.current;\n const mm = miniMapRef.current;\n if (!pixi || pixi.destroyed || !mm) return;\n const vp = { x: pixi.world.position.x, y: pixi.world.position.y, zoom: pixi.world.scale.x };\n const currentId = doc.stack[doc.stack.length - 1] ?? ROOT_CANVAS_ID;\n const canvas = doc.canvases[currentId];\n if (canvas) mm.update(canvas.nodes, vp, pixi.app.screen.width, pixi.app.screen.height);\n };\n\n // Pixi initializes asynchronously; the minimap renderer is created in\n // handlePixiReady. Poll until both exist, then attach the ticker. This\n // avoids a race where the effect runs before pixi is ready and the minimap\n // stays blank until the next document edit.\n const attach = () => {\n if (cancelled) return;\n const pixi = pixiRef.current;\n if (pixi && !pixi.destroyed && miniMapRef.current) {\n pixi.app.ticker.add(tickerFn);\n subscribed = pixi;\n } else {\n requestAnimationFrame(attach);\n }\n };\n attach();\n\n return () => {\n cancelled = true;\n if (subscribed && !subscribed.destroyed) subscribed.app.ticker.remove(tickerFn);\n };\n }, [doc]);\n\n const style: React.CSSProperties = { width: width ?? '100%', height: height ?? '100%' };\n\n return (\n <div ref={rootRef} className={`flow-container ${className ?? ''}`} style={style}>\n <FlowProvider doc={doc} setDoc={outerSetDoc} selection={selection} setSelection={setSelection}>\n <FlowUIProvider showMiniMap={showMiniMap} showGrid={showGrid} gridSize={gridSize} showAI={showAI} readOnly={readOnly}>\n <FlowAIProvider initialConfig={aiConfig} showAIConfig={showAIConfig}>\n <FlowKeyboardShortcutsWire onUndo={guardedUndo} onRedo={guardedRedo} groupRef={groupRef} geoGroupRef={geoGroupRef} ungroupRef={ungroupRef} />\n <PdfExportWire pixiRef={pixiRef} exportPdfRef={exportPdfRef} />\n <UnifiedPanelGroup\n compact={compact}\n toolbar={!readOnly ? (\n <FlowToolbar\n compact={compact}\n onBack={onBack}\n onUndo={guardedUndo} onRedo={guardedRedo} canUndo={canUndo} canRedo={canRedo}\n onGroup={() => groupRef.current?.()} onGeoGroup={() => geoGroupRef.current?.()} onUngroup={() => ungroupRef.current?.()}\n onExportPNG={handleExportPNG}\n onExportPDF={handleExportPDF}\n onPublish={onPublish}\n />\n ) : null}\n >\n <FlowCanvas onPixiReady={handlePixiReady} />\n {/* Media content (markdown/mermaid/data/…) must stay visible in\n presentation & read-only preview — PixiJS only draws the node\n frame, so hiding this layer would blank every media node. */}\n <MediaOverlay />\n <PresentationGate>\n {!readOnly && <FlowZoomControls />}\n <Breadcrumb />\n </PresentationGate>\n {!readOnly && <FlowContextMenuWire />}\n <MiniMapWrapper canvasRef={miniMapCanvasRef} pixiRef={pixiRef} miniMapRef={miniMapRef} />\n <PresentationMode />\n </UnifiedPanelGroup>\n </FlowAIProvider>\n </FlowUIProvider>\n </FlowProvider>\n </div>\n );\n});\n\nexport default Flow;\n\ninterface TabDef {\n id: string;\n label: string;\n icon: string;\n showKey?: 'showPalette' | 'showInspector' | 'showOutline' | 'showJson' | 'showAI';\n}\n\n/**\n * Hides all editable overlay UI (toolbar, panels, breadcrumb) while in\n * presentation mode, keeping only the canvas visible for the slideshow.\n */\nfunction PresentationGate({ children }: { children: React.ReactNode }) {\n const { presentation } = useFlowUI();\n return (\n <div className=\"flow-overlay\" style={{ display: presentation ? 'none' : undefined }}>\n {children}\n </div>\n );\n}\n\nconst ALL_TAB_DEFS: TabDef[] = [\n { id: 'shapes', label: 'Shapes', icon: '▢', showKey: 'showPalette' },\n { id: 'icons', label: 'Icons', icon: '★', showKey: 'showPalette' },\n { id: 'media', label: 'Media', icon: '▶', showKey: 'showPalette' },\n { id: 'inspector', label: 'Inspector', icon: '⚙', showKey: 'showInspector' },\n { id: 'outline', label: 'Outline', icon: '☰', showKey: 'showOutline' },\n { id: 'json', label: 'JSON', icon: '{ }', showKey: 'showJson' },\n { id: 'ai', label: 'AI', icon: '✨', showKey: 'showAI' },\n];\n\nfunction tabContent(id: string): React.ReactNode {\n switch (id) {\n case 'shapes': return <ShapePaletteContent />;\n case 'icons': return <SvgStampContent />;\n case 'media': return <MediaStampContent />;\n case 'inspector': return <InspectorPanelContent />;\n case 'outline': return <OutlinePanelContent />;\n case 'json': return <JsonEditorPanel />;\n case 'ai': return <AIPanelContent />;\n default: return null;\n }\n}\n\n/** Tab ids whose panels stamp objects onto the canvas (auto-collapse in compact mode). */\nconst STAMP_PANEL_IDS = new Set(['shapes', 'icons', 'media']);\n\nfunction UnifiedPanelGroup({ children, toolbar, compact }: { children: React.ReactNode; toolbar?: React.ReactNode; compact?: boolean }) {\n const ui = useFlowUI();\n const { panelDocks, setPanelDock, presentation, readOnly, setPendingPlacement } = ui;\n const { setShowPalette, setShowInspector, setShowOutline, setShowJson, setShowAI } = ui;\n\n // Read-only: hide every editing panel (palette/inspector/outline/JSON/AI).\n const visibleTabs = readOnly\n ? []\n : ALL_TAB_DEFS.filter(def =>\n !def.showKey || (ui as any)[def.showKey],\n );\n\n const toPanelTab = (def: TabDef): PanelTab => ({\n id: def.id, label: def.label, icon: def.icon, content: tabContent(def.id),\n });\n\n // Compact (small-screen) mode: the chosen panel renders full-screen above\n // the canvas. Shape/icon/media stamp panels collapse automatically once a\n // stamp is picked (pendingPlacement armed) so the user is returned to the\n // canvas to tap it into place; a virtual ESC button on the canvas cancels\n // continuous placement.\n const [activePanel, setActivePanel] = useState<string | null>(null);\n const prevPlacementKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!compact) {\n prevPlacementKeyRef.current = null;\n return;\n }\n const pp = ui.pendingPlacement;\n const key = pp ? `${pp.type}:${(pp.data as any)?.svgId ?? ''}:${(pp.data as any)?.mediaKind ?? ''}` : null;\n const prev = prevPlacementKeyRef.current;\n prevPlacementKeyRef.current = key;\n if (key && key !== prev && activePanel && STAMP_PANEL_IDS.has(activePanel)) {\n setActivePanel(null);\n }\n }, [ui.pendingPlacement, compact, activePanel]);\n\n // Floating-panel drag: highlight the dock edge it hovers over.\n const [dropHint, setDropHint] = useState<'left' | 'right' | null>(null);\n const handleDock = useCallback((tabId: string, dock: FlowPanelDock) => setPanelDock(tabId, dock), [setPanelDock]);\n // Each panel has its own close (✕) button; closed panels come back via the\n // matching toolbar toggle (shapes/icons/media share the palette flag).\n const handleClose = useCallback((tabId: string) => {\n if (tabId === 'inspector') setShowInspector(false);\n else if (tabId === 'outline') setShowOutline(false);\n else if (tabId === 'json') setShowJson(false);\n else if (tabId === 'ai') setShowAI(false);\n else setShowPalette(false);\n }, [setShowInspector, setShowOutline, setShowJson, setShowAI, setShowPalette]);\n\n // NOTE: every hook must run before this early return — moving hooks below it\n // would break the hooks-of-render contract in compact mode.\n if (compact && !presentation) {\n const activeDef = visibleTabs.find(d => d.id === activePanel) ?? null;\n return (\n <div className=\"flow-workspace\">\n {toolbar}\n {visibleTabs.length > 0 && (\n <div className=\"flow-mobile-panel-bar\">\n <Select\n placeholder=\"选择面板…\"\n options={visibleTabs.map(d => ({ value: d.id, label: d.label }))}\n value={activePanel ?? undefined}\n onChange={(v) => {\n // Switching panels always opens a clean \"pick a type\" state: a\n // stale armed stamp (continuous placement) would otherwise be\n // placed by the next canvas tap or toggle the tapped item off.\n setPendingPlacement(null);\n setActivePanel(String(v));\n }}\n />\n </div>\n )}\n <div className=\"flow-workspace-main\">\n <div className=\"flow-stage\">\n {children}\n </div>\n {activeDef && (\n <div className=\"flow-mobile-panel\">\n <div className=\"flow-mobile-panel-header\">\n <span className=\"flow-mobile-panel-title\">\n {activeDef.icon && <span className=\"flow-panel-tab-icon\">{activeDef.icon}</span>}\n {activeDef.label}\n </span>\n <button\n type=\"button\"\n className=\"flow-mobile-panel-close\"\n aria-label=\"关闭面板\"\n onClick={() => setActivePanel(null)}\n >✕</button>\n </div>\n <div className=\"flow-mobile-panel-body\">{tabContent(activeDef.id)}</div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Desktop layout: the left/right panel groups are merged into one panel\n // list docked on the left by default. Panels are switched with a dropdown\n // Select; users can move any panel to the right dock or let it float (via\n // header buttons or by dragging it onto a workspace edge). Docks without\n // panels are not rendered so the canvas fills the freed space.\n const getDock = (id: string): FlowPanelDock => panelDocks[id] ?? 'left';\n const leftTabs: PanelTab[] = visibleTabs\n .filter(def => getDock(def.id) === 'left')\n .map(toPanelTab);\n const rightTabs: PanelTab[] = visibleTabs\n .filter(def => getDock(def.id) === 'right')\n .map(toPanelTab);\n const floatList = visibleTabs.filter(def => getDock(def.id) === 'float');\n\n return (\n <div className=\"flow-workspace\">\n {/* Slim full-width toolbar strip above panels + canvas. */}\n {!presentation && toolbar}\n <div className=\"flow-workspace-main\">\n {!presentation && leftTabs.length > 0 && (\n <FlowPanelGroup\n tabs={leftTabs}\n defaultTab={leftTabs[0]?.id}\n resizeEdge=\"right\"\n defaultWidth={220}\n dock=\"left\"\n onDock={handleDock}\n onClose={handleClose}\n />\n )}\n <div className=\"flow-stage\">\n {children}\n </div>\n {!presentation && rightTabs.length > 0 && (\n <FlowPanelGroup\n tabs={rightTabs}\n defaultTab={rightTabs[0]?.id}\n resizeEdge=\"left\"\n defaultWidth={220}\n dock=\"right\"\n onDock={handleDock}\n onClose={handleClose}\n />\n )}\n {/* Floating panels drift above the docks; dragging one over a\n workspace edge shows a drop-zone hint and dropping attaches it to\n that dock. Rendered as a direct child of the (position:relative)\n workspace-main so they are not clipped by the stage's\n `overflow: hidden`. */}\n {!presentation && floatList.map((def, i) => (\n <FlowPanelGroup\n key={def.id}\n tabs={[toPanelTab(def)]}\n resizeEdge=\"right\"\n defaultWidth={220}\n dock=\"float\"\n style={{ top: 48 + i * 40, left: 24 + i * 30 }}\n onDock={handleDock}\n onClose={handleClose}\n onDragHintChange={setDropHint}\n />\n ))}\n {!presentation && dropHint && (\n <div className={`flow-dock-dropzone flow-dock-dropzone--${dropHint}`}>\n <span>{dropHint === 'left' ? '⇤ 停靠左侧' : '停靠右侧 ⇥'}</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction MiniMapWrapper({\n canvasRef,\n pixiRef,\n miniMapRef,\n}: {\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n pixiRef: React.RefObject<PixiApp | null>;\n miniMapRef: React.RefObject<MiniMapRenderer | null>;\n}) {\n const { showMiniMap, setViewport, presentation } = useFlowUI();\n const draggingRef = useRef(false);\n\n // Move the main canvas so that the world point under the minimap click is\n // centered in the viewport. Routed through setViewport so the change syncs\n // with the ViewportManager (setting world.position directly would be\n // overwritten on the next viewport apply).\n const navigateTo = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n const pixi = pixiRef.current;\n const mm = miniMapRef.current;\n if (!canvas || !pixi || pixi.destroyed || !mm) return;\n\n const rect = canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n // CSS pixels -> canvas backing pixels.\n const { width: cw, height: ch } = mm.size;\n const px = ((clientX - rect.left) / rect.width) * cw;\n const py = ((clientY - rect.top) / rect.height) * ch;\n\n const world = mm.minimapToWorld(px, py);\n if (!world) return;\n\n const zoom = pixi.world.scale.x || 1;\n const screenW = pixi.app.screen.width;\n const screenH = pixi.app.screen.height;\n setViewport({\n x: screenW / 2 - world.x * zoom,\n y: screenH / 2 - world.y * zoom,\n zoom,\n });\n }, [canvasRef, pixiRef, miniMapRef, setViewport]);\n\n const onPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n draggingRef.current = true;\n navigateTo(e.clientX, e.clientY);\n }, [navigateTo]);\n\n const onPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return;\n navigateTo(e.clientX, e.clientY);\n }, [navigateTo]);\n\n const onPointerUp = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n draggingRef.current = false;\n try { (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId); } catch { /* noop */ }\n }, []);\n\n return (\n <div\n className=\"flow-minimap\"\n style={{ display: showMiniMap && !presentation ? undefined : 'none', cursor: 'pointer' }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n title=\"点击或拖动以移动画布\"\n >\n <canvas ref={canvasRef} width={180} height={120} style={{ width: '100%', height: '100%', pointerEvents: 'none' }} />\n </div>\n );\n}\n\n/**\n * Find the line range (1-based) of a JSON object with the given id.\n */\nfunction findElementLineRange(jsonStr: string, elementId: string): { startLine: number; endLine: number } | null {\n const idPattern = `\"id\": \"${elementId}\"`;\n const idx = jsonStr.indexOf(idPattern);\n if (idx === -1) return null;\n\n let braceDepth = 0;\n let startIdx = -1;\n for (let i = idx; i >= 0; i--) {\n if (jsonStr[i] === '}') braceDepth++;\n if (jsonStr[i] === '{') {\n if (braceDepth === 0) { startIdx = i; break; }\n braceDepth--;\n }\n }\n if (startIdx === -1) return null;\n\n braceDepth = 0;\n let endIdx = -1;\n for (let i = startIdx; i < jsonStr.length; i++) {\n if (jsonStr[i] === '{') braceDepth++;\n if (jsonStr[i] === '}') {\n braceDepth--;\n if (braceDepth === 0) { endIdx = i; break; }\n }\n }\n if (endIdx === -1) return null;\n\n const startLine = jsonStr.slice(0, startIdx).split('\\n').length;\n const endLine = jsonStr.slice(0, endIdx + 1).split('\\n').length;\n return { startLine, endLine };\n}\n\nfunction clearLineHighlights(container: HTMLElement) {\n container.querySelectorAll('.cm-line.flow-json-hl').forEach(el => el.classList.remove('flow-json-hl'));\n}\n\nfunction applyLineHighlightsViaView(handle: CodeEditorHandle, startLine: number, endLine: number) {\n const view = handle.getView();\n if (!view) return;\n for (let ln = startLine; ln <= endLine; ln++) {\n try {\n const lineInfo = view.state.doc.line(ln);\n const dom = view.domAtPos(lineInfo.from);\n const lineEl = dom.node instanceof HTMLElement\n ? dom.node.closest('.cm-line')\n : dom.node.parentElement?.closest('.cm-line');\n if (lineEl) lineEl.classList.add('flow-json-hl');\n } catch { /* line not in viewport */ }\n }\n}\n\nfunction JsonEditorPanel() {\n const { setDoc, currentCanvasId, selection, currentCanvas } = useFlowContext();\n const [jsonStr, setJsonStr] = useState('');\n const [error, setError] = useState<string | null>(null);\n const skipNextSync = useRef(false);\n const editorRef = useRef<CodeEditorHandle>(null);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n const singleId = useMemo(() => {\n const total = selection.nodeIds.size + selection.edgeIds.size + selection.lineIds.size;\n if (total !== 1) return null;\n if (selection.nodeIds.size === 1) return [...selection.nodeIds][0];\n if (selection.edgeIds.size === 1) return [...selection.edgeIds][0];\n if (selection.lineIds.size === 1) return [...selection.lineIds][0];\n return null;\n }, [selection]);\n\n useEffect(() => {\n if (skipNextSync.current) { skipNextSync.current = false; return; }\n setJsonStr(JSON.stringify(currentCanvas, null, 2));\n setError(null);\n }, [currentCanvas]);\n\n useEffect(() => {\n const wrap = wrapRef.current;\n if (wrap) clearLineHighlights(wrap);\n if (!singleId) return;\n\n const timer = setTimeout(() => {\n const range = findElementLineRange(jsonStr, singleId);\n if (!range || !wrapRef.current) return;\n\n const view = editorRef.current?.getView();\n if (!view) return;\n\n const w = wrapRef.current;\n const scroller = view.scrollDOM;\n\n scroller.style.scrollBehavior = 'smooth';\n\n const lineInfo = view.state.doc.line(range.startLine);\n view.dispatch({\n effects: EditorView.scrollIntoView(lineInfo.from, { y: 'start', yMargin: 0 }),\n });\n\n const onScrollEnd = () => {\n scroller.style.scrollBehavior = '';\n clearLineHighlights(w);\n applyLineHighlightsViaView(editorRef.current!, range.startLine, range.endLine);\n };\n\n let scrollTimer: ReturnType<typeof setTimeout>;\n const onScroll = () => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(onScrollEnd, 100);\n };\n scroller.addEventListener('scroll', onScroll);\n scrollTimer = setTimeout(() => {\n scroller.removeEventListener('scroll', onScroll);\n onScrollEnd();\n }, 800);\n }, 120);\n return () => clearTimeout(timer);\n }, [singleId, jsonStr]);\n\n const handleChange = useCallback((value: string) => {\n setJsonStr(value);\n try {\n const parsed = JSON.parse(value);\n if (parsed && Array.isArray(parsed.nodes) && Array.isArray(parsed.edges) && Array.isArray(parsed.lines)) {\n setError(null);\n skipNextSync.current = true;\n setDoc(prev => ({\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: parsed },\n }));\n } else {\n setError('JSON must have nodes, edges, lines arrays');\n }\n } catch (e: any) {\n setError(e.message?.slice(0, 60) ?? 'Invalid JSON');\n }\n }, [setDoc, currentCanvasId]);\n\n const label = singleId\n ? (selection.nodeIds.has(singleId) ? 'Node' : selection.edgeIds.has(singleId) ? 'Edge' : 'Line')\n : null;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%', minHeight: 0 }}>\n <div className=\"flow-json-header\">\n <span className=\"flow-json-scope\">\n {label ? `${label}: ${singleId!.slice(0, 8)}` : `Canvas`}\n </span>\n </div>\n {error && (\n <div style={{ fontSize: 11, color: 'oklch(var(--er))', padding: '4px 0', flexShrink: 0 }}>\n {error}\n </div>\n )}\n <div ref={wrapRef} style={{ flex: 1, minHeight: 0 }}>\n <CodeEditor\n ref={editorRef}\n value={jsonStr}\n onChange={handleChange}\n language=\"json\"\n lineNumbers={false}\n height=\"100%\"\n highlightActiveLine={false}\n />\n </div>\n </div>\n );\n}\n\nfunction FlowContextMenuWire() {\n const { contextMenu, setContextMenu } = useFlowUI();\n const { doc, setDoc, currentCanvasId, pushCanvas, setSelection } = useFlowContext();\n const { duplicate } = useClipboard();\n\n if (!contextMenu) return null;\n\n const canvas = doc.canvases[currentCanvasId];\n if (!canvas) { setContextMenu(null); return null; }\n\n const node = contextMenu.nodeId ? canvas.nodes.find(n => n.id === contextMenu.nodeId) : null;\n const items: ContextMenuItem[] = [];\n\n if (node) {\n // Duplicate the node (Cmd/Ctrl+D equivalent). Ensure it is selected first so\n // the clone covers the intended target even on a right-click without a prior\n // left-click selection.\n items.push({\n label: 'Duplicate',\n icon: '⧉',\n action: () => {\n duplicate(24, 24, { nodeIds: new Set([node.id]) });\n },\n });\n items.push({ label: '---', action: () => {} });\n\n const hasChild = !!node.data.childCanvasId;\n\n if (hasChild) {\n items.push({\n label: 'Enter Sub-canvas',\n icon: '↓',\n action: () => {\n pushCanvas(node.data.childCanvasId!);\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n },\n });\n items.push({ label: '---', action: () => {} });\n items.push({\n label: 'Delete Sub-canvas',\n icon: '🗑',\n danger: true,\n action: () => {\n const childId = node.data.childCanvasId!;\n setDoc(prev => {\n const canvases = { ...prev.canvases };\n collectAndRemoveCanvases(canvases, childId);\n const c = canvases[currentCanvasId];\n if (!c) return prev;\n canvases[currentCanvasId] = {\n ...c,\n nodes: c.nodes.map(n =>\n n.id === node.id\n ? { ...n, data: { ...n.data, childCanvasId: undefined } }\n : n,\n ),\n };\n const stack = prev.stack.filter(id => canvases[id]);\n if (stack.length === 0) stack.push(ROOT_CANVAS_ID);\n return { ...prev, canvases, stack };\n });\n },\n });\n } else {\n items.push({\n label: 'Create Sub-canvas',\n icon: '⊞',\n action: () => {\n const childCanvasId = generateId('canvas');\n setDoc(prev => {\n const c = prev.canvases[currentCanvasId];\n if (!c) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...c,\n nodes: c.nodes.map(n =>\n n.id === node.id\n ? { ...n, data: { ...n.data, childCanvasId } }\n : n,\n ),\n },\n [childCanvasId]: { nodes: [], edges: [], lines: [] },\n },\n };\n });\n pushCanvas(childCanvasId);\n },\n });\n }\n }\n\n if (items.length === 0) return null;\n\n return (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n items={items}\n onClose={() => setContextMenu(null)}\n />\n );\n}\n\nfunction collectAndRemoveCanvases(\n canvases: Record<string, FlowCanvasData>,\n canvasId: string,\n): void {\n const canvas = canvases[canvasId];\n if (!canvas) return;\n for (const node of canvas.nodes) {\n if (node.data.childCanvasId) {\n collectAndRemoveCanvases(canvases, node.data.childCanvasId);\n }\n }\n delete canvases[canvasId];\n}\n"],"mappings":"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"}